-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMCS-BASIC-52-1_3_with_Monitor.asm
6655 lines (6250 loc) · 329 KB
/
MCS-BASIC-52-1_3_with_Monitor.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
PAGE 0 ; suppress page headings in ASW listing file
cpu 8052
include "stddef51.inc"
include "macros.inc"
include "bitfuncs.inc"
BIGENDIAN ON
;*****************************************************************************
;* *
;* MCS-BASIC-52 V1.31 Source Listing *
;* 12/1986 till 11/2001 *
;* The original source code of V1.1 (BASIC.SRC and FP52.SRC) by *
;* Intel Corporation, Embedded Controller Operations *
;* is public donain *
;* *
;*****************************************************************************
;*****************************************************************************
;* General alterations made by D. Wulf, 12/1999. *
;* e-mail: Detlef.Wulf@onlinehome.de *
;*****************************************************************************
; The following general alterations are made to the original source code:
; - The original source code had 2 files BASIC.SRC and FP52.SRC those have
; been incorporated into this file for easy of assembly.
; - All absolute and relativ jumps and calls without labels were provided
; with labels.
; - All machine code in the original source, coded in databytes are replaced
; by the menomics.
; - One routine in the source was different to the ROM code and is replaced
; by the ROM code.
; - Some "ORG" statements between BASIC and floating point code are remarked
; out.
; - To get room for new code the "ego message" had to be disabled.
; (Remarked with "Sorry")
; - To get more room for new code the "FPROG" command had to be disabled.
; (Remarked with "get room")
;*****************************************************************************
;* Bugfixes for MCS-52-BASIC from D. Karmann, 8/1993. *
;* e-mail: dankarmann@lucent.com *
;*****************************************************************************
; - Corrected Intel bug to allow BASIC autoboot EPROM at 8000H with user
; command extensions to work.
; (Remarked as Karmann 1)
; - Corrected Intel bug to that discarded the 'F' in any variable ending in
; F, FP, FPR and FPRO and followed by a space.
; (Remarked as Karmann 2)
;*****************************************************************************
;* Bugfix and performance for MCS-52-BASIC from *
;* D. Mudric and Z. Stojsavljevic descipt in *
;* Elektor Electronics magazine german issue 3/1992. *
;*****************************************************************************
; - Modifications to the unprocess a BASIC line routine.
; (Remarked as Elektor 1)
; - Modifications to the floating point subtraction routine.
; (Remarked as Elektor 2)
; - HEX to BIN performance improvements.
; (Remarked as Elektor 3)
; The same article describes a fix for the multiplication underflow bug, but
; the fixes did not work.
; The multiplicaton underflow bug is now (V1.31) really fixed by D. Wulf!
; (Remarked as Wulf 1)
;*****************************************************************************
;* Change UV-EPROM to EEPROM programming from R. Skowronek, 4/1996 *
;* e-mail: r.skowronek@kfa-juelich.de *
;*****************************************************************************
; This altered section of code writes the ram resident Basic program to
; EEPROM just like the ROM resident Basic interpreter writes to UV-EPROMs.
; The EEPROM is connected just like a RAM, i.e. it uses /wr on pin 27
; and gets it's adresses from the real address lines, i.e. the only
; difference from the normal setup is the use of the /wr line instead of
; P1.4, which supplies the program pulse for UV-EPROMs. Now MCS-BASIC-52
; can be located in externally ROM and is non the less able to programm
; EEPROMs!
; (Remarked as Skowronek)
; The original code from R. Skowronek didn't support the "PGM" statement
; this feature is added by D. Wulf.
; Memory is now limited to 32K bytes RAM, because memory tests above it
; would change the EEPROM.
;*****************************************************************************
;* Change timer 0 from 13 bit to 16 bit counter mode to use XTAL up to 78MHz *
;* from D. Wulf 1/2000 *
;*****************************************************************************
; The max. value for XTAL is now 78627473 Hz, for use BASIC-52 with
; Dallas 80C320 high speed / low power microcontroller (33 MHz).
; The defaut crystal value is still 11059200 Hz. You can set it with
; XTAL or patch the souce code at
; 17F1H = 11
; 17F0H = 05
; 17EFH = 92
; 17EEH = 00
; with a new crystal value.
; (Remarket as Wulf 2)
;*****************************************************************************
;* New baudrate detection from D. Wulf 1/2000 *
;*****************************************************************************
; The new baudrate detection uses timer 2 for time measurement in state of
; the code loop timing. So the Dallas 80C320 and other controllers can be
; used. Also at higher clock speeds the baudrate will detect automaticly.
; (Remarked as Wulf 3)
;*****************************************************************************
;* New processor type detection from D. Wulf 2/2000 *
;*****************************************************************************
; A new reset routine detects the processor type. So BASIC-52 V1.3 can be
; used with the following controllers:
; 8032, 87C52#, Dallas 80C320, 80515*#, 80517*#, 80517A#, 80528, 80535*,
; 80537*, 80575 or similars.
; - On processor types marked with the "*" only two different autodetect
; baudrates, depending on the crystal are possible.
; - The processor types marked with the "#" have internal ROM, so BASIC-52
; V1.3 can be located there, because it is still only 8K bytes long!
; (Remarked as Wulf 4)
;*****************************************************************************
;* OPBYTE 43H for POP from H.-J. Boehling 1/2000 *
;* e-mail: H-Boehling@gmx.de *
;*****************************************************************************
; A feature of BASIC-52 is the ability to add up to 16 custom keywords
; representing commands or instructions that you define with assembler
; routines. For using system routines in your assembler code there are
; operation bytes (for more information see Intels "MCS BASIC-52 MANUAL").
; In the original souce code is no OPCODE to put a value from argument
; stack and store in a variable.
; With BASIC-52 V1.3 you can use OPBYTE 43H which does the same than the
; "POP" statement.
; (Remarked as Boehling 1)
;*****************************************************************************
;* Reset millisecond counter on "TIME=" from H.-J. Boehling 2/2000 *
;*****************************************************************************
; The command "TIME=0" now zeros the millisecond register so that TIME
; returns with zero.
; (Remarked as Boehling 2)
;*****************************************************************************
;* New command "ERASE" by H.-J. Boehling 2/2000 *
;*****************************************************************************
; To erase an EEPROM (fill 16K byte up to 8000H with 0FFH) the new command
; "ERASE" is implemented. It takes 2 min. and 45 sec. to erase the 16K bytes!
; (Remarked as Boehling 3)
;*****************************************************************************
;* Correct "ASC(x)" bug by D. Wulf 2/2000 *
;*****************************************************************************
; BASIC-51 V1.1 gives erroneous results for the "ASC(x)" function if "x" is
; one of the following signs : *, +, -, /, <, =, > or ?.
; BASIC-51 V1.3 returns the correct values.
; (Remarked as Wulf 5)
;*****************************************************************************
;*****************************************************************************
; To indicate the new version the start message is changed from
; *MCS-51(tm) BASIC V1.1* to
; *MCS-BASIC-52 V1.31*
; H.-J. Boehling, D. Wulf 11/26/2001
;*****************************************************************************
;*****************************************************************************
; Additional BASIC commands and/or statements:
;
; SETT0 - sets T0 to 1 (turns off the red LED on my SBC)
; CLRT0 - resets T0 to 0 (turns on the red LED on my SBC)
; CPLT0 - complements T0
; SETT1 - sets T1 to 1
; CLRT1 - resets T1 to 0
; CPLT1 - complements T1
; MONITOR - simple serial monitor
;
; Removed 'Wulf 4' modification described above to detect 805XX type processors.
;
; Simplified (and greatly sped up) the function 'PG7' for writing to EEPROM.
; Tested with a 28C256 EEPROM.
;
; edited to assemble with the Macro Assembler AS V1.42 http://john.ccac.rwth-aachen.de:8000/as/
;
; Jim Loos - 08/17/2024
;*****************************************************************************
;**************************************************************
;TRAP VECTORS TO MONITOR
;RESET TAG (0AAH) ---------2001H
;TAG LOCATION (5AH) ------ 2002H
;EXTERNAL INTERRUPT 0 ---- 2040H
;COMMAND MODE ENTRY ------ 2048H
;SERIAL PORT ------------- 2050H
;MONITOR (BUBBLE) OUTPUT - 2058H
;MONITOR (BUBBLE) INPUT -- 2060H
;MONITOR (BUBBLE) CSTS --- 2068H
;GET USER JUMP VECTOR ---- 2070H
;GET USER LOOKUP VECTOR -- 2078H
;PRINT AT VECTOR --------- 2080H
;INTERRUPT PWM ----------- 2088H
;EXTERNAL RESET ---------- 2090H
;USER OUTPUT-------------- 4030H
;USER INPUT -------------- 4033H
;USER CSTS --------------- 4036H
;USER RESET -------------- 4039H
;USER DEFINED PRINT @ --- 403CH
;***************************************************************
;***************************************************************
;MCS - 52 - 8K BASIC VERSION 1.3
;***************************************************************
AJMP CRST ; START THE PROGRAM
ADDC A,@R1
ORG 3H
;***************************************************************
;EXTERNAL INTERRUPT 0
;***************************************************************
JB DRQ,STQ ; SEE IF DMA IS SET
PUSH PSW ; SAVE THE STATUS
LJMP 4003H ; JUMP TO USER IF NOT SET
ORG 0BH
;***************************************************************
;TIMER 0 OVERFLOW INTERRUPT
;***************************************************************
PUSH PSW ; SAVE THE STATUS
JB C_BIT,STJ ; SEE IF USER WANTS INTERRUPT
LJMP 400BH ; EXIT IF USER WANTS INTERRUPTS
ORG 13H
;***************************************************************
;EXTERNAL INTERRUPT 1
;***************************************************************
JB INTBIT,STK
PUSH PSW
LJMP 4013H
ORG 1BH
;***************************************************************
;TIMER 1 OVERFLOW INTERRUPT
;***************************************************************
PUSH PSW
LJMP CKS_I
STJ: LJMP I_DR ; DO THE INTERRUPT
ORG 23H
;***************************************************************
;SERIAL PORT INTERRUPT
;***************************************************************
PUSH PSW
JB SPINT,STU ; SEE IF MONITOR WANTS INTERRUPT
LJMP 4023H
ORG 2BH
;**************************************************************
;TIMER 2 OVERFLOW INTERRUPT
;**************************************************************
PUSH PSW
LJMP 402BH
ORG 30H
;**************************************************************
;USER ENTRY
;**************************************************************
LJMP IBLK ; LINK TO USER BLOCK
STQ: JB I_T0,STS ; SEE IF MONITOR WANTS IT
CLR DACK
JNB P3.2,$ ; WAIT FOR DMA TO END
SETB DACK
RETI
STS: LJMP 2040H ; GO TO THE MONITOR
STK: SETB INTPEN ; TELL BASIC AN INTERRUPT WAS RECEIVED
RETI
STU: LJMP 2050H ; SERIAL PORT INTERRUPT
;**************************************************************
;This is the equate table for 8052 basic.
;**************************************************************
;The register to direct equates for CJNE instructions.
R0B0 EQU 0
R1B0 EQU 1
R2B0 EQU 2
R3B0 EQU 3
R4B0 EQU 4
R5B0 EQU 5
R6B0 EQU 6
R7B0 EQU 7
;Register bank 1 contains the text pointer
;and the arg stack pointer.
TXAL EQU 8 ; R0 BANK 1 = TEXT POINTER LOW
ASTKA EQU 9 ; R1 BANK 1 = ARG STACK
TXAH EQU 10 ; R2 BANK 1 = TEXT POINTER HIGH
;Now five temporary locations that are used by basic.
TEMP1 EQU 11
TEMP2 EQU 12
TEMP3 EQU 13
TEMP4 EQU 14
TEMP5 EQU 15
;Register bank 2 contains the read text pointer
;and the control stack pointer.
RTXAL EQU 16 ; R0 BANK 2 = READ TEXT POINTER LOW
CSTKA EQU 17 ; R1 BANK 2 = CONTROL STACK POINTER
RTXAH EQU 18 ; R2 BANK 2 = READ TEXT POINTER HIGH
;Now some internal system equates.
BOFAH EQU 19 ; START OF THE BASIC PROGRAM, HIGH BYTE
BOFAL EQU 20 ; START OF THE BASIC PROGRAM, LOW BYTE
NULLCT EQU 21 ; NULL COUNT
PHEAD EQU 22 ; PRINT HEAD POSITION
FORMAT EQU 23
;Register bank 3 is for the user and can be loaded
;by basic
;Now everything else is used by BASIC
;First the bit locations, these use bytes 34, 35, 36, 37 and 38
OTS BIT 16 ; 34.0-ON TIME INSTRUCTION EXECUTED
INPROG BIT 17 ; 34.1-INTERRUPT IN PROCESS
INTBIT BIT 18 ; 34.2-INTERRUPT SET BIT
ON_ERR BIT 19 ; 34.3-ON ERROR EXECUTED
OTI BIT 20 ; 34.4-ON TIME INTERRUPT IN PROGRESS
LINEB BIT 21 ; 34.5-LINE CHANGE OCCURED
INTPEN BIT 22 ; 34.6-INTERRUPT PENDING BIT
CONB BIT 23 ; 34.7-CAN CONTINUE IF SET
GTRD BIT 24 ; 35.0-READ GET LOCATION
LPB BIT 25 ; 35.1-PRINT TO LINE PRINTER PORT
CKS_B BIT 26 ; 35.2-FOR PWM INTERRUPT
COB BIT 27 ; 35.3-CONSOLE OUT BIT
; 0 = SERIAL PORT
; 1 = LINE PRINTER
COUB BIT 28 ; 35.4-USER CONSOLE OUT BIT
; 0 = SERIAL PORT
; 1 = USER DRIVER
INBIT BIT 29 ; 35.5-INITIALIZATION BIT
CIUB BIT 30 ; 35.6-USER CONSOLE IN BIT
; 0 = SERIAL PORT
; 1 = USER ROUTINE
SPINT BIT 31 ; 35.7-SERIAL PORT INTERRUPT
STOPBIT BIT 32 ; 36.0-PROGRAM STOP ENCOUNTERED
U_IDL BIT 33 ; 36.1-USER IDLE BREAK
INP_B BIT 34 ; 36.2-SET DURING INPUT INSTRUCTION
ARGF BIT 36 ; 36.4-ARG STACK HAS A VALUE
RETBIT BIT 37 ; 36.5-RET FROM INTERRUPT EXECUTED
I_T0 BIT 38 ; 36.6-TRAP INTERRUPT ZERO TO MON
UPB BIT 39 ; 36.7-SET WHEN @ IS VALID
mul_underflow BIT 40 ; 37.0-mul_limit_case
ENDBIT BIT 41 ; 37.1-GET END OF PROGRAM
UBIT BIT 42 ; 37.2-FOR DIM STATEMENT
ISAV BIT 43 ; 37.3-SAVE INTERRUPT STATUS
BO BIT 44 ; 37.4-BUBBLE OUTPUT
XBIT BIT 45 ; 37.5-EXTERNAL PROGRAM PRESENT
C_BIT BIT 46 ; 37.6-SET WHEN CLOCK RUNNING
DIRF BIT 47 ; 37.7-DIRECT INPUT MODE
NO_C BIT 48 ; 38.0-NO CONTROL C
DRQ BIT 49 ; 38.1-DMA ENABLED
BI BIT 50 ; 38.2-BUBBLE INPUT
C0ORX1 BIT 52 ; 38.4-PRINT FROM ROM OR RAM
CNT_S BIT 53 ; 38.5-CONTROL S ENCOUNTERED
ZSURP BIT 54 ; 38.6-ZERO SUPRESS
HMODE BIT 55 ; 38.7-HEX MODE PRINT
LP BIT P1.7 ; SOFTWARE LINE PRINTER
DACK BIT P1.6 ; DMA ACK
T_BIT BIT P1.2 ; I/O TOGGLE BIT
;The next location is a bit addressable byte counter
BABC EQU 39
;Now floating point and the other temps
;FP Uses to locations 03CH
;Now the stack designators.
SPSAV EQU 3EH
S_LEN EQU 3FH
T_HH EQU 40H
T_LL EQU 41H
INTXAH EQU 42H
INTXAL EQU 43H
MT1 EQU 45H
MT2 EQU 46H
MILLIV EQU 47H ; Real Time Clock 5 millisec.
TVH EQU 48H ; Real Time Clock high byte
TVL EQU 49H ; Real Time Clock low byte
SAVE_T EQU 4AH
SP_H EQU 4BH ; SERIAL PORT TIME OUT
SP_L EQU 4CH
CMNDSP EQU 4DH ; SYSTEM STACK POINTER
PCON0 EQU 87H ; PCON SFR
RCAPH2 EQU 0CBH ; RCAPH2 8052 SFR
RCAPL2 EQU 0CAH ; RCAPL2 8052 SFR
IRAMTOP EQU 0FFH ; TOP OF RAM
STACKTP EQU 0FEH ; ARG AND CONTROL STACK TOPS
;The character equates
CR EQU 0DH ; CARRIAGE RETURN
LF EQU 0AH ; LINE FEED
BELL EQU 07H ; BELL CHARACTER
BS EQU 08H ; BACK SPACE
CNTRLC EQU 03H ; CONTROL C
CNTRLD EQU 04H ; CONTROL D
NULL EQU 00H ; NULL
ESC EQU 1BH ; ESCAPE
;The internal system equates
LINLEN EQU 73 ; THE LENGTH OF AN INPUT LINE
EOF EQU 01 ; END OF FILE CHARACTER
ASTKAH EQU 01 ; ASTKA IS IN PAGE 1 OF RAM
CSTKAH EQU 00 ; CSTKA IS IN PAGE 0 OF RAM
FTYPE EQU 01 ; CONTROL STACK "FOR"
GTYPE EQU 02 ; CONTROL STACK "GOSUB"
DTYPE EQU 03 ; DO-WHILE/UNTIL TYPE
ROMADR EQU 8000H ; LOCATION OF ROM
;The floating point equates
FPSIZ EQU 6 ; NO. OF BYTES IN A FLOATING NUM
DIGIT EQU FPSIZ-2 ; THE MANTISSA OF A FLOATING NUM
STESIZ EQU FPSIZ+3 ; SIZE OF SYMBOL ADJUSTED TABLE ELEMENT
;FP_BASE EQU 1993H ;BASE OF FLOATING POINT ROUTINES
PSTART EQU 512 ; START OF A PROGRAM IN RAM
FSIZE EQU FPSIZ+FPSIZ+2+2+1
;**************************************************************
; User entry jump table
;**************************************************************
USENT: DW CMND1 ; (00, 00H)COMMAND MODE JUMP
DW IFIX ; (01, 01H)CONVERT FP TO INT
DW PUSHAS ; (02, 02H)PUSH VALUE ONTO ARG STACK
DW POPAS ; (03, 03H)POP VALUE OFF ARG STACK
DW PG1 ; (04, 04H)PROGRAM A PROM
DW INLINE ; (05, 05H)INPUT A LINE
DW UPRNT ; (06, 06H)PRINT A LINR
DW CRLF ; (07, 07H)OUTPUT A CRLF
;**************************************************************
;This is the operation jump table for arithmetics
;**************************************************************
OPTAB: DW ALPAR ; (08, 08H)LEFT PAREN
DW AEXP ; (09, 09H)EXPONENTAION
DW AMUL ; (10, 0AH)FP MUL
DW AADD ; (11, 0BH)FLOATING POINT ADD
DW ADIV ; (12, 0CH)FLOATING POINT DIVIDE
DW ASUB ; (13, 0DH)FLOATING POINT SUBTRACTION
DW AXRL ; (14, 0EH)XOR
DW AANL ; (15, 0FH)AND
DW AORL ; (16, 10H)OR
DW ANEG ; (17, 11H)NEGATE
DW AEQ ; (18, 12H)EQUAL
DW AGE ; (19, 13H)GREATER THAN OR EQUAL
DW ALE ; (20, 14H)LESS THAN OR EQUAL
DW ANE ; (21, 15H)NOT EQUAL
DW ALT ; (22, 16H)LESS THAN
DW AGT ; (23, 17H)GREATER THAN
;***************************************************************
;This is the jump table for unary operators
;***************************************************************
DW AABS ; (24, 18H)ABSOLUTE VALUE
DW AINT ; (25, 19H)INTEGER OPERATOR
DW ASGN ; (26, 1AH)SIGN OPERATOR
DW ANOT ; (27, 1BH)ONE'S COMPLEMENT
DW ACOS ; (28, 1CH)COSINE
DW ATAN ; (29, 1DH)TANGENT
DW ASIN ; (30, 1EH)SINE
DW ASQR ; (31, 1FH)SQUARE ROOT
DW ACBYTE ; (32, 20H)READ CODE
DW AETOX ; (33, 21H)E TO THE X
DW AATAN ; (34, 22H)ARC TANGENT
DW ALN ; (35, 23H)NATURAL LOG
DW ADBYTE ; (36, 24H)READ DATA MEMORY
DW AXBYTE ; (37, 25H)READ EXTERNAL MEMORY
DW PIPI ; (38, 26H)PI
DW ARND ; (39, 27H)RANDOM NUMBER
DW AGET ; (40, 28H)GET INPUT CHARACTER
DW AFREE ; (41, 29H)COMPUTE #BYTES FREE
DW ALEN ; (42, 2AH) COMPUTE LEN OF PORGRAM
DW AXTAL ; (43, 2BH) CRYSTAL
DW PMTOP ; (44, 2CH)TOP OF MEMORY
DW ATIME ; (45, 2DH) TIME
DW A_IE ; (46, 2EH) IE
DW A_IP ; (47, 2FH) IP
DW ATIM0 ; (48, 30H) TIMER 0
DW ATIM1 ; (49, 31H) TIMER 1
DW ATIM2 ; (50, 32H) TIMER 2
DW AT2CON ; (51, 33H) T2CON
DW ATCON ; (52, 34H) TCON
DW ATMOD ; (53, 35H) ATMOD
DW ARCAP2 ; (54, 36H) RCAP2
DW AP1 ; (55, 37H) P1
DW APCON ; (56, 38H) PCON
DW EXPRB ; (57, 39H) EVALUATE AN EXPRESSION
DW AXTAL1 ; (58, 3AH) CALCULATE CRYSTAL
DW LINE ; (59, 3BH) EDIT A LINE
DW PP ; (60, 3CH) PROCESS A LINE
DW UPPL0 ; (61, 3DH) UNPROCESS A LINE
DW VAR ; (62, 3EH) FIND A VARIABLE
DW GC ; (63, 3FH) GET A CHARACTER
DW GCI ; (64, 40H) GET CHARACTER AND INCREMENT
DW INCHAR ; (65, 41H) INPUT A CHARACTER
DW CRUN ; (66, 42H) RUN A PROGRAM
DW SPOP ; (67, 43H) POP a value to a variable
OPBOL: DB 1
DB 15 ; LEFT PAREN
DB 14 ; EXPONENTIAN **
DB 10 ; MUL
DB 8 ; ADD
DB 10 ; DIVIDE
DB 8 ; SUB
DB 3 ; XOR
DB 5 ; AND
DB 4 ; OR
DB 12 ; NEGATE
DB 6 ; EQ
DB 6 ; GT
DB 6 ; LT
DB 6 ; NE
DB 6 ; LE
DB 6 ; GE
UOPBOL: DB 15 ; AABS
DB 15 ; AAINT
DB 15 ; ASGN
DB 15 ; ANOT
DB 15 ; ACOS
DB 15 ; ATAN
DB 15 ; ASIN
DB 15 ; ASQR
DB 15 ; ACBYTE
DB 15 ; E TO THE X
DB 15 ; AATAN
DB 15 ; NATURAL LOG
DB 15 ; DBYTE
DB 15 ; XBYTE
;***************************************************************
;The ASCII printed messages.
;***************************************************************
STP: DB 'STOP"'
IAN: DB 'TRY AGAIN"'
RDYS: DB 'READY"'
INS: DB ' - IN LINE "'
;**************************************************************
;This is the command jump table
;**************************************************************
CMNDD: DW CRUN ; RUN
DW CLIST ; LIST
DW CNULL ; NULL
DW CNEW ; NEW
DW CCONT ; CONTINUE
DW CPROG ; PROGRAM A PROM
DW CXFER ; TRANSFER FROM ROM TO RAM
DW CRAM ; RAM MODE
DW CROM ; ROM MODE
; DW CIPROG ;INTELLIGENT PROM PROGRAMMING
dw CERASE ; Erase an EEPROM
;***************************************************************
;This is the statement jump table.
;**************************************************************
STATD: DW SLET ; LET 80H
DW SCLR ; CLEAR 81H
DW SPUSH ; PUSH VAR 82H
DW SGOTO ; GO TO 83H
DW STONE ; TONE 84H
DW SPH0 ; PRINT MODE 0 85H
DW SUI ; USER INPUT 86H
DW SUO ; USER OUTPUT 87H
DW SPOP ; POP VAR 88H
DW SPRINT ; PRINT 89H
DW SCALL ; CALL 8AH
DW SDIMX ; DIMENSION 8BH
DW STRING ; STRING ALLO 8CH
DW SBAUD ; SET BAUD 8DH
DW SCLOCK ; CLOCK 8EH
DW SPH1 ; PRINT MODE 1 8FH
;No direct mode from here on
DW SSTOP ; STOP 90H
DW SOT ; ON TIME 91H
DW SONEXT ; ON EXT INT 92H
DW SRETI ; RET FROM INT 93H
DW S_DO ; DO 94H
DW SRESTR ; RESTOR 95H
DW WCR ; REM 96H
DW SNEXT ; NEXT 97H
DW SONERR ; ON ERROR 98H
DW S_ON ; ON 99H
DW SINPUT ; INPUT 9AH
DW SREAD ; READ 9BH
DW FINDCR ; DATA 9CH
DW SRETRN ; RETURN 9DH
DW SIF ; IF 9EH
DW SGOSUB ; GOSUB 9FH
DW SFOR ; FOR A0H
DW SWHILE ; WHILE A1H
DW SUNTIL ; UNTIL A2H
DW CMND1 ; END A3H
DW I_DL ; IDLE A4H
DW ST_A ; STORE AT A5H
DW LD_A ; LOAD AT A6H
DW PGU ; PGM A7H
DW RROM ; RUN A ROM A9H
;**************************************************************
; This is the basic token table
;**************************************************************
;First the tokens for statements
TOKTAB: DB 80H ; LET TOKEN
DB 'LET'
DB 81H ; CLEAR TOKEN
DB 'CLEAR'
DB 82H ; PUSH TOKEN
DB 'PUSH'
T_GOTO EQU 83H
DB 83H ; GO TO TOKEN
DB 'GOTO'
DB 84H ; TOGGLE TOKEN
DB 'PWM'
DB 85H ; PRINT HEX MODE 0
DB 'PH0.'
DB 86H ; USER IN TOKEN
DB 'UI'
DB 87H ; USER OUT TOKEN
DB 'UO'
DB 88H ; POP TOKEN
DB 'POP'
DB 89H ; PRINT TOKEN
DB 'PRINT'
DB 89H
DB 'P.' ; P. ALSO MEANS PRINT
DB 89H ; ? ALSO
DB '?'
DB 8AH ; CALL TOKEN
DB 'CALL'
DB 8BH ; DIMENSION TOKEN
DB 'DIM'
DB 8CH ; STRING TOKEN
DB 'STRING'
DB 8DH ; SET BAUD RATE
DB 'BAUD'
DB 8EH ; CLOCK
DB 'CLOCK'
DB 8FH ; PRINT HEX MODE 1
DB 'PH1.'
T_STOP EQU 90H ; STOP TOKEN
DB T_STOP
DB 'STOP'
T_DIR EQU T_STOP ; NO DIRECT FROM HERE ON
DB T_STOP+1 ; ON TIMER INTERRUPT
DB 'ONTIME'
DB T_STOP+2 ; ON EXTERNAL INTERRUPT
DB 'ONEX1'
DB T_STOP+3 ; RETURN FROM INTERRUPT
DB 'RETI'
DB T_STOP+4 ; DO TOKEN
DB 'DO'
DB T_STOP+5 ; RESTORE TOKEN
DB 'RESTORE'
T_REM EQU T_STOP+6 ; REMARK TOKEN
DB T_REM
DB 'REM'
DB T_REM+1 ; NEXT TOKEN
DB 'NEXT'
DB T_REM+2 ; ON ERROR TOKEN
DB 'ONERR'
DB T_REM+3 ; ON TOKEN
DB 'ON'
DB T_REM+4 ; INPUT
DB 'INPUT'
DB T_REM+5 ; READ
DB 'READ'
T_DATA EQU T_REM+6 ; DATA
DB T_DATA
DB 'DATA'
DB T_DATA+1 ; RETURN
DB 'RETURN'
DB T_DATA+2 ; IF
DB 'IF'
T_GOSB EQU T_DATA+3 ; GOSUB
DB T_GOSB
DB 'GOSUB'
DB T_GOSB+1 ; FOR
DB 'FOR'
DB T_GOSB+2 ; WHILE
DB 'WHILE'
DB T_GOSB+3 ; UNTIL
DB 'UNTIL'
DB T_GOSB+4 ; END
DB 'END'
T_LAST EQU T_GOSB+5 ; LAST INITIAL TOKEN
T_TAB EQU T_LAST ; TAB TOKEN
DB T_TAB
DB 'TAB'
T_THEN EQU T_LAST+1 ; THEN TOKEN
DB T_THEN
DB 'THEN'
T_TO EQU T_LAST+2 ; TO TOKEN
DB T_TO
DB 'TO'
T_STEP EQU T_LAST+3 ; STEP TOKEN
DB T_STEP
DB 'STEP'
T_ELSE EQU T_LAST+4 ; ELSE TOKEN
DB T_ELSE
DB 'ELSE'
T_SPC EQU T_LAST+5 ; SPACE TOKEN
DB T_SPC
DB 'SPC'
T_CR EQU T_LAST+6
DB T_CR
DB 'CR'
DB T_CR+1
DB 'IDLE'
DB T_CR+2
DB 'ST@'
DB T_CR+3
DB 'LD@'
DB T_CR+4
DB 'PGM'
DB T_CR+5
DB 'RROM'
;Operator tokens
T_LPAR EQU 0E0H ; LEFT PAREN
DB T_LPAR
DB '('
DB T_LPAR+1 ; EXPONENTIAN
DB '**'
DB T_LPAR+2 ; FP MULTIPLY
DB '*'
T_ADD EQU T_LPAR+3
DB T_LPAR+3 ; ADD TOKEN
DB '+'
DB T_LPAR+4 ; DIVIDE TOKEN
DB '/'
T_SUB EQU T_LPAR+5 ; SUBTRACT TOKEN
DB T_SUB
DB '-'
DB T_LPAR+6 ; LOGICAL EXCLUSIVE OR
DB '.XOR.'
DB T_LPAR+7 ; LOGICAL AND
DB '.AND.'
DB T_LPAR+8 ; LOGICAL OR
DB '.OR.'
T_NEG EQU T_LPAR+9
T_EQU EQU T_LPAR+10 ; EQUAL
DB T_EQU
DB '='
DB T_LPAR+11 ; GREATER THAN OR EQUAL
DB '>='
DB T_LPAR+12 ; LESS THAN OR EQUAL
DB '<='
DB T_LPAR+13 ; NOT EQUAL
DB '<>'
DB T_LPAR+14 ; LESS THAN
DB '<'
DB T_LPAR+15 ; GREATER THAN
DB '>'
T_UOP EQU 0B0H ; UNARY OP BASE TOKEN
DB T_UOP ; ABS TOKEN
DB 'ABS'
DB T_UOP+1 ; INTEGER TOKEN
DB 'INT'
DB T_UOP+2 ; SIGN TOKEN
DB 'SGN'
DB T_UOP+3 ; GET TOKEN
DB 'NOT'
DB T_UOP+4 ; COSINE TOKEN
DB 'COS'
DB T_UOP+5 ; TANGENT TOKEN
DB 'TAN'
DB T_UOP+6 ; SINE TOKEN
DB 'SIN'
DB T_UOP+7 ; SQUARE ROOT TOKEN
DB 'SQR'
DB T_UOP+8 ; CBYTE TOKEN
DB 'CBY'
DB T_UOP+9 ; EXP (E TO THE X) TOKEN
DB 'EXP'
DB T_UOP+10
DB 'ATN'
DB T_UOP+11
DB 'LOG'
DB T_UOP+12 ; DBYTE TOKEN
DB 'DBY'
DB T_UOP+13 ; XBYTE TOKEN
DB 'XBY'
T_ULAST EQU T_UOP+14 ; LAST OPERATOR NEEDING PARENS
DB T_ULAST
DB 'PI'
DB T_ULAST+1 ; RND TOKEN
DB 'RND'
DB T_ULAST+2 ; GET TOKEN
DB 'GET'
DB T_ULAST+3 ; FREE TOKEN
DB 'FREE'
DB T_ULAST+4 ; LEN TOKEN
DB 'LEN'
T_XTAL EQU T_ULAST+5 ; CRYSTAL TOKEN
DB T_XTAL
DB 'XTAL'
T_MTOP EQU T_ULAST+6 ; MTOP
DB T_MTOP
DB 'MTOP'
T_IE EQU T_ULAST+8 ; IE REGISTER
DB T_IE
DB 'IE'
T_IP EQU T_ULAST+9 ; IP REGISTER
DB T_IP
DB 'IP'
TMR0 EQU T_ULAST+10 ; TIMER 0
DB TMR0
DB 'TIMER0'
TMR1 EQU T_ULAST+11 ; TIMER 1
DB TMR1
DB 'TIMER1'
TMR2 EQU T_ULAST+12 ; TIMER 2
DB TMR2
DB 'TIMER2'
T_TIME EQU T_ULAST+7 ; TIME
DB T_TIME
DB 'TIME'
TT2C EQU T_ULAST+13 ; T2CON
DB TT2C
DB 'T2CON'
TTC EQU T_ULAST+14 ; TCON
DB TTC
DB 'TCON'
TTM EQU T_ULAST+15 ; TMOD
DB TTM
DB 'TMOD'
TRC2 EQU T_ULAST+16 ; RCAP2
DB TRC2
DB 'RCAP2'
T_P1 EQU T_ULAST+17 ; P1
DB T_P1
DB 'PORT1'
T_PC EQU T_ULAST+18 ; PCON
DB T_PC
DB 'PCON'
T_ASC EQU T_ULAST+19 ; ASC TOKEN
DB T_ASC
DB 'ASC('
T_USE EQU T_ULAST+20 ; USING TOKEN
DB T_USE
DB 'USING('
DB T_USE
DB 'U.('
T_CHR EQU T_ULAST+21 ; CHR TOKEN
DB T_CHR
DB 'CHR('
T_CMND EQU 0F0H ; COMMAND BASE
DB 0F0H ; RUN TOKEN
DB 'RUN'
DB 0F1H ; LIST TOKEN
DB 'LIST'
DB 0F2H ; NULL TOKEN
DB 'NULL'
DB 0F3H ; NEW TOKEN
DB 'NEW'
DB 0F4H ; CONTINUE TOKEN
DB 'CONT'
DB 0F5H ; PROGRAM TOKEN
DB 'PROG'
DB 0F6H ; TRANSFER TOKEN
DB 'XFER'
DB 0F7H ; RAM MODE
DB 'RAM'
DB 0F8H ; ROM MODE
DB 'ROM'
db 0F9H ; Erase an EEPROM
db 'ERASE'
db 0feh ; dummy token and
db 07fh ; unused dummy char
DB 0FFH ; END OF TABLE
EIG: DB 'EXTRA IGNORED"'
EXA: DB 'A-STACK"'
EXC: DB 'C-STACK"'
;**************************************************************
; This performs system initialzation, it was moved here so the
; new power on reset functions could be tested in an 8751.
;**************************************************************
CRST: MOV SCON,#5AH ; INITIALIZE SFR'S
mov TMOD,#11H ; Use 16 bit mode of timer 0
MOV TCON,#54H
MOV T2CON,#34H
MOV DPTR,#2001H ; READ CODE AT 2001H
CLR A
MOVC A,@A+DPTR
CJNE A,#0AAH,CRST1 ; IF IT IS AN AAH, DO USER RESET
LCALL 2090H
CRST1: MOV R0,#IRAMTOP ; PUT THE TOP OF RAM IN R0
CLR A ; ZERO THE ACC
CRST2: MOV @R0,A ; CLEAR INTERNAL MEMORY
DJNZ R0,CRST2 ; LOOP TIL DONE
;Now, test the external memory
MOV SPSAV,#CMNDSP ; SET UP THE STACK
MOV SP,SPSAV
lcall TEST_USER ; check for user command extensions
MOV BOFAH,#HI(ROMADR)
MOV BOFAL,#LO(ROMADR)+17
MOV DPTR,#ROMADR ; GET THE BYTE AT 8000H
MOVX A,@DPTR
CLR C
SUBB A,#31H ; FOR BIAS
MOV MT1,A ; SAVE IN DIRECT MATH LOC
CLR ACC.2 ; SAVE FOR RESET
MOV R7,A ; SAVE IT IN R7
INC DPTR
ACALL L31DPI ; SAVE BAUD RATE
LCALL RCL
INC DPTR ; GET MEMTOP
ACALL L31DPI
MOV DPTR,#5FH ; READ THE EXTERNAL BYTE
MOVX A,@DPTR
MOV DPTR,#0 ; ESTABLISH BASE FOR CLEAR
CJNE A,#0A5H,CRS ; Erase the memory
MOV A,MT1
CLR ACC.0 ; CLEAR BIT ONE
XRL A,#4H
JZ CR2
CRS: CJNE R7,#2,CRS1
SJMP CRS2
CRS1: CJNE R7,#3,CR0
CRS2: ACALL CL_1
SJMP CR1
CR0: MOV R3,DPH ; SAVE THE DPTR
MOV R1,DPL
INC DPTR
MOV A,#5AH
MOVX @DPTR,A ; Test external memory
MOVX A,@DPTR
CJNE A,#5AH,CR1
CLR A
MOVX @DPTR,A
CJNE R3,#HI(ROMADR)-1,CR0 ; Stop the test at 8000H because
CJNE R1,#LO(ROMADR)-2,CR0 ; EEPROM starts here
CR1: CJNE R3,#03H,CR11 ; NEED THIS MUCH RAM
CR11: JC CRST
MOV DPTR,#MEMTOP ; SAVE MEMTOP
ACALL S31DP2 ; SAVE MEMTOP AND SEED RCELL
ACALL CNEW ; CLEAR THE MEMORY AND SET UP POINTERS
CR2: ACALL RC1 ; SET UP STACKS IF NOT DONE
LCALL AXTAL0 ; DO THE CRYSTAL
MOV A,MT1 ; GET THE RESET BYTE
CJNE A,#5,CR20
LCALL 4039H
CR20: JNC BG1 ; CHECK FOR 0,1,2,3, OR 4
JNB ACC.0,BG3 ; NO RUN IF WRONG TYPE
MOV DPTR,#ROMADR+16
MOVX A,@DPTR ; READ THE BYTE
CJNE A,#55H,BG3
LJMP CRUN
BG1: clr a
mov t2con,a
mov TH2,#0FFh
mov TL2,#0F8h
jb rxd,$
mov t2con,#5 ; Timer2 start
jnb rxd,$
mov t2con,a ; Timer2 stop
jb rxd,$
jnb rxd,$
call sercalc ; r3=timer2 MSB default
; cjne a,ADCON,BG10 ; jump if A/D processor like 805x5
;BG14: mov a,S0RELL
; cjne a,#B9600,BG2 ; jump if not 805x7A
; mov a,r3
; anl S0RELH,a
; mov S0RELL,r1 ; start Baudratetimer 805X7A
; sjmp BG11
;BG10: cjne r1,#B9600,BG12 ; jump if wrong fast baud rate
;BG11: orl PCON0,#080h ; setb smod for fast mode
; sjmp BG13
;BG12: cjne r1,#B4800,BG14 ; jump if wrong slow baudrate
;BG13: setb BD ; enable baudrategenerator
; sjmp BG15
BG2: mov t2con,#34h ; configure Timer2 as baudrate generator
BG15: CALL RCL ; LOAD THE TIMER
BG3: MOV DPTR,#S_N ; GET THE MESSAGE
ACALL CRP ; PRINT IT
LJMP CRAM
;***************************************************************
;CIPROG AND CPROG - Program a prom
;***************************************************************
PG8: MOV R7,#00H ; PROGRAM ONE BYTE AT A TIME
MOV R6,#01H
MOV R2,#HI(ROMADR)-1
MOV R0,#LO(ROMADR)-1 ; LOAD PROM ADDRESS
ACALL PG101
INC R6
MOV A,RCAPH2
ACALL PG101
MOV A,RCAPL2