home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / SUPERBIOS.ZIP / QUAD-SBC / LDRDBIOS.MAC < prev    next >
Text File  |  1999-03-13  |  16KB  |  668 lines

  1.  
  2.     .z80
  3.  
  4.     include    SUPRBIOS.LIB
  5.  
  6. rtrys    equ    010d
  7.  
  8. ;----------------------------------
  9. ; HDC-1001 REGISTER PORT ADDRESSES
  10. ; ---------------------------------
  11.  
  12. hbase    equ    0e0h            ; base port address of hdc-1001
  13. hdata    equ    hbase+0            ; data register
  14. herror    equ    hbase+1            ; error register
  15. hwrtpre    equ    hbase+1            ; write pre-compensation register
  16. hseccnt    equ    hbase+2            ; sector count register
  17. hsec    equ    hbase+3            ; sector number register
  18. hcyllow    equ    hbase+4            ; cylinder low register
  19. hcylhi    equ    hbase+5            ; cylinder high register
  20. hsdh    equ    hbase+6            ; size - drive - head register
  21. hstatus    equ    hbase+7            ; status register port
  22. hcmd    equ    hbase+7            ; command register port
  23.  
  24. ;-------------------
  25. ; HDC-1001 COMMANDS
  26. ;-------------------
  27.  
  28. cmdrst    equ    010h            ; restore command
  29. cmdrd    equ    020h            ; read sector command
  30.  
  31. ;-----------------------------
  32. ; STATUS REGISTER BIT TESTERS
  33. ;-----------------------------
  34.  
  35. bsybit    equ    080h            ; busy bit
  36. rdybit    equ    040h            ; data request bit
  37. errbit    equ    001h            ; error bit    
  38.  
  39. ;------------------
  40. ; BIOS JUMP VECTOR
  41. ;------------------
  42. start:
  43.     jp    boot
  44.     jp    wboot
  45.     jp    const
  46.     jp    conin
  47.     jp    conout
  48.     jp    list
  49.     jp    punch
  50.     jp    reader
  51.     jp    hhome
  52.     jp    hseldsk
  53.     jp    hsettrk
  54.     jp    hsetsec
  55.     jp    setdma
  56.     jp    hread
  57.     jp    hwrite
  58.     jp    listst
  59.     jp    sectran
  60.  
  61. ;-----------
  62. ; COLD BOOT
  63. ;-----------
  64.  
  65. boot:
  66.     ret
  67.  
  68. ;-----------
  69. ; WARM BOOT
  70. ;-----------
  71.  
  72. wboot:
  73.     ret
  74.  
  75. ;-------------
  76. ; LIST OUTPUT
  77. ;-------------
  78.  
  79. list:
  80.     ret
  81.  
  82. ;--------------
  83. ; PUNCH OUTPUT
  84. ;--------------
  85.  
  86. punch:
  87.     ret
  88.  
  89. ;---------------
  90. ; READER OUTPUT
  91. ;---------------
  92.  
  93. reader:
  94.     ret
  95.  
  96. ;-------------
  97. ; LIST STATUS
  98. ;-------------
  99.  
  100. listst:
  101.     ret
  102.  
  103. ;----------------
  104. ; CONSOLE STATUS
  105. ;----------------
  106.     
  107. const:                ;poll serial in-return A=0ff if char ready, else 0
  108.     add    A,A
  109.     inc    A            ;A=command port
  110.     ld    C,A
  111.     in    A,(C)
  112.     and    1
  113.     ret    z            ;no character waiting
  114.     ld    A,0ffh
  115.     ret
  116.  
  117. ;---------------
  118. ; CONSOLE INPUT
  119. ;---------------
  120.  
  121. conin:
  122.     ld    B,A
  123.     call    const
  124.     ld    A,B
  125.     jr    z,conin            ;loop until character received
  126.     add    A,A
  127.     ld    C,A
  128.     in    A,(C)
  129.     and    7fh            ;mask high order bit
  130.     ret
  131.  
  132. ;----------------
  133. ; CONSOLE OUTPUT
  134. ;----------------
  135.  
  136. conout::
  137.     ld    B,C    ;character to output
  138.     add    A,A
  139.     inc    A
  140.     ld    C,A
  141. serst::    in    A,(C)
  142.     and    4
  143.     jr    z,serst
  144.     dec    C
  145.     out    (C),B
  146.     ret
  147.  
  148. ;    miscellaneous character i/o routines
  149. pmsg::                    ;equivalent to BDOS function 9 (print)
  150.     ld    A,(DE)
  151.     cp    '$'
  152.     ret    z
  153.     ld    C,A
  154.     inc    DE
  155.     push    DE
  156.     xor    A
  157.     call    conout
  158.     pop    DE
  159.     jr    pmsg
  160.  
  161. phex::                    ;print A in hex
  162.     push    AF
  163.     rra
  164.     rra
  165.     rra
  166.     rra
  167.     call    hex1
  168.     pop    AF
  169. hex1::    and    0fh
  170.     add    A,90h
  171.     daa
  172.     adc    A,40h
  173.     daa
  174.     ld    C,A
  175.     xor    A
  176.     jp    conout
  177.  
  178. ;------------------
  179. ; SET DMA ADDRESS
  180. ;-----------------
  181.  
  182. setdma:
  183.     ld    (dmaadr),bc        ; shared among all drivers
  184.     ret
  185.  
  186. ;--------------------
  187. ; SECTOR TRANSLATION
  188. ;--------------------
  189.  
  190. sectran:
  191.     ld    h,b
  192.     ld    l,c
  193.     ret
  194.  
  195. ;-------------
  196. ; SELECT DISK
  197. ;-------------
  198.  
  199. hseldsk:
  200.     ld    hl,ddb0            ; get deblocking parameters
  201.     ld    de,dbconst        ; move dblk pars to usage area
  202.     ld    bc,13d            ; 13 bytes of dblk pars
  203.     ldir                ; move as block
  204.  
  205.     ld    hl,dph0            ; ret w. dsk parameter hder in hl
  206.  
  207.     ret
  208.  
  209. ;------
  210. ; HOME
  211. ;------
  212.  
  213. hhome:
  214.     call    restore            ; restore drive heads to trk 0
  215.     ret
  216.     
  217. ;-----------
  218. ; SET TRACK
  219. ;-----------
  220.  
  221. hsettrk:
  222.     ld    (sektrk),bc        ; bc contains selected track n.
  223.     ret
  224.  
  225. ;------------
  226. ; SET SECTOR
  227. ;------------
  228.  
  229. hsetsec:
  230.     ld    (seksec),bc        ; bc contains selected sector no.
  231.     ret
  232.  
  233. ;-------------
  234. ; READ SECTOR
  235. ;-------------
  236.  
  237. hread:
  238.     xor    a            ; clear accumulator
  239.     ld    (rtcnt),a        ; reset retry count
  240.     ld    a,1            ; set operation to read
  241.     ld    (oper),a        ; save it for when we do xfer
  242.  
  243.     call    deblk            ; deblock phy sec, buf adr, and blk sec
  244.     call    inbuf            ; check if new sector is in buf
  245.     call    xfer            ; transfer data out of buf into dma
  246.     
  247.     ld    a,(rtcnt)        ; if rtcnt not zero then error
  248.  
  249.     ret
  250.  
  251. ;--------------
  252. ; WRITE SECTOR
  253. ;--------------
  254. hwrite:
  255.     ret
  256.  
  257. ;------------------------------------
  258. ; DEBLOCK PHY SEC, BUF ADDR, BLK SEC
  259. ;------------------------------------
  260.  
  261. deblk:
  262.     ld    a,(pdrv)        ; get phy drv from dsk deblk parameters
  263.     ld    (sekprv),a        ; save it as sek phy drv
  264.  
  265.     ld    a,(secshf)        ; convert sek sec to phy sec
  266.     ld    de,(seksec)        ; secshf is log2 cpm sps
  267.     call    shfr16            ; shift de-reg, a-reg times
  268.     ld    a,(hstspt_1)        ; de now contains sec rel to cyl 
  269.     and    e            ; mask for sec rel to platter
  270.     ld    (dsec),a        ; save it as deblocked sector
  271.  
  272.     ld    a,(hdshf)        ; convert seksec to phy head
  273.     ld    de,(seksec)        ; hdshf is log2 cpm spt
  274.     call    shfr16            ; hd no is high bits, so no msk needed
  275.     ld    a,(hdoff)        ; add in head off set for partioning
  276.     add    a,e            ; cartriage drv must be part. by hds 
  277.     ld    (dhd),a            ; save it as deblocked head no.    
  278.  
  279.     lΣ    a,(cpmsps_1⌐        ╗ conver⌠ sekseπ t∩ hs⌠ buµ no.
  280.     ld    de,(seksec)        ; mask out low order bits of sec no
  281.     and    e            ; since buf no <= 8, need only lsb 
  282.     ld    e,a            ; mul buf no x128 to get rel adr in buf
  283.     ld    d,0            ; zero out high order of multiplicitan
  284.  
  285.     ld    a,7            ; convert hst buf no. to hst buf adr
  286.     call    shfl16            ; mult by 128 (shift lf 7)
  287.     ld    hl,hstbuf        ; base addr of hst buf
  288.     add    hl,de            ; add in offset
  289.     ld    (dadr),hl        ; save it as deblocked buf addr
  290.  
  291.     ld    a,(blkshf)        ; convert seksec to blk no.
  292.     ld    de,(seksec)        ; blkshf = log2 cpm spb, what we are 
  293.     call    shfr16            ; doing is, bl=int(sesc/cpmspb)
  294.     ld    (dblk),de        ; save as blk no. on this trk
  295.  
  296.     ld    a,(hstspb_1)        ; convert seksec to hst sec no. in blk
  297.     ld    de,(dsec)        ; must use sec just deblocked 
  298.     and    e            ; and deblk sec w. hst spb
  299.     ld    (dblsec),a        ; save it as deblocked block sec 
  300.     
  301.     ret
  302.  
  303. ;----------------------------
  304. ; CHECK IF NEW SEC IS IN BUF
  305. ;----------------------------
  306.  
  307. inbuf:
  308.     ld    a,(seklrv)        ; check if new drv = old drv
  309.     ld    hl,hstlrv        ; first check if log drives are same
  310.     cp    (hl)            ; compare w. last accessed drv
  311.     jp    nz,difblk        ; if drvs are dif, then so is blk
  312.  
  313.     ld    de,(sektrk)        ; check if new trk = old trk
  314.     ld    hl,(hsttrk)        ; this is the old trk
  315.     call    cmp16            ; so far drv same
  316.     jp    nz,difblk        ; if trks are dif, then so is blk
  317.  
  318.     ld    a,(dhd)            ; check if new head = old head
  319.     ld    hl,hsthd        ; so far drv, trk same
  320.     cp    (hl)            ; if dif hd, could be
  321.     jp    nz,ckblk        ; same blk if blk size > phy trk siz
  322.  
  323.     ld    a,(dsec)        ; check if new sec = old sec
  324.     ld    hl,hstsec        ; this is the old sec
  325.     cp    (hl)            ; so far drv, trk, hd same
  326.     jp    nz,ckblk        ; could be same blk even if dif sec
  327.  
  328.     call    sethst            ; everything same, set buf addr though
  329.  
  330.     ret
  331.  
  332. ckblk:
  333.     ld    hl,(dblk)        ; check if new sec is in same blk
  334.     ld    de,(hstblk)        ; if the new blk equal old blk
  335.     call    cmp16            ; then do not reset usage vars
  336.     jp    nz,difblk        ; regardless fall through to prerd  
  337.  
  338. samblk:
  339.     call    hflush            ; sam blk, but dif blk sec so flush old
  340.     ld    hl,usgblk        ; check if this sec free in block
  341.     ld    de,(dblsec)        ; look in block usage vector
  342.     ld    d,0            ; index down to correct entry in vector
  343.     add    hl,de            ; hl now contains addr of blk usg entry
  344.  
  345.     ld    b,(hl)            ; get blk usage flag
  346.     ld    a,(oper)        ; get oper 
  347.     or    b            ; if (sec not fre) or (oper is read)
  348.     jp    nz,prerd        ; then need to pre-read sector
  349.  
  350. nprerd:
  351.     call    sethst            ; sector not allocated
  352.     ret
  353. difblk:                                                            
  354.     call    hflush
  355.     call    setusg            ; sector not in block
  356. prerd:
  357.     call    sethst            ; sector in blk but alloc, or dif blk
  358.     call    hrdhst            ; read in new setor
  359.     ret
  360.  
  361. ;-------------------
  362. ; FLUSH HOST BUFFER
  363. ;-------------------
  364.  
  365. hflush:
  366.     ld    a,(wrtpnd)        ; check if host buffer active
  367.     and    a            ; wrtpnd =0 if inactive, =0ff if active
  368.     call    nz,hwrthst        ; physicaly flush buffer if active
  369.  
  370.     xor    a            ; clear write pending
  371.     ld    (wrtpnd),a        ; host buffer now in active
  372.  
  373.     ret
  374.  
  375. ;---------------------------------
  376. ; SET DEBLOCKED VARS TO HOST VARS
  377. ;---------------------------------
  378.  
  379. sethst:
  380.     ld    hl,sekvars+2        ; blk move sek & dblk vars to hst vars
  381.     ld    de,hstvars        ; dont need seksec so sekvars+2 
  382.     ld    bc,14d            ; this is how many to move
  383.     ldir                ; set host variables
  384.     ret
  385.  
  386. ;--------------------------------------
  387. ; TRANSFER DATA TO/FROM BUFFER AND DMA
  388. ;--------------------------------------
  389.  
  390. xfer:
  391.     ld    bc,080h            ; transfer 128 bytes
  392.     ld    de,(dmaadr)        ; load cpm addr (dma addr storage) 
  393.     ld    hl,(hstadr)        ; load buf addr
  394.  
  395.     ld    a,(oper)        ; check if read or write operation
  396.     or    a            ; oper =0 if read, =1 if write
  397.     jp    nz,transf        ; jump if read
  398.  
  399.     ex    de,hl            ; read operation so switch directions
  400. transf:
  401.     ldir                ; send 128 byte block
  402.  
  403.     ret
  404.  
  405. ;--------------------------------
  406. ; SET OR RESET BLOCK USAGE FLAGS
  407. ;--------------------------------
  408.  
  409. rsetusg:
  410.     ld    b,0            ; set all block sectors in blk to free
  411.     jp    setblk            ; sec in blk not allocated if =0
  412. setusg:
  413.     ld    b,0ffh            ; set all block sectors in blk to used
  414. setblk:
  415.     ld    a,(hstspb_1)        ; get no of host sector per block
  416.     ld    hl,usgblk        ; get addr of blk sector usage vector
  417. setflg:
  418.     ld    (hl),b            ; set or reset block usage flag
  419.     inc    hl            ; point to next flag loc
  420.     dec    a            ; dec count of block sectors to go
  421.     jp    p,setflg        ; loop if more to set
  422.     ret        
  423.  
  424. ;------------------------------
  425. ; UPDATE BLOCK USAGE VARIABLES
  426. ;------------------------------
  427.  
  428. update:
  429.     ld    de,(blksec)        ; we have just written to a sec in blk
  430.     ld    d,0            ; so set block sec usage flag to used
  431.     ld    hl,usgblk         ; first point to flag
  432.     add    hl,de            ; de contains sector no. in block 
  433.     ld    a,0ffh            ; 0ff means sector in block is not free
  434.     ld    (hl),a            ; set flag 
  435.     ret
  436.  
  437. ;------------
  438. ; WRITE HOST
  439. ;------------
  440.  
  441. hwrthst:
  442.     ret
  443.  
  444. ;-----------
  445. ; READ HOST
  446. ;-----------
  447.  
  448. hrdhst:
  449.     call    settsk            ; first set up controller registers
  450.  
  451.     ld    a,cmdrd            ; load a with command to read sector
  452.     out    (hcmd),a        ; send read command to command reg
  453.  
  454.     call    polbsy            ; wait until not busy
  455.     call    rxdta            ; transfer data from cnt buf to hst buf
  456.     call    retrys            ; check for errors
  457.     jp    nz,hrdhst        ; retrys sets zero flg if no errors
  458.     ret
  459.  
  460. ;---------------
  461. ; SET TASK FILE
  462. ;---------------
  463.  
  464. settsk:
  465.     ld    a,(hstprv)        ; get physical drive no.
  466.     ld    b,a            ; save in b so can use a for mem fetch
  467.     sla    b            ; rotate phy drive to correct position
  468.     sla    b            ; drive is expected in bits 3 and 4
  469.     sla    b            ; last shift for drive
  470.     ld    a,(hstsdh)        ; get sdh sect size setting
  471.     or    b            ; or it in w. rotated phy drive no
  472.     ld    b,a            ; save result in b
  473.     ld    a,(hsthd)        ; get host head no.
  474.     or    b            ; or it in w. drv and sec siz
  475.     out    (hsdh),a        ; send it siz drv hd register
  476.  
  477.     ld    bc,(hsttrk)        ; host track is really host cylinder
  478.     ld    a,b            ; move msb to a-reg for out inst
  479.     out    (hcylhi),a        ; send high byte to cylhi reg
  480.     ld    a,c            ; move lsb  to a-reg
  481.     out    (hcyllow),a        ; send to cyl low
  482.  
  483.     ld    a,(hstsec)        ; get host sector no
  484.     out    (hsec),a        ; send to sector register
  485.  
  486.     ret
  487.  
  488. ;-----------
  489. ; SEND DATA    
  490. ;-----------
  491.  
  492. snddta: 
  493.     ret
  494.  
  495. ;--------------
  496. ; RECIEVE DATA
  497. ;--------------
  498.  
  499. rxdta:
  500.     ld    a,(hstsiz)        ; this is how many bytes to move
  501.     ld    b,a            ; set up for inir
  502.     ld    c,hdata            ; this is where the data comes from
  503.     ld    hl,hstbuf        ; this is where the data goes
  504.     inir                ; block move data into hst buf 
  505.  
  506.     ld    a,(hstsiz+1)        ; check if moving 512 bytes
  507.     and    2            ; msb would be 2 if 512 bytes
  508.     jp    z,rxout            ; jump over if moveing 128 or 256 only 
  509.     inir                ; b should be zero, hl and c set also
  510. rxout:
  511.     ret
  512.  
  513. ;--------------------------------
  514. ; RESTORE DRIVE HEADS TO TRK 000
  515. ;--------------------------------
  516.  
  517. restore:
  518.     ld    a,(stprte)        ; set step rate when doing a restore
  519.     ld    b,cmdrst        ; get a restore command
  520.     or    b            ; or in step rate
  521.     out    (hcmd),a        ; send it to the command register 
  522.  
  523.     call    polbsy            ; wait until not busy
  524.  
  525.     ret
  526.  
  527. ;-----------
  528. ; POLL BUSY
  529. ;-----------
  530.  
  531. polbsy:
  532.     in    a,(hstatus)        ; read status port
  533.     and    a            ; set flags
  534.     jp    m,polbsy        ; loop if busy bit set
  535.  
  536.     and    errbit            ; mask for error bit
  537.     ret
  538.  
  539. ;---------------------
  540. ; SET RETRY CONDITION
  541. ;---------------------
  542.  
  543. retrys:
  544.     in    a,(hstatus)        ; read status register
  545.     and    errbit            ; mask for error bit
  546.     jp    z,rtout            ; jump to exit rtry
  547.  
  548.     ld    a,(rtcnt)        ; get no. of retrys so far
  549.     inc    a            ; increment retry count
  550.     ld    (rtcnt),a        ; save it for next time
  551.     cp    rtrys            ; set not z flg, unless rtcnt = rtrys
  552.     ret                ; return w. flag set or reset
  553. rtout:
  554.     xor    a            ; clear zero flag
  555.     ld    (rtcnt),a        ; clear retry cnt in case had to retry
  556.     ret                ; return w. no errors
  557.  
  558. ;----------------
  559. ; SHIFT RIGHT 16
  560. ;----------------
  561.  
  562. shfr16:
  563.     and    a            ; shift de reg right a-reg times
  564.     jp    z,xr16            ; jump over loop if shift 0 times
  565. shfrlp:
  566.     srl    d                    ; shift msb first, bit 0 into carry
  567.     rr    e            ; rotate carry into bit 7 lsb
  568.     dec    a            ; decrement shift counter
  569.     jp    nz,shfrlp        ; loop util finished
  570. xr16:
  571.     ret
  572.  
  573. ;---------------
  574. ; SHIFT LEFT 16
  575. ;---------------
  576.  
  577. shfl16:
  578.     and    a            ; shift de-reg left a-reg times
  579.     jp    z,xl16            ; check for shift zero times
  580. shfllp:
  581.     sla    e            ; shf lsb first, c = bit 7, bit 0 = 0
  582.     rl    d            ; shf msb, bit 0 = carry
  583.     dec    a            ; decrement shift counter
  584.     jr    nz,shfllp        ; loop until a-reg eq zero
  585. xl16:
  586.     ret
  587.  
  588. ;------------------------------
  589. ; COMPARE 16-BIT DE AND HL REG
  590. ;------------------------------
  591.  
  592. cmp16:
  593.     ld    a,e            ; compare e-reg w. l-reg 
  594.     xor    l            ; xor will zero accum. if e = l 
  595.     ret    nz            ; return if not equal
  596.     ld    a,d            ; compare d-reg w. h-reg
  597.     xor    h            ; set zero flag if same
  598.     ret
  599.         
  600. ;------------------------------------------------
  601. ; DATA STORAGE
  602. ;------------------------------------------------
  603.  
  604. dmaadr:     dw    0080h            ; dma address storage
  605. rtcnt:     db    0            ; retry counter
  606. smapadr: dw    0            ; seek drive map entry address
  607.  
  608. sekvars:                 ; seek variables 
  609. seksec:    dw    0            ; seek sector 
  610. seklrv:    db    0            ; seek logical drive 
  611. sekprv:    db    0            ; seek physical drive
  612. sektrk:    dw    0            ; seek track
  613.  
  614. dhd:    db    0            ; deblocked head 
  615. dsec:    db    0            ; deblocked sector 
  616. dadr:    dw    0            ; deblocked buffer address
  617. dblk:    dw    0            ; deblocked block no. in cylinder
  618. dblsec:    db    0            ; deblocked host sector no. in block
  619.  
  620. dbconst:                ; deblocking constants (calc in ddp)
  621. secsiz:      dw    0            ; host sector size
  622. sdhsiz:      db    0            ; shd reg sector siz
  623. pdrv:      db    0            ; physical drive
  624. hdoff:      db    0            ; head offset
  625. stprte:      db    0            ; cmd reg step rate    
  626. hstspt_1: db    0            ; host sector per track  
  627. hstspb_1: db    0            ; host sectors per block    
  628. hdshf:      db    0            ; log2 cpm spt
  629. blkshf:      db    0            ; log2 cpm spb
  630. hdmsk:      db    0            ; heads - 1
  631. secshf:      db    0            ; log2 cpm sps
  632. cpmsps_1: db    0            ; cpm sps - 1
  633.  
  634. hstvars:                ; host drive variables
  635. hstlrv: db    0            ; last logical drive operated on
  636. hstprv:    db    0            ;      physical drive
  637. hsttrk:    dw    0            ;      track (equiv to cylinder)    
  638. hsthd:    db    0            ;      head
  639. hstsec:    db    0            ;      sector
  640. hstadr:    dw    0            ;      buffer address
  641. hstblk:    dw    0            ;      block no. in current cylinder 
  642. blksec:    db    0            ;      host sector no. in block
  643. hstsiz:    dw    0            ;      physical sector size
  644. hstsdh:    db    0            ;      sdh register sector size setting
  645.  
  646. wrtpnd:    db    0            ; write pending (host buffer active)
  647. wrttyp:    db    0            ; write type (0=use, 1=dir, 2=free)
  648.  
  649. oper:    db    0            ; operation (0=write, 1=read)
  650.  
  651. ;------------------------------------------------------------------------------
  652. ;                DRIVE PARAMETER DEFINITIONS
  653. ;------------------------------------------------------------------------------
  654. ;
  655. ; dskdef < drvtyp0, drvtyp1, ... , drvtypm>
  656. ;
  657. ;------------------------------------------------------------------------------
  658.  
  659.     dskdef    <dma55>
  660.  
  661. endmod    equ    $
  662.  
  663.     end
  664.  
  665.  
  666.  
  667.     end
  668.