; (C)Werner Römer 2018
; werner.roemer@t-online.de
;
; Disketten kopieren
; für den Datentransfer von LW D (3" 40Track) nach LW B (3.5" 80Track)
;
; nutzt die Monitor-Floppyroutine WR/RD-BLK
; Es wird damit jeweils eine Spur in den Buffer gelesen und 
; anschließend auf das Ziellaufwerk kopiert
;
; Stand:	10.11.2018		1. Test OK
;
;				Reg.	B	C	D	E	H	L
; FKALT	Kaltstart		-	-	-	-	-	-
; FORDISK	formartieren	Sb	Nt	-	-	-	-
; WRBLK	Block schreiben	Sb	Nr	Tn	Sn	> RAM <
; RDBLK	Block lesen		Sb	Nr	Tn	Sn	> RAM <
; WRSEC	Sector schreiben	Sb	-	Tn	Sn	> RAM <
; RDSEC	Sector lesn		Sb	-	Tn	Sn	> RAM <
; CPYBLK	32kB kopieren	Sb	-	Tn	-	-	-
;
;	Nr:	=	Number of Records (Anzahl der Sektoren)
;			Summe der zu übertragenden Sektoren
;
;	Nt:	=	Number of Tracks (Anzahl der Spuren)
;			Summe der vorhandenen Spuren
;
;	SN:	=	Sector Nr. (Sektor-Nummer)
;			Sektor bei dem die Datenübertragung beginnt
;
;	TN:	=	Track Number (Spur-Nummer)
;			Spur bei dem die Datenübertragung beginnt
;
;	>RAM<:	RAM Pointer (RAM Startadresse)
;
;	Sb:	= 	Select Byte (Übergabe Parameter)
;
;	Bit	7	6	5	4	3	2	1	0
;		:	:	:	:	:	:	:	:
;		:	:	:	:	:	:	:	0	= DD (Moppel Standard)
;		:	:	:	:	:	:	:	1	= SD
;		:	:	:	:	:	0	0	-	= LW 0
;		:	:	:	:	:	0	1	-	= LW 1
;		:	:	:	:	:	1	0	-	= LW 2
;		:	:	:	:	:	1	1	-	= LW 3
;		:	:	:	0	0	-	-	-	= 6ms Step Rate	
;		:	:	:	0	1	-	-	-	= 12ms
;		:	:	:	1	0	-	-	-	= 20ms	
;		:	:	:	1	1	-	-	-	= 30ms
;		:	:	0	-	-	-	-	-	= Side 0		
;		:	:	1	-	-	-	-	-	= Side 1
;		n.c.	n.c.
;
;
;	Status-Reg.
;	Bit	7	6	5	4	3	2	1	0
;		:	:	:	:	:	:	:	:
;		:	:	:	:	:	:	0	0
;		:	:	:	:	:	1	-	-	= Lost Date
;		:	:	:	:	1	-	-	-	= CRC Error
;		:	:	:	1	-	-	-	-	= Record not Found
;		:	:	1	-	-	-	-	-	= Record Type/Spin-up
;		:	1	-	-	-	-	-	-	= Write Protect
;		1	-	-	-	-	-	-	-	= Disk Not Ready
;
;
;-----------------------------------------------------------------------------
;
; Vorspann Parameterbereich
;
; Monitorprogramme  
;  
CI		EQU 0043h			; CI 	Tastaturabfrage wartet auf Taste ASCII(A)    
CO		EQU 0049h			; CO 	Bildschirmausgabe ASCII(C) Ziel (UPDATE)
LOM		EQU 004Fh			; LO 	Drucker über RS232	          
CSTS		EQU 0052h  			; CSTS	Tastaturstatus Taste Z=0, k.Taste Z=1  	          
FILL		EQU 0085h  			; FILL  Speicher mit Konstante füllen SRCBEG,SRCEND,DSTBEG        
COPYM		EQU 0088h  			; COPY  Speicherbereich verschieben 
onesec	EQU 001bh			; Wartezeit 1Sekunde
dely1		EQU 000bh			;           1ms
;
BELPOR	EQU 52h				; Port für Summer 
BYTFF		EQU 1Ah				; PORT FF auf Singel-Step-Modul
COMREG	EQU 48h				; Register Adressen
TRKREG	EQU 49h				; WD1770
SECREG	EQU 4Ah
DATREG	EQU 4BH
STATUS	EQU COMREG
CTRL		EQU 40H      
;
MOVID		EQU 1003h  			; Warmstart Videomonitor
BREAK		EQU 100Fh			; Unterbrechung mit CTRL-C
PARIN		EQU 1012h			;
STRING	EQU 1021h			; STRING Textzeiger(HL) bis (00)
ERROR		EQU 1027h			; Error Videomonitor
CLRVID	EQU 102Dh			; CLRVID  
CLRLIN	EQU 1030h			; CLRLIN        
CRSPOS	EQU 1033h			; CRSPOS         
CRSON		EQU 1036h 			; CRSON         
CRSOFF	EQU 1039h			; CRSOFF
BYTOT		EQU 103Fh			; BYTOT  (A) zweistellig darstellen Adresse (HL) 
ADROT		EQU 103ch			; (DE) vierstellig ausgeben
CRLF		EQU 137bh			; gibt CR/LF aus
;
; Exteren Programme
;
FDC		EQU 2000h			; Floppy Kaltstart
FORDSK	EQU 2003h			; Format Disk
WRBLK		EQU 2006h			; Block schreiben
RDBLK		EQU 2009h			; Block lesen
WRSEC		EQU 200ch			; Sector schreiben
RDSEC		EQU 200fh			; Sector Lesen
CPYBLK	EQU 2012h			; 32k kopieren

EDIT		EQU 7000h			; Editor
ASS:		EQU 6000h			; Assembler
DISSK		EQU 6C00h			; Disassembler
;
; RAM Belegung
;
STACK		EQU 2F00H			; 
TRAP		EQU 2F8Ch
RST55		EQU 2F98h
RST551	EQU 2F99h
;
HORDSP	EQU 2E50h			; 40/80 Zeichen pro Zeile
BEGIN		EQU 2E54h			; Anfangsadresse letzte Zeile
UPDATE	EQU 2E56h			; aktuelle Cursorposition
;
SRCBEG	EQU 2FBFh			; Startadresse
SRCEND	EQU 2FC1h			; Endadresse
DSTBEG	EQU 2FC3h			; Anfang Zieladresse/Parameter
DSTEND	EQU 2FC5h			; 
LINZ		EQU 2E54h
;
VIDBEG	EQU 3000h			; Bildschirmadresse	oben links
VIDEND	EQU 377Fh			; 			unten rechts
PRTFLG	EQU 37AFh			; 
RAMBEG	EQU 37B0h			; Anfang Parameterbereich Videomonitor

;
; Buffer Adressen
;
BATBUF	EQU 2C00h			; Batchbuffer auf 512Byte erweitert
FDCBUF	EQU 2F70h			; Parameterbereich
CPYBUF	EQU 9000h			; Zwischenspeicher für eine Spur
;
	ORG FDCBUF

TRKNR:	DS 1h				; Spurnummer
SECNR:  	DS 1h				; Sektornummer
SIDNR:	DS 1h				; Seite 0/1
SELBYT: 	DS 1h				; SelectByte Bit1,2 = Laufwerksnummer
SELOUT: 	DS 1h
TRACK0: 	DS 4h
RWBEF:	DS 1h
DATADR:	DS 2h				; Buffer-Adresse r/w Sektoren
INTPRG:	DS 2h
RWSUB:	DS 1h
RWSUB1: 	DS 2h
HIBUF:	DS 2h
BUFDST: 	DS 1h
BUFSRC: 	DS 1h				; IM CF-Betrieb = Anzahl der Sektoren die übertragen werden
CPYEND: 	DS 1h
;
TIMOUT	EQU 32h			;
FQUARZ	EQU 06h			;
DLY100	EQU 13h			;
SECZAL	EQU 16			;
SECLDD	EQU 1				; 256 Bytes
;INTON	EQU 1Eh			; RST 5.5 freigeben
;INTOF	EQU 1Fh			; RST 5.5 sperren
;
;-----------------------------------------------------------------
;
;
SBQ		EQU 1eh			; SelectByte Quelllaufwerk	(D)
SBZ		EQU 1ah			;		 Ziellaufwerk	(B)	
;
	org 8000h				; Testadresse

Start:	call	crsoff		;
		lxi	h,mtxt-1		;
		call	string		;
		xra	a			; 1. Spur einstellen
		sta	spurnr		;

rdloop:	lda	spurnr		; Meldung
		call	bytot
			
rd:		mvi	b,sbq			; SelectByte
		mvi	c,10h			; Anzahl der Sektoren
		lda	spurnr		; aktuelle Spurnummer holen
		mov	d,a			;
		mvi	e,01h			; Sectornummer für Start
		lxi	h,cpybuf		; Bufferadresse
		
		call	rdblk			; Block/Sektor lesen
		
wr:		mvi	b,sbz			; SelectByte
		mvi	c,10h			; Anzahl der Sektoren
		lda	spurnr		; aktuelle Spurnummer holen
		mov	d,a			;
		mvi	e,01h			; Sectornummer für Start
		lxi	h,cpybuf		; Bufferadresse		
		
		call	wrblk			; Block/Sektor schreiben
		
test:		lda	spurnr		; aktuelle Spurnummer holen
		inr	a			; + 1
		sta	spurnr		; sichern
		cpi	28h			; > 40 Spuren
		jnz	rdloop		;
		
		jmp	movid			; zurück zum Monitor
	

spurnr:	ds	1			; Buffer für Track-Nr.	
;	
;--------------------------------------------------------------------
; Meldetexte
;
MTXT-1:	DB 0Dh			; CR
		DB 0Ah			; LF               
	
		DB "MOPPEL-Copy:"
		DB " D -> B"
		DB 0Dh	

