-
Notifications
You must be signed in to change notification settings - Fork 2
/
text.asm
317 lines (286 loc) · 6.38 KB
/
text.asm
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
;-----------------------------------------------
; Decompresses a specific text sentence from a text bank
; input:
; - de: target destination of decompression
; - c: bank #
; - a: text # within the bank
; output:
; - de: pointer to copy the decompressed text to (ignored, hardcoded to text_buffer)
get_text_from_bank_reusing_bank:
ld hl,last_decompressed_text_bank
push af
ld a,c
cp (hl)
jr z,get_text_from_bank_reusing_bank_reuse
pop af
jr get_text_from_bank_entry_point1
get_text_from_bank_reusing_bank_reuse:
pop af
; push de
jr get_text_from_bank_entry_point2
get_text_from_bank:
; save the bank we are decompressing:
ld hl,last_decompressed_text_bank
get_text_from_bank_entry_point1:
ld (hl),c
ld hl,textBankPointers
ld b,0
add hl,bc
add hl,bc
; push de
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl ; hl has the pointer of the text bank
push af
ld de,buffer5
; call unpack_compressed
call pletter_unpack
pop af
get_text_from_bank_entry_point2:
ld hl,buffer5
get_text_from_bank_loop:
or a
jr z,get_text_from_bank_found
ld b,0
ld c,(hl)
inc hl
add hl,bc
dec a
jr get_text_from_bank_loop
get_text_from_bank_found:
; pop de
; copy the desired string to "text_buffer":
ld de,text_buffer
ld b,e ; text_buffer is 256-aligned, so, e == 0
ld c,(hl)
inc bc
ldir
ret
; ------------------------------------------------
; input:
; - a,c: text ID
; - de: address to render
; - iyl: color
; - b: expected length in bytes
draw_text_from_bank_16:
ld b,16*8
draw_text_from_bank:
push bc
push de
push iy
; ld de,text_buffer
call get_text_from_bank
draw_text_from_bank_entry_point:
call clear_text_rendering_buffer
pop iy
pop de
pop bc
ld hl,text_buffer
ld c,b
ld b,l ; l == 0 here as text_buffer is 256 aligned
jp draw_sentence
; ------------------------------------------------
; same as "draw_text_from_bank", but checks if we already have the text bank we want
; decompressed, to prevent decompressing again.
draw_text_from_bank_reusing:
push bc
push de
push iy
; ld de,text_buffer
call get_text_from_bank_reusing_bank
jr draw_text_from_bank_entry_point
; ------------------------------------------------
draw_text_from_bank_slow:
push bc
push de
push iy
; ld de,text_buffer
call get_text_from_bank
call clear_text_rendering_buffer
pop iy
pop de
pop bc
ld hl,text_buffer
ld c,b
ld b,l ; l == 0 here as text_buffer is 256 aligned
jr draw_sentence_slow
; ------------------------------------------------
clear_text_rendering_buffer:
ld hl,text_draw_buffer
ld bc,32*8-1
jp clear_memory
; ------------------------------------------------
; - de: VRAM address where to start drawing
; - a: attribute (color)
; - bc: expected length in bytes
render_text_draw_buffer:
ld hl,text_draw_buffer
push af
push bc
push de
call fast_LDIRVM
pop hl
ld bc,CLRTBL2-CHRTBL2
add hl,bc
pop bc
pop af
jp fast_FILVRM
; ------------------------------------------------
; - de: VRAM address where to start drawing
; - a: attribute (color)
; - bc: expected length in bytes
render_text_draw_buffer_slow:
; copy color attribute first:
push de
push bc
ex de,hl
ld de,CLRTBL2-CHRTBL2
add hl,de
call fast_FILVRM
pop bc
pop de
ld hl,text_draw_buffer
; we divide the # of bytes by 8:
srl b
rr c
srl b
rr c
srl b
rr c
ld a,c
push af
ld bc,8
call fast_LDIRVM
pop af
dec a
ret z
render_text_draw_buffer_slow_loop:
push af
ld a,(text_skip)
or a
jr nz,render_text_draw_buffer_slow_loop_skip
halt
halt
render_text_draw_buffer_slow_loop_skip:
push hl
call update_keyboard_buffers
pop hl
; wait a few seconds and skip to the menu:
ld a,(keyboard_line_clicks)
rra
jp nc,render_text_draw_buffer_slow_loop_no_skip
ld a,1
ld (text_skip),a
render_text_draw_buffer_slow_loop_no_skip:
ld bc,8
call copy_to_VDP
pop af
dec a
jr nz,render_text_draw_buffer_slow_loop
ret
; ------------------------------------------------
; Draws a sentence to video memory
; Arguments:
; - hl: sentence to draw (first byte is the length)
; - de: target VRAM address
; - iyl: color (attribute byte)
; - bc: expected length in bytes
draw_sentence:
call draw_sentence_pre_render
jp render_text_draw_buffer
draw_sentence_slow:
call draw_sentence_pre_render
jp render_text_draw_buffer_slow
draw_sentence_pre_render:
push de
push iy
push bc
ld de,text_draw_buffer
ld b,(hl) ; get the sentence length
inc hl
ld c,128 ; start in pixel 0
draw_sentence_loop:
push bc
push hl
ld a,(hl)
call draw_font_character
ld a,c ; we save the pixel mask
pop hl
pop bc
ld c,a
; next character
inc hl
djnz draw_sentence_loop
pop bc
pop iy
pop de
ld a,iyl
ret
; ------------------------------------------------
; Draws a character to video memory
; Arguments:
; - a: character to draw
; - de: memory address to draw
; - c: pixel offset (to determine whether we start in pixel 0, 1, 2, 3, 4, 5, 6, or 7 in the current tile)
; - This is a a "mask": 1, 2, 4, 8, 16, 32, ...
draw_font_character:
; get the pointer to the character:
push de
; for variable size fonts:
ld d,0
ld e,a
ld hl,font
add hl,de
add hl,de
add hl,de ; index of the letter is a*3
pop de
ld b,(hl) ; character size
inc hl
draw_font_character_loop:
push bc
ld b,(hl) ; column bitmap
inc hl
; render one column of the character:
ld ixl,8
push de
draw_font_character_loop2:
ld a,(de)
sra b
jr nc,draw_font_character_loop_no_pixel
or c
ld (de),a
draw_font_character_loop_no_pixel:
inc de
dec ixl
jr nz,draw_font_character_loop2
pop de
pop bc
rrc c
jr nc,draw_font_character_loop_no_next_tile
push hl
ld hl,8
add hl,de
ex de,hl
pop hl
draw_font_character_loop_no_next_tile:
djnz draw_font_character_loop
ret
; ------------------------------------------------
; input:
; - hl: name table address to start rendering
; - b: length of the text to render
; - a: first tile index to render
draw_text_name_table_ingame:
push af
push bc
call SETWRT
pop bc
ld a,(VDP.DW)
ld c,a
pop af
draw_text_name_table_ingame_loop:
out (c),a
inc a
djnz draw_text_name_table_ingame_loop
ret