******************************************************* * USQ support code * * 10/12/83 by Dave Rand * ******************************************************* ; ; Changes made by S. Kluger to allow use under SYSLIB. ; The following SYSLIB routines are used: ; extrn bdos ;BDOS call routine extrn print ;In place of ILPRT extrn cout ;Character out routine ; ; The following labels must be defined in the calling program: ; extrn fcb ;file control block addr extrn buff ;ram buffer start extrn topram ;end of buffer (hi byte only) extrn erext ;error exit routine extrn table ;pointer to 1032 bytes extrn bufull ;called when buffer full ;(this routine processes the filled ; buffer and then returns for more.) ; public usq ;unsqueeze entry point ; eof: equ 1ah dle: equ 090h ; ;this is start of baseline USQ code ; usq: xra a ;force init char read sta numlft sta rcnt ;and zero repeats lhld lastmem shld sob shld eob call getw usq1: call getw ;get cksum, and store shld filecrc usq2: call get1 jnz erext ora a jnz usq2 usq3a: call getw shld numvals lxi d,258 call cmpdehl jc usq3b call errext db 13,10,'File has illegal decode size. Aborting.',0 ; usq3b: lxi d,table usq4: shld max mov a,h ora l jz usq5 push d call getw pop d xchg mov m,e inx h mov m,d inx h push h call getw xchg pop h mov m,e inx h mov m,d inx h xchg lhld max dcx h jmp usq4 ; usq5: lxi h,0 usq6: push h call getnxt pop h jnz usq8 mov e,a mvi d,0 dad d push h push psw LHLD nextadr ; PT TO LOAD ADDRESS LDA topram ; CHECK AGAINST END PAGE OF TPA CMP H ; IF AT SAME PAGE, YES jnz nofull ;buffer is not full yet call bufull ;buffer full, process buffer lxi h,buff ;reset buffer pointer nofull: pop psw mov m,a inx h shld nextadr pop h jmp usq6 ; usq8: xchg lhld filecrc call cmpdehl usq9: rz call print db 13,10,'ERROR - Checksum error in file ',0 jmp erext ; errext: pop h mov a,m ora a jz erext inx h push h call cout jmp errext ; cmpdehl: mov a,h cmp d rnz mov a,l cmp e ret ; get1: lhld eob xchg lhld sob call cmpdehl jz get1r mov a,m inx h shld sob cmp a ret ; get1r: lhld lastmem shld sob shld eob get1r1: push h xchg mvi c,26 call bdos lxi d,fcb mvi c,20 call bdos pop h ora a jnz get1r2 lxi d,128 dad d xchg lhld endmem call cmpdehl xchg jnc get1r1 get1r2: shld eob xchg lhld sob call cmpdehl jnz get1 mvi a,255 ora a ret ; getw: call get1 jnz badr push psw call get1 jnz badr mov h,a pop psw mov l,a ret ; badr: call print db 13,10,'Premature EOF on file... aborted.',0 jmp 0 ; getnxt: lda rcnt ;see if in the middle of ora a ;repeat sequence... jz getn7 dcr a sta rcnt lda last cmp a ret getn7: call getn4 cpi dle jnz getn5 call getn4 ora a jnz getn6 mvi a,dle ;dle is encoded as dle,0 cmp a ret getn6: dcr a dcr a sta rcnt lda last cmp a ret getn5: sta last cmp a ret ; getn4: lxi d,0 ;pointer @ sot lda char mov c,a getn1: lda numlft ora a jnz getn2 push d call get1 jnz badr pop d mov c,a mvi a,8 getn2: dcr a sta numlft mov a,c rrc mov c,a lxi h,table jnc getn3 inx h inx h ;add 2 to point to right node getn3: dad d dad d dad d dad d ;ok.. pointing close to right plc.. mov e,m inx h mov d,m mov a,d ani 128 jz getn1 mov a,c sta char mov a,d cpi 254 ;is special eof? mvi a,eof jz geteof ;yup mov a,e cma cmp a ret ; geteof: pop h ora a ret ; ;end of baseline USQ code ; lastmem:dw 80h endmem: dw 80h+127 sob: dw 80h eob: dw 80h ; nextadr:dw buff numlft: ds 1 rcnt: ds 1 filecrc:ds 2 last: ds 1 char: ds 1 numvals:ds 2 max: ds 2