-
Notifications
You must be signed in to change notification settings - Fork 1
/
HCR141.asm
5698 lines (5319 loc) · 114 KB
/
HCR141.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
; Constants
buffer_keyboard = 0
inkey_key_shift = 255
osbyte_acknowledge_escape = 126
osbyte_enter_language = 142
osbyte_flush_buffer = 21
osbyte_inkey = 129
osbyte_read_write_basic_rom_bank = 187
osbyte_read_write_bell_duration = 214
osbyte_read_write_bell_frequency = 213
osbyte_read_write_last_break_type = 253
osbyte_scan_keyboard = 121
osbyte_set_cursor_editing = 4
osfile_load = 255
osfile_read_catalogue_info = 5
osfile_save = 0
osfind_close = 0
osfind_open_input = 64
osfind_open_output = 128
; Memory locations
l0006 = &0006
l0070 = &0070
l0071 = &0071
l0072 = &0072
l0073 = &0073
l0075 = &0075
l0076 = &0076
l0077 = &0077
l0078 = &0078
l0079 = &0079
l007a = &007a
l007b = &007b
l007c = &007c
l007d = &007d
l007e = &007e
l007f = &007f
l0080 = &0080
l0081 = &0081
l0082 = &0082
l0084 = &0084
l0085 = &0085
l0086 = &0086
l0087 = &0087
l0088 = &0088
l0089 = &0089
l008a = &008a
l008e = &008e
l008f = &008f
os_text_ptr = &00f2
romsel_copy = &00f4
l00fd = &00fd
l0103 = &0103
brkv = &0202
l0400_device_type = &0400
l0401_misca_shadow = &0401
l0402_miscb_shadow = &0402
l0403 = &0403
l0500 = &0500
l0501 = &0501
l0502 = &0502
l0503 = &0503
l0504 = &0504
l0505 = &0505
l0506 = &0506
l0507 = &0507
l0508 = &0508
l0509 = &0509
l050a = &050a
l050b = &050b
l050c = &050c
l0580 = &0580
l0600 = &0600
l0680 = &0680
l06a0 = &06a0
l06a1 = &06a1
l06a2 = &06a2
l06a3 = &06a3
l06a4 = &06a4
l06a5 = &06a5
l06a6 = &06a6
l06a7 = &06a7
l06a8 = &06a8
l06a9 = &06a9
l06aa = &06aa
l06ab = &06ab
l06ac = &06ac
l06ad = &06ad
l06ae = &06ae
l06af = &06af
l06b0 = &06b0
l0700 = &0700
l2003 = &2003
l2004 = &2004
l2005 = &2005
l2006 = &2006
l2007 = &2007
l2008 = &2008
sub_ca5b0 = &a5b0
PIA1_PortA_Addr_Lo = &fcc0
PIA1_ControlA = &fcc1
PIA1_PortB_Addr_Hi = &fcc2
PIA1_ControlB = &fcc3
PIA2_PortA_Data = &fcc4
PIA2_ControlA = &fcc5
PIA2_PortB_Misc = &fcc6
PIA2_ControlB = &fcc7
romsel = &fe30
user_via_t2c_l = &fe68
user_via_t2c_h = &fe69
user_via_acr = &fe6b
user_via_ifr = &fe6d
user_via_ier = &fe6e
osfind = &ffce
osbput = &ffd4
osbget = &ffd7
osfile = &ffdd
osrdch = &ffe0
osasci = &ffe3
osnewl = &ffe7
oswrch = &ffee
osbyte = &fff4
oscli = &fff7
org &8000
.pydis_start
jmp c80b9
jmp c804e
equb &c2, &2a, 3
equs "MICRON PLUS EPROM PROGRAMMER 1.41"
equb 0
equs "(C)H.C.R. ELECTRONIC SERVICES 1987"
equb 0
.c804e
pha
tya
pha
txa
pha
tsx
lda l0103,x
cmp #4
bne c8080
ldx #0
.loop_c805d
lda (os_text_ptr),y
cmp l91c6,x
bne c8084
iny
inx
cpx #5
bne loop_c805d
jsr jmp_Reset_Hardware
jsr sub_c8d73
ldx #1
ldy #0
lda #osbyte_read_write_last_break_type
jsr osbyte ; Write type of last reset, value X=1
pla
tax ; X=ROM number
lda #osbyte_enter_language
jmp osbyte ; Enter language ROM X
.c8080
cmp #9
beq c808a
.c8084
pla
tax
pla
tay
pla
rts
.c808a
lda (os_text_ptr),y
cmp #&0d
bne c8084
jsr osnewl ; Write newline (characters 10 and 13)
ldx #9
ldy #&80
jsr sub_c80a4
ldx #&63 ; 'c'
ldy #&8e
jsr sub_c80a4
jmp c8084
.sub_c80a4
stx l0088
sty l0089
ldy #0
.c80aa
lda (l0088),y
beq c80b8
jsr osasci ; Write character
iny
bne c80aa
inc l0089
bne c80aa
.c80b8
rts
.c80b9
cmp #1
bne c80b8
cli
ldx #&ff
txs
jsr jmp_Reset_Hardware
lda #&83
sta brkv+1
lda #&c2
sta brkv
ldx #0
ldy #&ff
lda #osbyte_read_write_last_break_type
jsr osbyte ; Read type of last reset
cpx #0 ; X=value of type of last reset
beq c80de
.loop_c80db
jsr sub_c81c2
.c80de
jsr Summary_Screen
ldx #&be
ldy #&8e
jsr sub_c80a4
.c80e8
jsr osrdch ; Read a character from the current input stream
cmp #&1b ; A=character read
bne c80f5
jsr c8bcb
jmp loop_c80db
.c80f5
cmp #&2a ; '*'
bne c80ff
jsr sub_c8378
jmp c80de
.c80ff
cmp #&31 ; '1'
bne c810c
jsr sub_c8e06
jsr jmp_Copy_ROM
jmp c80de
.c810c
cmp #&32 ; '2'
bne c8119
jsr sub_c8e06
jsr jmp_Blank_Check_ROM
jmp c80de
.c8119
cmp #&33 ; '3'
bne c8126
jsr sub_c8e06
jsr jmp_Program_ROM
jmp c80de
.c8126
cmp #&34 ; '4'
bne c8133
jsr sub_c8e06
jsr jmp_Verify_ROM
jmp c80de
.c8133
cmp #&35 ; '5'
bne c813d
jsr sub_c876d
jmp c80de
.c813d
cmp #&36 ; '6'
bne c8144
jsr sub_c83f0
.c8144
cmp #&37 ; '7'
bne c814b
jsr sub_c8559
.c814b
cmp #&38 ; '8'
bne c8155
jsr jmp_Rom_Image_Creator
jmp c80de
.c8155
cmp #&39 ; '9'
bne c816d
jsr osnewl ; Write newline (characters 10 and 13)
jsr osnewl ; Write newline (characters 10 and 13)
ldy #&ff
ldx #0
lda #osbyte_read_write_basic_rom_bank
jsr osbyte ; Read BASIC ROM number
lda #osbyte_enter_language
jsr osbyte ; Enter language ROM X
.c816d
cmp #&16
bne c819e
lda l0501
sta l0082
and #&0e
bne c8184
lda l0082
ora #2
sta l0501
jmp c80de
.c8184
cmp #2
bne c8194
lda l0082
and #&fd
ora #4
sta l0501
jmp c80de
.c8194
lda l0082
and #&f1
sta l0501
jmp c80de
.c819e
jmp c80e8
.sub_c81a1
cmp #&1b
bne c81aa
jsr c8bcb
.c81a8
sec
rts
.c81aa
cmp #&30 ; '0'
bcc c81a8
cmp #&47 ; 'G'
bcs c81a8
cmp #&3a ; ':'
bcc c81bd
cmp #&41 ; 'A'
bcc c81a8
sec
sbc #7
.c81bd
sec
sbc #&30 ; '0'
clc
rts
.sub_c81c2
ldx #&c8
ldy #&8f
jsr sub_c80a4
.c81c9
jsr osrdch ; Read a character from the current input stream
cmp #&1b ; A=character read
bne c81d6
jsr c8bcb
jmp c81c9
.c81d6
jsr sub_c81a1
bcs c81c9
cmp #&0a
bcs c81c9
sta l0400_device_type
asl a
asl a
asl a
asl a
tax
jsr jmp_Set_Device_Variables
rts
.Summary_Screen
lda #&16
jsr oswrch ; Write character 22
lda #7
jsr oswrch ; Write character 7
jsr osnewl ; Write newline (characters 10 and 13)
jsr Cursor_Off
ldx #2
.loop_c81fd
jsr Print_Device_Type
jsr Print_VPP_Voltage
jsr Print_Slow_Fast
jsr osnewl ; Write newline (characters 10 and 13)
dex
bne loop_c81fd
rts
.Print_Device_Type
lda l0400_device_type
bne c8226
jsr print_string
equs &84, &9d, &83, &8d, "27513 (64K)", 0
rts
.c8226
cmp #1
bne c823e
jsr print_string
equs &84, &9d, &83, &8d, "27512 (64K)", 0
rts
.c823e
cmp #2
bne c8256
jsr print_string
equs &84, &9d, &83, &8d, "27256 (32K)", 0
rts
.c8256
cmp #3
bne c826e
jsr print_string
equs &84, &9d, &83, &8d, "27128 (16K)", 0
rts
.c826e
cmp #4
bne c8286
jsr print_string
equs &84, &9d, &83, &8d, "2764 (8K) ", 0
rts
.c8286
cmp #5
bne c829e
jsr print_string
equs &84, &9d, &83, &8d, "2732 (4K) ", 0
rts
.c829e
cmp #6
bne c82b6
jsr print_string
equs &84, &9d, &83, &8d, "2716 (2K) ", 0
rts
.c82b6
cmp #7
bne c82ce
jsr print_string
equs &84, &9d, &83, &8d, "2564 (8K) ", 0
rts
.c82ce
cmp #8
bne c82e6
jsr print_string
equs &84, &9d, &83, &8d, "2532 (4K) ", 0
rts
.c82e6
jsr print_string
equs &84, &9d, &83, &8d, "27011 (128K)", 0
rts
.Print_VPP_Voltage
lda l0501
and #&0e
cmp #4
bne c8312
jsr print_string
equs " 12.5V", 0
rts
.c8312
cmp #2
bne c8324
jsr print_string
equs " 21V", 0
rts
.c8324
jsr print_string
equs " 25V", 0
rts
.Print_Slow_Fast
lda l0502
bne c8348
jsr print_string
equs " SLOW", 0
rts
.c8348
jsr print_string
equs " FAST", 0
rts
.print_string
pla
sta l0088
pla
sta l0089
ldy #0
.loop_c8361
inc l0088
bne c8367
inc l0089
.c8367
lda (l0088),y
beq c8371
jsr osasci ; Write character
clc
bcc loop_c8361
.c8371
lda l0089
pha
lda l0088
pha
rts
.sub_c8378
pha
jsr osnewl ; Write newline (characters 10 and 13)
jsr osnewl ; Write newline (characters 10 and 13)
pla
jsr oswrch ; Write character
ldx #0
.c8385
jsr osrdch ; Read a character from the current input stream
cmp #&1b ; A=character read
bne c8390
jsr c8bcb
rts
.c8390
cmp #&7f
bne c83a0
cpx #0
beq c8385
lda #&7f
jsr oswrch ; Write character 127
dex
bpl c8385
.c83a0
jsr oswrch ; Write character
sta l0700,x
cmp #&0d
beq c83ad
inx
bpl c8385
.c83ad
lda #&0c
jsr oswrch ; Write character 12
jsr osnewl ; Write newline (characters 10 and 13)
jsr osnewl ; Write newline (characters 10 and 13)
ldx #<(l0700)
ldy #>(l0700)
jsr oscli
jmp c83e3
.brk_handler
lda #&1f
jsr oswrch ; Write character 31
lda #&0c
jsr oswrch ; Write character 12
lda #&15
jsr oswrch ; Write character 21
lda #7
jsr oswrch ; Write character 7
ldy #0
.loop_c83d8
iny
lda (l00fd),y
beq c83e3
jsr oswrch ; Write character
jmp loop_c83d8
.c83e3
ldy #&91
ldx #&7a ; 'z'
jsr sub_c80a4
jsr osrdch ; Read a character from the current input stream
jmp c80de
.sub_c83f0
jsr sub_c863d
ldx #0
jsr c8742
jsr sub_c8515
jsr osrdch ; Read a character from the current input stream
cmp #&0d ; A=character read
bne c8414
lda #0
sta l0070
sta l0072
lda #&20 ; ' '
sta l0071
lda l0504
sta l0073
jmp c8498
.c8414
jsr print_string
equs &1f, 1, &0f, "Enter START address for save :- ", 0
jsr sub_c8bd1
lda l0084
asl a
asl a
asl a
asl a
clc
adc l0085
adc #&20 ; ' '
sta l0071
lda l0086
asl a
asl a
asl a
asl a
clc
adc l0087
sta l0070
jsr print_string
equs &1f, 1, &12, "Enter END address+1 for save :- ", 0
jsr sub_c8bd1
lda l0084
asl a
asl a
asl a
asl a
clc
adc l0085
adc #&20 ; ' '
sta l0073
lda l0086
asl a
asl a
asl a
asl a
clc
adc l0087
sta l0072
.c8498
jsr osnewl ; Write newline (characters 10 and 13)
jsr osnewl ; Write newline (characters 10 and 13)
ldx #<(l0700)
ldy #>(l0700)
lda #osfind_open_output
jsr osfind ; Open file for output (A=128)
sta l0082 ; A=file handle (or zero on failure)
.c84a9
lda l0071
cmp l0073
beq c84b3
bcs c84d8
bcc c84b9
.c84b3
lda l0070
cmp l0072
bcs c84d8
.c84b9
lda l0071
cmp #&60 ; '`'
bcc c84c2
jmp c84e2
.c84c2
ldy #0
lda (l0070),y
.c84c6
ldy l0082 ; Y=file handle
jsr osbput ; Write a single byte A to an open file Y
inc l0070
bne c84a9
inc l0071
lda l0071
cmp l0504
bne c84a9
.c84d8
lda #osfind_close
ldy l0082
jsr osfind ; Close one or all files
jmp c83e3
.c84e2
sec
sbc #&60 ; '`'
sta PIA1_PortB_Addr_Hi
lda l0070
sta PIA1_PortA_Addr_Lo
lda #&cf
sta PIA2_PortB_Misc
lda #&3c ; '<'
sta PIA2_ControlB
lda #&34 ; '4'
sta PIA2_ControlB
lda PIA2_PortA_Data
sta l0084
lda #&ff
sta PIA2_PortB_Misc
lda #&3c ; '<'
sta PIA2_ControlB
lda #&34 ; '4'
sta PIA2_ControlB
lda l0084
jmp c84c6
.sub_c8515
jsr print_string
equs &1f, 1, &0a, "Press RETURN to save CURRENT BUFFER", &0d, &0d
equs " Or ANY key to specify.", 0
rts
.sub_c8559
jsr sub_c8696
ldx #0
jsr c8742
jsr sub_c86ef
jsr osrdch ; Read a character from the current input stream
cmp #&0d ; A=character read
bne c8575
lda #0
sta l0070
lda #&20 ; ' '
sta l0071
bne c85af
.c8575
jsr print_string
equs &1f, 6, &0f, "Enter Buffer Address :- ", 0
jsr sub_c8bd1
lda l0084
asl a
asl a
asl a
asl a
clc
adc l0085
adc #&20 ; ' '
sta l0071
lda l0086
asl a
asl a
asl a
asl a
clc
adc l0087
sta l0070
.c85af
jsr osnewl ; Write newline (characters 10 and 13)
jsr osnewl ; Write newline (characters 10 and 13)
lda #&30 ; '0'
sta PIA2_ControlA
lda #&ff
sta PIA2_PortA_Data
lda #&34 ; '4'
sta PIA2_ControlA
ldx #<(l0700)
ldy #>(l0700)
lda #osfind_open_input
jsr osfind ; Open file for input (A=64)
sta l0082 ; A=file handle (or zero on failure)
.c85cf
ldy l0082 ; Y=file handle
jsr osbget ; Read a single byte from an open file Y
sta l0084
bcs c85f3
lda l0071
cmp #&60 ; '`'
bcc c85e1
jmp c860c
.c85e1
lda l0084
ldy #0
sta (l0070),y
.c85e7
inc l0070
bne c85cf
inc l0071
lda l0071
cmp #&a0
bne c85cf
.c85f3
lda #osfind_close
ldy l0082
jsr osfind ; Close one or all files
lda #&30 ; '0'
sta PIA2_ControlA
lda #0
sta PIA2_PortA_Data
lda #&34 ; '4'
sta PIA2_ControlA
jmp c83e3
.c860c
sec
sbc #&60 ; '`'
sta PIA1_PortB_Addr_Hi
lda l0070
sta PIA1_PortA_Addr_Lo
lda l0084
sta PIA2_PortA_Data
lda #&9f
sta PIA2_PortB_Misc
lda #&3c ; '<'
sta PIA2_ControlB
lda #&34 ; '4'
sta PIA2_ControlB
lda #&ff
sta PIA2_PortB_Misc
lda #&3c ; '<'
sta PIA2_ControlB
lda #&34 ; '4'
sta PIA2_ControlB
jmp c85e7
.sub_c863d
jsr print_string
equs &0c, &0d, &84, &9d, &83, &8d, " SAVE BUFFER TO FILE."
equs &0d, &84, &9d, &83, &8d, " SAVE BUFFER TO FILE.", &1f
equs 5, 6, "Enter File Name:- ", 0
rts
.sub_c8696
jsr print_string
equs &0c, &0d, &84, &9d, &83, &8d, " LOAD FILE TO BUFFER."
equs &0d, &84, &9d, &83, &8d, " LOAD FILE TO BUFFER.", &1f
equs 5, 6, "ENTER FILE NAME:- ", 0
rts
.sub_c86ef
jsr print_string
equs &1f, 1, &0a, "Press RETURN to load to START OF BUFF.", &0d
equs &0d, " Or ANY key for a specific Address.", 0
rts
.c8742
jsr osrdch ; Read a character from the current input stream
cmp #&7f ; A=character read
bne c8754
cpx #0
beq c8742
dex
jsr oswrch ; Write character
jmp c8742
.c8754
jsr oswrch ; Write character
cmp #&1b
beq c8767
sta l0700,x
cmp #&0d
beq c8766
inx
jmp c8742
.c8766
rts
.c8767
jsr c8bcb
jmp c80de
.sub_c876d
lda #0
sta l0078
sta l0082
lda l0503
sta l0079
.c8778
lda #&0c
jsr oswrch ; Write character 12
jsr osnewl ; Write newline (characters 10 and 13)
ldx #&8c
ldy #&91
jsr sub_c80a4
lda #osbyte_set_cursor_editing
ldx #1
jsr osbyte ; Disable cursor editing (edit keys give ASCII 135-139) (X=1)
lda #0
sta l0072
sta l0073
jsr sub_c879a
jmp c88fc
.sub_c879a
jsr Cursor_Off
lda l0078
sta l0070
lda l0079
sta l0071
lda #&13
sta l0075
ldy #0
lda #&1f
jsr oswrch ; Write character 31
tya
jsr oswrch ; Write character
lda #5
jsr oswrch ; Write character 5
.c87b9
lda #&86
jsr oswrch ; Write character 134
lda l0071
sec
sbc #&20 ; ' '
jsr PrintHexA
lda l0070
jsr PrintHexA
lda #&87
jsr oswrch ; Write character 135
lda l0070
sta l0076
lda l0071
sta l0077
cmp #&60 ; '`'
bcc c87df
jsr sub_c88b5
.c87df
ldx #8
ldy #0
.loop_c87e3
lda (l0076),y
jsr PrintHexA
lda #&20 ; ' '
jsr oswrch ; Write character 32
inc l0076
dex
bne loop_c87e3
lda #&20 ; ' '
jsr oswrch ; Write character 32
lda l0070
sta l0076
lda l0071
sta l0077
cmp #&60 ; '`'
bcc c880b
lda #&80
sta l0076
lda #5
sta l0077
.c880b
ldx #8
ldy #0
.loop_c880f
lda (l0076),y
and #&7f
cmp #&20 ; ' '
bcc c881b
cmp #&7f
bcc c881d
.c881b
lda #&2e ; '.'
.c881d
jsr oswrch ; Write character 46
inc l0076
dex
bne loop_c880f
lda #&20 ; ' '
jsr oswrch ; Write character 32
lda l0070
clc
adc #8
sta l0070
lda l0071
adc #0
sta l0071
dec l0075
beq c883e
jmp c87b9
.c883e
jsr sub_c8b14
jsr sub_c887d
rts