; STEP EQU 1 ; Werte dem Drive entspr. ; FUNKT EQU 0 ; Hier die dem Drive entspr. ; Werte nach Tab.2 einsetzen ; ; ; ; Controller-Adressen ; FLOPC EQU 080H ; Control-Register FLOPT EQU 082H ; Track-Register FLOPS EQU 084H ; Sektor-Register FLOPD EQU 086H ; Data-Register FLOPO EQU 088H ; Drive-Format-Register ; ; ; HOME ; HOME: LD A,0CH+STEP ; Akku mit HOME-Kommando OUT (FLOPC),A ; laden und ausgeben CALL WAIT ; auf Controller warten RET ; ; ; SELECT DISK ; SELECT: LD HL,0 ; Bei Fehler ist HL=O LD A,C ; CP/M übergibt Drive-Nummer in C CP 1 ; erstes Drive gewählt? RET NC ; Nein-Abbruch ; AND 0FH ; Vordere Bits löschen (sie OR FUNKT ; bestimmen die Drive-Nummer) OUT (FLOPO),A ; Drive-Format an Controller ; ausgeben LD L,A ; Berechnung der Adresse des LD H,0 ; Disk-Headerblocks ADD HL,HL ; indem zu DHB die ADD HL,HL ; Drive-Nummer addiert ADD HL,HL ; wird ADD HL,HL LD DE,DHB ; Drive-Nummer addieren ADD HL,DE RET ; ; ; SET TRACK ; SETTRA: IN A,(FLOPT) ; Track-Reg. lesen CP C ; Auf richtigem Track ? RET Z ; Ja -> Return ; LD A,C ; Akku mit gewünschter Spu laden OUT (FLOPD),A ; laden und ausgeben LD A,1CH+STEP ; Kopf auf Spur OUT (FLOPC),A ; positionieren CALL WAIT RET ; ; ; SET SEKTOR ; SETSEC: LD A,C ; Sektornummer laden OUT (FLOPS),A ; und an Sektorreg. RET ; ausgeben ; ; ; SET DMA-ADRESSE ; SETDMA: LD (DMAADR),BC ; Nur Adresse speichern RET ; ; ; READ SEKTOR ; READ: LD HL,(DMAADR) ; Zieladresse holen LD B,128 ; Sektorlaenge in B-Reg. LD C,FLOPD ; Daten in C-Reg. LD A,0CH ; Read-Kommando laden OUT (FLOPC),A ; und ausgeben READL: IN A,(FLOPC) ; Controlleer Status lesen BIT 0,A ; vorzeitig fertig-Fehler JR Z,ERROR ; Fehler melden ; BIT 1,A ; Lesen beendet ? JR Z,READL ; Nein -> weiterlesen INI ; Daten abspeichern JR NZ,READL ; weiterlesen bis Sektorenden ; IN A,(FLOPC) ; Fehler aufgetreten? ADN 01CH ; Fehlerbit maskieren RET ; ; ; WRITE SEKTOR ; WRITE: LD HL,(DMAADR) ; Quelladresse holen LD B,128 ; Sektorlänge in B-Reg. LD C,FLOPD ; Daten im C-Reg. LD A,0ACH ; Write-Konmando laden OUT (FLOPC),A ; und Hund ausgeben WRITEL: IN A,(FLOPC) ; Controller Status lesen BIT 0,A ; vorzeitig fertig-Fehler JR Z,ERROR ; Fehler melden ; BIT 1,A ; Schreiben beendet? JR Z,WRITEL ; Nein -> weiterschreiben ; OUTI ; Daten ausgeben JR NZ,WRITEL ; bis Sektorende IN A,(FLOPC) ; Fehler aufgetreten? AND 01CH ; Fehlerbit maskieren RET ; ; ERROR: LD A,1 ; Fehler kennzeichnen RET ; ; ; Warten, bis das Kommando ausgeführt ist ’ WAIT: LD B,30 ; Verzögerungskonstante WLOOP: DJNZ WLOOP ; Warten, bis Status stabil ist WAIT1: IN A,(FLOPC) ; Status lesen BIT 0,A ; BUSY gesetzt ? JR NZ,WAIT1 ; ja = weiterwarten RET ; ; ; Datenbereiche ; DMAADR: DEFW 0 ; ; ; Disk-Header-Block ; DHB: DEFW TRANS DEFW 0 DEFW 0 DEFW 0 DEFW DIRBUF DEFW DPB DEFW CHK00 DEFW ALL00 ; ; ; Sektor-Translation-Table ; TRANS: DEFB 1,7,13,19,25 ; SKEW-Faktor 6 DEFB 5,11,17,23 ; Fuer 8"-Laufwerke DEFB 3,9,15,21 DEFB 2,8,14,20,26 DEFB 6,12,18,24 DEFB 4,10,18,22 ; ; DPB: DEFW 26 DEFB 3 DEFB 7 DEFB 0 DEFW 242 DEFW 63 DEFB 192 DEFB 0 DEFW 16 DEFW 2 ; ; ; Puffer für Directory im RAM ; DIRBUF: DEFS 128 ; ; ; Disk-Allocation-Table ; ALL00: DEFS 31 ; ; Check Disk ; CHK00: DEFS 16 ; ; END