;RS-16
;
cr      equ     0dh
lf      equ     0ah
;
dfcb    equ     5ch
dbuf    equ     80h
;
       extrn   f$open,f$close,f$read,f$write
       extrn   scanner,codend,cout
       extrn   bbline,print,phl4hc,eval16,phlfdc
       extrn   initfcb,pfn2,crlf
       extrn   wildex
;
z80
;
start:  ld      sp,stack
       call    print
       cr,lf
       ' --------------------------------------------------',cr,lf
       '|      RS-16 reserializer for 16-bit TurboDOS      |',cr,lf
       '| WARNING: (c) infringement is YOUR responsibility |',cr,lf
       ' --------------------------------------------------',cr,lf,lf,0
       ld      a,(dfcb+1)
       cp      ' '
       jr      nz,..ct1
       call    print
       'No file specified',cr,lf,0
       rst     0
;
.ct1:   ld      a,(dfcb+9)
       cp      'O'
       jr      nz,..noo
       ld      hl,(dfcb+10)
       ld      de,'  '
       xor     a
       sbc     hl,de
       jr      nz,..noo
       call    codend
       ld      de,dfcb
       call    wildex
       jr      nz,..ct2
       call    print
       'File(s) not found',cr,lf,0
       rst     0
;
.noo:   call    print
       'File(s) must be type .O',cr,lf,0
       rst     0
;
.ct2:   call    phlfdc
       call    print
       ' files matched.',cr,lf,lf
       'Enter: New Origin (hex) : ',0
       push    hl
       ld      a,1
       call    bbline
       call    eval16
       ld      (neworg),de
       call    print
       cr,lf
       '       New Unit (hex)   : ',0
       ld      a,1
       call    bbline
       call    eval16
       ld      (newuni),de
       pop     hl
       inc     hl
       ld      (count),hl              ;save # of files
       ex      de,hl
       ld      hl,0
       ld      bc,16                   ;find file buffer start
.mlp:   add     hl,bc
       dec     de
       ld      a,d
       or      e
       jr      nz,..mlp
       ex      de,hl
       call    codend
       ld      (fcbs),hl
       add     hl,de
       inc     h
       ld      l,0
       ld      (buffer),hl
;
; come here for each file
;
loop:   ld      hl,(count)
       dec     hl
       ld      (count),hl
       ld      a,h
       or      l
       jp      z,done
       ld      hl,(fcbs)
       ld      bc,16
       ld      de,dfcb
       ldir
       ld      (fcbs),hl
       ld      de,dfcb
       call    initfcb
       call    print
       cr,lf,lf
       'Now processing ',0
       inc     de
       call    pfn2
       call    crlf
       ld      de,dfcb
       call    f$open
       ld      hl,(buffer)
       ld      (bufptr),hl
       xor     a
       ld      (chgd),a
rdlp:   call    f$read
       jr      nz,allrd
       ld      hl,(bufptr)
       ld      bc,dbuf
.mvl:   ld      a,(bc)
       ld      (hl),a
       inc     hl
       inc     c
       jr      nz,..mvl
       ld      (bufptr),hl
       jr      rdlp
;
allrd:  call    f$close
       ld      hl,(bufptr)
       ld      (bufend),hl
       ld      hl,(buffer)
       ld      (bufptr),hl
.fol:   call    findo
       jr      nz,lku                  ;exhausted, look for unit
       push    hl                      ;save pointer
       call    getbd                   ;get seg=BC, val=DE
       ld      a,b
       or      c
       jr      nz,..no1
       push    hl                      ;(HL=.val)
       call    print
       cr,lf
       '"Origin" value ',0
       push    bc
       pop     hl
       call    phl4hc
       ld      a,':'
       call    cout
       ex      de,hl
       call    phl4hc
       ld      de,(neworg)
       pop     hl
       ld      (hl),e
       inc     hl
       ld      (hl),d
.no1:   pop     hl
       jr      ..fol
;
lku:    ld      hl,(buffer)
.ful:   call    findu
       jr      nz,endsb                ;end of substitutions
       push    hl                      ;save pointer
       call    getbd                   ;get seg=BC, val=DE
       ld      a,b
       or      c
       jr      nz,..nu1
       push    hl                      ;(HL=.val)
       call    print
       cr,lf
       '"Unit"   value ',0
       push    bc
       pop     hl
       call    phl4hc
       ld      a,':'
       call    cout
       ex      de,hl
       call    phl4hc
       ld      de,(newuni)
       xor     a
       sbc     hl,de
       jr      z,ch
       ld      a,1
       ld      (chgd),a
ch:     pop     hl
       ld      (hl),e
       inc     hl
       ld      (hl),d
.nu1:   pop     hl
       jr      ..ful
;
endsb:  ld      a,(chgd)
       or      a
       jp      z,loop
;
; write back to disk
;
       ld      de,dfcb
       call    initfcb
       call    f$open          ;open for write
       ld      hl,(buffer)
       ld      (bufptr),hl
wrlp:   ld      hl,(bufptr)
       ld      bc,(bufend)
       ld      a,b
       cp      h
       jr      nz,..ne
       ld      a,c
       cp      l
       jr      z,wrend
.ne:    ld      bc,80h
.ss:    ld      a,(hl)
       ld      (bc),a
       inc     hl
       inc     c
       jr      nz,..ss
       ld      (bufptr),hl
       call    f$write
       jr      wrlp
;
wrend:  call    f$close
       JP LOOP
;
getbd:  dec     hl
       ld      a,(hl)
       cp      ' '+1
       jr      nc,getbd
       ld      b,(hl)
       dec     hl
       ld      c,(hl)
       dec     hl
       ld      d,(hl)
       dec     hl
       ld      e,(hl)
       ret
;
findu:  ld      de,unit
       jr      ..fnd
;
findo:  ld      de,orgin
.fnd:   push    de
.flop:  ld      a,(de)
       or      a
       jr      z,..fxt
       cp      (hl)
       inc     hl
       call    ..ckb
       jr      nz,..nfd
       inc     de
       jr      ..flop
;
.nfd:   pop     de
       jr      ..fnd
;
.fxt:   pop     de
       xor     a
       ret
;
.ckb:   ld      bc,(bufend)
       push    af
       ld      a,b
       cp      h
       jr      nz,..nbd
       ld      a,c
       cp      l
       jr      nz,..nbd
       pop     af
       pop     de              ;dummy
       pop     de
       xor     a
       inc     a
       ret
;
.nbd:   pop     af
       ret
;
done:   call    print
       cr,lf,lf
       '*** END OF EXECUTION ***',cr,lf,lf,0
       rst     0
;
neworg: dw      24
newuni: dw      227
orgin:  db      'Origin',0
unit:   db      'Unit',0
chgd:   db      0               ;0=no change, NZ=must write
fcbs:   dw      0               ;pointer to next file name
buffer: dw      0               ;buffer start
bufptr: dw      0
bufend: dw      0
count:  dw      0               ;file count
       ds      80
stack   equ     $
       end
(hl)
       ld      (bc),a
       inc     hl
       inc     c
       jr      nz,..ss