N title floppy drive test 3/15/82 FFFF = on equ 0ffffh ;define on 0000 = off equ not on ;and off 0000 = stop equ off ;condition on yields RST 7 on error if stop ;examines condition trap equ 0ffh ;Restart 7 op code endif if not stop ;otherwise 0000 = trap equ 0 ;NOP code endif 0050 = channl equ 50h ;Start channel address 0051 = vector equ channl+1 ;branch address 00EF = startr equ 0efh ;port address to start the controller 0023 = setma equ 23h ;Command to set DMA address 0020 = rdsec equ 20h ;Command to read a sector 0021 = wrsec equ 21h ;Command to write a sector 0022 = snsta equ 22h ;Command to sense drive status 0028 = strtry equ 28h ;Command to set error retry count 002E = stlgcl equ 2eh ;Command to set logical drive 002F = sttime equ 2fh ;Command to set head unload/ ; drive deselect timeout 0029 = rdtrk equ 29h ;Command to read a track 002A = wrtrk equ 2ah ;Command to write a track 0025 = conhlt equ 25h ;Command to halt controller 0026 = brnch equ 26h ;Command to branch in channel 0027 = setchn equ 27h ;Command to set channel address 002D = sttksz equ 2dh ;Command to set track size 001A = tblsz equ 26 ;track table size 0040 = good equ 40h ;normal command completion 0004 = fiver equ 4h ;five inch drive flag 0040 = wrtpro equ 40h ;write protect flag 0004 = dblsid equ 4 ;double sided drive & media flag 0080 = sd2bit equ 80h ;side two bit 0010 = index equ 10h ;Delta index status bit 0040 = wprtct equ 40h ;Write protected status bit 0090 = proerr equ 90h ;write-protected error code 0080 = dready equ 80h ;Drive ready status bit 0082 = notrdy equ 82h ;drive not ready 2000 = eightk equ 2000h ;disk buffer size 0098 = mapsiz equ 152 ;badmap 76 X 2 sides 0001 = retries equ 1 ;Disk retries before verify error 0001 = conin equ 1 ;character in console 0002 = cout equ 2 ;character out console 0009 = wrstrn equ 9h ;bdos write string 000B = consta equ 0bh ;get console status 000A = lf equ 0ah ;line feed 000D = cr equ 0dh ;carriage return 001B = esc equ 1bh ;escape character 0000 = wboot equ 0 ;warm boot address 0005 = bdos equ 5 ;Bdos entry address 0100 start org 100h 0100 31C10A lxi sp,stack 0103 11310A lxi d,onms ;start-up message 0106 CDA806 call wrterm ;send it 0109 211607 lxi h,drvlog ;load log address 010C 221407 shld logpnt ;initialize pointer 010F 3E26 mvi a,brnch ;branch command 0111 325000 sta channl ;controller starts here 0114 21B706 lxi h,setdma ;set dma address command 0117 225100 shld vector ;guide controller 011A 97 sub a ;zero A 011B 325300 sta vector+2 ;extended address byte 011E 32DE06 sta hlted ;zero halt result byte 0121 D3EF out startr ;start controller 0123 CDD005 call wait1 ;wait for it to finish 0126 21D706 lxi h,retrys ;address of set tries cmnd 0129 225100 shld vector ;to guide controller 012C 97 sub a ;zero A 012D 32DE06 sta hlted ;clear halt result byte 0130 D3EF out startr ;start controller 0132 CDD005 call wait1 ;wait for it to finish 0135 CD3E01 call drvcks ;look for drives 0138 CDDD01 call test ;testem 013B C30001 jmp start ;run test again 013E 0E08 drvcks mvi c,8 ;maximum number of drives 0140 21AD06 lxi h,snstat ;get address of sense command 0143 225100 shld vector ;store it in vector 0146 3E08 drvlp mvi a,8 ;# of possible drives 0148 91 sub c ;to find current drive 0149 47 mov b,a ;save drive # in B 014A C5 push b ;save count 014B 32AE06 sta snsdrv ;tell sense command 014E 97 sub a ;zero A 014F 32B206 sta snsrlt ;clear result byte of sense command 0152 32DE06 sta hlted ;clear halt command result byte 0155 D3EF out startr ;start controller 0157 CDD005 call wait1 ;wait for it to finish 015A 3AB206 cksns lda snsrlt ;sense command result status 015D CD6601 call login ;record results in table 0160 C1 pop b ;recover count 0161 0D dcr c ;drive count-down 0162 C24601 jnz drvlp ;next drive 0165 C9 ret ;else return 0166 FE40 login cpi good ;zero means active drive 0168 CA7D01 jz ckit ;to find out about it 016B FE82 cpi notrdy ;appropriate result 016D C43204 cnz logerr ;report to terminal 0170 2A1407 spec lhld logpnt ;get pointer 0173 3600 mvi m,0 ;indicates inactive drive 0175 23 inx h ;update pointer 0176 3600 mvi m,0 ;indicates inactive drive 0178 23 inx h ;for next drive 0179 221407 shld logpnt ;store pointer 017C C9 ret 017D C5 ckit push b ;save BC pair 017E 118D07 lxi d,drvmsg ;for operator 0181 CDA806 call wrterm ;send it 0184 C1 pop b ;recover BC 0185 78 mov a,b ;put drive # in A 0186 CD7F06 call bcdout ;send to terminal 0189 3AB106 lda dstat3 ;load status byte 018C E640 ani wrtpro ;ck write-protected bit 018E CA9901 jz notpro ;if its off 0191 3E90 mvi a,proerr ;write-protected error code 0193 CD4104 call loger2 ;advises terminal 0196 C37001 jmp spec ;goes on to next drive 0199 3AAF06 notpro lda dstat1 ;to find whether 5 or 8 inch 019C E604 ani 4h ;on means 5 inch 019E CABD01 jz eighin ;else its an 8 inch 01A1 2A1407 lhld logpnt ;get log pointer 01A4 3628 mvi m,40 ;number of tracks 01A6 23 inx h ;to next entry (sngl or dble sided) 01A7 CD1306 call askop ;ask operator # of sides 01AA 0600 mvi b,0 ;zero B 01AC FE31 cpi '1' ;single-sided? 01AE CAB301 jz skpdbl ;skip double-sided entry 01B1 0680 mvi b,80h ;double-sided bit 01B3 3AB006 skpdbl lda dstat2 ;sector size 01B6 80 add b ;combine with B 01B7 77 mov m,a ;store result in drive log 01B8 23 inx h ;to next drive 01B9 221407 shld logpnt ;store the updated pointer 01BC C9 ret 01BD 2A1407 eighin lhld logpnt ;load log pointer 01C0 364D mvi m,77 ;number of tracks 01C2 23 inx h ;next log entry 01C3 3AB006 lda dstat2 ;sector size 01C6 FE00 cpi 0 ;may be wrong if on track 0 01C8 CC1105 cz rechk ;moves to track 1 and rechecks 01CB 47 mov b,a ;save in B 01CC 3AB106 lda dstat3 ;3 bit tells sides 01CF E604 ani 4h ;on means dbl sided 01D1 CAD601 jz sngl ;single sided 01D4 3E80 mvi a,80h ;dble sided bit 01D6 80 sngl add b ;combine with sector size 01D7 77 mov m,a ;record it 01D8 23 inx h ;increment pointer for next drive 01D9 221407 shld logpnt ;save it 01DC C9 ret 01DD 0E08 test mvi c,8 ;number of drive possibilities 01DF 211607 lxi h,drvlog ;pickup log address 01E2 7E next mov a,m ;load tracks 01E3 FE00 cpi 0 ;active? 01E5 C2EF01 jnz go ;yes 01E8 23 inx h ;else advance pointer 01E9 23 inx h ;to next drive 01EA 0D dcr c ;decrement drive counter 01EB C2E201 jnz next ;loop till done 01EE C9 ret 01EF 221407 go shld logpnt ;save pointer 01F2 3E08 mvi a,8 ;number of drive possibilities 01F4 91 sub c ;current drive number 01F5 32C206 sta wrtkdr ;tell commands 01F8 32CE06 sta rdtkdr 01FB E5 push h ;save HL 01FC C5 push b ;and BC 01FD CD5506 call seekms ;advise terminal 0200 CD1202 call seeks ;do seek tests 0203 CD5E06 call rdwrms ;advise terminal 0206 CDDE02 call rdwrts ;do data tests 0209 C1 endrv pop b ;recover pointers 020A E1 pop h 020B 23 inx h ;advance pointer 020C 23 inx h ;for next drive 020D 0D dcr c ;drive count down 020E C2E201 jnz next ;and loop 0211 C9 ret ;no more drives 0212 21CB06 seeks lxi h,rdtrak ;read track command address 0215 225100 shld vector ;guide controller 0218 3E80 mvi a,80h ;to abort command 021A CD0505 call clrtbl ;writes A to command table 021D 2A1407 lhld logpnt ;pickup pointer 0220 56 mov d,m ;put # of tracks in D 0221 15 dcr d ;to get highest track number 0222 1E00 mvi e,0 ;Zero E 0224 CD3502 call pat1 ;short-long-short 0227 2A1407 lhld logpnt ;pickup log pointer 022A 56 mov d,m ;number of tracks to D 022B 15 dcr d ;to get highest track number 022C CD5602 call pat2 ;long-short-long 022F 1600 mvi d,0 ;start at 0 0231 CD7A02 call pat3 ;butterfly (+2-1 out, then -2+1 back) 0234 C9 ret 0235 7A pat1 mov a,d ;D starts at highest track number 0236 CD9C02 call seek ;seeks to track in A 0239 7B mov a,e ;E starts at track 0 023A CD9C02 call seek 023D 15 dcr d ;count down 023E FA4602 jm reverse ;no tracks left 0241 1C inr e ;count up 0242 BE cmp m ;number of tracks 0243 C23502 jnz pat1 0246 14 reverse inr d ;count up 0247 7A mov a,d 0248 BE cmp m ;M has number of tracks 0249 C8 rz 024A CD9C02 call seek ;else seek 024D 1D dcr e 024E F8 rm ;no tracks left 024F 7B mov a,e 0250 CD9C02 call seek 0253 C34602 jmp reverse 0256 7A pat2 mov a,d ;D starts at highest track number 0257 1F rar ;divide by 2 0258 57 mov d,a ;reset D 0259 5F mov e,a ;set E=D at start 025A 7A pat2lp mov a,d ;start at middle track 025B CD9C02 call seek ;seeks to track in A 025E 1D dcr e ;count E down, D up 025F FA6B02 jm phase2 ;reverse direction 0262 7B mov a,e ;else read it 0263 CD9C02 call seek 0266 14 inr d ;count up in first phase 0267 BE cmp m ;number of tracks 0268 C25A02 jnz pat2lp 026B 1C phase2 inr e ;count up 026C 7B mov a,e 026D CD9C02 call seek 0270 15 dcr d ;count down 0271 7A mov a,d ;to check 0272 BB cmp e ;looking for crossing point 0273 F8 rm ;finished 0274 CD9C02 call seek ;else continue 0277 C36B02 jmp phase2 ;loop 027A 7A pat3 mov a,d ;D starts at 0 027B CD9C02 call seek ;takes drive back one in loop 027E 7A mov a,d 027F C602 adi 2 ;jump ahead two 0281 BE cmp m ;number of tracks 0282 CA8C02 jz phaze2 ;reverse pattern 0285 CD9C02 call seek 0288 14 inr d ;and back one 0289 C37A02 jmp pat3 ;repeat 028C 3D phaze2 dcr a ;for first shot only 028D CD9C02 phlp call seek 0290 7A mov a,d 0291 DE02 sbi 2 ;in two 0293 F8 rm 0294 CD9C02 call seek 0297 15 dcr d ;and back one 0298 7A mov a,d 0299 C38D02 jmp phlp 029C 32CC06 seek sta rdtktk ;start at track indicated by A 029F 321107 sta track ;keep record 02A2 D5 push d ;save DE 02A3 E5 push h ;save HL 02A4 4F mov c,a ;save track in C 02A5 2A1407 lhld logpnt ;get log pointer 02A8 23 inx h ;advance log pointer to sides byte 02A9 7E mov a,m ;load byte 02AA 2B dcx h ;return pointer 02AB E680 ani 80h ;see if dblesided bit is on 02AD CAB502 jz onesid ;if not, forget it 02B0 3ACD06 lda rdtksd ;else load side byte 02B3 EE80 xri 80h ;toggle it 02B5 32CD06 onesid sta rdtksd ;replace it 02B8 321207 sta side ;save it 02BB 47 mov b,a ;save side byte in B 02BC C5 push b ;save BC 02BD 97 sub a ;zero A 02BE 32D206 sta rtrslt ;clear result byte 02C1 D3EF out startr ;start controller 02C3 CDD005 call wait1 ;wait for it to finish 02C6 C1 pop b ;restore BC 02C7 3AD206 lda rtrslt ;check the results 02CA FE40 cpi good ;normal completion? 02CC E1 pop h ;restore HL 02CD D1 pop d ;restore DE 02CE C8 rz ;gives normal return 02CF 00 grab1 db trap ;conditional RST 7 02D0 FE82 cpi notrdy ;drive gone away? 02D2 C2A404 jnz error ;if not, report error 02D5 CDA404 call error ;if yes, report and 02D8 E1 pop h ;clear 3 returns off stack and 02D9 E1 pop h 02DA E1 pop h 02DB C30902 jmp endrv ;go to next drive 02DE 97 rdwrts sub a ;zero A 02DF 321307 sta pass ;clear pass counter 02E2 CD0505 call clrtbl ;clears command table 02E5 CD7705 call trkszr ;puts size of track at tbytes 02E8 00 nop 02E9 21BF06 tstdat lxi h,wrtrak ;write track command address 02EC 225100 shld vector ;to guide controller 02EF CD0803 call wrdrv ;writes all tracks 02F2 21CB06 lxi h,rdtrak ;read track command address 02F5 225100 shld vector ;guide controller 02F8 CD9E03 call rddrv ;reads and compares all 02FB 3A1307 lda pass ;get pass counter 02FE 3C inr a ;increment it 02FF 321307 sta pass ;put it back 0302 FE04 cpi 4 ;one to many 0304 C2E902 jnz tstdat ;continue data test 0307 C9 ret 0308 11EC09 wrdrv lxi d,wrtmsg ;writing message 030B CDA806 call wrterm ;send it 030E 3A1307 lda pass ;get pass number 0311 CD7F06 call bcdout ;send it 0314 CDD404 call clrmap ;clears badmap to zeros 0317 21C30A lxi h,badmap ;address of map 031A 22C10A shld mappnt ;initializes pointer to badmap 031D 2A1407 lhld logpnt ;pickup log pointer 0320 46 mov b,m ;number of tracks 0321 97 sub a ;zero A 0322 32C106 sta wrtksd ;start with side 0 0325 321207 sta side ;store for error message 0328 C5 trklp push b ;save track counter 0329 E5 push h ;save log pointer 032A 7E mov a,m ;number of tracks 032B 90 sub b ;track counter 032C 4F mov c,a ;save track in C 032D 32C006 sta wrtktk ;current track to command 0330 321107 sta track ;and record 0333 CD9705 call newpat ;get pattern for this track 0336 CDB005 call filbuf ;writes it to disk buffer 0339 97 wttk sub a ;zero A 033A 32C606 sta wtrslt ;clear result byte 033D D3EF out startr ;starts controller 033F CDD005 call wait1 ;wait for it to finish 0342 3AC106 lda wrtksd ;get the side byte 0345 47 mov b,a ;save it in B 0346 3AC606 lda wtrslt ;load result byte 0349 FE40 cpi good ;ordinary completion 034B CA6903 jz update ;gives normal return 034E 00 grab2 db trap ;conditional RST 7 034F FE82 cpi notrdy ;drive gone away? 0351 CA6203 jz abrtdr ;end this drive 0354 2AC10A lhld mappnt ;pickup pointer to badmap 0357 77 mov m,a ;store error code 0358 23 inx h ;advance pointer 0359 22C10A shld mappnt ;store pointer 035C CDA404 call error ;report and continue 035F C37303 jmp aswas ;normal completion 0362 E1 abrtdr pop h ;clear 2 pushes & 2 returns off stack 0363 E1 pop h 0364 E1 pop h 0365 E1 pop h 0366 C30902 jmp endrv ;go to next drive 0369 CDEF04 update call cktbl ;check sector results table 036C 2AC10A lhld mappnt ;pickup pointer to badmap 036F 23 inx h ;advance it 0370 22C10A shld mappnt ;store it 0373 2A1407 aswas lhld logpnt ;get log pointer 0376 23 inx h ;advance to side byte 0377 7E mov a,m ;load it 0378 E680 ani 80h ;check sides bit 037A CA9703 jz cntdwn ;if single-sided, forget it 037D 3AC106 lda wrtksd ;load command side byte 0380 E680 ani 80h ;check side bit 0382 C29003 jnz reset ;already done 0385 3E80 mvi a,80h ;set it 0387 32C106 sta wrtksd ;store in command 038A 321207 sta side ;and store it 038D C33903 jmp wttk 0390 97 reset sub a ;reset side bit for next track 0391 32C106 sta wrtksd ;store in command 0394 321207 sta side ;and store it 0397 E1 cntdwn pop h ;restore pointer 0398 C1 pop b ;restore BC 0399 05 dcr b ;count down the tracks 039A C22803 jnz trklp ;do another track 039D C9 ret ;pass complete 039E 11080A rddrv lxi d,rdnmsg ;reading message 03A1 CDA806 call wrterm ;send it 03A4 3A1307 lda pass ;get pass 03A7 CD7F06 call bcdout ;send it 03AA 97 sub a ;zero A 03AB 32CD06 sta rdtksd ;start with side 0 03AE 321207 sta side ;and save record 03B1 21C30A lxi h,badmap ;initialize pointer 03B4 2B dcx h ;to one less 03B5 22C10A shld mappnt ;and store it 03B8 2A1407 lhld logpnt ;get log pointer 03BB 46 mov b,m ;loads # of tracks to B 03BC C5 trklp2 push b ;save track counter 03BD E5 push h ;save log pointer 03BE 7E mov a,m ;get number of tracks 03BF 90 sub b ;track counter 03C0 4F mov c,a ;save track in C 03C1 32CC06 sta rdtktk ;store in command 03C4 321107 sta track ;track record 03C7 2AC10A rd lhld mappnt ;pickup badmap pointer 03CA 23 inx h ;advance it 03CB 22C10A shld mappnt ;put it back 03CE 7E mov a,m ;load it 03CF E6FF ani 0ffh ;see if its clear 03D1 C20704 jnz nxtrk ;skip track if not 03D4 97 sub a ;zero A 03D5 32D206 sta rtrslt ;clear result byte 03D8 D3EF out startr ;start controller 03DA CDD005 call wait1 ;wait for it to finish 03DD 3ACD06 lda rdtksd ;get side byte 03E0 47 mov b,a ;save it in B 03E1 3AD206 lda rtrslt ;get result byte 03E4 FE40 cpi good ;compare 03E6 CAFC03 jz okay ;gives normal return 03E9 00 grab3 db trap ;conditional RST 7 03EA FE82 cpi notrdy ;drive gone away? 03EC CAF503 jz abort ;end this drive 03EF CDA404 call error ;report and continue 03F2 C3FC03 jmp okay ;normal completion 03F5 E1 abort pop h ;clear 2 pushes & 2 returns off stack 03F6 E1 pop h 03F7 E1 pop h 03F8 E1 pop h 03F9 C30902 jmp endrv ;go to next drive 03FC C5 okay push b ;save BC 03FD CDEF04 call cktbl ;check sector results table 0400 C1 pop b ;restore BC 0401 CD9705 call newpat ;get test pattern 0404 CD3205 call verify ;read and compare data 0407 2A1407 nxtrk lhld logpnt ;get log pointer 040A 23 inx h ;advance to side byte 040B 7E mov a,m ;load it 040C E680 ani 80h ;check sides bit 040E CA2B04 jz ignor ;if single-sided, forget it 0411 3ACD06 lda rdtksd ;load command side byte 0414 E680 ani 80h ;check side bit 0416 C22404 jnz reset2 ;already done 0419 3E80 mvi a,80h ;set it 041B 32CD06 sta rdtksd ;store in command 041E 321207 sta side ;save record 0421 C3C703 jmp rd ;do other side 0424 97 reset2 sub a ;reset side bit for next track 0425 32CD06 sta rdtksd ;store in command 0428 321207 sta side ;save record 042B E1 ignor pop h ;restore pointer 042C C1 pop b ;recover counter 042D 05 dcr b ;count down tracks 042E C2BC03 jnz trklp2 ;do next track 0431 C9 ret ;finish 0432 F5 logerr push psw ;save error code 0433 00 grab5 db trap ;conditional RST 7 0434 C5 push b ;save drive number in B 0435 118D07 lxi d,drvmsg ;drive message 0438 CDA806 call wrterm ;send it 043B C1 pop b ;get drive number 043C 78 mov a,b ;move it 043D CD7F06 call bcdout ;send it 0440 F1 pop psw ;recover error code 0441 CDC804 loger2 call errfnd ;loads DE to err msg 0444 13 inx d ;skip crs & lf 0445 13 inx d 0446 13 inx d 0447 C3A806 jmp wrterm ;send to terminal 044A E5 secerr push h ;save HL 044B 00 grab6 db trap ;conditional RST 7 044C C5 push b ;and BC 044D CDC804 call errfnd ;loads DE with err msg 0450 CDA806 call wrterm ;sends it 0453 115507 lxi d,trkmsg ;track message 0456 CDA806 call wrterm ;send it 0459 3A1107 lda track ;get track number 045C CD7F06 call bcdout ;send it 045F 115D07 lxi d,sidems ;side msg 0462 CDA806 call wrterm ;send it 0465 3A1207 lda side ;get current side 0468 07 rlc ;move side bit to data 0 0469 CD7F06 call bcdout ;send it 046C 116407 lxi d,secmsg ;sector message 046F CDA806 call wrterm ;send it 0472 C1 pop b ;recover BC 0473 C5 push b ;and re-save 0474 78 mov a,b ;number of sectors 0475 91 sub c ;counter 0476 CD7F06 call bcdout ;send it and return 0479 C1 pop b ;restore BC 047A E1 pop h ;restore HL 047B C9 ret 047C 2A1407 getscs lhld logpnt ;get drive log pointer 047F 7E mov a,m ;get # of tracks 0480 FE4D cpi 77 ;if 8 inch 0482 CA8804 jz not5 ;skip 5 inch 0485 0E0A mvi c,0ah ;10 sectors for five inch 0487 C9 ret 0488 3A1107 not5 lda track ;load current track 048B FE00 cpi 0 ;see if its track 0 048D C29304 jnz not0 ;skip if its not 0490 0E1A mvi c,26 ;else its 26 sectors 0492 C9 ret 0493 23 not0 inx h ;advance to sector size 0494 7E mov a,m ;load sector size byte 0495 E607 ani 7 ;low bits only 0497 47 mov b,a ;save in B 0498 210B07 lxi h,sctrs ;point M at table 049B 7D mov a,l ;adjust M by B 049C 80 add b 049D D2A104 jnc notovr ;in case of carry 04A0 24 inr h 04A1 6F notovr mov l,a ;M now adjusted 04A2 4E mov c,m ;put number of sectors in C 04A3 C9 ret 04A4 D5 error push d 04A5 E5 push h 04A6 C5 push b ;save register pairs 04A7 CDC804 call errfnd ;loads DE with error msg 04AA CDA806 call wrterm ;send to terminal 04AD 11C909 lxi d,tkmsg ;track message 04B0 CDA806 call wrterm ;send it 04B3 3A1107 lda track ;get current track 04B6 CD7F06 call bcdout ;and send it 04B9 11D109 lxi d,sdms ;side msg 04BC CDA806 call wrterm ;send it 04BF C1 pop b 04C0 78 mov a,b ;get sides 04C1 07 rlc ;move side bit to data 0 04C2 CD7F06 call bcdout ;send it 04C5 E1 resume pop h ;recover register pairs 04C6 D1 pop d 04C7 C9 ret 04C8 E61F errfnd ani 1fh ;mask off error value 04CA 21690A lxi h,errtbl ;pickup address of msg table 04CD CDC205 call adjust ;adjust M by twice A 04D0 5E mov e,m ;load low address 04D1 23 inx h ;increment pointer 04D2 56 mov d,m ;load high address 04D3 C9 ret 04D4 0E98 clrmap mvi c,mapsiz ;size of badmap 04D6 21C30A lxi h,badmap ;address of map 04D9 97 sub a ;zero A 04DA 77 maplp mov m,a ;put zero in map 04DB 23 inx h ;advance 04DC 0D dcr c ;count-down 04DD C2DA04 jnz maplp ;until done 04E0 C9 ret 04E1 F5 badtrk push psw ;save error code 04E2 CDA404 call error ;report fault 04E5 2AC10A lhld mappnt ;pickup badmap pointer 04E8 F1 pop psw ;recover error code 04E9 77 mov m,a ;store it in map 04EA 23 inx h ;advance pointer 04EB 22C10A shld mappnt ;store it 04EE C9 ret 04EF CD7C04 cktbl call getscs ;returns # of sectors in C 04F2 41 mov b,c ;save # in B 04F3 21DF06 lxi h,trktbl ;track r/w result table 04F6 7E cklp mov a,m ;load M 04F7 FE40 cpi good ;normal completion 04F9 C44A04 cnz secerr ;report error 04FC 23 inx h ;advance 04FD 0D dcr c ;decrement counter 04FE C2F604 jnz cklp ;repeat till done 0501 97 sub a ;zero A for clrtbl 0502 C30505 jmp clrtbl ;clear table and return 0505 0E1A clrtbl mvi c,tblsz ;size of table 0507 21DF06 lxi h,trktbl ;command result table 050A 77 tblp mov m,a ;fill it with A 050B 23 inx h ;increment memory pointer 050C 0D dcr c 050D C20A05 jnz tblp 0510 C9 ret 0511 E5 rechk push h ;save HL 0512 21CB06 lxi h,rdtrak ;set-up to read a track 0515 225100 shld vector ;to guide controller 0518 3E01 mvi a,1 ;desired track 051A 32CC06 sta rdtktk ;store in command 051D D3EF out startr ;start controller 051F CDD005 call wait1 ;wait for it 0522 21AD06 lxi h,snstat ;sense status command 0525 225100 shld vector ;guide controller 0528 D3EF out startr ;start controller 052A CDD005 call wait1 ;wait for it 052D 3AB006 lda dstat2 ;load desired result byte 0530 E1 pop h ;restore HL 0531 C9 ret 0532 110000 verify lxi d,0 ;zero DE 0535 D5 push d ;save DE 0536 2A0F07 lhld tbytes ;load track size 0539 EB xchg ;move to DE 053A 215B0B lxi h,dskbuf ;set M to disk buffer 053D 7E verlp mov a,m ;pick up memory 053E B8 cmp b ;what it should be 053F CA4505 jz cntinu ;if correct 0542 E3 xthl ;save HL & get error count 0543 23 inx h ;increment error count 0544 E3 xthl ;restore & save 0545 23 cntinu inx h ;increment M 0546 1B dcx d ;decrement size counter 0547 7B mov a,e ;check for zero 0548 B2 ora d 0549 C23D05 jnz verlp ;continue if not 054C E1 pop h ;get error count 054D 7D mov a,l ;put L in A 054E B4 ora h ;zero? 054F C8 rz 0550 E5 push h ;or report 0551 116D07 lxi d,crlf ;carriage return & line feed 0554 CDA806 call wrterm ;send it 0557 E1 pop h ;get error count 0558 CD8206 call putdc ;prints it to terminal 055B 117107 lxi d,cmperr ;compare error msg 055E CDA806 call wrterm ;send it 0561 3ACC06 lda rdtktk ;get track number 0564 CD7F06 call bcdout ;send it 0567 11D109 lxi d,sdms ;side msg 056A CDA806 call wrterm ;send it 056D 3ACD06 lda rdtksd ;load side bit 0570 E680 ani sd2bit ;get side bit 0572 07 rlc ;put it in lowest bit 0573 CD7F06 call bcdout ;send it 0576 C9 ret 0577 2A1407 trkszr lhld logpnt ;pickup log pointer 057A 0600 mvi b,0 ;zero B 057C 7E mov a,m ;get tracks in A 057D FE4D cpi 77 ;8 inch? 057F C28405 jnz skp ;do not change 0582 0603 mvi b,3 ;to skip 5 inch 0584 23 skp inx h ;advance pointer to 2nd log entry 0585 7E mov a,m ;load sector size & sides 0586 E607 ani 7 ;mask size only 0588 80 add b ;covers 5 or 8 inch drives 0589 21FD06 lxi h,tksiz5 ;initialize pointer to sizes 058C CDC205 call adjust ;adjust M by double A 058F 5E mov e,m ;load low byte 0590 23 inx h ;advance pointer 0591 56 mov d,m ;load high byte 0592 EB xchg ;put result in HL 0593 220F07 shld tbytes ;store result 0596 C9 ret 0597 E5 newpat push h ;save HL 0598 21F906 lxi h,patble ;set M to test patterns 059B 3A1307 lda pass ;load pass counter 059E 85 add l ;adjust low byte of address 059F D2A305 jnc nocary ;cover overflow possibility 05A2 24 inr h 05A3 6F nocary mov l,a ;brings M to current pattern 05A4 3A1107 lda track ;get current track number 05A7 1F rar ;check for even or odd 05A8 7E mov a,m ;load test pattern 05A9 D2AD05 jnc even ;skip on alternate tracks 05AC 2F cma ;complement test pattern 05AD E1 even pop h ;restore HL 05AE 47 mov b,a ;save in B 05AF C9 ret 05B0 E5 filbuf push h ;save HL 05B1 2A0F07 lhld tbytes ;track size 05B4 EB xchg ;puts size in DE 05B5 215B0B lxi h,dskbuf ;points M at disk buffer 05B8 70 buflp mov m,b ;stores B in buffer 05B9 23 inx h ;steps M 05BA 1B dcx d ;decrement counter 05BB 7B mov a,e ;to check for zero 05BC B2 ora d 05BD C2B805 jnz buflp ;loop till done 05C0 E1 pop h ;restore HL 05C1 C9 ret 05C2 47 adjust mov b,a ;save A in B 05C3 7D mov a,l ;pickup pointer low byte 05C4 80 add b ;adjust to B 05C5 D2C905 jnc skpnc ;if no overflow 05C8 24 inr h ;adjust H 05C9 80 skpnc add b ;for high byte 05CA D2CE05 jnc skpnc2 ;if no overflow 05CD 24 inr h ;adjust H 05CE 6F skpnc2 mov l,a ;put in L 05CF C9 ret ;pointer is adjusted by A 05D0 D5 wait1 push d ;save DE 05D1 1100A0 lxi d,0a000h ;load as timer-counter 05D4 1B wtloop dcx d ;start countdown 05D5 7A mov a,d 05D6 B3 ora e ;check it for 0 05D7 CAF205 jz restrt ;report to terminal & wboot 05DA D5 skip push d 05DB CDFC05 call ckabrt ;check for keyboard interrupt 05DE D1 pop d ;recover local counters 05DF 3ADE06 lda hlted ;universal halt result 05E2 FE00 cpi 0 ;done yet? 05E4 CAD405 jz wtloop ;wait for it 05E7 E640 ani good ;normal completion? 05E9 CAF205 jz restrt ;abort if not 05EC 97 sub a ;zero A 05ED 32DE06 sta hlted ;clear result byte 05F0 D1 pop d ;recover DE 05F1 C9 ret 05F2 119E09 restrt lxi d,eightn ;no response message 05F5 00 grab4 db trap ;conditional RST 7 05F6 CDA806 call wrterm ;send it 05F9 C30001 jmp start ;re-start test 05FC C5 ckabrt push b ;save BC 05FD E5 push h ;save HL 05FE D5 push d ;save DE 05FF 0E0B mvi c,consta ;asks for console status 0601 CD0500 call bdos 0604 3D dcr a ;0ffh means data ready 0605 D1 pop d ;recover DE 0606 E1 pop h ;recover HL 0607 C1 pop b ;recover BC 0608 C0 rnz ;no abort 0609 0E01 mvi c,conin ;get the character 060B CD0500 call bdos 060E FE1B cpi esc ;escape character 0610 C0 rnz ;ignore anything else 0611 FF rst 7 ;return to DDT 0612 C9 ret 0613 E5 askop push h ;save HL 0614 C5 push b ;save BC 0615 11FA07 lxi d,sidesq ;number of sides question 0618 CDA806 call wrterm ;send to terminal 061B 110000 lxi d,0 ;initialize counter 061E D5 askwt push d ;save counter 061F 0E0B mvi c,consta ;bdos console status code 0621 CD0500 call bdos 0624 D1 pop d ;restore counter 0625 3D dcr a ;A is 1 if data ready 0626 CA3B06 jz ckans ;get the answer 0629 1B dcx d ;else wait awhile 062A 7B mov a,e 062B B2 ora d 062C C21E06 jnz askwt 062F 1E32 mvi e,'2' ;provide default answer 0631 0E02 mvi c,cout ;console out 0633 CD0500 call bdos ;send it 0636 3E32 mvi a,'2' ;default is two-sided 0638 C34006 jmp eval ;insert it for return 063B 0E01 ckans mvi c,conin ;console-in code 063D CD0500 call bdos ;get answer 0640 C1 eval pop b ;recover BC 0641 E1 pop h ;recover HL 0642 FE0D cpi cr ;is it a null answer? 0644 CA0001 jz start ;if so, restart program 0647 FE31 cpi '1' ;or 1 0649 C8 rz ;good answer 064A FA1306 jm askop ;bad answer, ask again 064D FE32 cpi '2' ;good answer 064F C21306 jnz askop ;ask again 0652 3E80 mvi a,80h ;dble-sided bit 0654 C9 ret 0655 112607 seekms lxi d,seekng ;address of seek message 0658 CDA806 call wrterm ;send to terminal 065B C36706 jmp drtype ;tells track and drive number 065E 113B07 rdwrms lxi d,readng ;address of read/write message 0661 CDA806 call wrterm ;send to terminal 0664 C36706 jmp drtype ;track and drive number 0667 2A1407 drtype lhld logpnt ;pick up log pointer 066A 7E mov a,m ;get number of tracks 066B FE4D cpi 77 ;see if eight inch 066D 11AC07 lxi d,eighms ;eight inch drive message 0670 CA7606 jz eightr ;for eight inch message 0673 119A07 lxi d,fivems ;five inch drive message 0676 CDA806 eightr call wrterm ;eight message to terminal 0679 3ACE06 lda rdtkdr ;get number of drive 067C C37F06 jmp bcdout ;send to terminal 067F 6F bcdout mov l,a 0680 2600 mvi h,0 ***************************************************************** * * * Putdc prints the ascii decimal equivalent of the number in HL * * * ***************************************************************** 0682 01F6FF putdc lxi b,-10 0685 D5 phl push d 0686 50 mov d,b 0687 58 mov e,b 0688 09 phllp dad b 0689 13 inx d 068A DA8806 jc phllp 068D E3 xthl 068E EB xchg 068F 7C mov a,h 0690 B5 ora l 0691 C48506 cnz phl 0694 E1 pop h 0695 3E30 mvi a,'0' 0697 85 add l 0698 91 sub c 0699 E5 pchar push h 069A C5 push b 069B D5 push d 069C F5 push psw 069D 5F mov e,a 069E 0E02 mvi c,2 06A0 CD0500 call bdos 06A3 F1 pop psw 06A4 D1 pop d 06A5 C1 pop b 06A6 E1 pop h 06A7 C9 ret 06A8 0E09 wrterm mvi c,wrstrn 06AA C30500 jmp bdos 06AD 22 snstat db snsta ;sense status command 06AE 00 snsdrv db 0 ;physical drive number 06AF 00 dstat1 db 0 ;dstat 1 06B0 00 dstat2 db 0 ;dstat 2 06B1 00 dstat3 db 0 ;dstat 3 06B2 00 snsrlt db 0 ;command result 06B3 26 branch db brnch ;branch command 06B4 DD06 dw comhlt 06B6 00 db 0 ;extended address 06B7 23 setdma db setma ;set dma for seeks 06B8 5B0B dw dskbuf ;all purpose buffer (eightk-8192 bytes) 06BA 00 db 0 ;extended address byte 06BB 26 db brnch ;branch command 06BC DD06 dw comhlt 06BE 00 db 0 ;extended address 06BF 2A wrtrak db wrtrk ;write track command 06C0 00 wrtktk db 0 ; 06C1 00 wrtksd db 0 ; 06C2 00 wrtkdr db 0 ; 06C3 DF06 wrtabl dw trktbl ; 06C5 00 db 0 06C6 00 wtrslt db 0 06C7 26 db brnch ;branch command 06C8 DD06 dw comhlt 06CA 00 db 0 ;extended address 06CB 29 rdtrak db rdtrk ;read track command 06CC 00 rdtktk db 0 ; 06CD 00 rdtksd db 0 ; 06CE 00 rdtkdr db 0 ; 06CF DF06 rdsctb dw trktbl ; 06D1 00 db 0 06D2 00 rtrslt db 0 06D3 26 db brnch ;branch command 06D4 DD06 dw comhlt 06D6 00 db 0 ;extended address 06D7 28 retrys db strtry ;command to set # of retries 06D8 01 db retries ;number of retries 06D9 26 db brnch ;branch command 06DA DD06 dw comhlt ;standard halt 06DC 00 db 0 06DD 25 comhlt db conhlt ;universal halt command 06DE 00 hlted db 0 ;result byte 06DF trktbl ds tblsz ;table used by write track command 06F9 00 patble db 0 ;test patterns 06FA FF db 0ffh 06FB AA db 0aah 06FC 55 db 55h 06FD 0000 tksiz5 dw 0 ;no equivalent on 5 in 06FF 000A dw 2560 ;5 inch single density 0701 0014 dw 5120 ;5 inch double density 0703 000D tksiz8 dw 3328 ;8 inch single density 0705 001A dw 6656 ;8 inch 256 byte sectors 0707 001E dw 7680 ;ditto 512 0709 0020 dw 8192 ;ditto 1024 070B 1A sctrs db 26 ;single density 8 inch 070C 1A db 26 ;double density 256 byte sectors 070D 0F db 15 ;512 byte sectors 070E 08 db 8 ;1024 byte sectors 070F 0000 tbytes dw 0 ;current track size 0711 00 track db 0 ;current track 0712 00 side db 0 ;current side 0713 00 pass db 0 ;current pass 0714 1607 logpnt dw drvlog ;pointer to drvlog 0716 drvlog ds 16 ;drive log (trks, sides & sector sizes) 0726 0A0A0D0D seekng db lf,lf,cr,cr 072A 5465737469 db 'Testing seeks on$' 073B 0A0D0D readng db lf,cr,cr 073E 7465737469 db 'testing read/writes on$' 0755 2054726163trkmsg db ' Track $' 075D 2073696465sidems db ' side $' 0764 2073656374secmsg db ' sector $' 076D 0A0D0D crlf db lf,cr,cr 0770 24 db '$' 0771 20436F6D70cmperr db ' Compare error(s) on Track $' 078D 0A0D0D drvmsg db lf,cr,cr 0790 7068797369 db 'physical $' 079A 203520696Efivems db ' 5 inch physical $' 07AC 203820696Eeighms db ' 8 inch physical $' 07BE 2077726974wrprms db ' write protected$' 07CF 20646F7562dblmsg db ' double-sided drive$' 07E3 0A0D0D nodrvs db lf,cr,cr 07E6 6E6F206472 db 'no drives are ready$' 07FA 3A20486F77sidesq db ': How many sides on this drive? $' 081B 0A0D0D zero db lf,cr,cr 081E 20496D7072 db ' Improper command code$' 0835 0A0D0D one db lf,cr,cr 0838 20496D7072 db ' Improper disk drive value$' 0853 0A0D0D two db lf,cr,cr 0856 204469736B db ' Disk drive not ready$' 086C 0A0D0D three db lf,cr,cr 086F 20496D7072 db ' Improper track value$' 0885 0A0D0D four db lf,cr,cr 0888 20556E7265 db ' Unreadable media$' 089A 0A0D0D five db lf,cr,cr 089D 20496D7072 db ' Improper sector header - no sync byte(s)$' 08C7 0A0D0D six db lf,cr,cr 08CA 2043524320 db ' CRC error in sector header scan$' 08EB 0A0D0D seven db lf,cr,cr 08EE 205365656B db ' Seek error$' 08FA 0A0D0D eight db lf,cr,cr 08FD 20436F6D70 db ' Compare error in sector header scan$' 0922 0A0D0D fourtn db lf,cr,cr 0925 2043524320 db ' CRC error in data field$' 093E 0A0D0D fiftn db lf,cr,cr 0941 20496D7072 db ' Improper sector value$' 0958 0A0D0D sixtn db lf,cr,cr 095B 204D656469 db ' Media write protected$' 0972 0A0D0D sevntn db lf,cr,cr 0975 204C6F7374 db ' Lost data - DMA channel did not respond$' 099E 0A0D0D eightn db lf,cr,cr 09A1 204C6F7374 db ' Lost command - Channel did not respond$' 09C9 2074726163tkmsg db ' track $' 09D1 2073696465sdms db ' side $' 09D8 2073696465sd1ms db ' side one$' 09E2 2073696465sd2ms db ' side two$' 09EC 0A0D0D wrtmsg db lf,cr,cr 09EF 5772697469 db 'Writing all tracks pass $' 0A08 0A0D0D rdnmsg db lf,cr,cr 0A0B 5665726966 db 'Verifying all tracks written on pass $' 0A31 0A0A0D0D onms db lf,lf,cr,cr 0A35 546F204142 db 'To ABORT TEST hit "esc". Type G100 for re-run.' 0A64 0A0A0D0D24 db lf,lf,cr,cr,'$' 0A69 1B08350853errtbl dw zero,one,two,three,four,five,six,seven,eight 0A7B FA08FA08FA dw eight,eight,eight,eight,eight,fourtn 0A87 3E09580972 dw fiftn,sixtn,sevntn,eightn 0A8F ds 50 0AC1 = stack equ $ 0AC1 0000 mappnt dw 0 ;pointer to badmap 0AC3 badmap ds 152 ;76 trks times 2 sides 0B5B dskbuf ds 8192 ;8K disk buffer