/
BASIC.ASM
3416 lines (3121 loc) · 45.7 KB
/
BASIC.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
;BASIC.COM Microsoft compatible 6502 BASIC
;D. Lausberg (c) 1995
;V1.0 08.04.95
;V1.1 02.09.95 EDIT COMMAND and LINE EDITOR
;V1.2 13.01.96 G_FIX Error corrected
;V1.3 17.01.96 upper case conversion, PI
;V1.4 06.03.96 printer,disk support
;V1.5 12.06.22 BASIC filename implemented
Version = $15
;Parameters
ZERO = $00 ;ZERO PAGE
SRC_CHR = $03 ;SEARCH CHR
HK_F = $04 ;FLAG FOR HOCHKOMMA MODE
INBUFP = $05 ;INPUT BUFFER POINTER
DIMBUF = $06 ;1. CHR OF DIM VARIABLE
VAR_F = $07 ;VARIABLE TYPE FLAG
INT_F = $08 ;INTEGER FLAG
DATA_F = $09 ;DATA FLAG
DIM_F = $0A ;DIM FLAG
INP_F = $0B ;INPUT FLAG
SGN_F = $0C ;SIGN FLAG
OUT_F = $0D ;OUTPUT FLAG
IO_CHAN = $0E ;NR OF I/O CHANNEL 0=KEYB 3=SCREEN
BASADR = $11 ;BASIC ADDRESS
DES_PNT = $13 ;POINTER TO NEXT DESCRIPTOR
L_STRP = $14 ;POINTER ON LAST RECENTLY USED STRING
STRTAB = $16 ;STRING DESCRIPTOR TABLE
T_PNT = $1F ;TRANSFER POINTER
PNT = $21 ;GENERAL PURPOSE POINTER
REG = $23 ;REGISTER FOR FUNCTION ARGUMENTS
BASBEG = $28 ;BEGIN OF BASIC STATEMENTS
VTBEG = $2A ;POINTER TO BEGIN OF VARIABLES TABLE
ATBEG = $2C ;POINTER TO BEGIN OF ARRAY TABLE
VTEND = $2E ;POINTER TO END OF VARIABLES TABLE
STREND = $30 ;POINTER TO END OF STRING AREA
STRBEG = $32 ;POINTER TO BEGIN OF LAST STRING
NXTAD = $34 ;POINTER TO NEXT ADDRESS IN RAM
ALINNR = $36 ;NR OF ACTUAL BASIC LINE
DIRECT_F = $37 ;FLAG FOR DIRECT MODE
CONTLN = $38 ;LINE NR FOR CONT COMMAND
NXTBEF = $3A ;POINTER ON NEXT BASIC COMMAND
ADATA = $3C ;LINE NR OF ACTUAL DATA
NXTDATA = $3E ;POINTER ON NEXT DATA
INPPNT = $40 ;INPUT SOURCE POINTER
VNAME = $42 ;NAME OF CURRENT VARABLE
VPNT = $44 ;POINTER ON CURRENT VARABLE
P_FORL = $46 ;POINTER ON FOR/NEXT VARIABLE
AOPER = $48 ;POINTER ON ACTUAL OPERATOR
OPMSK = $4A ;OPERATOR MASK
DEFPNT = $4B ;DEF FN POINTER
GCMEM = $4D ;GARBAGE COLLECTION MEMORY
J_FN = $51 ;JUMP TO BASIC FUNCTION
BUF1 = $54 ;BUFFER FOR ARGUMENTS 1
TARGAD = $55 ;LAST TARGET ADDRESS OF MOVE
ENDAD = $57 ;END ADDRESS OF BLOCK TO BE MOVED
BUF2 = $59 ;BUFFER FOR ARGUMENTS 2
BEGAD = $5C ;START ADDRESS OF BLOCK TO BE MOVED
F_ACCU1 = $5E ;FLOATING POINT ARITH ACCU 1
F_ACCU2 = $66 ;FLOATING POINT ARITH ACCU 2
ACOMP = $6C ;ACCU COMPARISON BYTE
ARND = $6D ;ACCU ROUND BYTE
P_FUNC = $6E ;POINTER FOR FUNCTION PROCESSING
CHRGTP = $71 ;CHR GET POINTER
RNDNR = $76 ;RANDOM NR
CLOCK = $7B ;24H CLOCK
STATUS = $7E ;STATUS VARABLE
CUR_COL = $7F ;CURSOR COLOUMN
;SYSTEM ADDRESSES
TEMPX = $D0
TEMPY = $D1
BUFPNT = $D2 ;Pointer for disk buffer (=DMA)
FLAG_8 = $D3 ;Channel #8 Flag
IN_DEV = $D4 ;Input device
OUT_DEV = $D5 ;Output device
DMABUF = $D6 ;original DMA page address
BDOS = $F0
FCB1 = $F6
FCB2 = $F4
DMA = $FE
STACK = $100
TPA = $200
RDTEN = $F6DC ;6532 RIOT READ TIMER ENABLE IRQ
TIM1C = $F404 ;6522 VIA TIMER 1 COUNTER
TIM2C = $F408 ;6522 VIA TIMER 2 COUNTER
;ERROR CODES
EOF = $D7
NOTFND = $DD
;BDOS COMMANDS
CONIN = $1
CONOUT = $2
LISTDEV = $5
CONIO = $6
STROUT = $9
CONST = $B
SELDRV = $E
DOPEN = $F
DCLOSE = $10
ERASE = $13
RDSEQ = $14
WRITE = $15
CREATE = $16
GETDRV = $19
BIOSC = $1A
;BIOS COMMANDS
_CHRIN = 3
_SETTRK = 10
_SETSEC = 11
_WRITE = 13
;CONTROL CHARACTERS
EOT = $00
CTRLA = $01 ;Control A
BRK_KEY = $03
CTRLD = $04 ;Control D
CTRLF = $06 ;Control F
BS = $08
HT = $09
LF = $0A
CLS = $0C
CR = $0D
SI = $0F
CTRLS = $13 ;Control S
GS = $1D
SP = $20
HK = $22
RUBOUT = $7F
;SPECIAL CODES
BIT_Z = $24 ;BIT Z OPCODE TO MASK 1 BYTE INSTRUCTION
BIT_ABS = $2C ;BIT OPCODE TO MASK 2 BYTE INSTRUCTION
PRINT_TOK = $99 ;PRINT TOKEN
;--------------------------------------------------------
ORG TPA
INBUF ;BASIC INPUT BUFFER
LDA #0 ;BASIC INITIALIZATION ROUTINE
LDX #BDOS-1 ;will be overwritten after startup
INIT1 STA ZERO,X ;CLEAR PAGE 0
DEX
BNE INIT1
CLD
LDY #Z_TABX-Z_TAB-1
INIT2 LDA Z_TAB,Y
DEY
LDX Z_TAB,Y
STA ZERO,X
DEY
BPL INIT2
LDA DMA ;save original DMA vector
STA DMABUF
LDA DMA+1
STA DMABUF+1
LDA BDOS+1 ;SET END OF BASIC'S RAM
STA STREND
STA NXTAD
LDA BDOS+2
STA STREND+1
STA NXTAD+1
INY ;Y=$00
TYA ;CLEAR WORKSPACE
STA (BASBEG),Y
INC BASBEG
LDA BASBEG
LDY BASBEG+1
JSR GARBCOL
LDA #INITM ;PRINT 'JUNIOR BASIC Vx.x'
LDY #INITM/256
JSR PRT_STR
SEC ;CALCULATE WORKSPACE SIZE
LDA NXTAD
SBC BASBEG
TAX
LDA NXTAD+1
SBC BASBEG+1
JSR PRT_16 ;AND PRINT IT
LDA #BYTFRE ;PRINT 'BYTES FREE'
LDY #BYTFRE/256
JSR PRT_STR
JSR COLD
LDA #$01 ;PRESET STACKTOP
STA STACK+$FC
STA STACK+$FD
LDY #1
LDA #SP
CMP (FCB1),Y
BEQ INIT3 ;check for filename to execute
JSR SETFCB4
JSR LOAD_IMM ;load BASIC file
JSR BAS_RST
JSR L_INS ;BASIC RESET AND REBIND LINES
LDA #'R ;put 'RUN in INBUF
STA INBUF
LDA #'U
STA INBUF+1
LDA #'N
STA INBUF+2
LDX #3
JSR ST_EOT ;put EOT in INBUF
JMP MAIN7 ;execute RUN command
INIT3 JMP WARM
;--- ZERO PAGE BYTES ---
Z_TAB DB GCMEM+3,$03
DB ZERO,$4C ;JMP OPCODE
DB ZERO+1,ILLQ_ERR
DB ZERO+2,ILLQ_ERR/256
DB J_FN,$4C ;JMP OPCODE
DB CHRGTP-1,$AD ;LDA ABS OPCODE
DB CHRGTP+2,$60 ;RTS OPCODE
DB DES_PNT,STRTAB
DB BASBEG,HEAP
DB BASBEG+1,HEAP/256
DB OUT_DEV,3 ;Output device is screen
Z_TABX
;--- STARTUP MESSAGES ---
INITM DB CLS,'Junior BASIC V'
DB VERSION/16+$30,'.',VERSION*$1000/$1000+$30,' ',EOT
BYTFRE DB ' Bytes free',CR,LF,EOT
;until here approx. 200 bytes input buffer
;--- COMMAND TABLE ---
COM_TAB DW END-1 ;END
DW FOR-1
DW NEXT-1
DW DATA-1
DW INPUT@-1
DW INPUT-1
DW DIM-1
DW READ-1
DW LET-1
DW GOTO-1
DW RUN-1
DW IF-1
DW RESTORE-1
DW GOSUB-1
DW RETURN-1
DW REM-1
DW STOP-1
DW ON-1
DW WAIT-1
DW LOAD-1
DW SAVE-1
DW BYE-1
DW DEF-1
DW POKE-1
DW PRINT@-1
DW PRINT-1
DW CONT-1
DW LIST-1
DW CLR-1
DW CMD-1
DW SYS-1
DW EDIT-1
DW KILL-1
DW GET-1
DW NEW-1
DW SGN ;FROM HERE WITHOUT -1
DW INT
DW ABS
DW DUMMY4 ;USR NOT IMPLEMENTED
DW FRE
DW POS
DW SQR
DW RND
DW LOG
DW EXP
DW COS
DW SIN
DW TAN
DW ATN
DW PEEK
DW LEN
DW STR@
DW VAL
DW ASC
DW CHR
DW LEFT
DW RIGHT
DW MID
DW DUMMY4 ;Dummy fn 1
DW DUMMY4 ;Dummy fn 2
DW DUMMY4 ;Dummy fn 3
DW DUMMY4 ;Dummy fn 4
DW DUMMY4 ;Dummy fn 5
DW DUMMY4 ;Dummy fn 6
DW DUMMY4 ;Dummy fn 7
DW DUMMY4 ;Dummy fn 8
DW DUMMY4 ;Dummy fn 9
DW DUMMY4 ;Dummy fn 10
DW DUMMY4 ;Dummy fn 11
DW DUMMY4 ;Dummy fn 12
DW DUMMY4 ;Dummy fn 13
DW DUMMY4 ;Dummy fn 14
DW DUMMY4 ;Dummy fn 15
DW OPEN-1
DW CLOSE-1
;--- MATH OPERATORS HIRARCHY AND EXECUTION VECTORS ---
OP_TAB DB $79
DW PLUS-1
DB $79
DW MINUS-1
DB $7B
DW MUL-1
DB $7B
DW DIV-1
DB $7F
DW EXPO-1
DB $50
DW AND-1
DB $46
DW OR-1
DB $7D
DW NEG-1
DB $5A
DW NOT-1
DB $64
DW COMP-1
;--- BASIC COMMAND WORDS ---
BAS_BEF DB 'EN','D'+$80
DB 'FO','R'+$80
DB 'NEX','T'+$80
DB 'DAT','A'+$80
DB 'INPUT','#'+$80
DB 'INPU','T'+$80
DB 'DI','M'+$80
DB 'REA','D'+$80
DB 'LE','T'+$80
DB 'GOT','O'+$80
DB 'RU','N'+$80
DB 'I','F'+$80
DB 'RESTOR','E'+$80
DB 'GOSU','B'+$80
DB 'RETUR','N'+$80
DB 'RE','M'+$80
DB 'STO','P'+$80
DB 'O','N'+$80
DB 'WAI','T'+$80
DB 'LOA','D'+$80
DB 'SAV','E'+$80
DB 'BY','E'+$80
DB 'DE','F'+$80
DB 'POK','E'+$80
DB 'PRINT','#'+$80
DB 'PRIN','T'+$80
DB 'CON','T'+$80
DB 'LIS','T'+$80
DB 'CL','R'+$80
DB 'CM','D'+$80
DB 'SY','S'+$80
DB 'EDI','T'+$80
DB 'KIL','L'+$80
DB 'GE','T'+$80
DB 'NE','W'+$80
DB 'TAB','('+$80
DB 'T','O'+$80
DB 'F','N'+$80
DB 'SPC','('+$80
DB 'THE','N'+$80
DB 'NO','T'+$80
DB 'STE','P'+$80
DB '+'+$80
DB '-'+$80
DB '*'+$80
DB '/'+$80
DB '^'+$80
DB 'AN','D'+$80
DB 'O','R'+$80
DB '>'+$80
DB '='+$80
DB '<'+$80
DB 'SG','N'+$80
DB 'IN','T'+$80
DB 'AB','S'+$80
DB 'US','R'+$80
DB 'FR','E'+$80
DB 'PO','S'+$80
DB 'SQ','R'+$80
DB 'RN','D'+$80
DB 'LO','G'+$80
DB 'EX','P'+$80
DB 'CO','S'+$80
DB 'SI','N'+$80
DB 'TA','N'+$80
DB 'AT','N'+$80
DB 'PEE','K'+$80
DB 'LE','N'+$80
DB 'STR','$'+$80
DB 'VA','L'+$80
DB 'AS','C'+$80
DB 'CHR','$'+$80
DB 'LEFT','$'+$80
DB 'RIGHT','$'+$80
DB 'MID','$'+$80
DB 'US','R'+$80 ;Dummy fn 1
DB 'US','R'+$80 ;Dummy fn 2
DB 'US','R'+$80 ;Dummy fn 3
DB 'US','R'+$80 ;Dummy fn 4
DB 'US','R'+$80 ;Dummy fn 5
DB 'US','R'+$80 ;Dummy fn 6
DB 'US','R'+$80 ;Dummy fn 7
DB 'US','R'+$80 ;Dummy fn 8
DB 'US','R'+$80 ;Dummy fn 9
DB 'US','R'+$80 ;Dummy fn 10
DB 'US','R'+$80 ;Dummy fn 11
DB 'US','R'+$80 ;Dummy fn 12
DB 'US','R'+$80 ;Dummy fn 13
DB 'US','R'+$80 ;Dummy fn 14
DB 'US','R'+$80 ;Dummy fn 15
DB 'OPE','N'+$80
DB 'CLOS','E'+$80
DB EOT
;--- ERROR TABLE ----
ERR_TAB DB 'NEXT WITHOUT FO','R'+$80
ERR1 DB 'SYNTA','X'+$80
ERR2 DB 'RETURN WITHOUT GOSU','B'+$80
ERR3 DB 'OUT OF DAT','A'+$80
ERR4 DB 'ILLEGAL QUANTIT','Y'+$80
ERR5 DB 'OVERFLO','W'+$80
ERR6 DB 'OUT OF MEMOR','Y'+$80
ERR7 DB 'UNDEF',$27,'D STATEMEN','T'+$80
ERR8 DB 'BAD SUBSCRIP','T'+$80
ERR9 DB 'REDIM',$27,'D ARRA','Y'+$80
ERR10 DB 'DIVISION BY ZER','O'+$80
ERR11 DB 'ILLEGAL DIREC','T'+$80
ERR12 DB 'TYPE MISMATC','H'+$80
ERR13 DB 'STRING TOO LON','G'+$80
ERR14 DB 'FILE DAT','A'+$80
ERR15 DB 'FORMULA TOO COMPLE','X'+$80
ERR16 DB 'CAN',$27,'T CONTINU','E'+$80
ERR17 DB 'UNDEF',$27,'D FUNCTIO','N'+$80
ERR18 DB 'DIS','K'+$80
;--- MESSAGES ---
ERRORM DB ' ERROR',EOT
IN_M DB ' IN ',EOT
READYM DB CR,LF,'READY.',CR,LF,EOT
BREAKM DB CR,LF,'BREAK',EOT
REDOM DB '?REDO FROM START',CR,LF,EOT
EXTRAM DB '?EXTRA IGNORED',CR,LF,EOT
;--- LEGAL KEYS FOR FILENAMES ---
KEYTAB DB '!#$&+^_'
KEYTX
;--- CONSTANTS ---
PI DB $82,$49,$0F,$DA,$A1 ;3.14159265
M32768 DB $90,$80,$00,$00,$20 ;-32768
F_10 DB $84,$20,$00,$00,$00 ;10
F_CONST DB $81,$00,$00,$00,$00 ;FLOATING POINT CONSTANTS FOR
F_LOG3 DB $03,$7F,$5E,$56,$CB ;LOG
DB $79
DB $80,$13,$9B,$0B,$64
DB $80,$76,$38,$93,$16
DB $82,$38,$AA,$3B,$20
F_LOG1 DB $80,$35,$04,$F3,$34
F_LOG2 DB $81,$35,$04,$F3,$34
F_LOG4 DB $80,$80,$00,$00,$00
F_LOG5 DB $80,$31,$72,$17,$F8
F_STR DB $9B,$3E,$BC,$1F,$FD ;CONSTANT FOR STRING CONVERSION
F_STR1 DB $9E,$6E,$6B,$27,$FD
F_STR2 DB $9E,$6E,$6B,$28,$00
CON_TAB DB $80,$00,$00,$00,$00 ;O.5
CON_C1 DB $FA,$0A,$1F,$00,$00 ;CONVERSION CONSTANTS FOR FLOAT
DB $98,$96,$80,$FF,$F0 ;TO ASCII
DB $BD,$C0,$00,$01,$86
DB $A0,$FF,$FF,$D8,$F0
DB $00,$00,$03,$E8,$FF
DB $FF,$FF,$9C,$00,$00
DB $00,$0A,$FF,$FF,$FF
DB $FF,$FF,$DF,$0A,$80
DB $00,$03,$4B,$C0,$FF
DB $FF,$73,$60,$00,$00
DB $0E,$10,$FF,$FF,$FD
DB $A8,$00,$00,$00,$3C
F_EXP DB $81,$38,$AA,$3B,$29 ;CONSTANTS FOR EXPONENTIATION
F_EXP1 DB $07,$71,$34,$58,$3E
DB $56
DB $74,$16,$7E,$B3,$1B
DB $77,$2F,$EE,$E3,$85
DB $7A,$1D,$84,$1C,$2A
DB $7C,$63,$59,$58,$0A
DB $7E,$75,$FD,$E7,$C6
DB $80,$31,$72,$18,$10
DB $81,$00,$00,$00,$00
F_COS DB $81,$49,$0F,$DA,$A2
F_SIN DB $83,$49,$0F,$DA,$A2
F_SIN1 DB $7F,$00,$00,$00,$00
F_SIN2 DB $05
DB $84,$E6,$1A,$2D,$1B
DB $86,$28,$07,$FB,$F8
DB $87,$99,$68,$89,$01
DB $87,$23,$35,$DF,$E1
DB $86,$A5,$5D,$E7,$28
DB $83,$49,$0F,$DA,$A2
DB $A1,$54,$46,$8F,$13
DB $8F,$52,$43,$89,$CD
F_ATN DB $0B
DB $76,$B3,$83,$BD,$D3
DB $79,$1E,$F4,$A6,$F5
DB $7B,$83,$FC,$B0,$10
DB $7C,$0C,$1F,$67,$CA
DB $7C,$DE,$53,$CB,$C1
DB $7D,$14,$64,$70,$4C
DB $7D,$B7,$EA,$51,$7A
DB $7D,$63,$30,$88,$7E
DB $7E,$92,$44,$99,$3A
DB $7E,$4C,$CC,$91,$C7
DB $7F,$AA,$AA,$AA,$13
DB $81,$00,$00,$00,$00
C_RND DB $98,$35,$44,$7A ;CONSTANTS FOR RND
C_RND1 DB $68,$28,$B1,$46
;----------------------
S_FORL TSX ;SEARCH FOR LOOP IN STACK
INX
INX
INX
INX
S_FORL3 LDA STACK+1,X
CMP #$81
BNE S_FORLX
LDA P_FORL+1
BNE S_FORL1
LDA STACK+2,X
STA P_FORL
LDA STACK+3,X
STA P_FORL+1
S_FORL1 CMP STACK+3,X
BNE S_FORL2
LDA P_FORL
CMP STACK+2,X
BEQ S_FORLX
S_FORL2 TXA
CLC
ADC #$12
TAX
BNE S_FORL3
S_FORLX RTS
M_ROOM JSR GARBCOL ;MAKE ROOM FOR PROGRAM
STA VTEND
STY VTEND+1
MOVE SEC ;MOVE MEMORY BLOCK IN BEGAD, ENDAD
LDA ENDAD ;TO TARGAD
SBC BEGAD
STA T_PNT
TAY
LDA ENDAD+1
SBC BEGAD+1
TAX
INX
TYA
BEQ MOVE1
LDA ENDAD
SEC
SBC T_PNT
STA ENDAD
BCS MOVE2
DEC ENDAD+1
SEC
MOVE2 LDA TARGAD
SBC T_PNT
STA TARGAD
BCS MOVE3
DEC TARGAD+1
BCC MOVE3
MOVE4 LDA (ENDAD),Y
STA (TARGAD),Y
MOVE3 DEY
BNE MOVE4
LDA (ENDAD),Y
STA (TARGAD),Y
MOVE1 DEC ENDAD+1
DEC TARGAD+1
DEX
BNE MOVE3
RTS
STK_CHK ASL A ;STACK CHECK
ADC #$3E
BCS OM_ERR
STA T_PNT
TSX
CPX T_PNT
BCC OM_ERR
RTS
GARBCOL CPY STREND+1 ;GARBAGE COLLECTION
BCC GACOLX
BNE GACOL1
CMP STREND
BCC GACOLX
GACOL1 PHA
LDX #9
TYA
GACOL2 PHA
LDA BUF1,X
DEX
BPL GACOL2
JSR RM_STR ;REMOVE STRING
LDX #$F7
GACOL3 PLA
STA F_ACCU1,X
INX
BMI GACOL3
PLA
TAY
PLA
CPY STREND+1
BCC GACOLX
BNE OM_ERR
CMP STREND
BCS OM_ERR
GACOLX RTS
OM_ERR LDX #ERR6-ERR_TAB ;OUT OF MEMORY ERROR
ERROR LSR OUT_F ;ERROR MESSAGES
LDA IO_CHAN ;CHECK OUTPUT FLAG
BEQ ERROR1
JSR RES_IO ;IN_DEV=0, OUT_DEV=3
ERROR1 JSR CRLF ;PRINT CR, LF
JSR PRT_3F ;PRINT ?
ERROR2 LDA ERR_TAB,X
PHA
AND #$7F
JSR PRT_CHR ;PRINT CHR
INX
PLA
BPL ERROR2
JSR RESET
LDA #ERRORM ;PRINT ' ERROR'
LDY #ERRORM/256
ERROR3 JSR PRT_STR
LDY DIRECT_F
INY
BEQ WARM
JSR PRT_LNR ;PRINT LINE NR
WARM LSR OUT_F ;BASIC WARM START
LDA #READYM
LDY #READYM/256
JSR PRT_STR
MAIN JSR GETLINE ;BASIC MAIN LOOP
MAIN7 STX CHRGTP ;STORE TO CHR GET POINTER
STY CHRGTP+1
JSR GETCHR ;GET NEXT CHR
TAX
BEQ MAIN
LDX #$FF
STX DIRECT_F
BCC MAIN1
JSR G_TOKEN ;GET BASIC TOKEN
JMP EXEC
MAIN1 JSR G_FIX ;GET FIXED DIGIT NR
JSR G_TOKEN
STY INBUFP ;INPUT BUFFER POINTER
JSR G_LINNR ;GET LINE NR
BCC MAIN2
LDY #1
LDA (BEGAD),Y
STA T_PNT+1
LDA VTBEG
STA T_PNT
LDA BEGAD+1
STA PNT+1
LDA BEGAD
DEY
SBC (BEGAD),Y
CLC
ADC VTBEG
STA VTBEG
STA PNT
LDA VTBEG+1
ADC #$FF
STA VTBEG+1
SBC BEGAD+1
TAX
SEC
LDA BEGAD
SBC VTBEG
TAY
BCS MAIN3
INX
DEC PNT+1
MAIN3 CLC
ADC T_PNT
BCC MAIN4
DEC T_PNT+1
CLC
MAIN4 LDA (T_PNT),Y
STA (PNT),Y
INY
BNE MAIN4
INC T_PNT+1
INC PNT+1
DEX
BNE MAIN4
MAIN2 JSR BAS_RST ;BASIC RESET
JSR L_INS
LDA INBUF
BEQ MAIN
CLC
LDA VTBEG
STA ENDAD
ADC INBUFP
STA TARGAD
LDY VTBEG+1
STY ENDAD+1
BCC MAIN5
INY
MAIN5 STY TARGAD+1
JSR M_ROOM
LDA BASADR
LDY BASADR+1
STA STACK+$FE
STY STACK+$FF
LDA VTEND
LDY VTEND+1
STA VTBEG
STY VTBEG+1
LDY INBUFP
DEY
MAIN6 LDA STACK+$FC,Y
STA (BEGAD),Y
DEY
BPL MAIN6
MAIN0 JSR BAS_RST
JSR L_INS
JMP MAIN
L_INS LDA BASBEG ;LINE INSERT/DELETE
LDY BASBEG+1
STA T_PNT
STY T_PNT+1
CLC
L_INS2 LDY #1
LDA (T_PNT),Y
BEQ L_INSX
LDY #4
L_INS1 INY
LDA (T_PNT),Y
BNE L_INS1
INY
TYA
ADC T_PNT
TAX
LDY #0
STA (T_PNT),Y
LDA T_PNT+1
ADC #0
INY
STA (T_PNT),Y
STX T_PNT
STA T_PNT+1
BCC L_INS2
L_INSX RTS
GETLINE LDX #0 ;GET LINE FROM input device
LDY IN_DEV
BEQ GETLIN1
GETLN1 JSR CHRIN
CMP #LF ;ignore LF's
BEQ GETLN1
CMP #CR
BEQ GETLNX
STA INBUF,X
INX
BNE GETLN1
GETLNX JMP ST_EOT
GETLIN7 DEX ;do RUBOUT
BMI GETLIN3
DEX
STX P_FORL
LDA #BS
GL_RUB INX
JSR CHROUT
LDA INBUF+1,X
STA INBUF,X
BNE GL_RUB
LDA #SP ;delete last CHR
JSR CHROUT
JMP GLBCUR2
GETLIN1 LDA IO_CHAN ;switch io channel to console
PHA
STX IO_CHAN
STX INBUF
DB BIT_Z
GETLIN3 INX
GETLIN0 JSR CHRIN ;INPUT CHR VIA BIOS
CMP #CR ;CR
BNE GETLIN2
JSR ST_EOT
PLA
STA IO_CHAN ;restore io channel
RTS
GETLIN2 CMP #RUBOUT ;Delete CHR left from cursor
BEQ GETLIN7
CMP #SP
BCC GETLIN4
GL_INS STX P_FORL ;CHR insert into line
GL_INS1 LDY INBUF,X
STA INBUF,X
JSR CHROUT ;ECHO CHR TO SCREEN
INX
TYA
BNE GL_INS1
STA INBUF,X
GL_BCUR DEX ;Move cursor back
GLBCUR1 CPX P_FORL
BEQ GETLIN3
GLBCUR2 LDA #BS ;do a backspace
JSR CHROUT
JMP GL_BCUR
GETLIN4 CMP #BS
BNE GETLIN5
GETLN4B LDA #BS
DEX
BMI GETLIN3
GETLN4A JSR CHROUT
JMP GETLIN0
GETLIN5 CMP #HT
BNE GETLIN6
GETLN5A LDA INBUF,X
BEQ GETLIN0
INX
LDA #HT
BNE GETLN4A
GETLIN6 CMP #SI ;toggle echo
BNE G_CHR1
LDA OUT_F
EOR #$FF
STA OUT_F
GETLN10 JMP GETLIN0
G_CHR1 CMP #CTRLA ;cursor to begin of line
BNE GETLIN8
LDA #$FF
STA P_FORL
BNE GL_BCUR
GETLIN8 CMP #CTRLF ;move cursor to EOL
BNE GETLIN9
DB BIT_Z
GETLN8A PHA ;entry from EDIT
GETLN8B LDA INBUF,X
BEQ GETLIN0
JSR CHROUT
INX
BNE GETLN8B
GETLIN9 CMP #CTRLS
BEQ GETLN4B
CMP #CTRLD
BEQ GETLN5A
BNE GETLN10 ;all other chr's suppressed
UCASE CMP #'a ;upper case conversion
BCC UCASEX
CMP #'{
BCS UCASEX
AND #$5F
UCASEX RTS
G_TOKEN LDX CHRGTP ;GET BASIC TOKEN
LDY #4
STY DATA_F
G_TOK1 LDA INBUF,X
BPL G_TOK2
INX
BNE G_TOK1
G_TOK2 CMP #SP
BEQ G_TOK3
STA HK_F
CMP #HK
BEQ G_TOK4
BIT DATA_F
BVS G_TOK3
CMP #'?
BNE G_TOK5
LDA #PRINT_TOK
BNE G_TOK3
G_TOK5 CMP #'0
BCC G_TOK6
CMP #'<
BCC G_TOK3
G_TOK6 STY P_FUNC
JSR S_BBEF
STX CHRGTP
LDY #0
STY INBUFP
G_TOK14 LDA INBUF,X
JSR UCASE ;lower -> upper case
SEC
SBC (PNT),Y
BNE G_TOK7
INX
INY
BNE G_TOK14
G_TOK17 INC PNT+1
BNE G_TOK14
G_TOK7 CMP #$80 ;BASIC COMMAND?
BNE G_TOK8
ORA INBUFP
G_TOK15 LDY P_FUNC
G_TOK3 INX
INY
JSR UCASE
STA INBUF-5,Y
ORA #$00 ;END OF LINE?
BEQ G_TOK9
SEC
SBC #':
BEQ G_TOK10
CMP #73 ;DATA Token?
BNE G_TOK11
G_TOK10 STA DATA_F
G_TOK11 SEC
SBC #85
BNE G_TOK1
STA HK_F
G_TOK12 LDA INBUF,X
BEQ G_TOK3
CMP HK_F
BEQ G_TOK3
G_TOK4 INY
STA INBUF-5,Y
INX
BNE G_TOK12
G_TOK8 LDX CHRGTP
INC INBUFP
G_TOK13 LDA (PNT),Y
BMI G_TOK16
INY
BNE G_TOK13
INC PNT+1
BNE G_TOK13