NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF ROOT/UNPAK *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/LIBPAK.I *-------------------------------------- ZPPakHdrPtr .EQ ZPBIN ZPPakDataPtr .EQ ZPBIN+2 ZPPakSrcPtr .EQ ZPBIN+4 *-------------------------------------- UNPAK.Mask .EQ ZPBIN+8 UNPAK.LastByte .EQ ZPBIN+9 UNPAK.Cnt .EQ ZPBIN+10 UNPAK.Ofs .EQ ZPBIN+12 UNPAK.BLOfs .EQ ZPBIN+14 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #16 ZP .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBPAK .DA LIBPAK L.CONST.PI .DA CONST.PI L.CONST.3 .DA CONST.3 L.MSG1 .DA MSG1 L.MSG2 .DA MSG2 L.MSG3 .DA MSG3 L.MSG4 .DA MSG4 L.MSG5 .DA MSG5 L.MSG6 .DA MSG6 L.MSG.UnpakErr .DA MSG.UnpakErr L.MSG.DEBUG.S3 .DA MSG.DEBUG.S3 .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBPAK >SYSCALL LoadLib bcs .9 sta hLIBPAK clc .9 rts *-------------------------------------- CS.RUN ldy #S.PS.ARGC lda (pPs),y bne CS.RUN.Pak jmp CS.RUN.Math *-------------------------------------- CS.RUN.Pak >PUSHWI 0 Aux type >PUSHBI 0 >PUSHBI O.RDONLY lda #1 >SYSCALL ArgV >SYSCALL RealPath >PUSHYA txa >STA.G PAK.hFileName >SYSCALL LoadFile bcs .9 >STYA.G PAK.FileSize txa >STA.G PAK.hFileBuf >LDYA.G PAK.FileSize >SYSCALL getmem bcs .9 >STYA ZPPakSrcPtr txa >STA.G PAK.hOutBuf >LDA.G PAK.hFileBuf >SYSCALL GetMemPtr >PUSHYA >PUSHW.G PAK.FileSize >LDA.G PAK.hOutBuf >SYSCALL GetMemPtr >STYA ZPPakHdrPtr >PUSHYA >PUSHEA.G PAK.Stat >LIBCALL hLIBPAK,LIBPAK.Pak bcc .1 .9 rts .1 >PUSHW.G PAK.Stat+S.PAKSTAT.STORE >PUSHW.G PAK.Stat+S.PAKSTAT.S4 >PUSHW.G PAK.Stat+S.PAKSTAT.S3 >PUSHW.G PAK.Stat+S.PAKSTAT.REP >PUSHW.G PAK.Stat+S.PAKSTAT.BL >PUSHW.G PAK.Stat+S.PAKSTAT.PASS2 >PUSHW.G PAK.Stat+S.PAKSTAT.PASS1 >PUSHW.G PAK.FileSize >PUSHBI 16 >LDYA L.MSG6 >SYSCALL printf *-------------------------------------- CS.RUN.Unpak lda ZPPakHdrPtr clc adc #S.PAKSTAT sta ZPPakDataPtr lda ZPPakHdrPtr+1 adc /S.PAKSTAT sta ZPPakDataPtr+1 lda (ZPPakHdrPtr) eor #$ff sta UNPAK.Cnt ldy #1 lda (ZPPakHdrPtr),y eor #$ff sta UNPAK.Cnt+1 lda #$80 sta UNPAK.Mask >LDA.G PAK.hFileBuf >SYSCALL GetMemPtr >STYA ZPPakSrcPtr stz UNPAK.Ofs stz UNPAK.Ofs+1 .1 inc UNPAK.Cnt bne .2 inc UNPAK.Cnt+1 bne .2 lda #0 sec rts .2 lda #'>' >SYSCALL PutChar jsr CS.RUN.UnpakGetBitInC bcs .3 *-------------------------------------- * SHORT3 ldx #3 jsr CS.RUN.UnpakGetXBitInA clc adc #S.PAKHDR.SHORT3 tay lda (ZPPakHdrPtr),y sta UNPAK.LastByte jsr DEBUG.S3 jsr CS.RUN.UnpakCmpA bcs .9 bra .1 .3 jsr CS.RUN.UnpakGetBitInC bcs .4 *-------------------------------------- * SHORT4 ldx #4 jsr CS.RUN.UnpakGetXBitInA clc adc #S.PAKHDR.SHORT4 tay lda (ZPPakHdrPtr),y sta UNPAK.LastByte jsr CS.RUN.UnpakCmpA bcs .9 bra .1 .4 jsr CS.RUN.UnpakGetBitInC bcs .5 *-------------------------------------- * REPn ldx #4 jsr CS.RUN.UnpakGetXBitInA tay tax lda UNPAK.LastByte .41 jsr CS.RUN.UnpakCmpA bcs .9 dey bne .41 .42 txa clc adc UNPAK.Cnt sta UNPAK.Cnt bcc .2 inc UNPAK.Cnt+1 bra .2 .5 jsr CS.RUN.UnpakGetBitInC bcs .6 *-------------------------------------- * BACKLINK ldx #4 jsr CS.RUN.UnpakGetXBitInA sta UNPAK.BLOfs+1 jsr CS.RUN.UnpakGetByteInA sta UNPAK.BLOfs jsr CS.RUN.UnpakGetByteInA tax tay .51 bra .42 *-------------------------------------- * STOREn .6 ldx #4 jsr CS.RUN.UnpakGetXBitInA tay tax .61 jsr CS.RUN.UnpakGetByteInA dey bne .61 sta UNPAK.LastByte bra .42 .9 >PUSHW UNPAK.Ofs >PUSHBI 2 >LDYA L.MSG.UnpakErr >SYSCALL printf lda #0 sec rts *-------------------------------------- CS.RUN.UnpakGetByteInA ldx #8 *-------------------------------------- CS.RUN.UnpakGetXBitInA lda #0 .1 jsr CS.RUN.UnpakGetBitInC rol dex bne .1 rts *-------------------------------------- CS.RUN.UnpakGetBitInC pha clc lda (ZPPakDataPtr) and UNPAK.Mask beq .1 sec .1 php lsr UNPAK.Mask bne .8 lda #$80 sta UNPAK.Mask inc ZPPakDataPtr bne .8 inc ZPPakDataPtr+1 .8 plp pla rts *-------------------------------------- CS.RUN.UnpakCmpA cmp (ZPPakSrcPtr) bne .9 inc ZPPakSrcPtr bne .1 inc ZPPakSrcPtr+1 .1 inc UNPAK.Ofs bne .8 inc UNPAK.Ofs+1 .8 clc rts .9 sec rts *-------------------------------------- DEBUG.S3 pha phx phy >PUSHA >PUSHBI 1 >LDYA L.MSG.DEBUG.S3 >SYSCALL printf ply plx pla rts *-------------------------------------- CS.RUN.Math >PUSHEA.G ENDPTR >LDYA L.CONST.PI >SYSCALL StrToF >PULLF.G MYFLOAT.PI >PUSHEA.G ENDPTR >LDYA L.CONST.3 >SYSCALL StrToF >PULLF.G MYFLOAT.3 >PUSHF.G MYFLOAT.PI >PUSHF.G MYFLOAT.3 >PUSHF FLOAT5 >PUSHF FLOAT4 >PUSHF FLOAT3 >PUSHF FLOAT2 >PUSHF FLOAT1 >PUSHBI 35 >LDYA L.MSG1 >SYSCALL printf *-------------------------------------- >PUSHF.G MYFLOAT.PI >PUSHF.G MYFLOAT.3 >SYSCALL FDiv >PULLF.G MYFLOAT3 >PUSHF.G MYFLOAT3 >PUSHBI 5 >LDYA L.MSG2 >SYSCALL printf *-------------------------------------- >PUSHF.G MYFLOAT3 >SYSCALL Cos >PULLF.G MYFLOAT3 >PUSHF.G MYFLOAT3 >PUSHBI 5 >LDYA L.MSG3 >SYSCALL printf *-------------------------------------- >PUSHF FLOAT1 >SYSCALL LRIntF >PULLL.G MYLONG >PUSHL.G MYLONG >PUSHBI 4 >LDYA L.MSG4 >SYSCALL printf *-------------------------------------- >PUSHL LONG1 >SYSCALL Float * >PULLF.G MYFLOAT3 * >PUSHF.G MYFLOAT3 >PUSHBI 5 >LDYA L.MSG5 >SYSCALL printf lda #0 sec rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT >LDA.G PAK.hFileName beq .1 >SYSCALL FreeMem .1 >LDA.G PAK.hFileBuf beq .2 >SYSCALL FreeMem .2 >LDA.G PAK.hOutBuf beq .8 >SYSCALL FreeMem .8 lda hLIBPAK >SYSCALL UnloadLib clc rts *-------------------------------------- CS.END LIBPAK .AZ "libpak.o" hLIBPAK .BS 1 MSG1 .AS "PrintF:\r\n" .AS " %e, %e, %e, %e, %e\r\n" .AS "StrToF:\r\n" .AZ " %e, %e\r\n" MSG2 .AZ "PI/3=%e\r\n" MSG3 .AZ "COS(PI/3)=%e\r\n" MSG4 .AZ "LRIntF(99,999,999.9)=%L\r\n" MSG5 .AZ "Float(123456789)=%e\r\n" CONST.PI .AZ "3.141592653" CONST.3 .AZ "3" FLOAT1 .HS 9B3EBC1FFD 99,999,999.9 FLOAT2 .HS 9E6E6B27FD 999,999,999 FLOAT3 .HS 9E6E6B2800 1,000,000,000 FLOAT4 .HS 8100000000 1 FLOAT5 .HS 9080000000 -32768 LONG1 .DA >123456789 *-------------------------------------- MSG6 .AS "Src Length : %D\r\n" .AS "Pass #1 : %D\r\n" .AS "Pass #2 : %D\r\n" .AS "BL Count : %D\r\n" .AS "REP Count : %D\r\n" .AS "S3 Count : %D\r\n" .AS "S4 Count : %D\r\n" .AZ "STO Count : %D\r\n" MSG.UnpakErr .AZ "UnPak Error at Offset : %H\r\n" MSG.DEBUG.S3 .AZ "S3:%h\r\n" *-------------------------------------- .DUMMY .OR 0 DS.START MYFLOAT.PI .BS 5 MYFLOAT.3 .BS 5 MYFLOAT3 .BS 5 MYLONG .BS 4 ENDPTR .BS 2 PAK.hFileName .BS 1 PAK.FileSize .BS 2 PAK.hFileBuf .BS 1 PAK.hOutBuf .BS 1 PAK.Stat .BS S.PAKSTAT DS.END .ED *-------------------------------------- MAN SAVE BIN/UNPAK.S ASM