/
rom.s
3729 lines (3728 loc) · 120 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 : tapcgv2_ic1038.bicom.bin
; created: 2021-01-30 13:27:36
; by : Jayne
; md5 : 1f8bedb609bba5b511182a4509fa345b
;
; constant
;
FG_WHITE = 0x07
BG_BLACK = 0x00
ATTR_INVERS = 0x07
ATTR_BLINK = 0x06
MASK_ATTR = 0xc0
ESC_53_CRT40 = 0x30
ESC_53_CRT80 = 0x31
ESC_0C_CLS = 0x07
ESC_0C_FB_SAME_COLOR = 0x06
ESC_0C_CTRL_INTERNAL = 0x02
ESC_0C_COMMAND_KEY = 0x03
ESC_0C_SCROLL_MODE = 0x00
MASK_ESC_0C_SCROLL_MODE = 0x01
HIGH_ZERO = 0x00
ON = 0x01
TOGGLE_SLED = 0x01
STATUS_SLED = 0x00
TOGGLE_GLED = 0x04
INPUT_MODE_GRAPH = 0x80
INPUT_MODE_B1 = 0xb1
INPUT_MODE_32 = 0x32
STATUS_GLED = 0x02
OFF = 0x00
REG_0 = 0x00
REG_10_CURSOR_START = 0x0a
CURSOR_INVISIBLE = 0x20
CURSOR_BLINK_SLOW = 0x40
MASK_CURSOR_LINE = 0x1f
REG_14_CURSOR_H = 0x0e
REG_14_CURSOR_L = 0x0f
BICOM_GFX = 0x03
CFG10 = 0x10
ROM_ACCESS_EN = 0x07
ROM_PACK_EN = 0x06
MUST_BE_ZERO = 0x05
_BUZZER_ON = 0x04
CMT_MOTOR_START = 0x03
CMT_RS232_SELECT = 0x02
_DISPLAY_INHIBIT = 0x01
_CRT80 = 0x00
MASK_WIDTH_40_80 = 0x18
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_LEFT = 0x49
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
KBD_MOD_SHIFT = 0x00
KBD_MOD_CTRL = 0x02
STATUS30 = 0x30
CEN_DATA = 0x30
_SIOC = 0x00
_CRT_VSYNC_PERIOD = 0x01
_CEN_ACKNOWLEDGE = 0x02
_CEN_BUSY = 0x03
UART_CONTROL = 0x41
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
ID_IS_BOOT = 0x16
SCREEN_HEIGHT = 0x18
VK_ENTER = 0x0d
VK_NL = 0x0a
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
boot_sector = 0xc200
cold_start = 0x0000
id_basic = 0x0008
rst_38 = 0x0038
basic_start = 0x003b
BWS = 0xf000
stack_at_boot = 0xf000
OFFSET_COLOR = 0x0800
ROM_PACK_16K = 0xa000
ROM_PACK_8K = 0xc000
MAX_ADDRESS = 0xffff
BICOM_HEIGHT = 0x0108
DELAY_7MS = 0x03e8
DELAY_11MS = 0x05dc
DELAY_22MS = 0x0bb8
sprintf_buffer_size = 0x0010
str_monitor_size = 0x0018
str_ready_size = 0x000a
str_error_size = 0x000a
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
version_size = 0x0010
crt_table_ntsc_size = 0x0024
kbc_cpm_control_keys_size = 0x0018
kbc_cpm_control_keys_shift_size = 0x0018
cpm_special_character_mods_size = 0x0008
bicom_glp1_prt_gfx_size = 0x0010
bicom_glp2_prt_2nd_line_size = 0x0010
bicom_glp3_prt_crlf_size = 0x0010
bicom_glp4_prt_ld_size = 0x0010
bicom_glp5_prt_ld_size = 0x0010
;
;
;
boot_strap:
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 #ID_JMP
jp z,ROM_PACK_16K
ld a,(ROM_PACK_8K)
cp #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)
rra
jr nc,_mf
call display_inhibit
call rom_enable
jp fdc_read_boot_sector
_mf:
call prepare_basic
jp z,basic_start
call rom_disable
jr go_monitor
ram_boot:
call monitor_inhibit
call rom_disable
ld a,(boot_sector)
cp #ID_IS_BOOT
call z,patch_os_functions
jp boot_sector
rom_disable:
ld hl,#cfg10_settings
set 7,(hl) ;ROM_ACCESS_EN=1
ld a,(hl)
out (CFG10),a
ret
; unchecked data source
.db 0x00,0x00 ;..
go_monitor:
ld (save_stack),sp
ld sp,#stack_at_boot
call restore_os_functions
ld hl,#str_monitor
call puts
monitor_cmd_loop:
ld hl,#monitor_cmd_loop
push hl
call print_new_line
ld c,#'*'
call put_char
call get_char_echoed
and #MASK_CAPITALIZE
cp #'E'
jp z,return_to_basic
cp #'P'
jp z,enable_protocol_printer
cp #'M'
jr z,monitor_cmd_mem_move
cp #'D'
jp z,monitor_cmd_display
cp #'G'
jp z,monitor_cmd_go
cp #'R'
jp z,monitor_cmd_reg
cp #'C'
ret nz
call get_hex_number_sp
cp #VK_ENTER
ret nz
ld hl,(param_word)
byte_change:
call print_nl_hx16
_m11:
push hl
call out_sphx8_minus
call input_hex_byte
pop hl
jr c,_err3
ld (hl),a
_m10:
inc hl
ld a,l
and #0x07
jr nz,_m11
jr byte_change
_err3:
cp #' '
jr nz,test_decrement_key
call print_space
jr _m10
test_decrement_key:
cp #'-'
ret nz
dec hl
jr byte_change
monitor_cmd_mem_move:
call get_hex_number_sp
cp #','
ret nz
ld hl,(param_word)
ld (param_1),hl
call get_hex_number
cp #','
ret nz
ld hl,(param_1)
ex de,hl
ld hl,(param_word)
ld (param_2),hl
or a
sbc hl,de
ret c
inc hl
ld (param_3),hl
call get_hex_number
cp #VK_ENTER
ret nz
ld hl,(param_3)
dec hl
ex de,hl
ld hl,(param_word)
or a
adc hl,de
jr c,_err_area_overlap
push hl
ld hl,(param_1)
ex de,hl
ld hl,(param_word)
or a
sbc hl,de
ld bc,(param_3)
jr c,_continue_ldir
pop de
ld a,h
or l
jr z,ready_msg_after_ldir
ld hl,(param_2)
lddr
ready_msg_after_ldir:
ld hl,#str_ready
puts:
ld a,(hl)
or a
ret z
ld c,a
call put_char
inc hl
jr puts
_continue_ldir:
ld hl,(param_word)
ex de,hl
ldir
pop de
jr ready_msg_after_ldir
_err_area_overlap:
ld hl,#str_error
call puts
ret
monitor_cmd_display:
call get_hex_number_sp
cp #','
ret nz
ld hl,(param_word)
ld (param_1),hl
call get_hex_number
cp #VK_ENTER
ret nz
ld hl,(param_1)
ex de,hl
ld hl,(param_word)
or a
sbc hl,de
ret c
inc hl
push hl
ex de,hl
pop bc
_display_line:
push bc
push hl
call print_nl_hx16
call _sprintf_clean
pop hl
pop bc
ld de,#sprintf_buffer
_display_byte:
call outsphx8
ld a,(hl)
ld (de),a
dec bc
ld a,b
or c
inc hl
inc de
jp z,display_ascii_dump
ld a,(column_count)
xor #0x0f
and #0x0f
push bc
ld b,a
ld a,l
and b
pop bc
jr nz,_display_byte
call display_ascii_dump
jr _display_line
monitor_cmd_go:
call get_hex_number_sp
cp #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 brk_handler
brk_handler:
ld (reg_hl),hl
pop hl
ld (ret_pc),hl
push af
pop hl
ld (reg_af),hl
ld (reg_bc),bc
ld (reg_de),de
ld a,i
ld (reg_i),a
ld (reg_ix),ix
ld (reg_iy),iy
ld hl,#str_break_at
call puts
ld hl,(ret_pc)
call outhx16
ld sp,#stack_at_boot
jp monitor_cmd_loop
monitor_cmd_reg:
ld hl,#str_reg
call puts
ld hl,(ret_pc)
call outhx16
ld hl,#reg_bc
ld c,#4
_print_reg8:
push bc
inc hl
push hl
call outsphx8
pop hl
dec hl
push hl
call outsphx8
pop hl
inc hl
inc hl
pop bc
dec c
jr nz,_print_reg8
call outsphx8
call print_space
ld hl,(reg_ix)
call outhx16
call print_space
ld hl,(reg_iy)
jr _m12
print_nl_hx16:
call print_new_line
_m12:
call outhx16
ret
enable_protocol_printer:
ld a,(printer_protocol_flag)
or a
jr z,_print_on
ld a,#OFF
ld hl,#str_print_off
_m13:
ld (printer_protocol_flag),a
call puts
ret
_print_on:
ld a,#ON
ld hl,#str_print_on
jr _m13
return_to_basic:
call prepare_basic
jr nz,just_go_back
ld a,#0x0c
rst 0x18
just_go_back:
ld sp,(save_stack)
ret
prepare_basic:
ld a,(id_basic)
cp #ID_IS_BASIC
ret nz
call patch_os_functions
ret
display_ascii_dump:
push hl
push bc
ld a,(column_count)
and #MASK_WIDTH_40_80
ld c,a
ld b,#0
ld hl,#sprintf_buffer
or a
adc hl,bc
or a
sbc hl,de
ld a,l
or a
jr z,_m16
_m17:
push hl
call print_space
call print_space
call print_space
pop hl
dec l
jr nz,_m17
_m16:
call print_space
call print_space
ld a,(column_count)
and #MASK_WIDTH_40_80
ld b,a
ld hl,#sprintf_buffer
_m15:
push hl
push bc
ld a,(hl)
cp #' '
jr c,non_char_printable
cp #VK_DEL
jr c,_printable_char
non_char_printable:
ld a,#'.'
_printable_char:
ld c,a
call put_char
pop bc
pop hl
inc hl
dec b
jr nz,_m15
pop bc
pop hl
ret
_sprintf_clean:
ld hl,#sprintf_buffer
ld b,#sprintf_buffer_size
_m14:
ld (hl),#0
inc hl
dec b
jr nz,_m14
ret
unreferenced_02:
call get_char_echoed
cp #','
ret
str_monitor:
.db 0x0c,0x4d,0x6f,0x6e,0x69,0x74,0x6f,0x72 ;.Monitor
.db 0x20,0x56,0x65,0x72,0x73,0x2e,0x20,0x31 ; Vers. 1
.db 0x2e,0x32,0x20,0x47,0x0d,0x0a,0x0a,0x00 ;.2 G....
str_ready:
.db 0x0d,0x0a,0x52,0x65,0x61,0x64,0x79,0x0d ;..Ready.
.db 0x0a,0x00 ;..
str_error:
.db 0x0d,0x0a,0x45,0x72,0x72,0x6f,0x72,0x0d ;..Error.
.db 0x0a,0x00 ;..
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...
outsphx8:
call print_space
ld a,(hl)
jr outhx8
outhx16:
ld a,h
call outhx8
ld a,l
outhx8:
push bc
push af
rrca
rrca
rrca
rrca
call outhx4
pop af
call outhx4
pop bc
ret
out_sphx8_minus:
call outsphx8
ld c,#'-'
jr _m18
outhx4:
and #0x0f
cp #10
jr nc,_correct_hex_digit
add a,#'0'
_me:
ld c,a
_m18:
call put_char
ret
_correct_hex_digit:
add a,#'A'-10
jr _me
print_new_line:
push bc
ld c,#VK_ENTER
call put_char
ld c,#VK_NL
jr _print_next_char
print_space:
push bc
ld c,#' '
_print_next_char:
call put_char
pop bc
ret
put_char:
call put_char_crt
ld a,(printer_protocol_flag)
or a
call nz,dev_printer_write_byte
ret
input_hex_byte:
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 kbd_inch
push af
ld c,a
call put_char
pop af
ret
get_hex_digit:
call get_char_echoed
cp #'0'
jr c,_m1a
cp #'9'+1
jr c,_m19
and #MASK_CAPITALIZE
cp #'A'
jr c,_m1a
cp #'F'+1
jr nc,_m1a
sub #'A'-10
_m1b:
and a
ret
_m19:
sub #'0'
jr _m1b
_m1a:
scf
ret
get_hex_number_sp:
call print_space
get_hex_number:
push hl
ld hl,#param_word+1
xor a
ld (hl),a
dec hl
ld (hl),a
_m1c:
call get_hex_digit
jr c,_m1d
rld
inc hl
rld
dec hl
jr _m1c
_m1d:
pop hl
ret
patch_os_functions:
ld a,#ON
ld (os_patch),a
ld a,(os_patch)
or a
ret z
ld hl,#patch_table_1
_md:
call rom_enable
call patch_rom_code
jp monitor_inhibit
restore_os_functions:
ld hl,#patch_table_2
jr _md
; unchecked data source
.db 0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;k.......
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.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_matrix_read
dev_kbd_inch:
jp kbd_inch
jp put_char_crt
jp kbd_matrix_read
jp kbd_inch
jp put_char_crt
jp kbd_matrix_read
jp kbd_inch
jp put_char_crt
jp kbd_inch
jp com_read_byte
jp com_read_byte
jp put_char_crt
dev_serial_tx_ready:
jp com_tx_ready
dev_serial_write_byte:
jp com_write_byte
dev_printer_write_byte:
jp lpt_write_byte
jp lpt_write_byte
api_call_23:
ld a,#-1
ret
api_call_24:
nop
xor a
ret
dev_printer_busy:
jp lpt_busy
api_call_26:
nop
xor a
ret
api_call_27:
jp kbd_buffer_clear_beep
api_call_28:
jp kbd_buffer_clear
api_call_29:
jp delay
api_call_30:
jp buzzer_off
api_call_31:
jp buzzer_on
api_call_32:
jp brk_handler
api_call_33:
jp kbd_adjust_keyboard_table
terminal_row1:
.db 0x18 ;.
terminal_row2:
.db 0x18 ;.
column_count:
.db 0x50 ;P
row_start:
.db 0x00 ;.
terminal_row3:
.db 0x18 ;.
terminal_row4:
.db 0x18 ;.
buffer_put_char:
.db 0x30 ;0
attrib_color:
.db 0x07 ;.
cfg10_settings:
.db 0x00 ;.
cfg20_settings:
.db 0x00 ;.
screen_driver_settings:
.db 0x05 ;.
; unchecked data source
.db 0x00,0xca ;.J
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 ;....
kbd_command_mode:
.db 0x00 ;.
kbd_modifiers:
.db 0x00 ;.
input_mode:
.db 0x00 ;.
; unchecked data source
.db 0x00 ;.
kbd_position:
.db 0x00 ;.
kbd_ascii:
.db 0x00 ;.
cursor_abs:
.db 0x00,0x00 ;..
cursor_abs_color:
.db 0x00,0x00 ;..
column_offset_tmp:
.db 0x00,0x00 ;..
cursor_tmp:
.db 0x00 ;.
; unchecked data source
.db 0x00 ;.
key_code:
.db 0x00 ;.
attrib_tmp:
.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 ;..
; unchecked data source
.db 0x00,0x00 ;..
sprintf_buffer:
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ;........
printer_protocol_flag:
.db 0x00 ;.
ret_pc:
.db 0x00,0x00 ;..
reg_bc:
.db 0x00,0x00 ;..
reg_de:
.db 0x00,0x00 ;..
reg_hl:
.db 0x00,0x00 ;..
reg_af:
.db 0x00,0x00 ;..
reg_i:
.db 0x00 ;.
reg_ix:
.db 0x00,0x00 ;..
reg_iy:
.db 0x00,0x00 ;..
save_stack:
.db 0x00,0x00 ;..
; unchecked data source
.db 0x00,0x00,0x00 ;...
cursor_flag:
.db 0x00 ;.
cursor_row_column_rel:
.db 0x00 ;.
; unchecked data source
.db 0x00 ;.
char_tmp:
.db 0x00 ;.
; unchecked data source
.db 0x00 ;.
os_patch:
.db 0x00 ;.
; unchecked data source
.db 0x00 ;.
beep_delay:
.db 0x00,0x80 ;..
crt_wait_vsync:
jp wait_vsync
crt_is_vsync:
jp is_vsync
crt_wait_flicker_free_save_A:
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 switch_crt_mode
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_matrix_read:
push hl
push de
push bc
ld a,(kbd_command_mode)
cp #0x80
jr z,_err4
cp #0x88
jr z,_err4
ld hl,#kbd_matrix_buffer2
call kbd_fetch_from_io
ld hl,#kbd_matrix_buffer2
ld b,#kbd_matrix_buffer_size
_m1e:
ld a,(hl)
or a
jr nz,kbd_pressed2
dec b
jp z,kbd_not_pressed
inc hl
jr _m1e
kbd_pressed2:
call m_e5e7
ld a,(kbd_command_mode)
cp #0x80
ld a,#0x00
jr nz,m_e5e3
_err4:
ld a,#-1
m_e5e3:
pop bc
pop de
pop hl
ret
m_e5e7:
push hl
push de
push bc
ld hl,#DELAY_7MS
call delay
ld hl,#kbd_matrix_buffer
call kbd_fetch_from_io
ld hl,#kbd_matrix_buffer
ld de,#kbd_matrix_buffer2
ld b,#kbd_matrix_buffer_size
cmp_kbd_entry:
ld a,(de)
cp (hl)
jr nz,scans_different
dec b
jr z,scan_is_stable
inc hl
inc de
jr cmp_kbd_entry
scan_is_stable:
call m_e682
ld a,(kbd_command_mode)
cp #0x80
jr nz,clear_kbd_modifiers
call m_e72c
ld a,(led_status)
bit 7,a
jr nz,kbd_no_key
ld a,(kbd_ascii)
cp #0xff
jr z,kbd_no_key
or a
jr z,kbd_no_key
call modify_if_graphic_B
ld a,(key_code)
cp b
jr nz,set_kbd_debounce_cnt
ld a,(kbd_debounce_cnt)
or a
jr nz,decrement_kbd_debounce_cnt