aboutsummaryrefslogtreecommitdiff
path: root/comptitle.s.in
blob: 824cded022d8943f806ce91370886e3f7ebca269 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
;;; see titlecompression.txt to understand how this works!

; cl65 -o comptitle.xex -t none comptitle.s

; comptitle.s.in is used by titlecomp.pl, to generate comptitle.s.
; __VARIABLE__ stuff is filled in by titlecomp.pl, q.v.
; DON'T bother to edit comptitle.s (edit the .in file instead)!

 .include "atari.inc"

 ; size of uncompressed image, in bytes (but, needs to be
 ; a multiple of $100).
;imgsize = __SIZE__
imgsize = $1700

 ; these both need to be page-aligned. destination also needs
 ; to be aligned on a 4K boundary.
start = $2000
destination = $9000

srcptr = FR0
dstptr = FR0+2
pagecount = FR0+4
tmp = FR0+5

 .word $ffff
 .word start
 .word end-1

 .org start

compdata:
 .incbin "comptitle.dat"

; table runs __FIRSTCODE__ to __LASTCODE__
table:
 __TABLE__

 ; decompression code starts here
init:
 lda #0
 sta SDMCTL ; turn off the screen. newtitle.s turns it back on.

 ;;; for benchmarking only, remove!
 ;sta RTCLOK
 ;sta RTCLOK+1
 ;sta RTCLOK+2

 lda #>imgsize
 sta pagecount
 lda #>compdata
 sta srcptr+1
 lda #>destination
 sta dstptr+1
 lda #0
 sta srcptr
 sta dstptr
 tay

copyloop:
 lda (srcptr),y
 bpl storebyte  ; 0-127 always represent themselves
 cmp #__LASTCODE__+1
 bcs storebyte  ; anything above the last code represents itself
 sta tmp
 sec
 sbc #__FIRSTCODE__
 bcc notcode    ; anything below the 1st code represents itself
 tax
 lda table,x
 beq notcode

 ; got a zero-run code. A = number of bytes of zeroes to store.
storezerorun:
 sty tmp
 tay
 dey
 lda #0
szloop:
 sta (dstptr),y
 jsr incdest
 beq done
nohi2:
 dey
 bpl szloop

 ldy tmp
 clc
 bcc storedone

notcode:
 lda tmp

storebyte:
 sty tmp
 ldy #0
 sta (dstptr),y
 jsr incdest
 beq done
nohi:
 ldy tmp

storedone:
 iny
 bne copyloop
 inc srcptr+1
 bne copyloop ; always branch (since srcptr never wraps around to 0)

done:
 ;;; for benchmarking only, remove!
 ;.byte $02 ; CIM, drops us to atari800 monitor
 rts

incdest:
 inc dstptr
 bne iddone
 inc dstptr+1
 dec pagecount
iddone:
 rts

end:
 .word INITAD
 .word INITAD+1
 .word init