or new controller. ; Equates. hrdbps equ 512 ; bytes per sector. hdskrt equ 3 ; hard disk retry count. ; Teletek controller constants ioport equ 30h ; base i/o port. status equ ioport+0 ; read = get controller status reset equ ioport+0 ; write = reset controller. data equ ioport+1 ; rd/wt = get/put controller FIFO data. intrupt equ ioport+2 ; write = interrput controller. clear equ ioport+3 ; write = clear interrupt from controller. ncdbyts equ 7 ; number of command bytes. ninbyts eqor number (first sector is 0). ; track = track number. ; sekdsk = disk number (0-7 are floppies, 8-15 are hard disk). ; lsb20 = least significant word of 20-bit transfer address. ; msb20 = most significant byte of 20-bit transfer address. ; oper = 1 for read, 2 for write operation. ; Exit: if error, ; cf (carry flag) = 1, ercode = status, zf=0. ; if no error, ; cf = 0, zf = 1. io_th: ; transfer variables from external to internal form. mov ax,sector ; hrdsec = sector. mov hrdus one. hdsm2 equ 2047 ; disk 2 size minus one. hdir2 equ 2047 ; disk 2 directory size minus one. hdsm3 equ 289 ; disk 3 size minus one. hdir3 equ 289 ; disk 3 directory size minus one. offset0 equ 1 ; first track of logical drive 0. offset1 equ 206 ; first track of logical drive 1. offset2 equ 411 ; first track of logical drive 2. offset3 equ 616 ; first track of logical drive 3. endif if morrow hrdspt equ 17 ; sectors per track. headdly equ 0 ; settle delay (0-25.5 microsec.) hdווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווu 16 ; number of initialization bytes. nerbyts equ 26 ; number of error bytes. ; status port bits. request equ 80h ; controller requests service from bus master. busy equ 40h ; a command is in progress on the controller. ready equ 20h ; controller is ready for service by master. error equ 10h ; errors have occurred on the controller. ; commands. cclrbf equ 04h ; clear hd/ctc buffers. dmaread equ 4ah ; read a record (logical sector). dmawrit equ 4bh ; write a record (logical sector).sec,ax mov ax,track ; hrdtrk = track. mov hrdtrk,ax mov al,sekdsk ; hrddsk derived from sekdsk. sub al,8 if nlp eq 2 ; if 2 logical per physical. shr al,1 endif if nlp eq 4 ; if 4 logical per physical. shr al,1 shr al,1 endif if (nlp eq 3) or (nlp gt 4) mov ah,0 ; ax = logical drive number. mov bl,nlp ; bl = nlp. div bl ; al = physical drive number. endif mov hrddsk,al mov ax,lsb20 ; dmadma = lsb20. mov dmadma,ax mov al,msb20 ; extdma = msb20. mosm0 equ 2047 ; disk 0 size minus one. hdir0 equ 2047 ; directory 0 size minus one. hdsm1 equ 2047 ; disk 1 size minus one. hdir1 equ 2047 ; disk 1 directory size minus one. hdsm2 equ 2047 ; disk 2 size minus one. hdir2 equ 2047 ; disk 2 directory size minus one. hdsm3 equ 689 ; disk 3 size minus one. hdir3 equ 689 ; disk 3 directory size minus one. offset0 equ 1 ; first track of logical drive 0. offset1 equ 194 ; first track of logical drive 1. offset2 equ 387 ; first track of logical dוווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווווו ; MAPPER ; Initialize Teletek Hard disk interface. ; Entry: cl = logical hard disk drive number from 0-3. ; Exit: cf (carry flag) set if error, ercode=status. ; mapper: cmp rsflg,0 ; have we already done this? clc ; clear carry for ok return. jne mapret ; return if so. mov rsflg,0ffh ; set flag if not. cld ; set auto to increment. if nlp eq 2 ; 2 logical per physical? shr cl,1 ; divide drive by 2 if so. endif if nlp eq 4 ; 4 logical per physical? shr cl,1s ; decrement number of sectors. jz io_thx ; exit if zero. inc hrdsec ; else increment sector number. add dmadma,hrdbps ; bump address up. jnc io_thl ; loop back if no carry. inc extdma ; else add carry to ext address. jmps io_thl ; loop back. ; handle errors. io_the: mov ax,hrdtrk ; ax = cylinder number. mov ercyl,ax mov al,mwhead ; al = head number. mov erhead,al mov al,mwsectr ; al = sector number. mov ersect,al mov al,status ; al = error status. mov err ; abort. ; request signal has turned off. move4: mov ch,busy ; set up mask byte in ch. or ch,ready mov bx,0 ; bx = time-out counter. move5: in al,status ; get status byte. and al,ch ; mask out request and error bits. cmp al,ch ; see if both busy and ready high. jz move6 ; exit if both are high. dec bx jnz move5 ; or until waited long enough. ; if never got busy and ready together. mov bx,offset msg1 ; print "load aborted". call prtmsg mov bx,offset msg3 ; pransfer data. call statphas ; check for any errors. cmp al,0 ; were there any errors? je mwiret ; return if not. mwierr: stc ; set carry for error indicator. mwiret: mov dmastat,0ffh ; set done status. ret ;return no error (carry reset). ; Wait for request. twait: in al,status ; get unit status. test al,request ; test request bit. jz twait ; until request comes in. out clear,al ; clear the request line. ret ; Command Phase. cmndphas: cmnd1: in al,status test al,