; 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