-
Notifications
You must be signed in to change notification settings - Fork 0
/
basic1501.lst
2376 lines (2376 loc) · 140 KB
/
basic1501.lst
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
0001 0000 ;------------------------------------------------------------------------------
0002 0000 ; BASIC1501 from SHARPENTIERS_06 pg. 10
0003 0000 ; Adds 32 BASIC commands
0004 0000 ;------------------------------------------------------------------------------
0005 0000 #INCLUDE "lib/PC-1500.lib"
0001+ 0000 ; PC-1500 library file
0002+ 0000 ;RAM_ST = $4000 ; Start of RAM w/o RAM expansion
0003+ 0000 ;RESMEM_ST = $4008 ; Reserve memroy area area w/o RAM expansion (4008-40C4)
0004+ 0000 ;PRGMEM_ST = $40C5 ; Start of program memory w/o RAM expansion
0005+ 0000 SHADOW_RAM = $7000 ; Shadow of RAM from (4000-45FF?)
0006+ 0000 SHADOW_RAM_SIZE = $0600 ;
0007+ 0000 DISP_BUFF = $7600 ; Display Buffer (7600-774F)
0008+ 0000 DISP_BUFF_SIZE = $0150 ;
0009+ 0000 STRING_VARS = $7650 ; Fixed String variables (7650-77AF)
0010+ 0000 STRING_VARS_SIZE = $01AF ;
0011+ 0000 CPU_STACK = $7800 ; CPU stack (7800-784F)
0012+ 0000 CPU_STACK_SIZE = $50 ;
0013+ 0000 KATAFLAGS = $785D ; Katakana displayed flags
0014+ 0000 KATACHAR = $785E ; Address of Katakana character codes (H)
0015+ 0000 ROM_ST_H = $7861 ; Start of Basic program in ROM module (H)
0016+ 0000 ROM_ST_L = $7862 ; Start of Basic program in ROM module (L)
0017+ 0000 RAM_ST_H = $7863 ; Start of RAM pointer (H)
0018+ 0000 RAM_END_H = $7864 ; End of RAM pointer (H)
0019+ 0000 BASPRG_ST_H = $7865 ; Start of Basic program in RAM (H)
0020+ 0000 BASPRG_ST_L = $7866 ; Start of Basic program in RAM (L)
0021+ 0000 BASPRG_END_H = $7867 ; End of Basic program in RAM (H)
0022+ 0000 BASPRG_END_L = $7868 ; End of Basic program in RAM (L)
0023+ 0000 BASPRG_EDT_H = $7869 ; Start of Basic program edit (H)
0024+ 0000 BASPRG_EDT_L = $786A ; Start of Basic program edit (L)
0025+ 0000 BEEP_PTR = $786B ; BEEP and RMT flags
0026+ 0000 RCLTEMPBUFF = $786C ; RCL Temp buffer (786C-7870)
0027+ 0000 RCLTEMPBUFF_SIZE = $05 ;
0028+ 0000 WAIT_CFG = $7871 ; WAIT setting
0029+ 0000 WAIT_CTR_H = $7872 ; WAIT time counter (H)
0030+ 0000 WAIT_CTR_L = $7873 ; WAIT time counter (L)
0031+ 0000 CURSOR_ENA = $7874 ; Flags: 01=Cursor enabled, 80=display currently saved 7B10-7BAB
0032+ 0000 CURSOR_PTR = $7875 ; CURSOR POINTER (current display column number)
0033+ 0000 CHARPOS_LCD = $7876 ; Character position number in display, with INPUT statement
0034+ 0000 BEEP_FREQ = $7878 ; BEEP frequency
0035+ 0000 CASS_FLAG = $7879 ; Cassette Operation Parameter (tape interface flag)
0036+ 0000 CURSOR_BLNK = $787C ; Flags: 01=blink cursor enabled, 80=a character is now blinked
0037+ 0000 BLNKD_CHAR_CODE = $787D ; Code of character blinked
0038+ 0000 CURS_POS_NBUF_H = $787E ; Position of blink cursor in buffer (H)
0039+ 0000 CURS_POS_NBUF_L = $787F ; Position of blink cursor in buffer (L)
0040+ 0000 DISPARAM = $7880 ; Display Parameter: determines display at READY
0041+ 0000 STK_PTR_GSB_FOR = $7882 ; Stack pointer for GOSUB and FOR
0042+ 0000 CURVARADD_H = $7883 ; Current variable address (H)
0043+ 0000 CURVARADD_L = $7884 ; Current variable address (L)
0044+ 0000 LASTVARADD_H = $7886 ; Last variable address (H)
0045+ 0000 LASTVARADD_L = $7887 ; Last variable address (L)
0046+ 0000 LASTVARTYPE = $7888 ; Last variable type
0047+ 0000 BREAKPARAM = $788A ; BREAK flag parameter
0048+ 0000 INBUFPTR_L = $788B ; Input Buffer pointer (L)
0049+ 0000 NUMARGS = $788C ; Number of function input arguments, array dim 1/2
0050+ 0000 TRACE_ON = $788D ; TRACE ON/OFF pointer: 00=OFF, >0=ON
0051+ 0000 TRACE = $788E ; TRACE Parameter
0052+ 0000 FORNXT_STK_PTR = $7890 ; FOR/NEXT stack pointer (L)
0053+ 0000 GOSB_STK_PTR_L = $7891 ; GOSUB stack pointer (L)
0054+ 0000 BAS_DATA_STK_L = $7892 ; BASIC DATA STACK pointer (L)
0055+ 0000 BAS_PENOP_STK_L = $7893 ; BASIC PENDING OP STACK pointer (L)
0056+ 0000 STR_BUF_PTR_L = $7894 ; String Buffer Pointer (L)
0057+ 0000 USINGF = $7895 ; USING F/F (format, decimal, comma, etc.)
0058+ 0000 USINGM = $7896 ; USING M integer part
0059+ 0000 USING_CHR = $7897 ; USING & character string
0060+ 0000 USINGMD = $7898 ; USING m decimal part
0061+ 0000 VAR_START_H = $7899 ; START OF VARIABLES in main memory (H)
0062+ 0000 VAR_START_L = $789A ; START OF VARIABLES in main memory (L)
0063+ 0000 ERL = $789B ; ERL, Error code
0064+ 0000 CURR_LINE_H = $789C ; Current line number (H)
0065+ 0000 CURR_LINE_L = $789D ; Current line number (L)
0066+ 0000 CURR_TOP_H = $789E ; Beginning address of current program (H)
0067+ 0000 CURR_TOP_L = $789F ; Beginning address of current program (L)
0068+ 0000 PREV_ADD_H = $78A0 ; Previous address (of preceeding line) (H)
0069+ 0000 PREV_ADD_L = $78A1 ; Previous address (of preceeding line) (L)
0070+ 0000 PREV_LINE_H = $78A2 ; Previous line number (H)
0071+ 0000 PREV_LINE_L = $78A3 ; Previous line number (L)
0072+ 0000 PREV_TOP_H = $78A4 ; Begginning of program containing previous line (H)
0073+ 0000 PREV_TOP_L = $78A5 ; Begginning of program containing previous line (L)
0074+ 0000 SRCH_ADD_H = $78A6 ; Address of linefound during search (H)
0075+ 0000 SRCH_ADD_L = $78A7 ; Address of linefound during search (L)
0076+ 0000 SRCH_LINE_H = $78A8 ; Line number found after search (H)
0077+ 0000 SRCH_LINE_L = $78A9 ; Line number found after search (L)
0078+ 0000 SRCH_TOP_H = $78AA ; Beginning of program containing SEARCH line (H)
0079+ 0000 SRCH_TOP_L = $78AB ; Beginning of program containing SEARCH line (L)
0080+ 0000 BRK_ADD_H = $78AC ; Break address (H)
0081+ 0000 BRK_ADD_L = $78AD ; Break address (L)
0082+ 0000 BRK_LINE_H = $78AE ; Break line number (H)
0083+ 0000 BRK_LINE_L = $78AF ; Break line number (L)
0084+ 0000 BRK_TOP_H = $78B0 ; Beginning of program containing BREAK line
0085+ 0000 BRK_TOP_L = $78B1 ; Beginning of program containing BREAK line
0086+ 0000 ERR_ADD_H = $78B2 ; Error address (H)
0087+ 0000 ERR_ADD_L = $78B3 ; Error address (L)
0088+ 0000 ERR_LINE_H = $78B4 ; Error line number (H)
0089+ 0000 ERR_LINE_L = $78B5 ; Error line number (L)
0090+ 0000 ERR_TOP_H = $78B6 ; Beginning address of program containing ERROR line (H)
0091+ 0000 ERR_TOP_L = $78B7 ; Beginning address of program containing ERROR line (L)
0092+ 0000 ON_ERR_ADD_H = $78B8 ; Address jumped to when error occures (H)
0093+ 0000 ON_ERR_ADD_L = $78B9 ; Address jumped to when error occures (L)
0094+ 0000 ON_ERR_LINE_H = $78BA ; Line number jumped to when error occures (H)
0095+ 0000 ON_ERR_LINE_L = $78BB ; Line number jumped to when error occures (L)
0096+ 0000 ON_ERR_TOP_H = $78BC ; Beginning of program containing ON ERROR line (H)
0097+ 0000 ON_ERR_TOP_L = $78BD ; Beginning of program containing ON ERROR line (L)
0098+ 0000 DATA_PTR_H = $78BE ; Pointer for data statement (H)
0099+ 0000 DATA_PTR_L = $78BF ; Pointer for data statement (H)
0100+ 0000 FIXED_VARS = $78C0 ; Fixed Variables (78C0-79CF)
0101+ 0000 FIXED_VARS_SIZE = $0110 ;
0102+ 0000 PU_PV = $79D0 ; PU/PV flag, ROM Bank: 00=ROM 1, 01=ROM 2
0103+ 0000 OPN = $79D1 ; OPN device code: 60=LCD, 5C=CMT, 58=MGP. C4=LPRT, C0=COM
0104+ 0000 UNDEF_REG_79FF = $79FF ; LOCK mode: 00=LOCK, FF=UNLOCK
0105+ 0000 ARX = $7A00 ; Floating-Point accumulator
0106+ 0000 ARX_SIZE = $08 ;
0107+ 0000 ARZ = $7A08 ; Scratch register (7A00-7A07)
0108+ 0000 ARZ_SIZE = $08 ;
0109+ 0000 ARY = $7A10 ; Second operand (7A10-7A17)
0110+ 0000 ARY_SIZE = $08 ;
0111+ 0000 ARU = $7A18 ; Scratch register (7A18-7A1F)
0112+ 0000 ARU_SIZE = $08 ;
0113+ 0000 ARV = $7A20 ; Scratch register (7A2-7A27)
0114+ 0000 ARV_SIZE = $08 ;
0115+ 0000 ARW = $7A28 ; Scratch register (7A28-7A2F)
0116+ 0000 ARW_SIZE = $08 ;
0117+ 0000 ARS = $7A30 ; Temporary storage register (7A30-7A37)
0118+ 0000 ARS_SIZE = $08 ;
0119+ 0000 B_STACK = $7A38 ; Basic Stack (7838-7AFF)
0120+ 0000 B_STACK_SIZE = $C8 ;
0121+ 0000 RND_VAL = $7B00 ; Contain Random number value (7B00-7B07)
0122+ 0000 RND_VAL_SIZE = ; S
0123+ 0000 KEY_REPEAT = $7B09 ; Key repeat speed
0124+ 0000 APOW_CTR_H = $7B0A ; Auto power down counter (H)
0125+ 0000 APOW_CTR_M = $7B0B ; Auto power down counter (M)
0126+ 0000 APOW_CTR_L = $7B0C ; Auto power down counter (L)
0127+ 0000 CURS_BLNK_CTR = $7B0D ; Cursor blink counter
0128+ 0000 CURS_CTRL = $7B0E ; Cursor Control Parameter
0129+ 0000 KEY_LAST = $7B0F ; Last pressed key code
0130+ 0000 STR_BUF = $7B10 ; String Buffer (7B10-7B5F)
0131+ 0000 STR_BUF_SIZE = $50 ;
0132+ 0000 OUT_BUF = $7B60 ; Output Buffer (7B60-7BAF)
0133+ 0000 OUT_BUF_SIZE = $50 ;
0134+ 0000 IN_BUF = $7BB0 ; Input Buffer (7BB0-7BFF)
0135+ 0000 IN_BUF_SIZE = $80 ;
0136+ 0000 SAVEVARPTR_ARX = $C00E ; Save variable pointer. Address from U-Reg, length from AR-X (7A07).
0137+ 0000 SAVEVARPTR_A = $C011 ; Save variable pointer. Address from U-Reg, length from A.
0138+ 0000 SM_NEW0 = $C34F ; 'NEW0?' (C350-C354) (Start of system messages)
0139+ 0000 SM_NEW0_SIZE = $05 ;
0140+ 0000 SM_CHECK = $C355 ; ':CHECK' (C355-C35B)
0141+ 0000 SM_BREAK = $C35C ; 'BREAK' (C35C-C361)
0142+ 0000 SM_IN = $C362 ; 'IN' (C362-C364)
0143+ 0000 SM_IN_SIZE = $05 ;
0144+ 0000 SM_ERROR = $C365 ; 'ERROR' (C365-C36A)
0145+ 0000 SM_ERROR_SIZE = $05 ;
0146+ 0000 DEFKEY_TBL = $C36B ; Occupied DEF key table (C36B-C38A)
0147+ 0000 DEFKEY_TBL_SIZE = $05 ;
0148+ 0000 EDCTRL_TBL = $C38B ; Address table for editor control characters (C38B-C3A9)
0149+ 0000 EDCTRL_TBL_SIZE = $05 ;
0150+ 0000 FVAL_TBLE = $C3A8 ; Operator table for formula eval of subs (C3A8-C3FF) (DE) (D6DF)
0151+ 0000 FVAL_TBLE_SIZE = $05 ;
0152+ 0000 BCMD_LET = $C458 ; Basic command LET
0153+ 0000 BCMD_STOP = $C4B6 ; Basic command STOP
0154+ 0000 BCMD_END = $C50D ; Basic Command END
0155+ 0000 BCMD_GOTO = $C515 ; Basic Command GOTO
0156+ 0000 DEFKEY_EVAL = $C529 ; Evaluate def keys
0157+ 0000 BCMD_IF = $C5B4 ; Basic Command IF
0158+ 0000 BCMD_ON = $C5E0 ; Basic Command ON
0159+ 0000 BCMD_GOSUB = $C64E ; Basic Command GOSUB
0160+ 0000 BCMD_REM = $C676 ; Basic Command REM
0161+ 0000 BCMD_USING = $C67C ; Basic Command USING
0162+ 0000 BCMD_DATA = $C684 ; Basic Command DATA / ARUN / AREAD
0163+ 0000 BCMD_TRON = $C68C ; Basic Command TRON
0164+ 0000 BCMD_TROFF = $C693 ; Basic Command TROFF
0165+ 0000 BCMD_DEGREE = $C697 ; Basic Command DEGREE
0166+ 0000 BCMD_RADIAN = $C6A4 ; Basic Command RADIAN
0167+ 0000 BCMD_GRAD = $C6A8 ; Basic Command GRAD
0168+ 0000 BCMD_RETURN = $C6AC ; Basic Command RETURN
0169+ 0000 BCMD_NEXT = $C704 ; Basic Command NEXT
0170+ 0000 BCMD_FOR = $C711 ; Basic Command FOR
0171+ 0000 BCMD_POKE = $C777 ; Basic Command POKE
0172+ 0000 BCMD_POKE# = $C778 ; Basic Command POKE#
0173+ 0000 BCMD_RESTORE = $C7A2 ; Basic Command RESTORE
0174+ 0000 BCMD_READ = $C7BB ; Basic Command READ
0175+ 0000 BCMD_NEW = $C8A0 ; Basic Command NEW
0176+ 0000 BCMD_CLEAR = $C8F5 ; Basic Command CLEAR
0177+ 0000 BCMD_CALL = $CB63 ; Basic Command CALL
0178+ 0000 BCMD_RUN = $C884 ; Basic Command RUN
0179+ 0000 BCMD_CONT = $C8C7 ; Basic Command CONT
0180+ 0000 BCMD_INPUT = $C8FA ; Basic Command INPUT
0181+ 0000 BCMD_LOCK = $C968 ; Basic Command LOCK
0182+ 0000 BCMD_UNLOCK = $C96A ; Basic Command UNLOCK
0183+ 0000 BCMD_LIST = $C96E ; Basic Command LIST
0184+ 0000 BCMD_DIM = $C988 ; Basic Command DIM
0185+ 0000 COLD_START = $C9E4 ; Editor Cold Start
0186+ 0000 BTN_SHCL = $CA55 ; SHIFT CL (Clear All)
0187+ 0000 WARM_START = $CA58 ; Editor Warm Start
0188+ 0000 BUTTON_CL = $CA64 ; CL Button (Clear LCD )
0189+ 0000 BTN_RCL = $CB61 ; RCL Button
0190+ 0000 BTN_SHMODE = $CB9C ; SHIFT MODE Button (RESERVE mode)
0191+ 0000 BTN_MODE = $CBA0 ; MODE Button
0192+ 0000 BTN_INS = $CBC7 ; INS Button
0193+ 0000 BTN_DEL = $CBCF ; DEL Button
0194+ 0000 BTN_RIGHT = $CBE4 ; CURSOR RIGHT Button
0195+ 0000 BTN_LRFT = $CC22 ; CURSOR LEFT Button
0196+ 0000 BTN_UP = $CC38 ; CURSOR UP Button
0197+ 0000 BTN_DOWN = $CC48 ; CURSOR DOWN Button
0198+ 0000 BTN_ENTER = $CCC1 ; ENTER Button
0199+ 0000 UNLOCK = $CD6A ; UNLOCK
0200+ 0000 BTN_OFF = $CD71 ; OFF Button
0201+ 0000 RESKEY_SRCH = $CEC4 ; Searches for reserve key code in Reserve memory
0202+ 0000 TXFR_RSV_KEY = $CED0 ; Transfers reserve key assignment to Reserve memory.
0203+ 0000 PRGLINE_TDI = $CF27 ; Transfer, delete, insert program line from Input Buffer
0204+ 0000 INBUF_CLRRST = $D021 ; Clear rest of the input buffer (0D).
0205+ 0000 INBUF_INIT = $D030 ; Clear Input Buffer, Y-Reg points to start of Input Buffer
0206+ 0000 INBUF_CLR = $D034 ; Clears Input buffer with $0D
0207+ 0000 SYSMSG = $D046 ; Send System Messages.
0208+ 0000 XREG2YREG = $D049 ; Transfers UL bytes from X-Reg to Y-Reg
0209+ 0000 DEL_DIM_VARS = $D09C ; Deletes dimensioned variables if program and variable memory overlap C=1
0210+ 0000 BCD_Y2ARX = $D14F ; Pass BCD number pointed to by Y-Reg to AR-X
0211+ 0000 LINESEARCH = $D2EA ; Searches for line number according to U-Reg from start of program.
0212+ 0000 SRCHPRGLINE = $D2EC ; Searches program line in U-REG from X-REG
0213+ 0000 DELU_FROMX = $D3C4 ; Deletes (U + 1) bytes from X-Reg.
0214+ 0000 DEC2HEX = $D3D5 ; Convert from decimal to hexadecimal.
0215+ 0000 BCMD_PEEK = $D993 ; Basic commands PEEK/PEEK#
0216+ 0000 BCMD_NOT = $D99E ; Basic command NOT
0217+ 0000 BCMD_INKY = $D9AA ; Basic command INKEY$
0218+ 0000 BCMD_CHR = $D9B1 ; Basic command CHR$
0219+ 0000 BCMD_STR = $D9CF ; Basic command STR$
0220+ 0000 BCMD_LEN = $D9D7 ; Basic command LEN / ASC
0221+ 0000 BCMD_RLM_STR = $D9F3 ; Basic commands RIGHT$ / LEFT$ / MID$
0222+ 0000 BCMD_STATUS = $DA44 ; Basic command STATUS
0223+ 0000 BCMD_MEM = $DA5D ; Basic command MEM
0224+ 0000 EVAL_USING = $DAB2 ; Evaluation of USING paramters from Y-Reg
0225+ 0000 LOAD_NEXT = $DCD4 ; Load next Token / character
0226+ 0000 XREG2STRBUF = $DFA1 ; Inserts string pointed to by X-Reg into string buffer. Jump if overflow.
0227+ 0000 ARX2STRBUF = $DFC4 ; Loads AR-X with a pointer to the string buffer.
0228+ 0000 U_MINUS_X = $DFE2 ; U-Reg = U-Reg - X-Reg. If overflow occurs C=0 and UH=16
0229+ 0000 MEM_IN_UREG = $DFEE ; Calculates the available memory space (MEM) in U-Reg.
0230+ 0000 PRGST2XREG = $DFF3 ; X-Reg = Program Start Address. U-Reg = STATUS 1-2
0231+ 0000 AUTO_OFF = $E33F ; Auto-Power-Off routine
0232+ 0000 KEY2ASCII = $E42C ; Return ASCII code of key pressed in Accumulator. If no key: C=1.
0233+ 0000 BCMD_PRINT = $E4EB ; Basic command PRINT
0234+ 0000 TIMEDELAY = $E88C ; Time delay 15.625 ms * number in U-Reg. BREAK is possible.
0235+ 0000 PRGMDISP = $E8CA ; Display program.
0236+ 0000 USING_FRMT = $EA78 ; USING formatting. If error C = 1.
0237+ 0000 INIT_CURS = $ECAE ; Initializes cursor parameters.
0238+ 0000 OUTBUF2LCD = $ECFA ; Output 26 characters in Output Buffer to LCD
0239+ 0000 TEXTUREG_A = $ED00 ; Output of text on LCD. U-Reg=start address; A=length.
0240+ 0000 TEXTUREG_XL = $ED3B ; Outputs text from U-Reg. XL = number of characters
0241+ 0000 CHAR2COL = $ED4D ; Output character at next matrix column
0242+ 0000 CHARA2COL = $ED57 ; Output character in A to next matrix column.
0243+ 0000 CHARA2COLX = $ED5B ; Output character in A to matrix column X-Reg points to.
0244+ 0000 A2HEX = $ED7D ; Convert character in A to HEX nibble
0245+ 0000 ASCII2HEX = $ED95 ; Convert two ASCII characters from X-Reg into HEX
0246+ 0000 HEX2COL = $EDEF ; Output HEX value from A to next matrix column
0247+ 0000 GPRNT_A_2LCD = $EDF6 ; Output of A as a GRPRINT (bit pattern) on LCD
0248+ 0000 MATRIX_PTR2XREG = $EE1F ; Calculates matrix column address from matrix pointer, to X-Reg.
0249+ 0000 MATRIX_A2XREG = $EE22 ; Calculated matrix column address from A, to X-Reg
0250+ 0000 SAVELCD2BUF = $EE80 ; Save LCD to buffer
0251+ 0000 BUF2LCD = $EE99 ; Transfer buffer to LCD
0252+ 0000 ARX2STRNG = $EF1B ; Convert AR-X to string
0253+ 0000 TXT2LCD = $EF44 ; Output text on LCD display.
0254+ 0000 TXT2LCD_ARY = $EF5B ; Output text on LCD from AR-Y to 7AXL
0255+ 0000 PREPLCDOUT = $EF67 ; Prepare the LCD output
0256+ 0000 PC1500_DIV_RESET = $F004 ; PC1500_DIVIDER_RESET (CE1)
0257+ 0000 PC1500_UREG_OUTP = $F005 ; PC1500_U_REG_OUTPUT (CE1)
0258+ 0000 PC1500_SER_XFR = $F006 ; PC1500_SERIAL_XFR (CE1)
0259+ 0000 PC1500_F_REG = $F007 ; PC1500_F_REG_LD/DIV (CE1)
0260+ 0000 PC1500_PRT_C = $F008 ; PC1500_PRT_C (CE1)
0261+ 0000 PC1500_G_REG = $F009 ; PC1500_G_REG (CE1)
0262+ 0000 PC1500_MSK_REG = $F00A ; PC1500_MSK_REG (CE1)
0263+ 0000 PC1500_IF_REG = $F00B ; PC1500_IF_REG (CE1)
0264+ 0000 PC1500_PRT_A_DIR = $F00C ; PC1500_PRT_A_DIR (CE1)
0265+ 0000 PC1500_PRT_B_DIR = $F00D ; PC1500_PRT_B_DIR (CE1)
0266+ 0000 PC1500_PRT_A = $F00E ; PC1500_PRT_A (CE1)
0267+ 0000 PC1500_PRT_B = $F00F ; PC1500_PRT_B (CE1)
0268+ 0000 TOKENIZE_INBUF = $F957 ; Tokenizer. Convert input buffer to program line.
0006 0000 #INCLUDE "lib/CE-155.lib"
0001+ 0000 ; CE-155 library file
0002+ 0000 RAM_ST = $2000 ; Start of RAM w/CE-155, 8K RAM module
0003+ 0000 RESMEM_ST = $2008 ; Reserve memroy area w/CE-155 (2008-20C4)
0004+ 0000 PRGMEM_ST = $20C5 ; Start of program memory w/CE-155
0007 0000 #INCLUDE "lib/PC-1500_Macros.lib"
0001+ 0000 ; PC-1500 Macros
0002+ 0000 ;------------------------------------------------------------------------------------------------------------
0003+ 0000 ; Assembly macros used to encode arguments for lh5801 'macros' that take arguments inline after CALL
0004+ 0000 #define EQU .EQU
0005+ 0000
0006+ 0000 COMMA: EQU $2C ; ',' used for macros
0007+ 0000 CR: EQU $0D ; '/CR' used for macros
0008+ 0000 DASH: EQU $2D ; '-' used for macros
0009+ 0000 HASH: EQU $23 ; '#' used for macros
0010+ 0000 SEMI: EQU $3B ; ';' used for macros
0011+ 0000 QUOTE: EQU $22 ; '-' used for macros
0012+ 0000 DOLLAR: EQU $24 ; '#' used for macros
0013+ 0000 PERCENT: EQU $25 ; ';' used for macros
0014+ 0000
0015+ 0000
0016+ 0000 TOK_OFF: EQU $F19E ; OFF command token
0017+ 0000 TOK_ON: EQU $F19C ; ON command token
0018+ 0000 TOK_TAB: EQU $F0BB ; TAB command token
0019+ 0000 TOK_USING: EQU $F085 ; USING command token
0020+ 0000
0021+ 0000
0022+ 0000 #define ABRF(n8) .BYTE n8 - $ - 1 ; calculate forward branch
0023+ 0000 #define ABYT(n8) .BYTE n8 ; use byte verbatium
0024+ 0000 #define ABYTL(n16) .BYTE n16 & $FF ; use byte verbatium
0025+ 0000 #define ACHR(ch) .BYTE ch ; character
0026+ 0000 #define AWRD(n16) .WORD n16 ; use word value verbatum
0027+ 0000 #define CNIB(n81,n82) .BYTE ((n81 & $F0) | (n82 & $0F)) ; calculates control nibble
0028+ 0000 #define HB(n16) (n16 >> 8) ; Return HB of 16bit value
0029+ 0000 #define LB(n16) (n16 & $FF) ; Return HB of 16bit value
0030+ 0000
0031+ 0000 .MSFIRST
0008 0000
0009 0000 ; Calculate file length for header Last-.ORG + header length - 1
0010 0000 ; 4184-3800-1 = 0983
0011 0000 ;
0012 0000 ; Offset from start of bin file to address: 3800 + bin_file_add - 1B
0013 0000
0014 0000 ;------------------------------------------------------------------------------
0015 0000 ; CE-158 Header
0016 0000 ;------------------------------------------------------------------------------
0017 0000 CE158_Header:
0018 0000 01 .BYTE $01 \ .TEXT "BCOM" ; CE-158 header
0018 0001 42 43 4F 4D
0019 0005 42 41 53 49 .TEXT "BASIC1501" \ .FILL 7,$00 ; FILL (16 - NAME_LENGTH),$00
0019 0009 43 31 35 30
0019 000D 31
0019 000E 00 00 00 00
0019 0012 00 00 00
0020 0015 38 00 .WORD $3800 ; same as .ORG
0021 0017 09 83 .WORD $0983 ; Length of output in bytes
0022 0019 FF FF .WORD $FFFF ; Filler
0023 001B
0024 001B
0025 3800 .ORG $3800
0026 3800
0027 3800 ;------------------------------------------------------------------------------
0028 3800 ; Filler from $3000~$3807
0029 3800 ;------------------------------------------------------------------------------
0030 3800 FILLER_3800:
0031 3800 10 01 40 96 .BYTE $10, $01, $40, $96, $60, $00, $01, $00
0031 3804 60 00 01 00
0032 3808
0033 3808 ;------------------------------------------------------------------------------
0034 3808 ; $3808 is start of Resereve memory area with CE-155 8K expansion
0035 3808 ;------------------------------------------------------------------------------
0036 3808 ; 3808 .RES_I " DUM MOK HEX HVAL LOW HIG ":
0037 3808 RES_I:
0038 3808 20 44 55 4D .TEXT " DUM MOK"
0038 380C 20 4D 4F 4B
0039 3810 20 48 45 58 .TEXT " HEX HVA"
0039 3814 20 48 56 41
0040 3818 4C 20 4C 4F .TEXT "L LOW HI"
0040 381C 57 20 48 49
0041 3820 47 .TEXT "G"
0042 3821 00 .BYTE $00
0043 3822
0044 3822 ; 3822 .RES_II " STR CAP INS $ APO & ":
0045 3822 RES_II:
0046 3822 20 53 54 52 .TEXT " STR CAP"
0046 3826 20 43 41 50
0047 382A 20 49 4E 53 .TEXT " INS $ "
0047 382E 20 20 24 20
0048 3832 20 41 50 4F .TEXT " APO &"
0048 3836 20 20 26
0049 3839 00 00 00 .BYTE $00, $00, $00
0050 383C
0051 383C ; 383C .RES_III " DIS SET RST ASK INV TBL ":
0052 383C RES_III:
0053 383C 20 44 49 53 .TEXT " DIS SET"
0053 3840 20 53 45 54
0054 3844 20 52 53 54 .TEXT " RST ASK"
0054 3848 20 41 53 4B
0055 384C 20 49 4E 56 .TEXT " INV TBL"
0055 3850 20 54 42 4C
0056 3854 00 00 .BYTE $00, $00
0057 3856
0058 3856
0059 3856 RESREG_I.F1: ; 3856
0060 3856 01 F0 64 .BYTE $01, $F0, $64
0061 3859
0062 3859 RESREG_I.F2: ; 3859
0063 3859 02 F0 A1 .BYTE $02, $F0, $A1
0064 385C
0065 385C RESREG_I.F3: ; 385C
0066 385C 03 F0 63 .BYTE $03, $F0, $63
0067 385F
0068 385F RESREG_I.F4: ; 385F
0069 385F 04 F0 67 .BYTE $04, $F0, $67
0070 3862
0071 3862 RESREG_I.F5: ; 3862
0072 3862 05 F0 65 .BYTE $05, $F0, $65
0073 3865
0074 3865 RESREG_I.F6: ; 3865
0075 3865 06 F0 66 .BYTE $06, $F0, $66
0076 3868
0077 3868 RESREG_II.F1: ; 3868
0078 3868 11 F0 68 .BYTE $11, $F0, $68
0079 386B
0080 386B RESREG_II.F2: ; 386B
0081 386B 12 F0 62 .BYTE $12, $F0, $62
0082 386E
0083 386E RESREG_II.F3_SPACE_STR: ; 386E
0084 386E 13 F0 61 .BYTE $13, $F0, $61
0085 3871
0086 3871 RESREG_III.F1: ; 3871
0087 3871 09 F0 81 .BYTE $09, $F0, $81
0088 3874
0089 3874 RESREG_III.F2: ; 3874
0090 3874 0A F0 83 .BYTE $0A, $F0, $83
0091 3877
0092 3877 RESREG_III.F3: ; 3877
0093 3877 0B F0 86 .BYTE $0B, $F0, $86
0094 387A
0095 387A RESREG_III.F4: ; 387A
0096 387A 0C F0 60 .BYTE $0C, $F0, $60
0097 387D
0098 387D RESREG_III.F5: ; 387D
0099 387D 0D F0 A3 .BYTE $0D, $F0, $A3
0100 3880
0101 3880 RESREG_III.F6: ; 3880
0102 3880 0E F0 56 .BYTE $0E, $F0, $56
0103 3883
0104 3883 RESREG_II.F5: ; 3883 CALL&E33F@:
0105 3883 15 F1 8A 26 .BYTE $15,$F1,$8A,$26,$45,$33,$33,$46, $40,$16,$26,$00,$00,$00,$00,$00
0105 3887 45 33 33 46
0105 388B 40 16 26 00
0105 388F 00 00 00 00
0106 3893 00 00 00 00 .BYTE $00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00
0106 3897 00 00 00 00
0106 389B 00 00 00 00
0106 389F 00 00 00 00
0107 38A3 00 00 00 00 .BYTE $00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00
0107 38A7 00 00 00 00
0107 38AB 00 00 00 00
0107 38AF 00 00 00 00
0108 38B3 00 00 00 00 .BYTE $00,$00,$00,$00,$00,$00,$00,$00, $00,$00,$00,$00,$00,$00,$00,$00
0108 38B7 00 00 00 00
0108 38BB 00 00 00 00
0108 38BF 00 00 00 00
0109 38C3 00 00 .BYTE $00,$00
0110 38C5
0111 38C5
0112 38C5
0113 38C5 ;------------------------------------------------------------------------------
0114 38C5 ; BASIC command - DELETE a number of lines
0115 38C5 ; DELETE n,p - from n to p inclusive
0116 38C5 ; DELETE n - from n
0117 38C5 ; DELETE p - up to p
0118 38C5 ;------------------------------------------------------------------------------
0119 38C5 DELETE: ; 38C5
0120 38C5 C2 VEJ (C2) \\ ; If next character is not 2C ',' then branch fwd BRANCH_38CE
0120 38C6
0120 38C6
0121 38C6 2C ACHR(COMMA) \\ ;
0121 38C7
0121 38C7
0122 38C7 06 ABRF(BRANCH_38CE) ;
0123 38C8 CC VEJ (CC) ; Loads X-Reg with address at 78(65) 78(66) (Start of BASIC prg)
0124 38C9 65 ABYTL($7865) ;
0125 38CA FD 88 PSH X ;
0126 38CC 8E 0E BCH BRANCH_38DC ;
0127 38CE
0128 38CE BRANCH_38CE: ; 38CE
0129 38CE C6 VEJ (C6) ; Decrements Y-Reg by 2 bytes for tokens, 1 byte for characters in U-Reg
0130 38CF DE VEJ (DE) ; Calculates formula to which Y points,
0131 38D0 3D ABRF(BRANCH_390E) ; passes result to AR-X. Jump FWD (n) if error
0132 38D1 D0 VEJ (D0) \\ ; Convert AR-X to integer & load to U-Reg. A1 specifies the range.
0132 38D2
0132 38D2
0133 38D2 00 ABYT($00) \\ ; If range exceeded: Branch fwd BRANCH_390E
0133 38D3
0133 38D3
0134 38D3 3A ABRF(BRANCH_390E) ;
0135 38D4 BE 39 10 SJP SUB_3910 ;
0136 38D7 FD A8 PSH U ;
0137 38D9 C2 VEJ (C2) \\ ; If next character is not 2C ',' then branch fwd BRANCH_3902
0137 38DA
0137 38DA
0138 38DA 2C ACHR(COMMA) \\ ;
0138 38DB
0138 38DB
0139 38DB 26 ABRF(BRANCH_3902) ;
0140 38DC
0141 38DC BRANCH_38DC: ; 38DC
0142 38DC DE VEJ (DE) \\ ; Calculates formula to which Y points,
0142 38DD
0142 38DD
0143 38DD 30 ABRF(BRANCH_390E) ; passes result to AR-X. Jump FWD (n) if error
0144 38DE D0 VEJ (D0) \\ ; Convert AR-X to integer & load to U-Reg. A1 specifies the range.
0144 38DF
0144 38DF
0145 38DF 00 ABYT($00) \\ ; If range exceeded: Branch fwd BRANCH_38EE
0145 38E0
0145 38E0
0146 38E0 2D ABRF(BRANCH_390E) ;
0147 38E1 64 INC U ;
0148 38E2 BE 39 10 SJP SUB_3910 ;
0149 38E5
0150 38E5 BRANCH_38E5: ; 38E5
0151 38E5 FD 0A POP X ;
0152 38E7 FD 98 PSH Y ;
0153 38E9 FD 5A STX Y ;
0154 38EB CC VEJ (CC) \\ ; Loads X-Reg with address at 78(67) 78(68) (End of BASIC RAM (H))
0154 38EC
0154 38EC
0155 38EC 67 ABYTL($7867) ;
0156 38ED 56 DEC Y ;
0157 38EE
0158 38EE BRANCH_38EE: ; 38EE
0159 38EE 66 DEC U ;
0160 38EF
0161 38EF BRANCH_38EF: ; 38EF
0162 38EF 65 LIN U ;
0163 38F0 51 SIN Y ;
0164 38F1 A4 LDA UH ;
0165 38F2 86 CPA XH ;
0166 38F3 99 06 BZR BRANCH_38EF ;
0167 38F5
0168 38F5 24 LDA UL ;
0169 38F6 06 CPA XL ;
0170 38F7 99 0A BZR BRANCH_38EF ;
0171 38F9
0172 38F9 25 LDA (U) ;
0173 38FA 1E STA (Y) ;
0174 38FB FD 18 LDX Y ;
0175 38FD CA VEJ (CA) \\ ; Transfers X to 78(67), 78(68). (End of BASIC RAM (H))
0175 38FE
0175 38FE
0176 38FE 67 ABYTL($7867) ;
0177 38FF FD 1A POP Y ;
0178 3901 E2 VEJ (E2) ; BASIC interpreter: Y-Reg points to command or line end
0179 3902
0180 3902 BRANCH_3902: ; 3902
0181 3902 C6 VEJ (C6) ; Decrements Y-Reg by 2 bytes for tokens, 1 byte for characters in U-Reg
0182 3903 C2 VEJ (C2) \\ ; If next character is not 0D 'CR' then branch fwd BRANCH_390C
0182 3904
0182 3904
0183 3904 0D ACHR(CR) \\ ;
0183 3905
0183 3905
0184 3905 06 ABRF(BRANCH_390C) ;
0185 3906 CC VEJ (CC) \\ ; Loads X-Reg with address at 78(67) 78(68) (End of BASIC RAM (H))
0185 3907
0185 3907
0186 3907 67 ABYTL($7867) ;
0187 3908 FD 6A STX U ;
0188 390A 9E 27 BCH BRANCH_38E5 ;
0189 390C
0190 390C BRANCH_390C: ; 390C
0191 390C C6 VEJ (C6) ; Decrements Y-Reg by 2 bytes for tokens, 1 byte for characters in U-Reg
0192 390D E2 VEJ (E2) ; BASIC interpreter: Y-Reg points to command or line end
0193 390E
0194 390E BRANCH_390E: ; 390E
0195 390E E0 VEJ (E0) ; Output error from UH
0196 390F 8B .BYTE $8B ; Orphan?
0197 3910
0198 3910
0199 3910
0200 3910 ;------------------------------------------------------------------------------
0201 3910 ; SUB_3910 - Used by DELETE command
0202 3910 ;
0203 3910 ;------------------------------------------------------------------------------
0204 3910 SUB_3910: ; 3910
0205 3910 CC VEJ (CC) \\ ; Loads X-Reg with address at 78(65) 78(66) (Start of BASIC program)
0205 3911
0205 3911
0206 3911 65 ABYTL($7865) ;
0207 3912
0208 3912 BRANCH_3912: ; 3912
0209 3912 05 LDA (X) ;
0210 3913 B7 FF CPI A,$FF ;
0211 3915 8B 06 BZS BRANCH_391D ;
0212 3917 05 LDA (X) ;
0213 3918 A6 CPA UH ;
0214 3919 81 0C BCR BRANCH_3927 ;
0215 391B 8B 03 BZS BRANCH_3920 ;
0216 391D
0217 391D BRANCH_391D: ; 391D
0218 391D FD 6A STX U ;
0219 391F 9A RTN ; Done, return
0220 3920
0221 3920
0222 3920 BRANCH_3920: ; 3920
0223 3920 44 INC X ;
0224 3921 47 LDE X ;
0225 3922 26 CPA UL ;
0226 3923 81 02 BCR BRANCH_3927 ;
0227 3925 9E 0A BCH BRANCH_391D ;
0228 3927
0229 3927 BRANCH_3927:
0230 3927 44 INC X ;
0231 3928 44 INC X ;
0232 3929 05 LDA (X) ;
0233 392A DD INC A ;
0234 392B F9 REC ;
0235 392C FD CA ADR X ;
0236 392E 9E 1E BCH BRANCH_3912 ;
0237 3930
0238 3930
0239 3930
0240 3930 ;------------------------------------------------------------------------------
0241 3930 ; BASIC command - DISP n
0242 3930 ; Used after a PRINT; allows the display of more than 26 characters
0243 3930 ; (automatic shift of the string on the screen).
0244 3930 ;------------------------------------------------------------------------------
0245 3930 DISP:
0246 3930 DE VEJ (DE) \\ ; Calculates formula to which Y points,
0246 3931
0246 3931
0247 3931 37 ABRF(BRANCH_3969) ; passes result to AR-X. Jump FWD (n) if error
0248 3932 D0 VEJ (D0) \\ ; Convert AR-X to integer & load to U-Reg. A1 specifies the range.
0248 3933
0248 3933
0249 3933 00 ABYT($00) \\ ; If range exceeded: Branch fwd A2
0249 3934
0249 3934
0250 3934 34 ABRF(BRANCH_3969) ;
0251 3935 AE 78 73 STA (WAIT_CTR_L) ;
0252 3938
0253 3938 BRANCH_3938:
0254 3938 48 7B LDI XH,HB(OUT_BUF+1) ; OUT_BUF+1 High Byte
0255 393A 4A 61 LDI XL,LB(OUT_BUF+1) ; OUT_BUF+1 Low Byte
0256 393C
0257 393C BRANCH_393C: ; Shifts Output Buffer 1 char left
0258 393C 47 LDE X ; A = (X), then X = X - 1
0259 393D 41 SIN X ; (X) = A, then X = X + 1
0260 393E 44 INC X ;
0261 393F 4E B0 CPI XL,$B0 ;
0262 3941 99 07 BZR BRANCH_393C ;
0263 3943
0264 3943 BE EC AE SJP INIT_CURS ; Initializes cursor parameters.
0265 3946 BE EC FA SJP OUTBUF2LCD ; Output 26 characters in Output Buffer to LCD
0266 3949
0267 3949 BRANCH_3949:
0268 3949 BE E4 2C SJP KEY2ASCII ; Return ASCII code of key pressed in A. If no key: C=1.
0269 394C B7 18 CPI A,$18 ; CL key.
0270 394E 8B 18 BZS BRANCH_3968 ; Branch if equal
0271 3950
0272 3950 B7 20 CPI A,$20 ; Space key
0273 3952 9B 0B BZS BRANCH_3949 ; Branch if equal
0274 3954
0275 3954 B7 0C CPI A,$0C ; Right arrow
0276 3956 8B 0B BZS BR_DISP_RA ; Skips pause and scroll now (***Fixed from original)
0277 3958 A5 78 73 LDA (WAIT_CTR_L) ; Load delay value
0278 395B 2A STA UL ;
0279 395C
0280 395C BRANCH_395C:
0281 395C B5 FF LDI A,$FF ; $FF is 1 unit of delay
0282 395E
0283 395E BRANCH_395E:
0284 395E DF DEC A ;
0285 395F 99 03 BZR BRANCH_395E ;
0286 3961 88 07 LOP UL,BRANCH_395C ; Delay loop
0287 3963
0288 3963 BR_DISP_RA:
0289 3963 A5 7B 7A LDA (OUT_BUF + $1A) ;
0290 3966 99 30 BZR BRANCH_3938 ; If we are not at end of text, keep scrolling
0291 3968
0292 3968 BRANCH_3968:
0293 3968 E2 VEJ (E2) ; BASIC interpreter: Y-Reg points to command or line end
0294 3969
0295 3969 BRANCH_3969:
0296 3969 E0 VEJ (E0) ; Output error from UH
0297 396A
0298 396A ; Filler
0299 396A FILLER_396A:
0300 396A 00 00 00 00 .BYTE $00, $00, $00, $00 ; filler
0301 396E
0302 396E
0303 396E
0304 396E ;------------------------------------------------------------------------------
0305 396E ; BASIC command - RENUM renumbering of lines from 10 by 10.
0306 396E ;------------------------------------------------------------------------------
0307 396E RENUM:
0308 396E FD 98 PSH Y ;
0309 3970 CC VEJ (CC) ; Loads X-Reg with address at 78(65) 78(66) (Start of BASIC in RAM)
0310 3971 65 ABYTL($7865) ;
0311 3972 58 00 LDI YH,$00 ;
0312 3974 5A 00 LDI YL,$00 ;
0313 3976
0314 3976 BRANCH_3976:
0315 3976 B5 FF LDI A,$FF ;
0316 3978 07 CPA (X) ;
0317 3979 89 03 BZR BRANCH_397E ;
0318 397B
0319 397B FD 1A POP Y ;
0320 397D E2 VEJ (E2) ; Return to BASIC interpreter: Y-Reg points to command or line end
0321 397E
0322 397E BRANCH_397E:
0323 397E B5 0A LDI A,$0A ;
0324 3980 F9 REC ;
0325 3981 FD DA ADR Y ;
0326 3983 94 LDA YH ;
0327 3984 41 SIN X ;
0328 3985 14 LDA YL ;
0329 3986 41 SIN X ;
0330 3987 05 LDA (X) ;
0331 3988 DD INC A ;
0332 3989 FD CA ADR X ;
0333 398B 9E 17 BCH BRANCH_3976 ;
0334 398D
0335 398D
0336 398D ; Filler
0337 398D FILLER_398D:
0338 398D 00 00 00 .BYTE $00, $00, $00 ; filler
0339 3990
0340 3990
0341 3990
0342 3990 ;------------------------------------------------------------------------------
0343 3990 ; COL2BITPOS - Helper for LCD commands
0344 3990 ; (RND_VAL) = R, (RND_VAL + 1) = C, (RND_VAL + 2) = Contigious LCD column
0345 3990 ;------------------------------------------------------------------------------
0346 3990 COL2BITPOS:
0347 3990 BE EE 22 SJP MATRIX_A2XREG ; Calculated matrix LCD column address from A, to X-Reg
0348 3993 4C 76 CPI XH,$76 ;
0349 3995 83 0E BCS BRANCH_39A5 ; if HB of address >= $76 branch
0350 3997 45 LIN X ; Load this byte of LCD RAM
0351 3998 B9 0F ANI A,$0F ; Clear high nibble
0352 399A 2A STA UL ; Save it
0353 399B 45 LIN X ; Do same for next address
0354 399C B9 0F ANI A,$0F ;
0355 399E F1 AEX ; Swap nibbles in A
0356 399F
0357 399F BRANCH_399F:
0358 399F F9 REC ; Reset carry
0359 39A0 22 ADC UL ; Add two nibbles, make contigious byte from split one?
0360 39A1 AE 7B 02 STA (RND_VAL + 2) ; Contigious LCD RAM column
0361 39A4 9A RTN ; Done, return
0362 39A5
0363 39A5 BRANCH_39A5:
0364 39A5 45 LIN X ; Load A with byte of LCD RAM
0365 39A6 B9 F0 ANI A,$F0 ; Clear low nibble
0366 39A8 F1 AEX ; Swap nibbles in A
0367 39A9 2A STA UL ; Save it
0368 39AA 45 LIN X ; Load A with next byte of LCD RAM
0369 39AB B9 F0 ANI A,$F0 ; Clear low nibble
0370 39AD 9E 10 BCH BRANCH_399F ; Make one nibble from two and return
0371 39AF
0372 39AF
0373 39AF
0374 39AF ;------------------------------------------------------------------------------
0375 39AF ; BASIC command - SET Row,Column: turn on pixel, row R (0 to 6), column C (0 to 155).
0376 39AF ; (RND_VAL) = R, (RND_VAL + 1) = C, (RND_VAL + 2) = Contigious LCD column
0377 39AF ; Example:
0378 39AF ; 10 WAIT:PRINT"3,64 = 0"
0379 39AF ; 20 SET 3,64:A = ASK(3,64)
0380 39AF ; 30 WAIT 0:PRINT "3,64 =";A:SET 3,64
0381 39AF ; 40 A$=INKEY$:IF A$ = "" THEN GOTO 40
0382 39AF ; 50 RESET 3,64:A = ASK(3,64)
0383 39AF ; 60 WAIT: PRINT "3,64 =";A
0384 39AF ; 70 END
0385 39AF ;------------------------------------------------------------------------------
0386 39AF SET: ; 39AF
0387 39AF BE 3D C5 SJP PARSE_INT_INT ; Saves L, C to (RND_VAL) and (RND_VAL + 1)
0388 39B2 FD 98 PSH Y ; Not sure what Y is here
0389 39B4 BE 39 90 SJP COL2BITPOS ; (RND_VAL + 2) = Contigious LCD RAM column
0390 39B7 BE 3A 17 SJP ROW2BITPOS ; A = 2 ^ ROW?
0391 39BA
0392 39BA AB 7B 02 ORA (RND_VAL + 2) ; Set ROW bit?
0393 39BD FD C8 PSH A ;
0394 39BF A5 7B 01 LDA (RND_VAL + 1) ; A = Column
0395 39C2 BE EE 22 SJP MATRIX_A2XREG ; Calculated LCD column address from A, save to X
0396 39C5 FD 8A POP A ;
0397 39C7 BE ED F6 SJP GPRNT_A_2LCD ; Output of A as a GRPRINT (bit pattern) on LCD
0398 39CA FD 1A POP Y ;
0399 39CC E2 VEJ (E2) ; BASIC interpreter: Y-Reg points to command or line end
0400 39CD
0401 39CD
0402 39CD
0403 39CD ;------------------------------------------------------------------------------
0404 39CD ; BASIC command - RESET Row,Column:: turns off pixel. Row R (0 to 6), Column C (0 to 155)
0405 39CD ; (RND_VAL) = R, (RND_VAL + 1) = C, (RND_VAL + 2) = Contigious LCD column
0406 39CD ; Example:
0407 39CD ; 10 WAIT:PRINT"3,64 = 0"
0408 39CD ; 20 SET 3,64:A = ASK(3,64)
0409 39CD ; 30 WAIT 0:PRINT "3,64 =";A:SET 3,64
0410 39CD ; 40 A$=INKEY$:IF A$ = "" THEN GOTO 40
0411 39CD ; 50 RESET 3,64:A = ASK(3,64)
0412 39CD ; 60 WAIT: PRINT "3,64 =";A
0413 39CD ; 70 END
0414 39CD ;------------------------------------------------------------------------------
0415 39CD RESET: ; 39CD
0416 39CD BE 3D C5 SJP PARSE_INT_INT ; Saves R, C to (RND_VAL) and (RND_VAL + 1)
0417 39D0 FD 98 PSH Y ;
0418 39D2 BE 39 90 SJP COL2BITPOS ;
0419 39D5 BE 3A 17 SJP ROW2BITPOS ;
0420 39D8 A9 7B 02 AND (RND_VAL + 2) ; (RND_VAL + 2) = Contigious LCD column
0421 39DB BD FF EAI $FF ;
0422 39DD
0423 39DD BRANCH_39DD:
0424 39DD A9 7B 02 AND (RND_VAL + 2) ; (RND_VAL + 2) = Contigious LCD column
0425 39E0 FD C8 PSH A ;
0426 39E2 A5 7B 01 LDA (RND_VAL + 1) ; (RND_VAL + 1) = C
0427 39E5 BE EE 22 SJP MATRIX_A2XREG ; Calculated matrix column address from A, to X-Reg
0428 39E8 FD 8A POP A ;
0429 39EA BE ED F6 SJP GPRNT_A_2LCD ; Output of A as a GRPRINT (bit pattern) on LCD
0430 39ED FD 1A POP Y ;
0431 39EF E2 VEJ (E2) ; BASIC interpreter: Y-Reg points to command or line end
0432 39F0
0433 39F0
0434 39F0
0435 39F0 ;------------------------------------------------------------------------------
0436 39F0 ; BASIC command - ASK (R,C) Returns 1 if the dot is on, 0 otherwise.
0437 39F0 ; Row R (0 to 6), Column C (0 to 155).
0438 39F0 ; (RND_VAL) = R, (RND_VAL + 1) = C, (RND_VAL + 2) = Contigious LCD column
0439 39F0 ; Example:
0440 39F0 ; 10 WAIT:PRINT"3,64 = 0"
0441 39F0 ; 20 SET 3,64:A = ASK(3,64)
0442 39F0 ; 30 WAIT 0:PRINT "3,64 =";A:SET 3,64
0443 39F0 ; 40 A$=INKEY$:IF A$ = "" THEN GOTO 40
0444 39F0 ; 50 RESET 3,64:A = ASK(3,64)
0445 39F0 ; 60 WAIT: PRINT "3,64 =";A
0446 39F0 ; 70 END
0447 39F0 ;------------------------------------------------------------------------------
0448 39F0 ASK: ; 39F0
0449 39F0 D0 VEJ (D0) \\ ; Convert AR-X to integer & save to U-Reg. A1 specifies the range.
0449 39F1
0449 39F1
0450 39F1 08 ABYT($08) \\ ; *** Fixed range from original
0450 39F2
0450 39F2
0451 39F2 00 ABRF(BRANCH_39F3) ; If range exceeded: Branch fwd
0452 39F3
0453 39F3 BRANCH_39F3:
0454 39F3 ;LDA UL
0455 39F3 AE 7B 01 STA (RND_VAL + 1) ; Not sure what A is here
0456 39F6 CD 30 VMJ $30 ; Get AR-X from Basic Stack
0457 39F8 D0 VEJ (D0) \\ ; Convert AR-X to integer & load to U-Reg. A1 specifies the range.
0457 39F9
0457 39F9
0458 39F9 08 ABYT($08) \\ ; *** Fixed range from original
0458 39FA
0458 39FA
0459 39FA 00 ABRF(BRANCH_39FB) ; If range exceeded: Branch fwd
0460 39FB
0461 39FB BRANCH_39FB:
0462 39FB ;LDA UL
0463 39FB AE 7B 00 STA (RND_VAL) ; (RND_VAL) = R
0464 39FE FD 98 PSH Y ;
0465 3A00 A5 7B 01 LDA (RND_VAL + 1) ; (RND_VAL + 1) = C
0466 3A03
0467 3A03 BE 39 90 SJP COL2BITPOS ;
0468 3A06 BE 3A 17 SJP ROW2BITPOS ; Returns position in A
0469 3A09 A9 7B 02 AND (RND_VAL + 2) ; (RND_VAL + 2) = Contigious LCD column
0470 3A0C B7 00 CPI A,$00 ;
0471 3A0E 8B 02 BZS BRANCH_3A12 ;
0472 3A10 B5 01 LDI A,$01 ;
0473 3A12
0474 3A12 BRANCH_3A12:
0475 3A12 FD 1A POP Y ;
0476 3A14 BA D9 E4 JMP (BCMD_LEN + 13) ; Jumps into middle of Basic command LEN / ASC
0477 3A17
0478 3A17
0479 3A17
0480 3A17 ;------------------------------------------------------------------------------
0481 3A17 ; ROW2BITPOS - Helper for LCD commands
0482 3A17 ; (RND_VAL) = R, (RND_VAL + 1) = C, Returns position in A
0483 3A17 ;------------------------------------------------------------------------------
0484 3A17 ROW2BITPOS:
0485 3A17 A5 7B 00 LDA (RND_VAL) ; A = ROW
0486 3A1A 2A STA UL ; UL = ROW
0487 3A1B B5 01 LDI A,$01 ;
0488 3A1D
0489 3A1D BRANCH_3A1D:
0490 3A1D D9 SHL ; A = 2
0491 3A1E 88 03 LOP UL,BRANCH_3A1D ;
0492 3A20 D5 SHR ;
0493 3A21 9A RTN ; A = 2 ^ ROW?
0494 3A22
0495 3A22
0496 3A22
0497 3A22 ;------------------------------------------------------------------------------
0498 3A22 ; BASIC command - INSTR (string 1, string 2, n)
0499 3A22 ; Returns the position of string 2 in string 1 starting at position n.
0500 3A22 ; Example:
0501 3A22 ; A=INSTR("PASCAL","S",0) A=3
0502 3A22 ; A=INSTR("COUCOU","0",3) A=5
0503 3A22 ; A=INSTR("BONJOUR","B",2) A=0
0504 3A22 ;------------------------------------------------------------------------------
0505 3A22 INSTR: ; 3A22
0506 3A22 D0 VEJ (D0) \\ ; Convert AR-X to integer & load to U-Reg. A1 specifies the range.
0506 3A23
0506 3A23
0507 3A23 08 ABYT($08) \\ ; If range exceeded: Branch fwd A2
0507 3A24
0507 3A24
0508 3A24 E0 ABRF(BRANCH_3905) ;
0509 3A25 AE 7B 00 STA (RND_VAL) ; Random number buffer used for misc buffer
0510 3A28 CD 30 VMJ $30 ; Get AR-X from basic stack
0511 3A2A DC VEJ (DC) ; Load CSI from AR-X to X-Reg
0512 3A2B FD 88 PSH X ;
0513 3A2D FD C8 PSH A ;
0514 3A2F F9 REC ;
0515 3A30 02 ADC XL ;
0516 3A31 2A STA UL ;
0517 3A32 FD A8 PSH U ;
0518 3A34 CD 30 VMJ $30 ; Get AR-X from basic stack
0519 3A36 DC VEJ (DC) ; Load CSI from AR-X to X-Reg
0520 3A37 FD 2A POP U ;
0521 3A39 A7 7B 00 CPA (RND_VAL) ; Random number buffer used for misc buffer
0522 3A3C 83 03 BCS BRANCH_3A41 ;
0523 3A3E AE 7B 00 STA (RND_VAL) ; Random number buffer used for misc buffer
0524 3A41
0525 3A41 BRANCH_3A41:
0526 3A41 FD 8A POP A ;
0527 3A43 FD 0A POP X ;
0528 3A45 FB SEC ;
0529 3A46 00 SBC XL ;
0530 3A47 BD FF EAI $FF ; A = A ^ n
0531 3A49 DD INC A ;
0532 3A4A DD INC A ;
0533 3A4B 28 STA UH ;
0534 3A4C 04 LDA XL ;
0535 3A4D AE 78 72 STA (WAIT_CTR_H) ;
0536 3A50 48 7B LDI XH,HB(STR_BUF) ; STR_BUF+1 High Byte
0537 3A52 4A 10 LDI XL,LB(STR_BUF) ; STR_BUF+1 LowByte
0538 3A54 A5 7B 00 LDA (RND_VAL) ; Random number buffer used for misc buffer
0539 3A57 F9 REC ;
0540 3A58 FD CA ADR X ;
0541 3A5A 46 DEC X ;
0542 3A5B FD 98 PSH Y ;
0543 3A5D
0544 3A5D BRANCH_3A5D:
0545 3A5D FD 88 PSH X ;
0546 3A5F 58 7B LDI YH,$7B ;
0547 3A61 A5 78 72 LDA (WAIT_CTR_H) ;
0548 3A64 1A STA YL ;
0549 3A65
0550 3A65 BRANCH_3A65:
0551 3A65 45 LIN X ;
0552 3A66 17 CPA (Y) ;
0553 3A67 89 09 BZR BRANCH_3A72 ;
0554 3A69 54 INC Y ;
0555 3A6A 14 LDA YL ;
0556 3A6B 26 CPA UL ;
0557 3A6C 99 09 BZR BRANCH_3A65 ;
0558 3A6E FD 0A POP X ;
0559 3A70 8E 09 BCH BRANCH_3A7B ;
0560 3A72
0561 3A72 BRANCH_3A72:
0562 3A72 FD 0A POP X ;
0563 3A74 44 INC X ;
0564 3A75 04 LDA XL ;
0565 3A76 A6 CPA UH ;
0566 3A77 99 1C BZR BRANCH_3A5D ;
0567 3A79 4A 0F LDI XL,$0F ;
0568 3A7B
0569 3A7B BRANCH_3A7B:
0570 3A7B FD 1A POP Y ;
0571 3A7D 04 LDA XL ;
0572 3A7E FB SEC ;
0573 3A7F B1 0F SBI A,$0F ;
0574 3A81 BA D9 E4 JMP (BCMD_LEN + 13) ; Jumps into middle of Basic command LEN / ASC
0575 3A84
0576 3A84
0577 3A84
0578 3A84 ;------------------------------------------------------------------------------
0579 3A84 ; BASIC command - BEGIN (STACK, BEGIN, UNTIL)
0580 3A84 ; STACK resets the stack to zero, mandatory at the beginning of the program,
0581 3A84 ; otherwise the machine can be crashed.
0582 3A84 ; BEGIN: statement ... : UNTIL condition
0583 3A84 ; returns after the BEGIN as long as the condition is false or <>0
0584 3A84 ; Example
0585 3A84 ; 10 STACK
0586 3A84 ; 20 BEGIN: A=A+1
0587 3A84 ; 30 UNTIL A=10
0588 3A84 ;------------------------------------------------------------------------------
0589 3A84 BEGIN:
0590 3A84 A5 3A D0 LDA (BU_STACK + 2) ; BU_STACK is BEGIN/UNTIL Stack
0591 3A87 B7 E5 CPI A,$E5 ;
0592 3A89 89 03 BZR BRANCH_3A8E ;
0593 3A8B 68 0E LDI UH,$0E ;
0594 3A8D E0 VEJ (E0) ; Output error from UH
0595 3A8E
0596 3A8E BRANCH_3A8E:
0597 3A8E 0A STA XL ;
0598 3A8F 48 3A LDI XH,$3A ;
0599 3A91 94 LDA YH ;
0600 3A92 41 SIN X ;
0601 3A93 14 LDA YL ;
0602 3A94 41 SIN X ;
0603 3A95 04 LDA XL ;
0604 3A96 AE 3A D0 STA (BU_STACK + 2) ; BU_STACK is BEGIN/UNTIL Stack
0605 3A99 E2 VEJ (E2) ; BASIC interpreter: Y-Reg points to command or line end
0606 3A9A
0607 3A9A
0608 3A9A
0609 3A9A ;------------------------------------------------------------------------------
0610 3A9A ; BASIC command - STACK (STACK, BEGIN, UNTIL)
0611 3A9A ; STACK resets the stack to zero, mandatory at the beginning of the program,
0612 3A9A ; otherwise the machine can be crashed.
0613 3A9A ; BEGIN: statement ... : UNTIL condition
0614 3A9A ; returns after the BEGIN as long as the condition is false or <>0
0615 3A9A ; Example
0616 3A9A ; 10 STACK
0617 3A9A ; 20 BEGIN: A=A+1
0618 3A9A ; 30 UNTIL A=10
0619 3A9A ;------------------------------------------------------------------------------
0620 3A9A STACK: ; 3A9A
0621 3A9A B5 D1 LDI A,$D1 ;
0622 3A9C AE 3A D0 STA (BU_STACK + 2) ; BU_STACK is BEGIN/UNTIL Stack