extrn mmenu public tbuff, vfyfpy, vfy1tk .z80 maxsec equ 10 ; sectors/track maxtrk equ 80 ; tracks/disk cmnd equ 10H ; command port data equ 13H ; data port secp equ 12H ; sector port trkp equ 11H ; track port status equ 10H ; status port rdcmd equ 88H ; read sector command, SIDE COMPARE ENABLED ; for 1793, (1797 always does side compare) ; SECTOR LENGTH FLAG set to one for 1797 ; (allows us to use the same sector length ; LSB in ID field with the 1793 and 1797 ; and allows the 1797 to read 128 byte sectors rdmask equ 9CH ; read status mask wrtcmd equ 0A8H ; write sector command, same notes as for rdcmd wrtmask equ 0FCH ; write status mask ficmd equ 0D0H ; force int command seekcmd equ 1AH ; seek command, HEAD LOAD at start of command rstcmd equ 03H ; home command bitport equ 20 ; system bit port sidmsk equ 11111011b ; side select mask sid0 equ 00000100b ; side select, side 0 sid1 equ 00000000b ; side select, side 1 cr equ 0DH ; ascii return lf equ 0AH ; ascii line feed bdos equ 5 ; bdos entry point ; print a message print macro x ld c,9 ld de,x call 5 endm ; get a char from console, up case input macro ld c,1 call 5 res 5,a endm ; entry point from format program vfyfpy: ld a,0FFH ;RESET ERROR RECORD ld (some),a ;save it xor a ld (ftrk),a ld a,maxtrk ld (ltrk),a print crlf print crlf print vermsg ; tell crt that verify p/g is beginning print crlf print crlf call home ; home disk drive verify: ld a,0ffh ; reset error record ld (some),a ld a,(66H) ; get and save byte at nmi vector ex af,af' ld a,0C9H ; RET op code ld (66H),a call diskon ; turn disk drives on ld a,(ftrk) vertrk: ld (track),a print back call tellt ; tell track call seekx ; goto track ld hl,buffb ; set up dma adrs for disk B ld (dmaadr),hl xor a verb: ld (sector),a ; set up sector call read ; read sector from B call nz,tellb ; tell any errors from read ld a,(sector) ; next sector inc a cp maxsec ; end of track? jr c,verb ; another sector yet to do vert: ld a,(ltrk) ld c,a ld a,(track) ; next track inc a cp c jr c,vertrk ex af,af' ld (66H),a ; restore byte at nmi vector ld a,(some) cp 0 ;0=error has been recorded jr nz,getout ;tell him about it (pause for cr print pause input ret vfy1tk: ; verify track, track number in c (used by single) ld a,c ld (ftrk),a inc a ld (ltrk),a jp verify ; go verify a track ; getout: print ok ret ; go back to main p/g read: ld de,rdmask*256+rdcmd ; action: call xlate ; to physical sector number push bc ld c,a ; save it ld a,(track) srl a ld a,c pop bc jr nc,actn2 add a,10 ; on other side actn2: out (secp),a ; set sector number TRYS:: ld l,1 ;better be good first time push hl ld hl,(dmaadr) ; address of disk i/o alp: ld bc,data ; b=0, c=port # ld a,e ; out (cmnd),a ; read loop rl1: halt ; read in first 256 bytes ini jp nz,rl1 rl2: halt ; read in second 256 bytes (256+256)=512 ini jp nz,rl2 ; ; done: ld (dmaadr),hl ; save new dma address (auto inc on rd/wrt) call busy ; wait for crc and d ; status mask pop hl ; error re-try count ret z ; no error dec l ; down error count jr z,error ; max error count if Z push hl ld hl,(dmaadr) ; correct dma address ld bc,512 or a sbc hl,bc jr alp error: ld a,0FFH or a ret ; ret non-zero (error) xlate: ld hl,tran ; un-skew track (formatted skewed) ld c,a ; copy disk logical sector number ld b,0 add hl,bc ; as index into skew table ld a,(hl) ; got it ret ; new un skew table tran: defb 0, 8, 3, 6 defb 1, 9, 4, 7 defb 2, 5 seekx: push de push bc call diskon pop bc pop de ld a,ficmd ; force int out (cmnd),a call busy2 ld a,(track) ; now seek desired track srl a out (data),a push bc ld c,sid0 jr nc,seekz ld c,sid1 seekz: in a,(bitport) ; side selection and sidmsk or c out (bitport),a pop bc ld a,seekcmd ; do seek out (cmnd),a ; issue command jr busy2 busy2: ex (sp),hl ; wait until status is valid ex (sp),hl ex (sp),hl ex (sp),hl jr bsy ; then wait until controller not busy busy: halt ; wait for command done bsy: in a,(status) ; busy? (may be drq not int) bit 0,a jr nz,bsy ret ; done home: ld a,rstcmd ; home drive A out (cmnd),a call busy2 ; wait for done ret diskon: in a,(bitport) ; turn on disk drive bit 4,a ret nz ; don't delay if motor on res 0,a ; select drive res 5,a ; double density set 4,a ; enable motor out (bitport),a ld b,50 ; delay for motor up to speed don1: ld de,1670 don2: dec de ld a,d or e jp nz,don2 djnz don1 ; it was off, tell it what track it was on ld a,ficmd out (cmnd),a call busy2 ld a,(track) dec a srl a out (trkp),a ; tell it ret outdec: push bc ; save number in c ld a,c ; decimal print the number in c ld e,'0' ; e hold decimal digit hund: sub 100 ; any hundreds digits? jr c,tens inc e ; bump hundreds digit jr hund tens: add a,100 ; put back 100 push af ; save number ld a,e ; leading zero digit? cp '0' jr z,ten1 ld c,2 call bdos ; write digit ten1: pop af ; recover digit ld e,'0' ; tens digit ten2: sub 10 jr c,ones inc e ; bump tens digit jr ten2 ones: add a,10+'0' push af ; save number, print digit ld c,2 call bdos ; tens digit pop af ld e,a ld c,2 call bdos ; ones digit pop bc ; restore number to c ret ; done ; tellt: print trkmsg ; tell track number ld bc,(track) call outdec ; print track number ret tellb: ld a,0 ;record an error ld (some),a print back ; bad sector on drive b print drvb telerr: call tellt ; "TRACK XX" print secmsg ; " SECTOR " ld a,(sector) ; find physical sector number call xlate ld c,a call outdec ; "XX" print badmsg print crlf call tellt ; still on this track call diskon ; make sure engine is still running ret crlf: defb cr,lf,'$' trkmsg: defb 'Track ','$' secmsg: defb ' Sector ','$' drvb: defb 'Drive ','$' badmsg: defb ' {BAD}','$' back: defb cr,'$' ok: defb cr,'Format OK',cr,lf,'$' pause: defb cr,'Please type any key to continue.','$' vermsg: defb 'Verifying disk to be readable',cr,lf,'$' some: defb 0 ;error has occured dmaadr: defw buff ; dma pointer track: defb 0 ; current track ftrk: defb 0 ltrk: defb 0 sector: defb 0 ; current sector bytcnt: defw 0 ; sector verify loop count adrsa: defw 0 ; storage area for disk A buffer adrsb: defw 0 ; storage area for disk B buffer defw 0000 ; for L80 to play with buff: defb 00 ; track buffer buffb equ buff+5120 ; read buffer tbuff equ buff end