O p @o  @`! #@%`')+-/1 35`79;=? @o  @`! #@%`')+-/1 35`79;=?DEPICE S -DEPLZH S <DEPLZW S  nDEPV2 S  JAMPACK4DOC TJAMPACK4PRG 6nLDRUNLZHS 41 "+;ICE Depack routine as used in JAM packer V4.0 ; Useage: MOVE.L #$packed_data_start_address,A0 ; MOVE.L #$place_to_put_unpacked_data,A1 ; BSR DEPACK DEPACK: MOVE.W $F8240.W,-(SP) movem.l d0-a6,-(sp) ADDQ.L #4,A0 ;GET PAST ICE! HEADER bsr.s ice04 lea -8(a0,d0.l),a5 bsr.s ice04 move.l d0,(sp) movea.l a1,a4 movea.l a1,a6 adda.l d0,a6 movea.l a6,a3 move.b -(a5),d7 bsr ice06 MOVE.W (SP)+,$F8240.W ice03: movem.l (sp)+,d0-a6 rts ice04: moveq #3,d1 ice05: lsl.l #8,d0 move.b (a0)+,d0 dbra d1,ice05 rts ice06: bsr.s ice0a bcc.s ice09 moveq #0,d1 bsr.s ice0a bcc.s ice08 lea ice17(pc),a1 moveq #4,d3 ice07: move.l -(a1),d0 bsr.s ice0c swap d0 cmp.w d0,d1 dbne d3,ice07 add.l 20(a1),d1 ice08: move.b -(a5),-(a6) dbra d1,ice08 ice09: cmpa.l a4,a6 bgt.s ice0f rts ice0a: add.b d7,d7 bne.s ice0b move.b -(a5),d7 addx.b d7,d7 ice0b: rts ice0c: moveq #0,d1 ice0d: add.b d7,d7 bne.s ice0e move.b -(a5),d7 MOVE.W D7,$F8240.W addx.b d7,d7 ice0e: addx.w d1,d1 dbra d0,ice0d rts ice0f: lea ice18(pc),a1 moveq #3,d2 ice10: bsr.s ice0a dbcc d2,ice10 moveq #0,d4 moveq #0,d1 move.b 1(a1,d2.w),d0 ext.w d0 bmi.s ice11 bsr.s ice0c ice11: move.b 6(a1,d2.w),d4 add.w d1,d4 beq.s ice13 lea ice19(pc),a1 moveq #1,d2 ice12: bsr.s ice0a dbcc d2,ice12 moveq #0,d1 move.b 1(a1,d2.w),d0 ext.w d0 bsr.s ice0c add.w d2,d2 add.w 6(a1,d2.w),d1 bpl.s ice15 sub.w d4,d1 bra.s ice15 ice13: moveq #0,d1 moveq #5,d0 moveq #-1,d2 bsr.s ice0a bcc.s ice14 moveq #8,d0 moveq #$3f,d2 ice14: bsr.s ice0c add.w d2,d1 ice15: lea 2(a6,d4.w),a1 adda.w d1,a1 move.b -(a1),-(a6) ice16: move.b -(a1),-(a6) dbra d4,ice16 bra ice06 DC.B $7f,$ff,$00,$0e,$00,$ff,$00,$07 DC.B $00,$07,$00,$02,$00,$03,$00,$01 DC.B $00,$03,$00,$01 ice17: DC.B $00,$00,$01,$0d,$00,$00,$00,$0e DC.B $00,$00,$00,$07,$00,$00,$00,$04 DC.B $00,$00,$00,$01 ice18: DC.B $09,$01,$00,$ff,$ff,$08,$04,$02 DC.B $01,$00 ice19: DC.B $0b,$04,$07,$00,$01,$1f,$ff,$ff DC.B $00,$1f STARTOFPACKEDDATA = $50 DEPACKPOSITION = $50100 ;example of how to call the depack routine LEA STARTOFPACKEDDATA,A6 LEA DEPACKPOSITION,A5 BSR DEPACK CLR.W -(SP) TRAP #1 * LZH DEPACKER; For use with the JAM Packer V3.0 & 4.0 * * USAGE: * LEA $ADDRESS OF PACKED DATA,A5 * LEA $ADDRESS TO UNPACK DATA TO,A6 * BSR DEPACK * * NOTE: Must save registers before executing depack if original * contents are required. RESET MOVEM.W D0-D1/D3/D5,-(A7) MOVEA.L A1,A2 MOVEQ #$00,D2 MOVEQ #-$02,D4 MOVEQ #$00,D1 MOVE.W #$0139,D5 OUTER ADDQ.W #2,D4 CMP.W (A2)+,D7 BHI.S OUTER MOVE.W $00(A3,D4.W),D3 ADDQ.W #1,D3 LSR.W #1,D3 CMP.W -$02(A3,D2.W),D3 BLS.S BIDDLE MOVE.W $00(A3,D1.W),D0 ADD.W $02(A3,D1.W),D0 CMP.W D0,D3 BLS.S BIDDLE BITH MOVE.W D0,$00(A3,D2.W) MOVE.W D1,$00(A1,D2.W) MOVE.W D2,$00(A0,D1.W) MOVE.W D2,$02(A0,D1.W) ADDQ.W #2,D2 ADDQ.L #4,D1 MOVE.W $00(A3,D1.W),D0 ADD.W $02(A3,D1.W),D0 CMP.W D0,D3 BHI.S BITH BIDDLE MOVE.W D3,$00(A3,D2.W) MOVE.W $00(A1,D4.W),D0 MOVE.W D0,$00(A1,D2.W) MOVE.W D2,$00(A0,D0.W) ADDQ.W #2,D2 DBF D5,OUTER MAKETABLE2 MOVE.W $00(A3,D1.W),D0 ADD.W $02(A3,D1.W),D0 MOVE.W D0,$00(A3,D2.W) MOVE.W D1,$00(A1,D2.W) MOVE.W D2,$00(A0,D1.W) MOVE.W D2,$02(A0,D1.W) ADDQ.W #2,D2 ADDQ.L #4,D1 CMP.W D7,D2 BNE.S MAKETABLE2 MOVEM.W (A7)+,D0-D1/D3/D5 RTS  CREATE MOVE.L TABLE7(PC),A0 LEA TDATA1(PC),A1 MOVEQ #$00,D0 MOVEQ / #$1F,D1 MOVEQ #$00,D2 LOOP1 MOVE.B D0,(A0)+ DBF D1,LOOP1 DBF D2,EXIT1 MOVE.W (A1)+,D3 MOVEQ #$03,D2 EXIT1 ROL.W #4,D3 MOVE.W D3,D1 ANDI.W #$000F,D1 ADDQ.B #4,D0 BCC.S LOOP1 MOVE.L TABLE8(PC),A0 LEA TDATA2(PC),A1 MOVEQ #$05,D0 MOVEQ #$03,D1 LOOP2 MOVE.B $00(A1,D0.W),D2 EXT.W D2 LOOP3 MOVE.B D1,(A0)+ DBF D2,LOOP3 ADDQ.W #1,D1 DBF D0,LOOP2 RTS CREATE2 MOVE.L TABLE1(PC),A0 MOVE.L TABLE5(PC),A1 MOVE.L TABLE4(PC),A2 MOVEQ #$01,D1 MOVE.W #$04E6,D2 MOVEQ #$00,D4 MOVE.W #$0139,D0 CONTINUE MOVE.W D1,(A0)+ MOVE.W D2,(A1)+ MOVE.W D4,(A2)+ ADDQ.W #2,D2 ADDQ.W #2,D4 DBF D0,CONTINUE MOVE.L TABLE1(PC),A0 MOVE.L TABLE2(PC),A3 MOVE.L TABLE6(PC),A1 MOVE.L TABLE3(PC),A2 MOVE.W #$0274,D2 MOVEQ #$00,D4 MOVE.W #$0138,D0 DOMORE MOVE.W (A0)+,D1 ADD.W (A0)+,D1 MOVE.W D1,(A3)+ MOVE.W D4,(A1)+ MOVE.W D2,(A2)+ MOVE.W D2,(A2)+ ADDQ.W #4,D4 ADDQ.W #2,D2 DBF D0,DOMORE MOVE.W #$F,(A3) CLR.W (A2) RTS  RESTORE BSR RESET BRA BACK TABLE1 DC.L 00 TABLE2 DC.L 00 TABLE3 DC.L 00 TABLE4 DC.L 00 TABLE5 DC.L 00 TABLE6 DC.L 00 TABLE7 DC.L 00 TABLE8 DC.L 00 EXIT ADDQ.L #4,A7 RTS DEPACK LEA TABLE1(PC),A0 MOVE.L #0,(A0) ;SET UP RELATIVE TABLE OFFSETS MOVE.L #$274,4(A0) MOVE.L #$4E8,8(A0) MOVE.L #$9CE,12(A0) MOVE.L #$C42,16(A0) MOVE.L #$EB6,20(A0) MOVE.L #$112A,24(A0) MOVE.L #$122A,28(A0) MOVE.L A7,D1 ;GET STACK POSITON sub.l #$1500,D1 ;TABLES START ADDRESS IN D1 ;STORE UNDER STACK (NASTY!) MOVE.W #7,D0 TABLOOP ADD.L D1,(A0)+ ;ADD TABLE BASE ADDRESS TO OFFSETS DBF D0,TABLOOP BSR CREATE BSR CREATE2 MOVE.L TABLE3(PC),A0 MOVE.L TABLE5(PC),A1 MOVE.L TABLE1(PC),A3 MOVE.L A6,-(A7) ADD.L 4(A5),A6 ADD.L 8(A5),A5 ADD.L #$0C,A5 MOVE.L A6,A4 MOVE.W #59,D0 ;MOVE 60 SPACES TO END OF UNPACKED AREA SPACES MOVE.B #$20,(A4)+ ;NOTE: SHOULD PROBABLY SAVE THIS AREA DBF D0,SPACES ; BEFORE WIPING IT OUT! MOVEQ #$08,D6 MOVE.B -(A5),D5 MOVE.W #$04E6,D7 MOVE.L TABLE8(PC),A4 TOP MOVE.W #$222,$F8240.W MOVE.W #0,$F8240.W CMPA.L (A7),A6 BLE EXIT MOVE.W $04E4(A1),D0 MORE DBF D6,NOTEMPTY MOVEQ #$07,D6 MOVE.B -(A5),D5 NOTEMPTY ADD.B D5,D5 BCC.S ZERO ADDQ.W #2,D0 ZERO MOVE.W $00(A1,D0.W),D0 CMP.W D7,D0 BLT.S MORE MOVE.W D0,D1 SUB.W D7,D0 MOVE.W $04E4(A3),D4 BMI RESTORE BACK MOVE.W $00(A0,D1.W),D1 SCAN LEA $00(A3,D1.W),A2 ADDQ.W #1,(A2) CMPM.W (A2)+,(A2)+ BCS.S FRSTGTR MOVE.W $00(A0,D1.W),D1 BNE.S SCAN LSR.W #1,D0 CMP.W #$0100,D0 BGE.S GTE256 WRITE MOVE.B D0,-(A6) BRA.S TOP FRSTGTR SUBQ.W #1,-$0004(A2) MOVE.W -$0004(A2),D4 SAME CMP.W (A2)+,D4 BEQ.S SAME SUBQ.L #4,A2 ADDQ.W #1,(A2) SUBA.L A3,A2 MOVE.W $00(A1,D1.W),D4 MOVE.W A2,$00(A0,D4.W) CMP.W D7,D4 BCC.S SKIP MOVE.W A2,$02(A0,D4.W) SKIP MOVE.W $00(A1,A2.W),D2 MOVE.W D4,$00(A1,A2.W) MOVE.W D1,$00(A0,D2.W) CMP.W D7,D2 BCC.S SKIP2 MOVE.W D1,$02(A0,D2.W) SKIP2 MOVE.W D2,$00(A1,D1.W) MOVE.W $00(A0,A2.W),D1 BNE.S SCAN LSR.W #1,D0 CMP.W #$0100,D0 BLT.S WRITE GTE256 MOVE.B -1(A5),D1 MOVEQ #$00,D2 LSR.B D6,D1 OR.B D5,D1 MOVE.B $00(A4,D1.W),D2 SUB.W D2,D6 BPL.S POSITIVE MOVE.B -(A5),D5 MOVE.B D5,D4 ADDQ.W #2,D6 BMI.S OVERFLOW BEQ.S MODD4 LSR.B #1,D4 LSL.B #7,D5 BRA.S MODD4 READONE MOVE.B -(A5),D5 MOVE.B D5,D4 LSL.B #6,D5 MOVEQ #$02,D6 LSR.B D6,D4 BRA.S DOCOPY POSITIVE BEQ.S READONE MOVE.B (A5),D5 SUBQ.W #6,D6 OVERFLOW NEG.W D6 LSL.B D6,D5 MOVE.B D5,D4 MOVE.B -(A5),D5 MOVE.B D5,D2 LSL.B D6,D5 SUBQ.W #8,D6 NEG.W D6 LSR.B D6,D2 OR.B D2,D4 MODD4 ANDI.W #$003F,D4 DOCOPY MOVE.L TABLE7(PC),A0 MOVE.B (A0,D1.W),D2 LSL.W #4,D2 OR.B D4,D2 ;NEG.W D2 LEA $01(A6,D2.W),A0 SUBI.W #$00FE,D0 MOVE.W D0,D1 COPY MOVE.B -(A0),D0 MOVE.B D0,-(A6) DBF D1,COPY MOVE.L TABLE3(PC),A0 BRA TOP TDATA2 DC.W $0F2F DC.W $2F3F DC.W $2F1F TDATA1 DC.W $FFF7 DC.W $7 DC.W $7773 DC.W $3 DC.W $3 DC.W $3331 DC.W $1 DC.W $1 DC.W $1 DC.W $1 DC.W $1 DC.W $1110 DC.L $00 DC.L $00 R;LZW Depack routine for the JAM packer V4.0 ;It is kept simple to minimise depack time. CLR.L -(A7) MOVE.W #$20,-(A7) TRAP #1 ADDQ.L #6,A7 MOVE.L D0,-(A7) MOVE.L #$80,A0 ;start of packed data address MOVE.L #$90,A1 ;depack to address BSR.S UNPACK MOVE.W #$20,-(A7) TRAP #1 ADDQ.L #6,A7 RTS UNPACK: MOVE.W $F8240.W,-(A7) MOVE.L A0,A4 MOVE.L A1,A6 ADDA.L 8(A0),A4 ADDA.L 4(A0),A6 MOVE.L A6,A5 ;KEEP COPY TO CHECK AGAINST MOVE.L 4(A0),D4 MOVE.B #$20,D3 MOVE.W #$0FED,D5 MOVEA.L A6,A3 ;KEEP ADDR OF END OF SPACES MOVEQ #$00,D7 ;START UNPACK ROUTINE TOPDEP: DBF D7,NOTUSED MOVE.B -(A4),D6 ;GET COMMAND BYTE MOVEQ #$07,D7 NOTUSED: LSR.B #1,D6 BCC.S COPY ;BIT NOT SET, COPY FROM UNPACKED AREA MOVE.B -(A4),-(A6) ;COPY BYTES FROM PACKED AREA ADDQ.W #1,D5 SUBQ.L #1,D4 BGT.S TOPDEP BRA.S EXITUP COPY: MOVE.B -2(A4),D0 LSL.W #4,D0 MOVE.B -(A4),D0 MOVE.W D0,$F8240.W SUB.W D5,D0 NEG.W D0 AND.W #$0FFF,D0 LEA 1(A6,D0.W),A0 MOVEQ #$0F,D1 AND.B -(A4),D1 ADDQ.W #2,D1 MOVEQ #$01,D0 ADD.W D1,D0 CMPA.L A5,A0 BGT.S SPACES WRITE: MOVE.B -(A0),-(A6) DBF D1,WRITE BACK: ADD.L D0,D5 SUB.L D0,D4 BGT.S TOPDEP EXITUP: MOVE.W (A7)+,$F8240.W RTS SPACES: CMPA.L A5,A0 BLE.S WRITE MOVE.B D3,-(A6) ;COPY OUT SPACES SUBQ.L #1,A0 DBF D1,SPACES BRA.S BACK ;V2 Depack routine for JAM Packer V2.X/3.0/4.0 DEPACK: ADDA.L #$4,A0 ;ALLOW FOR HEADER MOVE.W #$FE,D7 MOVE.L A0,A6 MOVE.L (A0)+,D5 ADDA.L D5,A1 ADDA.L (A0),A0 SUBA.L #4,A0 TST.W -(A0) BPL.S SKIP SUBQ.L #1,A0 SKIP MOVE.B -(A0),D0 TOP ROL.W D7 MOVE.W D7,$F8240.W LSL.B #1,D0 BNE.S NOTE MOVE.B -(A0),D0 ROXL.B #1,D0 NOTE BCC.S SHEP CLR.W D1 LSL.B #1,D0 BNE.S KLF MOVE.B -(A0),D0 ROXL.B #1,D0 KLF BCC.S PET LEA TABL1(PC),A3 MOVEQ #3,D3 STE CLR.W D1 MOVE.B 0(A3,D3.W),D2 EXT.W D2 MOVEQ #-1,D4 LSL.W D2,D4 NOT.W D4 SUBQ.W #1,D2 ARJ LSL.B #1,D0 BNE.S BOYS MOVE.B -(A0),D0 ROXL.B #1,D0 BOYS ROXL.W #1,D1 DBF D2,ARJ TST.W D3 BEQ.S SHOP CMP.W D1,D4 DBNE D3,STE SHOP MOVE.B 4(A3,D3.W),D2 EXT.W D2 ADD.W D2,D1 PET MOVE.B -(A0),-(A1) DBF D1,PET SHEP MOVE.L A6,A3 ADDQ.L #$8,A3 CMPA.L A3,A0 BLE EXIT LEA TABL2(PC),A3 MOVEQ #3,D2 CATHY LSL.B #1,D0 BNE.S ALSA MOVE.B -(A0),D0 ROXL.B #1,D0 ALSA BCC.S FDC DBF D2,CATHY FDC CLR.W D1 ADDQ.W #1,D2 MOVE.B 0(A3,D2.W),D3 BEQ.S VAN EXT.W D3 SUBQ.W #1,D3 DE LSL.B #1,D0 BNE.S VEN MOVE.B -(A0),D0 ROXL.B #1,D0 VEN ROXL.W #1,D1 DBF D3,DE VAN MOVE.B 5(A3,D2.W),D3 EXT.W D3 ADD.W D3,D1 CMPI.W #2,D1 BEQ.S MFD LEA TABL3(PC),A3 MOVEQ #1,D3 LUC LSL.B #1,D0 BNE.S CML MOVE.B -(A0),D0 ROXL.B #1,D0 CML BCC.S BBS DBF D3,LUC BBS ADDQ.W #1,D3 CLR.W D2 MOVE.B 0(A3,D3.W),D4 EXT.W D4 MCH LSL.B #1,D0 BNE.S SAW MOVE.B -(A0),D0 ROXL.B #1,D0 SAW ROXL.W #1,D2 DBF D4,MCH LSL.W #1,D3 ADD.W 4(A3,D3.W),D2 BRA.S CPUN MFD CLR.W D2 MOVEQ #5,D3 CLR.W D4 LSL.B #1,D0 BNE.S EMF MOVE.B -(A0),D0 ROXL.B #1,D0 EMF BCC.S CLR1 MOVEQ #8,D3 MOVEQ #$40,D4 CLR1 LSL.B #1,D0 BNE.S NOTZ MOVE.B -(A0),D0 ROXL.B #1,D0 NOTZ ROXL.W #1,D2 DBF D3,CLR1 ADD.W D4,D2 CPUN LEA 0(A1,D2.W),A2 EXT.L D1 ADDA.L D1,A2 SUBQ.W #1,D1 WRTLP MOVE.B -(A2),-(A1) DBF D1,WRTLP BRA TOP EXIT RTS TABL1 DC.B $0A,$03,$02,$02,$0E,$07,$04,$01 TABL2 DC.B $0A,$02,$01,$00,$00,$0A,$06,$04,$03,$02 TABL3 DC.B $0B,$04,$07,$00,$01,$20,$00,$00 DC.B $00,$20 $ +-+ | THE JAM PACKER V4.0 | +-+ Release Date: 17.06.1991 The JAM Packer is an executable/datafile and whole disk compression program. A full GEM user interface provides convenient and user-friendly operation. +-+ | OPERATING INSTRUCTIONS | +-+ PACK METHOD - Four compression methods are implemented. LZH - This is a modified version of the method used in the first Lharc series. LZH provides reasonably fast and very efficient compression, though it does take longer to uncompress than any other method available in the JAM packer. LZW - This method provides fast and reasonably efficient compression. It has the fastest decompression speed. It is ideally suited for when fast de-compression speed is more important than smaller compressed file size (eg. on a hard disk). V2 - Compresses very slowly, but de-compression speed is much better than LZH. It can also compress files smaller than LZW, but not quite as good as LZH. Since the introduction of the ICE pack method into the JAM packer, V2 is essentially redundant. In a future upgrade it will be removed and replaced by something much better. ICE - This method is used in the Pack-Ice packer and is based on V2, though it slightly improves on V2 in both time taken to compress, time taken to de-compress and compressed file size. FILE PACKER - PROGRAM/DATA Two types of files can be packed. "Data" files are simply compressed. "Program" files are compressed and the necessary code to de-compress and run them is included in the file. FLASH/HEADING If a Program file is packed, then you can choose whether or not the screen will "Flash" when unpacking and whether or not the "Heading" will appear when the file unpacks. NOTE: Packing resource, data, dictionary, help or any other support files for a program will cause that program to fail. If you think about it, this obviously cannot work as the program using these files has no idea they're packed or how to unpack them! Also note that program files may not decompress and run properly from some shells (notably the Laser C shell). ABORTING A PACK - Holding down the ALTERNATE key during a pack will cause it to be aborted. You are not given the option of resuming, so make sure that when you hold down ALTERNATE, you really do want to stop the current pack. This option also works when in the "Disk Packer", though only when data is being packed, not when reading or writing to the disk. DISK PACKER - This option has been updated significantly since V3.0 and now works properly. The "Disk Packer" reads in a whole disk and packs it into a single file. This is useful for transmission of entire disks via modem and archival purposes among other things. You can choose either of the four pack methods to be used during the disk pack, or alternatively you can choose no compression from the "Disk Packer" box. USE BOOT If the "use boot" box is selected, the format of the disk is read from the boot sector. Only use this option if you are absolutely sure that the disk has a valid boot sector, otherwise the results will be unpredictable. If the "use boot" option is not selected, the JAM packer attempts to determine the format of the disk by itself. There is6 no guarantee that it will get it right, though if any mistake is made, it will be to pack too much data, rather than not enough. USE FAT If this option is selected, it is only active if the "use boot" box is selected. It ensures that data clusters which are allocated by the FAT (File Allocation Table) are the only data packed. This is useful if you have deleted files from a disk, as although deleted, the data will remain on the disk until over-written by another file. FORMAT This is used during a disk unpack only. If the "format" box is highlighted, the disk will be formatted to the appropriate format before data is written to it. Note: 11 sector format is not supported, so if you have disk packed an 11 sector a track disk, make sure you have formatted the destination disk 11 sectors a track with a program such as Fastcopy III. NO PACK Select this option when you want a fast conversion of a floppy disk into a file. No compression is used, the data from the disk is just copied into a file. MULTI-PACKER - The "Multi-Packer" is a handy feature when a large number of files need to be packed. Wildcards are supported. Choose your source directory and type in the file name template to be used. Eg. "*.*" will pack all programs in the selected directory; "*.DAT" will pack all programs with a ".DAT" extension. PACK PROGRAMS If the "Program" button is selected then files with the extender ".TOS", ".TTP", ".PRG" or ".APP" will be packed as programs (executables which will uncompress and run), as if they were selected individually from the normal pack box as "Program" files. Otherwise, they will be packed as data files, which will not automatically uncompress and run. The packed files overwrite the original files. +-!+ | FILES CONTAINED IN THIS PACKAGE | +-!+ JAMPACK4.PRG - The JAM packer program. JAMPACK4.DOC - What you are reading now. DEPV2.S - Assembly depack source code for V2. DEPICE.S - Assembly depack source code for ICE. DEPLZW.S - Assembly depack source code for LZW. DEPLZH.S - Assembly depack source code for LZH. LDRUNLZH.S - Trap #1 file load/depacker. +- + | DISCLAIMER | +- + We take no responsibilty for any damage which may arise from the use or misuse of this program. +- + | LICENSE | +- + You may make copies and distribute this program, as long as the program and documentation file remain unchanged, and no profit is obtained. This program is shareware. If you find it useful, please send us something, be it money or words of encouragement, it doesn't matter. Bug reports and suggestions for improvement are also welcome. Write to us at either of the following addresses. +-+ +-+ | Andrew Knipe | | Tim Knipe | | P.O. Box 369 | | RSD Maiden Gully Road | | 367 Collins St. | | Bendigo, 3551 | | Melbourne, 3000 | | Victoria | | AUSTRALIA | | AUSTRALIA | +-+ +-+ | /+\ |O| /---\ /_\ .. * . . * . . . . `lkFH?<NNT/$@?<NNT2<<g2<gBQC|<<f|(Hz?< NA\B?< NA\/?8@A"H/(a,_1߂@?< NA\G"K kK^ JgёBJAg<f``+k +k+k  -"- Ҁ+A -Ҁ+A м$@*@t_CQ"KA$HNM@,$$$$ٵoC&i")n"<BBBBSlLBN(H,I*N((< :<&N~Q$~d $RESn`2,H$1@ED@|Ar$TApAn QڀnNuoSQ`jY JAM Packer Decrunch V4.0kLZW!l`Q zeWQK୛ң:J$f(BhO@aQ]bxA\OJg.@Q]`6 - PdЭпѣ"{ҍ¼.A// "zJNA #Q- !\/( h3Jn02cPd NXpEfqsCwCAUAA ]#oFLJH@B:FLbH@@<#FLH@B:6)‚=|i`Bnr3US1QS63Uc1QcS‚ Uk`+ByQk0:@ 4N@ M`P@ 3u16hB?QA 4H@ M#1OTH l aApX7?80e?)AO\񊦝P7X.ANFT%o] yS[f#N-yQ[` TS U[+hC/\?9Q[NW@`&X,\uCb:"֘A)|ʦ5>̾m¢ SnƮϪjޤ@(9QSg"S`Bgϣŗ㑃Ń S#. Q}5:8Aah:$` S@Pc@ |"|`S0(RÁI/2?^wsF4 ,:/QIWPCW 2:I!a# cPuﵰ0nfr@`Fo]R?-ךL E߹ߧךRweSFؾ2 XA͐:7CBgSN`'o^/(\ Ww `:`8pK:PgPXPgPgTP P0uQt(wG=CWwIWb.PAI R*h\ Cѹl #јo`uo o# o 貢/ H dom Rg`  | ] T9j?$\$ !N%'$CWeL ̨X5HyfpY¢8@sJ@fF/csTʧjgNcs&@IgdL. Ӯn&Is T=cspnRfh/<35`s [D n`_g:YK>9`60I`pœ;L` Rg:8N?2{Hy>N`-@ 5*ʟʂ.bJ*Z`:瀞Bl їw6 f,bJK)qq0#q!2:4Op95Jnf`:!u>sP \vt@B(/?"P0zr`oS5#oo|gooy<H/,/,S<0h |S?'$C/jvKN3BBgؼ`oBn(ZPo3+(Q[L0&v/d/cN/9/'/QzSi%-'/ \A%$"m"(G?rHgBnQl00Z1QRG G m= @tR=@~x@Hv hx)3z/;fRW'3T1bNv[BX!8' |X!!A)=|? rl !+(0QPvH !_ ' C[_ ycjZf0<`0_BE8<zGf1PR<<'`H0Fm&Pn02HA2 0ƞ@BD`0f0RE PK <JFnPP B0PK|S6PHyHyHyY1 j"%YOj9OyKhP:_s@f?QbBg7Bg ԰hIU?,p0@ G"FE0$ma((μ.1@$qwN^qg*OĔ0p,oxloooooozohoVoDk5o#^.u,@*(gAv /8&//4/8F!ư*Ő,@݀1}àX0qʰ6̻o`.# }!W29Vh$ P1(|qo*XjqwA (((հ((((U(!/:p:h lLnNu NMXf&RL< x௰g =`LXpNuqoqoڐE/"PBE|a1Qr$80f2HB@CI&Ifb bR@ @fxo11LRAGW@2?A Ao.b avj]j` @?bada0!jz?A0PGfbREa< ǐA dRI2 x !I!Y!|Xߜ 8Nu`vcxsoHr_EBD``l`vK8`K4`YDgK6308Kri@D`@2`?o A@x `.8<`(`X08z,`D\D3PHriESD@QBG|`Nu a%     ~YH?Ā$@NT2<<2<gBaGC<{ f|(Hzt"BA5[8@Az"H–(a,_1߂A NA\GXׂ"K DrK^ sJgёBJAgf``+k+k+k -- r -Ҁ+A3$@*@t_ٰ"KA$HNM@,s$ٵoC&i")7n"sBSolLBNo><rW,H*БKJ`jS _flHBAfl6`vBAaxlFDSBgaJCgAV30HB aG&NPo0M`tgkBARB`gHSCf^QaY3 H_C A4G~vgkaYRCBB30Hh\KԿs0`$BBvBDe_dvx@f RQDE HSA"Q`Nu  P   ajY JAM Packer Decrunch V4.0k Vɫ6I3qz/$0@IKrNC^$ng<%Ќ`#_4 cP.b4`0PW@ n_ B0QAec_AMOOOo`^Pp HQcE}EA EuP?e}Hn/.coay#PO)+dz6JIg8(TBn#! 2>@);2b);p2=a?a?]y΄@ 5 @n?2(<2);%WDU00Q2y,2,1MU(P09I}@@Tj1H1ĔRX'W@LHg$?!&9HЮCjMJ@fncٔ=|lCP~C 6o>D} XQrf`(vdr)|pPXLa5)XR} Pмel 1 nu 3(LBg%B9 )}PB@G% $0$3E. P߳B,/<nZ0Po0ѩ]@WB€0Z\(a"qap`@ .?q09(|L3?.&v,/fSTPo2*aHyFpH. @OHI= hBnf}E*/zc/Z+u:ொױ=Ύ@h.cHbF>[Hyp@nŸܴf΂Δ@Q2F>3RN\=@1{M\׏Dꔸ\Cf g{埉ϑeS9X0<//@g0x,BgKї=cP:/JEl0=cX `3HHw S>P4w3P0ZRv / M XX,w(+Jf MhE!1w.pї>P/xZM&HT(I Wy+hZ׻0Ҁ м@SlnÍ`r?f?bqBg/9p@OҴ$6P jp`өgj@X//.1Z-dѫ/lj=Ϳ=iŵ`J/<4HaJdoK8Hn c @OJnc PI.` >8ր΀ ɐ@rJl/r"]"cm mt]lh nڦhY μre~^WyмrvmaWI@,J]мASWDЈA cAܐ/``ݐvBξ*`[5PfpUhxܲtmVDF84ѫL~Δ@09pUn@6$m^D@g AF`$B0":Mv  `2jY JAM Packer Decrunch V4.0kV.BHn!/WBd^0ˮFJng`040AA,0A<.4. n a&.?QNA\ ,_QЦG!ONqB2z6:RF08:܁"HAJAf |2:ƲznzPaTaP. ۏ Odž `Ŧabf 1` 1><aDaTSBgzgRAf|<: FmC@`PffbR@2`:a >8`a1dž@:< CNs:<Q*8g SfXpPu@ |8ÈNsBQ>NuTB+T_b^*ꀄYu䀊ZBS^*% WTNONOgIO@.JO=AF|DCA{@HyуdR0 JPK!Jg#М0AbHyAp@&HyA/D%I?-472BY*vB5u ICI`@P$6|U-ܪ n$A{@Hy IٯrâB1w@Bؚ &2?f6 =~v$UCBgKoooodx@ioooiWE 2f<5ޔ72B8a'o_mo=€v2fD1#5#ia'I_T2fNޔ;dq3f^}M5eS6pHЃxP8p eo?Suм|&aa'ah 9f <`ل X`wͩd?~l$a'OaR@rj fX/߀u? P^*B2fdC:ffC DlYC02fxC:fP꒣\S@@ P3fRXCiG @}f2fCڒ<(PLKq eBgq 4Pp2f:fޔ1C'Ag 71 ԼҖRXv$1@w%0rij/ڸfHy/w }"0"g]P?f}?bBgCaAY ґ0.6(` l@5Hnh}?XSq2l_2!A .Qֿ⻵0.Pdc!À\W o@4n@/TqdS8./`P?CEQB@ĚG#LHOO GfH?ыXH/.V9f/9TP׏vB?<\05Jf$H`>d`&."t\ @B(/S/@PG *n.S(nBrBy#͛ S#~ Ї#s6g -7BWH<<7CРAA0?<̻BJEmd O x?- V`b"=PѢ`.PD0c*=.ܰB 5PԟA`Bf8`.2n05cm6A:0g` oR s1s-{xrFf A{`z20!0`S Fmtpup*ЅHЇ(@ HІм&@`$~g SFPx m֣<8ۏ :WAK0C8W1??'|須JDl>!ANPWl.釣`04/YgZHڗ3,A?{@61̈́`A?9@6  <0Qv{ pg&0B\39pϖXAA҈~ݗ3eM9c]900??0??ui\珇eM{c]{1'eM'ADRGf =Ψ1`'11`Qs @03@1!8#. "89r[h@0GtB0'Q@Q!m?%}~T"wQE8pEd` 0@8#w3!0c*4HL 1|s2iCGPDB:md2Zjz@D`Fj`@3YCH@HU08DCMRp@82RA=AAy~CM|0k$0CM 21AHЁT*@Nq0]b CMU@=@51P;D<F3< 05AP}Fs6Ю:?1E3:0P6\0)51P}Esl0411ed1 @300J@fo) l>.p BE!*wH8Ƞ؍ D8( ,0g <`܀RE0H058Yrfpo{*3"% ?0|'`  %?up[T a>[<N"΢%!A ^0`$@?@@?aumXc!gW0˞H?^l`eUHBn./ )a+Hs/ X#7B1p0f*@b09b0co`.c# eo?BKun^Bn8<>` phDmBE`E@# E< V0H#E>0G?k G|e=(]KK.,M>-@@8 ' `ucYQ?d$Itxr:TDZb63@RCKs c,c 7@b70,1@3ߑH0o3s7@3 VsTBXGfL+j.prt}Q6t[2AXd1Cpr1dRApNu0|AR$szr4ɒZ9024TBTDp k$z4<tx0<82X6244XDTBp6`BRNua XNuH"PRQ~>r A0<s ad t"zx&zd/Q}(N<@p|%>< V6<[3@o0)Q|%dT@01Gm2G8+kR{E0RJe2pf'lLo`Sj8*ZgYRR81L:@4o1301Gd1 320fH|m-t)0לBjqTFkg, `&% |,`g]p-%-QFDF*D? Fb0JA @2~ F40j//?/wwwsq31w{t`m P}B**j*(^&A !GpB !M0L!ML0 n @xAA@g RD!6JDgh< ><0SFQ<<a x~@$Pn0 Pn0T RB`& z $>@xHP]2(PqA TBfr0 LS@@@Bt~1C"zگ"Q0r@0agtRA8|lC@%P904`RA0|"@ Pn8zRERF0SDP0` Dlr4aRABm`SA`0<0| .` 116oB@`2AC"3 $R@|mNu "NEp0`xs0`~rPgpIPKP24s g*4 G`460 C 70"1 0"200 7 1 >1P$KP6s0f 7(50:s23 22P`HrC`Ft| q>< 5 (p zF"QBP(z:`EJAmM!f$0<9`0M Vg4rzAJM BVvEz(.E,z!@Vo8L z 0<|m9!#5!#7 `82#83 9M 8s@g6507@zBA{.BA#B AgыBAS#;.#_S n c3MOJ}1 nH4Nm6c­ɱ@3!xaQ  n3WžYžžӳ n2e'D##N nZcŔӦJvdR@IMcQѲYDPP0NM{#w'(Nw#@ Jѯtv(/ct߰~ |wl*npr(*dֱhjS](p"TBy nƹeZߵ{MԟŸNX !J!_ NAYyrU2"P$h/( J@2u($ bʔ1Qtt֑Iq>֕_`R p.և-dbttU`ևj000,fz.r( t `8`6gggggggg g ?z~N\dtbtt`pfЮ/eypt w<z.  ,bttBW0cikIa A2rI`fr;j`f"gЮW @za!`?dbTg6].HЃB`> / cc b 0ЮPv"ƽ!eR 2 H@A9$ BB`J"IJlVar}JlwDvd`BbdDdD -ARGyBG".0~~D$Il GD&gHC H@@HCBCւJGgD-C :з.J͑1ѧ2.boHQs_a_OS|bQC2S|VQ7"R0L0<}f& ]1bB UBnV*00n`*K@Bp[Uu>Po\r";HPYPgXHf0(9WV4,BG`P>:($@/TPf><`rgRl &JGm_zjrgDn.\@m"?YcB}g<]`0`j?=SePu>JGl 3VP?`?RfP-S/ fpE  7U%aKBO2K^ROHぃ|1fSnG0.3wQCeS`Th мP@Z#d݊ E3Љ5=L 0FliA1l։kqRƂlPDl\Ug3?M PoG3=UL0>7᷀69>Ƽ P{ wHy!W #߁Hyl" qq`]tmyzQ>aq`fhktpcckqd|pJ`abeHdwa caa`g` ba`^`bfuooac\``b]a]acbLe`[Gaaa\Q#=3 PVhPlrQgTY$Pof BB`&". Bvd d``bd-@-AUSHL*~&gHC H@J@g@HCBCւ-C LN^.JQTlLUcQCNVQoQgNX=@g3Ք0<``0<|qN^NuQ *OgJAVMˑO}GOURCEa5eЙa3RG`NOSSlyDESTINATIONTTPAPP ?OTOBO0OO ??#;?????z?h)_ zz2\ z!{\\'_cW504bc̠p64%eGrrr!%b@!!]#ҌL2Ԭ.Es pAMly? |_#Yes |rcelҼk`,Up`d e 5Ж~ӥӿ! $> ,㓽Noav|h kwell..Ҍ!p{FineO.T will|` .  k ow! You'gtr`Fy|oluܐy` system!@funlh|doessupp it.#Ohph `uldopenkst$Exit]ՍsJundd!|#Why'stn?%֒m MULTI ERPORT m* q NOT COMTEDREAwSON1-+  ao sa - wnwhPm |+lra n o+rs`ceLEb|Kenough m_M Ԟa kknownd } ¢`y key tRue_;qhӏЅpöDe_#Sh3it! fExecutable;m`mplete?!nailure!|$Retry|;HG%sٴUnf MΨj:siEt'P pETURN ?jSd. DrU error.rl0wed1|Not aM_ Ok]Ca;n't create 3][pSsufficientmory. Abort]Dp^L:(> Gpffr+om inputsUbŠ e{--^LʘpWPq$\*',B'RIVEA.^ 2][|swhich dq3? ][ AB| C: ]ChoosPPpDttion _pathname^0rrԞw`aRaP }uFJPK!`ysq|dqUfd.P_EXITHV2sMetho@ ICELZWMultisPcFlashUNHeadp;Tژ5qUnUU No5p`potUse FpFormatQ?n\ LÏ:4"ڏȏpaP]|kwp ogTnojjgfokxng[`u3!do`XpMfOa78>AybRpUaT RQ_D`T mJ2 T _(T J2 Z4_T4ZOT4_T4[]BBL_ 䘦[AB[ Bx5<[JBx=Kk=B@TRY?di[B$jrkJTK 2%?M'[oKE h1A@0`qҶ1 h3񕠠X `C P[1QDzr` : &R *@?!*@C1#! m(B!9$QBW `BPAP P_1 ЏU:zrFZXz]UӪC^ze!.CHnzyJb *zz~_tz_XzDzJbUz_Jbj BpBÔHH TBߔM_uRXIc@LzO\NzZEKB$xz!quB$zH!]Qz&]&dcuT*Lpy: L: D]:<31eN:"( c>068$4  o lv; %0 ! #P,!l< % Zv4  A"6L "T $0<  >.](  &   #     $ ' &00(  *V %%  C^$l&   D [('B   { C Z @((L \8"&J  J B"' (l@ (X&>&. &. 4$f.,*   ."(L~8 &&^)AkA`"_., FP%# & ) r  ; SIMPLE TRAP #1 FILE DEPACKER FOR JAM PACKER V3.0/4.0 LZH COMPRESSION. ; WILL ONLY WORK ON FILES WHICH ARE COMPLETELY READ BY ONE CALL TO ; FREAD (TRAP #1 #$3F). savebuf = $200 YES equ 1 NO equ 0 LSEEKROUTINE EQU YES ;WHEN PROG USES LSEEK TO DETERMINE FILE LENGTH SFIRSTROUTINE EQU YES ;WHEN PROG USES SFIRST TO DETERMINE FILE LENGTH BEGINNING: BRA.S START fname: dc.b 'PLAYER.PRG',$00 EVEN START: MOVEA.L A7,A5 LEA BEGINNING(PC),A7 MOVE.L 4(A5),A5 MOVE.L $C(A5),D0 ADD.L $14(A5),D0 ADD.L $1C(A5),D0 ADD.L #$100,D0 MOVE.L D0,-(A7) MOVE.L A5,-(A7) MOVE.W #$0,-(A7) MOVE.W #$004A,-(A7) TRAP #1 ADDA.L #$0C,A7 clr.l -(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp move.l d0,d7 MOVE.L #$1600,-(SP) MOVE.W #$48,-(SP) TRAP #1 ;RESERVE SOME SPACE FOR LZH DEPACK TABLES ADDQ.L #6,SP MOVE.L D0,BUFPOS move.l $84.W,oldtrap1vector move.l #trapit,$84.W move.l d7,-(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp MOVE.L #NULL,-(SP) MOVE.L #NULL,-(SP) PEA fname(PC) MOVE.W #0,-(SP) MOVE.W #$4B,-(SP) TRAP #1 add.l #14,sp ;ENSURE THAT YOU CAN QUIT OUT OF PROGRAMS WITHOUT A CRASH clr.l -(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp move.l oldtrap1vector(pc),$84.w move.l d0,-(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp clr.w -(sp) trap #1 trapit: btst #$05,(a7) bne.S super move.l usp,a0 bra.S after super: move.l a7,a0 addq.l #6,a0 after: cmp.w #$3d,(a0) beq doopen cmp.w #$3f,(a0) beq.s load IFNE LSEEKROUTINE cmp.w #$42,(a0) beq.s down ENDC IFNE SFIRSTROUTINE cmp.w #$4e,(a0) beq.s dosfirst cmp.w #$2f,(a0) beq.s dogetdta cmp.w #$1a,(a0) ENDC bne dotrap1 IFNE SFIRSTROUTINE lea retsetdta(pc),a0 move.l 2(a7),(a0) lea setdta(pc),a0 move.l a0,2(a7) bra dotrap1 dogetdta: lea retgetdta(pc),a0 move.l 2(a7),(a0) lea getdta(pc),a0 move.l a0,2(a7) bra dotrap1 ENDC doopen: lea retopen(pc),a0 move.l 2(a7),(a0) lea open(pc),a0 move.l a0,2(a7) bra dotrap1 ;here starts the stuff for SFIRST IFNE SFIRSTROUTINE dosfirst: lea retsfirst(pc),a0 move.l 2(a7),(a0) lea sfirst(pc),a0 move.l a0,2(a7) bra.s dotrap1 ENDC ;here start the stuff for LSEEK IFNE LSEEKROUTINE down: lea retlseek(pc),a0 move.l 2(a7),(a0) lea lseek(pc),a0 move.l a0,2(a7) bra.s dotrap1 ENDC load: move.w inopen(pc),d0 cmp.w #1,d0 beq.s dotrap1 ;if checking depack marker, do real trap1! move.w seekflag(pc),d0 cmp.w #1,d0 beq.s dotrap1 ;if called from seek handler, exit! move.w mustdecrun(pc),d0 cmp.w #1,d0 bne.s dotrap1 ;if marker not present, don't decrunch! move.l a7,d0 movem.l a1-a3,-(sp) sub.l #$20,8(a0) lea buffer(pc),a1 move.l 8(a0),(a1) move.l d0,a2 lea return(pc),a1 move.l 2(a2),(a1) lea decrunch(pc),a1 move.l a1,2(a2) move.l buffer(pc),a1 lea savebuf,a2 move.l #$20,a3 loadloop: move.b (a1)+,(a2)+ subq.l #1,a3 cmp.l #0,a3 bne.s loadloop movem.l (sp)+,a1-a3 dotrap1: dc.w $4ef9 oldtrap1vector: dc.l $00 ;* open: tst.l d0 bmi exitopen2 movem.l a1-a3,-(sp) move.l d0,a3 lea inopen(pc),a1 move.w #1,(a1) pea test(pc) move.l #8,-(sp) move.w a3,-(sp) move.w #$3f,-(sp) trap #1 add.l #12,sp tst.l d0 ;ADDED TO FIX ZERO LENGTH FILE beq.s notcrun ;DITTO move.l magic(pc),d0 cmp.l test(pc),d0 bne.s notcrun lea mustdecrun(pc),a1 move.w #1,(a1) bra.s skipit notcrun: lea mustdecrun(pc),a1 move.w #0,(a1) skipit: move.w #1,-(sp) move.w a3,-(sp) move.l #-8,-(sp) move.w #$42,-(sp) trap #1 add.l #10,sp move.l a3,d0 exitopen: lea inopen(pc),a1 move.w #0,(a1) movem.l (sp)+,a1-a3 exitopen2: dc.w $4ef9 retopen: ;exit dc.l $00 inopen: dc.w 0 test: dc.l 0 unpaklen: dc.l 0 mustdecrun: dc.w 0 magic: dc.b 'LZH!' IFNE SFIRSTROUTINE ;* getdta: lea dta(pc),a0 move.l d0,(a0) dc.w $4ef9% retgetdta: dc.l $00 ;* setdta: lea dta(pc),a0 move.l 2(a7),(a0) dc.w $4ef9 retsetdta: dc.l $00 ;*# FOR $4E (SFIRST) sfirst: tst.l d0 bne pissoff move.l 2(a7),a0 movem.l a1-a3,-(sp) move.w #$2,-(sp) move.l a0,-(sp) move.w #$3d,-(sp) trap #1 addq.l #8,sp lea sfirsthandle(pc),a1 move.w d0,(a1) move.w mustdecrun(pc),d0 cmp.w #1,d0 beq.s change bra.s afterchange change: move.l dta(pc),a0 add.l #26,a0 move.l unpaklen(pc),d0 move.l d0,(a0) afterchange: move.w sfirsthandle(pc),-(sp) move.w #$3e,-(sp) trap #1 addq.l #4,sp movem.l (sp)+,a1-a3 pissoff: dc.w $4ef9 retsfirst: ;exit dc.l $00 ENDC ;*# FOR $42 (LSEEK) IN TRAP1 IFNE LSEEKROUTINE lseek: cmp.w #2,8(a7) bne vamos3 cmp.l #0,2(a7) bne vamos3 lea seekhandle(pc),a0 move.w 6(a7),(a0) lea sd0save(pc),a0 move.l d0,(a0) move.w mustdecrun(pc),d0 cmp.w #1,d0 bne.s vamos move.l unpaklen(pc),d0 bra.s vamos3 vamos: move.l sd0save(pc),d0 vamos3: dc.w $4ef9 retlseek: ;exit dc.l $00 ENDC ;*$ FOR $3F (READ) IN TRAP1 decrunch: ;a0 - start of crunched data ;a1 - beginning of uncrunching area movem.l d0-d7/a0-a6,-(sp) move.l buffer(pc),a0 lea origlen(pc),a1 move.l 4(a0),(a1) move sr,d1 btst #13,d1 bne nochange clr.l -(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp lea jek(pc),a6 move.l d0,(a6) lea mode(pc),a1 move.w #1,(a1) ;1 denotes must return to user mode nochange: lea colstore(pc),a1 move.w $fff8240,(a1) move.l buffer(pc),a0 move.l a0,a1 add.l #$20,a1 BSR DEPACK move.w colstore(pc),$fff8240 ;restore memory saved in buffer move.l buffer(pc),a1 lea savebuf,a2 move.l #$20,a3 loadloop2: move.b (a2)+,(a1)+ subq.l #1,a3 cmp.l #0,a3 bne.s loadloop2 move.w mode(pc),d0 cmp.w #1,d0 bne nochange2 move.l jek(pc),-(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp nochange2: lea mode(pc),a1 move.w #$00,(a1) movem.l (sp)+,d0-d7/a0-a6 move.l origlen(pc),d0 dc.w $4ef9 return: ;exit decrunch module dc.l $00 * LZH DEPACKER For use with the JAM Packer V3.0/V4.0 * * USAGE: * LEA $ADDRESS OF PACKED DATA,A0 * LEA $ADDRESS TO UNPACK DATA TO,A1 * BSR DEPACK * * NOTE: Must save registers before executing depack if original * contents are required. RESET MOVEM.W D0-D1/D3/D5,-(A7) MOVEA.L A1,A2 MOVEQ #$00,D2 MOVEQ #-$02,D4 MOVEQ #$00,D1 MOVE.W #$0139,D5 OUTER ADDQ.W #2,D4 CMP.W (A2)+,D7 BHI.S OUTER MOVE.W $00(A3,D4.W),D3 ADDQ.W #1,D3 LSR.W #1,D3 CMP.W -$02(A3,D2.W),D3 BLS.S BIDDLE MOVE.W $00(A3,D1.W),D0 ADD.W $02(A3,D1.W),D0 CMP.W D0,D3 BLS.S BIDDLE BITH MOVE.W D0,$00(A3,D2.W) MOVE.W D1,$00(A1,D2.W) MOVE.W D2,$00(A0,D1.W) MOVE.W D2,$02(A0,D1.W) ADDQ.W #2,D2 ADDQ.L #4,D1 MOVE.W $00(A3,D1.W),D0 ADD.W $02(A3,D1.W),D0 CMP.W D0,D3 BHI.S BITH BIDDLE MOVE.W D3,$00(A3,D2.W) MOVE.W $00(A1,D4.W),D0 MOVE.W D0,$00(A1,D2.W) MOVE.W D2,$00(A0,D0.W) ADDQ.W #2,D2 DBF D5,OUTER MAKETABLE2 MOVE.W $00(A3,D1.W),D0 ADD.W $02(A3,D1.W),D0 MOVE.W D0,$00(A3,D2.W) MOVE.W D1,$00(A1,D2.W) MOVE.W D2,$00(A0,D1.W) MOVE.W D2,$02(A0,D1.W) ADDQ.W #2,D2 ADDQ.L #4,D1 CMP.W D7,D2 BNE.S MAKETABLE2 MOVEM.W (A7)+,D0-D1/D3/D5 RTS  CREATE MOVE.L TABLE7(PC),A0 LEA TDATA1(PC),A1 MOVEQ #$00,D0 MOVEQ #$1F,D1 MOVEQ #$00,D2 LOOP1 MOVE.B D0,(A0)+ DBF D1,LOOP1 DBF D2,EXIT1 MOVE.W (A1)+,D3 MOVEQ #$03,D2 EXIT1 ROL.W #4,D3 MOVE.W D3,D1 ANDI.W #$000F,D1 ADDQ.B #4,D0 BCC.S LOOP1 MOVE.L TABLE8(PC),A0 LEA TDATA2(PC),A1 MOVEQ #$05,D0 MOVEQ #$03,D1 LOOP2 MOVE.B $00(A1,D0.W),D2 EXT.W D2 LOOP3 MOVE.B D1,(A0)+ DBF D2,LOOP3 ADDQ.W #1,D1 DBF D0,LOOP2 RTS CREATE2 MOVE.L TABLE1(PC),A0 MOVE.L TABLE5(PC),A1 MOVE.L TABLE4(PC),A2 MOVEQ #$01,D1 MOVE.W #$04E6,D2 MOVEQ #$00,D4 MOVE.W #$0139,D0 CONTINUE MOVE.W D1,(A0)+ MOVE.W D2,(A1)+ MOVE.W D4,(A2)+ ADDQ.W #2,D2 ADDQ.W #2,D4 DBF D0,CONTINUE MOVE.L TABLE1(PC),A0 MOVE.L TABLE2(PC),A3 MOVE.L TABLE6(PC),A1 MOVE.L TABLE3(PC),A2 MOVE.W #$0274,D2 MOVEQ #$00,D4 MOVE.W #$0138,D0 DOMORE MOVE.W (A0)+,D1 ADD.W (A0)+,D1 MOVE.W  D1,(A3)+ MOVE.W D4,(A1)+ MOVE.W D2,(A2)+ MOVE.W D2,(A2)+ ADDQ.W #4,D4 ADDQ.W #2,D2 DBF D0,DOMORE MOVE.W #$F,(A3) CLR.W (A2) RTS  RESTORE BSR RESET BRA BACK TABLE1 DC.L 00 TABLE2 DC.L 00 TABLE3 DC.L 00 TABLE4 DC.L 00 TABLE5 DC.L 00 TABLE6 DC.L 00 TABLE7 DC.L 00 TABLE8 DC.L 00 BUFPOS: DC.L 00 EXIT ADDQ.L #4,A7 RTS DEPACK MOVE.L A0,A5 MOVE.L A1,A6 LEA TABLE1(PC),A0 MOVE.L #0,(A0) ;SET UP RELATIVE TABLE OFFSETS MOVE.L #$274,4(A0) MOVE.L #$4E8,8(A0) MOVE.L #$9CE,12(A0) MOVE.L #$C42,16(A0) MOVE.L #$EB6,20(A0) MOVE.L #$112A,24(A0) MOVE.L #$122A,28(A0) MOVE.L BUFPOS(PC),D1 TST.L D1 BNE.S DONTUSESCREEN USESCREEN: MOVE.B $F8201.W,D6 MOVE.B $F8203.W,D7 LSL.L #8,D6 MOVE.B D7,D6 LSL.L #8,D6 MOVE.L D6,D1 DONTUSESCREEN: ; MOVE.L A7,D1 ;GET STACK POSITON ; sub.l #$1500,D1 ;TABLES START ADDRESS IN D1 ;STORE UNDER STACK MOVE.W #7,D0 TABLOOP ADD.L D1,(A0)+ ;ADD TABLE BASE ADDRESS TO OFFSETS DBF D0,TABLOOP BSR CREATE BSR CREATE2 MOVE.L TABLE3(PC),A0 MOVE.L TABLE5(PC),A1 MOVE.L TABLE1(PC),A3 MOVE.L A6,-(A7) ADD.L 4(A5),A6 ADD.L 8(A5),A5 ADD.L #$0C,A5 MOVE.L A6,A4 ;THIS IS REQUIRED! MOVE.W #59,D0 ;MOVE 60 SPACES TO END OF UNPACKED AREA SPACES MOVE.B #$20,(A4)+ ;NOTE: SHOULD PROBABLY SAVE THIS DATA DBF D0,SPACES ; BEFORE WIPING IT OUT! MOVEQ #$08,D6 MOVE.B -(A5),D5 MOVE.W #$04E6,D7 MOVE.L TABLE8(PC),A4 TOP NOT.W $F8240.W CMPA.L (A7),A6 BLE EXIT MOVE.W $04E4(A1),D0 MORE DBF D6,NOTEMPTY MOVEQ #$07,D6 MOVE.B -(A5),D5 NOTEMPTY ADD.B D5,D5 BCC.S ZERO ADDQ.W #2,D0 ZERO MOVE.W $00(A1,D0.W),D0 CMP.W D7,D0 BLT.S MORE MOVE.W D0,D1 SUB.W D7,D0 MOVE.W $04E4(A3),D4 BMI RESTORE BACK MOVE.W $00(A0,D1.W),D1 SCAN LEA $00(A3,D1.W),A2 ADDQ.W #1,(A2) CMPM.W (A2)+,(A2)+ BCS.S FRSTGTR MOVE.W $00(A0,D1.W),D1 BNE.S SCAN LSR.W #1,D0 CMP.W #$0100,D0 BGE.S GTE256 WRITE MOVE.B D0,-(A6) BRA.S TOP FRSTGTR SUBQ.W #1,-$0004(A2) MOVE.W -$0004(A2),D4 SAME CMP.W (A2)+,D4 BEQ.S SAME SUBQ.L #4,A2 ADDQ.W #1,(A2) SUBA.L A3,A2 MOVE.W $00(A1,D1.W),D4 MOVE.W A2,$00(A0,D4.W) CMP.W D7,D4 BCC.S SKIP MOVE.W A2,$02(A0,D4.W) SKIP MOVE.W $00(A1,A2.W),D2 MOVE.W D4,$00(A1,A2.W) MOVE.W D1,$00(A0,D2.W) CMP.W D7,D2 BCC.S SKIP2 MOVE.W D1,$02(A0,D2.W) SKIP2 MOVE.W D2,$00(A1,D1.W) MOVE.W $00(A0,A2.W),D1 BNE.S SCAN LSR.W #1,D0 CMP.W #$0100,D0 BLT.S WRITE GTE256 MOVE.B -1(A5),D1 MOVEQ #$00,D2 LSR.B D6,D1 OR.B D5,D1 MOVE.B $00(A4,D1.W),D2 SUB.W D2,D6 BPL.S POSITIVE MOVE.B -(A5),D5 MOVE.B D5,D4 ADDQ.W #2,D6 BMI.S OVERFLOW BEQ.S MODD4 LSR.B #1,D4 LSL.B #7,D5 BRA.S MODD4 READONE MOVE.B -(A5),D5 MOVE.B D5,D4 LSL.B #6,D5 MOVEQ #$02,D6 LSR.B D6,D4 BRA.S DOCOPY POSITIVE BEQ.S READONE MOVE.B (A5),D5 SUBQ.W #6,D6 OVERFLOW NEG.W D6 LSL.B D6,D5 MOVE.B D5,D4 MOVE.B -(A5),D5 MOVE.B D5,D2 LSL.B D6,D5 SUBQ.W #8,D6 NEG.W D6 LSR.B D6,D2 OR.B D2,D4 MODD4 ANDI.W #$003F,D4 DOCOPY MOVE.L TABLE7(PC),A0 MOVE.B (A0,D1.W),D2 LSL.W #4,D2 OR.B D4,D2 ;NEG.W D2 LEA $01(A6,D2.W),A0 SUBI.W #$00FE,D0 MOVE.W D0,D1 COPY MOVE.B -(A0),D0 MOVE.B D0,-(A6) DBF D1,COPY MOVE.L TABLE3(PC),A0 BRA TOP TDATA2 DC.W $0F2F DC.W $2F3F DC.W $2F1F TDATA1 DC.W $FFF7 DC.W $7 DC.W $7773 DC.W $3 DC.W $3 DC.W $3331 DC.W $1 DC.W $1 DC.W $1 DC.W $1 DC.W $1 DC.W $1110 DC.L $00 DC.L $00 SECTION DATA origlen: dc.l $00 oldssp: dc.l $00 buffer: dc.l $00 mode: dc.l $00 jek: dc.l $00 length: dc.l $00 colstore: dc.l $00 seekflag: dc.w $00 seekhandle: dc.w $00 sd0save: dc.l $00 rtlseeksav: dc.l $00 sfirsthandle: dc.l $00 dta: dc.l $00 oldsize: dc.l $00 NULL: DC.L $00E