;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; MNEMOcompress ; ; ------------- ; ; Code compresser ; ; version 2.02 ; ; ; ; Improved Basic interface, faster, more efficient algorithm ; ; Any code file (not just screens), visible progress indicator ; ; ; ; 2.01 fixed interrupt bug ; ; 2.02 restored scrren display code ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TOKEN: EQU 73 ALLOCTMARK: EQU 73 FFPRINT: EQU &3DAD NUMCONT: EQU &15E9 CURCHL: EQU &5C51 CHAD: EQU &5A97 BORDER: EQU 254 VMPR: EQU 252 HMPR: EQU 251 LMPR: EQU 250 LINE: EQU 249 CLUT: EQU 248 JHEAPROOM: EQU &0106 JEXPT1NUM: EQU &0118 JGETINT: EQU &0121 JCLSBL: EQU &014E JSETSTRM: EQU &0112 JCLSLOWER: EQU &0151 JSTRS: EQU &017E JSVIN: EQU &0103 JSBUFFET: EQU &012A NMIV: EQU &5AE0 MTOKV: EQU &5AFA PRTOKV: EQU &5ADE CMDV: EQU &5AF4 EVALUV: EQU &5AF6 ANYIV: EQU &5B70 FLAGS: EQU &5C3B ORG 32768 DUMP 32768 STARTLOCATOR: DI CP 2 JR NC,PARAMERROR CALL 4 LD DE,FORCE-$ ADD HL,DE LD (HL),A LD BC,HEAPLENGTH CALL JHEAPROOM JR C,OKAYHEAP RST 8 DEFB 1 ; OUT OF MEMORY PARAMERROR: RST 8 DEFB 27 ; INVALID ARGUMENT OKAYHEAP: CALL 4 LD BC,HEAPPOINT-$ ADD HL,BC LD (HL),E INC HL LD (HL),D LD BC,HEAPLENGTH LD HL,HEAPSTART LDIR FORCE: EQU $+1 LD A,00 OR A JR Z,FINDASPACE CALL JGETINT CALL JGETINT LD A,H OR A JR NZ,PARAMERROR LD A,L CP 32 JR NC,PARAMERROR LD H,&51 JR FUTILS FINDASPACE: LD HL,&5120 LD B,32 XOR A LOOKUTIL: DEC HL CP (HL) JR Z,FUTILS UTILLOOP: DJNZ LOOKUTIL RST &08 DEFB 1 FUTILS: LD (HL),ALLOCTMARK LD A,L CALL 4 LD DE,PRINTPAGE-$ ADD HL,DE LD (HL),A DEC A AND 31 OUT (LMPR),A INC A LD HL,PAGESTART LD BC,PAGELENGTH LD DE,16384 LDIR HEAPPOINT: EQU $+1 LD DE,0000 LD B,A LD A,31 OUT (LMPR),A LD HL,PAGEPAGE-HEAPSTART ADD HL,DE LD (HL),B LD BC,(MTOKV) LD HL,MTOKVS-HEAPSTART ADD HL,DE LD (HL),C INC HL LD (HL),B LD HL,MATCHTOKEN-HEAPSTART ADD HL,DE LD (MTOKV),HL LD BC,(PRTOKV) LD HL,PRTOKVS-HEAPSTART ADD HL,DE LD (HL),C INC HL LD (HL),B LD HL,PRINT_FF-HEAPSTART ADD HL,DE LD (PRTOKV),HL LD BC,(CMDV) LD HL,CMDVS-HEAPSTART ADD HL,DE LD (HL),C INC HL LD (HL),B LD HL,RUNKEYWORD-HEAPSTART ADD HL,DE LD (CMDV),HL LD BC,(EVALUV) LD HL,EVALUVS-HEAPSTART ADD HL,DE LD (HL),C INC HL LD (HL),B LD HL,EVALUATE-HEAPSTART ADD HL,DE LD (EVALUV),HL LD A,31 OUT (LMPR),A XOR A CALL JCLSBL LD A,&FE CALL JSETSTRM CALL 4 LD DE,FIRSTMESSAGE-$ ADD HL,DE EX DE,HL LD BC,FIRSTTEXTLEN CALL &0013 RST &28 DEFB &26 ;ONELIT PRINTPAGE: DEFB 0 DEFB &33 ;EXIT CALL JSTRS CALL &13 LD A,13 RST &10 LD A,(&000F) CP 30 JR Z,OKAYROM CP 35 JR Z,OKAYROM CALL 4 LD DE,ERRORMESSAGE-$ ADD HL,DE EX DE,HL LD BC,ERRORTEXTLEN CALL &0013 OKAYROM: CALL 4 LD BC,PRINTPAGE-$ ADD HL,BC LD C,(HL) LD B,0 EI RET FIRSTMESSAGE: DEFB 22,0,0 DEFM "***********************" DEFB 13 DEFM "* MNEMOcompress v2.02 *" DEFB 13 DEFM "* by Andrew Collier *" DEFB 13 DEFM "*  1996/9 MNEMOtech *" DEFB 13 DEFM "***********************" DEFB 13 DEFB 13 DEFM "Installed at page " FIRSTTEXTLEN: EQU $-FIRSTMESSAGE ERRORMESSAGE: DEFB 13,13 DEFM "THIS PROGRAM HAS NOT BEEN TESTED" DEFB 13 DEFM "FOR YOUR SAM'S ROM... GOOD LUCK!" DEFB 13 DEFM "(EITHER CONTACT WEST COAST" DEFB 13 DEFM "COMPUTERS FOR AN UPGRADE OR ELSE" DEFB 13 DEFM "TRY HOMEINPROM OR SC_AUTOBOOT)" DEFB 13 ERRORTEXTLEN: EQU $-ERRORMESSAGE HEAPSTART: MATCHTOKEN: PUSH DE CALL 4 LD BC,KEYWORD-$ ADD HL,BC LD B,4 CHECKWORD: LD A,(DE) SUB (HL) JR Z,MATCH1 CP 32 JR NZ,NOMATCH MATCH1: INC DE INC HL DJNZ CHECKWORD LD B,4 LD A,(DE) CP "." JR NZ,CHECKWORD2 INC DE JR MATCH LD B,4 CHECKWORD2: LD A,(DE) SUB (HL) JR Z,MATCH2 CP 32 JR NZ,NOMATCH MATCH2: INC DE INC HL DJNZ CHECKWORD2 MATCH: LD A,(DE) CP "A" JR C,GOODWORD CP "z" JR NC,GOODWORD CP "Z"+1 JR C,NOMATCH CP "a" JR NC,NOMATCH GOODWORD: POP HL LD A,TOKEN-&3A CP TOKEN RET NOMATCH: POP DE MTOKVS: EQU $+1 LD HL,00 LD A,H OR L RET Z JP (HL) PRINT_FF: CP 255 JR NZ,NOUSE LD HL,(CURCHL) LD E,(HL) INC HL LD D,(HL) CALL 4 LD BC,OUTROUTS-$ ADD HL,BC LD (HL),E INC HL LD (HL),D CALL 4 LD BC,PRINTWORD-$ ADD HL,BC EX DE,HL LD HL,(CURCHL) LD (HL),E INC HL LD (HL),D POP HL XOR A RET NOUSE: PRTOKVS: EQU $+1 LD HL,0000 INC H DEC H RET Z JP (HL) PRINTWORD: OUTROUTS: EQU $+1 LD DE,0000 LD HL,(CURCHL) LD (HL),E INC HL LD (HL),D CP TOKEN JR NZ,NOTMYTOKEN CALL 4 LD DE,KEYWORD-$ ADD HL,DE EX DE,HL LD BC,9 CALL &0013 XOR A RET NOTMYTOKEN: CALL 4 LD DE,TEMPSTORES-$ ADD HL,DE LD BC,(PRTOKV) LD (HL),C INC HL LD (HL),B INC HL INC HL LD (HL),A LD HL,0000 LD (PRTOKV),HL LD A,255 RST &10 TEMPSTORES: EQU $+1 LD HL,0000 LD A,"!" LD (PRTOKV),HL LD HL,(CURCHL) LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) EVALUATE: CP TOKEN-&1A JR NZ,NOTCOMPFN RST &20 INC A JR NZ,SYNTAXERROR RST &20 CP 63 JR Z,COMPLENGTH SYNTAXERROR: RST &08 DEFB 26 NOTCOMPFN: EVALUVS: EQU $+1 LD HL,0000 INC H DEC H RET Z JP (HL) COMPLENGTH: POP HL LD A,(FLAGS) RLA JR NC,ENDFN IN A,(HMPR) LD B,A CALL 4 LD DE,PAGEPAGE-$ ADD HL,DE LD A,(HL) OUT (HMPR),A RST &28 DEFB &29 ;LKADDRB DEFW NLPAGE DEFB &E2,&00,&2A ;STK16K,MULT,LKADDRW DEFW NLPOINT DEFB &01,&33 ;ADDN,EXIT LD A,B OUT (HMPR),A ENDFN: RST &20 JP NUMCONT ;;;;;;;;;;;;;; ;ROM SPECIFIC; ;;;;;;;;;;;;;; RET RUNKEYWORD: CP 255 JR NZ,NOT_FF LD D,A PUSH DE CALL 4 LD DE,CHADSTORE-$ ADD HL,DE LD DE,(CHAD) LD (HL),E INC HL LD (HL),D RST &20 POP DE CP TOKEN JR Z,RUN CHADSTORE: EQU $+1 LD HL,0000 LD (CHAD),HL LD A,D NOT_FF: CMDVS: EQU $+1 LD HL,0000 INC H DEC H RET Z JP (HL) RUN: CALL 4 LD DE,FLAGFLAGS-$ ADD HL,DE LD (HL),0 RST &20 CP 231 ;SCREEN JR Z,CSCR CALL 4 LD DE,MEMORY-$ ADD HL,DE JP (HL) CSCR: IN A,(VMPR) BIT 6,A JR Z,EVENODD AND 254 EVENODD: CALL 4 LD DE,SCREEN-$ ADD HL,DE LD (HL),A RST &20 CP 135 ;AT JR Z,SCREENADDR ENDCOMMAND: CP 13 JR Z,COMPRESSSCREEN CP ":" JR Z,COMPRESSSCREEN ERROR: RST 8 DEFB 29 ;NOT UNDERSTOOD SCREENADDR: CALL 4 LD BC,FLAGFLAGS-$ ADD HL,BC LD (HL),1 RST &20 CALL JEXPT1NUM LD A,(FLAGS) RLA JR NC,NOEVALUATE RST &28 DEFB &25,&E2,&08,&06 ;DUP,STK16K,MOD,SWOP DEFB &E2,&09,&33 ;STK16K,IDIV,EXIT CALL JGETINT LD A,L DEC A DEC A AND 31 CALL 4 LD BC,DPAGE-$ ADD HL,BC LD (HL),A CALL JGETINT LD DE,16384 ADD HL,DE EX DE,HL CALL 4 LD BC,DPOINT-$ ADD HL,BC LD (HL),E INC HL LD (HL),D NOEVALUATE: RST &18 JR ENDCOMMAND COMPRESSSCREEN: POP HL LD A,(FLAGS) RLA RET NC DPAGE: EQU $+1 LD A,255 INC A JR NZ,WOZSET RST 8 DEFB 26 ; PARAMETER ERROR ; (COMPRESS SCREEN HAS BEEN USED ; BEFORE GIVING A DESTINATION ADDRESS) WOZSET: DEC A PAGEPAGE: EQU $+1 LD B,0 LD C,HMPR OUT (C),B LD (PUTPAGE),A DPOINT: EQU $+1 LD HL,0000 LD (PUTPOINT),HL SCREEN: EQU $+1 LD A,00 LD (SCREENFLAG),A LD B,A DEC A AND 31 LD (CODEPAGE),A LD HL,16384 LD (CODEPOINT),HL LD A,1 LD HL,8192 BIT 6,B JR NZ,SETLENGTH XOR A LD HL,6912 BIT 5,B JR Z,SETLENGTH LD HL,14336 SETLENGTH: LD (LENGTHPAGE),A LD (LENGTHBYTE),HL LD A,200 OUT (BORDER),A DI PUSH IX FLAGFLAGS: EQU $+1 LD A,00 OR A JR Z,BOTHERNOT XOR A LD (NLPAGE),A LD (NLPOINT+1),A LD A,4 LD (NLPOINT),A BOTHERNOT: LD B,0 CALL COMPRESS1 CALL COMPRESS2 POP IX LD A,(PPAGE) CALL 4 LD DE,DPAGE-$ ADD HL,DE LD (HL),A LD BC,(PPOINT) CALL 4 LD DE,DPOINT-$ ADD HL,DE LD (HL),C INC HL LD (HL),B LD A,72 OUT (BORDER),A EI RET MEMORY: CALL JEXPT1NUM CP 142 ;TO JR NZ,ERRORM RST &20 CALL JEXPT1NUM CP 135 ;AT JR NZ,ERRORM RST &20 CALL JEXPT1NUM CP 13 JR Z,COMPRESSMEMORY CP ":" JR Z,COMPRESSMEMORY ERRORM: RST 8 DEFB 29 COMPRESSMEMORY: POP HL LD A,(FLAGS) RLA RET NC CALL 4 LD DE,PAGEPAGE-$ ADD HL,DE LD A,(HL) OUT (HMPR),A RST &28 DEFB &25,&E2,&08,&06 ;DUP,STK16K,MOD,SWOP DEFB &E2,&09,&33 ;STK16K,IDIV,EXIT CALL JGETINT LD A,L DEC A DEC A AND 31 LD (PUTPAGE),A CALL JGETINT LD DE,16384 ADD HL,DE LD (PUTPOINT),HL RST &28 DEFB &06,&25,&1D,&03 ;SWOP,DUP,SWOP23,SUBN DEFB &E6,&01,&25,&2E ;STKFONE,ADDN,DUP,GRTR0 DEFB &33 ;EXIT CALL JGETINT LD A,L OR A JR NZ,NOPARAMERROR RST &08 DEFB 26 ;PARAMETER ERROR NOPARAMERROR: RST &28 DEFB &25,&E2,&08,&06 ;DUP,STK16K,MOD,SWOP DEFB &E2,&09,&33 ;STK16K,IDIV,EXIT CALL JGETINT LD A,L LD (LENGTHPAGE),A CALL JGETINT LD (LENGTHBYTE),HL RST &28 DEFB &25,&E2,&08,&06 ;DUP,STK16K,MOD,SWOP DEFB &E2,&09,&33 ;STK16K,IDIV,EXIT CALL JGETINT LD A,L DEC A DEC A AND 31 LD (CODEPAGE),A CALL JGETINT LD DE,16384 ADD HL,DE LD (CODEPOINT),HL XOR A LD (SCREENFLAG),A CALL 4 LD DE,NMIVS-$ ADD HL,DE LD BC,(NMIV) LD (HL),C INC HL LD (HL),B CALL 4 LD DE,BREAKBUTTON-$ ADD HL,DE LD (NMIV),HL CALL 4 LD DE,ANYIVS-$ ADD HL,DE LD BC,(ANYIV) LD (HL),C INC HL LD (HL),B CALL 4 LD DE,INTRUPT-$ ADD HL,DE LD (ANYIV),HL LD A,200 OUT (BORDER),A EI XOR A LD (NLPAGE),A LD HL,0 LD (NLPOINT),HL LD B,1 CALL COMPRESS1 LD A,72 OUT (BORDER),A LD A,255 OUT (LINE),A ANYIVS: EQU $+1 LD HL,0000 LD (ANYIV),HL CALL 4 LD DE,NMIVS-$ ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD (NMIV),DE RET BREAKBUTTON: CALL 4 LD DE,ANYIVS-$ ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD (ANYIV),DE NMIVS: EQU $+1 LD HL,0000 LD (NMIV),HL LD A,72 OUT (BORDER),A JP (HL) INTRUPT: LD A,C RRA JR NC,LINEINT AND 4 JR Z,FRAMEINT ENDINT: LD A,B JP 84 ;OUT (LMPR),A:POP HL:POP BC:POP AF ;EI:RET ; ;UNDOC ROM CALL, PROBABLY ROM SPECIFIC FRAMEINT: LD A,200 OUT (BORDER),A LD A,182 OUT (LINE),A JR ENDINT LINEINT: LD A,72 OUT (BORDER),A LD A,182 OUT (LINE),A JR ENDINT KEYWORD: DEFM "COMPRESS " HEAPLENGTH: EQU $-HEAPSTART PAGESTART: ORG 32768 DECOMPRESS: LD (SPSTORE),SP LD B,A CP 3 JR NC,ARGERROR OR A JR Z,NOPARAMS LD (PARAMS),A RST &28 DEFB &07,&25,&E2,&09 ;DROP,DUP,STK16K,IDIV DEFB &06,&E2,&08,&33 ;SWOP,STK16K,MOD,EXIT PARAMS: EQU $+1 LD A,00 DEC A JR NZ,TWOPARAMS CALL JGETINT LD DE,32768 ADD HL,DE LD (FROMADDR+16384),HL CALL JGETINT LD A,L DEC A AND 31 LD (FROMPAGE+16384),A FILLDEST: LD A,255 LD (TOPAGE+16384),A LD (TOADDR+16384),A LD (TOADDR+16385),A JR JUMPLMEM TWOPARAMS: CALL JGETINT LD DE,32768 ADD HL,DE LD (TOADDR+16384),HL CALL JGETINT LD A,L DEC A AND 31 LD (TOPAGE+16384),A RST &28 DEFB &07,&25,&E2,&09 ;DROP,DUP,STK16K,IDIV DEFB &06,&E2,&08,&33 ;SWOP,STK16K,MOD,EXIT CALL JGETINT LD DE,32768 ADD HL,DE LD (FROMADDR+16384),HL CALL JGETINT LD A,L DEC A AND 31 LD (FROMPAGE+16384),A JR JUMPLMEM NOPARAMS: NEXTSCREENFLAG:EQU $+1 LD A,00 OR A JR NZ,FILLDEST ARGERROR: RST &08 DEFB 26 JUMPLMEM: IN A,(HMPR) LD (HMPRS+16384),A DEC A AND 31 OUT (LMPR),A JP LMEM ORG $-16384 CODEERROR: LD A,(HMPRS) OUT (HMPR),A JP HMEMERROR HMEMERROR: EQU $+16384 LD A,31 OUT (LMPR),A RST &08 DEFB 27 DECOMPRESS1: LD HL,(FROMADDR) LD A,(FROMPAGE) OUT (HMPR),A LD B,A PUSH HL INC HL LD A,(HL) LD C,A INC HL LD E,(HL) INC HL LD D,(HL) POP HL OR E OR D JR Z,CODEERROR DEC HL ADD HL,DE LD A,H CP 192 JR C,NOSINGLE SUB 64 LD H,A INC C NOSINGLE: LD A,B ADD C LD B,A OUT (HMPR),A LD (HUFFDATAP),A LD A,(HL) OR A JP NZ,CODEERROR INC HL LD DE,SHORTTABLE-16384 SETTABLE: LD A,(HL) LD C,A RLCA RLCA RLCA AND 7 INC A LD B,A LD A,C AND 31 FIRSTTABLE: LD (DE),A INC E DJNZ FIRSTTABLE INC HL LD A,E OR A JR NZ,SETTABLE LD (HUFFDATA),HL LD HL,BYTETABLE-16384 LD DE,SHORTTABLE-16384 LD B,1 FCHARLOOP1: LD C,0 FCHARLOOP: LD A,(DE) CP B JR NZ,NFCHAR LD (HL),A INC HL LD (HL),E INC HL XOR A LD (DE),A NFCHAR: OR C LD C,A INC E JR NZ,FCHARLOOP INC B LD A,C OR A JR NZ,FCHARLOOP1 LD BC,BYTETABLE-16384 LD HL,BYTETABLE-15872 LD D,0 TLOOP1: INC D LD (HL),D INC HL LD (HL),0 INC HL TLOOP2: LD A,(BC) CP D JR NZ,TLOOP1 INC BC LD A,(BC) LD (HL),A INC HL LD (HL),255 INC HL INC BC LD E,L LD D,H TLOOP3: DEC HL LD A,(HL) DEC HL OR A JR NZ,NENDTLOOP3 LD A,(HL) LD (HL),E INC HL LD (HL),D DEC (HL) EX DE,HL LD D,A JR TLOOP2 NENDTLOOP3: LD A,H CP BYTETABLE/256-62 JR NZ,TLOOP3 LD A,L OR A JR NZ,TLOOP3 LD (DCOMPSPS),SP DI HUFFDATA: EQU $+1 LD DE,0000 LD A,(HUFFDATAP) OUT (HMPR),A LD A,(DE) INC DE EX AF,AF' LD B,8 EXX FROMADDR: EQU $+1 LD HL,0000 LD DE,4 ADD HL,DE TOADDR: EQU $+1 LD DE,0000 NEWDECOMP: XOR A OUT (CLUT),A LD A,D CP 192 JR C,NOSWAPQ SUB 64 LD D,A LD A,(TOPAGE) INC A LD (TOPAGE),A NOSWAPQ: LD A,H CP 192 FROMPAGE: EQU $+1 LD A,00 JR C,NOSWAPP INC A LD (FROMPAGE),A RES 6,H NOSWAPP: OUT (HMPR),A LD A,(HL) LD B,A RLA JR C,DHUFF RLA JR C,LONG AND 252 JP Z,ENDDECOMPRESS1 INC HL LD C,(HL) LD A,(TOPAGE) OUT (HMPR),A LD A,C INC B SHORTRLCPUT: LD (DE),A INC DE DJNZ SHORTRLCPUT INC HL JR NEWDECOMP LONG: LD A,B AND 63 LD B,A INC HL LD C,(HL) INC HL LD A,(HL) LD (SBYTE),A INC BC LD A,C OR A LD A,B LD B,C JR Z,NOINC INC A NOINC: LD C,A LD A,(TOPAGE) OUT (HMPR),A SBYTE: EQU $+1 LD A,00 LONGRLCPUT: LD (DE),A INC DE DJNZ LONGRLCPUT DEC C JR NZ,LONGRLCPUT INC HL JR NEWDECOMP DHUFF: RLA JR C,LONGHUFF LD A,B AND 63 INC A LD C,A LD B,0 JR DOHUFF LONGHUFF: LD A,B AND 63 LD B,A INC HL LD C,(HL) INC BC DOHUFF: EXX LD A,D CP 192 JR C,ANOTHERHUFF SUB 64 LD D,A LD A,(HUFFDATAP) INC A LD (HUFFDATAP),A ANOTHERHUFF: EX AF,AF' LD SP,BYTETABLE-15872 NOEXTRAHUFF: POP HL INC H JR Z,GOTHBYTE RLA JR C,JUMPHUFF DJNZ NOEXTRAHUFF HUFFDATAP: EQU $+1 LD A,00 OUT (HMPR),A LD A,(DE) INC DE LD B,8 JR NOEXTRAHUFF JUMPHUFF: LD SP,HL DJNZ NOEXTRAHUFF LD A,(HUFFDATAP) OUT (HMPR),A LD A,(DE) INC DE LD B,8 JR NOEXTRAHUFF GOTHBYTE: EX AF,AF' TOPAGE: EQU $+1 LD A,00 OUT (HMPR),A LD A,L EXX LD (DE),A AND 112 OUT (CLUT),A INC DE DEC BC LD A,B OR C EXX JR NZ,ANOTHERHUFF EXX INC HL JP NEWDECOMP ENDDECOMPRESS1: DCOMPSPS: EQU $+1 LD SP,0000 EI EXX LD (FROMADDR),DE LD A,(HUFFDATAP) LD (FROMPAGE),A RET LMEM: LD SP,32767 LD HL,(FROMADDR) LD A,(FROMPAGE) OUT (HMPR),A XOR A LD (NEXTSCREENFLAG-16384),A LD A,(HL) OR A JR Z,DECSCREEN DEC A JP Z,DECMEMORY JP JUMPHMEM DECSCREEN: LD HL,32768 LD (TOADDR),HL IN A,(VMPR) AND 30 LD (TOPAGE),A CALL DECOMPRESS1 LD A,(FROMPAGE) OUT (HMPR),A LD HL,(FROMADDR) LD A,(HL) INC HL AND 96 LD B,A IN A,(VMPR) AND 30 OR B OUT (VMPR),A LD DE,BYTETABLE-16384 LD B,20 PALLOOP1: LD A,(HL) CP 128 JR C,FLASH1 AND 127 LD (DE),A INC HL INC DE DJNZ PALLOOP1 LD HL,(FROMADDR) INC HL LD B,20 JR PALLOOP2 FLASH1: LD (DE),A INC DE INC HL INC HL DJNZ PALLOOP1 LD HL,(FROMADDR) INC HL LD B,20 PALLOOP2: LD A,(HL) CP 128 JR C,FLASH2 AND 127 LD (DE),A INC HL INC DE DJNZ PALLOOP2 JR PALLINE1 FLASH2: INC HL LDI DJNZ PALLOOP2 PALLINE1: LD A,(HL) LDI INC A JR Z,ENDPALLINE LDI LD A,(HL) CP 128 JR NC,NOFLASHLINE LDI LDI JR PALLINE1 NOFLASHLINE: AND 127 LD (DE),A INC DE LD (DE),A INC DE INC HL JR PALLINE1 ENDPALLINE: LD (FROMADDR),HL LD A,(HL) INC HL OR (HL) INC HL OR (HL) INC HL OR (HL) LD (NEXTSCREENFLAG-16384),A XOR A OUT (HMPR),A DI LD DE,&55D8+16384 LD HL,BYTETABLE-16384 LD BC,40 LDIR COPYPALLINE: LD A,(HL) LDI INC A JR Z,ENDDECSCR LDI LDI LDI JR COPYPALLINE DECMEMORY: LD A,(TOPAGE) INC A JR Z,WRONGPARAM CALL DECOMPRESS1 JR JUMPHMEM WRONGPARAM: RST &08 DEFB 27 ENDDECSCR: EI JUMPHMEM: QUICKEXIT: HMPRS: EQU $+1 LD A,00 OUT (HMPR),A JP SPSTORE-1 ORG $+16384 SPSTORE: EQU $+1 LD SP,0000 LD A,31 OUT (LMPR),A EI RET GETBYTE: PUSH BC PUSH HL LPOINT: EQU $+1 LD BC,0000 LD A,B OR C DEC BC JR NZ,FILEOK LD BC,16383 LPAGE: EQU $+1 LD A,00 OR A JR Z,ENDFILE DEC A LD (LPAGE),A FILEOK: LD (LPOINT),BC DI CPAGE: EQU $+1 LD A,00 OUT (LMPR),A CPOINT: EQU $+1 LD HL,0000 LD C,(HL) INC HL LD A,31 OUT (LMPR),A EI LD A,H CP 128 JR C,ENDGETBYTE SUB 64 LD H,A LD A,(CPAGE) INC A LD (CPAGE),A ENDGETBYTE: LD A,C LD (CPOINT),HL POP HL POP BC OR A RET ENDFILE: POP HL POP BC SCF RET STOREBYTE: PUSH BC PUSH HL PUSH AF NLPOINT: EQU $+1 LD BC,0000 INC BC LD A,B SUB 64 JR C,NOPAGESWAP LD B,A NLPAGE: EQU $+1 LD A,00 INC A LD (NLPAGE),A NOPAGESWAP: LD (NLPOINT),BC POP BC PUSH BC IN A,(LMPR) LD C,A DI PPAGE: EQU $+1 LD A,00 OUT (LMPR),A PPOINT: EQU $+1 LD HL,0000 LD (HL),B INC HL LD A,H CP 128 JR C,ENDPUTBYTE SUB 64 LD H,A LD A,(PPAGE) INC A LD (PPAGE),A ENDPUTBYTE: LD A,C OUT (LMPR),A EI LD (PPOINT),HL POP AF POP HL POP BC RET COUNTBYTE: PUSH DE PUSH HL LD E,A LD D,0 OR A RL E RL D RL E RL D RL E RL D LD HL,BYTETABLE+1 ADD HL,DE INC (HL) JR NZ,ENDCBYTE INC HL INC (HL) JR NZ,ENDCBYTE INC HL INC (HL) ENDCBYTE: POP HL POP DE RET COMPRESS1: LD (C1SPSTORE),SP LD SP,49151 CODEPAGE: EQU $+1 LD A,00 LD (CPAGE),A CODEPOINT: EQU $+1 LD HL,0000 LD (CPOINT),HL LENGTHPAGE: EQU $+1 LD A,00 LD (LPAGE),A LENGTHBYTE: EQU $+1 LD HL,0000 INC HL LD (LPOINT),HL PUTPAGE: EQU $+1 LD A,00 LD (PPAGE),A PUTPOINT: EQU $+1 LD HL,0000 LD (PPOINT),HL LD A,B CALL STOREBYTE SCREENFLAG: EQU $+1 LD A,00 OR A JR NZ,NOPRINT1 CALL JSVIN DEFW JCLSLOWER LD DE,TEXT1 LD BC,LENTEXT1 CALL JSVIN DEFW &13 JR NOPRINT1 TEXT1: DEFB 22,1,0 DEFM "SWEEPING FILE: " LENTEXT1: EQU $-TEXT1 NOPRINT1: LD HL,BYTETABLE XOR A LD BC,255 CLEARTABLE: LD (HL),A INC HL LD (HL),C INC HL LD (HL),C INC HL LD (HL),C INC HL LD (HL),B INC HL LD (HL),B INC HL LD (HL),B INC HL LD (HL),B INC HL INC A JR NZ,CLEARTABLE LD A,255 CALL STOREBYTE CALL STOREBYTE CALL STOREBYTE CALL GETBYTE LD HL,0 ; TOTAL BYTES TO COMPRESS LD BC,0 ; BYTES WE MIGHT RLC LD E,A NEXTRLC: ; LD A,L ; AND 112 ; OUT (CLUT),A LD A,B CP 64 ; HIGHEST NUMBER OF RLC BYTES JP NC,COMPRLC ; MUST JUMP OUT EARLY LD A,H ;TOTAL-RLC = HUFFMAN SUB B ;TEST HUFFMAN AGAINST MAX VALUE CP 64 JP NC,COMPRLC CALL GETBYTE JP C,COMPRLC NEWBYTE: INC HL INC BC LD D,A ; NEW BYTE FROM FILE CP E ; PREVIOUS BYTE JR Z,NEXTRLC ; SAME, SO COUNT FOR RLC ; WE NOW HAVE CONSECUTIVE BYTES WHICH ARE NOT THE SAME LD A,B ; ENOUGH CONSECUTIVES TO RLC OR A JR NZ,COMPRLC LD A,C CP 3 JR NC,COMPRLC LD B,A ; *SMALL* NUMBER OF IDENTICAL LD A,E ; CONSECUTIVE BYTES COUNTFAIL: CALL COUNTBYTE DJNZ COUNTFAIL LD BC,0 LD E,D ; NOW TEST FOR BYTES SAME AS JR NEXTRLC ; NEW BYTE IN FILE ; HL BYTES TO COMPRESS ; BC BYTES RLC OF E ; THE REMAINDER BEING HUFFMAN'D ; D IS NEXT BYTE IN FILE COMPRLC: OR A SBC HL,BC JR Z,NOHUFFMAN ;NUMBER TO HUFFMAN COMPRESS DEC HL ;WE KNOW THAT AT LEAST 1 LD A,H OR A JR NZ,LONGHUFFMAN LD A,L CP 64 JR NC,LONGHUFFMAN OR 128 ;0 -> 63 BYTES HUFFMAN CALL STOREBYTE JR NOHUFFMAN LONGHUFFMAN: LD A,H OR 192 CALL STOREBYTE LD A,L CALL STOREBYTE NOHUFFMAN: LD A,B OR C JR Z,ENDRLC DEC BC ; AT LEAST 1 LD A,B ; (WELL, 3 ACTUALLY) OR A JR NZ,LONGRLC LD A,C CP 64 JR NC,LONGRLC CALL STOREBYTE LD A,E CALL STOREBYTE JR ENDRLC LONGRLC: LD A,B OR 64 CALL STOREBYTE LD A,C CALL STOREBYTE LD A,E CALL STOREBYTE ENDRLC: LD A,D LD (STORENEXTBYTE),A LD A,(SCREENFLAG) OR A JP NZ,MAKESOUND1 LD A,31 OUT (LMPR),A LD A,22 CALL JSVIN DEFW &10 LD A,1 CALL JSVIN DEFW &10 LD A,15 CALL JSVIN DEFW &10 RST &28 DEFB &29 ;LKADDRB DEFW NLPAGE DEFB &E2,&00,&2A ;STK16K,MULT,LKADDRW DEFW NLPOINT DEFB &01,&33 ;ADDN,EXIT CALL JSVIN DEFW JSTRS CALL JSVIN DEFW &13 JR STORENEXTBYTE-1 MAKESOUND1: LD A,127 OUT (BORDER),A LD A,200 OUT (BORDER),A STORENEXTBYTE: EQU $+1 LD E,00 LD HL,0 LD BC,0 CALL GETBYTE JP NC,NEWBYTE XOR A CALL STOREBYTE LD A,(PUTPAGE) LD B,A DI OUT (LMPR),A LD DE,(PUTPOINT) LD A,(PPAGE) SUB B LD B,A LD HL,(PPOINT) SBC HL,DE JR NC,STORELENGTH LD A,H ADD 64 LD H,A DEC B STORELENGTH: EX DE,HL INC HL LD A,H CP 128 JR C,SL1 SUB 64 LD H,A IN A,(LMPR) INC A OUT (LMPR),A SL1: LD (HL),B INC HL LD A,H CP 128 JR C,SL2 SUB 64 LD H,A IN A,(LMPR) INC A OUT (LMPR),A SL2: LD (HL),E INC HL LD A,H CP 128 JR C,SL3 SUB 64 LD H,A IN A,(LMPR) INC A OUT (LMPR),A SL3: LD (HL),D LD A,31 OUT (LMPR),A EI LD A,(SCREENFLAG) OR A JR NZ,NOPRINT2 CALL JSVIN DEFW JCLSLOWER LD DE,TEXT2 LD BC,LENTEXT2 CALL JSVIN DEFW &13 XOR A LD (COUNTTREE),A JR NOPRINT2 TEXT2: DEFB 22,1,0 DEFM "CREATING TREE: " LENTEXT2: EQU $-TEXT2 NOPRINT2: FIND2MIN: LD A,255 LD H,A LD L,A LD D,A LD E,A EXX LD H,A LD L,A LD D,A LD E,A LD B,0 LD IX,BYTETABLE FIND2MINL: LD A,H CP (IX+3) JR C,BIGGER1 JR NZ,LITTLE1 LD A,L CP (IX+2) JR C,BIGGER1 JR NZ,LITTLE1 LD A,D CP (IX+1) JR C,BIGGER1 LITTLE1: LD A,H EXX CP H EXX JR C,COPYLITTLE2 JR NZ,COPYLITTLE1 LD A,L EXX CP L EXX JR C,COPYLITTLE2 JR NZ,COPYLITTLE1 LD A,D EXX CP D EXX JR NC,COPYLITTLE1 COPYLITTLE2: LD A,D EXX LD D,A EXX LD A,E EXX LD E,A EXX LD A,H EXX LD H,A EXX LD A,L EXX LD L,A EXX COPYLITTLE1: LD E,B LD D,(IX+1) LD L,(IX+2) LD H,(IX+3) EXX JR BIGGER2 BIGGER1: EXX LD A,H CP (IX+3) JR C,BIGGER2 JR NZ,LITTLE2 LD A,L CP (IX+2) JR C,BIGGER2 JR NZ,LITTLE2 LD A,D CP (IX+1) JR C,BIGGER2 LITTLE2: EXX LD A,B EXX LD E,A LD D,(IX+1) LD L,(IX+2) LD H,(IX+3) BIGGER2: LD BC,8 ADD IX,BC EXX INC B JR NZ,FIND2MINL EXX LD A,H INC A JP Z,ONEACTIVECHAR LD A,D EXX SCF ADC D LD D,A EXX LD A,L EXX ADC L LD L,A EXX LD A,H EXX ADC H LD H,A LD C,E XOR A RL C RLA RL C RLA RL C RLA LD B,A LD IX,BYTETABLE ADD IX,BC LD (IX+1),D LD (IX+2),L LD (IX+3),H INC (IX+4) LD A,(IX+6) OR A JR Z,NOLINK1 TESTLINK1: LD C,(IX+5) XOR A RL C RLA RL C RLA RL C RLA LD B,A LD IX,BYTETABLE ADD IX,BC INC (IX+4) LD A,(IX+6) OR A JR NZ,TESTLINK1 NOLINK1: EXX LD (IX+5),E LD (IX+6),1 LD C,E XOR A RL C RLA RL C RLA RL C RLA LD B,A LD IX,BYTETABLE ADD IX,BC LD A,255 LD (IX+1),A LD (IX+2),A LD (IX+3),A INC (IX+4) LD A,(IX+6) OR A JR Z,NOLINK2 TESTLINK2: LD C,(IX+5) XOR A RL C RLA RL C RLA RL C RLA LD B,A LD IX,BYTETABLE ADD IX,BC INC (IX+4) LD A,(IX+6) OR A JR NZ,TESTLINK2 NOLINK2: LD A,(SCREENFLAG) OR A JR NZ,MAKESOUND2 LD A,31 OUT (LMPR),A LD A,22 CALL JSVIN DEFW &10 LD A,1 CALL JSVIN DEFW &10 LD A,15 CALL JSVIN DEFW &10 COUNTTREE: EQU $+1 LD B,00 INC B LD A,B LD (COUNTTREE),A RST &28 DEFB &23,&33 ;STKBREG,EXIT CALL JSVIN DEFW JSTRS CALL JSVIN DEFW &13 JP FIND2MIN MAKESOUND2: LD A,127 OUT (BORDER),A LD A,200 OUT (BORDER),A JP FIND2MIN ONEACTIVECHAR: LD A,(SCREENFLAG) OR A JR NZ,NOPRINT3 LD DE,TEXT3 LD BC,LENTEXT3 CALL JSVIN DEFW &13 JR NOPRINT3 TEXT3: DEFB 22,1,15 DEFM "DONE" LENTEXT3: EQU $-TEXT3 NOPRINT3: LD IX,BYTETABLE LD BC,0 LD DE,8 LD L,(IX+4) CODETABLE: LD A,C CP 7 JR Z,STORECODE LD A,(IX+12) CP L JR NZ,STORECODE INC C ADD IX,DE DJNZ CODETABLE INC B STORECODE: LD A,C RRCA RRCA RRCA OR L CALL STOREBYTE LD C,0 ADD IX,DE LD L,(IX+4) DJNZ CODETABLE LD HL,0 LD BC,32768 LD DE,0 EXX LD DE,8 LD B,0 LD C,1 LD HL,BYTETABLE+4 SEARCHLENGTH: LD A,(HL) CP C JR Z,FOUNDCHAR ADD HL,DE NEXTSEARCH: INC B JR NZ,SEARCHLENGTH INC C ;B=0 HERE LD HL,BYTETABLE+4 EXX OR A RR B RR C RR D LD A,B OR C OR D EXX JR NZ,SEARCHLENGTH LD A,31 OUT (LMPR),A RST 8 DEFB 33 FOUNDCHAR: EXX LD A,H EXX INC HL LD (HL),A EXX LD A,L EXX INC HL LD (HL),A EXX LD A,E EXX INC HL LD (HL),A LD A,L ADD 5 LD L,A LD A,H ADC 0 LD H,A EXX LD A,E ADD D LD E,A LD A,L ADC C LD L,A LD A,H ADC B LD H,A OR L OR H EXX JR NZ,NEXTSEARCH LD A,(SCREENFLAG) OR A JR NZ,NOPRINT4 CALL JSVIN DEFW JCLSLOWER LD DE,TEXT4 LD BC,LENTEXT4 CALL JSVIN DEFW &13 JR NOPRINT4 TEXT4: DEFB 22,1,0 DEFM "COMPRESSING FILE:" LENTEXT4: EQU $-TEXT4 GETDATA: PUSH HL PUSH BC DI GDATAPAGE: EQU $+1 LD A,00 OUT (LMPR),A GDATAPOINT: EQU $+1 LD HL,0000 LD B,(HL) INC HL LD A,H CP 128 JR C,NOSWAPAGAIN SUB 64 LD H,A LD A,(GDATAPAGE) INC A LD (GDATAPAGE),A NOSWAPAGAIN: LD (GDATAPOINT),HL LD A,31 OUT (LMPR),A EI LD A,B POP BC POP HL RET NOPRINT4: LD A,(CODEPAGE) LD (CPAGE),A LD HL,(CODEPOINT) LD (CPOINT),HL LD A,(LENGTHPAGE) LD (LPAGE),A LD HL,(LENGTHBYTE) INC HL LD (LPOINT),HL LD A,1 LD (CURBYTE),A LD A,(PUTPAGE) LD (GDATAPAGE),A LD DE,(PUTPOINT) LD (GDATAPOINT),DE CALL GETDATA CALL GETDATA CALL GETDATA CALL GETDATA NEXTFILEBYTE: LD A,(SCREENFLAG) OR A JP NZ,NOPRINTING LD DE,(CODEPOINT) OR A LD HL,(CPOINT) SBC HL,DE LD A,(CODEPAGE) LD C,A LD A,(CPAGE) ADC 0 SUB C LD (CURRENT),A LD A,H RIGHTPAGE: ADD 64 JR NC,RIGHTPAGE LD H,A LD (CURRENTP),HL LD A,31 OUT (LMPR),A LD A,22 CALL JSVIN DEFW &10 LD A,1 CALL JSVIN DEFW &10 LD A,18 CALL JSVIN DEFW &10 RST &28 DEFB &29 ;LKADDRB DEFW NLPAGE DEFB &E2,&00,&2A ;STK16K,MULT,LKADDRW DEFW NLPOINT DEFB &01,&33 ;ADDN,EXIT CALL JSVIN DEFW JSTRS CALL JSVIN DEFW &13 LD A,22 CALL JSVIN DEFW &0010 LD A,1 CALL JSVIN DEFW &0010 LD A,28 CALL JSVIN DEFW &0010 RST &28 DEFB &26 ;ONELIT CURRENT: DEFB 0 DEFB &E2,&00,&27 ;STK16K,MULT,FIVELIT DEFB 0,0 CURRENTP: DEFW 0 DEFB 0 DEFB &01 ;ADDN DEFB &29 ;LKADDRB DEFW LENGTHPAGE DEFB &E2,&00,&2A ;STK16K,MULT,LKADDRW DEFW LENGTHBYTE DEFB &01 ;ADDN DEFB &05,&26,100 ;DIVN,ONELIT:100 DEFB &00,&30 ;MULT,TRUNC DEFB &33 ;EXIT CALL JSVIN DEFW JSTRS CALL JSVIN DEFW &13 LD A,"%" CALL JSVIN DEFW &0010 NOPRINTING: CALL GETDATA CP 64 JR C,SHORTRLC CP 128 JR C,LRLC CP 192 JR NC,LHUFFMAN SHORTHUFFMAN: AND 63 INC A LD (HUFFSTORE),A XOR A LD (HUFFSTORE+1),A JP STARTDOHUFF SHORTRLC: AND 63 JP Z,STORELAST INC A LD L,A LD H,0 LD DE,(CPOINT) ADD HL,DE LD A,H CP 128 JP C,SETCODEPOINT SUB 64 LD H,A LD A,(CPAGE) INC A LD (CPAGE),A SETCODEPOINT: LD (CPOINT),HL CALL GETDATA ;JUNK REPEAT BYTE JP NEXTFILEBYTE LRLC: AND 63 LD H,A CALL GETDATA LD L,A INC HL LD DE,(CPOINT) ADD HL,DE LD A,H CP 128 JR C,SETCODEPOINT SUB 64 LD H,A LD A,(CPAGE) INC A LD (CPAGE),A JR SETCODEPOINT LHUFFMAN: AND 63 LD H,A CALL GETDATA LD L,A INC HL LD (HUFFSTORE),HL STARTDOHUFF: CURBYTE: EQU $+1 LD C,00 DOHUFFMAN: LD A,(SCREENFLAG) OR A JR Z,SCREFFECT LD A,127 OUT (BORDER),A LD A,200 OUT (BORDER),A SCREFFECT: CALL GETBYTE LD L,A XOR A RL L RLA RL L RLA RL L RLA LD H,A LD DE,BYTETABLE+4 ADD HL,DE LD E,(HL) INC HL LD A,(HL) LD D,8 NEXTBIT: RLA RL C JR NC,NOSTOREH LD B,A LD A,C CALL STOREBYTE LD C,1 LD A,B NOSTOREH: DEC D JR NZ,NONEWBYTE INC HL LD A,(HL) LD D,8 NONEWBYTE: DEC E JR NZ,NEXTBIT HUFFSTORE: EQU $+1 LD HL,0000 DEC HL LD (HUFFSTORE),HL LD A,H OR L JR NZ,DOHUFFMAN LD A,C LD (CURBYTE),A JP NEXTFILEBYTE STORELAST: LD A,(CURBYTE) SCF LASTBYTE: RLA JR NC,LASTBYTE CALL STOREBYTE ENDCOMPRESS1: LD A,31 OUT (LMPR),A C1SPSTORE: EQU $+1 LD SP,0000 RET COMPRESS2: LD (C2SPSTORE),SP LD SP,49151 LD A,(SCREENFLAG) AND 96 CALL STOREBYTE LD IX,&55D8 LD B,20 STOREPALETTE: LD A,(IX) CP (IX+20) JR NZ,MAINFLASHING OR 128 CALL STOREBYTE INC IX DJNZ STOREPALETTE JR STOREPALLINE MAINFLASHING: AND 127 CALL STOREBYTE LD A,(IX+20) AND 127 CALL STOREBYTE INC IX DJNZ STOREPALETTE STOREPALLINE: LD HL,&5600 SPALLINEL: LD A,(HL) CALL STOREBYTE INC A JR Z,ENDCOMPRESS2 INC HL LD A,(HL) CALL STOREBYTE INC HL LD A,(HL) INC HL CP (HL) JR NZ,LINEFLASH OR 128 CALL STOREBYTE INC HL JR SPALLINEL LINEFLASH: AND 127 CALL STOREBYTE LD A,(HL) AND 127 CALL STOREBYTE INC HL JR SPALLINEL ENDCOMPRESS2: DI LD A,(PPAGE) OUT (LMPR),A LD HL,(PPOINT) LD B,4 ENDMARKER: LD (HL),0 INC HL LD A,H CP 128 JR C,NOWORRY SUB 64 LD H,A IN A,(LMPR) INC A OUT (LMPR),A NOWORRY: DJNZ ENDMARKER LD A,31 OUT (LMPR),A EI C2SPSTORE: EQU $+1 LD SP,0000 RET PAGELENGTH: EQU $-32768 DEFS 256-$\256 SHORTTABLE: DEFS 256 BYTETABLE: DEFS 4608 LENGTHINPAGE: EQU $-32768