bdos equ 5h ;BDOS entry acr equ 0dh ;carriage return alf equ 0ah ;line feed drsel equ 0fch ;DR 0, HD 0, STEP OUT stpbit equ 4h ;low then high steps head stpspc equ 0aah ;1 Msec delay between pulses dirbit equ 8h ;Step direction-hi steps out drvrdy equ 20h ;Drive Ready bit cntrl equ 0dh ;WENBL, MCLK, FRENBL clrflt equ 5h ;Toggle 3bit to clr wrfault stat equ 50h ;Status Register cmnd equ 51h ;Command Register drfun equ 52h ;Drive Function Register run equ 0fh ;cntrl + RUN bit wrsect equ 7h ;WRITE SECTOR COMMAND rdsect equ 3h ;READ SECTOR COMMAND opdone equ 2h ;OP DONE STATUS BIT tkzro equ 1h ;Track Zero bit halt equ 80h ;Halt bit nflt equ 10h ;Write Fault tmout equ 8h ;Timeout bit cmplt equ 4h ;Complete bit xrtry equ 2h ;Auxilliary status retry bit djiost equ 0e3f9h ;DJ UART STATUS djdata equ 0e3f8h ;DJ DATA djdr equ 4h ;DJ DATA READY WHEN OFF wboot equ 0h ;RESTART reset equ 0h ;Reset & Low Memory Select tstpat equ 0aah ;Test pattern 10101010 himem equ 8h ;High Memory Select & Reset org 100h lxi d,sgnon call pbuff ;select drive, head & Mclock, out step direction setup mvi a,drsel out 52h mvi a,cntrl ;enable function register out 50h ;toggle write enable to clr write fault mvi a,clrflt out 50h mvi a,cntrl out 50h in 50h ;see if write fault cleared ani nflt jnz ckrdy ;no error jmp setup ckrdy in 50h ani drvrdy jz ckhalt jmp setup ckhalt in 50h ani halt jnz setrun jmp setup setrun mvi a,run out 50h step mvi c,stpbit mvi a,drsel xra c out drfun xra c out drfun lxi d,stpspc time dcx d mov a,e ora d jnz time in stat ani tkzro jnz step jmp wboot wrbuf mvi a,himem ;load buffer with test pattern out 51h mov b,a mvi a,tstpat filbuf out 53h dcr b jnz filbuf mvi a,himem ;verify buffer data out 51h mov b,a rdbuf in 53h cpi tstpat jz noerr jmp wrbuf noerr dcr b jnz rdbuf wrsec mvi c,10 mvi a,wrsect ;write sector headers til interrupt out 51h rerd in 50h ani opdone jnz wrsec dcr c jnz rerd mvi a,reset out cmnd mvi a,clrflt out 50h mvi a,run out 50h jmp wrsec in 50h ani nflt jnz ckrtry ckrtry in 51h ;check xrtry ani xrtry jz ckint lxi d,rtryms call pbuff ckint lda djiost ani djdr jnz wrsec lda djdata mvi a,himem ;write zeros to buffer out 51h mov b,a sub a clrmem out 53h dcr b jnz clrmem lxi d,rdmsg call pbuff rdsec mvi a,rdsect ;read sectors till interrupt out 51h rdagn in 50h ani opdone jz rdagn in 51h ani xrtry jz datack lxi d,cksumr call pbuff datack mvi a,himem out 51h in 53h in 53h mvi c,4 mvi b,tstpat rdmor in 53h cmp b jz ckmor push b lxi d,rderr call pbuff pop b ckmor dcr c jnz rdmor lda djiost ani djdr jnz rdsec lda djdata cpi 'R' jz setup jnz wboot pbuff mvi c,9 jmp bdos sgnon db acr,alf db 'Loading & checking sector buffer$' wrtmsg db acr,alf db 'Writing Sector Headers$' rdmsg db acr,alf db 'Reading Sector Headers$' buferr db acr,alf db 'Data read from hi buff differs from written$' noclr db acr,alf db 'Toggle Write Protect did not clear Write Fault$' ntrdy db acr,alf db 'Drive Not Ready$' wrflms db acr,alf db 'Write Fault$' nothlt db acr,alf db 'Not Halted$' rtryms db acr,alf db 'Retry$' rderr db acr,alf db 'Read Error$' cksumr db acr,alf db 'check sum error$' end 100h