-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasic11c.asm
More file actions
7718 lines (6764 loc) · 332 KB
/
basic11c.asm
File metadata and controls
7718 lines (6764 loc) · 332 KB
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
;*******************************************************************************
; BASIC11 FOR CPU_1A1 *
; *
; MODIFIED BY PAUL BEALING, APRIL-JUNE 2000 *
;*******************************************************************************
; *
; MC68HC11 BASIC INTERPRETER *
; *
; WRITTEN BY GORDON DOUGHMAN *
; *
; COPYRIGHT 1985-1990 BY GORDON DOUGHMAN *
; *
;*******************************************************************************
; 17-june-2000
; Ready for first release for the CPU_1A1/1B board.
;*******************************************************************************
;_DEBUG ; include if testing in RAM
; exclude for Flash version
_EEPROM ; include for Flash version
; exclude if testing in RAM
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
; #Include DEFINES.ASM
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;***********************************************************
; SYSTEM DEFINES
;***********************************************************
; These defines specify how BASIC11 is loaded into the CPU_1A1 module
; In debug mode it is loaded into and run from RAM. This allows for
; easy testing without erasing and loading the Flash
; When running from RAM, the vectors must already be loaded into EEPROM.
; Normally it will be loaded into Flash.
ROMBEG def $C000 ; starting address of code space C000-AFFF
ROMSIZE def $3DFF ; ~16K of code space
RAMSTART def $2000 ; starting address of system RAM 2000-5FFF
RAMSIZE def $4000 ; approx. 16K of system RAM
PSSTART def $8000 ; first add. of program storage FLASH 8000-BFFF
PSSIZE def $4000 ; approx. 12K of program storage FLASH
EESTART def $FE00 ; starting address of CPU EEPROM FE00-FF7F (384B)
EESIZE def $017F ; size of CPU EEPROM
EEPBASAD def $FE00 ; EEPROM base address
MAXEESUB def 384 ; maximum EEP subscript
#ifdef _debug
ROMBEG set $5000 ; starting address of code space 5000-7FFF
ROMSIZE set $3000 ; 12K of code space
RAMSTART set $2000 ; starting address of system RAM 2000-2FFF
RAMSIZE set $1000 ; 4K of system RAM
PSSTART set $8000 ; first add. of program storage FLASH 3000 or 8000
PSSIZE set $1000 ; 4K of program storage FLASH
EESTART set $FE00 ; starting address of CPU EEPROM FE00-FF7F (384B)
EESIZE set $017F ; size of CPU EEPROM
EEPBASAD set $FE00 ; EEPROM base address
MAXEESUB set 384 ; maximum EEP subscript
#endif
RAM_SA equ $0000 ; start of RAM
RAM_EA equ $7FFF ; end of RAM
FLS_SA equ $8000 ; start of Flash
FLS_EA equ $FDFF ; end of Flash
EEP_SA equ $FE00 ; start of EEPROM
EEP_EA equ $FFFF ; end of EEPROM
TIMEVAL equ 62500 ; value used for generating 'Time' Interrupt
IOBASE equ $1000 ; Base Address of the I/O Registers
SWPRE equ 02 ; SOFTWARE PRESCALER VALUE.
SBASBEG equ 0
SBASEND equ 2
SVARBEG equ 4
SVAREND equ 6
SHILINE equ 8
AUTOSTF equ 10
SSTART equ 11
;*******************************************************************************
; I/O Register Offsets From The Base Address
;*******************************************************************************
PORTAIO equ $00 ; PORT A
DDRA equ $01 ; PORT A DDR
PORTGIO equ $02 ; PORT G
DDRG equ $03 ; PORT G DDR
PORTBIO equ $04 ; PORT B
PORTCIO equ $05 ; PROT C LATCHED DATA REG.
DDRC equ $07 ; DATA DIRECTION REGISTER C
PORTDIO equ $08 ; PORT D
DDRD equ $09 ; DATA DIRECTION REGISTER D
PORTEIO equ $0A ; PORT E
CFORC equ $0B ; TIMER COMPARE FORCE REG.
OC1M equ $0C ; O/P COMPARE 1 MASK REG.
OC1D equ $0D ; O/P COMPARE 1 DATA REG
TCNT equ $0E ; TIMER COUNT H
TCNTL equ $0F ; L
TIC1 equ $10 ; TIMER O/P COMPARE 1 H
TIC1L equ $11 ; 1 L
TIC2 equ $12 ; 2 H
TIC2L equ $13 ; 2 L
TIC3 equ $14 ; 3 H
TIC3L equ $15 ; 3 L
TOC1 equ $16 ; TIMER O/P COMPARE 1 H
TOC1L equ $17 ; 1 L
TOC2 equ $18 ; 2 H
TOC2L equ $19 ; 2 L
TOC3 equ $1A ; 3 H
TOC3L equ $1B ; 3 L
TOC4 equ $1C ; 4 H
TOC4L equ $1D ; 4 L
TOC5 equ $1E ; 5 H
TOC5L equ $1F ; 5 L
TCTL1 equ $20 ; TIMER CONTROL REG 1
TCTL2 equ $21 ; TIMER CONTROL REG 2
TMSK1 equ $22 ; TIMER MASK 1
TFLAG1 equ $23 ; TIMER FLAG 1
TMSK2 equ $24 ; TIMER MASK 2
TFLG2 equ $25 ; TIMER FLAG 2
PACTL equ $26 ; PULSE ACCUMULATOR CONT. REG.
PACNT equ $27 ; PULSE ACCUMULATOR COUNT REG.
SPCR equ $28
SPSR equ $29
SPDR equ $2A
BAUD equ $2B ; SCI BAUD REG
SCCR1 equ $2C ; SCI CONTROL 1 REG
SCCR2 equ $2D ; SCI CONTROL 2 REG
SCSR equ $2E ; SCI STATUS REG
SCDR equ $2F ; SCI DATA REG
ADCTL equ $30
ADR1 equ $31
ADR2 equ $32
ADR3 equ $33
ADR4 equ $34
BPROT equ $35
OPTION equ $39 ; OPTION REG
COPRST equ $3A ; COP RESET REG
PPROG equ $3B ; EEPROM PROG REG
HPRIO equ $3C ; HPRIO REG
INITSU equ $103D ; INIT AT RESET
INIT equ $3D ; INIT
CONFIG equ $3F ; CONFIG REG
CSSTRH equ $5C ; CS CYCLE STRETCH
CSCTL equ $5D ; CS CONTROL
CSGADR equ $5E ; GENERAL PURPOSE CS (RAM)
CSGSIZ equ $5F ; GENERAL PURPOSE CS SIZE
;*******************************************************************************
; Misc. defines
EOL equ 13 ; end of line marker
CR equ 13 ; same as EOL
LF equ 10 ; linefeed character
ESC equ 27 ; ESC character
BS equ 8 ; backspace character
SPC equ 32 ; space character
MIDEOL equ ':' ; mid EOL character
COMMA equ ',' ; comma
SEMI equ 59 ; ';' semicolin
NUM equ 1 ; getvar return flag
STRING equ 2 ; getvar return flag
NULL equ 0 ; null value
CNTRLC equ 3 ; control-c (break character)
IBUFLEN equ 80 ; input buffer max length
TBUFLEN equ 128 ; token buffer max length
SWSTKSize equ 592 ; software stack size /*
OPSLEN equ 30 ; operator stack length
NUMSLEN equ 60 ; operand stack length
FORSLEN equ 80 ; FOR..NEXT stack length
WHSLEN equ 16 ; WHILE..ENDWH stack length
GOSLEN equ 16 ; GOSUB stack length
LED1 equ %00000100 ; led output
LED2 equ %00001000 ; led output
LED3 equ %00010000 ; led output
LED4 equ %00100000 ; led output
LED5 equ %10000000 ; led output on port A
SPIMS equ %10000000 ; SPI master/slave select
A15 equ %00000010 ; flash upper address bit
A16 equ %00000001 ; flash upper address bit
A17 equ %00010000 ; flash upper address bit
A18 equ %00001000 ; flash upper address bit
;*******************************************************************************
; Define error codes
ERRORCODE equ 1
LINRANG next ERRORCODE ; line number range error
SYTXERR next ERRORCODE ; syntax error
IVEXPERR next ERRORCODE ; invalid expression error
UPARNERR next ERRORCODE ; unbalanced parentheses error
DTMISERR next ERRORCODE ; data type mismatch error
OPRTRERR next ERRORCODE ; illegal operator error
ILVARERR next ERRORCODE ; illegal variable error
ILTOKERR next ERRORCODE ; illegal token error
OMEMERR next ERRORCODE ; out of memory error
INTOVERR next ERRORCODE ; integer overflow error
IVHEXERR next ERRORCODE ; invalid hex digit error
HEXOVERR next ERRORCODE ; hex number overflow
MISQUERR next ERRORCODE ; missing quote error
MPARNERR next ERRORCODE ; missing open or closing parenthisis
IONSYERR next ERRORCODE ; "ON" syntax error
MTHENERR next ERRORCODE ; missing "THEN" in "IF" statement
MTOERR next ERRORCODE ; missing "TO" in "FOR" statement
LINENERR next ERRORCODE ; line number error
IDTYERR next ERRORCODE ; illegal data type error
EXPCXERR next ERRORCODE ; expression too complex (xlator token buff ovf.)
MCOMAERR next ERRORCODE ; missing comma
MCMSMERR next ERRORCODE ; missing comma or semicolin
MSTKOERR next ERRORCODE ; math stack overflow error
UNDIMERR next ERRORCODE ; undimentioned array error
SUBORERR next ERRORCODE ; subscript out of range error
ZDIVERR next ERRORCODE ; divide by zero error
LNFERR next ERRORCODE ; line not found error
GOSOVERR next ERRORCODE ; too many nested GOSUB's
RWOGERR next ERRORCODE ; RETURN w/o GOSUB error
WHSOVERR next ERRORCODE ; too many active WHILE's
ENDWHERR next ERRORCODE ; ENDWH statement w/o WHILE
ONARGERR next ERRORCODE ; ON argument is negative, zero, or too large
NOSUBERR next ERRORCODE ; non-subscriptable variable found in DIM statem.
REDIMERR next ERRORCODE ; variable has already been DIMensioned
FORNXERR next ERRORCODE ; too many active FOR -- NEXT loops active
MFRNXERR next ERRORCODE ; mismatched FOR -- NEXT statements.
CNTCNERR next ERRORCODE ; can't continue
ODRDERR next ERRORCODE ; out of data in read or restore statement
NEGSUBER next ERRORCODE ; negative subscripts not allowed
EESUBERR next ERRORCODE ; EEP() subscript negative or > 200
PRFUNERR next ERRORCODE ; function only allowed in print statement
TABARGER next ERRORCODE ; argument <0 or >255 in TAB() function
CHRARGER next ERRORCODE ; argument <0 or >255 in CHR$() function
OVDV0ERR next ERRORCODE ; overflow or /0 error in FDIV() function
INVCHERR next ERRORCODE ; invalid channel number in ADC() function
PRTASERR next ERRORCODE ; tried to assign a value <0 or >255 to PORT(X)
ILPRTERR next ERRORCODE ; illegal port error
ILLIOERR next ERRORCODE ; illegal I/O vector number <0 or >7
UNINIERR next ERRORCODE ; uninitalized I/O vector
HEX2AERR next ERRORCODE ; argument <0 or >255 in HEX2 function
NOTALERR next ERRORCODE ; statement not allowed in direct mode
NOTINTER next ERRORCODE ; an RETI statement executed when not in interrupt
PACCARGE next ERRORCODE ; tried to assign a value of <0 or >255 to PACC
INTMODER next ERRORCODE ; interrupt or count mode error in ONPACC
EETOSMAL next ERRORCODE ; program storage EEPROM is Too Small
FLERERR next ERRORCODE ; Flash memory erase failure
NOFLPROG next ERRORCODE ; No Flash memory program to load
EEWRERR next ERRORCODE ; eeprom write failure
;*******************************************************************************
; mathematical operator tokens
OPARNTOK equ $10 ; '('
CPARNTOK equ $11 ; ')'
ANDTOK equ $20 ; 'AND'
ORTOK equ $21 ; 'OR'
EORTOK equ $22 ; 'EOR'
LTTOK equ $30 ; '<'
GTTOK equ $31 ; '>
LTEQTOK equ $32 ; '<='
GTEQTOK equ $33 ; '>='
EQTOK equ $34 ; '='
NOTEQTOK equ $35 ; '<>'
PLUSTOK equ $40 ; '+'
MINUSTOK equ $41 ; '-'
SPLUSTOK equ $42 ; '+'
MULTTOK equ $50 ; '*'
DIVTOK equ $51 ; '/'
MODTOK equ $52 ; '%'
PWRTOK equ $60 ; '^'
INDIRTOK equ $70 ; '@'
NOTTOK equ $71 ; 'NOT'
NEGTOK equ $72 ; '-' (uniary minus)
;*******************************************************************************
; keyword tokens
LETTOK equ $01 ; LET
IMLETTOK equ $02 ; implied LET
PRINTTOK equ $03 ; PRINT
FORTOK equ $04 ; FOR
NEXTTOK equ $05 ; NEXT
TRONTOK equ $06 ; TRON
TROFFTOK equ $07 ; TROFF
POKETOK equ $08 ; POKE
DIMTOK equ $09 ; DIM
REMTOK equ $0A ; REM
PACCTOK equ $0B ; PACC
DATATOK equ $0C ; DATA
READTOK equ $0D ; READ
RESTRTOK equ $0E ; RESTORE
GOSUBTOK equ $0F ; GOSUB
GOTOTOK equ $12 ; GOTO
ONTOK equ $13 ; ON
RETNTOK equ $14 ; RETURN
IFTOK equ $15 ; IF
INPUTTOK equ $16 ; INPUT
STOPTOK equ $17 ; STOP
ENDTOK equ $18 ; END
WHILETOK equ $19 ; WHILE
ENDWHTOK equ $1A ; ENDWH
EEPTOK equ $1B ; EEP
PORTATOK equ $1C ; PORTA
PORTBTOK equ $1D ; PORTB
PORTCTOK equ $1E ; PORTC
PORTDTOK equ $1F ; PORTD
INBYTTOK equ $23 ; INBYTE
TIMETOK equ $24 ; TIME
ONTIMTOK equ $25 ; ONTIME
ONIRQTOK equ $26 ; ONIRQ
RETITOK equ $27 ; RETI
ONPACTOK equ $28 ; ONPACC
SLEEPTOK equ $29 ; SLEEP
RTIMETOK equ $2A ; RTIME
CLSTOK equ $2B ; CLS
FUNCTFLG equ $36 ; function flag byte
TOTOK equ $37 ; TO
THENTOK equ $38 ; THEN
ELSETOK equ $39 ; ELSE
STEPTOK equ $3A ; STEP
;*******************************************************************************
; function tokens
FDIVTOK equ $01 ; FDIV
CHRTOK equ $02 ; CHR$
ADCTOK equ $03 ; ADC
ABSTOK equ $04 ; ABS
RNDTOK equ $05 ; RND
SGNTOK equ $06 ; SGN
TABTOK equ $07 ; TAB
CALLTOK equ $08 ; CALL
PEEKTOK equ $09 ; PEEK
FEEPTOK equ $0A ; EEP
HEXTOK equ $0B ; HEX
FPRTATOK equ $0C ; PORTA
FPRTBTOK equ $0D ; PORTB
FPRTCTOK equ $0E ; PORTC
FPRTDTOK equ $0F ; PORTD
FPRTETOK equ $10 ; PORTE
FTIMETOK equ $11 ; TIME
HEX2TOK equ $12 ; HEX2
FPACCTOK equ $13 ; PACC
;*******************************************************************************
; numerical/variable tokens
FVARTOK equ $81 ; floating point variable address
SVARTOK equ $82 ; string variable address
IVARTOK equ $84 ; integer variable address
FAVARTOK equ $91 ; floating point array
SAVARTOK equ $92 ; string array
IAVARTOK equ $94 ; integer array
FCONTOK equ $A1 ; floating point constant
SCONTOK equ $A2 ; string constant
LCONTOK equ $A8 ; line # constant
ICONTOK equ $A4 ; integer constant
ISIZ equ 2 ; number of bytes in integer variable
SSIZ equ 3 ; number of bytes in string variable
FSIZ equ 5 ; number of bytes in f.p. variable
ASIZ equ 2 ; number of bytes for array variable in dictionary
;*******************************************************************************
; Misc. tokens
MSCNTOK equ $7F ; multiple space count token
SSCNTOK equ $7E ; single space token
EOLTOK equ $7D ; end of line token
COMMATOK equ $7C ; ,
SEMITOK equ $7B ; ;
MEOLTOK equ $7A ; :
EQUALTOK equ $79 ; '='
PNUMTOK equ $78 ; '#'
JMPOP equ $7E ; OP-CODE FOR "JMP" (USED TO INITALIZE INTERRUPT TABLE)
;*******************************************************************************
#RAM $0000 ; Variables
;*******************************************************************************
; char
IBUFPTR rmb 2 ; input buffer pointer
TBUFPTR rmb 2 ; token buffer pointer
; the next 5 variables must remain grouped togeather
BASBEG rmb 2 ; start of basic program area
BASEND rmb 2 ; end of basic program
VARBEGIN rmb 2 ; start of variable storage area
VAREND rmb 2 ; end of variable storage area
HILINE rmb 2 ; highest line number in program buffer
BASMEND rmb 2 ; physical end of basic program memory
VARMEND rmb 2 ; physical end of variable memory
; int
FIRSTLIN rmb 2 ; first line to list
LASTLIN rmb 2 ; last line to list
INTPTR rmb 2 ; integer pointer
; short
ERRCODE rmb 1 ; error code status byte
IMMID rmb 1 ; immidiate mode flag
BREAKCNT equ * ; also use for break check count
COUNT equ * ; count used in ESAVE & ELOAD routines
IFWHFLAG rmb 1 ; translating IF flag
TRFLAG rmb 1 ; trace mode flag
CONTFLAG rmb 1 ; continue flag
RUNFLAG rmb 1 ; indicates we are in the run mode
PRINTPOS rmb 1 ; current print position
NUMSTACK rmb 2 ; numeric operand stack pointer
OPSTACK rmb 2 ; operator stack pointer
FORSTACK rmb 2 ; FOR stack pointer
WHSTACK rmb 2 ; WHILE stack pointer
GOSTACK rmb 2 ; GOSUB stack pointer
CURLINE rmb 2 ; line # that we are currently interpreting
ADRNXLIN rmb 2 ; address of the next line
STRASTG rmb 2 ; dynamic string/array pool pointer
FENCE rmb 2 ; varend fence in case of an error in xlation
IPSAVE rmb 2 ; interpretive pointer save for "BREAK"
DATAPTR rmb 2 ; pointer to data for read statement
RANDOM rmb 2 ; random number/seed
DEVNUM rmb 1 ; I/O device number
TIMEREG rmb 2 ; TIME register
TIMECMP rmb 2 ; TIME compare register
TIMEPRE rmb 1 ; software prescaler for TIME
ONTIMLIN rmb 2 ; ONTIME line number to goto
ONIRQLIN rmb 2 ; ONIRQ line number to goto
ONPACLIN rmb 2 ; ONPACC line number to goto
XONCH rmb 1 ; XON character for printer
XOFFCH rmb 1 ; XOFF character for printer
SCURLINE rmb 2 ; used to save CURLINE during int. processing
SADRNXLN rmb 2 ; used to save ADRNXLIN during int. processing
INBUFFS rmb 2 ; pointer to the start of the input buffer
TKNBUFS rmb 2 ; pointer to the start of the token buffer
EOPSTK rmb 2 ; end of operator stack
STOPS rmb 2 ; start of operator stack
ENUMSTK rmb 2 ; end of operand stack
STNUMS rmb 2 ; start of operand stack
EFORSTK rmb 2 ; end of FOR - NEXT stack
STFORSTK rmb 2 ; start of FOR - NEXT stack
EWHSTK rmb 2 ; end of WHILE stack
STWHSTK rmb 2 ; start of WHILE stack
EGOSTK rmb 2 ; end of GOSUB stack
STGOSTK rmb 2 ; start of GOSUB stack
IOBASEV rmb 2 ; Address vector for I/O Registers
DNAME rmb 3 ; Place to put the variable name when doing a dump command
SUBMAX rmb 2 ;
SUBCNT rmb 2 ;
TOKPTR rmb 2 ; token pointer (used for list command)
VarSize rmb 2 ; used by the line editor. size of the variable table
TADD rmb 1 ; Talkaddress
ADD rmb 1 ; Address
RLEN rmb 1 ; Record Length
CSUM rmb 1 ; Checksum
BADDR rmb 1 ; Board Address
CCOM rmb 1 ; Current Command
COUNT1 rmb 1 ; Counter for dump routine
TEMP1 rmb 2 ; 2 ; Temp for dump routine
DMPGO rmb 2 ; 2 ; dump start address
DMPEND rmb 2 ; 2 ; dump end address
GWIZ1 rmb 1 ; unexpected interrupt ID code
FLAGS1 rmb 1 ; general purpose flags
HERE1 equ *
#if * > $9E
#Error Ran out of Page 0 RAM
#endif
org $009E
CONSTAT rmb 3 ; GET CONSOLE STATUS FOR BREAK ROUTINE.
INCONNE rmb 3 ; GET BYTE DIRECTLY FROM CONSOLE FOR BREAK ROUTINE.
org $00A4
INTABLE rmb 16 ; RESERVE SPACE FOR 8 DIFFERENT INPUT ROUTINES.
OUTABLE rmb 16 ; RESERVE SPACE FOR 8 DIFFERENT OUTPUT ROUTINES.
;*******************************************************************************
org $00C4 ; START OF RAM INTERRUPT VECTORS.
RAMVECTS equ *
SCISS rmb 3 ; 00C4 ; SCI SERIAL SYSTEM.
SPITC rmb 3 ; 00C7 ; SPI TRANSFER COMPLETE.
PACCIE rmb 3 ; 00CA ; PULSE ACCUMULATOR INPUT EDGE.
PACCOVF rmb 3 ; 00CD ; PULSE ACCUMULATOR OVERFLOW.
TIMEROVF rmb 3 ; 00D0 ; TIMER OVERFLOW.
TIMOC5 rmb 3 ; 00D3 ; TIMER OUTPUT COMPARE 5.
TIMOC4 rmb 3 ; 00D6 ; TIMER OUTPUT COMPARE 4.
TIMOC3 rmb 3 ; 00D9 ; TIMER OUTPUT COMPARE 3.
TIMOC2 rmb 3 ; 00DC ; TIMER OUTPUT COMPARE 2.
TIMOC1 rmb 3 ; 00DF ; TIMER OUTPUT COMPARE 1.
TIMIC3 rmb 3 ; 00E2 ; TIMER INPUT CAPTURE 3.
TIMIC2 rmb 3 ; 00E5 ; TIMER INPUT CAPTURE 2.
TIMIC1 rmb 3 ; 00E8 ; TIMER INPUT CAPTURE 1.
REALTIMI rmb 3 ; 00EB ; REAL TIME INTERRUPT.
IRQI rmb 3 ; 00EE ; IRQ INTERRUPT.
XIRQ rmb 3 ; 00F1 ; XIRQ INTERRUPT.
SWII rmb 3 ; 00F4 ; SOFTWARE INTERRUPT.
ILLOP rmb 3 ; 00F7 ; ILLEGAL OPCODE TRAP.
COP rmb 3 ; 00FA ; WATCH DOG TIMER FAIL.
CMF rmb 3 ; 00FD ; CLOCK MONITOR FAIL.
;*******************************************************************************
org $FF7F ; EEPROM variable storage
ASFLAG rmb 1 ; auto-start flag
;***********************************************************************
;***********************************************************************
;***********************************************************************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********; P R O G R A M S T A R T S H E R E ********************
;***********************************************************************
;***********************************************************************
;***********************************************************************
;*****************************************************************************
;*****************************************************************************
; SYSTEM INITALISATION
;*****************************************************************************
;*****************************************************************************
#ROM ROMBEG
POWERUP ldd #IOBASE ; register base address (default, $1000)
std IOBASEV ; "
lsra:4 ; adjust for INIT
sta INITSU ; remap the CPU registers
lds #$0FFF ; load stack pointer
ldx IOBASEV ; get reg offset pointer
lda #%10010011 ; adpu, irqe, dly, cop = longest
sta OPTION,X
lda #%00000101
sta CSCTL,X ; enable program CS for 32K
lda #%00000000
sta CSGADR,X ; RAM starts at address 0000H
lda #%00000001
sta CSGSIZ,X ; RAM block size is 32K
lda #%00001111
sta DDRG,X ; bank select bits = outputs
clr PORTGIO,X ; select 1ST bank
; bset DDRA,X,LED5 ; make LED5 an output
; bset PORTAIO,X,LED5 ; LED5 = on
lda #$03 ; set timer prescale to "/16"
sta TMSK2,X ; save
; clear RAM
; clear 0100h to 0FFFh
ldx #$0100 ; first address
RAM1 clr ,x ; clear it
inx ; next
cpx #$1000 ; last address +1
blo RAM1 ; loop
; load interrupt vector table
ldx #INTVECT_SA ; source, INT VECTORS IN ROM
ldy #RAMVECTS ; target, START OF RAM TABLE
ST_20 lda #$7E ; JMP OPCODE
sta ,y ; store jmp opcode
iny ; NEXT target ADDRESS
ldd ,x ; GET VECTOR
std ,y ; store vector
inx:2 ; NEXT DESTINATION ADDRESS
iny:2 ; NEXT SOURCE ADDRESS
cpx #INTVECT_EA+2 ; finished ?
blo ST_20 ; no, loop
;***********
; Loads INTABLE and OUTABLE with the addresses of the input and output routines.
; DEVNUM specifies which routine to use.
; There are only 2 at this tme, SCIIN and PROUT (DEVNUM =1).
ldy #IOVects ; source, point to the default table in ROM.
ldx #INTABLE ; destination, START OF THE I/O VECTOR TABLE.
ldb #32 ; byte count, GET NUMBER OF BYTES IN THE TABLE.
PWRUP2 lda ,y ; Move a byte of the table from ROM into RAM.
sta ,x
inx ; POINT TO THE NEXT BYTE.
iny
decb ; DECREMENT THE COUNT.
bne PWRUP2 ; GO TILL WE'RE DONE.
ldx IOBASEV ; get reg offset pointer
;***********
; misc
jsr FL_RAM ; check/copy to RAM (for Flash)
lda #SWPRE+1 ; ADD 1 TO NORMAL PRE SCALER.
sta TIMEPRE ; SET UP THE SOFTWARE PRESCALER.
clrd
std TIMEREG ; ZERO THE TIME REGISTER.
std TIMECMP ; zero the time compare register.
ldx IOBASEV
jsr TIMINTS ; GO SETUP THE TIMER FOR THE FIRST INTERRUPT.
lda #$80 ; ENABLE INTERRUPTS FROM OC1.
sta TMSK1,X
clrd
std ONTIMLIN ; INITALIZE THE LINE POINTERS.
std ONIRQLIN
std ONPACLIN
ldx #IODevInit ; USERINIT
jsr ,x ; INITALIZE THE SCI.
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
;*****************************************************************************
; #Include BASICLB1.ASM
;*****************************************************************************
;*****************************************************************************
;main()
;{
; initvars(); initalize all variables & pointers
; outheader(); send startup message to console
; outrdy(); output ready message
MAIN
MAINC jsr INITVARS ; INITALIZE ALL INTERNAL VARIABLES.
ldx #PSSTART
lda ASFLAG ; get the auto start flag.
cmpa #$55
bne MAIN9
cli ; ALLOW ALL INTERRUPTS TO BE SERVICED.
jsr CRUN
MAIN9 lda #20 ; |
MAIN9A jsr DELAY ; | short delay
deca ; |
bne MAIN9A ; |
bsr OUTHEADR ; PRINT HEADER.
MAINW
MAIN2 lds #$0FFF ; load stack pointer
cli ; ALLOW ALL INTERRUPTS TO BE SERVICED
clrd
std TIMECMP ; DON'T ALLOW "ONTIME" INTERRUPTS TO OCCUR.
std ONIRQLIN ; DON'T ALLOW "ONIRQ" INTERRUPTS TO OCCUR.
std ONPACLIN ; DON'T ALLOW "PACC" INTERRUPTS TO OCCUR.
jsr OUTRDY ; PRINT READY MESSAGE.
;***********
; while(1) do forever
; {
; outprmpt(); output prompt
; getline(); getline from console
; skipspcs(); ignore leading spaces in input buffer
; if(chckcmds()) continue; check for commands
; parse(); translate/execute line
; if(errcode) rpterr(); if an error occured somewhere, report it.
; errcode=0; clear error status
; }
;}
MAIN1 clr IMMID ; CLEAR THE IMMIDIATE MODE FLAG.
clr ERRCODE ; CLEAR THE ERROR CODE BYTE.
clr RUNFLAG ; CLEAR THE RUN MODE FLAG.
jsr OUTPRMPT ; SEND PROMPT TO CONSOLE.
jsr GETLINE ; GO GET LINE FROM OPERATOR.
bsr SKIPSPCS ; SKIP ANY LEADING SPACES.
jsr CHCKCMDS ; GO CHECK FOR ANY COMMANDS.
cmpd #0 ; WERE THERE ANY?
bne MAIN2 ; YES. CONTINUE.
ldx VAREND ; SAVE CURRENT END OF VARIABLE AREA IN CASE LINE
stx FENCE ; HAS AN ERROR IN IT. (SO NO SPURIOUS VARIABLES
; ARE ALLOCATED)
jsr PARSE
tst IMMID ; DID WE EXECUTE IN IMMIDATE MODE?
bne MAIN2 ; YES. PRINT READY MESSAGE.
bra MAIN1 ; NO. JUST PRINT PROMPT.
MAIN3 ldx FENCE ; GET THE VAREND FENCE.
clr ,x ; MARK "OLD" END OF VARIABLE AREA IN CASE ANY
; VARIABLES WERE ALLOCATED.
stx VAREND ; RESTORE THE POINTER.
bra MAIN2 ; CONTINUE AFTER ERROR.
; /***** skipspcs() *****/
;skipspcs()
;{
; while(*ibufptr==SPC) ++ibufptr;
; return;
;}
;
rts
SKIPSPCS equ *
SKIPSPC1 jsr GETCHR
cmpa #SPC
bne :AnRTS
jsr INCIBP
bra SKIPSPC1
; /***** outheader *****/
;outheader()
;{
; ("BASIC11 v1.1");
; nl();
; nl();
; pl("Written by Gordon Doughman");
; nl();
;}
;
OUTHEADR ldx #HEADER
jmp PL
HEADER fcc ESC,"[2J" ; CLR SCREEN
fcc ESC,"[0;0H" ; TOP LEFT CORNER FCC "BASIC11 V1.55"
fcb CR,LF
fcc "Copyright 1985-{:year} Gordon Doughman"
fcb CR,LF
fcc "Modified for the PMB Electronics CPU_1A1 HC11F1 board, May 2000"
fcs CR,LF
; /***** outrdy() *****/
;outrdy()
;{
; nl();
; pl("READY");
; return;
;}
OUTRDY ldx #READY
bra PL
READY fcb CR,LF
fcs "READY"
; /***** getline() *****/
;getline()
;{
; short chrcnt;
; char c;
; chrcnt=IBUFLEN;
; ibufptr=inbuff;
GETLINE ldb #IBUFLEN-1
ldx INBUFFS
; while((c=inbyte())!=EOL && (chrcnt>0))
; {
GETLINE3 jsr INBYTE
cmpa #EOL
beq GETLINE1
tstb
beq GETLINE1
; if(c==BS)
; {
; if(ibufptr!=inbuff)
; {
; ibufptr-=1; point to previous buffer location
; outbyte(SPC); erase character on screen
; outbyte(BS); back cursor up
; chrcnt+=1;
; }
; else
; continue;
; }
cmpa #BS
bne GETLINE2
cmpb #IBUFLEN-1
beq GETLINE1
dex
lda #SPC
jsr OUTBYTE
lda #BS
jsr OUTBYTE
incb
; if(c < SPC) continue; ignore all other control characters
GETLINE2 cmpa #CNTRLC ; IS IT A "BREAK"?
bne GETLINE4 ; NO. GO PROCESS THE CHARACTER.
inc CONTFLAG ; DONT ALLOW A "CONT".
jmp CHCKBRK2 ; GO DO A BREAK.
GETLINE4 cmpa #SPC
blo GETLINE3
; *ibufptr=c; save character in input buffer
; ibufptr+=1; point to next location
; chrcnt-=1;
; }
sta ,x
inx
decb
bne GETLINE3
; *ibufptr=EOL; put EOL in input buffer
; ibufptr=inbuff; initalize the input buffer pointer
; return;
;}
GETLINE1 lda #EOL
sta ,x
ldx INBUFFS
stx IBUFPTR
rts
ToUpper cmpa #'a' ; is the character less than a lower case 'a'?
blo :AnRTS
cmpa #'z'
bhi :AnRTS
anda #$df
rts
; /***** outprmpt() *****/
;outprmpt()
;{
; nl(); go to new line
; outbyte('#'); send prompt to console
; return;
;}
OUTPRMPT ldx #PRMPTSTR
bra PL
PRMPTSTR fcb CR,LF
fcs "#"
; /***** nl() *****/
; nl() send CR/LF to console
;{
; outbyte(CR);
; outbyte(LF);
; return;
;}
NL2 bsr NL
NL ldx #CRLFSTR
bsr PL
clr PRINTPOS ; SET THE CURRENT PRINT POSITION TO 0.
rts
CRLFSTR fcs CR,LF
; /***** pl() *****/
;pl(ptr) send line to console
;char *ptr;
;{
; int k; char c;