CP/M MACRO ASSEM 2.0 #001 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** ***************************************************************** * * * Formathd formats the Discus M26 or the Discus M10 hard disk * * drive. It write sector header information on the entire disk * * surface. When the formatting has been completed, a map is * * created on track 0, head 0, last two sectors of all the * * encountered bad sectors. Each entry of the map consists of * * the three bytes identifying the track, head, and sector that * * was bad. * * * * Written By Bobby Dale Gifford. * * 5/18/81 * * * ***************************************************************** TITLE '*** Format Program for Discus M26 & M10 under CP/M 2.2 ***' 0015 = REVNUM EQU 21 ;Revision number x.x 0050 = HDORG EQU 050H ;Hard disk origin 0050 = STATUS EQU HDORG ;Status register 0050 = CNTROL EQU HDORG ;Control register 0053 = DATA EQU HDORG+3 ;Data register 0052 = FUNCTN EQU HDORG+2 ;Function register 0051 = COMND EQU HDORG+1 ;Command register 0051 = RESULT EQU HDORG+1 ;Result register 0002 = RETRY EQU 2 0014 = RETRIES EQU 20 ;Maximum error count 0001 = TKZERO EQU 1 ;Track zero flag bit 0002 = OPDONE EQU 2 ;Operation complete flag bit 0004 = COMPLT EQU 4 ;Complete flag bit 0008 = TMOUT EQU 8 ;Time out flag bit 0010 = WFAULT EQU 10H ;Write fault flag bit 0020 = DRVRDY EQU 20H ;Drive ready flag bit 0040 = INDEX EQU 40H ;Index hole flag bit 0080 = HALT EQU 80H ;Halt flag bit 0003 = CSTRT EQU 3 ;Command start 0003 = DRVMSK EQU 3 ;Drive bit mask 0004 = PSTEP EQU 4 ;Positive step bit 0004 = HDRLEN EQU 4 ;Header length in bytes 0200 = SECLEN EQU 512 ;Sector length in bytes 000F = WENABL EQU 0FH ;Write enable 000B = CPUCLK EQU 0BH ;Cpu clock mask 000B = WRESET EQU 0BH ;Write fault reset mask 0005 = SCENBL EQU 5 0007 = DSKCLK EQU 7 ;Disk drive clock mask 0020 = SECM26 EQU 32 ;Sector count for m26 0015 = SECM10 EQU 21 ;Sector count for m10 00CA = TRKM26 EQU 202 ;Tracks on an M26 00F4 = TRKM10 EQU 244 ;Tracks on an M10 0008 = HEDM26 EQU 8 ;Heads on an M26 0004 = HEDM10 EQU 4 ;Heads on an M10 0008 = HEDM20 EQU 8 ;Heads on an M20 0080 = WPROT EQU 80H ;Write protect flag bit 00F7 = MDIR EQU 0F7H ;Direction mask 00FB = NSTEP EQU 0FBH ;Negative step mask 00FC = NULL EQU 0FCH ;Null command CP/M MACRO ASSEM 2.0 #002 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0000 = IDBUFF EQU 0 ;Initialize data buffer command 0008 = ISBUFF EQU 8 ;Initialize sector buffer command 0001 = RSECT EQU 1 ;Read sector command 0003 = RHEDR EQU 3 ;Read header command 0005 = WSECT EQU 5 ;Write sector command 0007 = WHEDR EQU 7 ;Write header command 0100 = TPA EQU 100H ;CP/M transient program area 0080 = TBUFF EQU 80H 0000 = WBOOT EQU 0 ;CP/M warm boot location 0005 = BDOS EQU 5 ;BDOS entry point 000D = ACR EQU 0DH ;Carriage return 000A = ALF EQU 0AH ;Line feed 0009 = ATAB EQU 9 ;Tab ***************************************************************** * * * Main code begins here. * * * ***************************************************************** 0100 ORG TPA 0100 315E16 START LXI SP,STACK ;Initialize the stack 0103 11770B LXI D,PROMPT 0106 CDDD0A CALL PBUFF 0109 11EE0D ASKALL LXI D,FUNCMSG 010C CDDD0A CALL PBUFF 010F CDF10A CALL RBUFF 0112 FE0D CPI ACR 0114 CA0000 JZ WBOOT 0117 FE43 CPI 'C' 0119 CA8601 JZ CONTINU 011C FE44 CPI 'D' 011E CA2E01 JZ DOALL 0121 FE46 CPI 'F' 0123 CA2707 JZ FMTONLY 0126 FE4C CPI 'L' 0128 CA0C07 JZ LOGICAL 012B C30901 JMP ASKALL 012E CD8C01 DOALL CALL HOWMUCH 0131 CDC101 CALL GETPHY 0134 CD8D02 CALL PREP 0137 3E01 MVI A,1 0139 32B30E STA PHASE 013C 3A970E LDA MUCH 013F E601 ANI 1 0141 C26001 JNZ DOHEAD 0144 11520E PREASK LXI D,PREFMT 0147 CDDD0A CALL PBUFF 014A CDF10A CALL RBUFF 014D CA0000 JZ WBOOT 0150 FE59 CPI 'Y' 0152 CA6301 JZ SKIPHD CP/M MACRO ASSEM 2.0 #003 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0155 FE4E CPI 'N' 0157 C24401 JNZ PREASK 015A CD3907 CALL PREFORM 015D C36301 JMP SKIPHD 0160 CD4403 DOHEAD CALL HEADMAP 0163 3E02 SKIPHD MVI A,2 0165 32B30E STA PHASE 0168 3A970E LDA MUCH 016B E602 ANI 2 016D C4FE04 CNZ DATAMAP ;Make the bad sector map 0170 3A970E LDA MUCH 0173 E604 ANI 4 0175 C45C08 CNZ SEEKS 0178 3A970E LDA MUCH 017B E680 ANI 80H 017D C26001 JNZ DOHEAD 0180 11FB0C LXI D,DONMSG 0183 C3180B JMP EXIT 0186 11050E CONTINU LXI D,NOTYET 0189 C3180B JMP EXIT 018C 11350E HOWMUCH LXI D,MUCHMSG 018F CDDD0A CALL PBUFF 0192 CDF10A CALL RBUFF 0195 FE0D CPI ACR 0197 CA0000 JZ WBOOT 019A FE31 CPI '1' 019C DA8C01 JC HOWMUCH 019F FE38 CPI '7'+1 01A1 D28C01 JNC HOWMUCH 01A4 D630 SUI '0' 01A6 32970E STA MUCH 01A9 FE07 CPI 7 01AB C0 RNZ 01AC 11860E LXI D,REPMSG 01AF CDDD0A CALL PBUFF 01B2 CDF10A CALL RBUFF 01B5 FE59 CPI 'Y' 01B7 C0 RNZ 01B8 3A970E LDA MUCH 01BB F680 ORI 80H 01BD 32970E STA MUCH 01C0 C9 RET 01C1 11B90B GETPHY LXI D,PHNUM 01C4 CDDD0A CALL PBUFF 01C7 CDF10A CALL RBUFF 01CA FE0D CPI ACR 01CC CA0000 JZ WBOOT 01CF FE31 CPI '1' 01D1 DAC101 JC GETPHY 01D4 FE35 CPI '4'+1 01D6 D2C101 JNC GETPHY 01D9 D631 SUI '1' CP/M MACRO ASSEM 2.0 #004 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 01DB 32B00E STA DRIVE 01DE 111E0E GETTYP LXI D,DRVTYP 01E1 CDDD0A CALL PBUFF 01E4 CDF10A CALL RBUFF 01E7 FE0D CPI ACR 01E9 CA0000 JZ WBOOT 01EC FE41 CPI 'A' 01EE DADE01 JC GETTYP 01F1 FE44 CPI 'C'+1 01F3 D2DE01 JNC GETTYP 01F6 D641 SUI 'A' 01F8 329E0E STA DISKTYP 01FB FE01 CPI 1 01FD 3E04 MVI A,HEDM10 01FF 329F0E STA HEADS 0202 C8 RZ 0203 3E08 MVI A,HEDM20 0205 329F0E STA HEADS 0208 C9 RET 0209 11D90B GETLOG LXI D,LOGNUM 020C CDDD0A CALL PBUFF 020F CDF10A CALL RBUFF 0212 FE0D CPI ACR 0214 CA0000 JZ WBOOT 0217 FE31 CPI '1' 0219 DA0902 JC GETLOG 021C F5 PUSH PSW 021D CD8802 CALL PHYTYP 0220 0634 MVI B,'3'+1 0222 CA3102 JZ CMPTRK1 0225 3A9F0E LDA HEADS 0228 FE08 CPI HEDM20 022A 0633 MVI B,'2'+1 022C C23102 JNZ CMPTRK1 022F 0634 MVI B,'3'+1 0231 F1 CMPTRK1 POP PSW 0232 B8 CMP B 0233 D20902 JNC GETLOG 0236 D631 SUI '1' 0238 5F MOV E,A 0239 1600 MVI D,0 023B CD8802 CALL PHYTYP 023E 215D02 LXI H,TRKSM26 0241 CA5202 JZ TRKSOK 0244 3A9F0E LDA HEADS 0247 FE08 CPI HEDM20 0249 216102 LXI H,TRKSM10 024C C25202 JNZ TRKSOK 024F 216402 LXI H,TRKSM20 0252 19 TRKSOK DAD D 0253 7E MOV A,M 0254 32A10E STA FRSTTRK 0257 23 INX H 0258 7E MOV A,M 0259 32A20E STA LASTTRK CP/M MACRO ASSEM 2.0 #005 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 025C C9 RET 025D 00407FCB TRKSM26 DB 0,64,127,203 0261 007AF4 TRKSM10 DB 0,122,244 0264 0062C3F4 TRKSM20 DB 0,98,195,244 0268 11F80B HEADATA LXI D,HDMSG 026B CDDD0A CALL PBUFF 026E AF XRA A 026F 32A00E STA NODATA 0272 CDF10A CALL RBUFF 0275 FE0D CPI ACR 0277 CA0000 JZ WBOOT 027A FE48 CPI 'H' 027C C8 RZ 027D FE44 CPI 'D' 027F C26802 JNZ HEADATA 0282 3E01 MVI A,1 0284 32A00E STA NODATA 0287 C9 RET 0288 3A9E0E PHYTYP LDA DISKTYP 028B A7 ANA A 028C C9 RET ***************************************************************** * * * Prep makes sure the drive is up and running. * * * ***************************************************************** 028D 3AB00E PREP LDA DRIVE ;Select the drive 0290 F6FC ORI NULL ;Nop 0292 32AA0E STA DFNREG 0295 D352 OUT FUNCTN 0297 3E05 MVI A,SCENBL 0299 D350 OUT CNTROL 029B 0EEF MVI C,239 029D 210000 LXI H,0 02A0 DB50 IN STATUS 02A2 E620 ANI DRVRDY 02A4 CAC402 JZ MEASURE 02A7 115D0C LXI D,RDYWAIT 02AA CDDD0A CALL PBUFF 02AD DB50 TDELAY IN STATUS 02AF E620 ANI DRVRDY 02B1 CAC402 JZ MEASURE 02B4 2B DCX H 02B5 7C MOV A,H 02B6 B5 ORA L 02B7 C2AD02 JNZ TDELAY 02BA 0D DCR C 02BB C2AD02 JNZ TDELAY 02BE 110E0C LXI D,RDYMSG 02C1 C3180B JMP EXIT CP/M MACRO ASSEM 2.0 #006 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** ***************************************************************** * * * Measure measures the time in machine cycles for one * * revolution of the disk. * * * ***************************************************************** 02C4 210000 MEASURE LXI H,0 ;Initialize the counter to 0 02C7 0E40 MVI C,INDEX ;Index flag initialized 02C9 DB50 IN STATUS 02CB A1 ANA C ;Get state of the index line now 02CC 47 MOV B,A ;Save state in B 02CD DB50 WAITM1 IN STATUS ;Get state now 02CF A1 ANA C ;Mask off the index bit 02D0 B8 CMP B ;Same state ? 02D1 CACD02 JZ WAITM1 ;Wait for toggle 02D4 23 WAITM2 INX H ;Increment counter 02D5 DB50 IN STATUS ;Wait for another toggle 02D7 A1 ANA C ;Strip off index 02D8 B8 CMP B ;Has it toggled yet ? 02D9 C2D402 JNZ WAITM2 02DC 22A30E SHLD SETTLE ;Save the counter 02DF DB50 IN STATUS ;Test status 02E1 E680 ANI HALT ;Test for halted 02E3 11230C LXI D,HLTMSG 02E6 CA180B JZ EXIT 02E9 3E0F MVI A,WENABL ;Write enable the drive 02EB D350 OUT CNTROL 02ED 3E07 MVI A,DSKCLK 02EF D350 OUT CNTROL ;Change to Clock from drive 02F1 3E0F MVI A,WENABL 02F3 D350 OUT CNTROL ;Finish write enable toggle 02F5 CD2D03 CALL DELAY ;Wait 20 ms 02F8 DB50 IN STATUS 02FA E610 ANI WFAULT ;Check for write fault 02FC 113E0C LXI D,WFMSG 02FF CA180B JZ EXIT 0302 210012 LXI H,MAPBEG 0305 22AE0E SHLD MAPPNT 0308 010004 LXI B,400H 030B 36FF NOERS MVI M,0FFH 030D 23 INX H 030E 0B DCX B 030F 78 MOV A,B 0310 B1 ORA C 0311 C20B03 JNZ NOERS ***************************************************************** * * * Trkzro moves the disk heads to track 0. * * * ***************************************************************** 0314 DB50 TRKZRO IN STATUS ;Check for already at track 0 0316 E601 ANI TKZERO 0318 C8 RZ CP/M MACRO ASSEM 2.0 #007 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0319 010101 HLOOP LXI B,101H ;Command to mhead 031C CD3F08 CALL MHEAD ;Move the head 031F DB50 CWAIT IN STATUS 0321 E604 ANI COMPLT ;Wait for seek complete 0323 CA1F03 JZ CWAIT 0326 DB50 IN STATUS 0328 E601 ANI TKZERO ;At track 0 yet ? 032A C21903 JNZ HLOOP ***************************************************************** * * * Delay uses the counter created by measure to wait for 20ms. * * * ***************************************************************** 032D CD8802 DELAY CALL PHYTYP 0330 FE02 CPI 2 0332 C8 RZ ;If its an M20 it will do the settle delay 0333 2AA30E LHLD SETTLE 0336 2B DELOOP DCX H 0337 7C MOV A,H 0338 B5 ORA L 0339 23 INX H 033A 2B DCX H 033B DB50 IN STATUS ;Waste a little extra time to get 33 ms 033D C34003 JMP $+3 0340 C23603 JNZ DELOOP 0343 C9 RET ***************************************************************** * * * Headmap scans sector headers, locating bad ones. Each bad * * header is entered into the bad sector map. * * * ***************************************************************** 0344 117A0C HEADMAP LXI D,HEADMSG 0347 CDDD0A CALL PBUFF 034A CD1403 CALL TRKZRO 034D 210000 LXI H,0 0350 22A50E SHLD BUFFER 0353 22A70E SHLD BUFFER+2 0356 AF XRA A 0357 32A90E STA HEAD 035A 3E01 NEWHED MVI A,1 035C 32B40E STA HEDBUF1 035F 32B10E STA SFLG 0362 CD400A CALL ZERS 0365 3AA90E LDA HEAD 0368 07 RLC 0369 07 RLC 036A 07 RLC 036B 07 RLC 036C E670 ANI 70H 036E 2F CMA CP/M MACRO ASSEM 2.0 #008 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 036F E6FC ANI 0FCH 0371 47 MOV B,A 0372 3AB00E LDA DRIVE 0375 80 ADD B 0376 32AA0E STA DFNREG 0379 D352 OUT FUNCTN 037B 21B40E HEDTST LXI H,HEDBUF1 037E 3E01 MVI A,1 0380 CD5C0A CALL INITFLD 0383 CD560B CALL PANIC 0386 CDFE06 CALL INDX 0389 21B40E LXI H,HEDBUF1 038C CD8802 CALL PHYTYP 038F 0620 MVI B,SECM26 0391 CA9603 JZ WRTLOOP 0394 0615 MVI B,SECM10 0396 0E04 WRTLOOP MVI C,HDRLEN 0398 3E08 MVI A,ISBUFF 039A D351 OUT COMND 039C 7E WROUT MOV A,M 039D 23 INX H 039E D353 OUT DATA 03A0 0D DCR C 03A1 C29C03 JNZ WROUT 03A4 3E07 MVI A,WHEDR 03A6 D351 OUT COMND 03A8 DB50 WRWAIT IN STATUS 03AA E602 ANI OPDONE 03AC CAA803 JZ WRWAIT 03AF 05 DCR B 03B0 C29603 JNZ WRTLOOP 03B3 21340F LXI H,HEDBUF2 03B6 CD8802 CALL PHYTYP 03B9 0620 MVI B,SECM26 03BB CAC003 JZ RDLOOP 03BE 0615 MVI B,SECM10 03C0 3E03 RDLOOP MVI A,RHEDR 03C2 D351 OUT COMND 03C4 DB50 RDWAIT IN STATUS 03C6 E602 ANI OPDONE 03C8 CAC403 JZ RDWAIT 03CB 3E08 MVI A,ISBUFF 03CD D351 OUT COMND 03CF 0E04 MVI C,HDRLEN 03D1 DB53 IN DATA 03D3 DB53 IN DATA 03D5 DB53 RDIN IN DATA 03D7 77 MOV M,A 03D8 23 INX H 03D9 0D DCR C 03DA C2D503 JNZ RDIN 03DD 05 DCR B 03DE C2C003 JNZ RDLOOP 03E1 DB50 IN STATUS 03E3 E610 ANI WFAULT ;Check for write fault 03E5 113E0C LXI D,WFMSG CP/M MACRO ASSEM 2.0 #009 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 03E8 CA180B JZ EXIT 03EB 21B40E LXI H,HEDBUF1 03EE 11340F LXI D,HEDBUF2 03F1 CD8802 CALL PHYTYP 03F4 0680 MVI B,SECM26*HDRLEN 03F6 CAFB03 JZ COMP 03F9 0654 MVI B,SECM10*HDRLEN 03FB 1A COMP LDAX D 03FC BE CMP M 03FD C42804 CNZ ICHEDER 0400 23 INX H 0401 13 INX D 0402 05 DCR B 0403 C2FB03 JNZ COMP 0406 21B40E LXI H,HEDBUF1 0409 CDB90A CALL NEWPAT 040C C27B03 JNZ HEDTST 040F CD3804 CALL ZROLOK 0412 CD880A CALL MAKBUF0 0415 CDC009 CALL CFORMAT 0418 CDF907 CALL INCHEAD 041B C25A03 JNZ NEWHED 041E CD6706 CALL UPDATE 0421 CD0C08 CALL INCTRK 0424 C8 RZ 0425 C35A03 JMP NEWHED 0428 E5 ICHEDER PUSH H 0429 D5 PUSH D 042A 114CF1 LXI D,-HEDBUF1 042D 19 DAD D 042E 7D MOV A,L 042F E6FC ANI 0FCH 0431 1F RAR 0432 CDA80A CALL INCERR 0435 D1 POP D 0436 E1 POP H 0437 C9 RET 0438 210016 ZROLOK LXI H,ERRORS 043B CD8802 CALL PHYTYP 043E 0620 MVI B,SECM26 0440 CA4504 JZ ZROLOOK 0443 0615 MVI B,SECM10 0445 5E ZROLOOK MOV E,M 0446 23 INX H 0447 56 MOV D,M 0448 23 INX H 0449 7B MOV A,E 044A B2 ORA D 044B CAF004 JZ GOODSEC 044E C5 PUSH B 044F D5 PUSH D 0450 E5 PUSH H 0451 210100 LXI H,1 0454 CD270B CALL HLCDE CP/M MACRO ASSEM 2.0 #010 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0457 115A0C LXI D,SOFTMSG 045A D26004 JNC PHS 045D 115A0C LXI D,HARDMSG 0460 CDDD0A PHS CALL PBUFF 0463 11BF0C LXI D,ERRMSG 0466 CDDD0A CALL PBUFF 0469 E1 POP H 046A E5 PUSH H 046B 2B DCX H 046C 2B DCX H 046D 1100EA LXI D,-ERRORS 0470 19 DAD D 0471 7D MOV A,L 0472 1F RAR 0473 E61F ANI 1FH 0475 3C INR A 0476 3C INR A 0477 F5 PUSH PSW 0478 CD8802 CALL PHYTYP 047B 0621 MVI B,SECM26+1 047D CA8204 JZ MAXSEC 0480 0616 MVI B,SECM10+1 0482 F1 MAXSEC POP PSW 0483 B8 CMP B 0484 C28904 JNZ NOWRP 0487 3E01 MVI A,1 0489 32AD0E NOWRP STA BADSEC 048C 3AA60E LDA BUFFER+1 048F CD2D0B CALL PUTADC 0492 11E20C LXI D,HEDMSG 0495 CDDD0A CALL PBUFF 0498 3AA90E LDA HEAD 049B CD2D0B CALL PUTADC 049E 11D70C LXI D,SECMSG 04A1 CDDD0A CALL PBUFF 04A4 3AAD0E LDA BADSEC 04A7 CD2D0B CALL PUTADC 04AA 11EB0C LXI D,RTYMSG 04AD CDDD0A CALL PBUFF 04B0 E1 POP H 04B1 E3 XTHL 04B2 E5 PUSH H 04B3 CD300B CALL PUTDC 04B6 E1 POP H 04B7 E5 PUSH H 04B8 110200 LXI D,2 04BB CD270B CALL HLCDE 04BE 2AAE0E LHLD MAPPNT 04C1 1100EE LXI D,-MAPBEG 04C4 19 DAD D 04C5 11FD03 LXI D,SECLEN*2-3 04C8 CD270B CALL HLCDE 04CB 11610D LXI D,FULLMSG 04CE D2180B JNC EXIT 04D1 2AAE0E LHLD MAPPNT 04D4 3AA60E LDA BUFFER+1 CP/M MACRO ASSEM 2.0 #011 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 04D7 77 MOV M,A 04D8 23 INX H 04D9 3AA90E LDA HEAD 04DC 77 MOV M,A 04DD 23 INX H 04DE 3AAD0E LDA BADSEC 04E1 77 MOV M,A 04E2 23 INX H 04E3 36FF MVI M,0FFH 04E5 22AE0E SHLD MAPPNT 04E8 3E01 MVI A,1 04EA 32AB0E STA ERRFLG 04ED D1 WASSFT POP D 04EE E1 POP H 04EF C1 POP B 04F0 05 GOODSEC DCR B 04F1 C24504 JNZ ZROLOOK 04F4 3AAB0E LDA ERRFLG 04F7 A7 ANA A 04F8 3E00 MVI A,0 04FA 32AB0E STA ERRFLG 04FD C9 RET ***************************************************************** * * * Datamap locates bad sector data fields. * * * ***************************************************************** 04FE 111C0D DATAMAP LXI D,DATMSG 0501 CDDD0A CALL PBUFF 0504 CD1403 CALL TRKZRO 0507 210000 LXI H,0 050A 22A50E SHLD BUFFER 050D 22A70E SHLD BUFFER+2 0510 AF XRA A 0511 32A90E STA HEAD 0514 3C INR A 0515 32A70E STA BUFFER+2 0518 CD880A NXTHED CALL MAKBUF0 051B 3AA60E LDA BUFFER+1 051E A7 ANA A 051F 3E00 MVI A,0 0521 C22605 JNZ ZKEY 0524 3E80 MVI A,80H 0526 32A80E ZKEY STA BUFFER+3 0529 3E01 MVI A,1 052B 320010 STA DATBUF1 052E 32B10E STA SFLG 0531 CD400A CALL ZERS 0534 CD560B SAMHED CALL PANIC 0537 210010 LXI H,DATBUF1 053A E5 PUSH H 053B CD8802 CALL PHYTYP 053E 3E04 MVI A,SECLEN/(SECM26*HDRLEN) 0540 CA4505 JZ GOINIT CP/M MACRO ASSEM 2.0 #012 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0543 3E06 MVI A,SECLEN/(SECM10*HDRLEN) 0545 CD5C0A GOINIT CALL INITFLD 0548 E1 POP H 0549 3AA70E WRDLP LDA BUFFER+2 054C AE XRA M 054D 77 MOV M,A 054E 0E14 MVI C,RETRIES 0550 C5 WAGAN PUSH B 0551 E5 PUSH H 0552 CD5506 CALL PREPRW 0555 E1 POP H 0556 E5 PUSH H 0557 CD2306 CALL WDATA 055A D26F05 JNC WOK 055D E1 POP H 055E C1 POP B 055F 0D DCR C 0560 C25005 JNZ WAGAN 0563 C5 PUSH B 0564 E5 PUSH H 0565 3AA70E LDA BUFFER+2 0568 B7 ORA A 0569 17 RAL 056A D604 SUI 4 056C CDA80A CALL INCERR 056F E1 WOK POP H 0570 C1 POP B 0571 3AA70E LDA BUFFER+2 0574 AE XRA M 0575 77 MOV M,A 0576 CD0706 CALL SKEW 0579 C24905 JNZ WRDLP 057C 0E14 RDDLP MVI C,RETRIES 057E C5 RDAGAN PUSH B 057F E5 PUSH H 0580 CD5506 CALL PREPRW 0583 3E01 MVI A,RSECT 0585 D351 OUT COMND 0587 DB50 RDDWAT IN STATUS 0589 E602 ANI OPDONE 058B CA8705 JZ RDDWAT 058E DB50 IN STATUS 0590 E608 ANI TMOUT 0592 C2EE05 JNZ RDERR 0595 DB51 IN RESULT 0597 E602 ANI RETRY 0599 C2EE05 JNZ RDERR 059C 3E00 MVI A,IDBUFF 059E D351 OUT COMND 05A0 DB53 IN DATA 05A2 DB53 IN DATA 05A4 3AA70E LDA BUFFER+2 05A7 47 MOV B,A 05A8 E1 POP H 05A9 E5 PUSH H 05AA DB53 IN DATA CP/M MACRO ASSEM 2.0 #013 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 05AC A8 XRA B 05AD BE CMP M 05AE C4FA05 CNZ SECERR 05B1 2C INR L 05B2 DB53 IN DATA 05B4 BE CMP M 05B5 C4FA05 CNZ SECERR 05B8 2C INR L 05B9 DB53 CMPDAT IN DATA 05BB BE CMP M 05BC C4FA05 CNZ SECERR 05BF 2C INR L 05C0 DB53 IN DATA 05C2 BE CMP M 05C3 C4FA05 CNZ SECERR 05C6 2C INR L 05C7 C2B905 JNZ CMPDAT 05CA E1 POP H 05CB C1 POP B 05CC CD0706 RDOK CALL SKEW 05CF C27C05 JNZ RDDLP 05D2 210010 LXI H,DATBUF1 05D5 CDB90A CALL NEWPAT 05D8 C23405 JNZ SAMHED 05DB CD3804 CALL ZROLOK 05DE CDF907 CALL INCHEAD 05E1 C21805 JNZ NXTHED 05E4 CD6706 CALL UPDATE 05E7 CD0C08 CALL INCTRK 05EA C8 RZ 05EB C31805 JMP NXTHED 05EE CDFA05 RDERR CALL SECERR 05F1 E1 POP H 05F2 C1 POP B 05F3 0D DCR C 05F4 C27E05 JNZ RDAGAN 05F7 C3CC05 JMP RDOK 05FA E5 SECERR PUSH H 05FB 3AA70E LDA BUFFER+2 05FE B7 ORA A 05FF 17 RAL 0600 D604 SUI 4 0602 CDA80A CALL INCERR 0605 E1 POP H 0606 C9 RET 0607 3AA70E SKEW LDA BUFFER+2 060A 3C INR A 060B 32A70E STA BUFFER+2 060E F5 PUSH PSW 060F CD8802 CALL PHYTYP 0612 0621 MVI B,SECM26+1 0614 CA1906 JZ SKEWSEC 0617 0616 MVI B,SECM10+1 CP/M MACRO ASSEM 2.0 #014 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0619 F1 SKEWSEC POP PSW 061A B8 CMP B 061B D8 RC 061C 90 SUB B 061D 3C INR A 061E 32A70E STA BUFFER+2 0621 3D DCR A 0622 C9 RET 0623 3E00 WDATA MVI A,IDBUFF 0625 D351 OUT COMND 0627 010002 LXI B,SECLEN 062A 7E WDAT MOV A,M 062B D353 OUT DATA 062D 23 INX H 062E 0D DCR C 062F C22A06 JNZ WDAT 0632 05 DCR B 0633 C22A06 JNZ WDAT 0636 3E05 WSAME MVI A,WSECT 0638 D351 OUT COMND 063A DB50 WDWAIT IN STATUS 063C E602 ANI OPDONE 063E CA3A06 JZ WDWAIT 0641 DB50 IN STATUS 0643 E608 ANI TMOUT 0645 37 STC 0646 C0 RNZ 0647 DB51 IN RESULT 0649 E602 ANI RETRY 064B 37 STC 064C C0 RNZ 064D DB50 IN STATUS 064F E610 ANI WFAULT 0651 37 STC 0652 C8 RZ 0653 3F CMC 0654 C9 RET 0655 3E08 PREPRW MVI A,ISBUFF 0657 D351 OUT COMND 0659 21A50E LXI H,BUFFER 065C 0604 MVI B,HDRLEN 065E 7E WHED MOV A,M 065F D353 OUT DATA 0661 23 INX H 0662 05 DCR B 0663 C25E06 JNZ WHED 0666 C9 RET ***************************************************************** * * * Update writes the bad sector map onto the drive. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #015 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0667 2AAE0E UPDATE LHLD MAPPNT 066A 36FF MVI M,0FFH 066C 23 INX H 066D 3AA60E LDA BUFFER+1 0670 77 MOV M,A 0671 23 INX H 0672 0601 MVI B,1 0674 4F MOV C,A 0675 C5 PUSH B 0676 3AB20E LDA TSTTYP 0679 77 MOV M,A 067A 23 INX H 067B 3AB30E LDA PHASE 067E 77 MOV M,A 067F 23 INX H 0680 36FF MVI M,0FFH 0682 3AA70E LDA BUFFER+2 0685 F5 PUSH PSW 0686 AF XRA A 0687 32A60E STA BUFFER+1 068A 3A9E0E LDA DISKTYP 068D A7 ANA A 068E CA9306 JZ UPM26 0691 3E01 MVI A,1 0693 32A90E UPM26 STA HEAD 0696 3E80 MVI A,80H 0698 32A80E STA BUFFER+3 069B CD8802 CALL PHYTYP 069E 3E1F MVI A,SECM26-1 06A0 CAA506 JZ UPDT1 06A3 3E14 MVI A,SECM10-1 06A5 32A70E UPDT1 STA BUFFER+2 06A8 CDEB06 CALL SEEK 06AB CD880A CALL MAKBUF0 06AE CD5506 CALL PREPRW 06B1 210012 LXI H,MAPBEG 06B4 CD2306 CALL WDATA 06B7 DCF806 CC FAIL 06BA CD8802 CALL PHYTYP 06BD 3E20 MVI A,SECM26 06BF CAC406 JZ UPDT2 06C2 3E15 MVI A,SECM10 06C4 32A70E UPDT2 STA BUFFER+2 06C7 CD880A CALL MAKBUF0 06CA CD5506 CALL PREPRW 06CD 210014 LXI H,MAPBEG+SECLEN 06D0 CD2306 CALL WDATA 06D3 DCF806 CC FAIL 06D6 F1 POP PSW 06D7 32A70E STA BUFFER+2 06DA AF XRA A 06DB 32A90E STA HEAD 06DE 32A50E STA BUFFER 06E1 32A80E STA BUFFER+3 06E4 C1 POP B 06E5 0600 MVI B,0 CP/M MACRO ASSEM 2.0 #016 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 06E7 79 MOV A,C 06E8 32A60E STA BUFFER+1 06EB CD3F08 SEEK CALL MHEAD 06EE DB50 SEEKWT IN STATUS 06F0 E604 ANI COMPLT 06F2 CAEE06 JZ SEEKWT 06F5 C32D03 JMP DELAY 06F8 11350D FAIL LXI D,FAILMSG 06FB C3DD0A JMP PBUFF ***************************************************************** * * * Indx waits until the index hole just passes by. * * * ***************************************************************** 06FE 0E40 INDX MVI C,INDEX 0700 DB50 IN STATUS 0702 A1 ANA C 0703 47 MOV B,A 0704 DB50 INDXWT IN STATUS 0706 A1 ANA C 0707 B8 CMP B 0708 CA0407 JZ INDXWT 070B C9 RET 070C CDC101 LOGICAL CALL GETPHY 070F CD0902 CALL GETLOG 0712 CD6802 CALL HEADATA 0715 CD8D02 CALL PREP 0718 11AB0C LXI D,LOGMSG 071B CDDD0A CALL PBUFF 071E CD5907 CALL FORM 0721 11FB0C LXI D,DONMSG 0724 C3180B JMP EXIT ***************************************************************** * * * Format routine does the actual sector header formatting on * * the entire disk. * * * ***************************************************************** 0727 CDC101 FMTONLY CALL GETPHY 072A CD6802 CALL HEADATA 072D CD8D02 CALL PREP 0730 CD3907 CALL PREFORM 0733 11FB0C LXI D,DONMSG 0736 C3180B JMP EXIT 0739 11960C PREFORM LXI D,FORMMSG 073C CDDD0A CALL PBUFF 073F 210000 LXI H,0 ;Zero the header information 0742 22A50E SHLD BUFFER 0745 22A70E SHLD BUFFER+2 CP/M MACRO ASSEM 2.0 #017 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0748 CD8802 CALL PHYTYP 074B 3ECA MVI A,TRKM26 074D CA5207 JZ SETLST 0750 3EF4 MVI A,TRKM10 0752 32A20E SETLST STA LASTTRK 0755 AF XRA A 0756 32A10E STA FRSTTRK 0759 CD1403 FORM CALL TRKZRO 075C AF XRA A 075D 32A90E STA HEAD 0760 3AA10E LDA FRSTTRK 0763 32A60E STA BUFFER+1 0766 4F MOV C,A 0767 0600 MVI B,0 0769 CDEB06 CALL SEEK 076C 115A0C LXI D,ACRALF 076F CDDD0A CALL PBUFF 0772 3E00 MVI A,IDBUFF 0774 D351 OUT COMND 0776 0680 MVI B,SECLEN/4 0778 3EE5 MVI A,0E5H 077A D353 FILE5 OUT DATA 077C D353 OUT DATA 077E D353 OUT DATA 0780 D353 OUT DATA 0782 05 DCR B 0783 C27A07 JNZ FILE5 0786 CD880A MAINL CALL MAKBUF0 0789 CDC009 CALL CFORMAT 078C DB50 IN STATUS 078E E610 ANI WFAULT ;Check for write fault 0790 113E0C LXI D,WFMSG 0793 CA180B JZ EXIT 0796 3AA00E FMTTRK LDA NODATA 0799 A7 ANA A 079A E5 PUSH H 079B CADD07 JZ FMTSKP 079E E1 POP H 079F CD8802 CALL PHYTYP 07A2 CAB007 JZ FMM26 07A5 3AA50E LDA BUFFER 07A8 FE01 CPI 1 07AA C2D407 JNZ FMTDAT 07AD C3B707 JMP FMMON 07B0 3AA50E FMM26 LDA BUFFER 07B3 A7 ANA A 07B4 C2D407 JNZ FMTDAT 07B7 3AA60E FMMON LDA BUFFER+1 07BA A7 ANA A 07BB C2D407 JNZ FMTDAT 07BE E5 PUSH H CP/M MACRO ASSEM 2.0 #018 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 07BF CD8802 CALL PHYTYP 07C2 061F MVI B,SECM26-1 07C4 CAC907 JZ CMP1X 07C7 0614 MVI B,SECM10-1 07C9 3AA70E CMP1X LDA BUFFER+2 07CC B8 CMP B 07CD DADD07 JC FMTSKP 07D0 CADD07 JZ FMTSKP 07D3 E1 POP H 07D4 E5 FMTDAT PUSH H 07D5 CD5506 CALL PREPRW 07D8 E1 POP H 07D9 E5 PUSH H 07DA CD3606 CALL WSAME 07DD CD0706 FMTSKP CALL SKEW 07E0 E1 POP H 07E1 C29607 JNZ FMTTRK 07E4 CDF907 CALL INCHEAD 07E7 C28607 JNZ MAINL 07EA CD0C08 CALL INCTRK 07ED 3AA60E LDA BUFFER+1 07F0 47 MOV B,A 07F1 3AA20E LDA LASTTRK 07F4 B8 CMP B 07F5 C28607 JNZ MAINL 07F8 C9 RET ***************************************************************** * * * Inchead increments the head. * * * ***************************************************************** 07F9 21A90E INCHEAD LXI H,HEAD ;Increment the head number 07FC 34 INR M 07FD CD8802 CALL PHYTYP 0800 3E08 MVI A,HEDM26 0802 CA0808 JZ CMPHED 0805 3A9F0E LDA HEADS ;Test if done with this head 0808 96 CMPHED SUB M 0809 C0 RNZ 080A 77 MOV M,A 080B C9 RET ***************************************************************** * * * Inctrk increments the track, and then steps the heads out one.* * * ***************************************************************** 080C 21A60E INCTRK LXI H,BUFFER+1 ;Track # 080F CD8802 CALL PHYTYP 0812 3ECA MVI A,TRKM26 0814 CA1908 JZ CMPTRK 0817 3EF4 MVI A,TRKM10 0819 34 CMPTRK INR M ;Increment the track # CP/M MACRO ASSEM 2.0 #019 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 081A BE CMP M ;All done ? 081B C8 RZ 081C CD2808 CALL PDOT 081F 010100 NOCR LXI B,1 ;Move out 0822 CDEB06 CALL SEEK 0825 F601 ORI 1 0827 C9 RET 0828 3A960E PDOT LDA QUIET 082B A7 ANA A 082C C0 RNZ 082D 11580C LXI D,ASTRK ;Print an astrisk 0830 CDDD0A CALL PBUFF 0833 3AA60E LDA BUFFER+1 0836 E63F ANI 3FH 0838 C0 RNZ 0839 115A0C LXI D,ACRALF 083C C3DD0A JMP PBUFF ***************************************************************** * * * Mhead moves the disk head the desired # of steps. Bit 0 of * * register B determines the directios, 1=out, 0=in. Register C * * determins the # of tracks to step. * * * ***************************************************************** 083F 78 MHEAD MOV A,B ;Test direction 0840 E601 ANI 1 0842 17 RAL ;Move into direction bit 0843 17 RAL 0844 17 RAL 0845 47 MOV B,A 0846 79 MOV A,C 0847 A7 ANA A 0848 C8 RZ 0849 3AAA0E LDA DFNREG ;Get current function register 084C E6F7 ANI MDIR ;Mask off the direction bit 084E B0 ORA B ;Put in the direction bit 084F E6FB MHLOOP ANI NSTEP ;Mask off the step bit 0851 D352 OUT FUNCTN ;Output the step bit low 0853 F604 ORI PSTEP ;Change the step bit high 0855 D352 OUT FUNCTN ;Output the step bit high 0857 0D DCR C ;Update the # of steps to go 0858 C24F08 JNZ MHLOOP 085B C9 RET ***************************************************************** * * * Seeks does track seek tests. * * * ***************************************************************** 085C 117E0D SEEKS LXI D,SEEKMSG 085F CDDD0A CALL PBUFF CP/M MACRO ASSEM 2.0 #020 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0862 3E0A MVI A,10 0864 32980E STA SEKCNT 0867 3A980E SKLOPA LDA SEKCNT 086A 3D DCR A 086B 32980E STA SEKCNT 086E C8 RZ 086F CD2808 CALL PDOT 0872 218808 LXI H,SEEKTBL 0875 5E SKLOPB MOV E,M 0876 23 INX H 0877 56 MOV D,M 0878 23 INX H 0879 7B MOV A,E 087A B2 ORA D 087B CA6708 JZ SKLOPA 087E E5 PUSH H 087F EB XCHG 0880 CD8708 CALL DOPCHL 0883 E1 POP H 0884 C37508 JMP SKLOPB 0887 E9 DOPCHL PCHL 0888 9408 SEEKTBL DW SEEKINC 088A B208 DW SEEKDEC 088C CD08 DW SEEKJRK 088E 1909 DW SEEKFLY 0890 FC08 DW SEEKMAX 0892 0000 DW 0 0894 AF SEEKINC XRA A 0895 32990E STA FIRST 0898 329A0E STA LAST 089B 329B0E STA DLTAFST 089E 3C INR A 089F 329C0E STA DLTALST 08A2 CD8802 SEEKCOM CALL PHYTYP 08A5 3EC9 MVI A,TRKM26-1 08A7 CAAC08 JZ SEKCOM 08AA 3EF3 MVI A,TRKM10-1 08AC 329D0E SEKCOM STA REPS 08AF C33609 JMP DOSEEK 08B2 CD8802 SEEKDEC CALL PHYTYP 08B5 3EC9 MVI A,TRKM26-1 08B7 CABC08 JZ SEKDEC 08BA 3EF3 MVI A,TRKM10-1 08BC 32990E SEKDEC STA FIRST 08BF 329A0E STA LAST 08C2 AF XRA A 08C3 329B0E STA DLTAFST 08C6 3D DCR A 08C7 329C0E STA DLTALST 08CA C3A208 JMP SEEKCOM 08CD AF SEEKJRK XRA A CP/M MACRO ASSEM 2.0 #021 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 08CE 32990E STA FIRST 08D1 3C INR A 08D2 329C0E STA DLTALST 08D5 329B0E STA DLTAFST 08D8 3C INR A 08D9 329A0E STA LAST 08DC CD8802 CALL PHYTYP 08DF 3EC7 MVI A,TRKM26-3 08E1 CAE608 JZ SEKJRKA 08E4 3EF1 MVI A,TRKM10-3 08E6 329D0E SEKJRKA STA REPS 08E9 329A0E STA LAST 08EC 3C INR A 08ED 3C INR A 08EE 32990E STA FIRST 08F1 3EFF MVI A,-1 08F3 329C0E STA DLTALST 08F6 329B0E STA DLTAFST 08F9 C33609 JMP DOSEEK 08FC AF SEEKMAX XRA A 08FD 32990E STA FIRST 0900 329B0E STA DLTAFST 0903 329C0E STA DLTALST 0906 329D0E STA REPS 0909 CD8802 CALL PHYTYP 090C 3EC9 MVI A,TRKM26-1 090E CA1309 JZ SEKMAX 0911 3EF3 MVI A,TRKM10-1 0913 329A0E SEKMAX STA LAST 0916 C33609 JMP DOSEEK 0919 3EFF SEEKFLY MVI A,-1 091B 329B0E STA DLTAFST 091E 3C INR A 091F 32990E STA FIRST 0922 3C INR A 0923 329B0E STA DLTAFST 0926 CD8802 CALL PHYTYP 0929 3EC9 MVI A,TRKM26-1 092B CA3009 JZ SEKFLY 092E 3EF3 MVI A,TRKM10-1 0930 329A0E SEKFLY STA LAST 0933 329D0E STA REPS 0936 CDB809 DOSEEK CALL SEK00 0939 CD560B DOSEK CALL PANIC 093C 3A990E LDA FIRST 093F 4F MOV C,A 0940 3A9B0E LDA DLTAFST 0943 81 ADD C 0944 32990E STA FIRST 0947 CD6309 CALL SEEKIT 094A 3A9A0E LDA LAST 094D 4F MOV C,A 094E 3A9C0E LDA DLTALST CP/M MACRO ASSEM 2.0 #022 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0951 81 ADD C 0952 329A0E STA LAST 0955 CD6309 CALL SEEKIT 0958 3A9D0E LDA REPS 095B 3D DCR A 095C 329D0E STA REPS 095F C23909 JNZ DOSEK 0962 C9 RET 0963 47 SEEKIT MOV B,A 0964 3AA60E LDA BUFFER+1 0967 90 SUB B 0968 F5 PUSH PSW 0969 78 MOV A,B 096A 32A60E STA BUFFER+1 096D F1 POP PSW 096E 0600 MVI B,0 0970 DA7709 JC MOVIN 0973 0601 MVI B,1 0975 2F CMA 0976 3C INR A 0977 2F MOVIN CMA 0978 3C INR A 0979 4F MOV C,A 097A CDEB06 CALL SEEK 097D 3E03 MVI A,RHEDR 097F D351 OUT COMND 0981 DB50 SEKWAIT IN STATUS 0983 E602 ANI OPDONE 0985 CA8109 JZ SEKWAIT 0988 3E08 MVI A,ISBUFF 098A D351 OUT COMND 098C DB53 IN DATA 098E DB53 IN DATA 0990 DB53 IN DATA 0992 DB53 IN DATA 0994 47 MOV B,A 0995 3AA60E LDA BUFFER+1 0998 B8 CMP B 0999 C8 RZ 099A C5 PUSH B 099B 118D0D LXI D,SEKMSG1 099E CDDD0A CALL PBUFF 09A1 3AA60E LDA BUFFER+1 09A4 CD2D0B CALL PUTADC 09A7 11AF0D LXI D,SEKMSG2 09AA CDDD0A CALL PBUFF 09AD C1 POP B 09AE 78 MOV A,B 09AF CD2D0B CALL PUTADC 09B2 11BF0D LXI D,SEKMSG3 09B5 CDDD0A CALL PBUFF 09B8 CD1403 SEK00 CALL TRKZRO 09BB AF XRA A 09BC 32A60E STA BUFFER+1 09BF C9 RET CP/M MACRO ASSEM 2.0 #023 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** ***************************************************************** * * * Cformat formats one track on the current head. * * * ***************************************************************** 09C0 3E01 CFORMAT MVI A,1 ;Initialize the sector count 09C2 32A70E STA BUFFER+2 09C5 3AA60E LDA BUFFER+1 09C8 A7 ANA A 09C9 3E80 MVI A,80H 09CB CACF09 JZ PUTKEY 09CE AF XRA A 09CF 32A80E PUTKEY STA BUFFER+3 09D2 CDFE06 CALL INDX 09D5 CD8802 CALL PHYTYP 09D8 0620 MVI B,SECM26 09DA 110B0A LXI D,SKEWM26 09DD CAE509 JZ FLOOP 09E0 0615 MVI B,SECM10 09E2 112B0A LXI D,SKEWM10 09E5 21A70E FLOOP LXI H,BUFFER+2 09E8 1A INCSEC LDAX D 09E9 77 MOV M,A 09EA 13 INX D 09EB 2B DCX H ;Adjust the pointer to the sector header 09EC 2B DCX H 09ED 3E08 MVI A,ISBUFF ;Initialize the controller pointer 09EF D351 OUT COMND ;Give the command 09F1 0E04 MVI C,HDRLEN ;Header length 09F3 7E LDLOOP MOV A,M ;Transfer the contents of the buffer to 09F4 D353 OUT DATA ; the controller 09F6 23 INX H ;Bump pointer to next byte 09F7 0D DCR C ;Update the counter 09F8 C2F309 JNZ LDLOOP 09FB 3E07 MVI A,WHEDR ;Write header command 09FD D351 OUT COMND ;Issue the write header command 09FF DB50 BWAIT IN STATUS ;Wait for the write to complete 0A01 E602 ANI OPDONE 0A03 CAFF09 JZ BWAIT 0A06 05 DCR B ;Test for sector count equal to 0 0A07 C2E509 JNZ FLOOP 0A0A C9 RET 0A0B 160C02170DSKEWM26 DB 22,12,2,23,13,3,24,14,4,25,15,5,26,16,6 0A1A 1B11071C12 DB 27,17,7,28,18,8,29,19,9,30,20,10,31,21,11,32,1 0A2B 080F020910SKEWM10 DB 8,15,2,9,16,3,10,17,4,11 0A35 12050C1306 DB 18,5,12,19,6,13,20,7,14,21,1 0A40 210016 ZERS LXI H,ERRORS 0A43 CD8802 CALL PHYTYP 0A46 012000 LXI B,SECM26 0A49 CA4F0A JZ ZERSX 0A4C 011500 LXI B,SECM10 CP/M MACRO ASSEM 2.0 #024 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0A4F 3600 ZERSX MVI M,0 0A51 23 INX H 0A52 3600 MVI M,0 0A54 23 INX H 0A55 0B DCX B 0A56 78 MOV A,B 0A57 B1 ORA C 0A58 C24F0A JNZ ZERSX 0A5B C9 RET 0A5C 32AC0E INITFLD STA CNT 0A5F 7E MOV A,M 0A60 F5 PUSH PSW 0A61 CD8802 CALL PHYTYP 0A64 0620 MVI B,SECM26 0A66 CA6B0A JZ INIFLX 0A69 0615 MVI B,SECM10 0A6B F1 INIFLX POP PSW 0A6C F5 INILP PUSH PSW 0A6D E5 PUSH H 0A6E 21AC0E LXI H,CNT 0A71 56 MOV D,M 0A72 E1 POP H 0A73 0E04 INILOP MVI C,HDRLEN 0A75 77 INILOOP MOV M,A 0A76 23 INX H 0A77 2F CMA 0A78 0D DCR C 0A79 C2750A JNZ INILOOP 0A7C 3C INR A 0A7D 15 DCR D 0A7E C2730A JNZ INILOP 0A81 F1 POP PSW 0A82 3C INR A 0A83 05 DCR B 0A84 C26C0A JNZ INILP 0A87 C9 RET 0A88 21B00E MAKBUF0 LXI H,DRIVE ;Get drive # 0A8B 7E MOV A,M 0A8C 07 RLC 0A8D 07 RLC ;Move to left four bits 0A8E 07 RLC 0A8F 07 RLC 0A90 47 MOV B,A ;Save drive # in B 0A91 3AA90E LDA HEAD ;Add in the head # 0A94 32A50E STA BUFFER 0A97 80 ADD B 0A98 E607 ANI 7 ;Strip off the drive # 0A9A 07 RLC 0A9B 07 RLC 0A9C 07 RLC ;Head # in to four significant bits 0A9D 07 RLC 0A9E 2F CMA ;Head # is negative logic 0A9F E6FC ANI 0FCH ;Strip off the drive bits 0AA1 86 ADD M ;Add in this drive CP/M MACRO ASSEM 2.0 #025 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0AA2 32AA0E STA DFNREG ;Save the function register 0AA5 D352 OUT FUNCTN ;Output the function 0AA7 C9 RET 0AA8 E63F INCERR ANI 3FH 0AAA 6F MOV L,A 0AAB 2600 MVI H,0 0AAD 110016 LXI D,ERRORS 0AB0 19 DAD D 0AB1 5E MOV E,M 0AB2 23 INX H 0AB3 56 MOV D,M 0AB4 13 INX D 0AB5 72 MOV M,D 0AB6 2B DCX H 0AB7 73 MOV M,E 0AB8 C9 RET 0AB9 3AB20E NEWPAT LDA TSTTYP 0ABC A7 ANA A 0ABD 7E MOV A,M 0ABE CAD90A JZ LONG 0AC1 3AB10E SHORT LDA SFLG 0AC4 A7 ANA A 0AC5 3E00 MVI A,0 0AC7 32B10E STA SFLG 0ACA 7E MOV A,M 0ACB C2D70A JNZ SHORTX 0ACE 3E01 MVI A,1 0AD0 32B10E STA SFLG 0AD3 7E MOV A,M 0AD4 2F CMA 0AD5 17 RAL 0AD6 2F CMA 0AD7 2F SHORTX CMA 0AD8 3D DCR A 0AD9 3C LONG INR A 0ADA 77 MOV M,A 0ADB A7 ANA A 0ADC C9 RET ***************************************************************** * * * Pbuff is the CP/M print buffer command. * * * ***************************************************************** 0ADD 3A960E PBUFF LDA QUIET 0AE0 A7 ANA A 0AE1 CAEC0A JZ PBUFFX 0AE4 D5 PUSH D 0AE5 116A0E LXI D,NULLS 0AE8 CDEC0A CALL PBUFFX 0AEB D1 POP D 0AEC 0E09 PBUFFX MVI C,9 ;Print buffer command 0AEE C30500 JMP BDOS ;Go and enter the BDOS CP/M MACRO ASSEM 2.0 #026 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** ***************************************************************** * * * Rbuff is the CP/M read buffer command. * * * ***************************************************************** 0AF1 110C0B RBUFF LXI D,BUFMAX ;Beginning of buffer 0AF4 0E0A MVI C,10 ;Read console command 0AF6 CD0500 CALL BDOS ;Read and fill the buffer 0AF9 3A0D0B LDA BUFLEN ;Check for zero length 0AFC A7 ANA A ;if zero the return with acr in A 0AFD 3E0D MVI A,ACR 0AFF C8 RZ 0B00 3A0E0B LDA BUFDAT ;Otherwise return with the character 0B03 FE61 CPI 'a' ;Fold to upper case 0B05 D8 RC 0B06 FE7B CPI 'z'+1 0B08 D0 RNC 0B09 D620 SUI 20H ;Perform the mapping to upper case 0B0B C9 RET 0B0C 0A BUFMAX DB 10 ;Maximum length 0B0D 00 BUFLEN DB 0 ;Current length 0B0E BUFDAT DS 10 ;Storage or read in data ***************************************************************** * * * Exit prints a message on the CP/M console then does a warm * * boot. * * * ***************************************************************** 0B18 CDDD0A EXIT CALL PBUFF 0B1B 11750E LXI D,INSMSG 0B1E CDDD0A CALL PBUFF 0B21 CDF10A CALL RBUFF 0B24 C30000 JMP WBOOT 0B27 7C HLCDE MOV A,H 0B28 BA CMP D 0B29 C0 RNZ 0B2A 7D MOV A,L 0B2B BB CMP E 0B2C C9 RET 0B2D 6F PUTADC MOV L,A 0B2E 2600 MVI H,0 ***************************************************************** * * * Putdc prints the ascii decimal equivalent of the number in HL * * * ***************************************************************** 0B30 01F6FF PUTDC LXI B,-10 CP/M MACRO ASSEM 2.0 #027 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0B33 D5 PHL PUSH D 0B34 50 MOV D,B 0B35 58 MOV E,B 0B36 09 PHLLP DAD B 0B37 13 INX D 0B38 DA360B JC PHLLP 0B3B E3 XTHL 0B3C EB XCHG 0B3D 7C MOV A,H 0B3E B5 ORA L 0B3F C4330B CNZ PHL 0B42 E1 POP H 0B43 3E30 MVI A,'0' 0B45 85 ADD L 0B46 91 SUB C 0B47 E5 PCHAR PUSH H 0B48 C5 PUSH B 0B49 D5 PUSH D 0B4A F5 PUSH PSW 0B4B 5F MOV E,A 0B4C 0E02 MVI C,2 0B4E CD0500 CALL BDOS 0B51 F1 POP PSW 0B52 D1 POP D 0B53 C1 POP B 0B54 E1 POP H 0B55 C9 RET ***************************************************************** * * * Panic checks if a character has been hit on the console. * * If a character has been pressed, then panic acknowledges the * * fact and asks for an abort. * * * ***************************************************************** 0B56 0E0B PANIC MVI C,11 0B58 CD0500 CALL BDOS 0B5B E601 ANI 1 0B5D C8 RZ 0B5E 110A0D LXI D,PANMSG 0B61 CDDD0A CALL PBUFF 0B64 CDF10A CALL RBUFF 0B67 FE59 CPI 'Y' 0B69 CA0000 JZ WBOOT 0B6C FE52 CPI 'R' 0B6E CA0901 JZ ASKALL 0B71 115A0C LXI D,ACRALF 0B74 C3DD0A JMP PBUFF ***************************************************************** * * * Messages output by the program. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #028 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0B77 466F726D61PROMPT DB 'Formathd (M10, M20, M26) Version ' 0B98 32 DB REVNUM/10+'0' 0B99 2E DB '.' 0B9A 31 DB (REVNUM MOD 10)+'0' 0B9B 204C617374 DB ' Last updated May 18, 1981.' 0BB6 0D0A DB ACR, ALF 0BB8 24 DB '$' 0BB9 0D0A PHNUM DB ACR,ALF 0BBB 5068797369 DB 'Physical drive number (1-4): $' 0BD9 0D0A LOGNUM DB ACR,ALF 0BDB 4C6F676963 DB 'Logical drive number (1-3): $' 0BF8 0D0A HDMSG DB ACR,ALF 0BFA 466F726D61 DB 'Format type (H,D): $' 0C0E 0D0A RDYMSG DB ACR,ALF 0C10 4472697665 DB 'Drive not ready.' 0C20 0D0A24 DB ACR, ALF, '$' 0C23 0D0A HLTMSG DB ACR,ALF 0C25 436F6E7472 DB 'Controller not halted.' 0C3B 0D0A24 DB ACR, ALF, '$' 0C3E 0D0A WFMSG DB ACR,ALF 0C40 5772697465 DB 'Write fault on drive.' 0C55 0D0A24 DB ACR, ALF, '$' 0C58 2E24 ASTRK DB '.$' 0C5A = HARDMSG EQU $ 0C5A = SOFTMSG EQU $ 0C5A 0D0A24 ACRALF DB ACR,ALF,'$' 0C5D 0D0A RDYWAIT DB ACR,ALF 0C5F 5761697469 DB 'Waiting for drive ready.' 0C77 0D0A24 DB ACR, ALF, '$' 0C7A 0D0A HEADMSG DB ACR,ALF 0C7C 5465737469 DB 'Testing sector headers.' 0C93 0D0A24 DB ACR,ALF,'$' 0C96 0D0A FORMMSG DB ACR,ALF 0C98 466F726D61 DB 'Formatting disk.' 0CA8 0D0A24 DB ACR, ALF, '$' 0CAB 0D0A LOGMSG DB ACR,ALF 0CAD 4C6F676963 DB 'Logical format.' 0CBC 0D0A24 DB ACR, ALF, '$' 0CBF 536563746FERRMSG DB 'Sector Error @ Track: $' 0CD7 2C20536563SECMSG DB ', Sector: $' 0CE2 2C20486561HEDMSG DB ', Head: $' CP/M MACRO ASSEM 2.0 #029 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0CEB 2C20457272RTYMSG DB ', Error count: $' 0CFB 0D0A DONMSG DB ACR,ALF 0CFD 446F6E652E DB 'Done. CP/M. $' 0D0A 0D0A PANMSG DB ACR,ALF 0D0C 41626F7274 DB 'Abort (Y,N,R): $' 0D1C 0D0A DATMSG DB ACR,ALF 0D1E 5465737469 DB 'Testing sector data.' 0D32 0D0A24 DB ACR,ALF,'$' 0D35 0D0A FAILMSG DB ACR,ALF 0D37 4572726F72 DB 'Error Writing Sector Map to Track Zero.' 0D5E 0D0A24 DB ACR, ALF, '$' 0D61 0D0A FULLMSG DB ACR,ALF 0D63 4261642053 DB 'Bad Sector Map Overflow.' 0D7B 0D0A24 DB ACR, ALF, '$' 0D7E 0D0A SEEKMSG DB ACR,ALF 0D80 5365656B20 DB 'Seek test.' 0D8A 0D0A24 DB ACR,ALF,'$' 0D8D 0D0A SEKMSG1 DB ACR,ALF 0D8F 5365656B20 DB 'Seek error, Looking For Track: $' 0DAF 2C20466F75SEKMSG2 DB ', Found Track: $' 0DBF 2E0D0A24 SEKMSG3 DB '.',ACR,ALF,'$' 0DC3 0D0A UNKNOWN DB ACR,ALF 0DC5 556E6B6E6F DB 'Unknown Command.' 0DD5 0D0A24 DB ACR, ALF, '$' 0DD8 0D0A BDRVMSG DB ACR,ALF 0DDA 4261642044 DB 'Bad Drive Number.' 0DEB 0D0A24 DB ACR, ALF, '$' 0DEE 0D0A FUNCMSG DB ACR,ALF 0DF0 46756E6374 DB 'Function (L,F,C,D): $' 0E05 0D0A NOTYET DB ACR,ALF 0E07 4E6F742059 DB 'Not Yet Implemented.' 0E1B 0D0A24 DB ACR, ALF, '$' 0E1E 0D0A DRVTYP DB ACR,ALF 0E20 4472697665 DB 'Drive type (A,B,C): $' 0E35 0D0A MUCHMSG DB ACR,ALF 0E37 446961676E DB 'Diagnostic options (1-7): $' 0E52 0D0A PREFMT DB ACR,ALF 0E54 5072652D66 DB 'Pre-formatted (Y,N): $' 0E6A 0000000000NULLS DB 0,0,0,0,0,0,0,0,0,0,'$' 0E75 0D0A INSMSG DB ACR,ALF CP/M MACRO ASSEM 2.0 #030 *** Format Program for Discus M26 & M10 under CP/M 2.2 *** 0E77 3C43523E20 DB ' for CP/M.$' 0E86 0D0A REPMSG DB ACR, ALF 0E88 5265706561 DB 'Repeat(Y,N): $' ***************************************************************** * * * Dynamic data locations. * * * ***************************************************************** 0E96 00 QUIET DB 0 0E97 00 MUCH DB 0 0E98 00 SEKCNT DB 0 0E99 00 FIRST DB 0 0E9A 00 LAST DB 0 0E9B 00 DLTAFST DB 0 0E9C 00 DLTALST DB 0 0E9D 00 REPS DB 0 0E9E 00 DISKTYP DB 0 0E9F 00 HEADS DB 0 0EA0 00 NODATA DB 0 0EA1 00 FRSTTRK DB 0 0EA2 00 LASTTRK DB 0 0EA3 0000 SETTLE DW 0 ;20ms time constant 0EA5 BUFFER DS HDRLEN 0EA9 00 HEAD DB 0 0EAA FC DFNREG DB 0FCH 0EAB 00 ERRFLG DB 0 0EAC 00 CNT DB 0 0EAD 00 BADSEC DB 0 0EAE 0000 MAPPNT DW 0 ;Pointer into map table 0EB0 FF DRIVE DB 0FFH ;If this location is NOT 0ffh then ; NO prompting will occur 0EB1 00 SFLG DB 0 0EB2 01 TSTTYP DB 1 0EB3 00 PHASE DB 0 0EB4 HEDBUF1 DS SECM26*HDRLEN 0F34 HEDBUF2 DS SECM10*HDRLEN 0F88 DS 100H-($ MOD 100H) 1000 DATBUF1 DS SECLEN 1200 MAPBEG DS SECLEN*2 1600 ERRORS DS SECM26*2 1640 DS 30 165E = STACK EQU $ 165E END