.Z80 PAGE 64 ;******************************************************** ;* * ;* WILHELM - PIECK - UNIVERSITAET ROSTOCK * ;* Institut fuer sozialistische Wirtschaftsfuehrung * ;* EDV - Labor * ;* * ;* BIOSKC85 Vers. 1.0 * ;* * ;* Bearbeiter: M. Ohlerich Stand: 06/01/89 * ;* K.-D. Kirves * ;******************************************************** ; PUBLIC CHROUT,ICT3,MTIME,SIZE,RDSM,RFBUF,RFTRK PUBLIC REXM,RAL0,RDRM,RBSH,RBLM PUBLIC ENDBIO,UHRINT,NMBDRV,DPH0,DPB1 ; CTC EQU 0FCH TPA EQU 100H ; BIOS: JP BOOT ; Kaltstart JP WBOOT ; Warmstart Š JP CHRSTS ; Zeichenstatus JP CHRIN ; Zeicheneingabe JP CHROUT ; Zeichenausgabe JP SELDSK ; Geraeteauswahl JP IOBLK ; Block-Ein/Ausgabe JP RETMSG ; Systemmeldungen JP RESNUM ; residente Kommandos ; ; System - Konfiguration ; VERS: DEFB '85' ; Versionsnummer ; LCNS: DEFB 0,0,0 ; Lizenznummer ; SBASE: DEFW BIOS-2400H ; Systemanfang ; NMBDRV: DEFB 4 ; Anzahl der logischen Laufwerke ; DPHPTR: DEFW DPHTAB ; aktuelle Parameterliste ; DPHTAB: DEFW DPH0 ; Tabelle der Parameterkoepfe DEFW DPH1 DEFW DPH2 DEFW DPH3 DEFW DPH4 DEFW DPH5 DEFW DPH6 DEFW DPH7 ; ; Sektor - Umrechnungstabelle ; XLT: DEFB 0,6,12,18 DEFB 24,4,10,16 DEFB 22,2,8,14 DEFB 20,1,7,13 DEFB 19,25,5,11 DEFB 17,23,3,9 DEFB 15,21 ; ; Diskettenparameterkoepfe ; DPH0: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB0 DEFW CSV0 DEFW ALV0 ; DPH1: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB1 DEFW CSV1 DEFW ALV1 ; DPH2: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB2 DEFW CSV2 DEFW ALV2 ; DPH3: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB3 DEFW CSV3 DEFW ALV3 ; DPH4: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB4 DEFW CSV4 DEFW ALV4 ; DPH5: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB5 DEFW CSV5 DEFW ALV5 ; DPH6: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB6 DEFW CSV6 DEFW ALV6 ; DPH7: DEFW 0,0,0,0 DEFW DIRBUF DEFW DPB7 DEFW CSV7 DEFW ALV7 ; ; Disketten - Parameter - Bloecke ; ;LW A: RAMFLOPPY DEFW IORAM DPB0: DEFW 128 ; SPT RBSH: DEFB 4 ; BSH RBLM: DEFB 15 ; BLM REXM: DEFB 1 ; EXM RDSM: DEFW 0 ; DSM RDRM: DEFW 63 ; DRM RAL0: DEFB 80H ; AL0 DEFB 0 ; AL1 DEFW 0 ; CKS DEFW 0 ; OFF ; ;LW B: 5*1024*80*2 OFF 2 DEFW IODISK DPB1: DEFW 050H ; SPT Sektoren pro Spur DEFB 004H ; BSH Blockschiebefaktor DEFB 00FH ; BLM Blockmaske DEFB 000H ; EXM Extentmaske DEFW 389 ; DSM Diskettenkapazitaet DEFW 07FH ; DRM Inhaltsverzeichniseintraege DEFB 0C0H ; AL0 Belegungsvektor 0 DEFB 000H ; AL1 Belegungsvektor 1 DEFW 010H ; CKS Pruefsummenvektor DEFW 002H ; OFF Offset ; DEFB 003H ; PSH physischer Sektorschiebefaktor DEFB 007H ; PHM physische Sektormaske DEFB 005H ; EOT letzter Sektor DEFB 00FH ; GAP Luecke DEFB 050H ; NTR Spuranzahl DEFB 000H ; PUN physische Geraetenummer DEFB 043H ; TYP Laufwerkstyp DEFB 0FFH ; PRE Praekompensation DEFB 0EFH ; SRT Schrittzeit DEFB 014H ; HLT Kopfladezeit DEFB 0FFH ; CUR Schreibstrombegrenzung ; LW C: 16*256*80*2 OFFS 2 DEFW IODISK DPB2: DEFW 040H ; SPT Sektoren pro Spur DEFB 004H ; BSH Blockschiebefaktor DEFB 00FH ; BLM Blockmaske DEFB 000H ; EXM Extentmaske DEFW 137H ; DSM Diskettenkapazitaet DEFW 07FH ; DRM Inhaltsverzeichniseintraege DEFB 0C0H ; AL0 Belegungsvektor 0 DEFB 000H ; AL1 Belegungsvektor 1 DEFW 010H ; CKS Pruefsummenvektor DEFW 002H ; OFF Offset ; DEFB 001H ; PSH physischer Sektorschiebefaktor DEFB 001H ; PHM physische Sektormaske DEFB 010H ; EOT letzter Sektor DEFB 00FH ; GAP Luecke DEFB 050H ; NTR Spuranzahl DEFB 000H ; PUN physische Geraetenummer DEFB 043H ; TYP Laufwerkstyp DEFB 0FFH ; PRE Praekompensation DEFB 0EFH ; SRT Schrittzeit DEFB 014H ; HLT Kopfladezeit DEFB 0FFH ; CUR Schreibstrombegrenzung ;LW D: 5*1024*80*2 OFFS 0 DRIVE 1 DEFW IODISK DPB3: DEFW 50H ; SPT Sektoren pro Spur DEFB 4 ; BSH Blockschiebefaktor DEFB 15 ; BLM Blockmaske DEFB 0 ; EXM Extentmaske DEFW 399 ; DSM Diskettenkapazitaet DEFW 127 ; DRM Inhaltsverzeichniseintraege DEFB 0c0h ; AL0 Belegungsvektor 0 DEFB 0 ; AL1 Belegungsvektor 1 DEFW 16 ; CKS Pruefsummenvektor DEFW 0 ; OFF Offset ; DEFB 3 ; PSH physischer Sektorschiebefaktor DEFB 7 ; PHM physische Sektormaske DEFB 5 ; EOT letzter Sektor DEFB 25H ; GAP Luecke DEFB 80 ; NTR Spuranzahl DEFB 0 ; PUN physische Geraetenummer DEFB 43H ; TYP Laufwerkstyp DEFB -1 ; PRE Praekompensation DEFB 0EFH ; SRT Schrittzeit DEFB 20 ; HLT Kopfladezeit DEFB -1 ; CUR Schreibstrombegrenzung ; LW E: 5*1024*80*2 OFFS 2 DRIVE 2 DEFW IODISK DPB4: DEFW 050H ; SPT Sektoren pro Spur DEFB 004H ; BSH Blockschiebefaktor DEFB 00FH ; BLM Blockmaske DEFB 000H ; EXM Extentmaske DEFW 389 ; DSM Diskettenkapazitaet DEFW 07FH ; DRM Inhaltsverzeichniseintraege DEFB 0C0H ; AL0 Belegungsvektor 0 DEFB 000H ; AL1 Belegungsvektor 1 DEFW 010H ; CKS Pruefsummenvektor DEFW 002H ; OFF Offset ; DEFB 003H ; PSH physischer Sektorschiebefaktor DEFB 007H ; PHM physische Sektormaske DEFB 005H ; EOT letzter Sektor DEFB 00FH ; GAP Luecke DEFB 050H ; NTR Spuranzahl DEFB 001H ; PUN physische Geraetenummer DEFB 043H ; TYP Laufwerkstyp DEFB 0FFH ; PRE Praekompensation DEFB 0BFH ; SRT Schrittzeit DEFB 014H ; HLT Kopfladezeit DEFB 0FFH ; CUR Schreibstrombegrenzung ; LW F: 16*256*80*2 OFFS 2 DRIVE 2 DEFW IODISK DPB5: DEFW 040H ; SPT Sektoren pro Spur DEFB 004H ; BSH Blockschiebefaktor DEFB 00FH ; BLM Blockmaske DEFB 000H ; EXM Extentmaske DEFW 13FH ; DSM Diskettenkapazitaet DEFW 07FH ; DRM Inhaltsverzeichniseintraege DEFB 0C0H ; AL0 Belegungsvektor 0 DEFB 000H ; AL1 Belegungsvektor 1 DEFW 010H ; CKS Pruefsummenvektor DEFW 002H ; OFF Offset ; DEFB 001H ; PSH physischer Sektorschiebefaktor DEFB 001H ; PHM physische Sektormaske DEFB 010H ; EOT letzter Sektor DEFB 00FH ; GAP Luecke DEFB 050H ; NTR Spuranzahl DEFB 002H ; PUN physische Geraetenummer DEFB 043H ; TYP Laufwerkstyp DEFB 0FFH ; PRE Praekompensation DEFB 0EFH ; SRT Schrittzeit DEFB 014H ; HLT Kopfladezeit DEFB 0FFH ; CUR Schreibstrombegrenzung ;LW G: 5*1024*80*2 DRIVE 3 DEFW IODISK DPB6: DEFW 50H ; SPT Sektoren pro Spur DEFB 4 ; BSH Blockschiebefaktor DEFB 15 ; BLM Blockmaske DEFB 0 ; EXM Extentmaske DEFW 389 ; DSM Diskettenkapazitaet DEFW 127 ; DRM Inhaltsverzeichniseintraege DEFB 0c0h ; AL0 Belegungsvektor 0 DEFB 0 ; AL1 Belegungsvektor 1 DEFW 16 ; CKS Pruefsummenvektor DEFW 2 ; OFF Offset ; DEFB 3 ; PSH physischer Sektorschiebefaktor DEFB 7 ; PHM physische Sektormaske DEFB 5 ; EOT letzter Sektor DEFB 25H ; GAP Luecke DEFB 80 ; NTR Spuranzahl DEFB 02 ; PUN physische Geraetenummer DEFB 43H ; TYP Laufwerkstyp DEFB -1 ; PRE Praekompensation DEFB 0EFH ; SRT Schrittzeit DEFB 20 ; HLT Kopfladezeit DEFB -1 ; CUR Schreibstrombegrenzung ; LW H: 5*1024*80*2 OFFS 3 DRIVE 1 DEFW IODISK DPB7: DEFW 50H ; SPT Sektoren pro Spur DEFB 4 ; BSH Blockschiebefaktor DEFB 15 ; BLM Blockmaske DEFB 0 ; EXM Extentmaske DEFW 384 ; DSM Diskettenkapazitaet DEFW 127 ; DRM Inhaltsverzeichniseintraege DEFB 0c0h ; AL0 Belegungsvektor 0 DEFB 0 ; AL1 Belegungsvektor 1 DEFW 16 ; CKS Pruefsummenvektor DEFW 03 ; OFF Offset ; DEFB 3 ; PSH physischer Sektorschiebefaktor DEFB 7 ; PHM physische Sektormaske DEFB 5 ; EOT letzter Sektor DEFB 25H ; GAP Luecke DEFB 80 ; NTR Spuranzahl DEFB 0 ; PUN physische Geraetenummer DEFB 43H ; TYP Laufwerkstyp DEFB -1 ; PRE Praekompensation DEFB 0EFH ; SRT Schrittzeit DEFB 20 ; HLT Kopfladezeit DEFB -1 ; CUR Schreibstrombegrenzung ; ; Warmstart ; WBOOT: LD A,(HSTWRT) ; Puffer gefuellt ? OR A ; CALL NZ,WRTHST ; wenn ja, leeren ; ; Kaltstart ; BOOT: XOR A ; Puffer deaktivieren LD (UNACNT),A ; LD (HSTACT),A ; ; LD A,(0003H) ; I/O - Byte kopieren LD (IOBYTE),A ; RET ; ; ; Zeichen - Status ; CHRSTS: LD HL,INPTR ; Konsolenstatus DEC D ; Kanalnummer JR NZ,CSTS ; LD HL,OUTPTR+2 ; LD A,M INC A AND 1FH ;5 BIT INC HL SUB M ;BEI = PUFFER VOLL JR CST1 ; CSTS: LD A,(HL) ; Zeiger INC HL ; SUB (HL) ; vergleichen CST1: RET Z ; kein Zeichen vorhanden LD A,0FFH ; RET ; Zeichen vorhanden ; ; Zeichen - Eingabe ; CHRIN: LD A,D ; Kanalnummer LD HL,INPTR+1 ; LD DE,CIBUF ; OR A ; Konsoleneingabe ? JR Z,CHRIN1 ; LD L,LOW(INPTR+5) ; Zusatzeingabe LD E,LOW(AIBUF) ; LD (AIANF),A ; Eingabeanforderung ; CHRIN1: LD A,(HL) ; Zeiger DEC HL ; CHRIN2: CP (HL) ; vergleichen JR Z,CHRIN2 ; wenn gleich, warten ADD A,E ; LD E,A ; INC A ; Zeiger erhoehen INC HL ; AND 1FH ; nicht ueber 32 LD B,A ; LD A,(DE) ; Zeichen holen LD (HL),B ; neuen Zeiger ablegen RET ; ; ; Zeichen - Ausgabe ; CHROUT: LD A,D ; Kanalnummer LD HL,OUTPTR+1 ; LD DE,COBUF ; OR A ; Konsolenausgabe ? JR Z,CHOUT1 ; LD L,LOW(OUTPTR+3) ; LD E,LOW(LOBUF) ; DEC A ; Druckerausgabe ? JR Z,CHOUT1 ; LD L,LOW(OUTPTR+5) ; Zusatzausgabe LD E,LOW(AOBUF) ; ; CHOUT1: LD A,(HL) ; Zeiger INC A ; erhoehen AND 1FH ; nicht ueber 32 LD B,A ; neuen Zeiger retten DEC HL ; CHOUT2: CP (HL) ; mit Ausgangszeiger vergleichen JR Z,CHOUT2 ; bei Gleichheit warten INC HL ; LD A,(HL) ; neuen Eingangszeiger ablegen EX DE,HL ; ADD A,L ; LD L,A ; LD (HL),C ; Zeichen ablegen LD A,B ; LD (DE),A ; neuen Eingangszeiger ablegen RET ; ; ; Systemmeldungen ; RETMSG: LD HL,MSGTBL ; RET ; ; MSGTBL: DEFW MERR DEFW MBAD DEFW MSYNTX DEFW MSYSF DEFW MSEL DEFW MNOMEM DEFW MIGNOR DEFW MBLANK DEFW MEXIST DEFW MAMB DEFW MNOF DEFW MDEL DEFW MBOOT DEFW MRO ; MERRº DEFB 7,'BDOS-Fehleò auæ $' MBAD: DEFM 'Diskettenfehler$' MSYSF: DEFM 'Systemdatei$' MSEL: DEFM 'Auswahl$' MSYNTX: DEFM '??$' MNOMEM: DEFM 0AH,'Ueberlauf$' MIGNOR: DEFM 'ignorieren (j/n) ?$' MEXIST: DEFM 'Datei existiert$' MAMB: DEFM 'mehrdeutiger Name$' MNOF: DEFB 0AH,'keine Datei$' MDEL: DEFB 0DH DEFB 0AH DEFM 'loeschen (j/n) ?$' MBOOT: DEFM ' MPM - ISW' MBLANK: DEFB 0DH DEFB 0AH DEFB '$' MRO: DEFM 'Datei schreibgeschuetzt$' ; ; ERWEITERUNG DER RESIDENTEN KOMMANDOS ; RESNUM: LD A,D AND A JR NZ,EINS LD C,1BH CALL CONOUT LD C,5CH ;BYE ; KONSOLENAUSGABE BIOS CONOUT: LD D,0 JP CHROUT ; EINS: DEC A JR NZ,ZWEI CLS: LD C,0CH ;CLS JR CONOUT ; ZWEI: DEC A JR NZ,DREI CALL CLS LD C,1BH CALL CONOUT LD C,5BH ;CAOS-UP CALL CONOUT LD C,3AH ;KEYLIST JR CONOUT ; DREI: DEC A JR NZ,VIER LD A,(5DH) ;FCB+1 SUB 30H CP 10 JR C,DREI1 SUB 7 AND 0BFH DREI1: PUSH AF CALL CLS LD C,1BH CALL CONOUT LD C,65H CALL CONOUT POP AF LD C,A JR CONOUT ; VIER: DEC A JP NZ,TPA ;>4 GO LD A,(80H) AND A JR NZ,ZEITIN LD HL,40H LD B,3 L1: PUSH BC LD A,M RRA RRA RRA RRA AND 0FH OR 30H LD C,A PUSH HL CALL CONOUT POP HL LD A,M INC HL AND 0FH OR 30H LD C,A PUSH HL CALL CONOUT LD C,':' CALL CONOUT POP HL POP BC DJNZ L1 LD C,7FH JR CONOUT ; ZEITIN: LD A,(82H) AND 5FH CP 'X' JR NZ,ZEITI1 LD A,3 DI OUT (CTC),A OUT (CTC+1),A LD A,0FFH LD (40H),A EI RET ; ZEITI1: LD A,(80H) INC A CP 6 JR C,ENDE LD HL,81H LD E,A CALL ZAHL JR C,ENDE LD (40H),A ;STUNDEN CALL ZAHL JR C,ENDE LD (41H),A ;MINUTEN CALL ZAHL JR C,ENDE LD (42H),A ;SEKUNDEN ENDE: ZA1: SCF RET ; ZAHL: LD A,E AND A JR Z,ZA1 LD D,0 ZA2: LD A,(HL) INC HL DEC E CP 20H JR Z,ZA2 CP 3AH ; : JR Z,ZA2 SUB 30H RET C CP 10 CCF RET C RLCA RLCA RLCA RLCA LD D,A DEC E LD A,E AND A JR Z,ZA1 LD A,(HL) INC HL SUB 30H RET C CP 10 CCF RET C OR D RET ; CTC-SEKUNDENINTERRUPT UHRINT: LD (RSTACK),SP LD SP,ISTACK PUSH AF PUSH HL LD HL,42H LD A,M ADD A,1 DAA LD M,A LD A,60H CP M JR NZ,UREND LD M,0 DEC HL LD A,M ADD A,1 DAA LD M,A LD A,60H CP M JR NZ,UREND LD M,0 DEC HL LD A,M ADD A,1 DAA LD M,A LD A,24 CP M JR NZ,UREND LD M,0 UREND: POP HL POP AF LD SP,(RSTACK) EI RETI ; ; Geraeteauswahl ; SELDSK: LD HL,NMBDRV ; Maximale Laufwerksanzahl LD A,C ; mit anzuwaehlendem Laufwerk CP (HL) ; vergleichen und LD HL,0 ; bei Fehler mit =0 RET NC ; zurueckehren. LD (SEKDSK),A ; Anderenfalls neues Laufwerk ablegen LD L,A ; und Parameterkopf aus ADD HL,HL ; EX DE,HL ; LD HL,(DPHPTR) ; Tabelle ADD HL,DE ; LD E,(HL) ; heraussuchen INC HL ; LD D,(HL) ; EX DE,HL ; LD (SEKDPH),HL ; und ablegen RET ; ; ; Block-Ein/Ausgabe ; IOBLK: PUSH HL ; Register HL und PUSH BC ; BC retten. LD C,(HL) ; Aktuelles Laufwerk CALL SELDSK ; anwaehlen. POP BC ; BC wiederherstellen. LD DE,10 ; Parameterblockadresse ADD HL,DE ; LD A,(HL) ; holen INC HL ; LD H,(HL) ; LD L,A ; DEC HL ; LD A,(HL) ; Treiberadresse laden DEC HL ; LD L,(HL) ; LD H,A ; EX (SP),HL ; HL wiederherstellen RET ; und Treiber aufrufen ; ; RAM-Floppy-Ein/Ausgabe ; IORAM: INC HL ; INC HL ; PUSH HL ; Kommando INC HL ; INC HL ; LD A,(HL) ; Spur LD (RFTRK),A ; INC HL ; LD A,(HL) ; Sektor LD (RFSEC),A ; INC HL ; LD A,(HL) ; Speicheradresse INC HL ; LD H,(HL) ; LD L,A ; LD (SEKDMA),HL ; POP HL ; LD A,(HL) ; AND 07H ; CP 04H ; JP Z,RAMRD ; Lesen CP 06H ; JP Z,RAMWR ; Schreiben LD A,0FFH ; RET ; ; RAM - Floppy lesen ; RAMRD: LD HL,CONTR ; Kommando LD (HL),A ; ablegen RR1: CP (HL) ; und Resultat JR Z,RR1 ; abwarten. LD A,(HL) ; Resultat holen. LD HL,RFBUF ; Speichertransfer vom Floppy-Puffer LD DE,(SEKDMA) ; zum Hauptspeicher LD BC,80H ; mit der Laenge 128 Byte LDIR ; ausfuehren RET ; und zurueckehren. ; ; RAM - Floppy schreiben ; RAMWR: LD HL,(SEKDMA) ; Speichertransfer vom Hauptspeicher LD DE,RFBUF ; zum Floppy-Puffer LD BC,80H ; mit der Laenge 128 Byte LDIR ; ausfuehren. LD HL,CONTR ; Kommando LD (HL),A ; ablegen RW1: CP (HL) ; und Resultat JR Z,RW1 ; abwarten. LD A,(HL) ; Resultat holen RET ; und uebergeben. ; ; Disketten-Ein/Ausgabe ; IODISK: INC HL INC HL PUSH HL INC HL INC HL LD A,(HL) LD (SEKTRK),A INC HL LD A,(HL) LD (SEKSEC),A INC HL LD A,(HL) INC HL LD H,(HL) LD L,A LD (SEKDMA),HL POP HL LD A,(HL) AND 07H CP 04H JP Z,READ CP 06H JP Z,WRITE LD A,0FFH RET ; ; Parameterblock waehlen und Blockung testen ; CHKBLK: LD HL,(SEKDPH) ; Aktuellen Parameterblock LD (DPHPAR),HL ; ablegen. GETPSH: LD L,15 ; Sektorgroesse ; ; Parameter aus Parameterblock holen ; GETPAR: PUSH DE ; DE retten LD DE,10 ; Offset Parameterblock LD H,D ; H loeschen PUSH HL ; Index retten LD HL,(DPHPAR) ; Parameterkopf ADD HL,DE ; Parameteradresse holen LD E,(HL) ; INC HL ; LD D,(HL) ; POP HL ; Index ADD HL,DE ; addieren POP DE ; DE wiederherstellen LD A,(HL) ; Parameter holen OR A ; testen RET ; ; ; Floppy lesen ; RCMD EQU 06H ; Lesekommando WCMD EQU 05H ; Schreibkommando ; READ: CALL CHKBLK ; LD A,RCMD ; JP Z,NOBLK ; XOR A ; LD (UNACNT),A ; INC A ; LD (READOP),A ; LD (RSFLAG),A ; INC A ; LD (WRTYPE),A ; JR RWOPER ; ; ; Floppy schreiben ; WRITE: CALL CHKBLK ; LD A,WCMD ; JP Z,NOBLK ; XOR A ; LD (READOP),A ; LD A,C ; LD (WRTYPE),A ; CP 2 ; JR NZ,CHKUNA ; ; LD L,3 ; Blockmaske CALL GETPAR INC A LD (UNACNT),A LD HL,SEKDSK LD DE,UNADSK LD BC,4 LDIR ; CHKUNA: LD A,(UNACNT) OR A JR Z,ALLOC ; DEC A LD (UNACNT),A LD A,(SEKDSK) LD HL,UNADSK CP (HL) JR NZ,ALLOC ; LD HL,UNATRK LD A,(SEKTRK) CP (HL) JR NZ,ALLOC ; LD HL,UNASEC LD A,(SEKSEC) CP (HL) JR NZ,ALLOC ; INC (HL) PUSH HL LD L,0 ; Sektoren pro Spur CALL GETPAR LD C,A POP HL LD A,(HL) CP C JR C,NOOVF ; LD (HL),0 LD HL,UNATRK INC (HL) ; NOOVF: XOR A JR RWOPR1 ; ALLOC: XOR A LD (UNACNT),A INC A RWOPR1: LD (RSFLAG),A ; RWOPER: XOR A LD (ERFLAG),A CALL GETPSH LD B,A LD A,(SEKSEC) RWLOOP: OR A RRA DJNZ RWLOOP LD (SEKHST),A LD HL,HSTACT LD A,(HL) LD (HL),1 OR A JR Z,FILHST LD A,(SEKDSK) LD HL,HSTDSK CP (HL) JR NZ,NOMTCH LD HL,HSTTRK LD A,(SEKTRK) CP (HL) JR NZ,NOMTCH LD A,(SEKHST) LD HL,HSTSEC CP (HL) JR Z,MATCH ; NOMTCH: LD A,(HSTWRT) OR A CALL NZ,WRTHST ; FILHST: LD HL,SEKDSK LD DE,HSTDSK LD BC,8 LDIR LD A,(SEKHST) LD (HSTSEC),A LD A,(RSFLAG) OR A CALL NZ,RDHST XOR A LD (HSTWRT),A ; MATCH: CALL GETPSH INC HL LD A,(SEKSEC) AND (HL) RRA LD H,A LD A,0 RRA LD L,A LD DE,HSTBUF ADD HL,DE LD DE,(SEKDMA) LD BC,80H LD A,(READOP) OR A JR NZ,RWMOVE INC A LD (HSTWRT),A EX DE,HL ; RWMOVE: LDIR LD A,(WRTYPE) DEC A LD A,(ERFLAG) RET NZ OR A RET NZ LD (HSTWRT),A CALL WRTHST LD A,(ERFLAG) RET ; WRTHST: LD A,WCMD ; DEFB 21H ; Dummy - Befehl LD HL,nn RDHST: LD A,RCMD ; RWHST: LD HL,HSTBUF ; LD (HSTDMA),HL ; LD HL,HSTDSK ; JR LODPAR ; NOBLK: LD HL,SEKDSK ; LODPAR: LD DE,DSKPAR ; LD BC,8 ; LDIR ; ; PUSH AF ; Kommando retten CALL GETPSH ; LD (NUM),A ; Sektorlaenge OR A ; LD A,0FFH ; JR Z,LDPAR0 ; LD A,80H ; LDPAR0: LD (CDTL),A ; INC HL ; INC HL ; physische Parameter LD A,(HL) ; LD (CEOT),A ; LD A,(SECPAR) ; CP (HL) ; JR C,LDPAR1 ; SUB (HL) ; LD BC,104H ; Kopf 1 LDPAR1: INC A ; LD (RC),A ; Sektor ; INC HL ; --> GAP LD A,(HL) ; LD (CGAP),A ; Luecke ; INC HL ; --> NTR LD A,(TRKPAR) ; CP (HL) ; JR C,LDPAR2 ; SUB (HL) ; LD BC,104H ; Kopf 1 LDPAR2: LD (CYL),A ; Spur ; INC HL ; --> PUN LD A,(HL) ; OR C ; LD (DR),A ; LD A,B ; LD (HD),A ; ; INC HL ; --> TYP POP DE ; LD A,(HL) ; AND 40H ; FM/MFM OR D ; LD (CMD0),A ; ; LD DE,CTYP ; LD BC,4 ; LDIR ; LD B,1 ; 2 VERUCHE PUSH BC VERSCH: CALL DISKIO ; POP BC AND A RET Z DEC B RET NZ PUSH BC CALL FDREC ;DISK HOME JR VERSCH ; ; *********************************************************** ; physische Schreib/Lese-Routine fuer den 8272 ; *********************************************************** ; FDC EQU 0F0H ; uPD 765 DMA EQU FDC+6+6 FDCS EQU FDC ; MAINSTATUS FDCD EQU FDC+1 ; DATA-REG. FDCDR EQU FDC+2 ; "DMA"-DATA-REG.: DRQ FDCRI EQU FDC+4 ; STATUS: DRQ+INT+RDY FDCMT EQU FDC+6 ; UNIT-MOT.-ON FDCTC EQU FDC+8 ; FDC TERMINAL-COUNT PRDY EQU FDCRI ; Port mit RDY BPREC EQU 4 ; Bit fuer Precomp. BRDY EQU 5 ; Bit fuer RDY T1200 EQU 72 ; ; ; Laufwerk spezifizieren ; DISKIO: LD A,3 ; Spezifikation LD B,2 ; Parameteranzahl LD HL,CSRT ; Parameteradresse OUT (FDCD),A ; Kommando CALL FDK2 ; ; Schreib/Leseroutine ; CALL FDSEEK ; Kopf positionieren LD A,57H ; Spur nicht gefunden LD (ERFLAG),A ; JR NZ,FDRET ; Return bei Fehler LD HL,40H ; Byteanzahl aus LD A,(NUM) ; Sektorgroesse INC A ; MULT: ADD HL,HL ; berechnen. DEC A ; JR NZ,MULT ; DEC HL ; INC H ; Schleifenanzahl und INC L ; Restanzahl ermitteln und PUSH HL ; ablegen. LD HL,(DMAPAR) ; Pufferadresse PUSH HL ; ablegen. LD A,(CMD0) ; Kommando LD C,A ; in C ablegen LD B,9 ; Parameteranzahl RRCA ; CY=1: Lesen; CY=0: Schreiben LD A,51H ; Transferbefehl bilden ADC A,A ; - INI oder OTI LD (FDIO+1),A ; und ablegen. DI ; CALL FDCMD ; Schreib/Lese-Kommando ausgeben POP HL ; Pufferadresse POP DE ; Byteanzahl FDRW2: LD B,E ; Schleifenanzahl LD C,FDCDR ; REQ-PORT CALL FDCIO ; Datentransfer ausfuehren EI ; Interrupt erlauben. CALL FDCRES ; Resultat holen und LD HL,RESBYT ; auswerten. LD A,(HL) ; AND 0C0H ; JR Z,FDRET ; LD A,(HL) ; AND 08H ; LD A,52H ; Laufewrk nicht bereit JR NZ,FDRET ; INC HL ; LD B,(HL) ; LD A,53H ; Diskette schreibgeschuetzt BIT 1,B ; JR NZ,FDRET ; LD A,56H ; Index - Feld nicht gefunden BIT 2,B ; JR NZ,FDRET ; LD A,43H ; CRC - Fehler BIT 5,B ; JR NZ,FDRET ; LD A,0FFH ; FDRET: LD (ERFLAG),A ; RET ; ; ; Resultat holen ; FDCRES: LD B,7 ; 7 Bytes im LD HL,RESBYT ; Resultatstpuffer FDCR1: CALL FDNXT ; LD (HL),A ; ablegen INC HL ; DJNZ FDCR1 ; RET ; ; ; Laufwerk zuruecksetzen ; FDREC: LD BC,207H ; RECALIBRATE - Kommando CALL FDCMD ; CALL FDS2 ; Status abfragen RET Z ; LD BC,207H ; wiederholen IF "EC" CALL FDCMD ; JR FDS2 ; ; ; Kopf positionieren ; FDSEEK: LD A,(CYL) ; Spurnummer LD (RCYL),A ; retten OR A ; Spur 0 ? JR Z,FDREC ; wenn ja, Laufwerk ruecksetzen LD BC,30FH ; SEEK - Kommando LD HL,CTYP ; BIT 4,(HL) ; Doppelschritt ? JR Z,FDS0 ; ADD A,A ; Spurnummer * 2 LD (CYL),A ; FDS0: CALL FDCMD ; Kommando ausgeben LD A,(RCYL) ; alte Spurnummer LD (CYL),A ; wiederherstellen ; ; Status abfragen ; FDS2: IN A,(FDCRI) ; BIT 6,A ; Spursuche fertig ? JR NZ,FDS2 ; eventuell warten FDSNS: LD BC,108H ; SENSE - Kommando CALL FDCMD ; Kommando ausgeben CALL FDNXT ; ST0 LD B,A ; LD (RESBYT),A ; ADD A,A ; RET Z ; CY=1: 80H KOM-Err CALL FDNXT ; TRACK LD A,B ; AND 0F0H ; CP 0C0H ; JR Z,FDS2 ; RDY changed XOR 20H ; SEEK END OK: Z=1 RET ; ; ; Kommando ausgeben ; FDCMD: PUSH BC ; Parameteranzahl in B, Kommando in C CALL READY ; RDY abfragen POP BC ; LD HL,CMD ; LD (HL),C ; Kommando ; FDK2: LD C,FDCD ; FDK4: IN A,(FDCS) ; AND 0C0H ; CP 80H ; JR NZ,FDK4 ; OUTI ; Parameter ausgeben JR NZ,FDK4 ; RET ; ; ; naechstes Resultatbyte holen ; FDNXT: IN A,(FDCS) ; AND 0C0H ; CP 0C0H ; RQM ? JR NZ,FDNXT ; IN A,(FDCD) ; RET ; ; ; Datentransfer ; FDCIO: IN A,(FDCRI) ; ADD A,A ; /INT in S, /DRQ in CY RET P ; JR C,FDCIO ; NO DRQ FDIO: INI ; JR NZ,FDCIO ; DEC D ; JR NZ,FDCIO ; OUT (FDCTC),A ; TERMINAL-COUNT RET ; ; ; RDY abfragen ; READY: LD A,(DR) ; aktuelles Laufwerk AND 3 ; Kopf maskieren LD B,80H ; 1 aus 4 - Kode INC A ; RDY1: RLC B ; in Register B bilden DEC A ; JR NZ,RDY1 ; LD HL,CTYP ; BIT 7,(HL) ; 8" - Laufwerk ? JR Z,RDY1A ; SET 6,B ; ja ! RDY1A: LD A,(CYL) ; LD HL,CPRE ; CP (HL) ; Praekompensation ? JR NC,RDY1B ; SET BPREC,B ; nein ! RDY1B: LD HL,LDRIVE ; letztes Laufwerk LD A,(DR) ; mit aktuellem AND 3 ; CP (HL) ; vergleichen LD (HL),A ; aktuelles Laufwerk merken INC HL ; LD C,(HL) ; LD (HL),T1200 ; LD A,B ; OUT (FDCMT),A ; Motor ein JR NZ,RDY4 ; Laufwerkswechsel LD A,C ; AND A ; JR NZ,RDY2 ; Motor laeuft schon RDY4: LD A,T1200 ; sonst warten SRL A ; SRL A ; CP (HL) ; T1200*1/4=900MS UM ? JR C,RDY4 ; RDY2: LD A,(HL) ; AND A ; RET Z ; Zeit abgelaufen IN A,(PRDY) ; BIT BRDY,A ; JR Z,RDY2 ; Laufwerk nicht bereit RDY3: LD (HL),2*T1200 ; 2n x 25 ms Motor ein RET ; ; CTC - Interrupt ; ICT3: PUSH AF ; LD A,(MTIME) ; AND A ; Motor laeuft ? JR Z,IC1 ; wenn nicht, Rueckehr DEC A ; Zeit herunterzaehlen LD (MTIME),A ; und ablegen JR NZ,IC1 ; Zeit abgelaufen ? OUT (FDCMT),A ; Motor aus IC1: POP AF ; Rueckehr EI ; RETI ; ; ; Disketten-Steuer-Block ; ORG BIOS+800H ; CMD0: DEFB 0 ; Schreib/Lese-Kommando CMD: DEFB 0 ; Kommando DR: DEFB 0 ; Laufwerk CYL: DEFB 0 ; Spur HD: DEFB 0 ; Kopf RC: DEFB 0 ; Sektor NUM: DEFB 0 ; N Datenfeldlaenge CEOT: DEFB 0 ; EOT letzter Sektor CGAP: DEFB 0 ; GAP Luecke CDTL: DEFB 0 ; DTL Datenfeldlaenge CTYP: DEFB 0 ; TYP Laufwerkstyp CPRE: DEFB 0 ; PRAE Praekompensation CSRT: DEFB 0 ; SRT Schrittzeit DEFB 0 ; HLT Kopfladezeit ; RESBYT: DEFS 7 ; RESULTBYTES: ST0/ST1/ST2/C/H/R/N ; RCYL: DEFS 1 ; Zwischenspeicher Spurnummer LDRIVE: DEFB 0 ; letztes Laufwerk MTIME: DEFB 0 ; Motoreinschaltzeit ; SEKDSK: DEFB 0 SEKTRK: DEFW 0 SEKSEC: DEFB 0 SEKDMA: DEFW 0 SEKDPH: DEFW 0 ; HSTDSK: DEFB 0 HSTTRK: DEFW 0 HSTSEC: DEFB 0 HSTDMA: DEFW 0 HSTDPH: DEFW 0 ; DSKPAR: DEFB 0 TRKPAR: DEFW 0 SECPAR: DEFB 0 DMAPAR: DEFW 0 DPHPAR: DEFW 0 ; SEKHST: DEFB 0 HSTACT: DEFB 0 HSTWRT: DEFB 0 UNACNT: DEFB 0 UNADSK: DEFB 0 UNATRK: DEFW 0 UNASEC: DEFB 0 ERFLAG: DEFB 0 RSFLAG: DEFB 0 READOP: DEFB 0 WRTYPE: DEFB 0 ; DIRBUF: DEFS 128 ; ALV0 EQU 0FC00H ;BELEGUNGSPLAN RAM-FD ALV1: DEFS 50 ALV2: DEFS 50 ALV3: DEFS 50 ALV4: DEFS 50 ALV5: DEFS 50 ALV6: DEFS 50 ALV7: DEFS 50 ; CSV0: CSV1: DEFS 16 CSV2: DEFS 16 CSV3: DEFS 16 CSV4: DEFS 16 CSV5: DEFS 16 CSV6: DEFS 16 CSV7: DEFS 16 ; HSTBUF: DEFS 1024 ; RSTACK: DEFS 2 DEFS 6 ISTACK EQU $ ENDBIO EQU $ ; ; ****************************************** ; K O P P E L - R A M ; ****************************************** ; RFBUF EQU 0FE00H ; RAM - Floppy - Puffer ; CIBUF EQU 0FF00H ; Konsoleneingabepuffer COBUF EQU 0FF20H ; Konsolenausgabepuffer LOBUF EQU 0FF40H ; Listenausgabepuffer AIBUF EQU 0FF60H ; Zusatzeingabepuffer AOBUF EQU 0FF80H ; Zusatzausgabepuffer ; INPTR EQU 0FFA0H ; Zeicheneingabezeiger ; OUTPTR EQU 0FFA6H ; Zeichenausgabezeiger ; IOBYTE EQU 0FFACH ; I/O - Byte - Kopie AIANF EQU 0FFADH MEMANF EQU 0FFAEH ; RFTRK EQU 0FFAFH ; RAM - Floppy - Spur RFSEC EQU 0FFB0H ; RAM - Floppy - Sektor CONTR EQU 0FFB1H ; RAM - Floppy - Steuerung SIZE EQU 0FFB2H ; RAM - Floppy - Groesse ; END