home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
TURBODSG
/
RS16.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
4KB
|
295 lines
;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