;--------------------------------------------------- ; ; MOPPEL-BIOS für CP/M Rel. 2.2 V 12.5 30.10.85 ; (C) Rheinhard Gössler 85 ; ; neu aufgebaut W.Römer 01.2014 ; Stand: ; 24.03.2015 mit Testprogramm für TPA analyse ; 22.03.2015 ; 20.03.2015 Fehlerbeseitung CF-Interface ; CF-Karte läuft noch mit DPB von Floppy ; ; 15.03.2015 DPB erweitert ; CF-Interface eingebunden ; ;---------------------------------------------------; ; ; 60-K-Version ; ; BIOS equ 0EA00h ; bei 60 K CCP equ 0D400h ; bei 60 K BDOS equ 0DC06h ; bei 60 K ; begin equ 0002h ; bei 60 K ; stack2 equ 0FAFFh ; bei 60 K ; verbuf equ 0FB00h ; bei 60 K ; buffer equ 0FC00h ; bei 60 K ; ; cimo equ 43h ; Console Input como equ 49h ; Console Output cstsmo equ 52h ; Console Status lomo equ 4fh ; Lister Output curson equ 1036h ; Curson ; ioflag equ 2fc8h ; LO Select ; stack0 equ 2950h ; Bank 0 Stack ; ; nsects equ 2ch ; Anzahl Sector für CPML offset equ 04h ; Start bei Track 4 vers equ 22h ; Versions-Nr. ; buff equ 0080h ; default Buffer Adress stack equ 0100h ; default STACK ndisks equ 04h ; iobyte equ 0003h ; cdisk equ 0004h ; Adr 4 für last Drive ; ; org bios ; jmp boot ; Einsprungleiste wboote: jmp wboot jmp csts ; Status Console jmp ci ; Input Console jmp co ; Output Console jmp list ; Output Lineprinter jmp punch ; Output Puncher jmp reader ; Input Reader ; jmp home jmp seldsk ; Select Disk jmp settrk ; Set Track jmp setsec ; Set Sector jmp setdma ; Set Disk-Buffer jmp read ; Read Disk * jmp write ; Write Disk * jmp lsts ; Status Lineprinter jmp sectra ; ; * für CF-Interface erweitern ; ;==================================================== ; ; DPBase ; ;==================================================== ; dpbase equ dpe0 ; dpe0: dw xlt0 ; Translate table dw 0000h dw 0000h ; Sratch area dw 0000h dw dirbuf ; Dir. Buffer dw dpb0 ; Parameter Block dw csv0 ; Check dw alv0 ; Allocation Vectors ; dpe1: dw xlt1 dw 0000h dw 0000h dw 0000h dw dirbuf dw dpb1 dw csv1 dw alv1 ; dpe2: dw xlt2 dw 0000h dw 0000h dw 0000h dw dirbuf dw dpb2 dw csv2 dw alv2 ; dpe3: dw xlt3 dw 0000h dw 0000h dw 0000h dw dirbuf dw dpb3 dw csv3 dw alv3 ; ; ;==================================================== ; ; Disk Parameter Block ; ;==================================================== ; ; dpb0 für 80 Spur Laufwerke ; Blockgroesse 2k ; dpb0: dw 20h ; Sectors per Track db 04h ; Block shift db 0Fh ; Block Mask db 0h ; Extnt Mask dw 97h ; Disk Size-1 dw 3fh ; Directory max. db 0c0h ; Alloc0 db 00h ; Alloc1 dw 10h ; Check Size dw 4h ; Offset ; xlt0 equ 0h ;Sec.Translate Vec.;no Transl.Table ; ; ; dpb1: dw 20h ; Sectors per Track db 04h ; Block shift db 0Fh ; Block Mask db 0h ; Extnt Mask dw 97h ; Disk Size-1 dw 3fh ; Directory max. db 0c0h ; Alloc0 db 00h ; Alloc1 dw 10h ; Check Size dw 4h ; Offset ; xlt1 equ xlt0 ; ; dpb2 wie dpb0 ; dpb2: dw 20h ; Sectors per Track db 04h ; Block shift db 0fh ; Block Mask db 0h ; Extnt Mask dw 97h ; Disk Size-1 dw 3fh ; Directory max. db 0c0h ; Alloc0 db 00h ; Alloc1 dw 10h ; Check Size dw 4h ; Offset ; xlt2 equ xlt0 ; ; CF-Karte ; dpb3: dw 20h ; Sectors per Track db 04h ; Block shift db 0fh ; Block Mask db 0h ; Extnt Mask dw 97h ; Disk Size-1 dw 3fh ; Directory max. db 0c0h ; Alloc0 db 00h ; Alloc1 dw 10h ; Check Size dw 0h ; Offset ; ; xlt3 equ xlt0 ; ; ;==================================================== ; ; Peripherie-Verwaltung ; ;==================================================== ; co: lda iobyte ; CP/M : Console Output ani 03h lxi h,cotab ; Startadr CO-Tab jmp decode cotab: dw co-mon ; TTY dw crtout ; CRT dw list ; BAT dw uc1out ; UC1; Ext. ; ci: lda iobyte ; CP/M : Console Input ani 03h lxi h,citab ; Startadr CI-Tab jmp decode citab: dw ci-mon ; TTY dw crtin ; CRT dw reader ; BAT dw uc1in ; UC1; Ext. ; reader: lda iobyte ; CP/M : Reader Input rrc rrc ani 03h lxi h,ritab ; Startadr Reader-Tab jmp decode ritab: dw ci-mon ; TTY dw ptr ; PTR dw ur1 ; UR1; Ext. dw ur2 ; UR2; Ext. ; punch: lda iobyte ; CP/M : Puncher Output rrc rrc rrc rrc ani 03h lxi h,potab ; Startadr Puncher-Tab jmp decode potab: dw co-mon ; TTY dw resout ; PTP; Res. dw centr ; UP1 dw thermo ; UP2; Res. ; list: lda iobyte ; CP/M : List Output rlc rlc ani 03h lxi h,lotab ; Startadr List-Tab jmp decode lotab: dw co-mon ; TTY dw crtout ; CRT dw prt ; LPT dw punch ; UL1 ; csts: lda iobyte ; CP/M : Console Status ani 03h lxi h,csttab jmp decode csttab: dw cs-mon ; TTY dw crtist ; CRT dw ristat ; BAT dw uc1sta ; UC1; Ext. ; lsts: lda iobyte ; CP/M : Lister Status rlc rlc ani 03h lxi h,lsttab jmp decode lsttab: dw mcosta ; TTY dw crtost ; CRT dw prtst ; LPT dw pustat ; UC1 ; pustat: lda iobyte rrc rrc rrc rrc ani 03h lxi h,pustab jmp decode pustab: dw mcosta ; TTY dw rest ; PTP; Res. dw censta ; UP1 dw therst ; UP2; Res. ; ristat: lda iobyte rrc rrc ani 03h lxi h,ristab jmp decode ristab: dw cs-mon ; TTY dw ptrsta ; PTR; Ext. dw ur1sta ; UR1; Ext. dw ur2sta ; UR2; Ext. ; decode: jz found ; Setzt PC entsprechend IOBYTE inx h inx h dcr a jmp decode found: mov e,m ;Zieladresse auslesen inx h mov d,m xchg pchl ;Verzweigung ; ; ;==================================================== ; ; Ausgabe ueber die serielle Schnittstelle ; ;==================================================== ; prt: push h lxi h,0h dad sp ;Bank 1 Stack in H&L lxi d,stack0 xchg sphl ;Bank 0 Stack mvi a,81h out 24h ;Umschalten auf Bank 0 ; push d ;Bank 1 Stack retten mvi a,80h ;Printer waehlen sta ioflag call lomo ;Monitor-UP mvi a,0h ;Printer inaktiv sta ioflag ;(wg.CO; sonst doppeltes LO) pop h ;Bank 1 Stack zurueck mvi a,1h out 24h ;Umschalten auf Bank 1 ; sphl ;alter Bank 1 Stack pop h ret ; prtst: mvi a,0ffh ret ; ; ;==================================================== ; ; Ausgabe ueber die parallele Schnittstelle ; ;==================================================== ; centr: push h lxi h,0h dad sp ;Bank 1 Stack in H&L lxi d,stack0 xchg sphl ;Bank 0 Stack mvi a,81h out 24h ;Umschalten auf Bank 0 ; push d ;Bank 1 Stack retten mvi a,40h ;Centronics waehlen sta ioflag call lomo ;Monitor-UP mvi a,0h ;Centronics inaktiv sta ioflag ;(wg.CO; sonst doppeltes LO) pop h ;Bank 1 Stack zurueck mvi a,1h out 24h ;Umschalten auf Bank 1 ; sphl ;alter Bank 1 Stack pop h ret ; censta: mvi a,0ffh ret ; ; ;==================================================== ; ; Monitor-Routinen CO, CI und CSTS ; ;==================================================== ; ; ; Ausgabe auf Bildschirm ; co-mon: push h lxi h,0h dad sp ;Bank 1 Stack in H&L lxi d,stack0 xchg sphl ;Bank 0 Stack mvi a,81h out 24h ;Umschalten auf Bank 0 ; push d ;Bank 1 Stack retten call como ;Monitor-UP pop h ;Bank 1 Stack zurueck mvi a,01h out 24h ;Umschalten auf Bank 1 ; sphl ;alter Bank 1 Stack pop h ret ; mcosta: mvi a,0ffh ; Status CO-MON ret ; ; ; Eingabe von der ASCII-Tastatur ; ci-mon: push h lxi h,0h dad sp ;Bank 1 Stack in H&L lxi d,stack0 xchg sphl ;Bank 0 Stack mvi a,81h out 24h ;Umschalten auf Bank 0 ; push d ;Bank 1 Stack retten call cimo ;Monitor-UP push psw ;wg. MOVID-5.3-CSTS cilop: call cstsmo ;Monitor-UP jnz cilop ;auf Loslassen warten pop psw mov c,a ;temp. ablegen pop h ;Bank 1 Stack zurueck mvi a,1h out 24h ;Umschalten auf Bank 1 ; sphl ;alter Bank 1 Stack pop h mov a,c ;Input zurueckholen rlc ;CTL-Codes MOVID 5.3? jc ctlkey ;ja: JMP mov a,c ret ; ctlkey: mov a,c ;fehlende CTL-Codes erzeugen cpi 8fh ;HOME? jz mark ;ja: JMP ani 7fh sui 20h ret ; mark: mvi a,27h ;Hochkomma ret ; ; ; Status der ASCII-Tastatur ; cs-mon: push h lxi h,0h dad sp ;Bank 1 Stack in H&L lxi d,stack0 xchg sphl ;Bank 0 Stack mvi a,81h out 24h ;Umschalten auf Bank 0 ; push d ;Bank 1 Stack retten call cstsmo ;Monitor-UP pop h ;Bank 1 Stack zurueck mov c,a ;Status retten mvi a,1h out 24h ;Umschalten auf Bank 1 ; sphl ;alter Bank 1 Stack pop h mov a,c ;Status zurueckholen ret ; ; ;==================================================== ; ; Peripherie-Ansprache (Reserve) ; ;==================================================== ; crtout: ret ; crtost: xra a ret ; ; crtin: ret ; crtist: xra a ret ; ; ; ; thermo: ret ; therst: xra a ret ; resout: ret ; rest: xra a ret ; ; ;==================================================== ; ; Disketten-Management ; ;==================================================== ; ; BIOS-Funktion Home ; Set Track (C)=Track home: mvi c,00h ; Track 0 settrk: lxi h,iotrk ; Trackbuffer laden mov m,c ret ; ; BIOS-Funktion Set Sektor (C)=Sektor ; setsec: lxi h,iosec ; Sectorbuffer laden mov m,c ret ; ; BIOS-Funktion Set DMA (BC)=DMA Adresse ; setdma: mov l,c ; DMA - Adresse laden mov h,b shld iodma ret ; ; BIOS-Funktion Set Drive (c)=Laufwerk ; (HL)= DPH ; seldsk: lxi h,0000h ; Bei Fehler notwendig mov a,c cpi ndisks ; LW im Bereich ? rnc ; sta dbank ; LW in Buffer add a ; ;2 add a ; ;4 add a ; ;8 add a ; ;16 (Laenge eines DPBs) mov l,a lxi d,dpbase dad d ret ; ; BIOS-Funktion Sec Translate ; !im Moppel nicht benötigt ; sectra: mov a,d ora e jz se1 ; Test ob Xlate-Tab vorhanden ; xchg dad b mov a,m sta iosec mov l,a mvi h,00h ret ; se1: mov l,c mov a,c sta iosec mvi h,0h ret ; ;------------------------------------------------------------ ; ; calc - CP/M Sektorgröße auf Moppel Sektorgröße umrechnen ; CP/M-Format 32 Sektoren/Track ; Moppel-Format 16 Sektoren/Track ; (E)= Startsektor für R/W Disk ; calc: lda iosec rrc ani 0ch inr a mov e,a lda dbank mov c,a lda iotrk mov d,a ret ; ; comp - Test ob Drive/Track/Sektor noch gleich ist ; comp: lda aktdrv cmp c rnz lda akttrk cmp d rnz lda aktsec cmp e ret ; ; BIOS-Funktion Sektor lesen ; read: di call calc ; <== Einsprung von BDOS call comp jnz rload ; ; r1rd: call bufcal ; Daten im Buffer, nur kopieren call copyx xra a ret ; ; bufcal - Record auf 1kByte-Buffer abbilden ; bufcal: lxi h,buffer lda iosec ani 07h rrc mov d,a mvi a,00h rar mov e,a mov a,d ani 7fh mov d,a dad d xchg lhld iodma xchg mvi b,80h ; Recordlaenge = 128 Bytes ret ; ; ; rload - Test ob Buffer gültig ist (wrtflg)=1 ; wenn nein, alten Buffer zurückschreiben ; rload: lda wrtflg ora a jz r1load call puttrk ; alten Buffer sichern jc errio ; ; Buffer von Disk holen ; r1load: call calc call store call gettrk ; jc errio jmp r1rd ; ; store - sicher Drive/Track/Sektor ; für Disk-Routinen ; store: mov a,c ; sta aktdrv ; mov a,e ; sta aktsec mov a,d sta akttrk ret ; ; Copyx kopiert die Daten vom Buffer (FC00h) in DMA-Buffer ; ; (B) Recordlänge ; (DE) = Zieladress ; (HL) = Quelladresse ; copyx: mov a,m ; stax d inx h inx d dcr b jnz copyx ret ; ; BIOS-Funktion Sektor schreiben ; write: di call calc ; <== Einsprung von BDOS call comp jnz wload ; w1wr: call bufcal ; Daten im Buffer, nur kopieren xchg call copyx ; Record in DMA Buffer mvi a,01h sta wrtflg xra a ret ; ; wload: lda wrtflg ; ora a jz w1load call puttrk ; alten Buffer Sichern ana a jnz errio ; w1load: call calc call store call gettrk ; ana a jnz errio jmp w1wr ; ; errio: mvi a,1h ora a ret ; ; ;==================================================== ; ; GETTRK/PUTTRK (Bufferverwaltung) ; Block lesen/schreiben 1KB-Buffer ; mit CF-Interface ; ;==================================================== ; codbuf: xra a ; clear wrtflg -"Buffer leer" sta wrtflg lxi h,buffer ; Bereitet Reg fuer LW-Anspr. lda aktsec ; vor mov e,a lda aktdrv rlc ani 06h ori 18h ; DD / 30ms / Side 0 mov b,a mvi d,4h ; 4 Sectoren ret ; ; gettrk: push psw ; lda aktdrv ; cpi 03h ; Laufwerk 4 ? jnz get_fl ; nein weiter mit Floppy pop psw ; jmp get_cf ; get_fl: pop psw ; call codbuf ; Reg vorbereiten ; getlp: push h push d push b lda akttrk mov d,a call secrd pop b pop d pop h ana a jnz errx call nxtsec jnz getlp xra a ret ; zurück zum Disk-Manager ; ; nxtsec: push d ; Reg fuer naechsten Sec setzten lxi d,0100h dad d ; Bufferadr + 256 Bytes pop d inr e ; Sec-Nr. + 1 dcr d ;%Sec-Zaehler - 1 ret ; ; puttrk: push psw ; lda aktdrv ; cpi 03h ; Laufwerk 4 ? jnz put_fl ; nein weiter mit Floppy pop psw ; jmp put_cf ; put_fl: pop psw ; call codbuf ; putlp: push h push d push b lda akttrk mov d,a call secwr pop b pop d pop h ana a jnz errx call nxtsec jnz putlp xra a ret ; zurück zum Disk-Manager ; errx: stc ret ; ; ;==================================================== ; ; Floppy-Routinen ; ;==================================================== ; comreg equ 48h ; FDC trkreg equ 49h ; FDC secreg equ 4ah ; FDC datreg equ 4bh ; FDC status equ comreg ctrl equ 40h ; (FDC)-Drive-Select ; ; nop ; intrd: in datreg stax d inx d ret ; ; intwr: ldax d out datreg; inx d; ret ; ; inton: push b mvi a,1eh ; 8085-RST5.5 enable mvi b,02h ; NSC800-RSTC enable jmp intcte ; intof: push b mvi a,1fh ; 8085-RST5.5 disable mvi b,00h ; NSC800-RSTC disable intcte: sim nop ; fuer NSC800-JR-Befehl mov a,b out 0bbh pop b ret ; secwrx: call init push h lxi h,intwr shld intprg pop h lda trknr mov d,a mvi a,2ah cmp d ; Sec kleiner Sec 42 ? mvi a,0a6h jnc write1 mov b,a lda selbyt ani 01h mov a,b jnz write1 ani 0fdh write1: sta rwbef jmp start ; ; ; secrdx: call init push h lxi h,intrd shld intprg pop h mvi a,84h ;rdsec;+30 ms sta rwbef ; start: mov a,m ; rlc cnc recal mov a,m ani 7fh out trkreg lda trknr out datreg mvi b,14h ; Seek call posit ; ani 19h ; Verify jnz end0 in trkreg mov d,a lda trknr cmp d jnz poserr ; xra a cmp b mov a,c rz ; in trkreg ; FDC-Befehl wurde mit Fehler ori 80h ; abgeschlossen mov m,a ; mvi b,4h wdhg: push b push h call rdwr ani 5ch pop h pop b jz ende ; dcr b ; ; jnz wdhg ; end0: mvi m,0h ende: in status ani 7ch end1: push psw ; call intof pop psw ret ; ; recal: mvi b,04h ; Restore call posit xra a cmp b jz recal1 mvi m,80h in status ret ; recal1: mov a,c ret ; ; ; init: di shld datadr push b mov a,d sta trknr mov a,e sta secnr ; ; lxi h,0024h mvi m,0e9h ; TRAP : PCHL lxi h,0066h mvi m,0e9h ; lxi h,002ch mvi m,0f1h ; RST5.5: POP PSW inx h mvi m,0dbh ; IN inx h mvi m,048h ; 48h inx h mvi m,0c9h ; RET ; ; ; ; ; mov a,b sta selbyt rrc ani 03h push psw lxi h,laufw0 mvi d,0h mov e,a dad d mov c,m lda selbyt ani 21h ora c sta selout lxi h,track0 pop psw mvi d,0h mov e,a dad d pop b ret ; ; ; ; rdwr: lhld datadr push h pop d lhld intprg lda secnr out secreg call inton ; lda rwbef out comreg rdwr1: ei hlt jmp rdwr1 ; ; laufw0: db 02h laufw1: db 04h laufw2: db 08h laufw3: db 10h ; ; posit: call inton ; lda selbyt rrc rrc rrc ani 03h ora b out comreg posit1: in status rlc jnc posit1 lda selout out ctrl ei mvi b,2h posit2: lxi d,0ffffh posit3: dcx d mov a,d ora e jnz posit3 dcr b jnz posit2 mvi a,0d0h out comreg call intof ; in status ani 7ch ori 80h mov c,a ret ; poserr: mvi m,0h ;Posit.-Fehler mvi a,10h ret ; ; secrd: lda 0066h sta nscbuf ; vsecrd: shld hlbuff ; lxi h,0h dad sp shld spbuff lxi sp,stack2 lhld hlbuff ; call secrd0 shld hlbuff lhld spbuff sphl lhld hlbuff push psw lda nscbuf sta 0066h pop psw ret ; ; ; secrd0: mvi c,10h lda tbit ora a jz secrdl mvi a,"R" call test secrdl: push h push d push b call secrdx pop b pop d pop h ora a rz dcr c jnz secrdl inr a ret ; ; secwr: lda 0066h sta nscbuf mvi c,10h vsecwr: lda tbit ora a jz secwrl mvi a,"W" call test secwrl: push h push d push b call secwrx pop b pop d pop h ora a jz verify dcr c jnz secwrl inr a push psw lda nscbuf sta 0066h pop psw ret ; ; verify: push h shld vbufhl lda tbit ora a jz verxx mvi a,"V" call test ; verxx: push d push b lxi h,verbuf call vsecrd lhld vbufhl call compar pop b pop d pop h jnz vsecwr lda nscbuf sta 0066h xra a ret ; ; compar: mvi b,0h lxi d,verbuf compl: ldax d cmp m rnz ; inx h inx d dcr b jnz compl ret ; ; ;==================================================== ; ; Kalt- und Warmstart ; ;==================================================== ; boot: call curson ; Cursor einschalten call pioinit ; CF Interface vorbereiten ; mvi a,01h out 24h ; Only Bank 1 select ; mvi a,80h ; LPT+CON sta iobyte ; IO-BYTE initialisieren ; xra a sta tbit ; loescht Testbit ; lxi sp,stack ; Initialisierung STACK ; lxi h,msg1 ; Begrue~ungstext ausgeben call msgout xra a sta wrtflg ; Buffer ungueltig sta cdisk ; Select Drive 0 cma sta aktdrv ; letztes Drive undefiniert lxi h,0000h shld track0 ; trk-reg 0+1 undefiniert shld track2 ; trk-reg 2+3 undefiniert gocpm: mvi a,0c3h ; Initialisierung Page 0 sta 0000h sta 0005h lxi h,wboote shld 1h lxi h,bdos shld 6h lxi b,buff call setdma lda cdisk mov c,a jmp ccp ; ; ; ; wboot: lxi sp,buff ; lda wrtflg ; wurde alter Buffer auf Disk ora a ; geschrieben ? jz load ; write alten Buffer auf Disk call puttrk ; weiter mit Floppy ; load: xra a cma sta wrtflg ; Buffer ungueltig ; mvi c,16h ; 22 Sektoren lxi d,begin ;Warmstart von Disk lxi h,ccp bloop: push d push h push b ; ; mvi b,18h ; Select-Byte ; call secrd ; pop b ; pop h lxi d,0100h dad d pop d ; ora a jnz load inr e dcr c jz gocpm mov a,e cpi 11h jz ntrks jmp bloop ; ntrks: inr d mvi e,01h jmp bloop ; ; ; ; msgout: mov a,m ora a rz mov c,a push h call co pop h inx h jmp msgout ; ;==================================================== ; ; CF Interface ; ;==================================================== ; ; PIO Ansteuerung ; PIO_A equ 0cah ; CAh Daten Kanal A PIO_B equ 0dah ; DAh Daten Kanal B PIO_C equ 0eah ; EAh Daten Kanal C PIO_Ctl equ 0fah ; FAh Steuerwort ; PIO_BA equ 0c1h ; Betriebsart 2 ; ; Kanal A bidirektional, Handshake Kanal C ; ; AVR Befehle ; AVRres equ 00h ; Spur 0 Sektor 0 ansteuern SetSpur equ 10h ; Spurnummer setzen SetSekt equ 20h ; Sektornummer setzen Rdsekt equ 30h ; Daten vom aktuellen Sektor lesen Wrsekt equ 40h ; Daten in den aktuellen Sektor schreiben AVRstat equ 0F0h ; Status ermittel ; ; ; CF-karte lesen/schreiben ; Laufwerk 4 = CF_Karte ; ; Parameterübergabe: ; ; TRKNR = Spur ; SECNR = Sektor ; DATADR = Buffer Zieladresse ; BUFSCR = Anzahl der zu übertragenden Sektoren ; auf 512Byte/Sektor angepasst ; ;=========================================================== ; ; initrw = Buffer, Spur, Sektorregister vorbereiten ; initrw: xra a ; clear wrtflg -"Buffer ungültig" sta wrtflg ; di ; Interrupt sperren lxi h,buffer ; shld datadr ; lda akttrk ; sta trknr ; lda aktsec ; sta secnr ; call settr ; call setsek ; ret ; ; ; get/put_cf = Block von CF lesen/schreiben ; get_cf: call initrw ; cfrd_l: call rdsek ; call updsek ; call rdsek ; xra a ; ret ; zurück zum Disk-Manager put_cf: call initrw ; cfwr_l: call wrsek ; call updsek ; call wrsek ; xra a ; ret ; zurück zum Disk-Manager ; ; ; updsek/sp = Sektor und Spurnummern aktualisieren ; und an CF-Karte senden ; ; ! Format 16 Sektoren pro Spur ! ; updsek: lda secnr ; Sektor holen cpi 10h ; letzter Sektor spur jz updsp ; inr a ; nächster Sektor gleiche Spur sta secnr ; call setsek ; Sektor für CF setzen ret updsp: mvi a,01h ; nächste Spur mit Sektor 1 sta secnr ; lda trknr ; inr a ; sta trknr ; call settr ; Spur/Sektor für CF setzen call setsek ; ret ;==================================================== ; ; PIO-A lesen (A) ; wartet bis Daten bereitstehen piord: in PIO_C ; Status ermitteln ani 00100000b ; IBF maskieren jz piord ; warte auf Daten in PIO_A ; daten lesen ret ; (A) Daten ; ; (A) PIO-A schreiben ; piowr: push psw ; pio_sts: in PIO_C ; Status ermitteln ani 10000000b ; /OBF maskieren jz pio_sts ; warten auf Quittung /ACK pop psw out PIO_A ; Daten schreiben ret ; ; ;==================================================== ; ; PIO Initialisieren mit Betriebsart ; Kanal A bidirektional ; Kanal C Handshake ; Kanal B Ausgabe ; pioinit: push psw ; PIO Betriebsart einstellen mvi a,PIO_BA ; PIO_BA equ 0c1h out PIO_Ctl ; pop psw ; ret ; ; ; ; cfinit = Reset Befehl an CF-Karte ; ; cfinit: call pioinit ; PIO und AVR initialisieren mvi a,avrres ; Test ob CF-Erweiterung vorhanden ist; call piowr ; xra a ; call piord ; cpi 00h ; jnz cferr ; CF nicht bereit -> Fehler ret ; CF-Interface OK ; ; avr_stat = Status CF-Karte ermitteln 0=OK ; sonst Fehlermeldung ; avr_stat: mvi a,avrstat ; Status AVR ermitteln call piowr ; call piord ; cpi 00h ; jnz cferr ; Driver Error ret ; ; cferr: mvi a,01h ; Fehler CF-Karte ora a ; ret ; ; ;==================================================== ; ; Spur/Sektor setzen ; settr: mvi a,setspur ; Befehl Spur setzen call piowr ; lda trknr ; Spur laden call piowr ; ret ; setsek: mvi a,setsekt ; Befehl Sektor setzen call piowr ; lda secnr ; Sektor laden call piowr ; ret ; ; ; Sektoren lesen/schreiben (512Byte) ; wrsek: mvi a,wrsekt ; Befehl schreiben call piowr ; lhld datadr ; lxi b,200h ; 512 byte wrsek_l: mov a,m ; call piowr ; inx h ; dcr c ; ; jnz wrsek_l ; dcr b ; jnz wrsek_l ; shld datadr ; Buffer sichern ret ; rdsek: mvi a,rdsekt ; Befehl lesen call piowr ; call piord ; Dummy entfernen lhld datadr ; lxi b,200h ; 512 byte rdsek_l: mov m,a ; call piord ; inx h ; dcr c ; jnz rdsek_l ; dcr b ; jnz rdsek_l ; shld datadr ; Bufferadresse sichern ret ; ; ; msg1: db 0ah db 0dh db "T" db "h" db "i" db "s" db 20h db "i" db "s" db 20h db "6" ; 60 K db "0" db 20h db "K" db 20h db "C" db "P" db "/" db "M" db 20h db "R" db "e" db "l" db "." db 20h db "2" db "." db "2" db 0ah db 0dh db 00h ; ;------------------------------------------------------- ; Testprogramm wird über tbit = 1 gesteuert ; Floppy-Routinen Systemmeldung ; Read/Write ; test: push h push d push b mov c,a call co pop b pop d pop h ret ; ; ; Soft-System ; trknr: db 0h ; für Disk-Routinen secnr: db 0h ; -- " -- selbyt: db 0h ; -- " -- selout: db 0h ; -- " -- versnr: db 0h ; ? trkbak: dw 0h ; ? ; tbit: db 0h ; Test-Flag wenn 1 Systemmeldung Read/Write ; ; track0: db 80h ; trk-reg undefiniert track1: db 80h ; -- " -- track2: db 80h ; -- " -- track3: db 80h ; -- " -- ; rwbef: db 0h ; für Disk-Routinen datadr: dw 0h ; -- " -- Bufferadresse intprg: dw 0h ; -- " -- ; wrtflg: db 0h ; 0= Buffer ungültig, Daten nachladen aktdrv: db 0h ; Laufwerk akttrk: db 0h ; Track nach Blocking/Deblocking aktsec: db 0h ; Sektor -- " -- ; nscbuf: db 0h ; Zwischenspeicher für RAM 0066h ; wg. Floppy-Routine TRAP hlbuff: dw 0h ; Zwischenspeicher für STACK-Umschaltung spbuff: dw 0h ; Zwischenspeicher für BDOS-STACK ; vbufhl: ds 2h ; ; dbank: db 0h ; Laufwerksnummer aus seldsk iopb: db 80h ; norm IO ion: db 1h iotrk: db offset ; <== BDOS iosec: db 1h ; -- " -- iodma: dw buff ; -- " -- trkbuf: db 0h db 0h db 0h db 0h altdrv: db 1h indadr: dw 0h indad2: dw 0h ; begdat equ dirbuf ; dirbuf: ds 80h ; Directory Access Buffer alv0: ds 12h csv0: ds 10h alv1: ds 12h csv1: ds 10h alv2: ds 12h csv2: ds 10h alv3: ds 12h csv3: ds 10h enddat: ds 0h ; datsiz equ 0108h ; = ENDDAT - BEGDAT ; uc1out: ds 3h ; User-Consol-Output uc1in: ds 3h ; User-Consol-Input uc1sta: ds 3h ; User-Consol-Status ; ptr: ds 3h ; Paper-Tape-Reader ur1: ds 3h ; User-Reader 1 ur2: ds 3h ; User-Reader 2 ; ptrsta: ds 3h ; Paper-Tape-Reader-Status ur1sta: ds 3h ; User-Reader 1 - Status ur2sta: ds 3h ; User-Reader 2 - Status ; ;------------------------------------------------------ ; ;================================================= ; Testprogramm ; Kopiert die TPA in Buffer ; ; (B) = Anzahl Bytes die kopiert werden ; (DE) = Zieladress Buffer ; (HL) = Quelladresse TPA ; ; Haupprogramm liegt ab 2000h in Bank #0 ; kopiert die Daten in Buffer Bank #0 ; org 0F800h ; ; copy_tpa: mvi a,01h ; Bank #1 out 24h ; copy_l: mov a,m ; 128Byte von TPA in Buffer stax d inx h inx d dcr b ; jnz copy_l copy_e: mvi a,81h ; zurück nach Bank #0 out 24h ; jmp 2803h ; Copy RET ; ;================================================= ; RAM frei bis ; ; stack2 0FAFFh ; bei 60 K ; ; verbuf 0FB00h ; bei 60 K ; ; buffer 0FC00h ; bei 60 K ; ; end ;