gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/libc/targets/sm83/input.s
1 .include "global.s"
2
3 ;; Note that while gets uses a pointer, the pointer had better
4 ;; be in non-banked RAM else bad things will happen.
5
6 .globl .copy_vram
7 .globl .set_xy_wtt
8 .globl .mv_sprite
9 .globl .set_sprite_prop
10 .globl .set_sprite_tile
11 .globl .jpad
12 .globl .padup
13
14 .MINMSPOSX = 0x02 ; In tiles
15 .MINMSPOSY = 0x0A
16 .MAXMSPOSX = 0x11
17 .MAXMSPOSY = 0x0F
18 .INIMSPOSX = .MINMSPOSX
19 .INIMSPOSY = .MINMSPOSY
20
21 .KBDWINPOSY = 0x08 ; In tiles
22 .KBDSIZE = 0x1006
23
24 .MSOFFSETX = 0x0C ; In pixels
25 .MSOFFSETY = 0x14
26
27 .MINACCEL = 0x0800
28 .MAXACCEL = 0x0100
29
30 .CR = 0x0A ; Unix
31 ; .CR = 0x0D ; Dos
32
33 .globl .tmode_out ; From 'output.s'
34 .globl .put_char
35 .globl .del_char
36 .globl .cury
37
38 .area _INPUT_HEADER (ABS)
39
40 .org .MODE_TABLE+4*.T_MODE_INOUT
41 JP .tmode_inout
42
43 .module Terminal
44
45 .area _DATA
46
47 .msx: ; Mouse position
48 .ds 0x01
49 .msy:
50 .ds 0x01
51 .msacc: ; Mouse acceleration
52 .ds 0x02
53 .msstate: ; Mouse state
54 .ds 0x01
55 .mschanged: ; Did the mouse move?
56 .ds 0x01
57 .string_len: ; Used length of input buffer
58 .ds 0x01
59
60 .area _HOME
61
62 ;; Enter text mode with input
63 .tmode_inout::
64 DI ; Disable interrupts
65
66 ;; Turn the screen off
67 LDH A,(.LCDC)
68 AND #LCDCF_ON
69 JR Z,1$
70
71 ;; Turn the screen off
72 CALL .display_off
73 1$:
74
75 LD A,(.mode)
76 AND #.T_MODE
77 CALL Z,.tmode_out
78
79 LD HL,#.tp1
80 LD DE,#0x8000
81 LD BC,#.endtp1-.tp1
82 CALL .copy_vram
83
84 LD A,#<.MINACCEL ; Acceleration
85 LD (.msacc),A
86 LD A,#>.MINACCEL
87 LD (.msacc+1),A
88
89 ;; Initialize window
90 LD BC,#.frame_tiles
91 LD DE,#0x140A ; 0x140A
92 LD HL,#0
93 CALL set_recoded_win_tiles
94
95 LD BC,#.kbdtable
96 LD DE,#.KBDSIZE
97 LD HL,#(0x20 * 2 + 2) ; X=2, Y=2
98 CALL set_recoded_win_tiles
99
100 LD A,#.MINWNDPOSX
101 LDH (.WX),A
102 LD A,#.MAXWNDPOSY ; Hide window
103 LDH (.WY),A
104
105 XOR A
106 ;; Initialize sprite
107 LD C,A ; Sprite 0x00
108 LD D,A ; Default sprite properties
109 CALL .set_sprite_prop
110 XOR A
111 LD C,A ; Sprite 0x00
112 LD D,A ; Tile 0x00
113 CALL .set_sprite_tile
114 LD A,#0b00101100
115 LDH (.OBP0),A
116
117 ;; Turn the screen on
118 LD A,#(LCDCF_ON | LCDCF_WIN9C00 | LCDCF_WINOFF | LCDCF_BG8800 | LCDCF_BG9800 | LCDCF_OBJ8 | LCDCF_OBJOFF | LCDCF_BGON)
119 LDH (.LCDC),A
120
121 LD A,#.T_MODE_INOUT
122 LD (.mode),A
123
124 EI ; Enable interrupts
125
126 RET
127
128 set_recoded_win_tiles::
129 LDH A,(.LCDC)
130 AND #LCDCF_WIN9C00
131 JR Z,2$
132 LD A,#0x9C
133 JR 3$
134 2$:
135 LD A,#0x98
136 3$:
137 ADD H
138 LD H,A
139 PUSH DE
140 PUSH HL
141 4$:
142 LD A,(BC)
143 INC BC
144 PUSH BC
145 PUSH HL
146
147 LD C,A
148 LD HL,#(font_current+1) ; font_current+sfont_handle_font
149 LD A,(HL+)
150 LD H,(HL)
151 LD L,A
152 LD A,(HL+)
153 AND #3
154 CP #2 ; FONT_NOENCODING
155 JR Z,5$
156 INC HL
157 LD B,#0
158 ADD HL,BC
159 LD C,(HL)
160 5$:
161 POP HL
162
163 WAIT_STAT
164 LD A,C
165 LD (HL+),A
166
167 POP BC
168
169 DEC D
170 JR NZ,4$
171
172 POP HL
173 POP DE
174
175 LD A,L
176 ADD #0x20
177 LD L,A
178 ADC H
179 SUB L
180 LD H,A
181 DEC E
182
183 PUSH DE
184 PUSH HL
185 JR NZ,4$
186
187 ADD SP,#4
188 RET
189
190 ;; Prompt the user for a char and return it in A
191 .get_char:
192 PUSH BC
193 PUSH DE
194 PUSH HL
195 CALL .show_kbd
196 CALL .show_mouse
197 1$:
198 CALL .track_mouse
199 CALL .update_mouse
200 CALL .jpad
201 LD D,A
202 AND #.A ; Is A pressed ?
203 JP Z,1$
204
205 LD A,(.msy) ; Look for char under the mouse
206 SUB #.MINMSPOSY
207 JR Z,12$
208 LD E,A
209 XOR A
210 11$:
211 ADD #.MAXMSPOSX-.MINMSPOSX+1
212 DEC E
213 JR NZ,11$
214 12$:
215 LD E,A
216 LD A,(.msx)
217 SUB #.MINMSPOSX
218 ADD E
219 LD HL,#.kbdtable
220 LD B,#0x00
221 LD C,A
222 ADD HL,BC
223 LD B,(HL)
224
225 CALL .hide_mouse
226 CALL .hide_kbd
227 LD A,B
228
229 POP HL
230 POP DE
231 POP BC
232 RET
233
234 ;; Prompt the user for a string and store it in (HL)
235 .get_string:
236 PUSH BC
237 PUSH DE
238 PUSH HL
239 CALL .show_kbd
240 CALL .show_bkg
241 CALL .show_mouse
242 XOR A
243 LD (.string_len),A
244 1$:
245 CALL .track_mouse
246 CALL .update_mouse
247 CALL .jpad
248 LD D,A
249 AND #.A ; Is A pressed ?
250 JP NZ,10$
251 LD A,D
252 AND #.B ; Is B pressed ?
253 JP NZ,20$
254 LD A,D
255 AND #.SELECT ; Is SELECT pressed ?
256 JP NZ,30$
257 LD A,D
258 AND #.START ; Is START pressed ?
259 JR Z,1$
260 CALL .padup ; Wait for button to be depressed
261
262 LD A,#.CR
263 CALL .put_char
264 LD (HL),#0x00
265 CALL .hide_mouse
266 CALL .hide_bkg
267 CALL .hide_kbd
268 POP HL
269 POP DE
270 POP BC
271 RET
272
273 10$:
274 ;; Insert a character at cursor position
275 LD A,(.string_len) ; Check buffer length
276 ; CP #.BUFLEN-1 ; Keep 1 char for EOS
277 ; JR Z,13$
278 INC A
279 LD (.string_len),A ; Update it
280 LD A,(.msy) ; Look for char under the mouse
281 SUB #.MINMSPOSY
282 JR Z,12$
283 LD E,A
284 XOR A
285 11$:
286 ADD #.MAXMSPOSX-.MINMSPOSX+1
287 DEC E
288 JR NZ,11$
289 12$:
290 LD E,A
291 LD A,(.msx)
292 SUB #.MINMSPOSX
293 ADD E
294 PUSH HL
295 LD HL,#.kbdtable
296 LD B,#0x00
297 LD C,A
298 ADD HL,BC
299 LD A,(HL)
300 POP HL
301 LD (HL+),A ; Add it into input buffer
302 CALL .put_char ; Print it
303 CALL .show_bkg ; Ensure the text is not hidden
304 13$:
305 CALL .padup ; Wait for button to be depressed
306 JP 1$
307
308 20$:
309 ;; Delete a character at cursor position
310 LD A,(.string_len) ; Is there any char in the buffer ?
311 OR A
312 JR Z,21$
313 DEC A ; Yes
314 LD (.string_len),A ; Update buffer length
315 DEC HL
316 CALL .del_char
317 21$:
318 CALL .padup ; Wait for button to be depressed
319 JP 1$
320
321 30$:
322 CALL .hide_mouse
323 CALL .hide_bkg
324 CALL .hide_kbd
325 CALL .padup ; Wait for button to be depressed
326 CALL .show_kbd
327 CALL .show_bkg
328 CALL .show_mouse
329 JP 1$
330
331 .show_kbd:
332 PUSH BC
333 PUSH DE
334 LDH A,(.LCDC)
335 OR #LCDCF_WINON ; Window = On
336 LDH (.LCDC),A
337 LD A,#.MAXWNDPOSY ; Show window
338 1$:
339 BIT 0,A ; Wait for VBL every 2 pixels (slow down)
340 JR NZ,2$
341 LD B,A
342 CALL .wait_vbl_done
343 LD A,B
344 2$:
345 LDH (.WY),A
346 CP #.KBDWINPOSY*0x08
347 JR Z,99$
348 DEC A
349 JR 1$
350 99$:
351 POP DE
352 POP BC
353 RET
354
355 .hide_kbd:
356 PUSH BC
357 PUSH DE
358 LD A,#.KBDWINPOSY*0x08+1
359 1$: ; Hide window
360 BIT 0,A ; Wait for VBL every 2 pixels (slow down)
361 JR Z,2$
362 LD B,A
363 CALL .wait_vbl_done
364 LD A,B
365 2$:
366 LDH (.WY),A
367 CP #.MAXWNDPOSY
368 JR Z,3$
369 INC A
370 JR 1$
371 3$:
372 LDH A,(.LCDC)
373 AND #~LCDCF_WINON ; Window = Off
374 LDH (.LCDC),A
375 POP DE
376 POP BC
377 RET
378
379 .show_bkg:
380 PUSH BC
381 PUSH DE
382 LDH A,(.SCY)
383 LD D,A
384 LD A,(.cury)
385 SUB #.KBDWINPOSY-1
386 JR C,99$
387 JR Z,99$
388 SLA A ; A = A * 8
389 SLA A
390 SLA A
391 SUB D
392 JR C,99$
393 JR Z,99$
394 LD C,A
395 LDH A,(.SCY)
396 1$:
397 BIT 0,A ; Wait for VBL every 2 pixels (slow down)
398 JR Z,2$
399 LD B,A
400 CALL .wait_vbl_done
401 LD A,B
402 2$:
403 INC A
404 LDH (.SCY),A
405 DEC C
406 JR Z,99$
407 JR 1$
408 99$:
409 POP DE
410 POP BC
411 RET
412
413 .hide_bkg:
414 LDH A,(.SCY)
415 OR A
416 RET Z
417 PUSH BC
418 PUSH DE
419 1$:
420 BIT 0,A ; Wait for VBL every 2 pixels (slow down)
421 JR Z,2$
422 LD B,A
423 CALL .wait_vbl_done
424 LD A,B
425 2$:
426 DEC A
427 LDH (.SCY),A
428 JR Z,99$
429 JR 1$
430 99$:
431 POP DE
432 POP BC
433 RET
434
435 .show_mouse:
436 LD A,#.INIMSPOSX
437 LD (.msx),A
438 LD A,#.INIMSPOSY
439 LD (.msy),A
440 CALL .set_mouse
441 LDH A,(.LCDC)
442 OR #LCDCF_OBJON ; OBJ = On
443 LDH (.LCDC),A
444 RET
445
446 .hide_mouse:
447 LDH A,(.LCDC)
448 AND #~LCDCF_OBJON ; OBJ = Off
449 LDH (.LCDC),A
450 RET
451
452 .track_mouse:
453 PUSH BC
454 PUSH DE
455 PUSH HL
456 XOR A
457 LD (.mschanged),A ; Default to no change
458 CALL .jpad
459 LD D,A
460
461 LD HL,#.msstate
462 AND #.UP+.DOWN+.LEFT+.RIGHT
463 JR NZ,1$
464 LD (HL),#0x00 ; Reset state
465 JP 99$
466 1$:
467 LD A,(HL)
468 LD (HL),#0x01 ; Set state
469 OR A ; Was it 0 ?
470 LD HL,#.msacc ; Acceleration
471 JR NZ,2$
472 ; Yes
473 LD (HL),#<.MINACCEL
474 INC HL
475 LD (HL),#>.MINACCEL
476 JR 4$ ; Update position
477 2$:
478 LD A,(HL+)
479 LD C, A
480 LD B,(HL)
481 DEC BC
482 LD A,B
483 OR C
484 JR Z,3$
485 LD (HL),B
486 DEC HL
487 LD (HL),C
488 JP 99$
489 3$: ; Set new acceleration to maximum
490 LD (HL),#>.MAXACCEL
491 DEC HL
492 LD (HL),#<.MAXACCEL
493 4$: ; Update position
494 LD A,#0x01
495 LD (.mschanged),A
496 LD A,D
497 AND #.UP ; Is UP pressed ?
498 JR Z,6$
499 LD A,(.msy)
500 CP #.MINMSPOSY
501 JR Z,5$
502 DEC A
503 LD (.msy),A
504 JR 6$
505 5$:
506 LD A,#.MAXMSPOSY
507 LD (.msy),A
508 6$:
509 LD A,D
510 AND #.DOWN ; Is DOWN pressed ?
511 JR Z,8$
512 LD A,(.msy)
513 CP #.MAXMSPOSY
514 JR Z,7$
515 INC A
516 LD (.msy),A
517 JR 8$
518 7$:
519 LD A,#.MINMSPOSY
520 LD (.msy),A
521 8$:
522 LD A,D
523 AND #.LEFT ; Is LEFT pressed ?
524 JR Z,10$
525 LD A,(.msx)
526 CP #.MINMSPOSX
527 JR Z,9$
528 DEC A
529 LD (.msx),A
530 JR 10$
531 9$:
532 LD A,#.MAXMSPOSX
533 LD (.msx),A
534 10$:
535 LD A,D
536 AND #.RIGHT ; Is RIGHT pressed ?
537 JR Z,99$
538 LD A,(.msx)
539 CP #.MAXMSPOSX
540 JR Z,11$
541 INC A
542 LD (.msx),A
543 JR 99$
544 11$:
545 LD A,#.MINMSPOSX
546 LD (.msx),A
547 99$:
548 POP HL
549 POP DE
550 POP BC
551 RET
552
553 .update_mouse:
554 LD A,(.mschanged) ; Did it change ?
555 OR A
556 RET Z ; No
557 .set_mouse:
558 PUSH BC
559 PUSH DE
560 PUSH HL
561 LD C,#0x00 ; Sprite 0x00
562 LD A,(.msx)
563 SLA A ; A = A * 8
564 SLA A
565 SLA A
566 ADD #.MSOFFSETX
567 LD D,A
568 LD A,(.msy)
569 SLA A ; A = A * 8
570 SLA A
571 SLA A
572 ADD #.MSOFFSETY
573 LD E,A
574 CALL .mv_sprite
575 POP HL
576 POP DE
577 POP BC
578 RET
579
580 _getchar::
581 LD A,(.mode)
582 CP #.T_MODE_INOUT
583 JR Z,1$
584 PUSH BC
585 CALL .tmode_inout
586 POP BC
587 1$:
588 CALL .get_char
589 LD E,A
590 RET
591
592 _gets::
593 LD A,(.mode)
594 CP #.T_MODE_INOUT
595 JR Z,1$
596 PUSH BC
597 CALL .tmode_inout
598 POP BC
599 1$:
600 LDA HL,2(SP) ; Skip return address
601 LD A,(HL+)
602 LD H,(HL) ; HL = s
603 LD L,A
604 PUSH HL
605 CALL .get_string
606 POP DE
607 RET
608
609 .tp1:
610
611 .pointers:
612
613 ; Tile 0x00
614 .byte 0xFF,0xFF,0xFE,0x82,0xFC,0x84,0xFC,0x84,0xFE,0x82,0xFF,0xB1,0xCF,0xC9,0x87,0x87
615
616 .endtp1:
617
618 .frame_tiles:
619 .byte 0x1C,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1D
620 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
621 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
622 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
623 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
624 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
625 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
626 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
627 .byte 0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
628 .byte 0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1F
629
630 .kbdtable:
631 .db 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
632 .db 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F
633 .ascii "0123456789:"
634 .db 0x3B
635 .ascii "<=>?"
636 .ascii "@ABCDEFGHIJKLMNO"
637 .ascii "PQRSTUVWXYZ[\]^_"
638 .ascii "`abcdefghijklmno"
639 .ascii "pqrstuvwxyz{|}~ "
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.