Metropoli BBS
VIEWER: rfu.s MODE: TEXT (ASCII)
**********************************************************************
* Name:		RFU
* Desc:		RF uncompressor
**********************************************************************
ASSEMBLE
	CON(1)	8
RPL
xNAME RFU
::
  CK1&Dispatch
  str
  ::
    CODE
		GOSBVL	=SAVPTR
		A=DAT1	A
		D1=A			->str
		D1=D1+	5
		A=DAT1	A
		C=0	A
		LC(1)	#F
		?A<C	A
		GOYES	rfubad		Too small to be RF object
		D1=D1+	5
		A=DAT1	A
		LC(5)	#24652		RF ID
		?A#C	A
		GOYES	rfubad
		D1=D1+	5
		GOSBVL	=ROOM
		A=DAT1	A
		A=A+CON	A,10
		?A>=C	A
		GOYES	+
+		GOVLNG	=GPPushT/FLp
rfubad		LC(5)	=SETTYPEERR
		GOVLNG	=GETPTREVALC
     ENDCODE
     IT GARBAGE
     CODE
		GOSBVL	=SAVPTR
		A=DAT1	A
		D1=A
		D1=D1+	15
		A=DAT1	A
		D1=D1+	5
		CD1EX
		RSTK=C
		C=A	A
		RSTK=C
		GOSBVL	=GETTEMP
		GOSBVL	=D1=DSKTOP
		CD0EX
		DAT1=C	A
		D1=C
		C=RSTK
		R2=C.F	A
		C=RSTK
		R3=C.F	A
		GOSUB	DORFU
		GOSBVL	=GETPTRLOOP

DORFU		C=R3.F	A
		D0=C
		D=0	X
RFUloop		D=D-1	XS
		GONC	+
		LC(3)	#700
		C=DAT0	B
		D0=D0+	2
		D=C	X
+		D=D+D	B
		GOC	+
		GOTO	RFUpat
+		LC(2)	4
		GOSUB	RFUbits
		?A#0	B
		GOYES	RFUexpand
		LC(2)	5
		GOSUB	RFUbits
		?A=0	B
		GOYES	+
		LC(2)	#1F
		A=A+C	B
		GOTO	RFUexpand
+		LC(2)	#5F
		GOSBVL	=MOVEDOWN
		A=R2.F	A
		LC(5)	#5F
		A=A-C	A
		GOC	RFUgofail
		?A=0	A
		RTNYES
		R2=A.F	A
		GOTO	RFUloop
RFUgofail	GOTO	RFUfail

RFUexpand	B=A	A
		C=A	A
		GOSBVL	=MOVEDOWN
		C=R2.F	A
		C=C-B	A
		GOC	RFUgofail
		?C=0	A
		RTNYES
		R2=C.F	A
RFUpat		LC(2)	2
		GOSUB	RFUbits
		?A#0	B
		GOYES	+
		A=A+CON	B,8
+		A=A+CON	B,4
		R0=A.F	A
		LC(2)	7
		GOSUB	RFUbits
		CD0EX
		R3=C.F	A
		C=R0.F	A
		B=C	A
		A=A+1	A
		CD1EX
		D1=C
		C=C-A	A
		D0=C
		B=B-1	B
-		C=DAT0	B
		DAT1=C	1
		D0=D0+	1
		D1=D1+	1
		B=B-1	B
		GONC	-
		C=R2.F	A
		A=R0.F	A
		C=C-A	A
		GOC	RFUshit
		?C=0	A
		RTNYES
		R2=C.F	A
		C=R3.F	A
		D0=C
		GOTO	RFUloop
RFUshit		GOTO	RFUfail

RFUbits		B=C	B
		A=0	A
--		A=A+A	B
		D=D-1	XS
		GOC	++
-		D=D+D	B
		GONC	+
		A=A+1	B
+		B=B-1	B
		GONC	--
		RTN
++		LC(3)	#700
		C=DAT0	B
		D0=D0+	2
		D=C	X
		GONC	-
RFUfail		LC(5)	=SETSIZEERR	* This makes no sense in overflows *
		GOVLNG	=GETPTREVALC	* Could cause a crash *
    ENDCODE
  ;
;

**********************************************************************
[ RETURN TO DIRECTORY ]