home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mega Magazine 5
/
Mega_Magazine_05_19xx___nl_Side_B.atr
/
gigaexpo.lzh
/
GIGAEXPO.SRC
next >
Wrap
Text File
|
1988-09-01
|
6KB
|
418 lines
*************************************
* *
* THE HTT GIGA UNPACKER *
* (C)1990 BY FRANKENSTEIN *
* *
*************************************
* *
* VERSION: 5.7 DATE: 19-11-90 *
* *
*************************************
* USED FOR THE EXPO DEMO 1991
*------------------------------------
* DOCUMENTED/TRANSLATED AT 1-1-93 (!)
*------------------------------------
ORG $B000
* START OF PACKED DATA
PACKBEG EQU $46F2
* END OF PACKED DATA + 1 !!
* (PHYSICAL END)
PACKEND EQU $5000
*------------------------------------
* PROGRAM VARIABLES
*------------------------------------
* 3 PAGES BUFFER FOR THE TREE
TREE1 EQU $B900 * BITPAT.L
TREE2 EQU $BA00 * BITPAT.H
TREE3 EQU $BB00 * CHAR.
* WARNING! THIS IS A SMALL BUFFER!
MTAB1 EQU ENDPRG+1 * BUFFER
MTAB2 EQU ENDPRG+1+16 * BUFFER
SOURCE EQU $F0 (AND $F1)
TARGET EQU $F2 (AND $F3)
EIND EQU $F4 (AND $F5)
FINDBEG EQU $F6
FINDEND EQU $F7
BINBEG EQU $F8
BINEND EQU $F9
SRCBIT EQU $FA
TREELEN EQU $FB
DUMMY1 EQU $FC
DUMMY2 EQU $FD
SBCNT EQU $FE * SOURCE BIT COUNT.
* INTERRUPTS OFF!
LDA #0
STA $D40E
STA $D20E
LDA #DL
STA $230
STA $D402
LDA #DL/256
STA $231
STA $D403
LDA #34
STA $D400
*------------------------------------
* SET BEGIN & END POINTERS
*------------------------------------
LDA #PACKBEG:L
STA SOURCE
LDA #PACKBEG:H
STA SOURCE+1
LDA #PACKEND:L
STA EIND
LDA #PACKEND:H
STA EIND+1
*------------------------------------
* CREATE TWO MASK TABLES
*------------------------------------
LDX #31
LDA #0
DELTAB STA MTAB1,X
DEX
BPL DELTAB
LDX #7
LDA #1
FILTAB STA MTAB1,X
STA MTAB2+8,X
ASL
DEX
BPL FILTAB
*------------------------------------
* CLEAR TREE BUFFER
*------------------------------------
INX
TXA
DELBUF STA TREE1,X
STA TREE2,X
STA TREE3,X
INX
BNE DELBUF
*------------------------------------
* GET HEADER BYTES
*------------------------------------
* BYTE #1: \ LO/HI
* BYTE #2: / ORIGINAL START ADR.
* BYTE #3: LENGTH TREE TABEL
* [TREE]
* [DATA]
TAY ;Y=0
LDA (SOURCE),Y
STA TARGET
INY
LDA (SOURCE),Y
STA TARGET+1
INY
LDA (SOURCE),Y
STA TREELEN
*------------------------------------
* COPY TREE IN SEPARATE PAGES
*------------------------------------
LDX #0
CTREE LDA #3
JSR ADDSRC
LDY #0
LDA (SOURCE),Y
STA TREE1,X
INY
LDA (SOURCE),Y
STA TREE2,X
INY
LDA (SOURCE),Y
STA TREE3,X
INX
CPX TREELEN
BNE CTREE
* IF TREELEN = 0 (=256!)
* THEN THE ENDVECTOR IS 255
DEC TREELEN
LDA #3
JSR ADDSRC
*------------------------------------
* INITIALISATION
*------------------------------------
LDX #0
NOTSET INX
LDA TREE1,X
AND #%10000000
BEQ NOTSET
STX BEGEEN+1
* GET TWO BYTES FROM SOURCE
* SOURCE BIT COUNTER = 0
JSR NEXTWO
*------------------------------------
* MAIN LOOP
*------------------------------------
* TREE BIT COUNTER = 0
* (X = TREE BIT COUNTER)
* FINDBEG = BEGIN TREE-TABEL
* FINDEND = END TREE-TABEL
MAIN LDX #0
STX FINDBEG
LDA TREELEN
STA FINDEND
*------------------------------------
* SEARCH LOOP
*------------------------------------
* FILTER A BIT FROM DUMMY1, DUMMY2
* WITH HELP OF THE MASK CHOSEN
* BY THE SOURCE BIT COUNTER.
* "ORA" THE RESULT AND PUT IT
* IN SRCBIT
SEARCH LDY SBCNT
LDA DUMMY1
AND MTAB1,Y
STA SRCBIT
LDA DUMMY2
AND MTAB2,Y
ORA SRCBIT
STA SRCBIT
* RESET BINAIRY SEARCH POINTERS
LDA FINDBEG
STA BINBEG
LDA FINDEND
STA BINEND
* IF THE TREE BIT COUNTER >7 THEN
* CHECK THE HI-BYTE OF THE TREE-TABEL
TXA
BNE NOT1COL
BEGEEN LDY #0
JMP SKIP
NOT1COL AND #%00001000
BEQ LOCHK
*------------------------------------
* CHECK TREE HI-BYTE
*------------------------------------
LDA MTAB2,X
STA HMASK+1
HINEX LDA BINBEG
CLC
ADC BINEND
ROR
TAY
LDA TREE2,Y
HMASK AND #0
BNE EEN2
STY BINBEG
INY
CPY BINEND
BNE HINEX
JMP SKIP
EEN2 STY BINEND
DEY
CPY BINBEG
BNE HINEX
INY
JMP SKIP
*------------------------------------
* CHECK LO-BYTE TREE
*------------------------------------
LOCHK LDA MTAB1,X
STA LMASK+1
LONEX LDA BINBEG
CLC
ADC BINEND
ROR
TAY
LDA TREE1,Y
LMASK AND #0
BNE EEN
STY BINBEG
INY
CPY BINEND
BNE LONEX
JMP SKIP
EEN STY BINEND
DEY
CPY BINBEG
BNE LONEX
INY
* IF WE'RE LOOKING FOR A "0", THEN
* WE HAVE TO MOVE
* THE FINDEND POINTER
SKIP LDA SRCBIT
BNE NOZERO
DEY
STY FINDEND
JMP CONTIN
* IF WE'RE LOOKING FOR A "1", THEN
* WE HAVE TO MOVE
* THE FINDBEG POINTER
NOZERO STY FINDBEG
* INC. TREE BIT COUNTER (X = X + 1)
* INC. SOURCE BIT COUNTER (SBCNT)
CONTIN INX
INC SBCNT
* SOURCE BIT COUNTER > 15?
LDA SBCNT
CMP #16
BNE NOEND
* SOURCE BIT COUNTER = 0
* DUMMY1, DUMMY2 = NEXT TWO
* BYTES FROM SOURCE
LDA #2
JSR ADDSRC
JSR NEXTWO
* UNTIL FINDBEG = FINDEND
NOEND LDA FINDBEG
CMP FINDEND
BEQ PUTCH
JMP SEARCH
* GET A CHARACTER FROM THE TREE-TABEL
* WITH HELP OF THE FINDBEG POINTER
* AND PUT IT IN TARGET
PUTCH TAX
LDA TREE3,X
LDY #0
STA (TARGET),Y
STA $D01A
*------------------------------------
* INC. TARGET POINTER
*------------------------------------
INC TARGET
BNE NOTHI
* IF YOU WANT TO INCLUDE A
* "PAGES UNPACKED" COUNTER,
* HERE'S THE PLACE TO DO IT!
INC TARGET+1
NOTHI LDA TARGET
CMP EIND
BNE NOTHEND
LDA TARGET+1
CMP EIND+1
BEQ STOPIT
* NOT THE END, BACK TO MAIN!
NOTHEND JMP MAIN
* END OF DECRUNCH
STOPIT LDA #$C0
STA $D20E
LDA #$40
STA $D40E
LDA #0
STA 559
RTS
*------------------------------------
* ADD ACCU TO SOURCE POINTER
*------------------------------------
ADDSRC CLC
ADC SOURCE
STA SOURCE
BCC CEMPT
INC SOURCE+1
CEMPT RTS
*------------------------------------
* GET TWO NEW BYTES FROM SOURCE
*------------------------------------
NEXTWO LDY #0
STY SBCNT
LDA (SOURCE),Y
STA DUMMY1
INY
LDA (SOURCE),Y
STA DUMMY2
RTS
ASC %(C)FRANKENSTEIN%
DL DFB 112,112
DFB $42
DFW TXT
DFB $41
DFW DL
TXT ASC %HTT GIGA UNPACKER - %
ASC %IT'S SLOW, BUT GOOD!%
ENDPRG DFB 0¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯