NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF BIN/PAKME *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/KERNEL.I .INB INC/PAK.I .INB INC/LIBPAK.I .INB INC/MLI.E.I *-------------------------------------- CHUNK.MAX .EQ 32 *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPPtr1 .BS 2 ZPPtr2 .BS 2 ZPSrcBufPtr .BS 2 ZPDstBufPtr .BS 2 ZPSrcFileSize .BS 2 ZPDstTableOfs .BS 2 ZPChunkIndex .BS 1 ZPChunkCnt .BS 1 ZPChunkOfs .BS 2 ZPChunkLen .BS 2 hSrcFile .BS 1 hDstFile .BS 1 bPause .BS 1 ZS.END .ED *-------------------------------------- * 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 Code Size (without Constants) .DA DS.END-DS.START Data SegmentSize .DA #64 Stack Size .DA #ZS.END-ZS.START Zero Page Size .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBPAK .DA LIBPAK L.MSG.USAGE .DA MSG.USAGE L.MSG.SRCFILE .DA MSG.SRCFILE L.MSG.CHUNK .DA MSG.CHUNK L.MSG.OK .DA MSG.OK L.MSG.ERR .DA MSG.ERR L.MSG.E.IARC .DA MSG.E.IARC L.TAG .DA TAG .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBPAK >SYSCALL LoadLib bcs .9 sta hLIB .9 rts *-------------------------------------- CS.RUN ldy #S.PS.ARGC lda (pPs),y cmp #2 bne .9 jsr CS.RUN.CheckSrcFile bcs .99 >PUSHW.G STATBUF+S.STAT.P.AUXTYPE >PUSHB.G STATBUF+S.STAT.P.TYPE >PUSHBI O.CREATE+O.WRONLY lda #2 >SYSCALL ArgV >SYSCALL FOpen bcs .99 sta hDstFile bra CS.RUN.START .9 >PUSHBI 0 >LDYA L.MSG.USAGE >SYSCALL printf lda #E.SYN sec .99 rts *-------------------------------------- CS.RUN.START >PUSHB.G PAKME.HEADER+7 >PUSHW ZPSrcFileSize >PUSHW.G PAKME.HEADER+5 lda #1 >SYSCALL ArgV >PUSHYA >PUSHBI 7 >LDYA L.MSG.SRCFILE >SYSCALL printf *-------------------------------------- CS.RUN.LOOP ldy #S.PS.hStdIn lda (pPS),y >SYSCALL feof bcs .9 tay bne .1 >SYSCALL GetChar bcs .9 cmp #$03 Ctrl-C beq .9 Abort.... cmp #$13 Ctrl-S bne .1 lda bPause eor #$ff sta bPause bne CS.RUN.LOOP .1 lda bPause bne CS.RUN.LOOP Pause... *-------------------------------------- jsr CS.RUN.GetChunk bcs .9 >PUSHW ZPChunkLen >PUSHW ZPChunkOfs >PUSHB ZPChunkIndex >PUSHBI 3 >LDYA L.MSG.CHUNK >SYSCALL printf dec ZPChunkCnt beq .8 jmp CS.RUN.LOOP .8 lda #0 sec .9 rts *-------------------------------------- CS.RUN.CheckSrcFile >PUSHWZ Aux type >PUSHBI 0 Type >PUSHBI O.RDONLY lda #1 >SYSCALL ArgV >SYSCALL FOpen bcs .99 sta hSrcFile >PUSHEA.G STATBUF lda hSrcFile >SYSCALL fstat .99 bcs .9 >LDA.G STATBUF+S.STAT.SIZE+3 dey ora (pData),y bne .90 dey lda (pData),y sta ZPSrcFileSize+1 dey lda (pData),y sta ZPSrcFileSize jsr CS.RUN.CheckTAG bcs .9 jsr CS.RUN.GetTable bcs .9 clc rts .90 lda #MLI.E.INCFF sec .9 CS.RUN.CheckSrcFile.RTS rts *-------------------------------------- CS.RUN.CheckTAG >PUSHBI SEEK.SET >PUSHWZ lda ZPSrcFileSize sec sbc #10 tay lda ZPSrcFileSize+1 sbc #0 >PUSHYA lda hSrcFile >SYSCALL fseek bcs CS.RUN.CheckSrcFile.RTS >PUSHWI 10 >PUSHEA.G PAKME.HEADER lda hSrcFile >SYSCALL fread bcs CS.RUN.CheckSrcFile.RTS ldx #4 ldy #PAKME.HEADER+4 .1 lda TAG,x cmp (pData),y bne .90 dey dex bpl .1 clc rts .90 lda #MLI.E.INCFF sec .9 rts *-------------------------------------- CS.RUN.GetTable >PUSHBI SEEK.SET >PUSHWZ >LDA.G PAKME.HEADER+8 sec >SBC.G PAKME.HEADER+5 sta ZPDstTableOfs+1 pha >LDA.G PAKME.HEADER+9 >SBC.G PAKME.HEADER+6 sta ZPDstTableOfs ply >PUSHYA lda hSrcFile >SYSCALL fseek bcs .9 >LDA.G PAKME.HEADER+7 sta ZPChunkCnt asl tay lda #0 >PUSHYA >PUSHEA.G PAKME.TABLE lda hSrcFile >SYSCALL fread .9 rts *-------------------------------------- CS.RUN.GetChunk lda ZPChunkIndex inc ZPChunkIndex asl clc adc #PAKME.TABLE+1 tay lda (pData),y pha dey lda (pData),y sec ldy #PAKME.HEADER+5 sbc (pData),y sta ZPChunkOfs iny pla sbc (pData),y sta ZPChunkOfs+1 >PUSHBI SEEK.SET >PUSHWZ >PUSHW ZPChunkOfs lda hSrcFile >SYSCALL fseek bcs .9 >PUSHWI 3 >PUSHEA.G CHUNK.HEADER lda hSrcFile >SYSCALL fread bcs .9 >LDA.G CHUNK.HEADER * bne .90 >LDA.G CHUNK.HEADER+1 sta ZPChunkLen iny lda (pData),y sta ZPChunkLen+1 clc rts .90 lda #MLI.E.INCFF sec .9 rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT lda hDstFile beq .2 >SYSCALL fclose .2 lda hSrcFile beq .3 >SYSCALL fclose .3 >LDA.G hDstBuf beq .4 >SYSCALL FreeMem .4 >LDA.G hSrcBuf beq .5 >SYSCALL FreeMem .5 lda hLIB beq .8 >SYSCALL UnloadLib .8 clc rts *-------------------------------------- CS.END *-------------------------------------- MSG.USAGE .AZ "Usage : PAKME SourceBIN PackedBIN\r\n" MSG.SRCFILE .AZ "Source File : %s, Org=$%H Size=%D, %d Chunks.\r\n" MSG.CHUNK .AZ " Chunk #%02d : Ofs=%H, Len=%D\r\n" MSG.OK .AZ "[OK]" MSG.ERR .AZ "[%h]\r\n" MSG.E.IARC .AZ "Invalid/corrupt archive" TAG .AZ "PAKME" *-------------------------------------- LIBPAK .AZ "libpak" hLIB .BS 1 *-------------------------------------- .DUMMY .OR 0 DS.START hSrcBuf .BS 1 hDstBuf .BS 1 Shunk.SrcSize .BS 2 Shunk.DstSize .BS 2 STATBUF .BS S.STAT PAKME.HEADER .BS 10 PAKME.TABLE .BS CHUNK.MAX*2 CHUNK.HEADER .BS 3 PAKSTAT .BS S.PAKSTAT DS.END .ED *-------------------------------------- MAN SAVE USR/SRC/BIN/PAKME.S ASM