-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrom.s
3207 lines (3206 loc) · 103 KB
/
rom.s
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
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
; source : 0_b4-6_ic1038.bin
; created: 2022-09-06 21:08:16
; by : jayne
; md5 : 1f8bedb609bba5b511182a4509fa345b
;
; constant
;
HIGH_ZERO = 0x00
NO = 0x00
YES = 0xff
ON = 0x01
TOGGLE_SLED = 0x01
STATUS_SLED = 0x00
TOGGLE_GLED = 0x04
STATUS_GLED = 0x02
OFF = 0x00
REG_0 = 0x00
REG_14_CURSOR_H = 0x0e
REG_14_CURSOR_L = 0x0f
CFG10 = 0x10
ROM_ACCESS_EN = 0x07
ROM_PACK_EN = 0x06
_BUZZER_ON = 0x04
CMT_MOTOR_START = 0x03
CMT_RS232_SELECT = 0x02
_DISPLAY_INHIBIT = 0x01
_CRT80 = 0x00
STATUS10 = 0x10
_CRT_DISPLAY = 0x07
_CRT_NTSC = 0x06
_PRT_SERIAL = 0x05
_GFX_AVAILABLE = 0x01
_FDD_PRESENT = 0x00
MASK_COUNTRY_SELECT = 0x1c
MASK_COUNTRY_BITS = 0x07
COUNTRY_INTERNATIONAL = 0x00
COUNTRY_DE = 0x01
COUNTRY_US = 0x02
COUNTRY_FR = 0x03
COUNTRY_UK = 0x04
COUNTRY_IT = 0x05
COUNTRY_ES = 0x06
COUNTRY_07 = 0x07
CFG20 = 0x20
CRT_RESET = 0x00
CEN_RESET = 0x01
CEN_STROBE = 0x02
MONINH = 0x03
GLED = 0x04
SLED = 0x05
UPPER_MONITOR_SEL = 0x06
STATUS_KBD = 0x20
KBD_COLUMNS = 0x0c
KBD_POSITION_CTRL = 0x4f
KBD_POSITION_SHIFT = 0x53
KBD_POSITION_SHIFT_LOCK = 0x4e
KBD_POSITION_COMMAND = 0x4d
KBD_POSITION_GRAPH = 0x56
KBD_BREAK = 0x07
MODIFIER_SHIFT = 0x01
STATUS30 = 0x30
CEN_DATA = 0x30
_SIOC = 0x00
_CRT_VSYNC_PERIOD = 0x01
_CEN_ACKNOWLEDGE = 0x02
_CEN_BUSY = 0x03
UART_DATA = 0x40
UART_CMD = 0x41
UART_STATUS = 0x41
_TxRDY = 0x00
_RxRDY = 0x01
_DSR = 0x07
CRT_REG = 0x50
CRT_DATA = 0x51
DMA = 0x60
DMA_MODE_SET = 0x68
PIC_ICW1 = 0x70
PIC_ICW2 = 0x71
PIC_OCW1 = 0x71
FDC_CMD_SENSE_INTERRUPT_STATE = 0x08
FDC_UNIT = 0xf0
UPD765_STATE = 0xf0
UPD765_DATA = 0xf8
UPD765_MAIN_STATUS = 0xf9
RQM_Request_for_master = 0x07
DIO_Data_input_output = 0x06
ID_JMP = 0xc3
ID_IS_BASIC = 0x7e
SCREEN_HEIGHT = 0x18
VK_NL = 0x0a
VK_ENTER = 0x0d
VK_ESC = 0x1b
VK_LEFT = 0x1d
VK_RIGHT = 0x1c
VK_UP = 0x1e
VK_DOWN = 0x1f
VK_DEL = 0x7f
GERMAN_MAX_ASCII_CODE = 0x7e
MASK_CAPITALIZE = 0x5f
ATTR0_NONE = 0x30
ATTR3_BLINK_INVERSE = 0x33
VRAM_ATTR_MASK = 0xc0
VRAM_ATTR_INVERS = 0x80
_VRAM_ATTR_INVERS = 0x07
_DRV_CTRL_INTERNAL = 0x02
_DRV_CTRL_84 = 0x03
_DRV_FG_BG_SAME_COLOR = 0x06
_DRV_NO_CLS = 0x07
COLOR0_BLACK = 0x30
COLOR7_WHITE = 0x37
COLOR0_BLACK = 0x30
COLOR_COUNT = 0x08
ATTR_WIDTH40 = 0x30
ATTR_WIDTH80 = 0x31
boot_sector = 0xc200
cold_start = 0x0000
id_basic = 0x0008
rst_38 = 0x0038
basic_start = 0x003b
BWS = 0xf000
stack_at_boot = 0xf000
bios_rom = 0xf000
SIZE4K = 0x1000
OFFSET_COLOR = 0x0800
ROM_PACK_16K = 0xa000
ROM_PACK_8K = 0xc000
MAX_ADDRESS = 0xffff
str_monitor_size = 0x0023
str_memory_size = 0x000e
str_completed_size = 0x000e
str_area_over_size = 0x0010
str_print_off_size = 0x000e
str_print_on_size = 0x000d
str_break_at_size = 0x000d
str_reg_size = 0x002d
kbd_matrix_buffer_size = 0x000c
kbd_matrix_buffer2_size = 0x000c
kbd_table_lookup_size = 0x00c0
crt_table40_size = 0x0010
crt_table80_size = 0x0010
fdc_cmd_init_size = 0x0005
fdc_cmd_read_boot_size = 0x0009
kbd_table_int_size = 0x0060
kbd_table_int_sh_size = 0x0060
kbd_table_de_size = 0x00c0
kbd_table_us_size = 0x00c0
kbd_table_fr_size = 0x00c0
kbd_table_uk_size = 0x00c0
kbd_table_it_size = 0x00c0
kbd_table_es_size = 0x00c0
crt_table_ntsc_size = 0x0024
;
;
;
init_bios:
ld hl,#cfg20_settings
set 3,(hl) ;MONINH=1
ld a,(hl)
out (CFG20),a
call kbd_buffer_clear_beep
ld hl,#cfg10_settings
set 6,(hl) ;ROM_PACK_EN=1
ld a,(hl)
out (CFG10),a
ld a,(ROM_PACK_16K)
cp a,#ID_JMP
jp z,ROM_PACK_16K
ld a,(ROM_PACK_8K)
cp a,#ID_JMP
jp z,ROM_PACK_8K
ld hl,#cfg10_settings
res 6,(hl) ;ROM_PACK_EN=0
ld a,(hl)
out (CFG10),a
in a,(STATUS10)
bit 0,a ;_FDD_PRESENT==0
jp nz,fdd_available
ld a,(id_basic)
cp a,#ID_IS_BASIC
jr z,go_basic
ld hl,#cfg10_settings
set 7,(hl) ;ROM_ACCESS_EN=1
ld a,(hl)
ld (hl),a
out (CFG10),a
jp go_monitor
go_basic:
call patch_os_functions
jp basic_start
; unchecked data source
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.db 0x00,0x00,0x00,0x00,0x00 ;.....
go_monitor:
ld (save_stack),sp
ld sp,#stack_at_boot
call restore_os_functions
ld hl,#str_monitor
m_e06d:
call puts
call get_hex_number
cp a,#VK_ENTER
jr z,m_e07f
call print_new_line
ld hl,#str_memory
jr m_e06d
m_e07f:
ld hl,(param_word)
ld a,h
or a,l
jr nz,m_e089
ld hl,#MAX_ADDRESS
m_e089:
ld (max_address),hl
monitor_cmd_loop:
ld hl,#monitor_cmd_loop
push hl
call print_new_line
ld c,#'*'
call put_char
call get_char_echoed
cp a,#VK_ESC
ret z
and a,#MASK_CAPITALIZE
cp a,#'E'
jp z,return_to_basic
cp a,#'P'
jp z,enable_protocol_printer
cp a,#'M'
jp z,monitor_cmd_mem_move
cp a,#'D'
jp z,m_e178
cp a,#'G'
jp z,m_e1c9
cp a,#'R'
jp z,m_e21d
cp a,#'C'
ret nz
call print_space
call get_hex_number
cp a,#VK_ENTER
ret nz
ld hl,(param_word)
m_e0cd:
call m_e2dc
m_e0d0:
push hl
call m_e3ab
call m_e3e0
pop hl
jr c,m_e0e3
ld (hl),a
m_e0db:
inc hl
ld a,l
and a,#0x07
jr nz,m_e0d0
jr m_e0cd
m_e0e3:
cp a,#0x20
jr nz,m_e0ec
call print_space
jr m_e0db
m_e0ec:
cp a,#0x2d
ret nz
dec hl
jr m_e0cd
monitor_cmd_mem_move:
call print_space
call get_hex_number
cp a,#','
ret nz
ld hl,(param_word)
ld (param_1),hl
call get_hex_number
cp a,#','
ret nz
ld hl,(param_1)
ex de,hl
ld hl,(param_word)
ld (param_2),hl
or a,a
sbc hl,de
ret c
inc hl
ld (param_3),hl
call get_hex_number
cp a,#VK_ENTER
ret nz
ld hl,(param_3)
dec hl
ex de,hl
ld hl,(param_word)
or a,a
adc hl,de
jr c,m_e16c
ex de,hl
ld hl,(max_address)
sbc hl,de
jr c,m_e16c
push de
ld hl,(param_1)
ex de,hl
ld hl,(param_word)
or a,a
sbc hl,de
jr c,m_e15e
pop de
ld a,h
or a,l
jr z,m_e157
ld hl,(param_3)
push hl
pop bc
ld hl,(param_2)
m_e14e:
ld a,(hl)
ld (de),a
dec hl
dec de
dec bc
ld a,b
or a,c
jr nz,m_e14e
m_e157:
ld hl,#str_completed
call puts
ret
m_e15e:
ld hl,(param_3)
push hl
pop bc
ld hl,(0xe49c)
ex de,hl
ldir
pop de
jr m_e157
m_e16c:
ld hl,#str_area_over
call puts
ld hl,#str_memory
jp m_e06d
m_e178:
call print_space
call get_hex_number
cp a,#0x2c
ret nz
ld hl,(0xe49c)
ld (param_1),hl
call get_hex_number
cp a,#0x0d
ret nz
ld hl,(param_1)
ex de,hl
ld hl,(0xe49c)
or a,a
sbc hl,de
ret c
inc hl
push hl
ex de,hl
pop bc
m_e19c:
push bc
push hl
call m_e2dc
call m_e2d0
pop hl
pop bc
ld de,#0xe4a6
m_e1a9:
call m_e38d
ld a,(hl)
ld (de),a
dec bc
ld a,b
or a,c
inc hl
inc de
jp z,m_e282
ld a,(column_count)
xor a,#0x0f
and a,#0x0f
push bc
ld b,a
ld a,l
and a,b
pop bc
jr nz,m_e1a9
call m_e282
jr m_e19c
m_e1c9:
call print_space
call get_hex_number
cp a,#VK_ENTER
ret nz
ld hl,#rst_38
ex de,hl
ld hl,#rst38_vec
ld bc,#3
ldir
ld hl,#op_return
push hl
ld hl,(param_word)
jp (hl)
op_return:
ret
rst38_vec:
jp m_e1ea
m_e1ea:
ld (0xe4bd),hl
pop hl
ld (0xe4b7),hl
push af
pop hl
ld (0xe4bf),hl
ld (0xe4b9),bc
ld (0xe4bb),de
ld a,i
ld (0xe4c1),a
ld (0xe4c2),ix
ld (0xe4c4),iy
ld hl,#str_break_at
call puts
ld hl,(0xe4b7)
call m_e393
ld sp,#stack_at_boot
jp monitor_cmd_loop
m_e21d:
ld hl,#str_reg
call puts
ld hl,(0xe4b7)
call m_e393
ld hl,#0xe4b9
ld c,#0x04
m_e22e:
push bc
inc hl
push hl
call m_e38d
pop hl
dec hl
push hl
call m_e38d
pop hl
inc hl
inc hl
pop bc
dec c
jr nz,m_e22e
call m_e38d
call print_space
ld hl,(0xe4c2)
call m_e393
call print_space
ld hl,(0xe4c4)
call m_e393
ret
enable_protocol_printer:
ld a,(printer_protocol_flag)
or a,a
jr z,m_e269
ld a,#OFF
ld hl,#str_print_off
m_e262:
ld (printer_protocol_flag),a
call puts
ret
m_e269:
ld a,#ON
ld hl,#str_print_on
jr m_e262
return_to_basic:
ld a,(id_basic)
cp a,#ID_IS_BASIC
jr nz,just_go_back
call patch_os_functions
ld a,#0x0c
rst 0x18
just_go_back:
ld sp,(save_stack)
ret
m_e282:
push hl
push bc
ld a,(column_count)
and a,#0x18
ld c,a
ld b,#0x00
ld hl,#0xe4a6
or a,a
adc hl,bc
or a,a
sbc hl,de
ld a,l
or a,a
jr z,m_e2a7
m_e299:
push hl
call print_space
call print_space
call print_space
pop hl
dec l
jr nz,m_e299
m_e2a7:
call print_space
call print_space
ld a,(column_count)
and a,#0x18
ld b,a
ld hl,#0xe4a6
m_e2b6:
push hl
push bc
ld a,(hl)
cp a,#' '
jr c,non_char_printable
cp a,#VK_DEL
jr c,m_e2c3
non_char_printable:
ld a,#'.'
m_e2c3:
ld c,a
call put_char
pop bc
pop hl
inc hl
dec b
jr nz,m_e2b6
pop bc
pop hl
ret
m_e2d0:
ld hl,#0xe4a6
ld b,#0x10
m_e2d5:
ld (hl),#0x00
inc hl
dec b
jr nz,m_e2d5
ret
m_e2dc:
call print_new_line
call m_e393
ret
unreferenced_02:
call get_char_echoed
cp a,#','
ret
str_monitor:
.db 0x0c,0x2a,0x20,0x4d,0x4f,0x4e,0x49,0x54 ;.* MONIT
.db 0x4f,0x52,0x20,0x2a,0x20,0x28,0x56,0x2e ;OR * (V.
.db 0x20,0x31,0x2e,0x32,0x29,0x20,0x4a,0x75 ; 1.2) Ju
.db 0x6e,0x65,0x20,0x31,0x39,0x38,0x33,0x0d ;ne 1983.
.db 0x0a,0x0d,0x0a ;...
str_memory:
.db 0x4d,0x65,0x6d,0x6f,0x72,0x79,0x20,0x41 ;Memory A
.db 0x72,0x65,0x61,0x20,0x3f,0x00 ;rea ?.
str_completed:
.db 0x0d,0x0a,0x43,0x6f,0x6d,0x70,0x6c,0x65 ;..Comple
.db 0x74,0x65,0x64,0x0d,0x0a,0x00 ;ted...
str_area_over:
.db 0x0d,0x0a,0x41,0x72,0x65,0x61,0x20,0x4f ;..Area O
.db 0x76,0x65,0x72,0x20,0x21,0x0d,0x0a,0x00 ;ver !...
str_print_off:
.db 0x0d,0x0a,0x50,0x72,0x69,0x6e,0x74,0x20 ;..Print
.db 0x4f,0x46,0x46,0x0d,0x0a,0x00 ;OFF...
str_print_on:
.db 0x0d,0x0a,0x50,0x72,0x69,0x6e,0x74,0x20 ;..Print
.db 0x4f,0x4e,0x0d,0x0a,0x00 ;ON...
str_break_at:
.db 0x0d,0x0a,0x42,0x72,0x65,0x61,0x6b,0x20 ;..Break
.db 0x61,0x74,0x20,0x23,0x00 ;at #.
str_reg:
.db 0x0d,0x0a,0x20,0x50,0x43,0x20,0x20,0x20 ;.. PC
.db 0x42,0x20,0x20,0x43,0x20,0x20,0x44,0x20 ;B C D
.db 0x20,0x45,0x20,0x20,0x48,0x20,0x20,0x4c ; E H L
.db 0x20,0x20,0x41,0x20,0x20,0x46,0x20,0x20 ; A F
.db 0x49,0x20,0x20,0x49,0x58,0x20,0x20,0x20 ;I IX
.db 0x49,0x59,0x0d,0x0a,0x00 ;IY...
m_e38d:
call print_space
ld a,(hl)
jr m_e398
m_e393:
ld a,h
call m_e39c
ld a,l
m_e398:
call m_e39c
ret
m_e39c:
push bc
push af
rrca
rrca
rrca
rrca
call m_e3b2
pop af
call m_e3b2
pop bc
ret
m_e3ab:
call m_e38d
ld c,#'-'
jr m_e3bb
m_e3b2:
and a,#0x0f
cp a,#0x0a
jr nc,m_e3bf
add a,#0x30
m_e3ba:
ld c,a
m_e3bb:
call put_char
ret
m_e3bf:
add a,#0x37
jr m_e3ba
print_new_line:
push bc
ld c,#VK_ENTER
call put_char
ld c,#VK_NL
jr put_char_with_pop
print_space:
push bc
ld c,#' '
put_char_with_pop:
call put_char
pop bc
ret
put_char:
call putch_internal
ld a,(printer_protocol_flag)
or a,a
call nz,dev_printer_write_byte
ret
m_e3e0:
call get_hex_digit
ret c
rlca
rlca
rlca
rlca
ld b,a
call get_hex_digit
ret c
add a,b
ld (param_word),a
ret
get_char_echoed:
call get_char
push af
ld c,a
call put_char
pop af
ret
; unchecked data source
.db 0x00 ;.
dev_fdd_wait_ready:
jp wait_fdd_ready
dev_monitor:
jp go_monitor
dev_serial_ready:
jp com_rx_ready
dev_serial_read_byte:
jp com_read_byte
jp com_write_byte
dev_kbd_status:
jp kbd_status_internal
dev_kbd_inkey:
jp get_char
CRTOUT:
jp putch_internal
jp kbd_status_internal
jp get_char
jp putch_internal
jp kbd_status_internal
jp get_char
jp putch_internal
jp get_char
jp com_read_byte
jp com_read_byte
jp putch_internal
dev_serial_tx_ready:
jp com_tx_ready
dev_serial_write_byte:
jp com_write_byte
dev_printer_write_byte:
jp lpt_write_byte
unreferenced_09:
jp lpt_write_byte
unreferenced_10:
ld a,#0xff
ret
unreferenced_11:
nop
xor a,a
ret
m_e445:
jp lpt_busy
nop
xor a,a
ret
jp kbd_buffer_clear_beep
jp kbd_buffer_clear
jp delay
jp buzzer_off
jp buzzer_on
jp m_e1ea
jp m_f115
vertical_display0:
.db 0x18 ;.
vertical_display1:
.db 0x18 ;.
column_count:
.db 0x50 ;P
; unchecked data source
.db 0x00 ;.
vertical_display2:
.db 0x18 ;.
vertical_display3:
.db 0x18 ;.
printed_char:
.db 0x30 ;0
attrib_color:
.db 0x07 ;.
cfg10_settings:
.db 0x00 ;.
cfg20_settings:
.db 0x00 ;.
cfg_esc_screen_drv:
.db 0x05 ;.
; unchecked data source
.db 0x00,0xd5 ;.U
cursor_row:
.db 0x00 ;.
cursor_column:
.db 0x00 ;.
led_status:
.db 0x00 ;.
cursor_start:
.db 0x00 ;.
kbd_debounce_cnt:
.db 0x00 ;.
kbd_matrix_buffer:
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.db 0x00,0x00,0x00,0x00 ;....
kbd_matrix_buffer2:
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.db 0x00,0x00,0x00,0x00 ;....
; unchecked data source
.db 0x00 ;.
kbd_modifiers:
.db 0x00 ;.
; unchecked data source
.db 0x00,0x00 ;..
kbd_position:
.db 0x00 ;.
kbd_ascii:
.db 0x00 ;.
cursor_abs:
.db 0x00,0x00 ;..
cursor_abs_color:
.db 0x00,0x00 ;..
rows_buffer:
.db 0x00,0x00 ;..
; unchecked data source
.db 0x00,0x00 ;..
key_code:
.db 0x00 ;.
color_attribute:
.db 0x00 ;.
; unchecked data source
.db 0x00,0x00 ;..
param_word:
.db 0x00,0x00 ;..
param_1:
.db 0x00,0x00 ;..
param_2:
.db 0x00,0x00 ;..
param_3:
.db 0x00,0x00 ;..
max_address:
.db 0x00,0x00 ;..
; unchecked data source
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
printer_protocol_flag:
.db 0x00 ;.
; unchecked data source
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;.......
save_stack:
.db 0x00,0x00 ;..
; unchecked data source
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
os_patch:
.db 0x00 ;.
; unchecked data source
.db 0x00 ;.
beep_delay:
.db 0x00,0x80 ;..
unreferenced_03:
jp wait_vsync
unreferenced_04:
jp is_vsync
unreferenced_05:
jp wait_flicker_free_save_A
kbd_table_lookup:
.db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37 ;01234567
.db 0x38,0x39,0x2e,0xff,0x2b,0x2d,0x3d,0xff ;89..+-=.
.db 0xff,0x61,0x62,0x63,0x64,0x65,0x66,0x67 ;.abcdefg
.db 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f ;hijklmno
.db 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77 ;pqrstuvw
.db 0x78,0x79,0x7a,0xff,0xff,0xff,0xff,0xff ;xyz.....
.db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37 ;01234567
.db 0x38,0x39,0x2d,0x5e,0x40,0x5b,0x5d,0x3a ;89-^@[]:
.db 0xff,0xff,0x20,0x5c,0x2c,0x2e,0x2f,0x3b ;.. \,./;
.db 0x1f,0x1c,0x1d,0x1e,0x9b,0xff,0x7f,0x1b ;........
.db 0xff,0x7f,0xff,0x09,0x0d,0xdf,0x0b,0x03 ;....._..
.db 0xff,0xff,0x86,0x85,0x84,0x83,0x82,0x81 ;........
.db 0xe4,0xe2,0xeb,0xe3,0xe8,0xe6,0xe9,0xe0 ;dbkchfi`
.db 0xea,0xe1,0xe5,0xff,0x2a,0x2f,0xe7,0xff ;jae.*/g.
.db 0xff,0x41,0x42,0x43,0x44,0x45,0x46,0x47 ;.ABCDEFG
.db 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f ;HIJKLMNO
.db 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57 ;PQRSTUVW
.db 0x58,0x59,0x5a,0xff,0xff,0xff,0xff,0xff ;XYZ.....
.db 0x5f,0x21,0x22,0x23,0x24,0x25,0x26,0x27 ;_!"#$%&'
.db 0x28,0x29,0x3d,0x7e,0x60,0x7b,0x7d,0x2a ;()=~`{}*
.db 0xff,0xff,0x20,0x7c,0x3c,0x3e,0x3f,0x2b ;.. |<>?+
.db 0xec,0xef,0xee,0xed,0x9b,0xff,0x7f,0x1b ;lonm....
.db 0xff,0x12,0xff,0x09,0x0d,0xdf,0x0c,0x03 ;....._..
.db 0xff,0xff,0x8c,0x8b,0x8a,0x89,0x88,0x87 ;........
kbd_buffer_clear_beep:
call chr_beep
call m_ee78
kbd_buffer_clear:
ld hl,#kbd_debounce_cnt
ld de,#kbd_matrix_buffer
ld bc,#kbd_table_int_size
ld (hl),#0
ldir
ret
kbd_status_internal:
push hl
push de
push bc
ld a,(0xe48a)
cp a,#0x80
jr z,m_e5e1
cp a,#0x88
jr z,m_e5e1
ld hl,#kbd_matrix_buffer2
call kbd_copy_state_hl
ld hl,#kbd_matrix_buffer2
ld b,#KBD_COLUMNS
loop_find_first_key:
ld a,(hl)
or a,a
jr nz,kbd_key_found
dec b
jp z,m_e647
inc hl
jr loop_find_first_key
kbd_key_found:
call m_e5e7
ld a,(0xe48a)
cp a,#0x80
ld a,#0x00
jr nz,m_e5e3
m_e5e1:
ld a,#0xff
m_e5e3:
pop bc
pop de
pop hl
ret
m_e5e7:
push hl
push de
push bc
ld hl,#0x05dc
call delay
ld hl,#kbd_matrix_buffer
call kbd_copy_state_hl
ld hl,#kbd_matrix_buffer
ld de,#kbd_matrix_buffer2
ld b,#kbd_matrix_buffer_size
cmp_kbd_entry:
ld a,(de)
cp a,(hl)
jr nz,m_e656
dec b
jr z,scan_is_stable
inc hl
inc de
jr cmp_kbd_entry
scan_is_stable:
call m_e682
ld a,(0xe48a)
cp a,#0x80
jr nz,clear_kbd_modifiers
call m_e72c
ld a,(led_status)
bit 7,a
jr nz,m_e64f
ld a,(kbd_ascii)
cp a,#0xff
jr z,m_e64f
or a,a
jr z,m_e64f
call modify_if_graphic_B
ld a,(key_code)
cp a,b
jr nz,set_kbd_debounce_cnt
ld a,(kbd_debounce_cnt)
or a,a
jr nz,decrement_kbd_debounce_cnt
ld hl,#0x0bb8
call delay
jr m_e664
; unchecked data source
.db 0xaf,0x18,0x12 ;/..
decrement_kbd_debounce_cnt:
dec a
ld (kbd_debounce_cnt),a
jr m_e656
m_e647:
xor a,a
ld (0xe4c9),a
clear_kbd_modifiers:
xor a,a
ld (kbd_modifiers),a
m_e64f:
xor a,a
ld (key_code),a
ld (kbd_debounce_cnt),a
m_e656:
xor a,a
ld (0xe48a),a
ld (kbd_ascii),a
jr m_e66a
set_kbd_debounce_cnt:
ld a,#32
ld (kbd_debounce_cnt),a
m_e664:
ld a,(kbd_ascii)
ld (key_code),a
m_e66a:
pop bc
pop de
pop hl
ret
kbd_copy_state_hl:
ld c,#STATUS_KBD
ld b,#KBD_COLUMNS
kbd_scan_columns:
in a,(c)
ld (hl),a
inc hl
inc c
dec b
jr nz,kbd_scan_columns
ret
delay:
nop
dec hl
ld a,h
or a,l
jr nz,delay
ret
m_e682:
ld ix,#kbd_matrix_buffer2
xor a,a
ld c,a
ld e,a
ld (0xe48a),a
kbd_buffer_check_colum:
ld a,0(ix)
or a,a
jr nz,m_e69d
ld a,c
add a,#0x08
ld c,a
m_e696:
cp a,#kbd_table_int_size
ret z
inc ix
jr kbd_buffer_check_colum
m_e69d:
ld d,#0x08
ld h,a
m_e6a0:
inc c