home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
turbodsg
/
rs.mac
< prev
next >
Wrap
Text File
|
1994-07-13
|
8KB
|
454 lines
; RS version 1.40 (c) 1986 ESKAY Software Service
;
; N O T E
;
; RS is a variant of RELED with a certain specific purpose.
; ESKAY Software Service does not support or encourage
; copyright infringements and RS should only be used
; in cases of extreme emergency, or after clearing its use
; with the copyright holder!!!!!
;
.z80
;
cr equ 0dh
lf equ 0ah
dfcb equ 5ch
dbuf equ 80h
;
; syslib externals
;
.request syslib
extrn print,phl4hc,phlfdc,pfn2,crlf,pstr
extrn bbline,condin,cout,eval10,compb
extrn f$open,f$read,f$write,f$close,initfcb
extrn codend
;
; other externals
;
extrn getbit ;get one bit from bit field
extrn putbit ;put one bit into bit field
extrn wildex
;
cseg
;
begin: ld sp,stack
call print
db cr,lf,lf
db 9,9,' ----------------------------------------',cr,lf
db 9,9,'| RS version 1.4 |',cr,lf
db 9,9,'| RESERIALIZER |',cr,lf
db 9,9,'| USE THIS PROGRAM RESPONSIBLY |',cr,lf
db 9,9,'| (c) infrigement is YOUR responsibility |',cr,lf
db 9,9,' ----------------------------------------',cr,lf,lf,0
ld a,(dfcb+1)
cp ' '
jp z,nofile
ld hl,dfcb+9
ld (hl),'R'
inc hl
ld (hl),'E'
inc hl
ld (hl),'L'
getor: call print
db cr,lf
db 'Enter new value for ?ORIG? in DECIMAL : ',0
call bbline
or a
jr z,getor
call eval10
ld (newo),de
getun: call print
db cr,lf
db 'Enter new value for ?UNIT? in DECIMAL : ',0
call bbline
or a
jr z,getun
call eval10
ld (newu),de
call codend ;get buffer addr
ld (fnbuf),hl
ld de,1000h ;handle up to 256 files
add hl,de
ld (buffer),hl
push hl
pop ix ;ix is buffer ptr
ld de,dfcb
ld hl,(fnbuf)
call wildex
jp z,nofile
call print
db cr,lf
db 'Matching files: ',0
call phlfdc
inc hl
ld (files),hl
call print
db cr,lf,lf,0
nextf: ld hl,(files)
dec hl
ld (files),hl
ld a,h
or l
jp z,finish
xor a
ld (chgd),a
ld (bithi),a
ld h,a
ld l,a
ld (bitml),hl
ld de,dfcb
ld hl,(fnbuf)
ld bc,16
ldir
ld (fnbuf),hl
ld de,dfcb ;point to file name
call initfcb
push de
inc de
call print
db cr,lf
db 'Now processing ',0
call pfn2
pop de
call f$open ;open it
jp nz,notfnd ;not there!
ld hl,(buffer) ;hl=buffer start
lodlp: call f$read ;read a sector
jr nz,allrd ;done?
ld bc,dbuf ;bc=buffer ptr
movlp: ld a,(bc)
ld (hl),a
inc hl
inc c
jr nz,movlp
jr lodlp
;
allrd: call f$close
call print
db ', size ',0
ld (eofptr),hl
push hl
ld hl,(buffer)
ex de,hl
pop hl
or a
sbc hl,de
call phl4hc
call print
db 'H bytes.',cr,lf,lf,0
;
; this is the main evaluation loop
; come here for every new item
;
eval: ld e,0
call get1 ;get 1 bit
or a
jr nz,not8
call get8 ;get next 8 bits (and swallow them)
jr eval
;
; get next 2 bits and interpret
;
not8: call get2
or a ;see if special item
jr z,spec
call get8 ;swallow 16 bits
call get8
jr eval
;
; evaluate special item
;
spec: call get4 ;get 4-bit field
;
; following items followed by name field
;
or a ;entry symbol
jp z,skipn ;skip name
cp 1 ;select common
jp z,skipn ;skip name
cp 2
jp z,name ;display module name
cp 3 ;request item
jp z,skipn
;
; following items followed by value and name field
;
cp 5 ;common size
jp z,skpvn ;skip val/name
cp 6 ;chain external
jp z,skpvn ;skip it
cp 7 ;define entry point
jp z,ckntry ;check if we want something
;
cp 15 ;end of file?
jp z,eof
cp 14 ;end module
jp z,endm
;
; all others followed by value field
; let's swallow it
;
call skpval
jr eval
;
; end of module - skip to next byte boundary
;
endm: ld a,9 ; a tab
call cout
ld a,(rsmod)
or a ; rsed this?
ld hl,rsedy
jr nz,.em..
ld hl,rsedn
.em..: call pstr
call crlf
call skpval
ld hl,(bitml)
ld de,7
add hl,de
jr nc,..em
ld a,(bithi)
inc a
ld (bithi),a
..em: ld a,l
and 0f8h
ld l,a
ld (bitml),hl
jp eval
;
eof: call print
db cr,lf
db 'end of file',cr,lf,0
ld a,(chgd)
or a
jr nz,wrback
call print
db 'Unchanged - not saved',cr,lf,0
jp nextf
;
wrback: ld de,dfcb
call initfcb
call f$open
jr z,opnok
call print
db cr,lf
db '*** cannot open file ***',cr,lf,0
jp nextf
;
opnok: ld hl,(buffer) ;get start of buffer
svlp: ld bc,dbuf
..sav: ld a,(hl)
ld (bc),a
inc hl
inc c
jr nz,..sav
ld de,dfcb
call f$write
jr nz,wrerr
ld de,(eofptr)
push hl
sbc hl,de
pop hl
jr nz,svlp
ld de,dfcb
call f$close
inc de
call pfn2
call print
db ' written back, all modules serialized ',0
ld hl,(newo)
call phlfdc
ld a,'/'
call cout
ld hl,(newu)
call phlfdc
call crlf
jp nextf
;
wrerr: call print
db cr,lf
db '*** write error - aborted ***',cr,lf,0
jp nextf
;
ckntry: call get2 ;get type
or a ;absolute?
jr z,abs
call get8
call get8
jp skipn
;
abs: ld hl,(bitml)
ld (savml),hl
ld a,(bithi)
ld (savhi),a
call get8 ;get first half
call get8 ;get second half
call dspnam
ld hl,nme
ld de,orig
ld b,7
call compb
ld de,(newo)
jr z,chg
ld de,unit
call compb
jp nz,eval
ld de,(newu)
chg: ld a,e ;get low byte
call put8b ;stash 8 bits into REL file
ld a,d ;get high byte
call put8b
ld a,1
ld (chgd),a
jp eval
;
put8b: push de ;save word
ld e,a ;save byte
ld a,(savhi)
ld d,a
ld hl,(savml)
ld b,8 ;8 bits to process
..put: rlc e ;put bit in position
ld a,e ;get byte
and 1 ;isolate bit
ld c,a
call putbit
call incbit ;point to next bit in file
djnz ..put ;do it 8 times
ld a,1
ld (rsmod),a ; set "module reserialized" flag
ld (savml),hl
ld a,d
ld (savhi),a
pop de
ret
;
name: xor a
ld (rsmod),a ; reset flag
call dspnam1
jp eval
;
dspnam1:exx
ld l,0
jr .dsp..
;
dspnam: exx
ld l,1
.dsp..: exx
ld e,0
call get3 ;get name length
ld iy,nme
ld b,a ;length into b
namelp: push bc
call get8 ;get a byte
exx
bit 0,l
exx
call z,cout
ld (iy+0),a
inc iy
pop bc
djnz namelp
ld (iy+0),0
ret
;
skpvn: call skpval
;
; skip a name
;
skipn: ld e,0
call get3 ;get name field length
ld b,a ;length into b
skipnl: push bc
call get8 ;swallow 8 bits
pop bc
djnz skipnl
jp eval
;
skpval: ld e,0
call get2
call get8
;
; the following routines return 1,2,3,4, or 8 bits in A.
; when calling, E must be zero!
;
get8: call get4
ld e,a
get4: call get3
ld e,a
jr get1
;
; get next 3 bits into A
;
get3: call get2 ;get 2 bits
ld e,a
jr get1
;
; get next 2 bits into A
;
get2: call get1
ld e,a
get1: ld a,(bithi)
ld d,a
ld hl,(bitml)
call getbit
rlc e
or e
push af
call incbit
ld (bitml),hl
ld a,d
ld (bithi),a
pop af
ld e,0 ;make this re-entrant
ret
;
incbit: inc hl
ld a,h
or l
ret nz
inc d
ret
;
notfnd: call print
db 'File not found',cr,lf,0
jp nextf
;
finish: call print
db cr,lf,lf
db '*** all done ***',cr,lf,0
rst 0
;
nofile: call print
db 'No file specified',cr,lf,lf
db 'Usage:',cr,lf
db '0A}RS FILENAME[.REL]',cr,lf
db 'program prompts for input',cr,lf
db 'NOTE: the author cannot assume any liability',cr,lf
db 'for copyright violation by the user!',cr,lf,lf,0
rst 0
;
dseg
;
nme: ds 10
orig: db '?ORIG?',0
unit: db '?UNIT?',0
rsmod: db 0
rsedy: db ' reserialized.',0
rsedn: db ' unserialized.',0
chgd: db 0
newo: dw 1111h
newu: dw 2222h
fnbuf: dw 0
files: dw 0
buffer: dw 0
eofptr: dw 0
bitml: dw 0 ;bit address medium+low
bithi: db 0 ;bit address high
savml: dw 0
savhi: db 0
ds 80
stack equ $
end
d e,a