;*******************************************************************************
;
; kA1z0r cH33kz 0f teh m3gAm!gHtY D!1d0 F47wA
;
; Pr3s3nTs " D ! L D 0 B 0 0 T "
;
; Turbo Assembler 1.77
;
;*******************************************************************************
mighty_testmode EQU 1 ; 0=boot, 1=test, 3=compress ascii
;*******************************************************************************
PART 'Mighty Compressor'
; * * * * * * * * * * * * * * * * * * * * *
IF mighty_testmode=3
OPT D+,W+
lea txt(PC),A0 ; start of uncompressed ascii
bsr calc_len ; get length of ascii in d0 and len
lea txt(PC),A0 ; source
lea dst(PC),A1 ; destination
moveq #1,D2 ; rarely used char asc(1)
bsr.s copy_txt ; crunch it
lea dst(PC),A0 ; start of packed ascii, a1 holds end
BREAKPT 'save "crunched.txt",^a0,^a1'
copy_txt: move.b (A0)+,D1 ; get character
cmp.b #" ",D1 ; space?
bne.s copy_txt0 ; nope
bsr.s count_spaces ; d0=number of spaces, a0=after spc
cmp.b #1,D0 ; only one?
bgt.s more_spaces ; nope
move.b D1,(A1)+ ; just write a single space
bra.s copy_txt ; continue
more_spaces:
move.b D2,(A1)+ ; write rare char for recognition
subq.b #1,D0 ; for dbra depack number of spc-1
move.b D0,(A1)+ ; write no of spaces-1
bra.s copy_txt ; again...
copy_txt0:
cmp.b #13,D1 ; CR?
bne.s copy_txt1 ; no then copy text
cmpi.b #10,(A0) ; LF?
bne.s copy_txt1 ; no then copy text
clr.b (A1)+ ; write 0 instead to mark EOL
bra.s copy_txt ; again...
copy_txt1:
move.b D1,(A1)+ ; plain text just copy
tst.b D1 ; end of text reached?
bne.s copy_txt ; again...
clr.b (A1)+ ; set end marker
move.l A1,D7 ; d7=end address
sub.l #dst,D7 ; d7=lenght of compressed ascii
rts
count_spaces: ; this routine estimates the number of
moveq #0,D0 ; spaces and returns it in d0
count_spaces0: addq.b #1,D0
cmpi.b #" ",(A0)+
beq.s count_spaces0
lea -1(A0),A0
rts
calc_len: ; this routine estimates the lenght
moveq #-1,D0 ; of the original ascci art, which
calc_len0: addq.l #1,D0 ; has to be terminated by 0
tst.b (A0)+
bne.s calc_len0
move.l D0,len
rts
; * * * * * * * * * * * * * * * * * * * * *
len: DC.L 0 ; len of decompressed ascii
; * * * * * * * * * * * * * * * * * * * * *
txt: IBYTES 'FINGBOOT.TXT' ; decompressed ascii
DC.B 0
EVEN
; * * * * * * * * * * * * * * * * * * * * *
dst: DS.B 1024 ; compressed ascii
EVEN
ENDC
; * * * * * * * * * * * * * * * * * * * * *
ENDPART
;******************************************
_membot EQU $0432
_frclock EQU $0466
;******************************************
mighty_boot:
IF mighty_testmode
clr.w -(SP) ; init da mighty test environment
pea -1 ; for debugging
pea -1
move.w #5,-(SP)
trap #14 ; set low rez
lea $0C(SP),SP
clr.w $FFFF825E.w
lea inflate(PC),A1 ; location of mighty free memory
ELSE
movea.l _membot.w,A1 ; location of free memory
ENDC
lea ctxt(PC),A0 ; location of mighty compressed ascii
depack_txt: move.b (A0)+,D0 ; read char
cmp.b #1,D0 ; equal to mighty token?
bne.s no_space ; obviously not
move.b (A0)+,D0 ; read number of compressed spaces-1
ext.w D0 ; word! mighty extension to
copy_spaces: move.b #" ",(A1)+ ; copy spaces to target location
dbra D0,copy_spaces ; repeat until all spaces are done
bra.s depack_txt ; again...
no_space: move.b D0,(A1)+ ; copy unpacked char to target loc
tst.b D0 ; end of line reached?
bne.s depack_txt ; no then again...
tst.b (A0) ; end ot text reached?
beq.s out ; then we are done
move.b #13,(A1)+ ; otherwise write linebreak
move.b #7,(A1)+ ; and some bells and whistles
clr.b (A1)+ ; end of line marker
bra.s depack_txt ; again
out: clr.b (A1)+ ; set end of text marker
; * * * * * * * * * * * * * * * * * * * * *
again:
IF mighty_testmode
lea inflate(PC),A0 ; address of decompressed ascii
ELSE
movea.l _membot,A0 ; address of decompressed ascii
ENDC
mighty_print:
clr.l _frclock.w ; clr mighty frameclock (vbl_cnt)
wvbl: tst.l _frclock.w ; check if still same frame
beq.s wvbl ; wait till next frame
pea (A0) ; print one line of mighty ascii
move.w #9,-(SP)
trap #1
addq.l #2,SP ; "remove" function no from stack
movea.l (SP)+,A0 ; get start of last line
seek_end: tst.b (A0)+ ; search for the end of the line
bne.s seek_end
tst.b (A0) ; end of text reached?
bne.s mighty_print ; no then print again
cmpi.b #$39,$FFFFFC02.w ; check for mighty spacebar
bne.s again ; no space? then again
IF mighty_testmode
illegal ; into debugger
ENDC
rts
; * * * * * * * * * * * * * * * * * * * * *
ctxt: IBYTES 'CRUNCHED.TXT' ; da mighty ascii art (compressed)
EVEN
; * * * * * * * * * * * * * * * * * * * * *
BSS
; * * * * * * * * * * * * * * * * * * * * *
inflate: DS.B 1024 ; for testmode only
; * * * * * * * * * * * * * * * * * * * * *
END
|