.Z80 ;******************************************************** ;* VEB MPM * ;* FORMATKCC Vers. 1.0 * ;* Bearbeiter: K.-D. KIRVES Stand: 23/03/90 * ;******************************************************** ; ; Dieses Programm dient der Formatierung von Disketten ; auf dem KCc fuer MicroDOS ; ASEG ORG 100H ; BDOS EQU 5 ; POS MACRO LINE,COLUMN DEFB 1BH DEFB LINE+84H DEFB COLUMN+87H ENDM ; LD SP,STACK JP START ; CI: PUSH HL PUSH DE PUSH BC LD C,1 CALL BDOS POP BC POP DE POP HL CP 03H JP Z,END RET ; CO: PUSH HL PUSH DE PUSH BC PUSH AF LD E,A LD C,2 CALL BDOS POP AF POP BC POP DE POP HL RET ; PSTR: PUSH HL PUSH DE PUSH BC PUSH AF LD C,9 CALL BDOS POP AF POP BC POP DE POP HL RET ; START: LD HL,(1) LD DE,30H ADD HL,DE LD (READY+1),HL LD A,0CH CALL CO LD DE,ULC CALL HSTARS LD DE,URC CALL VSTARS LD DE,ULC CALL VSTARS LD DE,LLC CALL HSTARS LD DE,NAMMSG CALL PSTR LD C,0 LD E,24 CALL BIOS LD DE,-52 ADD HL,DE LD B,(HL) INC HL LD C,(HL) LD HL,'cc' AND A SBC HL,BC JP Z,FORMAT BADVER: LD DE,VERMSG CALL PSTR CALL CI JP END ; NAMMSG: POS 2,8 DEFM ' Mikroelektronik Muehlhausen' POS 4,10 DEFM 'MicroDOS - Diskettenformatierung (KCc)' DEFB '$' ; VERMSG: POS 13,15 DEFM 'Falsche Betriebssystemversion !' DEFB '$' ; HSTARS: CALL PSTR LD B,62 LD A,'*' HST1: CALL CO DJNZ HST1 RET ; VSTARS: CALL PSTR LD B,15 VST1: LD DE,VSTR CALL PSTR DJNZ VST1 RET VSTR: DEFB '*' DEFB 0AH DEFB 08H DEFB '$' ; ULC: POS 0,1 DEFB '$' URC: POS 0,62 DEFB '$' LLC: POS 15,1 DEFB '$' ; FORMAT: LD DE,LUNMSG CALL PSTR CALL CI AND 5FH CP 0DH JR Z,FORM1 LD (LUN),A FORM1: LD A,(LUN) SUB 'A' JR C,FORMAT JR Z,FORMAT CP 8 JR NC,FORMAT LD C,A LD E,24 CALL BIOS ;SELDSK LD A,H OR L JR Z,FORMAT LD DE,10 ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,20 ADD HL,DE LD A,(HL) LD (PUN),A INC HL LD A,(HL) AND 0FH CP 06H JP NC,BADVER OR A JP Z,BADVER LD (TYP),A FORM2: LD DE,FRMMSG CALL PSTR LD A,(TYP) LD DE,FRMTAB CALL PSTR LD DE,CHCMSG CALL PSTR CALL CI CP 0DH JR Z,FORM4 LD (FRM),A FORM4: LD A,(FRM) SUB '1' JR C,FORM2 CP 3 JR NC,FORM2 FORM5: LD DE,CNFMSG ;RICHTIG? CALL PSTR CALL CI AND 5FH CP 'N' JP Z,FORMAT CP 'J' JR NZ,FORM5 ; LD A,(FRM) AND 0FH ; LD HL,FMTTAB-12 LD DE,12 FORM6: ADD HL,DE DEC A JR NZ,FORM6 LD DE,TB LD BC,12 LDIR LD A,(PUN) LD (TB+6),A LD DE,0 CALL INIT JR NZ,ERROR LD DE,OKMSG JR FORM7 ; ERROR: CP 11H LD DE,ROMSG JR Z,FORM7 CP 57H LD DE,NRDMSG JR Z,FORM7 LD DE,BTRMSG FORM7: CALL PSTR FORM8: LD DE,REPMSG CALL PSTR CALL CI AND 5FH CP 'J' JP Z,START CP 'N' JR NZ,FORM8 ; END: LD C,25 CALL BDOS LD C,A LD E,24 CALL BIOS LD DE,ENDMSG CALL PSTR JP 0 ; BIOS: LD D,0 LD HL,(1) ADD HL,DE JP (HL) ; BINASC: LD L,2FH BINAS1: INC L SUB 10 JR NC,BINAS1 ADD A,3AH LD H,A RET ; LUNMSG: POS 6,5 DEFM 'Auf welchem Laufwerk soll formatiert werden (B-H) ? ' LUN: DEFB 'B' DEFB 08H DEFB '$' ; FRMMSG: POS 7,5 DEFM 'Wie soll die Diskette formatiert werden (1-3) ? ' FRM: DEFB '3' DEFB '$' ; FRMTAB: ; POS 9,10 DEFM '1 - 16 * 256 * 80 * 2' POS 10,10 DEFM '2 - 9 * 512 * 80 * 2' POS 11,10 DEFM '3 - 5 * 1024 * 80 * 2' DEFB '$' ; ; CHCMSG: POS 7,57 DEFB '$' ; TRKMSG: POS 13,5 DEFM 'Formatierte Spur: ' TRKNMB: DEFB '00' DEFM ' ' DEFB '$' ; ROMSG: POS 13,5 DEFM 'Diskette schreibgeschuetzt !' DEFB '$' ; NRDMSG: POS 13,5 DEFM 'Laufwerk nicht bereit ! ' DEFB '$' ; OKMSG: POS 13,5 DEFM 'Formatierung beendet ! ' DEFB '$' ; BTRMSG: POS 13,5 DEFM 'Defekte Spuren ! ' DEFB '$' ; REPMSG: POS 13,35 DEFM ' Wiederholung (J/N) ? ' DEFB 08H DEFB '$' ; CNFMSG: POS 13,5 DEFM 'Alle Dateien werden geloescht! Richtig (J/N) ? ' DEFB 08H DEFB '$' ; ENDMSG: DEFB 0CH POS 19,0 DEFB '$' ; TYP: DEFB 0 PUN: DEFB 0 ; ; FDC EQU 0FB7EH ; uPD 765 FDCS EQU FDC ; MAINSTATUS FDCD EQU FDC+1 ; DATA-REG. ; MOTORN EQU 0FA7EH ;MOTOR ON MOTORF EQU MOTORN+1 ;MOTOR OFF ; INIT: PUSH DE LD A,D CALL BINASC LD (TRKNMB),HL LD DE,TRKMSG CALL PSTR POP DE PUSH DE CALL FORM POP DE RET NZ LD A,E XOR 1 LD E,A JR NZ,INIT INC D LD A,(TB+5) DEC A CP D JR NC,INIT XOR A ;OHNE ERROR RET ; ; set ID table ; FORM: PUSH DE LD A,(TB+3) ; GAP LD (FMTGAP),A LD A,(TB+0) ; PSH LD (FMTN),A LD B,A LD A,(TB+2) ; EOT LD (FMTEOT),A PUSH AF RLCA RLCA DEC A LD E,A LD D,0 LD HL,IDTAB ADD HL,DE POP AF LD DE,SECT5 CP 9 JR NZ,SECS LD DE,SECT9 SECS: CP 16 JR NZ,SETID1 LD DE,SECT16 ; SETID1: LD (YMERK),DE POP DE SETID: LD (HL),B ; set N DEC HL PUSH AF PUSH DE LD DE,(YMERK) LD A,(DE) INC DE LD (YMERK),DE POP DE LD (HL),A ; set sector POP AF DEC HL LD (HL),E ; set head DEC HL LD (HL),D ; set track DEC HL DEC A JR NZ,SETID ; FDFORM: LD A,D ; track LD (CYL),A LD A,E RLCA RLCA LD C,A LD A,(TB+6) OR C LD (DR),A ; unit/side LD (FMTDR),A CALL FDSEEK LD A,57H RET NZ ; seek error LD HL,IDTAB LD BC,0 PUSH BC PUSH HL LD HL,FMTCMD LD B,6 DI CALL FDK2 ; command POP HL POP DE CALL FDRW2 ; write ID bytes EI RET ; Zero O.K. ; ; Laufwerk zuruecksetzen ; FDREC: LD BC,207H ; RECALIBRATE - Kommando CALL FDCMD ; ld a,200 CALL FDS4 ; Status abfragen RET Z ; LD BC,207H ; wiederholen IF "EC" CALL FDCMD ; ld a,40 JR FDS4 ; ; ; Kopf positionieren ; FDSEEK: LD A,(CYL) AND A JR Z,FDREC LD BC,30FH ; SEEK - Kommando FDS0: CALL FDCMD ; Kommando ausgeben ; ; Status abfragen ; FDS2: LD a,26 fds4: call mswait dec a jr nz,fds4 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 ; Spurnumer 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 FDCM1: CALL READY ; RDY abfragen POP BC ; LD HL,CMD ; LD (HL),C ; Kommando ; FDK2: PUSH BC LD BC,FDCS ; FDK4: IN A,(C) ; AND 0C0H ; CP 80H ; JR NZ,FDK4 ; INC C ; Datenregister INC B OUTI ; Parameter ausgeben POP BC DJNZ FDK2 ; RET ; ; ; naechstes Resultatbyte holen ; FDNXT: PUSH BC LD BC,FDCS FDNXT1: IN A,(C) ; AND 0C0H ; CP 0C0H ; RQM ? JR NZ,FDNXT1 ; INC C IN A,(C) ; POP BC RET ; ; FDRW2: CALL FDCIO EI ; FDCRES: LD B,7 LD HL,RESBYT FDCR1: CALL FDNXT LD (HL),A INC HL DJNZ FDCR1 LD HL,RESBYT LD A,(HL) AND 40H RET Z ; FDCR2: INC HL BIT 4,(HL) JR Z,FDCR3 XOR A RET ; FDCR3: BIT 1,(HL) LD A,12H RET NZ INC A RET ; ; Datentransfer ; FDCIO: LD BC,FDCS FDCIOW: IN A,(C) ;Hauptstatusregister JP P,FDCIOW BIT 5,A RET Z INC C inc b outi DEC C JR FDCIOW ; READY: CALL 0 RET ; ;Zeitschleife ; mswait: push af ld a,0E0H msw2: push af ld a,0f0h msw1: dec a jr nz,msw1 pop af add a,10h jr nz,msw2 pop af ret ; ; SECTORREIHENFOLGE-TABELLEN SECT5: DEFB 4,2,5,3,1 SECT9: DEFB 8,6,4,2,9,7,5,3,1 SECT16: DEFB 14,11,8,5,2 DEFB 15,12,9,6,3 DEFB 16,13,10,7,4,1 ; ; format table ; 16*256*80*2 ; FMTTAB: DEFB 001H ; PSH IX+00 DEFB 001H ; PSM IX+01 DEFB 010H ; EOT IX+02 DEFB 036H ; GAP IX+03 DEFB 0FFH ; DTL IX+04 DEFB 050H ; NTR IX+05 DEFB 000H ; PUN IX+06 DEFB 043H ; TYP IX+07 DEFB 0FFH ; PRAE IX+08 DEFB 0FFH ; SRT IX+09 DEFB 015H ; HLT IX+10 DEFB 0FFH ; CUR IX+11 ; ; 9*512*80*2 ; DEFB 002H ; PSH DEFB 003H ; PSM DEFB 009H ; EOT DEFB 054H ; GAP DEFB 0FFH ; DTL DEFB 050H ; NTR DEFB 000H ; PUN DEFB 043H ; TYP DEFB 0FFH ; PRAE DEFB 0FFH ; SRT DEFB 015H ; HLT DEFB 0FFH ; CUR ; ; 5*1024*80*2 ; DEFB 003H ; PSH DEFB 007H ; PSM DEFB 005H ; EOT DEFB 074H ; GAP DEFB 0FFH ; DTL DEFB 050H ; NTR DEFB 000H ; PUN DEFB 043H ; TYP DEFB 0FFH ; PRAE DEFB 0FFH ; SRT DEFB 015H ; HLT DEFB 0FFH ; CUR ; TB: DEFS 12,0 YMERK: DEFW 0 ; FMTCMD: DEFB 4DH ; format command FMTDR: DEFB 00H ; drive #, side FMTN: DEFB 03H ; sector length FMTEOT: DEFB 05H ; EOT FMTGAP: DEFB 20H ; GPL DEFB 0E5H ; filler byte ; CMD: DEFB 0 DR: DEFB 0 CYL: DEFB 0 HD: DEFB 0 RC: DEFB 0 NUM: DEFB 0 DEFB 0 DEFB 0 DEFB 0 ; RESBYT: DEFB 0 DEFB 0 DEFB 0 DEFB 0 DEFB 0 DEFB 0 DEFB 0 ; IDTAB: DEFS 256 ; DEFS 100H ; STACK: ; END