-
Notifications
You must be signed in to change notification settings - Fork 0
/
vt100.asm
4942 lines (4559 loc) · 142 KB
/
vt100.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
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
; z80dasm 1.1.6
; command line: z80dasm -t -a -g 0xa000 -o x.asm VT100.no_header
;
; -------------------------------------------------------------------
; application memory map
; -------------------------------------------------------------------
; App has these sections:
;
; Ordered by seek value:
; org seek
; ------------------
; 0xa000 0x0
; a102 0x102 word, filesize/256, minimum is 1
; a147 0x147 entry point ("jp __init")
; a180 0x180 number in dll fixup list
; a190 0x190 fixup list
; a410 0x410 _load_dll_stub, _dll_tmp, _dll_stub, la246h, __init + the app code?
; 0xd400 0x3400 code_p_d400 ?
; 0xdbe0 0x3be0 code_p_dbe0 small area for variables, size 0x20
; 0xc000 0x2000 _splash_screen_data splash screen and menu data
; 0x2a00 APP_TARGET_AREA
; 0xe800 0x4800 code_p_endfill contains fill bytes up to next multiple of 256
; Ordered by Org value:
; org seek
; ------------------
; 0xa000 0x0
; a102 0x102 word, filesize/256, minimum is 1
; a147 0x147 entry point ("jp __init")
; a180 0x180 number in dll fixup list
; a190 0x190 fixup list
; a410 0x410 _load_dll_stub, _dll_tmp, _dll_stub, la246h, __init + the app code?
; 0xb264 end of 0xa... area
; b265 0xbfff filled with 0 bytes,
; 0xc000 0x2000 _splash_screen_data splash screen and menu data
; 0xcb6c end of 0xc... area
; cb6d 0xd400 filled with zero bytes
; 0xd400 0x3400 code_p_d400 ?
; 0xd896 end of code_p_d400 area
; d897 0xdbdf filled with zero bytes
; 0xdbe0 0x3be0 code_p_dbe0 small area for variables, size 0x20
; 0xdc00 a var here?
; 0xde00 a var here?
; 0xe800 0x4800 code_p_endfill contains fill bytes up to next multiple of 256
; Copy target areas:
; 0x2a00 APP_TARGET_AREA
; -------------------------------------------------------------------
; system memory map (work in progress)
; -------------------------------------------------------------------
; 0x0 - 0x1000 ?
; 0x1000 - 0x3f00 Application RAM
; 0x3f01 - ?
; 0x8000 - ? 10046 ROM
; 0xda20 - ? Application RAM
; 0xdbe0 - 0xdbff Application RAM
; 0xdc00 - 0xffff ?
;
; There are overlapping spaces for RAM/ROM. using out (020h),<page-id> or bank-id,
; it can be selected what memory appears for some address.
; I need to study the HP4952 doc more on that.
;
; Collected details:
; 0x1000 seems RAM
; ld (010b5h),a ;a4d8 32 b5 10 2 . . ; value copied to various locations, address range 0x1xxx, must also be RAM
; ld (0112dh),a ;a4db 32 2d 11 2 - .
; ld (01067h),a ;a4de 32 67 10 2 g .
; ld (01133h),a ;a4e1 32 33 11 2 3 .
; ld (0110ch),a ;a50b 32 0c 11 2 . . ; (0110ch):=a
;
; 0x2a00 seems safe RAM, also 2d00: Application RAM
;
; 0x3f00 seems safe RAM
; ld hl,0dbe0h ;a533 21 e0 db ! . .
; ld de,03f00h ;a536 11 00 3f . . ?
;
; 0x8000 seems to be ROM "10046 ROM"
; ld hl,08000h ;a450 21 00 80 ! . . ; Copy system ordinals from 10046 ROM
;
; Switching pages:
; ld a,004h ;a44c 3e 04 > . ; Access Page 4 - 10046 ROM Lower Page
; out (020h),a ;a44e d3 20 . ;
;
; 0xda20 contains readable data
; ld hl,0da20h
;
; 0xdbe0 seems to have 0x20 bytes of interest,
; -------------------------------------------------------------------
; out/in found
; -------------------------------------------------------------------
; out(000h) 9x - 0x70, 0x78, 0x90, 0xd3, 0xd4
; out(001h) 1x - 0x0
; out(002h) 7x - 0x0, 0x80
; out(020h) 17x - sets "page" to value in a; 4=10046 ROM lower page, 2 ="Application ROM"
; more values: 1, 3, 9, 0x10, 0x30, 0x33, 0x42
; out(021h) 21x - 0, 1, 3, 5, 8, 9, 0x10, 0xc0, 0x10, 0x30, 0x33, 0x82
; out(023h) 1x
; out(040h) 2x - 0x0, 0xd2
; out(080h) 3x - 0x0
; out(090h) 2x
;
; in(001h) 1x
; in(020h) 2x
; in(021h) 1x
; in(022h) 1x
; in(023h) 1x
; in(02ah) 1x
; in(0cbh) 1x
; not found in this code:
; lib/keyb.asm: out (0d0h) set row bits; related to keyboard input control
; -------------------------------------------------------------------
; target address where app code is being copied during startup by HP4952 app loading
app_target_area: equ 02a00h
; HP4952a firmware/OS functions
os_loadpage: equ 00e60h ; loads a page; ROM function
os_rtn_to_main_menu: equ 014d5h ; jumps back to HP4953 main menu, ends app
;------------------------------------------------------------------
; a000 area
;------------------------------------------------------------------
org 0a000h
seek 00000h
_file_start:
defb "4952 Protocol Analyzer"
org 0a016h
seek 00016h
defw 003c4h
defw 00800h
org 0a01ah
seek 0001ah
defb "VT100 ASYNC TERMINAL EMULATOR ", 000h
_filesize:
org 0a102h
seek 00102h
;defb "X"
;defb 000h
defw ((_file_end - _file_start) / 256)-1 ; Blocks in file - 1
defb " TERMINAL 4952 "
defw 00800h
_fileflags:
;defb 000h, 001h
defw 00100h ; Flags 0200h is copy protect
defb "Async Terminal Emulator - DUMB ", 000h
;; Entry Point
org 0a147h
seek 00147h
;; see lib/strap.asm
_entryaddr:
;jp 0a497h ;a147 c3 97 a4 . . .
jp __init
;; Some applications define main application entry point here
;; See lib/strap.asm
;; Main Application
org 0a150h
seek 0050h
;; Obviously, vt100.app does not define any value here.
defw 00000h
org 0a17dh
seek 0017dh
;; for next 3 bytes, meaning is unknown
; ld (bc),a ;a17d 02 .
; cp d ;a17e ba .
; rst 30h ;a17f f7 .
;; sequence is 02,ba,f7
defb 002h, 0bah, 0f7h
org 0a180h
seek 00180h
num_fixups:
;; Dynamic link loader data pointer & size (text from lib/splash.asm)
;; I see only "number of patches" entry in the code
;defb 061h
defw (__dll_fixups_end - __dll_fixups) / 6 ; Number of patches
org 0a190h
seek 00190h
__dll_fixups:
; Example of conversion step per 6 bytes
;defw 02d02h, 00000h, 0c136h
;ld (bc),a ;a190 02 .
;dec l ;a191 2d -
;nop ;a192 00 .
;nop ;a193 00 .
;ld (hl),0c1h ;a194 36 c1 6 .
; dll-fixup table offset 0x190 - converted with small go routine
; Table meaning: Each entry describes a replacement of an address.
; <new target address>, <?>, <location, in this file, of address word to patch>
;
; Example 1:
; This entry:
; defw 02d32h, 00000h, 0a49ch ; entry 50, offset 700
; refers to word at address 0a49ch. The related assembler line is:
; call 01543h ;a49b cd 43 15 . C .
; So, at a49c, we have bytes "43 15", which is word 01543h.
; This value is now replaced by 02d32h .
;
; Example 2:
; defw 02e6eh, 00000h, 0a49fh ; entry 51, offset 706
; refers to word at address 0a49fh. The related assembler line is:
; call 00fe9h ;a49e cd e9 0f
; So, at a49f we have bytes "e9 0f", which is word 00fe9h.
; This value is now replaced by 02e6eh
defw 02d02h, 00000h, 0c136h ; entry 0, offset 400
defw 02d02h, 00000h, 0c170h ; entry 1, offset 406
defw 02d02h, 00000h, 0c196h ; entry 2, offset 412
defw 02d50h, 00000h, 0c19dh ; entry 3, offset 418
defw 02d02h, 00000h, 0c307h ; entry 4, offset 424
defw 02d02h, 00000h, 0c30dh ; entry 5, offset 430
defw 02e54h, 00000h, 0c314h ; entry 6, offset 436
defw 02d02h, 00000h, 0c31ah ; entry 7, offset 442
defw 02d02h, 00000h, 0c339h ; entry 8, offset 448
defw 02d02h, 00000h, 0c347h ; entry 9, offset 454
defw 02d02h, 00000h, 0c350h ; entry 10, offset 460
defw 02d02h, 00000h, 0c35eh ; entry 11, offset 466
defw 02e3ch, 00000h, 0c41bh ; entry 12, offset 472
defw 02e3ch, 00000h, 0c41dh ; entry 13, offset 478
defw 02e3ch, 00000h, 0c41fh ; entry 14, offset 484
defw 02e3ch, 00000h, 0c421h ; entry 15, offset 490
defw 02e3ch, 00000h, 0c423h ; entry 16, offset 496
defw 02e3ch, 00000h, 0c425h ; entry 17, offset 502
defw 02e3ch, 00000h, 0c427h ; entry 18, offset 508
defw 02e3ch, 00000h, 0c429h ; entry 19, offset 514
defw 02e3ch, 00000h, 0c42bh ; entry 20, offset 520
defw 02e42h, 00000h, 0c42dh ; entry 21, offset 526
defw 02e42h, 00000h, 0c42fh ; entry 22, offset 532
defw 02e42h, 00000h, 0c431h ; entry 23, offset 538
defw 02e42h, 00000h, 0c433h ; entry 24, offset 544
defw 02e42h, 00000h, 0c435h ; entry 25, offset 550
defw 02e42h, 00000h, 0c437h ; entry 26, offset 556
defw 02e42h, 00000h, 0c439h ; entry 27, offset 562
defw 02e42h, 00000h, 0c43bh ; entry 28, offset 568
defw 02e42h, 00000h, 0c43dh ; entry 29, offset 574
defw 02d02h, 00000h, 0c8d7h ; entry 30, offset 580
defw 02e3ah, 00000h, 0c8f4h ; entry 31, offset 586
defw 02d02h, 00000h, 0c932h ; entry 32, offset 592
defw 02d02h, 00000h, 0c93bh ; entry 33, offset 598
defw 02d38h, 00000h, 0c93eh ; entry 34, offset 604
defw 02d02h, 00000h, 0c948h ; entry 35, offset 610
defw 02d50h, 00000h, 0c954h ; entry 36, offset 616
defw 02e60h, 00000h, 0c9fdh ; entry 37, offset 622
defw 02e60h, 00000h, 0ca09h ; entry 38, offset 628
defw 02e60h, 00000h, 0ca15h ; entry 39, offset 634
defw 02e60h, 00000h, 0ca21h ; entry 40, offset 640
defw 02e60h, 00000h, 0ca2dh ; entry 41, offset 646
defw 02e60h, 00000h, 0ca39h ; entry 42, offset 652
defw 02e60h, 00000h, 0ca45h ; entry 43, offset 658
defw 02e60h, 00000h, 0ca51h ; entry 44, offset 664
defw 02e60h, 00000h, 0ca5dh ; entry 45, offset 670
defw 02df8h, 00000h, 0caf7h ; entry 46, offset 676
defw 02deah, 00000h, 0cafah ; entry 47, offset 682
defw 02e02h, 00000h, 0cb1dh ; entry 48, offset 688
defw 02dd0h, 00000h, 0cb20h ; entry 49, offset 694
defw 02d32h, 00000h, 0a49ch ; entry 50, offset 700
defw 02e6eh, 00000h, 0a49fh ; entry 51, offset 706
defw 02e66h, 00003h, 0a4a2h ; entry 52, offset 712
defw 02e66h, 00003h, 0a4ach ; entry 53, offset 718
defw 02e66h, 00004h, 0a4b2h ; entry 54, offset 724
defw 02e32h, 00000h, 0a4c9h ; entry 55, offset 730
defw 02eb2h, 00000h, 0a4d9h ; entry 56, offset 736
defw 02edah, 00000h, 0a4dch ; entry 57, offset 742
defw 02e98h, 00000h, 0a4dfh ; entry 58, offset 748
defw 02edch, 00000h, 0a4e2h ; entry 59, offset 754
defw 02d6ch, 00000h, 0a506h ; entry 60, offset 760
defw 02eceh, 00003h, 0a50ch ; entry 61, offset 766
defw 02e54h, 00000h, 0a50fh ; entry 62, offset 772
defw 02eceh, 00004h, 0a512h ; entry 63, offset 778
defw 02eceh, 00000h, 0a519h ; entry 64, offset 784
defw 02eb2h, 00000h, 0a621h ; entry 65, offset 790
defw 02edah, 00000h, 0a624h ; entry 66, offset 796
defw 02e98h, 00000h, 0a627h ; entry 67, offset 802
defw 02edch, 00000h, 0a62ah ; entry 68, offset 808
defw 02e92h, 00003h, 0a62dh ; entry 69, offset 814
defw 02e92h, 00004h, 0a633h ; entry 70, offset 820
defw 02e92h, 00003h, 0a63bh ; entry 71, offset 826
defw 02e92h, 00004h, 0a641h ; entry 72, offset 832
defw 02e2ch, 00000h, 0a644h ; entry 73, offset 838
defw 02e92h, 00003h, 0a64ch ; entry 74, offset 844
defw 02e92h, 00004h, 0a652h ; entry 75, offset 850
defw 02e1ch, 00000h, 0a655h ; entry 76, offset 856
defw 02e1ch, 00001h, 0a65bh ; entry 77, offset 862
defw 02e1ch, 00000h, 0a664h ; entry 78, offset 868
defw 02ecch, 00000h, 0a667h ; entry 79, offset 874
defw 02e1ch, 00001h, 0a66ah ; entry 80, offset 880
defw 02ecch, 00003h, 0a66fh ; entry 81, offset 886
defw 02ecch, 00004h, 0a675h ; entry 82, offset 892
defw 02e92h, 00000h, 0a67ah ; entry 83, offset 898
defw 02e1ch, 00000h, 0a684h ; entry 84, offset 904
defw 02e1ch, 00001h, 0a68ah ; entry 85, offset 910
defw 02e1ch, 00000h, 0a68dh ; entry 86, offset 916
defw 02ecch, 00003h, 0a693h ; entry 87, offset 922
defw 02e1ch, 00000h, 0a696h ; entry 88, offset 928
defw 02ecch, 00004h, 0a699h ; entry 89, offset 934
defw 02ecch, 00000h, 0a6d0h ; entry 90, offset 940
defw 02d9ch, 00000h, 0a6d5h ; entry 91, offset 946
defw 02d06h, 00000h, 0a6d8h ; entry 92, offset 952
defw 02edah, 00000h, 0a887h ; entry 93, offset 958
defw 02e98h, 00000h, 0a8a5h ; entry 94, offset 964
defw 02e1ch, 00000h, 0a8a8h ; entry 95, offset 970
defw 02e1ch, 00000h, 0a8c9h ; entry 96, offset 976
; dllfixup table has 97 (0x61) entries.
__dll_fixups_end:
org 0a410h
seek 00410h
;; This is a dynamic linker, at runtime it loads a copy of the
;; ROM vector table into RAM and fixes up all the stubbed
;; ROM references in the executable
;; Load and execute ordinal patching stub from a safe location
_load_dll_stub:
ld hl,_dll_stub ;a410 21 4c a4 ! L . ; copy 0x36 bytes from a44c to 2a00
ld de,app_target_area ;a413 11 00 2a . . * : this is _dll_stub function code block
;ld bc,00036h ;a416 01 36 00 . 6 .
ld bc,_dll_stub_end-_dll_stub ;a416 01 36 00 . 6 .
ldir ;a419 ed b0 . .
call app_target_area ;a41b cd 00 2a . . * ; jump to copied code, i.e. _dll_stub
;call 02a00h ;a41b cd 00 2a . . *
;; 0a190h -> __dll_fixups
;; 0a180h -> num_fixups
ld ix,__dll_fixups ;a41e dd 21 90 a1 . ! . .
ld bc,(num_fixups) ;a422 ed 4b 80 a1 . K . .
la426h:
ld l,(ix+000h) ;
ld h,(ix+001h) ;
ld e,(hl) ; Read L Byte
inc hl ;
ld d,(hl) ; Read H Byte
ld l,(ix+002h) ; Get Patch Value
ld h,(ix+003h) ;
add hl,de ; Patch the pointer
ex de,hl ;
ld l,(ix+004h) ; Dest Address
ld h,(ix+005h) ;
ld (hl),e ; Write L Byte
inc hl ;
ld (hl),d ; Write H Byte
ld de,00006h ;
add ix,de ; Next Entry
dec bc ;
ld a,b ;
or c ;
jr nz,la426h ; More entries?
ret ;
;; Local temp index variable
;; seems to be read-only.
_dll_tmp:
;nop ;a44b 00 .
defb 000h
;; see line 138ff
; a44c -> _dll_stub
_dll_stub:
ld a,004h ;a44c 3e 04 > . ; Access Page 4 - 10046 ROM Lower Page
out (020h),a ;a44e d3 20 . ;
ld hl,08000h ;a450 21 00 80 ! . . ; Copy system ordinals from 10046 ROM
ld de,02d00h ;a453 11 00 2d . . - ; copy 0x134 bytes from 08000 to 02d00
ld bc,00134h ;a456 01 34 01 . 4 .
ldir ;a459 ed b0 . .
ld a,002h ;a45b 3e 02 > . ; Load Page 2 - Application "ROM"
out (020h),a ;a45d d3 20 .
ld hl,(02d0ch) ;a45f 2a 0c 2d * . - ; Generate 17 more for 02e34h = 0d9f0h...0da20h
ld bc,00003h ;a462 01 03 00 . . . ; stepping 3 bytes
ld a,011h ;a465 3e 11 > . ; amount to copy .. Source appears to be a jump table
;; 0a482h --> la246h
call la246h ;a467 cd 82 a4 . . .
ld hl,(02e16h) ;a46a 2a 16 2e * . . ; Generate 0x44/68 more for 02e56h =
ld a,(hl) ;a46d 7e ~
inc hl ;a46e 23 #
ld h,(hl) ;a46f 66 f
ld l,a ;a470 6f o
ld bc,00006h ;a471 01 06 00 . . . ; stepping 6 bytes
ld a,044h ;a474 3e 44 > ; amount to copy
;; 0a482h --> la246h
call la246h ;a476 cd 82 a4 . . .
ld bc,00002h ;a479 01 02 00 . . . ; stepping 3, Generate 30 more for 02edeh = 0eb98h..
;; STRANGE, LIB/STRAP.ASM HAS 01EH AS VALUE FOR NEXT LINE
ld a,01dh ;a47c 3e 1d > . ; amount to copy
;; 0a482h --> la246h
call la246h ;a47e cd 82 a4 . . .
ret ;a481 c9 .
_dll_stub_end:
; copies words from HL to loc.starting.at.DE, A iterations
; HL steps BC, DE steps 2
; uses _dll_tmp variable for loop counter,counted down to 0
la246h:
ld ix,_dll_tmp ;
ld (ix+000h),a ;
loop_la246h:
ld a,l ; do {
ld (de),a ; *DE = L
inc de ; DE++
ld a,h ;
ld (de),a ; *DE = H
inc de ; DE++
add hl,bc ; HL+=BC
dec (ix+000h) ; } while(TMP-- != 0)
jr nz,$-10 ; -> loop_la246h
ret ;
_tmp_page:
; This looks like a variable for the current page, initialized with 2
;ld (bc),a ;a496 02 .
; a496 -> _tmp_page
defb 002h
;; main entry point...
; vars:
; 0fd4
; 0fd5
__init:
di ;a497 f3 .
call _load_dll_stub ;a498 cd 10 a4 . . . ; 0a410 -> _load_dll_stub
call 01543h ;a49b cd 43 15 . C . ; Patched to 2d32 -> 01543h
call 00fe9h ;a49e cd e9 0f ; Patched to 2e6e -> 00fe9h
ld a,(00fd4h) ;a4a1 3a d4 0f : . . ; a:=(0fd4)
and 07fh ;a4a4 e6 7f . ; clear highest bit
ld (_tmp_page),a ;a4a6 32 96 a4 2 . . ; save result in _tmp_page (a496), (a496):=a
l2065h:
; comment from lib/strap.asm: "Patch 00fd4h -> our menu display function"
ld a,006h ;a4a9 3e 06 > . ; (fd4h):=6
ld (00fd4h),a ;a4ab 32 d4 0f 2 . . ;
;; POI-010 a4cd seems to be some data or table section see POI-011
ld hl,var_word_a4cd ;a4ae 21 cd a4 ! . . ; h1:=a4cdh
ld (00fd5h),hl ;a4b1 22 d5 0f " . . ; (fd5):=hl
call fun_a9c7 ;a4b4 cd c7 a9 . . . ;
; copy 0x1400 bytes starting _splash_screen_data to 0x2a00
ld hl,_splash_screen_data ;a4b7 21 00 c0 ! . . ; this will overwrite just copied _dll_stub code, which is no longer needed
ld de,app_target_area ;a4ba 11 00 2a . . *
;ld bc,01400h ;a4bd 01 00 14 . . . ; copy 0x1400 bytes
ld bc,code_p_d400-_splash_screen_data ;a4bd 01 00 14 . . .
ldir ;a4c0 ed b0 . .
; next line: 02b23h points into the block just copied by ldir above. The block was copied
; to start address 02a00h, so 02a00h was named/defined to app_target_area
; This means, a "call 02b23" points to the app_target_area with offset 0123h.
; in this file, we will find the function 02b3 with base "org" offset 0xc000 and
; offset 123h, so at 0c123h
;
; How do we formulate this as a calculation of label values?
; result must be 2b23. Input is app_target_area and the function label to be created at c123.
; result = app_target_area + (f_2b23 - _splash_screen_data)
; or rearranged for improved reading:
; result = f_2b23 + app_target_area-_splash_screen_data
call f_2b23 + app_target_area-_splash_screen_data ;a4c2 cd 23 2b . # +
;call 02b23h ;a4c2 cd 23 2b . # +
;call to app_target_area + 018fh , label l_2b8f
call l_2b8f + app_target_area-_splash_screen_data ;a4c5 cd 8f 2b . . +
;call 02b8fh ;a4c5 cd 8f 2b . . +
; see lib/strap.asm
; return to main menu, means we have set up the menu part. Do nothing until menu item for this app is selected
; then main menu handler will call some entry function of this app. What function is this????
jp os_rtn_to_main_menu ;a4c8 c3 d5 14 . . . ; Patched to 02e32h
;jp 014d5h
;; POI-011, some data, used by POI-10 line
var_word_a4cb:
defb 021h, 076h
var_word_a4cd:
defb 0f3h, 021h ; adress value a4cd used by line a4ae and stored in (fd5)
defb 021h, 076h
;ld hl,0f376h ;a4cb 21 76 f3 ! v .
;ld hl,07621h ;a4ce 21 21 76 ! ! v
defb 022h, 0cbh, 0a4h
;ld (var_word_a4cb),hl ;a4d1 22 cb a4 " . .
;; POI-100 who enters this loop?
loop_a4d4:
di ;a4d4 f3 . ; DI
ld a,(0a530h) ;a4d5 3a 30 a5 : 0 . ; a530 contains a0cdh, at least at initialization
ld (010b5h),a ;a4d8 32 b5 10 2 . . ; value copied to various locations, address range 0x1xxx, must also be RAM
ld (0112dh),a ;a4db 32 2d 11 2 - .
ld (01067h),a ;a4de 32 67 10 2 g .
ld (01133h),a ;a4e1 32 33 11 2 3 .
ld hl,_splash_screen_data ;a4e4 21 00 c0 ! . . ; copies 0x1400 bytes from _splash_screen_data to 2a00h
ld de,app_target_area ;a4e7 11 00 2a . . *
ld bc,code_p_d400-_splash_screen_data ;a4ea 01 00 14 . . .
ldir ;a4ed ed b0 . .
call read_dbe0 ;a4ef cd 33 a5 . 3 . ; a533 -> read_dbe0
ld a,021h ;a4f2 3e 21 > ! ; (07501h):=0x21
ld (07501h),a ;a4f4 32 01 75 2 . u ;
ei ;a4f7 fb . ; EI
ld a,(03f12h) ;a4f8 3a 12 3f : . ? ; a:=(3f12h), this address was populated by read_dbe0()
cp 003h ;a4fb fe 03 . . ; a==0x3 ?
jr z,$+33 ;a4fd 28 1f ( . ; yes, jump to l_a51e
call write_dbe0 ;a4ff cd 3f a5 . ? . ; no, a5ef -> write_dbe0 ; write back values as read, unchanged !?!
call f_2b23 + app_target_area-_splash_screen_data
;call 02b23h ;a502 cd 23 2b . # +
call 0007eh ;a505 cd 7e 00 . ~ . ; Patched to 02d6ch
ld a,(_tmp_page) ;a508 3a 96 a4 : . . ; a:=_tmp_page
ld (0110ch),a ;a50b 32 0c 11 2 . . ; (0110ch):=a
ld hl,0da20h ;a50e 21 20 da ! . ; hl:=da20h
ld (0110dh),hl ;a511 22 0d 11 " . . ; (0110f):=h1
ld hl,(var_word_a4cb) ;a514 2a cb a4 * . . ; h1:= (a4cb)
push hl ;a517 e5 . ; save hl
call 01109h ;a518 cd 09 11 . . . ; ;; call main menu handler , Patched to 02eceh
pop hl ;a51b e1 . ; restore hl
jr la527h ;a51c 18 09 . . ; uncoditioned jr to l_a52d
l_a51e:
call set_3f12_to_2 ;a51e cd ec a8 . . .
call write_dbe0 ;a521 cd 3f a5 . ? .
call f_2cfc + app_target_area-_splash_screen_data
;call 02cfch ;a524 cd fc 2c . . ,
la527h:
ld hl,0761ch ;a527 21 1c 76 ! . v ; (a4cbh):=0x761
ld (var_word_a4cb),hl ;a52a 22 cb a4 " . . ;
l_a52d:
jp loop_a4d4 ;a52d c3 d4 a4 . . . ; Loop Forever
;; 0a530 used by line a4d5, it is a defb
;call 00000h ;a530 cd 00 00 . . .
defb 0cdh
defb 000h, 000h
read_dbe0:
; a533 -> read_dbe0
; copies from dbe0h -> 3f00h, 0x20 bytes
ld hl,code_p_dbe0 ;a533 21 e0 db ! . .
ld de,03f00h ;a536 11 00 3f . . ?
ld bc,end_code_p_dbe0-code_p_dbe0 ;a539 01 20 00 . .
ldir ;a53c ed b0 . .
ret ;a53e c9 .
write_dbe0:
; a53f -> write_dbe0
; copies from 3f00h -> dbe0h, 0x20 bytes
ld hl,03f00h ;a53f 21 00 3f ! . ?
ld de,code_p_dbe0 ;a542 11 e0 db . . .
ld bc,end_code_p_dbe0-code_p_dbe0 ;a545 01 20 00 . .
ldir ;a548 ed b0 . .
ret ;a54a c9 .
; delay, 0x1234 times looped
ld hl,01234h ;a54b 21 34 12 ! 4 . ; hl:=0x1234
loop_delay_a54e:
dec hl ;a54e 2b +
ld a,l ;a54f 7d }
or h ;a550 b4 .
jr nz,loop_delay_a54e ;a551 20 fb .
call read_dbe0 ;a553 cd 33 a5 . 3 .
call sub_a5f9h ;a556 cd f9 a5 . . .
call sub_a6e7h ;a559 cd e7 a6 . . .
call sub_a6e7h ;a55c cd e7 a6 . . .
call sub_a702h ;a55f cd 02 a7 . . .
call sub_a702h ;a562 cd 02 a7 . . .
call sub_a56fh ;a565 cd 6f a5 . o .
call sub_a606h ;a568 cd 06 a6 . . .
call write_dbe0 ;a56b cd 3f a5 . ? .
ret ;a56e c9 .
sub_a56fh:
call sub_af71h ;a56f cd 71 af . q .
jr z,la5b7h ;a572 28 43 ( C
ld a,(03f01h) ;a574 3a 01 3f : . ?
and c ;a577 a1 .
ld c,a ;a578 4f O
jp p,la580h ;a579 f2 80 a5 . . .
res 7,b ;a57c cb b8 . .
res 6,b ;a57e cb b0 . .
la580h:
ld a,c ;a580 79 y
cp 020h ;a581 fe 20 .
jr nc,la59fh ;a583 30 1a 0 .
cp 01bh ;a585 fe 1b . .
jr z,la59fh ;a587 28 16 ( .
cp 00ah ;a589 fe 0a . .
jr z,la59fh ;a58b 28 12 ( .
cp 00dh ;a58d fe 0d . .
jr z,la59fh ;a58f 28 0e ( .
cp 008h ;a591 fe 08 . .
jr z,la59fh ;a593 28 0a ( .
cp 007h ;a595 fe 07 . .
jr z,la59fh ;a597 28 06 ( .
ld a,(03f0eh) ;a599 3a 0e 3f : . ?
or a ;a59c b7 .
jr z,la5a4h ;a59d 28 05 ( .
la59fh:
push bc ;a59f c5 .
call sub_aa21h ;a5a0 cd 21 aa . ! .
pop bc ;a5a3 c1 .
la5a4h:
ld a,005h ;a5a4 3e 05 > .
cp c ;a5a6 b9 .
jr nz,la5b5h ;a5a7 20 0c .
ld a,(03f06h) ;a5a9 3a 06 3f : . ?
cp 001h ;a5ac fe 01 . .
jr nz,la5b5h ;a5ae 20 05 .
ld a,006h ;a5b0 3e 06 > .
call sub_a912h ;a5b2 cd 12 a9 . . .
la5b5h:
jr sub_a56fh ;a5b5 18 b8 . .
la5b7h:
ei ;a5b7 fb .
call sub_a71dh ;a5b8 cd 1d a7 . . .
jr z,la5f6h ;a5bb 28 39 ( 9
jp nc,la5d5h ;a5bd d2 d5 a5 . . .
call sub_a912h ;a5c0 cd 12 a9 . . .
cp 00dh ;a5c3 fe 0d . .
jr nz,la5f6h ;a5c5 20 2f /
ld a,(03f10h) ;a5c7 3a 10 3f : . ?
cp 001h ;a5ca fe 01 . .
jr nz,la5f6h ;a5cc 20 28 (
ld a,00ah ;a5ce 3e 0a > .
call sub_a912h ;a5d0 cd 12 a9 . . .
jr la5f6h ;a5d3 18 21 . !
la5d5h:
cp 0f8h ;a5d5 fe f8 . .
ret z ;a5d7 c8 .
; checks a against 0xfa,fb,ff and calls functions
cp 0fah ;a5d8 fe fa . .
jr nz,la5e1h ;a5da 20 05 .
call sub_a922h ;a5dc cd 22 a9 . " .
jr la5f6h ;a5df 18 15 . .
la5e1h:
cp 0fbh ;a5e1 fe fb . .
jr nz,la5eah ;a5e3 20 05 .
call sub_a702h ;a5e5 cd 02 a7 . . .
jr la5f6h ;a5e8 18 0c . .
la5eah:
cp 0ffh ;a5ea fe ff . .
jr nz,la5f3h ;a5ec 20 05 .
call sub_a6e7h ;a5ee cd e7 a6 . . .
jr la5f6h ;a5f1 18 03 . .
la5f3h:
call sub_a9e0h ;a5f3 cd e0 a9 . . .
la5f6h:
jp sub_a56fh ;a5f6 c3 6f a5 . o .
sub_a5f9h:
call sub_a9d7h ;a5f9 cd d7 a9 . . .
call sub_a6d4h ;a5fc cd d4 a6 . . .
call sub_aee5h ;a5ff cd e5 ae . . .
call sub_a87bh ;a602 cd 7b a8 . { .
ret ;a605 c9 .
sub_a606h:
call sub_a8e3h ;a606 cd e3 a8 . . .
la609h:
ret ;a609 c9 .
la60ah:
;var_byte_a60a:
; next bytes are variables
defb 000h
;nop ;a60a 00 .
la60bh:
;var_byte_aa60b:
defb 000h
;nop ;a60b 00 .
la60ch:
;var_word_aa60c:
defw 000h
;nop ;a60c 00 .
;nop ;a60d 00 .
f_a60e:
; big setup like function
call read_dbe0 ;a60e cd 33 a5 . 3 .
call sub_a87bh ;a611 cd 7b a8 . { .
call sub_a8e3h ;a614 cd e3 a8 . . .
call sub_a92bh ;a617 cd 2b a9 . + .
call write_dbe0 ;a61a cd 3f a5 . ? .
ld a,(la609h) ;a61d 3a 09 a6 : . . ; hm, at 0a609 we have an op code, not a var !?!
ld (010b5h),a ;a620 32 b5 10 2 . .
ld (0112dh),a ;a623 32 2d 11 2 - .
ld (01067h),a ;a626 32 67 10 2 g .
ld (01133h),a ;a629 32 33 11 2 3 .
ld a,(01058h) ;a62c 3a 58 10 : X .
ld (la60ah),a ;a62f 32 0a a6 2 . .
ld hl,(01059h) ;a632 2a 59 10 * Y .
ld (la60ch),hl ;a635 22 0c a6 " . .
ld a,006h ;a638 3e 06 > .
ld (01058h),a ;a63a 32 58 10 2 X .
ld hl,la646h ;a63d 21 46 a6 ! F .
ld (01059h),hl ;a640 22 59 10 " Y .
jp 01381h ;a643 c3 81 13 . . .
la646h:
push af ;a646 f5 .
push hl ;a647 e5 .
ld a,(la60ah) ;a648 3a 0a a6 : . .
ld (01058h),a ;a64b 32 58 10 2 X .
ld hl,(la60ch) ;a64e 2a 0c a6 * . .
ld (01059h),hl ;a651 22 59 10 " Y .
ld a,(016e2h) ;a654 3a e2 16 : . .
ld (la60bh),a ;a657 32 0b a6 2 . .
ld hl,(016e3h) ;a65a 2a e3 16 * . .
ld (la60ch),hl ;a65d 22 0c a6 " . .
ld a,(la679h) ;a660 3a 79 a6 : y .
ld (016e2h),a ;a663 32 e2 16 2 . .
ld hl,01103h ;a666 21 03 11 ! . .
ld (016e3h),hl ;a669 22 e3 16 " . .
ld a,006h ;a66c 3e 06 > .
ld (01106h),a ;a66e 32 06 11 2 . .
ld hl,la67ch ;a671 21 7c a6 ! | .
ld (01107h),hl ;a674 22 07 11 " . .
pop hl ;a677 e1 .
pop af ;a678 f1 .
la679h:
jp 01055h ;a679 c3 55 10 . U .
la67ch:
push ix ;a67c dd e5 . .
push af ;a67e f5 .
push hl ;a67f e5 .
ld a,(la60bh) ;a680 3a 0b a6 : . .
ld (016e2h),a ;a683 32 e2 16 2 . .
ld hl,(la60ch) ;a686 2a 0c a6 * . .
ld (016e3h),hl ;a689 22 e3 16 " . .
call 016e2h ;a68c cd e2 16 . . . ; Patched to e1ch
ld a,(la60ah) ;a68f 3a 0a a6 : . .
ld (01106h),a ;a692 32 06 11 2 . .
ld hl,016e2h ;a695 21 e2 16 ! . .
ld (01107h),hl ;a698 22 07 11 " . .
ld ix,02808h ;a69b dd 21 08 28 . ! . (
ld a,(ix+008h) ;a69f dd 7e 08 . ~ .
ld (ix+002h),a ;a6a2 dd 77 02 . w .
ld (ix+004h),a ;a6a5 dd 77 04 . w .
ld (ix+006h),a ;a6a8 dd 77 06 . w .
ld a,(ix+009h) ;a6ab dd 7e 09 . ~ .
ld (ix+003h),a ;a6ae dd 77 03 . w .
ld (ix+005h),a ;a6b1 dd 77 05 . w .
ld (ix+007h),a ;a6b4 dd 77 07 . w .
set 1,(ix+013h) ;a6b7 dd cb 13 ce . . . .
set 7,(ix+013h) ;a6bb dd cb 13 fe . . . .
set 7,(ix+037h) ;a6bf dd cb 37 fe . . 7 .
ld hl,00000h ;a6c3 21 00 00 ! . .
ld (01df8h),hl ;a6c6 22 f8 1d " . .
out (080h),a ;a6c9 d3 80 . .
pop hl ;a6cb e1 .
pop af ;a6cc f1 .
pop ix ;a6cd dd e1 . .
jp 01103h ;a6cf c3 03 11 . . . ; Patched to ecch
la6d2h:
jr nz,la6f4h ;a6d2 20 20
sub_a6d4h:
call 01961h ;a6d4 cd 61 19 . a . ; Patched to d9ch
call 01982h ;a6d7 cd 82 19 . . . ; Patched to d06h
xor a ;a6da af .
ld (07e00h),a ;a6db 32 00 7e 2 . ~
ld a,020h ;a6de 3e 20 >
ld (la6d2h),a ;a6e0 32 d2 a6 2 . .
ld (la6d2h+1),a ;a6e3 32 d3 a6 2 . .
ret ;a6e6 c9 .
sub_a6e7h:
;f_a6e7:
ld a,(la6d2h) ;a6e7 3a d2 a6 : . . ; (0a6d2h)==0x20 SPACE ?
cp 020h ;a6ea fe 20 .
jr nz,la6f2h ;a6ec 20 04 . ; no -> l_a6f2
ld a,02ah ;a6ee 3e 2a > * ; yes , a:=2a
jr la6f4h ;a6f0 18 02 . . ; -> l_a6f4
la6f2h:
ld a,020h ;a6f2 3e 20 > ; a:=0x20
la6f4h:
; copies a to 0a6d2, calls a function and reads a from 0a6d2
ld (la6d2h),a ;a6f4 32 d2 a6 2 . . ; (0a6d2h):=a
call set_byte_4346 ;a6f7 cd b2 ab . . . ; a -> 0x4346 var
ld a,(la6d2h) ;a6fa 3a d2 a6 : . . ; read back 0a6d2h
ret ;a6fd c9 .
read_a6d2:
ld a,(la6d2h) ;a6fe 3a d2 a6 : . . ; a:=(0a6d2h)
ret ;a701 c9 .
sub_a702h:
ld a,(la6d2h+1) ;a702 3a d3 a6 : . . : a:= (0a6d3)
cp 020h ;a705 fe 20 . ; a==SPACE?
jr nz,la70dh ;a707 20 04 . ; no, -> l_a70d
ld a,02ah ;a709 3e 2a > * ; yes, a:=0x2a, '*'
jr la70fh ;a70b 18 02 . . ; -> l_a70f
la70dh:
ld a,020h ;a70d 3e 20 >
la70fh:
ld (la6d2h+1),a ;a70f 32 d3 a6 2 . .
call set_byte_4372 ;a712 cd b6 ab . . .
ld a,(la6d2h+1) ;a715 3a d3 a6 : . .
ret ;a718 c9 .
ld a,(la6d2h+1) ;a719 3a d3 a6 : . .
ret ;a71c c9 .
sub_a71dh:
call sub_a852h ;a71d cd 52 a8 . R .
ret z ;a720 c8 .
ld l,a ;a721 6f o
or l ;a722 b5 .
ret m ;a723 f8 .
ld a,(la6d2h) ;a724 3a d2 a6 : . . ; a:=(0a6d2h)
cp 02ah ;a727 fe 2a . * ; a==2a '*' ?
jr nz,la737h ;a729 20 0c . ; no -> l_a736
ld a,l ;a72b 7d } ; a:=l
cp 061h ;a72c fe 61 . a ; a < 0x61 'a' ?
jr c,la737h ;a72e 38 07 8 . ; -> l_a736
cp 07bh ;a730 fe 7b . { ; a > 7b?
jr nc,la737h ;a732 30 03 0 . ; yes, -> l_a736
sub 020h ;a734 d6 20 . ; a:=a-0x20
;l_a736:
ld l,a ;a736 6f o ; l:=a
la737h:
or a ;a737 b7 .
ret m ;a738 f8 . ; ret if a < 0 -> then a is control char SPACE
ld a,(0a6d3h) ;a739 3a d3 a6 : . . ; a:=(0a6d3h)
ld h,a ;a73c 67 g ; h:=a
cp 020h ;a73d fe 20 . ; a== 0x20 SPACE
jr nz,la746h ;a73f 20 05 . ; no -> l_a744
la741h:
or 0ffh ;a741 f6 ff . . ; a:=ff,
scf ;a743 37 7 ; set carry
;l_a744:
ld a,l ;a744 7d } ; a:=l
ret ;a745 c9 .
; hexchar read in function; called when entering a hex number in VT session via "hex entry" soft key
; Interprets a character value in hl as BCD number input and converts it to BCD number in a
; e.g. hl=0x3132 (characters '1' and '2') result in a=0x12
la746h:
ld a,l ;a746 7d } ; a:=l
cp '0' ;a747 fe 30 . 0 ; a<0x30 '0' ?
jr c,la783h ;a749 38 38 8 8 ; yes -> l_7a1
cp ':' ;a74b fe 3a . : ; a<0x3a ? this selects 0..9
jr c,la75fh ;a74d 38 10 8 . ; yes -> l_765
cp 'A' ;a74f fe 41 . A ; a<0x41 'A'
jr c,la783h ;a751 38 30 8 0 ; yes -> l_7a1
cp 'G' ;a753 fe 47 . G ; a<0x47 'G' ? this selects 'a'..'f'
jr c,la75fh ;a755 38 08 8 . ; yes -> l_765
cp 'a' ;a757 fe 61 . a ; a<0x61 'a' ?
jr c,la783h ;a759 38 28 8 ( ; yes -> l_a79b
cp 'g' ;a75b fe 67 . g ; a>=0x67 'F' this selects 'A'..'F'
jr nc,la783h ;a75d 30 24 0 $ ; yes -> l_f795, BUT NO VALID OPCODE THERE
la75fh:
ld a,h ;a75f 7c | ; a:=h
cp '*' ;a760 fe 2a . * ; a==0x2a '*' ? mybe special handling for * ?
ld a,l ;a762 7d } ; a:=l
jr z,la77dh ;a763 28 18 ( . ; yes, -> l_a77d
l_a765:
call sub_a785h ;a765 cd 85 a7 . . . ; get num value of number e.g. 0x31->0x1
ld l,a ;a768 6f o ; l:=a, we save a in l
ld a,h ;a769 7c | ; a:=h
call sub_a785h ;a76a cd 85 a7 . . . ; again, get num value, now for h
add a,a ;a76d 87 . ; shift a 4 times left (to upper nibble)
add a,a ;a76e 87 .
add a,a ;a76f 87 .
add a,a ;a770 87 .
add a,l ;a771 85 . ; add l value to lower nibble; looks like we have created BCD code from h and l charcodes
ld l,a ;a772 6f o
ld a,02ah ;a773 3e 2a > * ; (0a6d3h):= 0x2a *
ld (0a6d3h),a ;a775 32 d3 a6 2 . . ;
call set_byte_4372 ;a778 cd b6 ab . . .
jr la741h ;a77b 18 c4 . . ; -> l_a723
la77dh:
l_a77d:
ld (0a6d3h),a ;a77d 32 d3 a6 2 . .
call set_byte_4372 ;a780 cd b6 ab . . .
la783h:
xor a ;a783 af .
ret ;a784 c9 .
sub_a785h:
cp 03ah ;a785 fe 3a . : ; a>0x3a ':' ?
jr nc,la78ch ;a787 30 03 0 . ; yes -> l_a78b
;l_a789:
; a is a number
; returns int value from '1'-'9', 0x31 -> 0x1
sub 030h ;a789 d6 30 . 0
;l_a78b:
ret ;a78b c9 .
la78ch:
sub 057h ;a78c d6 57 . W
ret p ;a78e f0 .
add a,020h ;a78f c6 20 .
ret ;a791 c9 .
; this below does not look like code, opcodes all ff, fb etc.
la792h:
ret m ;a792 f8 .
rst 38h ;a793 ff .
cp 0fdh ;a794 fe fd . . ; a795 is function entry from above !?!
call m,0fafbh ;a796 fc fb fa . . .
ld sp,hl ;a799 f9 .
rst 18h ;a79a df .
;l_a79b:
dec c ;a79b 0d .
ex af,af' ;a79c 08 .
rst 18h ;a79d df .
dec c ;a79e 0d .
dec c ;a79f 0d .
dec c ;a7a0 0d .
;l_a7a1:
jr nz,la7d3h ;a7a1 20 30 0 ; --> a7f1, but there is data
; also, in case "z", we run into data
;; character array follows, containing 0-9,a-z, A-Z,
defb "123456789:;,-./`"
defb "abcdefghijklmnopqrstuvwxyz"
defb "[\\]^_"
la7d2h:
;defb 0f8h
ret m ;a7d2 f8 .
la7d3h:
; next lines until defb do not look like code
defb 0ffh, 0feh, 0fdh, 0fch, 0fbh, 0fah, 0f9h, 0f7h, 0f6h, 0f5h, 0f4h
defb 00dh, 00dh, 00dh
;rst 38h ;a7d3 ff .
;cp 0fdh ;a7d4 fe fd . .
;call m,0fafbh ;a7d6 fc fb fa . . .
;ld sp,hl ;a7d9 f9 .
;rst 30h ;a7da f7 .
;or 0f5h ;a7db f6 f5 . .
;call p,00d0dh ;a7dd f4 0d 0d . . .
;dec c ;a7e0 0d .
jr nz,$+97 ;a7e1 20 5f _
defb "!\"#$%&'()*+<=>?"
defb "@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
defb "{|}~"
ld a,a ;a811 7f
;; line above seems to be end of character array
; lines below still do not look like code, but data
la812h:
defb 0f8h
;ret m ;a812 f8 .
defb 0ffh, 0feh, 0fdh, 0fch, 0fbh, 0fah, 0f9h, 0f7h, 0f6h, 0f5h, 0f4h
;rst 38h ;a813 ff .
;cp 0fdh ;a814 fe fd . .
;call m,0fafbh ;a816 fc fb fa . . .
;ld sp,hl ;a819 f9 .
;rst 30h ;a81a f7 .
;or 0f5h ;a81b f6 f5 . .
defb 00dh, 00dh, 00dh
;call p,00d0dh ;a81d f4 0d 0d . . .
;dec c ;a820 0d .
;; 1,2,3,4,5..
jr nz,$+129 ;a821 20 7f
defb '1', '2', '3', '4', '5', '6', '7', '8', '9'
;ld sp,03332h ;a823 31 32 33 1 2 3
;inc (hl) ;a826 34 4
;dec (hl) ;a827 35 5
;ld (hl),037h ;a828 36 37 6 7
;jr c,$+59 ;a82a 38 39 8 9
;; some ascii codes?
ld a,(de) ;a82c 1a .
dec de ;a82d 1b .
inc e ;a82e 1c .
dec e ;a82f 1d .
ld e,01fh ;a830 1e 1f . .
nop ;a832 00 .
;; 01..1f