bdos equ 5h ;BDOS entry acr equ 0dh ;carriage return alf equ 0ah ;line feed drsel equ 0fch ;DR 0, HD 0, STEP OUT drvrdy equ 20h ;Drive Ready bit cntrl equ 0dh ;WENBL, MCLK, FRENBL clrflt equ 5h ;Toggle 3bit to clr wrfault status equ 50h ;HD Status Register cmnd equ 51h ;Command Register data equ 53h ;Data port run equ 0fh ;cntrl + RUN bit wrsect equ 7h ;WRITE SECTOR COMMAND rdsect equ 3h ;READ SECTOR COMMAND wrdata equ 5h ;Write Data command rddat equ 1h ;Read Data 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 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 lxi d,buferr call pbuff jmp wrbuf noerr dcr b jnz rdbuf lxi d,wrtdat call pbuff mvi c,0 wrsec mvi a,wrsect ;write sector headers til interrupt out 51h rerd in 50h ani opdone jz rerd dcr c jnz wrsec lxi b,200h ;sector length mvi a,0 out cmnd mvi a,0aah lddata out data dcr c jnz lddata dcr b jnz lddata lxi b,200h mvi a,0 out cmnd cklow in data cpi 0aah jz onward push b lxi d,lobuf call pbuff pop b onward dcr c jnz cklow dcr b jnz cklow wrlp mvi a,wrdata out cmnd wrwait in status ani opdone jz wrwait in 50h ani tmout jz ckrtry lxi d,timout call pbuff ckrtry in 51h ;check xrtry ani xrtry jz ckint lxi d,rtryms call pbuff ckint lda djiost ani djdr jnz wrlp lda djdata mvi a,0 ;write zeros to buffer out 51h lxi b,200h clrmem out data dcr c jnz clrmem dcr b jnz clrmem lxi d,rdmsg call pbuff rddata mvi a,rddat out 51h rdagn in 50h ani opdone jz rdagn in status ani tmout jz nxt lxi d,timout call pbuff nxt in 51h ani xrtry jz datack lxi d,cksumr call pbuff datack mvi a,0 out 51h lxi b,200h lxi h,1000h ckmor in data mov m,a inx h dcr c jnz ckmor dcr b jnz ckmor lxi b,200h lxi h,1000h more mov a,m cpi 0aah jz cont push b lxi d,rderr call pbuff pop b cont dcr c jnz more dcr b jnz more lda djiost ani djdr jnz rddata lda djdata cpi 'R' jz setup rst 7 pbuff mvi c,9 jmp bdos lobuf db acr,alf db 'low buffer error$' timout db acr,alf db 'Timeout$' sgnon db acr,alf db 'Loading & checking sector buffer$' wrtmsg db acr,alf db 'Writing Sector Headers$' wrtdat db acr,alf db 'Writing Data$' rdmsg db acr,alf db 'Reading data$' 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