home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol236 / semihndl.mac < prev    next >
Encoding:
Text File  |  1986-02-13  |  5.4 KB  |  173 lines

  1.           title 'semidisk handler routines'
  2.  
  3. true      equ -1
  4. false     equ 0
  5.  
  6. banked    equ true
  7.  
  8.           .Z80
  9.  
  10.           entry sinit,slogin,sread,swrite
  11.           external @trk,@sect,@dma,@ermde  
  12.           external ?pmsg,?pderr,?wboot
  13.                        if banked
  14.           external @cbnk,@dbnk,?bank
  15.                        endif
  16.  
  17.           dseg
  18.  
  19. data      equ 80H              ; semidisk origin
  20. byte      equ data+1
  21. trk       equ data+2
  22. sect      equ data+3
  23.  
  24. sinit:                         ; check for board set
  25.           xor a                ; clear a
  26.           out (trk),a          ; track 0
  27.           out (sect),a         ; sector 0
  28.           out (byte),a         ; byte 0
  29.           in a,(data)          ; get first test byte
  30.           cp 80h               ; test value
  31.           jr nz,clx            ; jump to clear board instructions
  32.           ld a,10h
  33.           out (byte),a
  34.           in a,(data)          ; second test byte
  35.           cp 80h
  36.           ret z                ; return if board set
  37.  
  38. clx:                           ; clear semidisk
  39.           xor a                ; clear a
  40.           out (byte),a         ; start byte count
  41.           ld d,80h             ; parity fill data
  42.           ld e,a               ; initial track
  43.           call settr           ; 2 parity tracks
  44.           call settr
  45.           ld d,0e5h            ; directory fill data
  46.           call settr
  47.           call settr
  48.           ret
  49.  
  50. settr:                         ; set track to value in d
  51.           ld a,e
  52.           out (trk),a          ; set track number
  53.           inc e                ; increment track number
  54.           xor a                ; clear sector counter
  55.           ld b,10h             ; count+sector port
  56. sectlp:   out (sect),a         ; set sector
  57.           inc a                ; increment sector number
  58.           ld h,b               ; store b
  59.           ld bc,8000h+data     ; count+data port
  60. bytelp:   out (c),d            ; enter data
  61.           djnz bytelp
  62.           ld b,h               ; recover b for outer loop
  63.           djnz sectlp
  64.           ret
  65.  
  66. slogin:   ret                  ; no action here
  67.  
  68. sread:    call setup
  69.                        if banked
  70.           jp rl                ; jump to common memory
  71.                        else
  72. rlu:      in d,(c)
  73.           ld (hl),d
  74.           add a,d
  75.           inc hl
  76.           djnz rlu
  77.                        endif
  78. srx:      call parity
  79.           in d,(c)
  80.           sub d
  81.  
  82.           ret z                ; normal exit
  83.  
  84.           ld a,(@ermde)        ; error mode
  85.           inc a                ; if (@ermde==0ffh get zero)
  86.           jr z,herror          ; if error messages are not being sent
  87.           call ?pderr
  88.           jp ?wboot
  89. herror:   inc a                ; error indicator = 1
  90.           ret
  91.  
  92. swrite:   call setup
  93.                        if banked
  94.           jp wl                ; jump to common memory
  95.                        else
  96. wlu:      add a,(hl)
  97.           outi
  98.           jr nz,wlu
  99.                        endif
  100. swx:      call parity
  101.           out (c),a
  102.           xor a                ; clear a
  103.           ret
  104.  
  105. setup:                         ; setup parameters for read & write
  106.           ld a,(@trk)
  107.           out (trk),a
  108.           ld a,(@sect)
  109.           out (sect),a
  110.           ld bc,8000h+data     ; count in b, data port in c
  111.           ld hl,(@dma)
  112.           xor a                ; clear a
  113.           out (byte),a
  114.                        if banked
  115.           ld a,(@dbnk)         ; bank for read or write
  116.                        endif
  117.           ret
  118.  
  119. parity:                        ; get parity word
  120.                        if not banked
  121.           ld d,a               ; keep a
  122.                        endif
  123.           ld a,(@trk)          ; get track
  124.           ld e,a               ;    & store in e
  125.           and 80h              ; keep bit 7
  126.           rlca                 ;    & move it to bit 1
  127.           out (trk),a          ; Use it as track number
  128.           ld a,e               ; get track again
  129.           and 78h              ; 01111000 binary
  130.           rrca                 ; right shift 3 times
  131.           rrca
  132.           rrca
  133.           out (sect),a         ; semidisk sector 0-15
  134.           ld a,e               ; get track again
  135.           and 7                ; 00000111 binary
  136.           rlca                 ; left shift 4 bits
  137.           rlca
  138.           rlca
  139.           rlca
  140.           ld e,a               ; hold in e
  141.           ld a,(@sect)         ; get sector
  142.           add a,e              ; form byte number
  143.           out (byte),a         ;    and pass to semidisk
  144.           ld a,d               ; restore a
  145.           ret
  146.                        if banked
  147.           cseg                 ; read & write in common
  148.  
  149. rl:       call ?bank
  150.           xor a
  151. rl1:      in d,(c)             ; read in byte
  152.           ld (hl),d            ; store in memory
  153.           add a,d              ; add to accumulator for parity
  154.           inc hl               ; inc memory pointer
  155.           djnz rl1             ; loop until b=0
  156.           ld d,a               ; keep a
  157.           ld a,(@cbnk)         ; restore bank
  158.           call ?bank
  159.           jp srx               ; return to banked memory
  160.  
  161. wl:       call ?bank
  162.           xor a
  163. wl1:      add a,(hl)           ; add to accumulator from memory
  164.           outi                 ; copy memory to port, inc registers
  165.           jr nz,wl1            ; loop until b=0
  166.           ld d,a               ; keep a
  167.           ld a,(@cbnk)         ; restore bank
  168.           call ?bank
  169.           jp swx               ; return to banked memory
  170.                        endif
  171.  
  172.           end
  173.