N title floppy drive test 3/15/82 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 31E90A lxi sp,stack 0103 11590A lxi d,onms ;start-up message 0106 CDA606 call wrterm ;send it 0109 213E07 lxi h,drvlog ;load log address 010C 223C07 shld logpnt ;initialize pointer 010F 3E26 mvi a,brnch ;branch command 0111 325000 sta channl ;controller starts here 0114 21DF06 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 320607 sta hlted ;zero halt result byte 0121 D3EF out startr ;start controller 0123 CD1106 call wait1 ;wait for it to finish 0126 21FF06 lxi h,retrys ;address of set tries cmnd 0129 225100 shld vector ;to guide controller 012C 97 sub a ;zero A 012D 320607 sta hlted ;clear halt result byte 0130 D3EF out startr ;start controller 0132 CD1106 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 21D506 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 32D606 sta snsdrv ;tell sense command 014E 97 sub a ;zero A 014F 32DA06 sta snsrlt ;clear result byte of sense command 0152 320607 sta hlted ;clear halt command result byte 0155 D3EF out startr ;start controller 0157 CD1106 call wait1 ;wait for it to finish 015A 3ADA06 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 C4ED04 cnz logerr ;report to terminal 0170 2A3C07 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 223C07 shld logpnt ;store pointer 017C C9 ret 017D C5 ckit push b ;save BC pair 017E 11B507 lxi d,drvmsg ;for operator 0181 CDA606 call wrterm ;send it 0184 C1 pop b ;recover BC 0185 78 mov a,b ;put drive # in A 0186 CDAB06 call hexout ;send to terminal 0189 3AD906 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 CDFB04 call loger2 ;advises terminal 0196 C37001 jmp spec ;goes on to next drive 0199 3AD706 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 2A3C07 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 CDCA05 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 3AD806 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 223C07 shld logpnt ;store the updated pointer 01BC C9 ret 01BD 2A3C07 eighin lhld logpnt ;load log pointer 01C0 364D mvi m,77 ;number of tracks 01C2 23 inx h ;next log entry 01C3 3AD806 lda dstat2 ;sector size 01C6 FE00 cpi 0 ;may be wrong if on track 0 01C8 CC7304 cz rechk ;moves to track 1 and rechecks 01CB 47 mov b,a ;save in B 01CC 3AD906 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 223C07 shld logpnt ;save it 01DC C9 ret 01DD 0E08 test mvi c,8 ;number of drive possibilities 01DF 213E07 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 223C07 go shld logpnt ;save pointer 01F2 3E08 mvi a,8 ;number of drive possibilities 01F4 91 sub c ;current drive number 01F5 32EA06 sta wrtkdr ;tell commands 01F8 32F606 sta rdtkdr 01FB E5 push h ;save HL 01FC C5 push b ;and BC 01FD CD3C06 call seekms ;advise terminal 0200 CD1102 call seeks ;do seek tests 0203 CD4506 call rdwrms ;advise terminal 0206 CDDC02 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 C3E201 jmp next ;and loop 0211 21F306 seeks lxi h,rdtrak ;read track command address 0214 225100 shld vector ;guide controller 0217 3E80 mvi a,80h ;to abort command 0219 CD0506 call clrtbl ;writes A to command table 021C 2A3C07 lhld logpnt ;pickup pointer 021F 56 mov d,m ;put # of tracks in D 0220 15 dcr d ;to get highest track number 0221 1E00 mvi e,0 ;Zero E 0223 CD3402 call pat1 ;short-long-short 0226 2A3C07 lhld logpnt ;pickup log pointer 0229 56 mov d,m ;number of tracks to D 022A 15 dcr d ;to get highest track number 022B CD5502 call pat2 ;long-short-long 022E 1600 mvi d,0 ;start at 0 0230 CD7902 call pat3 ;butterfly (+2-1 out, then -2+1 back) 0233 C9 ret 0234 7A pat1 mov a,d ;D starts at highest track number 0235 CD9B02 call seek ;seeks to track in A 0238 7B mov a,e ;E starts at track 0 0239 CD9B02 call seek 023C 15 dcr d ;count down 023D FA4502 jm reverse ;no tracks left 0240 1C inr e ;count up 0241 BE cmp m ;number of tracks 0242 C23402 jnz pat1 0245 14 reverse inr d ;count up 0246 7A mov a,d 0247 BE cmp m ;M has number of tracks 0248 C8 rz 0249 CD9B02 call seek ;else seek 024C 1D dcr e 024D F8 rm ;no tracks left 024E 7B mov a,e 024F CD9B02 call seek 0252 C34502 jmp reverse 0255 7A pat2 mov a,d ;D starts at highest track number 0256 1F rar ;divide by 2 0257 57 mov d,a ;reset D 0258 5F mov e,a ;set E=D at start 0259 7A pat2lp mov a,d ;start at middle track 025A CD9B02 call seek ;seeks to track in A 025D 1D dcr e ;count E down, D up 025E FA6A02 jm phase2 ;reverse direction 0261 7B mov a,e ;else read it 0262 CD9B02 call seek 0265 14 inr d ;count up in first phase 0266 BE cmp m ;number of tracks 0267 C25902 jnz pat2lp 026A 1C phase2 inr e ;count up 026B 7B mov a,e 026C CD9B02 call seek 026F 15 dcr d ;count down 0270 7A mov a,d ;to check 0271 BB cmp e ;looking for crossing point 0272 F8 rm ;finished 0273 CD9B02 call seek ;else continue 0276 C36A02 jmp phase2 ;loop 0279 7A pat3 mov a,d ;D starts at 0 027A CD9B02 call seek ;takes drive back one in loop 027D 7A mov a,d 027E C602 adi 2 ;jump ahead two 0280 BE cmp m ;number of tracks 0281 CA8B02 jz phaze2 ;reverse pattern 0284 CD9B02 call seek 0287 14 inr d ;and back one 0288 C37902 jmp pat3 ;repeat 028B 3D phaze2 dcr a ;for first shot only 028C CD9B02 phlp call seek 028F 7A mov a,d 0290 DE02 sbi 2 ;in two 0292 F8 rm 0293 CD9B02 call seek 0296 15 dcr d ;and back one 0297 7A mov a,d 0298 C38C02 jmp phlp 029B 32F406 seek sta rdtktk ;start at track indicated by A 029E 323907 sta track ;keep record 02A1 D5 push d ;save DE 02A2 E5 push h ;save HL 02A3 4F mov c,a ;save track in C 02A4 2A3C07 lhld logpnt ;get log pointer 02A7 23 inx h ;advance log pointer to sides byte 02A8 7E mov a,m ;load byte 02A9 2B dcx h ;return pointer 02AA E680 ani 80h ;see if dblesided bit is on 02AC CAB402 jz onesid ;if not, forget it 02AF 3AF506 lda rdtksd ;else load side byte 02B2 EE80 xri 80h ;toggle it 02B4 32F506 onesid sta rdtksd ;replace it 02B7 323A07 sta side ;save it 02BA 47 mov b,a ;save side byte in B 02BB C5 push b ;save BC 02BC 97 sub a ;zero A 02BD 32FA06 sta rtrslt ;clear result byte 02C0 D3EF out startr ;start controller 02C2 CD1106 call wait1 ;wait for it to finish 02C5 C1 pop b ;restore BC 02C6 3AFA06 lda rtrslt ;check the results 02C9 FE40 cpi good ;normal completion? 02CB E1 pop h ;restore HL 02CC D1 pop d ;restore DE 02CD C8 rz ;gives normal return 02CE FE82 cpi notrdy ;drive gone away? 02D0 C25D05 jnz error ;if not, report error 02D3 CD5D05 call error ;if yes, report and 02D6 E1 pop h ;clear 3 returns off stack and 02D7 E1 pop h 02D8 E1 pop h 02D9 C30902 jmp endrv ;go to next drive 02DC 97 rdwrts sub a ;zero A 02DD 323B07 sta pass ;clear pass counter 02E0 CD0506 call clrtbl ;clears command table 02E3 CD9404 call trkszr ;puts size of track at tbytes 02E6 00 nop 02E7 21E706 tstdat lxi h,wrtrak ;write track command address 02EA 225100 shld vector ;to guide controller 02ED CD0603 call wrdrv ;writes all tracks 02F0 21F306 lxi h,rdtrak ;read track command address 02F3 225100 shld vector ;guide controller 02F6 CD9B03 call rddrv ;reads and compares all 02F9 3A3B07 lda pass ;get pass counter 02FC 3C inr a ;increment it 02FD 323B07 sta pass ;put it back 0300 FE04 cpi 4 ;one to many 0302 C2E702 jnz tstdat ;continue data test 0305 C9 ret 0306 11140A wrdrv lxi d,wrtmsg ;writing message 0309 CDA606 call wrterm ;send it 030C 3A3B07 lda pass ;get pass number 030F CDAB06 call hexout ;send it 0312 CD9905 call clrmap ;clears badmap to zeros 0315 21EB0A lxi h,badmap ;address of map 0318 22E90A shld mappnt ;initializes pointer to badmap 031B 2A3C07 lhld logpnt ;pickup log pointer 031E 46 mov b,m ;number of tracks 031F 97 sub a ;zero A 0320 32E906 sta wrtksd ;start with side 0 0323 323A07 sta side ;store for error message 0326 C5 trklp push b ;save track counter 0327 E5 push h ;save log pointer 0328 7E mov a,m ;number of tracks 0329 90 sub b ;track counter 032A 4F mov c,a ;save track in C 032B 32E806 sta wrtktk ;current track to command 032E 323907 sta track ;and record 0331 CDB404 call newpat ;get pattern for this track 0334 CDCD04 call filbuf ;writes it to disk buffer 0337 97 wttk sub a ;zero A 0338 32EE06 sta wtrslt ;clear result byte 033B D3EF out startr ;starts controller 033D CD1106 call wait1 ;wait for it to finish 0340 3AE906 lda wrtksd ;get the side byte 0343 47 mov b,a ;save it in B 0344 3AEE06 lda wtrslt ;load result byte 0347 FE40 cpi good ;ordinary completion 0349 CA6603 jz update ;gives normal return 034C FE82 cpi notrdy ;drive gone away? 034E CA5F03 jz abrtdr ;end this drive 0351 2AE90A lhld mappnt ;pickup pointer to badmap 0354 77 mov m,a ;store error code 0355 23 inx h ;advance pointer 0356 22E90A shld mappnt ;store pointer 0359 CD5D05 call error ;report and continue 035C C37003 jmp aswas ;normal completion 035F E1 abrtdr pop h ;clear 2 pushes & 2 returns off stack 0360 E1 pop h 0361 E1 pop h 0362 E1 pop h 0363 C30902 jmp endrv ;go to next drive 0366 CDB405 update call cktbl ;check sector results table 0369 2AE90A lhld mappnt ;pickup pointer to badmap 036C 23 inx h ;advance it 036D 22E90A shld mappnt ;store it 0370 2A3C07 aswas lhld logpnt ;get log pointer 0373 23 inx h ;advance to side byte 0374 7E mov a,m ;load it 0375 E680 ani 80h ;check sides bit 0377 CA9403 jz cntdwn ;if single-sided, forget it 037A 3AE906 lda wrtksd ;load command side byte 037D E680 ani 80h ;check side bit 037F C28D03 jnz reset ;already done 0382 3E80 mvi a,80h ;set it 0384 32E906 sta wrtksd ;store in command 0387 323A07 sta side ;and store it 038A C33703 jmp wttk 038D 97 reset sub a ;reset side bit for next track 038E 32E906 sta wrtksd ;store in command 0391 323A07 sta side ;and store it 0394 E1 cntdwn pop h ;restore pointer 0395 C1 pop b ;restore BC 0396 05 dcr b ;count down the tracks 0397 C22603 jnz trklp ;do another track 039A C9 ret ;pass complete 039B 11300A rddrv lxi d,rdnmsg ;reading message 039E CDA606 call wrterm ;send it 03A1 3A3B07 lda pass ;get pass 03A4 CDAB06 call hexout ;send it 03A7 97 sub a ;zero A 03A8 32F506 sta rdtksd ;start with side 0 03AB 323A07 sta side ;and save record 03AE 21EB0A lxi h,badmap ;initialize pointer 03B1 2B dcx h ;to one less 03B2 22E90A shld mappnt ;and store it 03B5 2A3C07 lhld logpnt ;get log pointer 03B8 46 mov b,m ;loads # of tracks to B 03B9 C5 trklp2 push b ;save track counter 03BA E5 push h ;save log pointer 03BB 7E mov a,m ;get number of tracks 03BC 90 sub b ;track counter 03BD 4F mov c,a ;save track in C 03BE 32F406 sta rdtktk ;store in command 03C1 323907 sta track ;track record 03C4 2AE90A rd lhld mappnt ;pickup badmap pointer 03C7 23 inx h ;advance it 03C8 22E90A shld mappnt ;put it back 03CB 7E mov a,m ;load it 03CC E6FF ani 0ffh ;see if its clear 03CE C20304 jnz nxtrk ;skip track if not 03D1 97 sub a ;zero A 03D2 32FA06 sta rtrslt ;clear result byte 03D5 D3EF out startr ;start controller 03D7 CD1106 call wait1 ;wait for it to finish 03DA 3AF506 lda rdtksd ;get side byte 03DD 47 mov b,a ;save it in B 03DE 3AFA06 lda rtrslt ;get result byte 03E1 FE40 cpi good ;compare 03E3 CAF803 jz okay ;gives normal return 03E6 FE82 cpi notrdy ;drive gone away? 03E8 CAF103 jz abort ;end this drive 03EB CD5D05 call error ;report and continue 03EE C3F803 jmp okay ;normal completion 03F1 E1 abort pop h ;clear 2 pushes & 2 returns off stack 03F2 E1 pop h 03F3 E1 pop h 03F4 E1 pop h 03F5 C30902 jmp endrv ;go to next drive 03F8 C5 okay push b ;save BC 03F9 CDB405 call cktbl ;check sector results table 03FC C1 pop b ;restore BC 03FD CDB404 call newpat ;get test pattern 0400 CD2E04 call verify ;read and compare data 0403 2A3C07 nxtrk lhld logpnt ;get log pointer 0406 23 inx h ;advance to side byte 0407 7E mov a,m ;load it 0408 E680 ani 80h ;check sides bit 040A CA2704 jz ignor ;if single-sided, forget it 040D 3AF506 lda rdtksd ;load command side byte 0410 E680 ani 80h ;check side bit 0412 C22004 jnz reset2 ;already done 0415 3E80 mvi a,80h ;set it 0417 32F506 sta rdtksd ;store in command 041A 323A07 sta side ;save record 041D C3C403 jmp rd ;do other side 0420 97 reset2 sub a ;reset side bit for next track 0421 32F506 sta rdtksd ;store in command 0424 323A07 sta side ;save record 0427 E1 ignor pop h ;restore pointer 0428 C1 pop b ;recover counter 0429 05 dcr b ;count down tracks 042A C2B903 jnz trklp2 ;do next track 042D C9 ret ;finish 042E 110000 verify lxi d,0 ;zero DE 0431 D5 push d ;save DE 0432 2A3707 lhld tbytes ;load track size 0435 EB xchg ;move to DE 0436 21830B lxi h,dskbuf ;set M to disk buffer 0439 7E verlp mov a,m ;pick up memory 043A B8 cmp b ;what it should be 043B CA4104 jz cntinu ;if correct 043E E3 xthl ;save HL & get error count 043F 23 inx h ;increment error count 0440 E3 xthl ;restore & save 0441 23 cntinu inx h ;increment M 0442 1B dcx d ;decrement size counter 0443 7B mov a,e ;check for zero 0444 B2 ora d 0445 C23904 jnz verlp ;continue if not 0448 E1 pop h ;get error count 0449 7D mov a,l ;put L in A 044A B4 ora h ;zero? 044B C8 rz 044C E5 push h ;or report 044D 119507 lxi d,crlf ;carriage return & line feed 0450 CDA606 call wrterm ;send it 0453 E1 pop h ;get error count 0454 CD8006 call putdc ;prints it to terminal 0457 119907 lxi d,cmperr ;compare error msg 045A CDA606 call wrterm ;send it 045D 3AF406 lda rdtktk ;get track number 0460 CD7D06 call bcdout ;send it 0463 11F909 lxi d,sdms ;side msg 0466 CDA606 call wrterm ;send it 0469 3AF506 lda rdtksd ;load side bit 046C E680 ani sd2bit ;get side bit 046E 07 rlc ;put it in lowest bit 046F CD7D06 call bcdout ;send it 0472 C9 ret 0473 E5 rechk push h ;save HL 0474 21F306 lxi h,rdtrak ;set-up to read a track 0477 225100 shld vector ;to guide controller 047A 3E01 mvi a,1 ;desired track 047C 32F406 sta rdtktk ;store in command 047F D3EF out startr ;start controller 0481 CD1106 call wait1 ;wait for it 0484 21D506 lxi h,snstat ;sense status command 0487 225100 shld vector ;guide controller 048A D3EF out startr ;start controller 048C CD1106 call wait1 ;wait for it 048F 3AD806 lda dstat2 ;load desired result byte 0492 E1 pop h ;restore HL 0493 C9 ret 0494 2A3C07 trkszr lhld logpnt ;pickup log pointer 0497 0600 mvi b,0 ;zero B 0499 7E mov a,m ;get tracks in A 049A FE4D cpi 77 ;8 inch? 049C C2A104 jnz skp ;do not change 049F 0603 mvi b,3 ;to skip 5 inch 04A1 23 skp inx h ;advance pointer to 2nd log entry 04A2 7E mov a,m ;load sector size & sides 04A3 E607 ani 7 ;mask size only 04A5 80 add b ;covers 5 or 8 inch drives 04A6 212507 lxi h,tksiz5 ;initialize pointer to sizes 04A9 CDDF04 call adjust ;adjust M by double A 04AC 5E mov e,m ;load low byte 04AD 23 inx h ;advance pointer 04AE 56 mov d,m ;load high byte 04AF EB xchg ;put result in HL 04B0 223707 shld tbytes ;store result 04B3 C9 ret 04B4 E5 newpat push h ;save HL 04B5 212107 lxi h,patble ;set M to test patterns 04B8 3A3B07 lda pass ;load pass counter 04BB 85 add l ;adjust low byte of address 04BC D2C004 jnc nocary ;cover overflow possibility 04BF 24 inr h 04C0 6F nocary mov l,a ;brings M to current pattern 04C1 3A3907 lda track ;get current track number 04C4 1F rar ;check for even or odd 04C5 7E mov a,m ;load test pattern 04C6 D2CA04 jnc even ;skip on alternate tracks 04C9 2F cma ;complement test pattern 04CA E1 even pop h ;restore HL 04CB 47 mov b,a ;save in B 04CC C9 ret 04CD E5 filbuf push h ;save HL 04CE 2A3707 lhld tbytes ;track size 04D1 EB xchg ;puts size in DE 04D2 21830B lxi h,dskbuf ;points M at disk buffer 04D5 70 buflp mov m,b ;stores B in buffer 04D6 23 inx h ;steps M 04D7 1B dcx d ;decrement counter 04D8 7B mov a,e ;to check for zero 04D9 B2 ora d 04DA C2D504 jnz buflp ;loop till done 04DD E1 pop h ;restore HL 04DE C9 ret 04DF 47 adjust mov b,a ;save A in B 04E0 7D mov a,l ;pickup pointer low byte 04E1 80 add b ;adjust to B 04E2 D2E604 jnc skpnc ;if no overflow 04E5 24 inr h ;adjust H 04E6 80 skpnc add b ;for high byte 04E7 D2EB04 jnc skpnc2 ;if no overflow 04EA 24 inr h ;adjust H 04EB 6F skpnc2 mov l,a ;put in L 04EC C9 ret ;pointer is adjusted by A 04ED F5 logerr push psw ;save error code 04EE C5 push b ;save drive number in B 04EF 11B507 lxi d,drvmsg ;drive message 04F2 CDA606 call wrterm ;send it 04F5 C1 pop b ;get drive number 04F6 78 mov a,b ;move it 04F7 CDAB06 call hexout ;send it 04FA F1 pop psw ;recover error code 04FB CD8D05 loger2 call errfnd ;loads DE to err msg 04FE 13 inx d ;skip cr & lfs 04FF 13 inx d 0500 13 inx d 0501 C3A606 jmp wrterm ;send to terminal 0504 E5 secerr push h ;save HL 0505 C5 push b ;and BC 0506 CD8D05 call errfnd ;loads DE with err msg 0509 CDA606 call wrterm ;sends it 050C 117D07 lxi d,trkmsg ;track message 050F CDA606 call wrterm ;send it 0512 3A3907 lda track ;get track number 0515 CD7D06 call bcdout ;send it 0518 118507 lxi d,sidems ;side msg 051B CDA606 call wrterm ;send it 051E 3A3A07 lda side ;get current side 0521 07 rlc ;move side bit to data 0 0522 CD7D06 call bcdout ;send it 0525 118C07 lxi d,secmsg ;sector message 0528 CDA606 call wrterm ;send it 052B C1 pop b ;recover BC 052C C5 push b ;and re-save 052D 78 mov a,b ;number of sectors 052E 91 sub c ;counter 052F CD7D06 call bcdout ;send it and return 0532 C1 pop b ;restore BC 0533 E1 pop h ;restore HL 0534 C9 ret 0535 2A3C07 getscs lhld logpnt ;get drive log pointer 0538 7E mov a,m ;get # of tracks 0539 FE4D cpi 77 ;if 8 inch 053B CA4105 jz not5 ;skip 5 inch 053E 0E0A mvi c,0ah ;10 sectors for five inch 0540 C9 ret 0541 3A3907 not5 lda track ;load current track 0544 FE00 cpi 0 ;see if its track 0 0546 C24C05 jnz not0 ;skip if its not 0549 0E1A mvi c,26 ;else its 26 sectors 054B C9 ret 054C 23 not0 inx h ;advance to sector size 054D 7E mov a,m ;load sector size byte 054E E607 ani 7 ;low bits only 0550 47 mov b,a ;save in B 0551 213307 lxi h,sctrs ;point M at table 0554 7D mov a,l ;adjust M by B 0555 80 add b 0556 D25A05 jnc notovr ;in case of carry 0559 24 inr h 055A 6F notovr mov l,a ;M now adjusted 055B 4E mov c,m ;put number of sectors in C 055C C9 ret 055D D5 error push d 055E E5 push h 055F C5 push b ;save register pairs 0560 CD8D05 call errfnd ;loads DE with error msg 0563 CDA606 call wrterm ;send to terminal 0566 11F109 lxi d,tkmsg ;track message 0569 CDA606 call wrterm ;send it 056C 3A3907 lda track ;get current track 056F CD7D06 call bcdout ;and send it 0572 11F909 lxi d,sdms ;side msg 0575 CDA606 call wrterm ;send it 0578 C1 pop b 0579 78 mov a,b ;get sides 057A 07 rlc ;move side bit to data 0 057B CD7D06 call bcdout ;send it 057E E1 resume pop h ;recover register pairs 057F D1 pop d 0580 C9 ret 0581 11000A sd1msg lxi d,sd1ms ;side 1 msg 0584 C3A606 jmp wrterm ;send it 0587 110A0A sd2msg lxi d,sd2ms ;side 2 msg 058A C3A606 jmp wrterm ;send it 058D E61F errfnd ani 1fh ;mask off error value 058F 21910A lxi h,errtbl ;pickup address of msg table 0592 CDDF04 call adjust ;adjust M by twice A 0595 5E mov e,m ;load low address 0596 23 inx h ;increment pointer 0597 56 mov d,m ;load high address 0598 C9 ret 0599 0E98 clrmap mvi c,mapsiz ;size of badmap 059B 21EB0A lxi h,badmap ;address of map 059E 97 sub a ;zero A 059F 77 maplp mov m,a ;put zero in map 05A0 23 inx h ;advance 05A1 0D dcr c ;count-down 05A2 C29F05 jnz maplp ;until done 05A5 C9 ret 05A6 F5 badtrk push psw ;save error code 05A7 CD5D05 call error ;report fault 05AA 2AE90A lhld mappnt ;pickup badmap pointer 05AD F1 pop psw ;recover error code 05AE 77 mov m,a ;store it in map 05AF 23 inx h ;advance pointer 05B0 22E90A shld mappnt ;store it 05B3 C9 ret 05B4 CD3505 cktbl call getscs ;returns # of sectors in C 05B7 41 mov b,c ;save # in B 05B8 210707 lxi h,trktbl ;track r/w result table 05BB 7E cklp mov a,m ;load M 05BC FE40 cpi good ;normal completion 05BE C40405 cnz secerr ;report error 05C1 23 inx h ;advance 05C2 0D dcr c ;decrement counter 05C3 C2BB05 jnz cklp ;repeat till done 05C6 97 sub a ;zero A for clrtbl 05C7 C30506 jmp clrtbl ;clear table and return 05CA E5 askop push h ;save HL 05CB C5 push b ;save BC 05CC 112208 lxi d,sidesq ;number of sides question 05CF CDA606 call wrterm ;send to terminal 05D2 110000 lxi d,0 ;initialize counter 05D5 D5 askwt push d ;save counter 05D6 0E0B mvi c,consta ;bdos console status code 05D8 CD0500 call bdos 05DB D1 pop d ;restore counter 05DC 3D dcr a ;A is 1 if data ready 05DD CAEB05 jz ckans ;get the answer 05E0 1B dcx d ;else wait awhile 05E1 7B mov a,e 05E2 B2 ora d 05E3 C2D505 jnz askwt 05E6 3E32 mvi a,'2' ;default is two-sided 05E8 C3F005 jmp eval ;insert it for return 05EB 0E01 ckans mvi c,conin ;console-in code 05ED CD0500 call bdos ;get answer 05F0 C1 eval pop b ;recover BC 05F1 E1 pop h ;recover HL 05F2 FE0D cpi cr ;is it a null answer? 05F4 CA0001 jz start ;if so, restart program 05F7 FE31 cpi '1' ;or 1 05F9 C8 rz ;good answer 05FA FACA05 jm askop ;bad answer, ask again 05FD FE32 cpi '2' ;good answer 05FF C2CA05 jnz askop ;ask again 0602 3E80 mvi a,80h ;dble-sided bit 0604 C9 ret 0605 0E1A clrtbl mvi c,tblsz ;size of table 0607 210707 lxi h,trktbl ;command result table 060A 77 tblp mov m,a ;fill it with A 060B 23 inx h ;increment memory pointer 060C 0D dcr c 060D C20A06 jnz tblp 0610 C9 ret 0611 D5 wait1 push d ;save DE 0612 1100A0 lxi d,0a000h ;load as timer-counter 0615 1B wtloop dcx d ;start countdown 0616 7A mov a,d 0617 B3 ora e ;check it for 0 0618 CA3306 jz restrt ;report to terminal & wboot 061B D5 skip push d 061C CD6606 call ckabrt ;check for keyboard interrupt 061F D1 pop d ;recover local counters 0620 3A0607 lda hlted ;universal halt result 0623 FE00 cpi 0 ;done yet? 0625 CA1506 jz wtloop ;wait for it 0628 E640 ani good ;normal completion? 062A CA3306 jz restrt ;abort if not 062D 97 sub a ;zero A 062E 320607 sta hlted ;clear result byte 0631 D1 pop d ;recover DE 0632 C9 ret 0633 11C609 restrt lxi d,eightn ;no response message 0636 CDA606 call wrterm ;send it 0639 C30001 jmp start ;re-start test 063C 114E07 seekms lxi d,seekng ;address of seek message 063F CDA606 call wrterm ;send to terminal 0642 C34E06 jmp drtype ;tells track and drive number 0645 116307 rdwrms lxi d,readng ;address of read/write message 0648 CDA606 call wrterm ;send to terminal 064B C34E06 jmp drtype ;track and drive number 064E 2A3C07 drtype lhld logpnt ;pick up log pointer 0651 7E mov a,m ;get number of tracks 0652 FE4D cpi 77 ;see if eight inch 0654 11D407 lxi d,eighms ;eight inch drive message 0657 CA5D06 jz eightr ;for eight inch message 065A 11C207 lxi d,fivems ;five inch drive message 065D CDA606 eightr call wrterm ;eight message to terminal 0660 3AF606 lda rdtkdr ;get number of drive 0663 C3AB06 jmp hexout ;send to terminal 0666 C5 ckabrt push b ;save BC 0667 E5 push h ;save HL 0668 D5 push d ;save DE 0669 0E0B mvi c,consta ;asks for console status 066B CD0500 call bdos 066E 3D dcr a ;0ffh means data ready 066F D1 pop d ;recover DE 0670 E1 pop h ;recover HL 0671 C1 pop b ;recover BC 0672 C0 rnz ;no abort 0673 0E01 mvi c,conin ;get the character 0675 CD0500 call bdos 0678 FE1B cpi esc ;escape character 067A C0 rnz ;ignore anything else 067B FF rst 7 ;return to DDT 067C C9 ret 067D 6F bcdout mov l,a 067E 2600 mvi h,0 ***************************************************************** * * * Putdc prints the ascii decimal equivalent of the number in HL * * * ***************************************************************** 0680 01F6FF putdc lxi b,-10 0683 D5 phl push d 0684 50 mov d,b 0685 58 mov e,b 0686 09 phllp dad b 0687 13 inx d 0688 DA8606 jc phllp 068B E3 xthl 068C EB xchg 068D 7C mov a,h 068E B5 ora l 068F C48306 cnz phl 0692 E1 pop h 0693 3E30 mvi a,'0' 0695 85 add l 0696 91 sub c 0697 E5 pchar push h 0698 C5 push b 0699 D5 push d 069A F5 push psw 069B 5F mov e,a 069C 0E02 mvi c,2 069E CD0500 call bdos 06A1 F1 pop psw 06A2 D1 pop d 06A3 C1 pop b 06A4 E1 pop h 06A5 C9 ret 06A6 0E09 wrterm mvi c,wrstrn 06A8 C30500 jmp bdos 06AB F5 hexout push psw 06AC 0F rrc 06AD 0F rrc 06AE 0F rrc 06AF 0F rrc 06B0 CDBC06 call pnib 06B3 F1 pop psw 06B4 CDBC06 call pnib 06B7 3E20 mvi a,' ' 06B9 C3CE06 jmp pchr 06BC E60F pnib ani 0fh 06BE FE0A cpi 10 06C0 D2C806 jnc p10 06C3 C630 adi '0' 06C5 C3CA06 jmp prn 06C8 C657 p10 adi 'a'-10 06CA CDCE06 prn call pchr 06CD C9 ret 06CE 0E02 pchr mvi c,cout 06D0 5F mov e,a 06D1 CD0500 call bdos 06D4 C9 ret 06D5 22 snstat db snsta ;sense status command 06D6 00 snsdrv db 0 ;physical drive number 06D7 00 dstat1 db 0 ;dstat 1 06D8 00 dstat2 db 0 ;dstat 2 06D9 00 dstat3 db 0 ;dstat 3 06DA 00 snsrlt db 0 ;command result 06DB 26 branch db brnch ;branch command 06DC 0507 dw comhlt 06DE 00 db 0 ;extended address 06DF 23 setdma db setma ;set dma for seeks 06E0 830B dw dskbuf ;all purpose buffer (eightk-8192 bytes) 06E2 00 db 0 ;extended address byte 06E3 26 db brnch ;branch command 06E4 0507 dw comhlt 06E6 00 db 0 ;extended address 06E7 2A wrtrak db wrtrk ;write track command 06E8 00 wrtktk db 0 ; 06E9 00 wrtksd db 0 ; 06EA 00 wrtkdr db 0 ; 06EB 0707 wrtabl dw trktbl ; 06ED 00 db 0 06EE 00 wtrslt db 0 06EF 26 db brnch ;branch command 06F0 0507 dw comhlt 06F2 00 db 0 ;extended address 06F3 29 rdtrak db rdtrk ;read track command 06F4 00 rdtktk db 0 ; 06F5 00 rdtksd db 0 ; 06F6 00 rdtkdr db 0 ; 06F7 0707 rdsctb dw trktbl ; 06F9 00 db 0 06FA 00 rtrslt db 0 06FB 26 db brnch ;branch command 06FC 0507 dw comhlt 06FE 00 db 0 ;extended address 06FF 28 retrys db strtry ;command to set # of retries 0700 01 db retries ;number of retries 0701 26 db brnch ;branch command 0702 0507 dw comhlt ;standard halt 0704 00 db 0 0705 25 comhlt db conhlt ;universal halt command 0706 00 hlted db 0 ;result byte 0707 trktbl ds tblsz ;table used by write track command 0721 00 patble db 0 ;test patterns 0722 FF db 0ffh 0723 AA db 0aah 0724 55 db 55h 0725 0000 tksiz5 dw 0 ;no equivalent on 5 in 0727 000A dw 2560 ;5 inch single density 0729 0014 dw 5120 ;5 inch double density 072B 000D tksiz8 dw 3328 ;8 inch single density 072D 001A dw 6656 ;8 inch 256 byte sectors 072F 001E dw 7680 ;ditto 512 0731 0020 dw 8192 ;ditto 1024 0733 1A sctrs db 26 ;single density 8 inch 0734 1A db 26 ;double density 256 byte sectors 0735 0F db 15 ;512 byte sectors 0736 08 db 8 ;1024 byte sectors 0737 0000 tbytes dw 0 ;current track size 0739 00 track db 0 ;current track 073A 00 side db 0 ;current side 073B 00 pass db 0 ;current pass 073C 3E07 logpnt dw drvlog ;pointer to drvlog 073E drvlog ds 16 ;drive log (trks, sides & sector sizes) 074E 0A0A0D0D seekng db lf,lf,cr,cr 0752 5465737469 db 'Testing seeks on$' 0763 0A0D0D readng db lf,cr,cr 0766 7465737469 db 'testing read/writes on$' 077D 2054726163trkmsg db ' Track $' 0785 2073696465sidems db ' side $' 078C 2073656374secmsg db ' sector $' 0795 0A0D0D crlf db lf,cr,cr 0798 24 db '$' 0799 20436F6D70cmperr db ' Compare error(s) on Track $' 07B5 0A0D0D drvmsg db lf,cr,cr 07B8 7068797369 db 'physical $' 07C2 203520696Efivems db ' 5 inch physical $' 07D4 203820696Eeighms db ' 8 inch physical $' 07E6 2077726974wrprms db ' write protected$' 07F7 20646F7562dblmsg db ' double-sided drive$' 080B 0A0D0D nodrvs db lf,cr,cr 080E 6E6F206472 db 'no drives are ready$' 0822 3A20486F77sidesq db ': How many sides on this drive? $' 0843 0A0D0D zero db lf,cr,cr 0846 20496D7072 db ' Improper command code$' 085D 0A0D0D one db lf,cr,cr 0860 20496D7072 db ' Improper disk drive value$' 087B 0A0D0D two db lf,cr,cr 087E 204469736B db ' Disk drive not ready$' 0894 0A0D0D three db lf,cr,cr 0897 20496D7072 db ' Improper track value$' 08AD 0A0D0D four db lf,cr,cr 08B0 20556E7265 db ' Unreadable media$' 08C2 0A0D0D five db lf,cr,cr 08C5 20496D7072 db ' Improper sector header - no sync byte(s)$' 08EF 0A0D0D six db lf,cr,cr 08F2 2043524320 db ' CRC error in sector header scan$' 0913 0A0D0D seven db lf,cr,cr 0916 205365656B db ' Seek error$' 0922 0A0D0D eight db lf,cr,cr 0925 20436F6D70 db ' Compare error in sector header scan$' 094A 0A0D0D fourtn db lf,cr,cr 094D 2043524320 db ' CRC error in data field$' 0966 0A0D0D fiftn db lf,cr,cr 0969 20496D7072 db ' Improper sector value$' 0980 0A0D0D sixtn db lf,cr,cr 0983 204D656469 db ' Media write protected$' 099A 0A0D0D sevntn db lf,cr,cr 099D 204C6F7374 db ' Lost data - DMA channel did not respond$' 09C6 0A0D0D eightn db lf,cr,cr 09C9 204C6F7374 db ' Lost command - Channel did not respond$' 09F1 2074726163tkmsg db ' track $' 09F9 2073696465sdms db ' side $' 0A00 2073696465sd1ms db ' side one$' 0A0A 2073696465sd2ms db ' side two$' 0A14 0A0D0D wrtmsg db lf,cr,cr 0A17 5772697469 db 'Writing all tracks pass $' 0A30 0A0D0D rdnmsg db lf,cr,cr 0A33 5665726966 db 'Verifying all tracks written on pass $' 0A59 0A0A0D0D onms db lf,lf,cr,cr 0A5D 546F204142 db 'To ABORT TEST hit "esc". Type G100 for re-run.' 0A8C 0A0A0D0D24 db lf,lf,cr,cr,'$' 0A91 43085D087Berrtbl dw zero,one,two,three,four,five,six,seven,eight 0AA3 2209220922 dw eight,eight,eight,eight,eight,fourtn 0AAF 660980099A dw fiftn,sixtn,sevntn,eightn 0AB7 ds 50 0AE9 = stack equ $ 0AE9 0000 mappnt dw 0 ;pointer to badmap 0AEB badmap ds 152 ;76 trks times 2 sides 0B83 dskbuf ds 8192 ;8K disk buffer