Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1186 savelij 1
;  December 18, 1986
2
;  MS-DOS compatible Source code for MCS BASIC-52 (tm)
3
;  Assembles with ASM51 Macro Assembler Version 2.2
4
;
5
;  The following source code does not include the floating point math
6
;  routines. These are seperately compiled using FP52.SRC.
7
;
8
;  Both the BASIC.SRC and FP52.SRC programs assemble into ABSOLUTE
9
;  object files, and do not need to be relocated or linked. The FP52
10
;  object code and the BASIC object code, when compiled without modification
11
;  of the source listings, create the same object code that is found on
12
;  the MCS BASIC-52 Version 1.1 microcontrollers.
13
;
14
;  The original source code had 7 "include" files that have been incorporated
15
;  into this file for ease of assembly.
16
;  These 7 files are: LOOK52.SRC, BAS52.RST, BAS52.PGM, BAS52.TL, BAS52.OUT,
17
;  BAS52.PWM, and BAS52.CLK.
18
;
19
;
20
;                       Intel Corporation, Embedded Controller Operations
21
 
22
        cpu     8052
23
 
24
        page    0
25
        newpage
26
 
27
        include stddef51.inc
28
        include bitfuncs.inc
29
        bigendian on
30
 
31
        segment code
32
 
33
        ;**************************************************************
34
        ;
35
        ; TRAP VECTORS TO MONITOR
36
        ;
37
        ; RESET TAG (0AAH) ---------2001H
38
        ;
39
        ; TAG LOCATION (5AH) ------ 2002H
40
        ;
41
        ; EXTERNAL INTERRUPT 0 ---- 2040H
42
        ;
43
        ; COMMAND MODE ENTRY ------ 2048H
44
        ;
45
        ; SERIAL PORT ------------- 2050H
46
        ;
47
        ; MONITOR (BUBBLE) OUTPUT - 2058H
48
        ;
49
        ; MONITOR (BUBBLE) INPUT -- 2060H
50
        ;
51
        ; MONITOR (BUBBLE) CSTS --- 2068H
52
        ;
53
        ; GET USER JUMP VECTOR ---- 2070H
54
        ;
55
        ; GET USER LOOKUP VECTOR -- 2078H
56
        ;
57
        ; PRINT AT VECTOR --------- 2080H
58
        ;
59
        ; INTERRUPT PWM ----------- 2088H
60
        ;
61
        ; EXTERNAL RESET ---------- 2090H
62
        ;
63
        ; USER OUTPUT-------------- 4030H
64
        ;
65
        ; USER INPUT -------------- 4033H
66
        ;
67
        ; USER CSTS --------------- 4036H
68
        ;
69
        ; USER RESET -------------- 4039H
70
        ;
71
        ; USER DEFINED PRINT @ ---  403CH
72
        ;
73
        ;***************************************************************
74
        ;
75
        newpage
76
        ;***************************************************************
77
        ;
78
        ; MCS - 51  -  8K BASIC VERSION 1.1
79
        ;
80
        ;***************************************************************
81
        ;
82
        AJMP    CRST            ;START THE PROGRAM
83
        db      037h            ; ******AA inserted
84
        ;
85
        ORG     3H
86
        ;
87
        ;***************************************************************
88
        ;
89
        ;EXTERNAL INTERRUPT 0
90
        ;
91
        ;***************************************************************
92
        ;
93
        JB      DRQ,STQ         ;SEE IF DMA IS SET
94
        PUSH    PSW             ;SAVE THE STATUS
95
        LJMP    4003H           ;JUMP TO USER IF NOT SET
96
        ;
97
        ORG     0BH
98
        ;
99
        ;***************************************************************
100
        ;
101
        ;TIMER 0 OVERFLOW INTERRUPT
102
        ;
103
        ;***************************************************************
104
        ;
105
        PUSH    PSW             ;SAVE THE STATUS
106
        JB      C_BIT,STJ       ;SEE IF USER WANTS INTERRUPT
107
        LJMP    400BH           ;EXIT IF USER WANTS INTERRUPTS
108
        ;
109
        ORG     13H
110
        ;
111
        ;***************************************************************
112
        ;
113
        ;EXTERNAL INTERRUPT 1
114
        ;
115
        ;***************************************************************
116
        ;
117
        JB      INTBIT,STK
118
        PUSH    PSW
119
        LJMP    4013H
120
        ;
121
        newpage
122
        ;
123
        ORG     1BH
124
        ;
125
        ;***************************************************************
126
        ;
127
        ;TIMER 1 OVERFLOW INTERRUPT
128
        ;
129
        ;***************************************************************
130
        ;
131
        PUSH    PSW
132
        LJMP    CKS_I
133
        ;
134
STJ:    LJMP    I_DR            ;DO THE INTERRUPT
135
        ;
136
        ;***************************************************************
137
        ;
138
        ;SERIAL PORT INTERRUPT
139
        ;
140
        ;***************************************************************
141
        ;
142
        ORG     23H
143
        ;
144
        PUSH    PSW
145
        JB      SPINT,STU       ;SEE IF MONITOR EANTS INTERRUPT
146
        LJMP    4023H
147
        ;
148
        ORG     2BH
149
        ;
150
        ;**************************************************************
151
        ;
152
        ;TIMER 2 OVERFLOW INTERRUPT
153
        ;
154
        ;**************************************************************
155
        ;
156
        PUSH    PSW
157
        LJMP    402BH
158
        ;
159
        newpage
160
        ;**************************************************************
161
        ;
162
        ;USER ENTRY
163
        ;
164
        ;**************************************************************
165
        ;
166
        ORG     30H
167
        ;
168
        LJMP    IBLK            ;LINK TO USER BLOCK
169
        ;
170
STQ:    JB      I_T0,STS        ;SEE IF MONITOR WANTS IT
171
        CLR     DACK
172
        JNB     P3.2,$          ;WAIT FOR DMA TO END
173
        SETB    DACK
174
        RETI
175
        ;
176
STS:    LJMP    2040H           ;GO TO THE MONITOR
177
        ;
178
STK:    SETB    INTPEN          ;TELL BASIC AN INTERRUPT WAS RECEIVED
179
        RETI
180
        ;
181
STU:    LJMP    2050H           ;SERIAL PORT INTERRUPT
182
        ;
183
        newpage
184
 
185
        include look52.inc      ; ******AA
186
 
187
EIG:    DB      "EXTRA IGNORED",'"'
188
        ;
189
EXA:    DB      "A-STACK",'"'
190
        ;
191
EXC:    DB      "C-STACK",'"'
192
        ;
193
        newpage
194
 
195
        include bas52.rst       ; ******AA
196
 
197
        newpage
198
        ;***************************************************************
199
        ;
200
        ; CIPROG AND CPROG - Program a prom
201
        ;
202
        ;***************************************************************
203
        ;
204
        include bas52.pgm       ; ******AA
205
        newpage
206
        ;**************************************************************
207
        ;
208
PGU:    ;PROGRAM A PROM FOR THE USER
209
        ;
210
        ;**************************************************************
211
        ;
212
        CLR     PROMV           ;TURN ON THE VOLTAGE
213
        MOV     PSW,#00011000B  ;SELECT RB3
214
        ACALL   PG1             ;DO IT
215
        SETB    PROMV           ;TURN IT OFF
216
        RET
217
        ;
218
        ;
219
        ;*************************************************************
220
        ;
221
CCAL:   ; Set up for prom moves
222
        ; R3:R1 gets source
223
        ; R7:R6 gets # of bytes
224
        ;
225
        ;*************************************************************
226
        ;
227
        ACALL   GETEND          ;GET THE LAST LOCATION
228
        INC     DPTR            ;BUMP TO LOAD EOF
229
        MOV     R3,BOFAH
230
        MOV     R1,BOFAL        ;RESTORE START
231
        CLR     C               ;PREPARE FOR SUBB
232
        MOV     A,DPL           ;SUB DPTR - BOFA > R7:R6
233
        SUBB    A,R1
234
        MOV     R6,A
235
        MOV     A,DPH
236
        SUBB    A,R3
237
        MOV     R7,A
238
        RET
239
        ;
240
        ;
241
        include bas52.tl        ; ******AA
242
        newpage
243
        ;***************************************************************
244
        ;
245
CROM:   ; The command action routine - ROM - Run out of rom
246
        ;
247
        ;***************************************************************
248
        ;
249
        CLR     CONB            ;CAN'T CONTINUE IF MODE CHANGE
250
        ACALL   RO1             ;DO IT
251
        ;
252
C_K:    LJMP    CL3             ;EXIT
253
        ;
254
RO1:    LCALL   DELTST          ;SEE IF INTGER PRESENT ******AA CALL-->LCALL, INTGER-->DELTST
255
        MOV     R4,#R1B0        ;SAVE THE NUMBER ******AA ABS-->IMM, R0B0-->R0B1 ?!?
256
        JNC     $+6             ; ******AA $+4-->$+6 ???
257
        ;MOV    R4,#01H         ;ONE IF NO INTEGER PRESENT ******AA repl. by next two
258
        LCALL   ONE             ; ******AA
259
        MOV     R4,A            ; ******AA
260
        ACALL   ROMFD           ;FIND THE PROGRAM
261
        CJNE    R4,#0,RFX       ;EXIT IF R4 <> 0
262
        INC     DPTR            ;BUMP PAST TAG
263
        MOV     BOFAH,DPH       ;SAVE THE ADDRESS
264
        MOV     BOFAL,DPL
265
        RET
266
        ;
267
ROMFD:  MOV     DPTR,#ROMADR+16 ;START OF USER PROGRAM
268
        ;
269
RF1:    MOVX    A,@DPTR         ;GET THE BYTE
270
        CJNE    A,#55H,RF3      ;SEE IF PROPER TAG
271
        DJNZ    R4,RF2          ;BUMP COUNTER
272
        ;
273
RFX:    RET                     ;DPTR HAS THE START ADDRESS
274
        ;
275
RF2:    INC     DPTR            ;BUMP PAST TAG
276
        ACALL   G5
277
        INC     DPTR            ;BUMP TO NEXT PROGRAM
278
        SJMP    RF1             ;DO IT AGAIN
279
        ;
280
RF3:    JBC     INBIT,RFX       ;EXIT IF SET
281
        ;
282
NOGO:   MOV     DPTR,#NOROM
283
        AJMP    ERRLK
284
        ;
285
        newpage
286
        ;***************************************************************
287
        ;
288
L20DPI: ; load R2:R0 with the location the DPTR is pointing to
289
        ;
290
        ;***************************************************************
291
        ;
292
        MOVX    A,@DPTR
293
        MOV     R2,A
294
        INC     DPTR
295
        MOVX    A,@DPTR
296
        MOV     R0,A
297
        RET                     ;DON'T BUMP DPTR
298
        ;
299
        ;***************************************************************
300
        ;
301
X31DP:  ; swap R3:R1 with DPTR
302
        ;
303
        ;***************************************************************
304
        ;
305
        XCH     A,R3
306
        XCH     A,DPH
307
        XCH     A,R3
308
        XCH     A,R1
309
        XCH     A,DPL
310
        XCH     A,R1
311
        RET
312
        ;
313
        ;***************************************************************
314
        ;
315
LD_T:   ; Load the timer save location with the value the DPTR is
316
        ; pointing to.
317
        ;
318
        ;****************************************************************
319
        ;
320
        MOVX    A,@DPTR
321
        MOV     T_HH,A
322
        INC     DPTR
323
        MOVX    A,@DPTR
324
        MOV     T_LL,A
325
        RET
326
        ;
327
        newpage
328
        ;
329
        ;***************************************************************
330
        ;
331
        ;GETLIN - FIND THE LOCATION OF THE LINE NUMBER IN R3:R1
332
        ;         IF ACC = 0 THE LINE WAS NOT FOUND I.E. R3:R1
333
        ;         WAS TOO BIG, ELSE ACC <> 0 AND THE DPTR POINTS
334
        ;         AT THE LINE THAT IS GREATER THAN OR EQUAL TO THE
335
        ;         VALUE IN R3:R1.
336
        ;
337
        ;***************************************************************
338
        ;
339
GETEND: SETB    ENDBIT          ;GET THE END OF THE PROGRAM
340
        ;
341
GETLIN: LCALL   DP_B            ;GET BEGINNING ADDRESS ******AA CALL-->LCALL
342
        ;
343
G1:     LCALL   B_C             ; ******AA CALL-->LCALL
344
        JZ      G3              ;EXIT WITH A ZERO IN A IF AT END
345
        INC     DPTR            ;POINT AT THE LINE NUMBER
346
        JB      ENDBIT,G2       ;SEE IF WE WANT TO FIND THE END
347
        ACALL   DCMPX           ;SEE IF (DPTR) = R3:R1
348
        ACALL   DECDP           ;POINT AT LINE COUNT
349
        MOVX    A,@DPTR         ;PUT LINE LENGTH INTO ACC
350
        JB      UBIT,G3         ;EXIT IF EQUAL
351
        JC      G3              ;SEE IF LESS THAN OR ZERO
352
        ;
353
G2:     ACALL   ADDPTR          ;ADD IT TO DPTR
354
        SJMP    G1              ;LOOP
355
        ;
356
G3:     CLR     ENDBIT          ;RESET ENDBIT
357
        RET                     ;EXIT
358
        ;
359
G4:     MOV     DPTR,#PSTART    ;DO RAM
360
        ;
361
G5:     SETB    ENDBIT
362
        SJMP    G1              ;NOW DO TEST
363
        ;
364
        newpage
365
        ;***************************************************************
366
        ;
367
        ; LDPTRI - Load the DATA POINTER with the value it is pointing
368
        ;          to - DPH = (DPTR) , DPL = (DPTR+1)
369
        ;
370
        ; acc gets wasted
371
        ;
372
        ;***************************************************************
373
        ;
374
LDPTRI: MOVX    A,@DPTR         ;GET THE HIGH BYTE
375
        PUSH    ACC             ;SAVE IT
376
        INC     DPTR            ;BUMP THE POINTER
377
        MOVX    A,@DPTR         ;GET THE LOW BYTE
378
        MOV     DPL,A           ;PUT IT IN DPL
379
        POP     DPH             ;GET THE HIGH BYTE
380
        RET                     ;GO BACK
381
        ;
382
        ;***************************************************************
383
        ;
384
        ;L31DPI - LOAD R3 WITH (DPTR) AND R1 WITH (DPTR+1)
385
        ;
386
        ;ACC GETS CLOBBERED
387
        ;
388
        ;***************************************************************
389
        ;
390
L31DPI: MOVX    A,@DPTR         ;GET THE HIGH BYTE
391
        MOV     R3,A            ;PUT IT IN THE REG
392
        INC     DPTR            ;BUMP THE POINTER
393
        MOVX    A,@DPTR         ;GET THE NEXT BYTE
394
        MOV     R1,A            ;SAVE IT
395
        RET
396
        ;
397
        ;***************************************************************
398
        ;
399
        ;DECDP - DECREMENT THE DATA POINTER - USED TO SAVE SPACE
400
        ;
401
        ;***************************************************************
402
        ;
403
DECDP2: ACALL   DECDP
404
        ;
405
DECDP:  XCH     A,DPL           ;GET DPL
406
        JNZ     $+4             ;BUMP IF ZERO
407
        DEC     DPH
408
        DEC     A               ;DECREMENT IT
409
        XCH     A,DPL           ;GET A BACK
410
        RET                     ;EXIT
411
        ;
412
        newpage
413
        ;***************************************************************
414
        ;
415
        ;DCMPX - DOUBLE COMPARE - COMPARE (DPTR) TO R3:R1
416
        ;R3:R1 - (DPTR) = SET CARRY FLAG
417
        ;
418
        ;IF R3:R1 > (DPTR) THEN C = 0
419
        ;IF R3:R1 < (DPTR) THEN C = 1
420
        ;IF R3:R1 = (DPTR) THEN C = 0
421
        ;
422
        ;***************************************************************
423
        ;
424
DCMPX:  CLR     UBIT            ;ASSUME NOT EQUAL
425
        MOVX    A,@DPTR         ;GET THE BYTE
426
        CJNE    A,R3B0,D1       ;IF A IS GREATER THAN R3 THEN NO CARRY
427
                                ;WHICH IS R3<@DPTR = NO CARRY AND
428
                                ;R3>@DPTR CARRY IS SET
429
        INC     DPTR            ;BUMP THE DATA POINTER
430
        MOVX    A,@DPTR         ;GET THE BYTE
431
        ACALL   DECDP           ;PUT DPTR BACK
432
        CJNE    A,R1B0,D1       ;DO THE COMPARE
433
        CPL     C               ;FLIP CARRY
434
        ;
435
        CPL     UBIT            ;SET IT
436
D1:     CPL     C               ;GET THE CARRY RIGHT
437
        RET                     ;EXIT
438
        ;
439
        ;***************************************************************
440
        ;
441
        ; ADDPTR - Add acc to the dptr
442
        ;
443
        ; acc gets wasted
444
        ;
445
        ;***************************************************************
446
        ;
447
ADDPTR: ADD     A,DPL           ;ADD THE ACC TO DPL
448
        MOV     DPL,A           ;PUT IT IN DPL
449
        JNC     $+4             ;JUMP IF NO CARRY
450
        INC     DPH             ;BUMP DPH
451
        RET                     ;EXIT
452
        ;
453
        newpage
454
        ;*************************************************************
455
        ;
456
LCLR:   ; Set up the storage allocation
457
        ;
458
        ;*************************************************************
459
        ;
460
        ACALL   ICLR            ;CLEAR THE INTERRUPTS
461
        ACALL   G4              ;PUT END ADDRESS INTO DPTR
462
        MOV     A,#6            ;ADJUST MATRIX SPACE
463
        ACALL   ADDPTR          ;ADD FOR PROPER BOUNDS
464
        ACALL   X31DP           ;PUT MATRIX BOUNDS IN R3:R1
465
        MOV     DPTR,#MT_ALL    ;SAVE R3:R1 IN MATRIX FREE SPACE
466
        ACALL   S31DP           ;DPTR POINTS TO MEMTOP
467
        ACALL   L31DPI          ;LOAD MEMTOP INTO R3:R1
468
        MOV     DPTR,#STR_AL    ;GET MEMORY ALLOCATED FOR STRINGS
469
        ACALL   LDPTRI
470
        LCALL   DUBSUB          ;R3:R1 = MEMTOP - STRING ALLOCATION ******AA CALL-->LCALL
471
        MOV     DPTR,#VARTOP    ;SAVE R3:R1 IN VARTOP
472
        ;
473
        ; FALL THRU TO S31DP2
474
        ;
475
        ;***************************************************************
476
        ;
477
        ;S31DP - STORE R3 INTO (DPTR) AND R1 INTO (DPTR+1)
478
        ;
479
        ;ACC GETS CLOBBERED
480
        ;
481
        ;***************************************************************
482
        ;
483
S31DP2: ACALL   S31DP           ;DO IT TWICE
484
        ;
485
S31DP:  MOV     A,R3            ;GET R3 INTO ACC
486
        MOVX    @DPTR,A         ;STORE IT
487
        INC     DPTR            ;BUMP DPTR
488
        MOV     A,R1            ;GET R1
489
        MOVX    @DPTR,A         ;STORE IT
490
        INC     DPTR            ;BUMP IT AGAIN TO SAVE PROGRAM SPACE
491
        RET                     ;GO BACK
492
        ;
493
        ;
494
        ;***************************************************************
495
        ;
496
STRING: ; Allocate memory for strings
497
        ;
498
        ;***************************************************************
499
        ;
500
        LCALL   TWO             ;R3:R1 = NUMBER, R2:R0 = LEN
501
        MOV     DPTR,#STR_AL    ;SAVE STRING ALLOCATION
502
        ACALL   S31DP
503
        INC     R6              ;BUMP
504
        MOV     S_LEN,R6        ;SAVE STRING LENGTH
505
        AJMP    RCLEAR          ;CLEAR AND SET IT UP
506
        ;
507
        newpage
508
        ;***************************************************************
509
        ;
510
        ; F_VAR - Find  the variable in symbol table
511
        ;         R7:R6 contain the variable name
512
        ;         If not found create a zero entry and set the carry
513
        ;         R2:R0 has the address of variable on return
514
        ;
515
        ;***************************************************************
516
        ;
517
F_VAR:  MOV     DPTR,#VARTOP    ;PUT VARTOP IN DPTR
518
        ACALL   LDPTRI
519
        ACALL   DECDP2          ;ADJUST DPTR FOR LOOKUP
520
        ;
521
F_VAR0: MOVX    A,@DPTR         ;LOAD THE VARIABLE
522
        JZ      F_VAR2          ;TEST IF AT THE END OF THE TABLE
523
        INC     DPTR            ;BUMP FOR NEXT BYTE
524
        CJNE    A,R7B0,F_VAR1   ;SEE IF MATCH
525
        MOVX    A,@DPTR         ;LOAD THE NAME
526
        CJNE    A,R6B0,F_VAR1
527
        ;
528
        ; Found the variable now adjust and put in R2:R0
529
        ;
530
DLD:    MOV     A,DPL           ;R2:R0 = DPTR-2
531
        SUBB    A,#2
532
        MOV     R0,A
533
        MOV     A,DPH
534
        SUBB    A,#0            ;CARRY IS CLEARED
535
        MOV     R2,A
536
        RET
537
        ;
538
F_VAR1: MOV     A,DPL           ;SUBTRACT THE STACK SIZE+ADJUST
539
        CLR     C
540
        SUBB    A,#STESIZ
541
        MOV     DPL,A           ;RESTORE DPL
542
        JNC     F_VAR0
543
        DEC     DPH
544
        SJMP    F_VAR0          ;CONTINUE COMPARE
545
        ;
546
        newpage
547
        ;
548
        ; Add the entry to the symbol table
549
        ;
550
F_VAR2: LCALL   R76S            ;SAVE R7 AND R6
551
        CLR     C
552
        ACALL   DLD             ;BUMP THE POINTER TO GET ENTRY ADDRESS
553
        ;
554
        ; Adjust pointer and save storage allocation
555
        ; and make sure we aren't wiping anything out
556
        ; First calculate new storage allocation
557
        ;
558
        MOV     A,R0
559
        SUBB    A,#STESIZ-3     ;NEED THIS MUCH RAM
560
        MOV     R1,A
561
        MOV     A,R2
562
        SUBB    A,#0
563
        MOV     R3,A
564
        ;
565
        ; Now save the new storage allocation
566
        ;
567
        MOV     DPTR,#ST_ALL
568
        CALL    S31DP           ;SAVE STORAGE ALLOCATION
569
        ;
570
        ; Now make sure we didn't blow it, by wiping out MT_ALL
571
        ;
572
        ACALL   DCMPX           ;COMPARE STORAGE ALLOCATION
573
        JC      CCLR3           ;ERROR IF CARRY
574
        SETB    C               ;DID NOT FIND ENTRY
575
        RET                     ;EXIT IF TEST IS OK
576
        ;
577
        newpage
578
        ;***************************************************************
579
        ;
580
        ; Command action routine - NEW
581
        ;
582
        ;***************************************************************
583
        ;
584
CNEW:   MOV     DPTR,#PSTART    ;SAVE THE START OF PROGRAM
585
        MOV     A,#EOF          ;END OF FILE
586
        MOVX    @DPTR,A         ;PUT IT IN MEMORY
587
        ;
588
        ; falls thru
589
        ;
590
        ;*****************************************************************
591
        ;
592
        ; The statement action routine - CLEAR
593
        ;
594
        ;*****************************************************************
595
        ;
596
        CLR     LINEB           ;SET UP FOR RUN AND GOTO
597
        ;
598
RCLEAR: ACALL   LCLR            ;CLEAR THE INTERRUPTS, SET UP MATRICES
599
        MOV     DPTR,#MEMTOP    ;PUT MEMTOP IN R3:R1
600
        ACALL   L31DPI
601
        ACALL   G4              ;DPTR GETS END ADDRESS
602
        ACALL   CL_1            ;CLEAR THE MEMORY
603
        ;
604
RC1:    MOV     DPTR,#STACKTP   ;POINT AT CONTROL STACK TOP
605
        CLR     A               ;CONTROL UNDERFLOW
606
        ;
607
RC2:    MOVX    @DPTR,A         ;SAVE IN MEMORY
608
        MOV     CSTKA,#STACKTP
609
        MOV     ASTKA,#STACKTP
610
        CLR     CONB            ;CAN'T CONTINUE
611
        RET
612
        ;
613
        newpage
614
        ;***************************************************************
615
        ;
616
        ; Loop until the memory is cleared
617
        ;
618
        ;***************************************************************
619
        ;
620
CL_1:   INC     DPTR            ;BUMP MEMORY POINTER
621
        CLR     A               ;CLEAR THE MEMORY
622
        MOVX    @DPTR,A         ;CLEAR THE RAM
623
        MOVX    A,@DPTR         ;READ IT
624
        JNZ     CCLR3           ;MAKE SURE IT IS CLEARED
625
        MOV     A,R3            ;GET POINTER FOR COMPARE
626
        CJNE    A,DPH,CL_1      ;SEE TO LOOP
627
        MOV     A,R1            ;NOW TEST LOW BYTE
628
        CJNE    A,DPL,CL_1
629
        ;
630
CL_2:   RET
631
        ;
632
CCLR3:  LJMP    TB              ;ALLOCATED MEMORY DOESN'T EXSIST ******AA JMP-->LJMP
633
        ;
634
        ;**************************************************************
635
        ;
636
SCLR:   ;Entry point for clear return
637
        ;
638
        ;**************************************************************
639
        ;
640
        LCALL   DELTST          ;TEST FOR A CR ******AA CALL-->LCALL
641
        JNC     RCLEAR
642
        LCALL   GCI1            ;BUMP THE TEST POINTER ******AA CALL-->LCALL
643
        CJNE    A,#'I',RC1      ;SEE IF I, ELSE RESET THE STACK
644
        ;
645
        ;**************************************************************
646
        ;
647
ICLR:   ; Clear interrupts and system garbage
648
        ;
649
        ;**************************************************************
650
        ;
651
        JNB     INTBIT,$+5      ;SEE IF BASIC HAS INTERRUPTS
652
        CLR     EX1             ;IF SO, CLEAR INTERRUPTS
653
        ANL     34,#00100000B   ;SET INTERRUPTS + CONTINUE
654
        RETI
655
        ;
656
        newpage
657
        ;***************************************************************
658
        ;
659
        ;OUTPUT ROUTINES
660
        ;
661
        ;***************************************************************
662
        ;
663
CRLF2:  ACALL   CRLF            ;DO TWO CRLF'S
664
        ;
665
CRLF:   MOV     R5,#CR          ;LOAD THE CR
666
        ACALL   TEROT           ;CALL TERMINAL OUT
667
        MOV     R5,#LF          ;LOAD THE LF
668
        AJMP    TEROT           ;OUTPUT IT AND RETURN
669
        ;
670
        ;PRINT THE MESSAGE ADDRESSED IN ROM OR RAM BY THE DPTR
671
        ;ENDS WITH THE CHARACTER IN R4
672
        ;DPTR HAS THE ADDRESS OF THE TERMINATOR
673
        ;
674
CRP:    ACALL   CRLF            ;DO A CR THEN PRINT ROM
675
        ;
676
ROM_P:  CLR     A               ;CLEAR A FOR LOOKUP
677
        MOVC    A,@A+DPTR       ;GET THE CHARACTER
678
        CLR     ACC.7           ;CLEAR MS BIT
679
        CJNE    A,#'"',$+4      ;EXIT IF TERMINATOR
680
        RET
681
        SETB    C0ORX1
682
        ;
683
PN1:    MOV     R5,A            ;OUTPUT THE CHARACTER
684
        ACALL   TEROT
685
        INC     DPTR            ;BUMP THE POINTER
686
        SJMP    PN0
687
        ;
688
UPRNT:  ACALL   X31DP
689
        ;
690
PRNTCR: MOV     R4,#CR          ;OUTPUT UNTIL A CR
691
        ;
692
PN0:    JBC     C0ORX1,ROM_P
693
        MOVX    A,@DPTR         ;GET THE RAM BYTE
694
        JZ      $+5
695
        CJNE    A,R4B0,$+4      ;SEE IF THE SAME AS TERMINATOR
696
        RET                     ;EXIT IF THE SAME
697
        CJNE    A,#CR,PN1       ;NEVER PRINT A CR IN THIS ROUTINE
698
        LJMP    E1XX            ;BAD SYNTAX
699
        ;
700
        newpage
701
        ;***************************************************************
702
        ;
703
        ; INLINE - Input a line to IBUF, exit when a CR is received
704
        ;
705
        ;***************************************************************
706
        ;
707
INL2:   CJNE    A,#CNTRLD,INL2B ;SEE IF A CONTROL D
708
        ;
709
INL0:   ACALL   CRLF            ;DO A CR
710
        ;
711
INLINE: MOV     P2,#HI(IBUF)    ;IBUF IS IN THE ZERO PAGE
712
        MOV     R0,#LO(IBUF)    ;POINT AT THE INPUT BUFFER
713
        ;
714
INL1:   ACALL   INCHAR          ;GET A CHARACTER
715
        MOV     R5,A            ;SAVE IN R5 FOR OUTPUT
716
        CJNE    A,#7FH,INL2     ;SEE IF A DELETE CHARACTER
717
        CJNE    R0,#LO(IBUF),INL6
718
        MOV     R5,#BELL        ;OUTPUT A BELL
719
        ;
720
INLX:   ACALL   TEROT           ;OUTPUT CHARACTER
721
        SJMP    INL1            ;DO IT AGAIN
722
        ;
723
INL2B:  MOVX    @R0,A           ;SAVE THE CHARACTER
724
        CJNE    A,#CR,$+5       ;IS IT A CR
725
        AJMP    CRLF            ;OUTPUT A CRLF AND EXIT
726
        CJNE    A,#20H,$+3
727
        JC      INLX            ;ONLY ECHO CONTROL CHARACTERS
728
        INC     R0              ;BUMP THE POINTER
729
        CJNE    R0,#IBUF+79,INLX
730
        DEC     R0              ;FORCE 79
731
        SJMP    INLX-2          ;OUTPUT A BELL
732
        ;
733
INL6:   DEC     R0              ;DEC THE RAM POINTER
734
        MOV     R5,#BS          ;OUTPUT A BACK SPACE
735
        ACALL   TEROT
736
        ACALL   STEROT          ;OUTPUT A SPACE
737
        MOV     R5,#BS          ;ANOTHER BACK SPACE
738
        SJMP    INLX            ;OUTPUT IT
739
        ;
740
PTIME:  DB      128-2           ; PROM PROGRAMMER TIMER
741
        DB      00H
742
        DB      00H
743
        DB      50H
744
        DB      67H
745
        DB      41H
746
        ;
747
        newpage
748
        include bas52.out       ; ******AA
749
        ;
750
BCK:    ACALL   CSTS            ;CHECK STATUS
751
        JNC     CI_RET+1        ;EXIT IF NO CHARACTER
752
        ;
753
        newpage
754
        ;***************************************************************
755
        ;
756
        ;INPUTS A CHARACTER FROM THE SYSTEM CONSOLE.
757
        ;
758
        ;***************************************************************
759
        ;
760
INCHAR: JNB     BI,$+8          ;CHECK FOR MONITOR (BUBBLE)
761
        LCALL   2060H
762
        SJMP    INCH1
763
        JNB     CIUB,$+8        ;CHECK FOR USER
764
        LCALL   4033H
765
        SJMP    INCH1
766
        JNB     RI,$            ;WAIT FOR RECEIVER READY.
767
        MOV     A,SBUF
768
        CLR     RI              ;RESET READY
769
        CLR     ACC.7           ;NO BIT 7
770
        ;
771
INCH1:  CJNE    A,#13H,$+5
772
        SETB    CNT_S
773
        CJNE    A,#11H,$+5
774
        CLR     CNT_S
775
        CJNE    A,#CNTRLC,$+7
776
        JNB     NO_C,C_EX       ;TRAP NO CONTROL C
777
        RET
778
        ;
779
        CLR     JKBIT
780
        CJNE    A,#17H,CI_RET   ;CONTROL W
781
        SETB    JKBIT
782
        ;
783
CI_RET: SETB    C               ;CARRY SET IF A CHARACTER
784
        RET                     ;EXIT
785
        ;
786
        ;*************************************************************
787
        ;
788
        ;RROM - The Statement Action Routine RROM
789
        ;
790
        ;*************************************************************
791
        ;
792
RROM:   SETB    INBIT           ;SO NO ERRORS
793
        ACALL   RO1             ;FIND THE LINE NUMBER
794
        JBC     INBIT,CRUN
795
        RET                     ;EXIT
796
        ;
797
        newpage
798
        ;***************************************************************
799
        ;
800
CSTS:   ;       RETURNS CARRY = 1 IF THERE IS A CHARACTER WAITING FROM
801
        ;       THE SYSTEM CONSOLE. IF NO CHARACTER THE READY CHARACTER
802
        ;       WILL BE CLEARED
803
        ;
804
        ;***************************************************************
805
        ;
806
        JNB     BI,$+6          ;BUBBLE STATUS
807
        LJMP    2068H
808
        JNB     CIUB,$+6        ;SEE IF EXTERNAL CONSOLE
809
        LJMP    4036H
810
        MOV     C,RI
811
        RET
812
        ;
813
        MOV     DPTR,#WB        ;EGO MESSAGE
814
        ACALL   ROM_P
815
        ;
816
C_EX:   CLR     CNT_S           ;NO OUTPUT STOP
817
        LCALL   SPRINT+4        ;ASSURE CONSOLE
818
        ACALL   CRLF
819
        JBC     JKBIT,C_EX-5
820
        ;
821
        JNB     DIRF,SSTOP0
822
        AJMP    C_K             ;CLEAR COB AND EXIT
823
        ;
824
T_CMP:  MOV     A,TVH           ;COMPARE TIMER TO SP_H AND SP_L
825
        MOV     R1,TVL
826
        CJNE    A,TVH,T_CMP
827
        XCH     A,R1
828
        SUBB    A,SP_L
829
        MOV     A,R1
830
        SUBB    A,SP_H
831
        RET
832
        ;
833
        ;*************************************************************
834
        ;
835
BR0:    ; Trap the timer interrupt
836
        ;
837
        ;*************************************************************
838
        ;
839
        CALL    T_CMP           ;COMPARE TIMER
840
        JC      BCHR+6          ;EXIT IF TEST FAILS
841
        SETB    OTI             ;DOING THE TIMER INTERRUPT
842
        CLR     OTS             ;CLEAR TIMER BIT
843
        MOV     C,INPROG        ;SAVE IN PROGRESS
844
        MOV     ISAV,C
845
        MOV     DPTR,#TIV
846
        SJMP    BR2
847
        ;
848
        newpage
849
        ;***************************************************************
850
        ;
851
        ; The command action routine - RUN
852
        ;
853
        ;***************************************************************
854
        ;
855
CRUN:   LCALL   RCLEAR-2        ;CLEAR THE STORAGE ARRAYS
856
        ACALL   SRESTR+2        ;GET THE STARTING ADDRESS
857
        ACALL   B_C
858
        JZ      CMNDLK          ;IF NULL GO TO COMMAND MODE
859
        ;
860
        ACALL   T_DP
861
        ACALL   B_TXA           ;BUMP TO STARTING LINE
862
        ;
863
CILOOP: ACALL   SP0             ;DO A CR AND A LF
864
        CLR     DIRF            ;NOT IN DIRECT MODE
865
        ;
866
        ;INTERPERTER DRIVER
867
        ;
868
ILOOP:  MOV     SP,SPSAV        ;RESTORE THE STACK EACH TIME
869
        JB      DIRF,$+9        ;NO INTERRUPTS IF IN DIRECT MODE
870
        MOV     INTXAH,TXAH     ;SAVE THE TEXT POINTER
871
        MOV     INTXAL,TXAL
872
        LCALL   BCK             ;GET CONSOLE STATUS
873
        JB      DIRF,I_L        ;DIRECT MODE
874
        ANL     C,/GTRD         ;SEE IF CHARACTER READY
875
        JNC     BCHR            ;NO CHARACTER = NO CARRY
876
        ;
877
        ; DO TRAP OPERATION
878
        ;
879
        MOV     DPTR,#GTB       ;SAVE TRAP CHARACTER
880
        MOVX    @DPTR,A
881
        SETB    GTRD            ;SAYS READ A BYTE
882
        ;
883
BCHR:   JB      OTI,I_L         ;EXIT IF TIMER INTERRUPT IN PROGRESS
884
        JB      OTS,BR0         ;TEST TIMER VALUE IF SET
885
        JNB     INTPEN,I_L      ;SEE IF INTERRUPT PENDING
886
        JB      INPROG,I_L      ;DON'T DO IT AGAIN IF IN PROGRESS
887
        MOV     DPTR,#INTLOC    ;POINT AT INTERRUPT LOCATION
888
        ;
889
BR2:    MOV     R4,#GTYPE       ;SETUP FOR A FORCED GOSUB
890
        ACALL   SGS1            ;PUT TXA ON STACK
891
        SETB    INPROG          ;INTERRUPT IN PROGRESS
892
        ;
893
ERL4:   CALL    L20DPI
894
        AJMP    D_L1            ;GET THE LINE NUMBER
895
        ;
896
I_L:    ACALL   ISTAT           ;LOOP
897
        ACALL   CLN_UP          ;FINISH IT OFF
898
        JNC     ILOOP           ;LOOP ON THE DRIVER
899
        JNB     DIRF,CMNDLK     ;CMND1 IF IN RUN MODE
900
        LJMP    CMNDR           ;DON'T PRINT READY
901
        ;
902
CMNDLK: LJMP    CMND1           ;DONE ******AA JMP-->LJMP
903
        newpage
904
        ;**************************************************************
905
        ;
906
        ; The Statement Action Routine - STOP
907
        ;
908
        ;**************************************************************
909
        ;
910
SSTOP:  ACALL   CLN_UP          ;FINISH OFF THIS LINE
911
        MOV     INTXAH,TXAH     ;SAVE TEXT POINTER FOR CONT
912
        MOV     INTXAL,TXAL
913
        ;
914
SSTOP0: SETB    CONB            ;CONTINUE WILL WORK
915
        MOV     DPTR,#STP       ;PRINT THE STOP MESSAGE
916
        SETB    STOPBIT         ;SET FOR ERROR ROUTINE
917
        LJMP    ERRS            ;JUMP TO ERROR ROUTINE ******AA JMP-->LJMP
918
        ;
919
        newpage
920
        ;**************************************************************
921
        ;
922
        ; ITRAP - Trap special function register operators
923
        ;
924
        ;**************************************************************
925
        ;
926
ITRAP:  CJNE    A,#TMR0,$+8     ;TIMER 0
927
        MOV     TH0,R3
928
        MOV     TL0,R1
929
        RET
930
        ;
931
        CJNE    A,#TMR1,$+8     ;TIMER 1
932
        MOV     TH1,R3
933
        MOV     TL1,R1
934
        RET
935
        ;
936
        CJNE    A,#TMR2,$+8     ;TIMER 2
937
        DB      8BH             ;MOV R3 DIRECT OP CODE
938
        DB      0CDH            ;T2H LOCATION
939
        DB      89H             ;MOV R1 DIRECT OP CODE
940
        DB      0CCH            ;T2L LOCATION
941
        RET
942
        ;
943
        CJNE    A,#TRC2,$+8     ;RCAP2 TOKEN
944
RCL:    DB      8BH             ;MOV R3 DIRECT OP CODE
945
        DB      0CBH            ;RCAP2H LOCATION
946
        DB      89H             ;MOV R1 DIRECT OP CODE
947
        DB      0CAH            ;RCAP2L LOCATION
948
        RET
949
        ;
950
        ACALL   R3CK            ;MAKE SURE THAT R3 IS ZERO
951
        CJNE    A,#TT2C,$+6
952
        DB      89H             ;MOV R1 DIRECT OP CODE
953
        DB      0C8H            ;T2CON LOCATION
954
        RET
955
        ;
956
        CJNE    A,#T_IE,$+6     ;IE TOKEN
957
        MOV     IE,R1
958
        RET
959
        ;
960
        CJNE    A,#T_IP,$+6     ;IP TOKEN
961
        MOV     IP,R1
962
        RET
963
        ;
964
        CJNE    A,#TTC,$+6      ;TCON TOKEN
965
        MOV     TCON,R1
966
        RET
967
        ;
968
        CJNE    A,#TTM,$+6      ;TMOD TOKEN
969
        MOV     TMOD,R1
970
        RET
971
        ;
972
        CJNE    A,#T_P1,T_T2    ;P1 TOKEN
973
        MOV     P1,R1
974
        RET
975
        ;
976
        ;***************************************************************
977
        ;
978
        ; T_TRAP - Trap special operators
979
        ;
980
        ;***************************************************************
981
        ;
982
T_T:    MOV     TEMP5,A         ;SAVE THE TOKEN
983
        ACALL   GCI1            ;BUMP POINTER
984
        ACALL   SLET2           ;EVALUATE AFTER =
985
        MOV     A,TEMP5         ;GET THE TOKEN BACK
986
        CJNE    A,#T_XTAL,$+6
987
        LJMP    AXTAL1          ;SET UP CRYSTAL
988
        ;
989
        ACALL   IFIXL           ;R3:R1 HAS THE TOS
990
        MOV     A,TEMP5         ;GET THE TOKEN AGAIN
991
        CJNE    A,#T_MTOP,T_T1  ;SEE IF MTOP TOKEN
992
        MOV     DPTR,#MEMTOP
993
        CALL    S31DP
994
        JMP     RCLEAR          ;CLEAR THE MEMORY
995
        ;
996
T_T1:   CJNE    A,#T_TIME,ITRAP ;SEE IF A TIME TOKEN
997
        MOV     C,EA            ;SAVE INTERRUPTS
998
        CLR     EA              ;NO TIMER 0 INTERRUPTS DURING LOAD
999
        MOV     TVH,R3          ;SAVE THE TIME
1000
        MOV     TVL,R1
1001
        MOV     EA,C            ;RESTORE INTERRUPTS
1002
        RET                     ;EXIT
1003
        ;
1004
T_T2:   CJNE    A,#T_PC,INTERX  ;PCON TOKEN
1005
        DB      89H             ;MOV DIRECT, R1 OP CODE
1006
        DB      87H             ;ADDRESS OF PCON
1007
        RET                     ;EXIT
1008
        ;
1009
T_TRAP: CJNE    A,#T_ASC,T_T    ;SEE IF ASC TOKEN
1010
        ACALL   IGC             ;EAT IT AND GET THE NEXT CHARACTER
1011
        CJNE    A,#'$',INTERX   ;ERROR IF NOT A STRING
1012
        ACALL   CSY             ;CALCULATE ADDRESS
1013
        ACALL   X3120
1014
        LCALL   TWO_EY          ; ******AA CALL-->LCALL
1015
        ACALL   SPEOP+4         ;EVALUATE AFTER EQUALS
1016
        AJMP    ISTAX1          ;SAVE THE CHARACTER
1017
        ;
1018
        newpage
1019
        ;**************************************************************
1020
        ;
1021
        ;INTERPERT THE STATEMENT POINTED TO BY TXAL AND TXAH
1022
        ;
1023
        ;**************************************************************
1024
        ;
1025
ISTAT:  ACALL   GC              ;GET THR FIRST CHARACTER
1026
        JNB     XBIT,IAT        ;TRAP TO EXTERNAL RUN PACKAGE
1027
        CJNE    A,#20H,$+3
1028
        JNC     IAT
1029
        LCALL   2070H           ;LET THE USER SET UP THE DPTR
1030
        ACALL   GCI1
1031
        ANL     A,#0FH          ;STRIP OFF BIAS
1032
        SJMP    ISTA1
1033
        ;
1034
IAT:    CJNE    A,#T_XTAL,$+3
1035
        JNC     T_TRAP
1036
        JNB     ACC.7,SLET      ;IMPLIED LET IF BIT 7 NOT SET
1037
        CJNE    A,#T_UOP+12,ISTAX       ;DBYTE TOKEN
1038
        ACALL   SPEOP           ;EVALUATE SPECIAL OPERATOR
1039
        ACALL   R3CK            ;CHECK LOCATION
1040
        MOV     @R1,A           ;SAVE IT
1041
        RET
1042
        ;
1043
ISTAX:  CJNE    A,#T_UOP+13,ISTAY       ;XBYTE TOKEN
1044
        ACALL   SPEOP
1045
        ;
1046
ISTAX1: MOV     P2,R3
1047
        MOVX    @R1,A
1048
        RET
1049
        ;
1050
ISTAY:  CJNE    A,#T_CR+1,$+3   ;TRAP NEW OPERATORS
1051
        JC      I_S
1052
        CJNE    A,#0B0H,$+3     ;SEE IF TOO BIG
1053
        JNC     INTERX
1054
        ADD     A,#0F9H         ;BIAS FOR LOOKUP TABLE
1055
        SJMP    ISTA0           ;DO THE OPERATION
1056
        ;
1057
I_S:    CJNE    A,#T_LAST,$+3   ;MAKE SURE AN INITIAL RESERVED WORD
1058
        JC      $+5             ;ERROR IF NOT
1059
        ;
1060
INTERX: LJMP    E1XX            ;SYNTAX ERROR
1061
        ;
1062
        JNB     DIRF,ISTA0      ;EXECUTE ALL STATEMENTS IF IN RUN MODE
1063
        CJNE    A,#T_DIR,$+3    ;SEE IF ON TOKEN
1064
        JC      ISTA0           ;OK IF DIRECT
1065
        CJNE    A,#T_GOSB+1,$+5 ;SEE IF FOR
1066
        SJMP    ISTA0           ;FOR IS OK
1067
        CJNE    A,#T_REM+1,$+5  ;NEXT IS OK
1068
        SJMP    ISTA0
1069
        CJNE    A,#T_STOP+6,INTERX      ;SO IS REM
1070
        ;
1071
        newpage
1072
ISTA0:  ACALL   GCI1            ;ADVANCE THE TEXT POINTER
1073
        MOV     DPTR,#STATD     ;POINT DPTR TO LOOKUP TABLE
1074
        CJNE    A,#T_GOTO-3,$+5 ;SEE IF LET TOKEN
1075
        SJMP    ISTAT           ;WASTE LET TOKEN
1076
        ANL     A,#3FH          ;STRIP OFF THE GARBAGE
1077
        ;
1078
ISTA1:  RL      A               ;ROTATE FOR OFFSET
1079
        ADD     A,DPL           ;BUMP
1080
        MOV     DPL,A           ;SAVE IT
1081
        CLR     A
1082
        MOVC    A,@A+DPTR       ;GET HIGH BYTE
1083
        PUSH    ACC             ;SAVE IT
1084
        INC     DPTR
1085
        CLR     A
1086
        MOVC    A,@A+DPTR       ;GET LOW BYTE
1087
        POP     DPH
1088
        MOV     DPL,A
1089
        ;
1090
AC1:    CLR     A
1091
        JMP     @A+DPTR         ;GO DO IT
1092
        ;
1093
        newpage
1094
        ;***************************************************************
1095
        ;
1096
        ; The statement action routine - LET
1097
        ;
1098
        ;***************************************************************
1099
        ;
1100
SLET:   ACALL   S_C             ;CHECK FOR POSSIBLE STRING
1101
        JC      SLET0           ;NO STRING
1102
        CLR     LINEB           ;USED STRINGS
1103
        ;
1104
        CALL    X31DP           ;PUT ADDRESS IN DPTR
1105
        MOV     R7,#T_EQU       ;WASTE =
1106
        ACALL   EATC
1107
        ACALL   GC              ;GET THE NEXT CHARACTER
1108
        CJNE    A,#'"',S_3      ;CHECK FOR A "
1109
        MOV     R7,S_LEN        ;GET THE STRING LENGTH
1110
        ;
1111
S_0:    ACALL   GCI1            ;BUMP PAST "
1112
        ACALL   DELTST          ;CHECK FOR DELIMITER
1113
        JZ      INTERX          ;EXIT IF CARRIAGE RETURN
1114
        MOVX    @DPTR,A         ;SAVE THE CHARACTER
1115
        CJNE    A,#'"',S_1      ;SEE IF DONE
1116
        ;
1117
S_E:    MOV     A,#CR           ;PUT A CR IN A
1118
        MOVX    @DPTR,A         ;SAVE CR
1119
        AJMP    GCI1
1120
        ;
1121
S_3:    PUSH    DPH
1122
        PUSH    DPL             ;SAVE DESTINATION
1123
        ACALL   S_C             ;CALCULATE SOURCE
1124
        JC      INTERX          ;ERROR IF CARRY
1125
        POP     R0B0            ;GET DESTINATION BACK
1126
        POP     R2B0
1127
        ;
1128
SSOOP:  MOV     R7,S_LEN        ;SET UP COUNTER
1129
        ;
1130
S_4:    LCALL   TBYTE           ;TRANSFER THE BYTE ******AA CALL-->LCALL
1131
        CJNE    A,#CR,$+4       ;EXIT IF A CR
1132
        RET
1133
        DJNZ    R7,S_5          ;BUMP COUNTER
1134
        MOV     A,#CR           ;SAVE A CR
1135
        MOVX    @R0,A
1136
        AJMP    EIGP            ;PRINT EXTRA IGNORED
1137
        ;
1138
        newpage
1139
        ;
1140
S_5:    CALL    INC3210         ;BUMP POINTERS
1141
        SJMP    S_4             ;LOOP
1142
        ;
1143
S_1:    DJNZ    R7,$+8          ;SEE IF DONE
1144
        ACALL   S_E
1145
        ACALL   EIGP            ;PRINT EXTRA IGNORED
1146
        AJMP    FINDCR          ;GO FIND THE END
1147
        INC     DPTR            ;BUMP THE STORE POINTER
1148
        SJMP    S_0             ;CONTINUE TO LOOP
1149
        ;
1150
E3XX:   MOV     DPTR,#E3X       ;BAD ARG ERROR
1151
        AJMP    EK
1152
        ;
1153
SLET0:  ACALL   SLET1
1154
        AJMP    POPAS           ;COPY EXPRESSION TO VARIABLE
1155
        ;
1156
SLET1:  ACALL   VAR_ER          ;CHECK FOR A"VARIABLE"
1157
        ;
1158
SLET2:  PUSH    R2B0            ;SAVE THE VARIABLE ADDRESS
1159
        PUSH    R0B0
1160
        MOV     R7,#T_EQU       ;GET EQUAL TOKEN
1161
        ACALL   WE
1162
        POP     R1B0            ;POP VARIABLE TO R3:R1
1163
        POP     R3B0
1164
        RET                     ;EXIT
1165
        ;
1166
R3CK:   CJNE    R3,#00H,E3XX    ;CHECK TO SEE IF R3 IS ZERO
1167
        RET
1168
        ;
1169
SPEOP:  ACALL   GCI1            ;BUMP TXA
1170
        ACALL   P_E             ;EVALUATE PAREN
1171
        ACALL   SLET2           ;EVALUATE AFTER =
1172
        CALL    TWOL            ;R7:R6 GETS VALUE, R3:R1 GETS LOCATION
1173
        MOV     A,R6            ;SAVE THE VALUE
1174
        ;
1175
        CJNE    R7,#00H,E3XX    ;R2 MUST BE = 0
1176
        RET
1177
        ;
1178
        newpage
1179
        ;**************************************************************
1180
        ;
1181
        ; ST_CAL - Calculate string Address
1182
        ;
1183
        ;**************************************************************
1184
        ;
1185
IST_CAL:;
1186
        ;
1187
        ACALL   I_PI            ;BUMP TEXT, THEN EVALUATE
1188
        ACALL   R3CK            ;ERROR IF R3 <> 0
1189
        INC     R1              ;BUMP FOR OFFSET
1190
        MOV     A,R1            ;ERROR IF R1 = 255
1191
        JZ      E3XX
1192
        MOV     DPTR,#VARTOP    ;GET TOP OF VARIABLE STORAGE
1193
        MOV     B,S_LEN         ;MULTIPLY FOR LOCATION
1194
        ACALL   VARD            ;CALCULATE THE LOCATION
1195
        MOV     DPTR,#MEMTOP    ;SEE IF BLEW IT
1196
        CALL    FUL1
1197
        MOV     DPL,S_LEN       ;GET STRING LENGTH, DPH = 00H
1198
        DEC     DPH             ;DPH = 0
1199
        ;
1200
DUBSUB: CLR     C
1201
        MOV     A,R1
1202
        SUBB    A,DPL
1203
        MOV     R1,A
1204
        MOV     A,R3
1205
        SUBB    A,DPH
1206
        MOV     R3,A
1207
        ORL     A,R1
1208
        RET
1209
        ;
1210
        ;***************************************************************
1211
        ;
1212
        ;VARD - Calculate the offset base
1213
        ;
1214
        ;***************************************************************
1215
        ;
1216
VARB:   MOV     B,#FPSIZ        ;SET UP FOR OPERATION
1217
        ;
1218
VARD:   CALL    LDPTRI          ;LOAD DPTR
1219
        MOV     A,R1            ;MULTIPLY BASE
1220
        MUL     AB
1221
        ADD     A,DPL
1222
        MOV     R1,A
1223
        MOV     A,B
1224
        ADDC    A,DPH
1225
        MOV     R3,A
1226
        RET
1227
        ;
1228
        newpage
1229
        ;*************************************************************
1230
        ;
1231
CSY:    ; Calculate a biased string address and put in R3:R1
1232
        ;
1233
        ;*************************************************************
1234
        ;
1235
        ACALL   IST_CAL         ;CALCULATE IT
1236
        PUSH    R3B0            ;SAVE IT
1237
        PUSH    R1B0
1238
        MOV     R7,#','         ;WASTE THE COMMA
1239
        ACALL   EATC
1240
        ACALL   ONE             ;GET THE NEXT EXPRESSION
1241
        MOV     A,R1            ;CHECK FOR BOUNDS
1242
        CJNE    A,S_LEN,$+3
1243
        JNC     E3XX            ;MUST HAVE A CARRY
1244
        DEC     R1              ;BIAS THE POINTER
1245
        POP     ACC             ;GET VALUE LOW
1246
        ADD     A,R1            ;ADD IT TO BASE
1247
        MOV     R1,A            ;SAVE IT
1248
        POP     R3B0            ;GET HIGH ADDRESS
1249
        JNC     $+3             ;PROPAGATE THE CARRY
1250
        INC     R3
1251
        AJMP    ERPAR           ;WASTE THE RIGHT PAREN
1252
        ;
1253
        newpage
1254
        ;***************************************************************
1255
        ;
1256
        ; The statement action routine FOR
1257
        ;
1258
        ;***************************************************************
1259
        ;
1260
SFOR:   ACALL   SLET1           ;SET UP CONTROL VARIABLE
1261
        PUSH    R3B0            ;SAVE THE CONTROL VARIABLE LOCATION
1262
        PUSH    R1B0
1263
        ACALL   POPAS           ;POP ARG STACK AND COPY CONTROL VAR
1264
        MOV     R7,#T_TO        ;GET TO TOKEN
1265
        ACALL   WE
1266
        ACALL   GC              ;GET NEXT CHARACTER
1267
        CJNE    A,#T_STEP,SF2
1268
        ACALL   GCI1            ;EAT THE TOKEN
1269
        ACALL   EXPRB           ;EVALUATE EXPRESSION
1270
        SJMP    $+5             ;JUMP OVER
1271
        ;
1272
SF2:    LCALL   PUSH_ONE        ;PUT ONE ON THE STACK
1273
        ;
1274
        MOV     A,#-FSIZE       ;ALLOCATE FSIZE BYTES ON THE CONTROL STACK
1275
        ACALL   PUSHCS          ;GET CS IN R0
1276
        ACALL   CSC             ;CHECK CONTROL STACK
1277
        MOV     R3,#CSTKAH      ;IN CONTROL STACK
1278
        MOV     R1,R0B0         ;STACK ADDRESS
1279
        ACALL   POPAS           ;PUT STEP ON STACK
1280
        ACALL   POPAS           ;PUT LIMIT ON STACK
1281
        ACALL   DP_T            ;DPTR GETS TEXT
1282
        MOV     R0,R1B0         ;GET THE POINTER
1283
        ACALL   T_X_S           ;SAVE THE TEXT
1284
        POP     TXAL            ;GET CONTROL VARIABLE
1285
        POP     TXAH
1286
        MOV     R4,#FTYPE       ;AND THE TYPE
1287
        ACALL   T_X_S           ;SAVE IT
1288
        ;
1289
SF3:    ACALL   T_DP            ;GET THE TEXT POINTER
1290
        AJMP    ILOOP           ;CONTINUE TO PROCESS
1291
        ;
1292
        newpage
1293
        ;**************************************************************
1294
        ;
1295
        ; The statement action routines - PUSH and POP
1296
        ;
1297
        ;**************************************************************
1298
        ;
1299
SPUSH:  ACALL   EXPRB           ;PUT EXPRESSION ON STACK
1300
        ACALL   C_TST           ;SEE IF MORE TO DO
1301
        JNC     SPUSH           ;IF A COMMA PUSH ANOTHER
1302
        RET
1303
        ;
1304
        ;
1305
SPOP:   ACALL   VAR_ER          ;GET VARIABLE
1306
        ACALL   XPOP            ;FLIP THE REGISTERS FOR POPAS
1307
        ACALL   C_TST           ;SEE IF MORE TO DO
1308
        JNC     SPOP
1309
        ;
1310
        RET
1311
        ;
1312
        ;***************************************************************
1313
        ;
1314
        ; The statement action routine - IF
1315
        ;
1316
        ;***************************************************************
1317
        ;
1318
SIF:    ACALL   RTST            ;EVALUATE THE EXPRESSION
1319
        MOV     R1,A            ;SAVE THE RESULT
1320
        ACALL   GC              ;GET THE CHARACTER AFTER EXPR
1321
        CJNE    A,#T_THEN,$+5   ;SEE IF THEN TOKEN
1322
        ACALL   GCI1            ;WASTE THEN TOKEN
1323
        CJNE    R1,#0,T_F1      ;CHECK R_OP RESULT
1324
        ;
1325
E_FIND: MOV     R7,#T_ELSE      ;FIND ELSE TOKEN
1326
        ACALL   FINDC
1327
        JZ      SIF-1           ;EXIT IF A CR
1328
        ACALL   GCI1            ;BUMP PAST TOKEN
1329
        CJNE    A,#T_ELSE,E_FIND;WASTE IF NO ELSE
1330
        ;
1331
T_F1:   ACALL   INTGER          ;SEE IF NUMBER
1332
        JNC     D_L1            ;EXECUTE LINE NUMBER
1333
        AJMP    ISTAT           ;EXECUTE STATEMENT IN NOT
1334
        ;
1335
B_C:    MOVX    A,@DPTR
1336
        DEC     A
1337
        JB      ACC.7,FL3-5
1338
        RET
1339
        ;
1340
        newpage
1341
        ;***************************************************************
1342
        ;
1343
        ; The statement action routine - GOTO
1344
        ;
1345
        ;***************************************************************
1346
        ;
1347
SGOTO:  ACALL   RLINE           ;R2:R0 AND DPTR GET INTGER
1348
        ;
1349
SGT1:   ACALL   T_DP            ;TEXT POINTER GETS DPTR
1350
        ;
1351
        JBC     RETBIT,SGT2     ;SEE IF RETI EXECUTED
1352
        ;
1353
        JNB     LINEB,$+6       ;SEE IF A LINE WAS EDITED
1354
        LCALL   RCLEAR-2        ;CLEAR THE MEMORY IF SET
1355
        AJMP    ILOOP-2         ;CLEAR DIRF AND LOOP
1356
        ;
1357
SGT2:   JBC     OTI,$+8         ;SEE IF TIMER INTERRUPT
1358
        ANL     34,#10111101B   ;CLEAR INTERRUPTS
1359
        AJMP    ILOOP           ;EXECUTE
1360
        MOV     C,ISAV
1361
        MOV     INPROG,C
1362
        AJMP    ILOOP           ;RESTORE INTERRUPTS AND RET
1363
        ;
1364
        ;
1365
        ;*************************************************************
1366
        ;
1367
RTST:   ; Test for ZERO
1368
        ;
1369
        ;*************************************************************
1370
        ;
1371
        ACALL   EXPRB           ;EVALUATE EXPRESSION
1372
        CALL    INC_ASTKA       ;BUMP ARG STACK
1373
        JZ      $+4             ;EXIT WITH ZERO OR 0FFH
1374
        MOV     A,#0FFH
1375
        RET
1376
        ;
1377
        newpage
1378
        ;
1379
        ;**************************************************************
1380
        ;
1381
        ; GLN - get the line number in R2:R0, return in DPTR
1382
        ;
1383
        ;**************************************************************
1384
        ;
1385
GLN:    ACALL   DP_B            ;GET THE BEGINNING ADDRESS
1386
        ;
1387
FL1:    MOVX    A,@DPTR         ;GET THE LENGTH
1388
        MOV     R7,A            ;SAVE THE LENGTH
1389
        DJNZ    R7,FL3          ;SEE IF END OF FILE
1390
        ;
1391
        MOV     DPTR,#E10X      ;NO LINE NUMBER
1392
        AJMP    EK              ;HANDLE THE ERROR
1393
        ;
1394
FL3:    JB      ACC.7,$-5       ;CHECK FOR BIT 7
1395
        INC     DPTR            ;POINT AT HIGH BYTE
1396
        MOVX    A,@DPTR         ;GET HIGH BYTE
1397
        CJNE    A,R2B0,FL2      ;SEE IF MATCH
1398
        INC     DPTR            ;BUMP TO LOW BYTE
1399
        DEC     R7              ;ADJUST AGAIN
1400
        MOVX    A,@DPTR         ;GET THE LOW BYTE
1401
        CJNE    A,R0B0,FL2      ;SEE IF LOW BYTE MATCH
1402
        INC     DPTR            ;POINT AT FIRST CHARACTER
1403
        RET                     ;FOUND IT
1404
        ;
1405
FL2:    MOV     A,R7            ;GET THE LENGTH COUNTER
1406
        CALL    ADDPTR          ;ADD A TO DATA POINTER
1407
        SJMP    FL1             ;LOOP
1408
        ;
1409
        ;
1410
        ;*************************************************************
1411
        ;
1412
        ;RLINE - Read in ASCII string, get line, and clean it up
1413
        ;
1414
        ;*************************************************************
1415
        ;
1416
RLINE:  ACALL   INTERR          ;GET THE INTEGER
1417
        ;
1418
RL1:    ACALL   GLN
1419
        AJMP    CLN_UP
1420
        ;
1421
        ;
1422
D_L1:   ACALL   GLN             ;GET THE LINE
1423
        AJMP    SGT1            ;EXECUTE THE LINE
1424
        ;
1425
        newpage
1426
        ;***************************************************************
1427
        ;
1428
        ; The statement action routines WHILE and UNTIL
1429
        ;
1430
        ;***************************************************************
1431
        ;
1432
SWHILE: ACALL   RTST            ;EVALUATE RELATIONAL EXPRESSION
1433
        CPL     A
1434
        SJMP    S_WU
1435
        ;
1436
SUNTIL: ACALL   RTST            ;EVALUATE RELATIONAL EXPRESSION
1437
        ;
1438
S_WU:   MOV     R4,#DTYPE       ;DO EXPECTED
1439
        MOV     R5,A            ;SAVE R_OP RESULT
1440
        SJMP    SR0             ;GO PROCESS
1441
        ;
1442
        ;
1443
        ;***************************************************************
1444
        ;
1445
CNULL:  ; The Command Action Routine - NULL
1446
        ;
1447
        ;***************************************************************
1448
        ;
1449
        ACALL   INTERR          ;GET AN INTEGER FOLLOWING NULL
1450
        MOV     NULLCT,R0       ;SAVE THE NULLCOUNT
1451
        AJMP    CMNDLK          ;JUMP TO COMMAND MODE
1452
        ;
1453
        newpage
1454
        ;***************************************************************
1455
        ;
1456
        ; The statement action routine - RETI
1457
        ;
1458
        ;***************************************************************
1459
        ;
1460
SRETI:  SETB    RETBIT          ;SAYS THAT RETI HAS BEEN EXECUTED
1461
        ;
1462
        ;***************************************************************
1463
        ;
1464
        ; The statement action routine - RETURN
1465
        ;
1466
        ;***************************************************************
1467
        ;
1468
SRETRN: MOV     R4,#GTYPE       ;MAKE SURE OF GOSUB
1469
        MOV     R5,#55H         ;TYPE RETURN TYPE
1470
        ;
1471
SR0:    ACALL   CSETUP          ;SET UP CONTROL STACK
1472
        MOVX    A,@R0           ;GET RETURN TEXT ADDRESS
1473
        MOV     DPH,A
1474
        INC     R0
1475
        MOVX    A,@R0
1476
        MOV     DPL,A
1477
        INC     R0              ;POP CONTROL STACK
1478
        MOVX    A,@DPTR         ;SEE IF GOSUB WAS THE LAST STATEMENT
1479
        CJNE    A,#EOF,$+5
1480
        AJMP    CMNDLK
1481
        MOV     A,R5            ;GET TYPE
1482
        JZ      SGT1            ;EXIT IF ZERO
1483
        MOV     CSTKA,R0        ;POP THE STACK
1484
        CPL     A               ;OPTION TEST, 00H, 55H, 0FFH, NOW 55H
1485
        JNZ     SGT1            ;MUST BE GOSUB
1486
        RET                     ;NORMAL FALL THRU EXIT FOR NO MATCH
1487
        ;
1488
        newpage
1489
        ;***************************************************************
1490
        ;
1491
        ; The statement action routine - GOSUB
1492
        ;
1493
        ;***************************************************************
1494
        ;
1495
SGOSUB: ACALL   RLINE           ;NEW TXA IN DPTR
1496
        ;
1497
SGS0:   MOV     R4,#GTYPE
1498
        ACALL   SGS1            ;SET EVERYTHING UP
1499
        AJMP    SF3             ;EXIT
1500
        ;
1501
SGS1:   MOV     A,#-3           ;ALLOCATE 3 BYTES ON CONTROL STACK
1502
        ACALL   PUSHCS
1503
        ;
1504
T_X_S:  MOV     P2,#CSTKAH      ;SET UP PORT FOR CONTROL STACK
1505
        MOV     A,TXAL          ;GET RETURN ADDRESS AND SAVE IT
1506
        MOVX    @R0,A
1507
        DEC     R0
1508
        MOV     A,TXAH
1509
        MOVX    @R0,A
1510
        DEC     R0
1511
        MOV     A,R4            ;GET TYPE
1512
        MOVX    @R0,A           ;SAVE TYPE
1513
        RET                     ;EXIT
1514
        ;
1515
        ;
1516
CS1:    MOV     A,#3            ;POP 3 BYTES
1517
        ACALL   PUSHCS
1518
        ;
1519
CSETUP: MOV     R0,CSTKA        ;GET CONTROL STACK
1520
        MOV     P2,#CSTKAH
1521
        MOVX    A,@R0           ;GET BYTE
1522
        CJNE    A,R4B0,$+5      ;SEE IF TYPE MATCH
1523
        INC     R0
1524
        RET
1525
        JZ      E4XX            ;EXIT IF STACK UNDERFLOW
1526
        CJNE    A,#FTYPE,CS1    ;SEE IF FOR TYPE
1527
        ACALL   PUSHCS-2        ;WASTE THE FOR TYPE
1528
        SJMP    CSETUP          ;LOOP
1529
        ;
1530
        newpage
1531
        ;***************************************************************
1532
        ;
1533
        ; The statement action routine - NEXT
1534
        ;
1535
        ;***************************************************************
1536
        ;
1537
SNEXT:  MOV     R4,#FTYPE       ;FOR TYPE
1538
        ACALL   CSETUP          ;SETUP CONTROL STACK
1539
        MOV     TEMP5,R0        ;SAVE CONTROL VARIABLE ADDRESS
1540
        MOV     R1,#TEMP1       ;SAVE VAR + RETURN IN TEMP1-4
1541
        ;
1542
XXI:    MOVX    A,@R0           ;LOOP UNTIL DONE
1543
        MOV     @R1,A
1544
        INC     R1
1545
        INC     R0
1546
        CJNE    R1,#TEMP5,XXI
1547
        ;
1548
        ACALL   VAR             ;SEE IF THE USER HAS A VARIABLE
1549
        JNC     $+6
1550
        MOV     R2,TEMP1
1551
        MOV     R0,TEMP2
1552
        MOV     A,R2            ;SEE IF VAR'S AGREE
1553
        CJNE    A,TEMP1,E4XX
1554
        MOV     A,R0
1555
        CJNE    A,TEMP2,E4XX
1556
        ACALL   PUSHAS          ;PUT CONTROL VARIABLE ON STACK
1557
        MOV     A,#FPSIZ+FPSIZ+2;COMPUTE ADDRESS TO STEP VALUE SIGN
1558
        ADD     A,TEMP5         ;ADD IT TO BASE OF STACK
1559
        MOV     R0,A            ;SAVE IN R0
1560
        MOV     R2,#CSTKAH      ;SET UP TO PUSH STEP VALUE
1561
        MOV     P2,R2           ;SET UP PORT
1562
        MOVX    A,@R0           ;GET SIGN
1563
        INC     R0              ;BACK TO EXPONENT
1564
        PUSH    ACC             ;SAVE SIGN OF STEP
1565
        ACALL   PUSHAS          ;PUT STEP VALUE ON STACK
1566
        PUSH    R0B0            ;SAVE LIMIT VALUE LOCATION
1567
        CALL    AADD            ;ADD STEP VALUE TO VARIABLE
1568
        CALL    CSTAKA          ;COPY STACK
1569
        MOV     R3,TEMP1        ;GET CONTROL VARIABLE
1570
        MOV     R1,TEMP2
1571
        ACALL   POPAS           ;SAVE THE RESULT
1572
        MOV     R2,#CSTKAH      ;RESTORE LIMIT LOCATION
1573
        POP     R0B0
1574
        ACALL   PUSHAS          ;PUT LIMIT ON STACK
1575
        CALL    FP_BASE+4       ;DO THE COMPARE
1576
        POP     ACC             ;GET LIMIT SIGN BACK
1577
        JZ      $+3             ;IF SIGN NEGATIVE, TEST "BACKWARDS"
1578
        CPL     C
1579
        ORL     C,F0            ;SEE IF EQUAL
1580
        JC      N4              ;STILL SMALLER THAN LIMIT?
1581
        MOV     A,#FSIZE        ;REMOVE CONTROL STACK ENTRY
1582
        ;
1583
        ; Fall thru to PUSHCS
1584
        ;
1585
        newpage
1586
        ;***************************************************************
1587
        ;
1588
        ; PUSHCS - push frame onto control stack
1589
        ;          acc has - number of bytes, also test for overflow
1590
        ;
1591
        ;***************************************************************
1592
        ;
1593
PUSHCS: ADD     A,CSTKA         ;BUMP CONTROL STACK
1594
        CJNE    A,#CONVT+17,$+3 ;SEE IF OVERFLOWED
1595
        JC      E4XX            ;EXIT IF STACK OVERFLOW
1596
        XCH     A,CSTKA         ;STORE NEW CONTROL STACK VALUE, GET OLD
1597
        DEC     A               ;BUMP OLD VALUE
1598
        MOV     R0,A            ;PUT OLD-1 IN R0
1599
        ;
1600
        RET                     ;EXIT
1601
        ;
1602
CSC:    ACALL   CLN_UP          ;FINISH OFF THE LINE
1603
        JNC     CSC-1           ;EXIT IF NO TERMINATOR
1604
        ;
1605
E4XX:   MOV     DPTR,#EXC       ;CONTROL STACK ERROR
1606
        AJMP    EK              ;STACK ERROR
1607
        ;
1608
N4:     MOV     TXAH,TEMP3      ;GET TEXT POINTER
1609
        MOV     TXAL,TEMP4
1610
        AJMP    ILOOP           ;EXIT
1611
        ;
1612
        ;***************************************************************
1613
        ;
1614
        ; The statement action routine - RESTORE
1615
        ;
1616
        ;***************************************************************
1617
        ;
1618
SRESTR: ACALL   X_TR            ;SWAP POINTERS
1619
        ACALL   DP_B            ;GET THE STARTING ADDRESS
1620
        ACALL   T_DP            ;PUT STARTING ADDRESS IN TEXT POINTER
1621
        ACALL   B_TXA           ;BUMP TXA
1622
        ;
1623
        ; Fall thru
1624
        ;
1625
X_TR:   ;swap txa and rtxa
1626
        ;
1627
        XCH     A,TXAH
1628
        XCH     A,RTXAH
1629
        XCH     A,TXAH
1630
        XCH     A,TXAL
1631
        XCH     A,RTXAL
1632
        XCH     A,TXAL
1633
        RET                     ;EXIT
1634
        ;
1635
        newpage
1636
        ;***************************************************************
1637
        ;
1638
        ; The statement action routine - READ
1639
        ;
1640
        ;***************************************************************
1641
        ;
1642
SREAD:  ACALL   X_TR            ;SWAP POINTERS
1643
        ;
1644
SRD0:   ACALL   C_TST           ;CHECK FOR COMMA
1645
        JC      SRD4            ;SEE WHAT IT IS
1646
        ;
1647
SRD:    ACALL   EXPRB           ;EVALUATE THE EXPRESSION
1648
        ACALL   GC              ;GET THE CHARACTER AFTER EXPRESSION
1649
        CJNE    A,#',',SRD1     ;SEE IF MORE DATA
1650
        SJMP    SRD2            ;BYBASS CLEAN UP IF A COMMA
1651
        ;
1652
SRD1:   ACALL   CLN_UP          ;FINISH OFF THE LINE, IF AT END
1653
        ;
1654
SRD2:   ACALL   X_TR            ;RESTORE POINTERS
1655
        ACALL   VAR_ER          ;GET VARIABLE ADDRESS
1656
        ACALL   XPOP            ;FLIP THE REGISTERS FOR POPAS
1657
        ACALL   C_TST           ;SEE IF A COMMA
1658
        JNC     SREAD           ;READ AGAIN IF A COMMA
1659
        RET                     ;EXIT IF NOT
1660
        ;
1661
SRD4:   CJNE    A,#T_DATA,SRD5  ;SEE IF DATA
1662
        ACALL   GCI1            ;BUMP POINTER
1663
        SJMP    SRD
1664
        ;
1665
SRD5:   CJNE    A,#EOF,SRD6     ;SEE IF YOU BLEW IT
1666
        ACALL   X_TR            ;GET THE TEXT POINTER BACK
1667
        MOV     DPTR,#E14X      ;READ ERROR
1668
        ;
1669
EK:     LJMP    ERROR
1670
        ;
1671
SRD6:   ACALL   FINDCR          ;WASTE THIS LINE
1672
        ACALL   CLN_UP          ;CLEAN IT UP
1673
        JC      SRD5+3          ;ERROR IF AT END
1674
        SJMP    SRD0
1675
        ;
1676
NUMC:   ACALL   GC              ;GET A CHARACTER
1677
        CJNE    A,#'#',NUMC1    ;SEE IF A #
1678
        SETB    COB             ;VALID LINE PRINT
1679
        AJMP    IGC             ;BUMP THE TEXT POINTER
1680
        ;
1681
NUMC1:  CJNE    A,#'@',SRD4-1   ;EXIT IF NO GOOD
1682
        SETB    LPB
1683
        AJMP    IGC
1684
        ;
1685
        newpage
1686
        ;***************************************************************
1687
        ;
1688
        ; The statement action routine - PRINT
1689
        ;
1690
        ;***************************************************************
1691
        ;
1692
SPH0:   SETB    ZSURP           ;NO ZEROS
1693
        ;
1694
SPH1:   SETB    HMODE           ;HEX MODE
1695
        ;
1696
SPRINT: ACALL   NUMC            ;TEST FOR A LINE PRINT
1697
        ACALL   $+9             ;PROCEED
1698
        ANL     35,#11110101B   ;CLEAR COB AND LPB
1699
        ANL     38,#00111111B   ;NO HEX MODE
1700
        ;
1701
        RET
1702
        ;
1703
        ACALL   DELTST          ;CHECK FOR A DELIMITER
1704
        JC      SP1
1705
        ;
1706
SP0:    JMP     CRLF            ;EXIT WITH A CR IF SO
1707
        ;
1708
SP2:    ACALL   C_TST           ;CHECK FOR A COMMA
1709
        JC      SP0             ;EXIT IF NO COMMA
1710
        ;
1711
SP1:    ACALL   CPS             ;SEE IF A STRING TO PRINT
1712
        JNC     SP2             ;IF A STRING, CHECK FOR A COMMA
1713
        ;
1714
SP4:    CJNE    A,#T_TAB,SP6
1715
        ACALL   I_PI            ;ALWAYS CLEARS CARRY
1716
        SUBB    A,PHEAD         ;TAKE DELTA BETWEEN TAB AND PHEAD
1717
        JC      SP2             ;EXIT IF PHEAD > TAB
1718
        SJMP    SP7             ;OUTPUT SPACES
1719
        ;
1720
SP6:    CJNE    A,#T_SPC,SM
1721
        ACALL   I_PI            ;SET UP PAREN VALUE
1722
        ;
1723
SP7:    JZ      SP2
1724
        LCALL   STEROT          ;OUTPUT A SPACE
1725
        DEC     A               ;DECREMENT COUNTER
1726
        SJMP    SP7             ;LOOP
1727
        ;
1728
        newpage
1729
SM:     CJNE    A,#T_CHR,SP8
1730
        ACALL   IGC
1731
        CJNE    A,#'$',$+9
1732
        ACALL   CNX             ;PUT THE CHARACTER ON THE STACK
1733
        ACALL   IFIXL           ;PUT THE CHARACTER IN R1
1734
        SJMP    $+6
1735
        ACALL   ONE             ;EVALUATE THE EXPRESSION, PUT IN R3:R1
1736
        ACALL   ERPAR
1737
        MOV     R5,R1B0         ;BYTE TO OUTPUT
1738
        SJMP    SQ
1739
        ;
1740
SP8:    CJNE    A,#T_CR,SX
1741
        ACALL   GCI1            ;EAT THE TOKEN
1742
        MOV     R5,#CR
1743
        ;
1744
SQ:     CALL    TEROT
1745
        SJMP    SP2             ;OUTPUT A CR AND DO IT AGAIN
1746
        ;
1747
SX:     CJNE    A,#T_USE,SP9    ;USING TOKEN
1748
        ACALL   IGC             ;GE THE CHARACTER AFTER THE USING TOKEN
1749
        CJNE    A,#'F',U4       ;SEE IF FLOATING
1750
        MOV     FORMAT,#0F0H    ;SET FLOATING
1751
        ACALL   IGC             ;BUMP THE POINTER AND GET THE CHARACTER
1752
        ACALL   GCI1            ;BUMP IT AGAIN
1753
        ANL     A,#0FH          ;STRIP OFF ASCII BIAS
1754
        JZ      U3              ;EXIT IF ZERO
1755
        CJNE    A,#3,$+3        ;SEE IF AT LEAST A THREE
1756
        JNC     U3              ;FORCE A THREE IF NOT A THREE
1757
        MOV     A,#3
1758
        ;
1759
U3:     ORL     FORMAT,A        ;PUT DIGIT IN FORMAT
1760
        SJMP    U8              ;CLEAN UP END
1761
        ;
1762
U4:     CJNE    A,#'0',U5
1763
        MOV     FORMAT,#0       ;FREE FORMAT
1764
        ACALL   GCI1            ;BUMP THE POINTER
1765
        SJMP    U8
1766
        ;
1767
U5:     CJNE    A,#'#',U8       ;SEE IF INTGER FORMAT
1768
        ACALL   U6
1769
        MOV     FORMAT,R7       ;SAVE THE FORMAT
1770
        CJNE    A,#'.',U8A      ;SEE IF TERMINATOR WAS RADIX
1771
        ACALL   IGC             ;BUMP PAST .
1772
        ACALL   U6              ;LOOP AGAIN
1773
        MOV     A,R7            ;GET COUNT
1774
        ADD     A,FORMAT        ;SEE IF TOO BIG
1775
        ADD     A,#0F7H
1776
        JNC     U5A
1777
        ;
1778
        newpage
1779
SE0:    AJMP    INTERX          ;ERROR, BAD SYNTAX
1780
        ;
1781
U5A:    MOV     A,R7            ;GET THE COUNT BACK
1782
        SWAP    A               ;ADJUST
1783
        ORL     FORMAT,A        ;GET THE COUNT
1784
        ;
1785
U8A:    MOV     A,FORMAT
1786
        ;
1787
U8B:    SWAP    A               ;GET THE FORMAT RIGHT
1788
        MOV     FORMAT,A
1789
        ;
1790
U8:     ACALL   ERPAR
1791
        AJMP    SP2             ;DONE
1792
        ;
1793
U6:     MOV     R7,#0           ;SET COUNTER
1794
        ;
1795
U7:     CJNE    A,#'#',SP9A     ;EXIT IF NOT A #
1796
        INC     R7              ;BUMP COUNTER
1797
        ACALL   IGC             ;GET THE NEXT CHARACTER
1798
        SJMP    U7              ;LOOP
1799
        ;
1800
SP9:    ACALL   DELTST+2        ;CHECK FOR DELIMITER
1801
        JNC     SP9A            ;EXIT IF A DELIMITER
1802
        ;
1803
        CJNE    A,#T_ELSE,SS
1804
        ;
1805
SP9A:   RET                     ;EXIT IF ELSE TOKEN
1806
        ;
1807
        ;**************************************************************
1808
        ;
1809
        ; P_E - Evaluate an expression in parens ( )
1810
        ;
1811
        ;**************************************************************
1812
        ;
1813
P_E:    MOV     R7,#T_LPAR
1814
        ACALL   WE
1815
        ;
1816
ERPAR:  MOV     R7,#')'         ;EAT A RIGHT PAREN
1817
        ;
1818
EATC:   ACALL   GCI             ;GET THE CHARACTER
1819
        CJNE    A,R7B0,SE0      ;ERROR IF NOT THE SAME
1820
        RET
1821
        ;
1822
        newpage
1823
        ;***************************************************************
1824
        ;
1825
S_ON:   ; ON Statement
1826
        ;
1827
        ;***************************************************************
1828
        ;
1829
        ACALL   ONE             ;GET THE EXPRESSION
1830
        ACALL   GCI             ;GET THE NEXT CHARACTER
1831
        CJNE    A,#T_GOTO,C0
1832
        ACALL   C1              ;EAT THE COMMAS
1833
        AJMP    SF3             ;DO GOTO
1834
        ;
1835
C0:     CJNE    A,#T_GOSB,SE0
1836
        ACALL   C1
1837
        AJMP    SGS0            ;DO GOSUB
1838
        ;
1839
C1:     CJNE    R1,#0,C2
1840
        ACALL   INTERR          ;GET THE LINE NUMBER
1841
        ACALL   FINDCR
1842
        AJMP    RL1             ;FINISH UP THIS LINE
1843
        ;
1844
C2:     MOV     R7,#','
1845
        ACALL   FINDC
1846
        CJNE    A,#',',SE0      ;ERROR IF NOT A COMMA
1847
        DEC     R1
1848
        ACALL   GCI1            ;BUMP PAST COMMA
1849
        SJMP    C1
1850
        ;
1851
        newpage
1852
        ;
1853
SS:     ACALL   S_C             ;SEE IF A STRING
1854
        JC      SA              ;NO STRING IF CARRY IS SET
1855
        LCALL   UPRNT           ;PUT POINTER IN DPTR
1856
        AJMP    SP2             ;SEE IF MORE
1857
        ;
1858
SA:     ACALL   EXPRB           ;MUST BE AN EXPRESSION
1859
        MOV     A,#72
1860
        CJNE    A,PHEAD,$+3     ;CHECK PHEAD POSITION
1861
        JNC     $+4
1862
        ACALL   SP0             ;FORCE A CRLF
1863
        JNB     HMODE,S13       ;HEX MODE?
1864
        CALL    FCMP            ;SEE IF TOS IS < 0FFFH
1865
        JC      S13             ;EXIT IF GREATER
1866
        CALL    AABS            ;GET THE SIGN
1867
        JNZ     OOPS            ;WASTE IF NEGATIVE
1868
        ACALL   IFIXL
1869
        CALL    FP_BASE+22      ;PRINT HEXMODE
1870
        AJMP    SP2
1871
OOPS:   CALL    ANEG            ;MAKE IT NEGATIVE
1872
        ;
1873
S13:    CALL    FP_BASE+14      ;DO FP OUTPUT
1874
        MOV     A,#1            ;OUTPUT A SPACE
1875
        AJMP    SP7
1876
        ;
1877
        newpage
1878
        ;***************************************************************
1879
        ;
1880
        ; ANU -  Get variable name from text - set carry if not found
1881
        ;        if succeeds returns variable in R7:R6
1882
        ;        R6 = 0 if no digit in name
1883
        ;
1884
        ;***************************************************************
1885
        ;
1886
ANU:    ACALL   IGC             ;INCREMENT AND GET CHARACTER
1887
        LCALL   1FEDH           ;CHECK FOR DIGIT
1888
        JC      $+14            ;EXIT IF VALID DIGIT
1889
        CJNE    A,#'_',$+4      ;SEE IF A _
1890
        RET
1891
        ;
1892
AL:     CJNE    A,#'A',$+3      ;IS IT AN ASCII A?
1893
        JC      $+6             ;EXIT IF CARRY IS SET
1894
        CJNE    A,#'Z'+1,$+3    ;IS IT LESS THAN AN ASCII Z
1895
        CPL     C               ;FLIP CARRY
1896
        RET
1897
        ;
1898
        JNB     F0,VAR2
1899
        ;
1900
SD0:    MOV     DPTR,#E6X
1901
        AJMP    EK
1902
        ;
1903
SDIMX:  SETB    F0              ;SAYS DOING A DIMENSION
1904
        SJMP    VAR1
1905
        ;
1906
VAR:    CLR     F0              ;SAYS DOING A VARIABLE
1907
        ;
1908
VAR1:   ACALL   GC              ;GET THE CHARACTER
1909
        ACALL   AL              ;CHECK FOR ALPHA
1910
        JNC     $+6             ;ERROR IF IN DIM
1911
        JB      F0,SD0
1912
        RET
1913
        MOV     R7,A            ;SAVE ALPHA CHARACTER
1914
        CLR     A               ;ZERO IN CASE OF FAILURE
1915
        MOV     R5,A            ;SAVE IT
1916
        ;
1917
VY:     MOV     R6,A
1918
        ACALL   ANU             ;CHECK FOR ALPHA OR NUMBER
1919
        JC      VX              ;EXIT IF NO ALPHA OR NUM
1920
        ;
1921
        XCH     A,R7
1922
        ADD     A,R5            ;NUMBER OF CHARACTERS IN ALPHABET
1923
        XCH     A,R7            ;PUT IT BACK
1924
        MOV     R5,#26          ;FOR THE SECOND TIME AROUND
1925
        SJMP    VY
1926
        ;
1927
VX:     CLR     LINEB           ;TELL EDITOR A VARIABLE IS DECLARED
1928
        CJNE    A,#T_LPAR,V4    ;SEE IF A LEFT PAREN
1929
        ;
1930
        ORL     R6B0,#80H       ;SET BIT 7 TO SIGINIFY MATRIX
1931
        CALL    F_VAR           ;FIND THE VARIABLE
1932
        PUSH    R2B0            ;SAVE THE LOCATION
1933
        PUSH    R0B0
1934
        JNC     SD0-3           ;DEFAULT IF NOT IN TABLE
1935
        JB      F0,SDI          ;NO DEFAULT FOR DIMENSION
1936
        MOV     R1,#10
1937
        MOV     R3,#0
1938
        ACALL   D_CHK
1939
        ;
1940
VAR2:   ACALL   PAREN_INT       ;EVALUATE INTEGER IN PARENS
1941
        CJNE    R3,#0,SD0       ;ERROR IF R3<>0
1942
        POP     DPL             ;GET VAR FOR LOOKUP
1943
        POP     DPH
1944
        MOVX    A,@DPTR         ;GET DIMENSION
1945
        DEC     A               ;BUMP OFFSET
1946
        SUBB    A,R1            ;A MUST BE > R1
1947
        JC      SD0
1948
        LCALL   DECDP2          ;BUMP POINTER TWICE
1949
        ACALL   VARB            ;CALCULATE THE BASE
1950
        ;
1951
X3120:  XCH     A,R1            ;SWAP R2:R0, R3:R1
1952
        XCH     A,R0
1953
        XCH     A,R1
1954
        XCH     A,R3
1955
        XCH     A,R2
1956
        XCH     A,R3
1957
        RET
1958
        ;
1959
V4:     JB      F0,SD0          ;ERROR IF NO LPAR FOR DIM
1960
        LCALL   F_VAR           ;GET SCALAR VARIABLE
1961
        CLR     C
1962
        RET
1963
        ;
1964
        newpage
1965
        ;
1966
SDI:    ACALL   PAREN_INT       ;EVALUATE PAREN EXPRESSION
1967
        CJNE    R3,#0,SD0       ;ERROR IF NOT ZERO
1968
        POP     R0B0            ;SET UP R2:R0
1969
        POP     R2B0
1970
        ACALL   D_CHK           ;DO DIM
1971
        ACALL   C_TST           ;CHECK FOR COMMA
1972
        JNC     SDIMX           ;LOOP IF COMMA
1973
        RET                     ;RETURN IF NO COMMA
1974
        ;
1975
D_CHK:  INC     R1              ;BUMP FOR TABLE LOOKUP
1976
        MOV     A,R1
1977
        JZ      SD0             ;ERROR IF 0FFFFH
1978
        MOV     R4,A            ;SAVE FOR LATER
1979
        MOV     DPTR,#MT_ALL    ;GET MATRIX ALLOCATION
1980
        ACALL   VARB            ;DO THE CALCULATION
1981
        MOV     R7,DPH          ;SAVE MATRIX ALLOCATION
1982
        MOV     R6,DPL
1983
        MOV     DPTR,#ST_ALL    ;SEE IF TOO MUCH MEMORY TAKEN
1984
        CALL    FUL1            ;ST_ALL SHOULD BE > R3:R1
1985
        MOV     DPTR,#MT_ALL    ;SAVE THE NEW MATRIX POINTER
1986
        CALL    S31DP
1987
        MOV     DPL,R0          ;GET VARIABLE ADDRESS
1988
        MOV     DPH,R2
1989
        MOV     A,R4            ;DIMENSION SIZE
1990
        MOVX    @DPTR,A         ;SAVE IT
1991
        CALL    DECDP2          ;SAVE TARGET ADDRESS
1992
        ;
1993
R76S:   MOV     A,R7
1994
        MOVX    @DPTR,A
1995
        INC     DPTR
1996
        MOV     A,R6            ;ELEMENT SIZE
1997
        MOVX    @DPTR,A
1998
        RET                     ;R2:R0 STILL HAS SYMBOL TABLE ADDRESS
1999
        ;
2000
        newpage
2001
        ;***************************************************************
2002
        ;
2003
        ; The statement action routine - INPUT
2004
        ;
2005
        ;***************************************************************
2006
        ;
2007
SINPUT: ACALL   CPS             ;PRINT STRING IF THERE
2008
        ;
2009
        ACALL   C_TST           ;CHECK FOR A COMMA
2010
        JNC     IN2A            ;NO CRLF
2011
        ACALL   SP0             ;DO A CRLF
2012
        ;
2013
IN2:    MOV     R5,#'?'         ;OUTPUT A ?
2014
        CALL    TEROT
2015
        ;
2016
IN2A:   SETB    INP_B           ;DOING INPUT
2017
        CALL    INLINE          ;INPUT THE LINE
2018
        CLR     INP_B
2019
        MOV     TEMP5,#HI(IBUF)
2020
        MOV     TEMP4,#LO(IBUF)
2021
        ;
2022
IN3:    ACALL   S_C             ;SEE IF A STRING
2023
        JC      IN3A            ;IF CARRY IS SET, NO STRING
2024
        ACALL   X3120           ;FLIP THE ADDRESSES
2025
        MOV     R3,TEMP5
2026
        MOV     R1,TEMP4
2027
        ACALL   SSOOP
2028
        ACALL   C_TST           ;SEE IF MORE TO DO
2029
        JNC     IN2
2030
        RET
2031
        ;
2032
IN3A:   CALL    DTEMP           ;GET THE USER LOCATION
2033
        CALL    GET_NUM         ;GET THE USER SUPPLIED NUMBER
2034
        JNZ     IN5             ;ERROR IF NOT ZERO
2035
        CALL    TEMPD           ;SAVE THE DATA POINTER
2036
        ACALL   VAR_ER          ;GET THE VARIABLE
2037
        ACALL   XPOP            ;SAVE THE VARIABLE
2038
        CALL    DTEMP           ;GET DPTR BACK FROM VAR_ER
2039
        ACALL   C_TST           ;SEE IF MORE TO DO
2040
        JC      IN6             ;EXIT IF NO COMMA
2041
        MOVX    A,@DPTR         ;GET INPUT TERMINATOR
2042
        CJNE    A,#',',IN5      ;IF NOT A COMMA DO A CR AND TRY AGAIN
2043
        INC     DPTR            ;BUMP PAST COMMA AND READ NEXT VALUE
2044
        CALL    TEMPD
2045
        SJMP    IN3
2046
        ;
2047
        newpage
2048
        ;
2049
IN5:    MOV     DPTR,#IAN       ;PRINT INPUT A NUMBER
2050
        CALL    CRP             ;DO A CR, THEN, PRINT FROM ROM
2051
        LJMP    CC1             ;TRY IT AGAIN
2052
        ;
2053
IN6:    MOVX    A,@DPTR
2054
        CJNE    A,#CR,EIGP
2055
        RET
2056
        ;
2057
EIGP:   MOV     DPTR,#EIG
2058
        CALL    CRP             ;PRINT THE MESSAGE AND EXIT
2059
        AJMP    SP0             ;EXIT WITH A CRLF
2060
        ;
2061
        ;***************************************************************
2062
        ;
2063
SOT:    ; On timer interrupt
2064
        ;
2065
        ;***************************************************************
2066
        ;
2067
        ACALL   TWO             ;GET THE NUMBERS
2068
        MOV     SP_H,R3
2069
        MOV     SP_L,R1
2070
        MOV     DPTR,#TIV       ;SAVE THE NUMBER
2071
        SETB    OTS
2072
        AJMP    R76S            ;EXIT
2073
        ;
2074
        ;
2075
        ;***************************************************************
2076
        ;
2077
SCALL:  ; Call a user rountine
2078
        ;
2079
        ;***************************************************************
2080
        ;
2081
        ACALL   INTERR          ;CONVERT INTEGER
2082
        CJNE    R2,#0,S_C_1     ;SEE IF TRAP
2083
        MOV     A,R0
2084
        JB      ACC.7,S_C_1
2085
        ADD     A,R0
2086
        MOV     DPTR,#4100H
2087
        MOV     DPL,A
2088
        ;
2089
S_C_1:  ACALL   AC1             ;JUMP TO USER PROGRAM
2090
        ANL     PSW,#11100111B  ;BACK TO BANK 0
2091
        RET                     ;EXIT
2092
        ;
2093
        newpage
2094
        ;**************************************************************
2095
        ;
2096
THREE:  ; Save value for timer function
2097
        ;
2098
        ;**************************************************************
2099
        ;
2100
        ACALL   ONE             ;GET THE FIRST INTEGER
2101
        CALL    CBIAS           ;BIAS FOR TIMER LOAD
2102
        MOV     T_HH,R3
2103
        MOV     T_LL,R1
2104
        MOV     R7,#','         ;WASTE A COMMA
2105
        ACALL   EATC            ;FALL THRU TO TWO
2106
        ;
2107
        ;**************************************************************
2108
        ;
2109
TWO:    ; Get two values seperated by a comma off the stack
2110
        ;
2111
        ;**************************************************************
2112
        ;
2113
        ACALL   EXPRB
2114
        MOV     R7,#','         ;WASTE THE COMMA
2115
        ACALL   WE
2116
        JMP     TWOL            ;EXIT
2117
        ;
2118
        ;*************************************************************
2119
        ;
2120
ONE:    ; Evaluate an expression and get an integer
2121
        ;
2122
        ;*************************************************************
2123
        ;
2124
        ACALL   EXPRB           ;EVALUATE EXPERSSION
2125
        ;
2126
IFIXL:  CALL    IFIX            ;INTEGERS IN R3:R1
2127
        MOV     A,R1
2128
        RET
2129
        ;
2130
        ;
2131
        ;*************************************************************
2132
        ;
2133
I_PI:   ; Increment text pointer then get an integer
2134
        ;
2135
        ;*************************************************************
2136
        ;
2137
        ACALL   GCI1            ;BUMP TEXT, THEN GET INTEGER
2138
        ;
2139
PAREN_INT:; Get an integer in parens ( )
2140
        ;
2141
        ACALL   P_E
2142
        SJMP    IFIXL
2143
        ;
2144
        newpage
2145
        ;
2146
DP_B:   MOV     DPH,BOFAH
2147
        MOV     DPL,BOFAL
2148
        RET
2149
        ;
2150
DP_T:   MOV     DPH,TXAH
2151
        MOV     DPL,TXAL
2152
        RET
2153
        ;
2154
CPS:    ACALL   GC              ;GET THE CHARACTER
2155
        CJNE    A,#'"',NOPASS   ;EXIT IF NO STRING
2156
        ACALL   DP_T            ;GET TEXT POINTER
2157
        INC     DPTR            ;BUMP PAST "
2158
        MOV     R4,#'"'
2159
        CALL    PN0             ;DO THE PRINT
2160
        INC     DPTR            ;GO PAST QUOTE
2161
        CLR     C               ;PASSED TEST
2162
        ;
2163
T_DP:   MOV     TXAH,DPH        ;TEXT POINTER GETS DPTR
2164
        MOV     TXAL,DPL
2165
        RET
2166
        ;
2167
        ;*************************************************************
2168
        ;
2169
S_C:    ; Check for a string
2170
        ;
2171
        ;*************************************************************
2172
        ;
2173
        ACALL   GC              ;GET THE CHARACTER
2174
        CJNE    A,#'$',NOPASS   ;SET CARRY IF NOT A STRING
2175
        AJMP    IST_CAL         ;CLEAR CARRY, CALCULATE OFFSET
2176
        ;
2177
        ;
2178
        ;
2179
        ;**************************************************************
2180
        ;
2181
C_TST:  ACALL   GC              ;GET A CHARACTER
2182
        CJNE    A,#',',NOPASS   ;SEE IF A COMMA
2183
        ;
2184
        newpage
2185
        ;***************************************************************
2186
        ;
2187
        ;GC AND GCI - GET A CHARACTER FROM TEXT (NO BLANKS)
2188
        ;             PUT CHARACTER IN THE ACC
2189
        ;
2190
        ;***************************************************************
2191
        ;
2192
IGC:    ACALL   GCI1            ;BUMP POINTER, THEN GET CHARACTER
2193
        ;
2194
GC:     SETB    RS0             ;USE BANK 1
2195
        MOV     P2,R2           ;SET UP PORT 2
2196
        MOVX    A,@R0           ;GET EXTERNAL BYTE
2197
        CLR     RS0             ;BACK TO BANK 0
2198
        RET                     ;EXIT
2199
        ;
2200
GCI:    ACALL   GC
2201
        ;
2202
        ; This routine bumps txa by one and always clears the carry
2203
        ;
2204
GCI1:   SETB    RS0             ;BANK 1
2205
        INC     R0              ;BUMP TXA
2206
        CJNE    R0,#0,$+4
2207
        INC     R2
2208
        CLR     RS0
2209
        RET                     ;EXIT
2210
        ;
2211
        newpage
2212
        ;**************************************************************
2213
        ;
2214
        ; Check delimiters
2215
        ;
2216
        ;**************************************************************
2217
        ;
2218
DELTST: ACALL   GC              ;GET A CHARACTER
2219
        CJNE    A,#CR,DT1       ;SEE IF A CR
2220
        CLR     A
2221
        RET
2222
        ;
2223
DT1:    CJNE    A,#':',NOPASS   ;SET CARRY IF NO MATCH
2224
        ;
2225
L_RET:  RET
2226
        ;
2227
        ;
2228
        ;***************************************************************
2229
        ;
2230
        ; FINDC - Find the character in R7, update TXA
2231
        ;
2232
        ;***************************************************************
2233
        ;
2234
FINDCR: MOV     R7,#CR          ;KILL A STATEMENT LINE
2235
        ;
2236
FINDC:  ACALL   DELTST
2237
        JNC     L_RET
2238
        ;
2239
        CJNE    A,R7B0,FNDCL2   ;MATCH?
2240
        RET
2241
        ;
2242
FNDCL2: ACALL   GCI1
2243
        SJMP    FINDC           ;LOOP
2244
        ;
2245
        ACALL   GCI1
2246
        ;
2247
WCR:    ACALL   DELTST          ;WASTE UNTIL A "REAL" CR
2248
        JNZ     WCR-2
2249
        RET
2250
        ;
2251
        newpage
2252
        ;***************************************************************
2253
        ;
2254
        ; VAR_ER - Check for a variable, exit if error
2255
        ;
2256
        ;***************************************************************
2257
        ;
2258
VAR_ER: ACALL   VAR
2259
        SJMP    INTERR+2
2260
        ;
2261
        ;
2262
        ;***************************************************************
2263
        ;
2264
        ; S_D0 - The Statement Action Routine DO
2265
        ;
2266
        ;***************************************************************
2267
        ;
2268
S_DO:   ACALL   CSC             ;FINISH UP THE LINE
2269
        MOV     R4,#DTYPE       ;TYPE FOR STACK
2270
        ACALL   SGS1            ;SAVE ON STACK
2271
        AJMP    ILOOP           ;EXIT
2272
        ;
2273
        newpage
2274
        ;***************************************************************
2275
        ;
2276
        ; CLN_UP - Clean up the end of a statement, see if at end of
2277
        ;          file, eat character and line count after CR
2278
        ;
2279
        ;***************************************************************
2280
        ;
2281
C_2:    CJNE    A,#':',C_1      ;SEE IF A TERMINATOR
2282
        AJMP    GCI1            ;BUMP POINTER AND EXIT, IF SO
2283
        ;
2284
C_1:    CJNE    A,#T_ELSE,EP5
2285
        ACALL   WCR             ;WASTE UNTIL A CR
2286
        ;
2287
CLN_UP: ACALL   GC              ;GET THE CHARACTER
2288
        CJNE    A,#CR,C_2       ;SEE IF A CR
2289
        ACALL   IGC             ;GET THE NEXT CHARACTER
2290
        CJNE    A,#EOF,B_TXA    ;SEE IF TERMINATOR
2291
        ;
2292
NOPASS: SETB    C
2293
        RET
2294
        ;
2295
B_TXA:  XCH     A,TXAL          ;BUMP TXA BY THREE
2296
        ADD     A,#3
2297
        XCH     A,TXAL
2298
        JBC     CY,$+4
2299
        RET
2300
        INC     TXAH
2301
        RET
2302
        ;
2303
        newpage
2304
        ;***************************************************************
2305
        ;
2306
        ;         Get an INTEGER from the text
2307
        ;         sets CARRY if not found
2308
        ;         returns the INTGER value in DPTR and R2:R0
2309
        ;         returns the terminator in ACC
2310
        ;
2311
        ;***************************************************************
2312
        ;
2313
INTERR: ACALL   INTGER          ;GET THE INTEGER
2314
        JC      EP5             ;ERROR IF NOT FOUND
2315
        RET                     ;EXIT IF FOUND
2316
        ;
2317
INTGER: ACALL   DP_T
2318
        CALL    FP_BASE+18      ;CONVERT THE INTEGER
2319
        ACALL   T_DP
2320
        MOV     DPH,R2          ;PUT THE RETURNED VALUE IN THE DPTR
2321
        MOV     DPL,R0
2322
        ;
2323
ITRET:  RET                     ;EXIT
2324
        ;
2325
        ;
2326
WE:     ACALL   EATC            ;WASTE THE CHARACTER
2327
        ;
2328
        ; Fall thru to evaluate the expression
2329
        ;
2330
        newpage
2331
        ;***************************************************************
2332
        ;
2333
        ; EXPRB - Evaluate an expression
2334
        ;
2335
        ;***************************************************************
2336
        ;
2337
EXPRB:  MOV     R2,#LO(OPBOL)   ;BASE PRECEDENCE
2338
        ;
2339
EP1:    PUSH    R2B0            ;SAVE OPERATOR PRECEDENCE
2340
        CLR     ARGF            ;RESET STACK DESIGNATOR
2341
        ;
2342
EP2:    MOV     A,SP            ;GET THE STACK POINTER
2343
        ADD     A,#12           ;NEED AT LEAST 12 BYTES
2344
        JNC     $+5
2345
        LJMP    ERROR-3
2346
        MOV     A,ASTKA         ;GET THE ARG STACK
2347
        SUBB    A,#LO(TM_TOP+12);NEED 12 BYTES ALSO
2348
        JNC     $+5
2349
        LJMP    E4YY
2350
        JB      ARGF,EP4        ;MUST BE AN OPERATOR, IF SET
2351
        ACALL   VAR             ;IS THE VALUE A VARIABLE?
2352
        JNC     EP3             ;PUT VARIABLE ON STACK
2353
        ;
2354
        ACALL   CONST           ;IS THE VALUE A NUMERIC CONSTANT?
2355
        JNC     EP4             ;IF SO, CONTINUE, IF NOT, SEE WHAT
2356
        CALL    GC              ;GET THE CHARACTER
2357
        CJNE    A,#T_LPAR,EP4   ;SEE IF A LEFT PAREN
2358
        MOV     A,#(LO(OPBOL+1))
2359
        SJMP    XLPAR           ;PROCESS THE LEFT PAREN
2360
        ;
2361
EP3:    ACALL   PUSHAS          ;SAVE VAR ON STACK
2362
        ;
2363
EP4:    ACALL   GC              ;GET THE OPERATOR
2364
        ;
2365
        CJNE    A,#T_LPAR,$+3   ;IS IT AN OPERATOR
2366
        JNC     XOP             ;PROCESS OPERATOR
2367
        CJNE    A,#T_UOP,$+3    ;IS IT A UNARY OPERATOR
2368
        JNC     XBILT           ;PROCESS UNARY (BUILT IN) OPERATOR
2369
        POP     R2B0            ;GET BACK PREVIOUS OPERATOR PRECEDENCE
2370
        JB      ARGF,ITRET      ;OK IF ARG FLAG IS SET
2371
        ;
2372
EP5:    CLR     C               ;NO RECOVERY
2373
        LJMP    E1XX+2
2374
        ;
2375
        ; Process the operator
2376
        ;
2377
XOP:    ANL     A,#1FH          ;STRIP OFF THE TOKE BITS
2378
        JB      ARGF,XOP1       ;IF ARG FLAG IS SET, PROCESS
2379
        CJNE    A,#T_SUB-T_LPAR,XOP3
2380
        MOV     A,#T_NEG-T_LPAR
2381
        ;
2382
        newpage
2383
XOP1:   ADD     A,#LO(OPBOL+1)  ;BIAS THE TABLE
2384
        MOV     R2,A
2385
        MOV     DPTR,#00H
2386
        MOVC    A,@A+DPTR       ;GET THE CURRENT PRECEDENCE
2387
        MOV     R4,A
2388
        POP     ACC             ;GET THE PREVIOUS PRECEDENCE
2389
        MOV     R5,A            ;SAVE THE PREVIOUS PRECEDENCE
2390
        MOVC    A,@A+DPTR       ;GET IT
2391
        CJNE    A,R4B0,$+7      ;SEE WHICH HAS HIGHER PRECEDENCE
2392
        CJNE    A,#12,ITRET     ;SEE IF ANEG
2393
        SETB    C
2394
        JNC     ITRET           ;PROCESS NON-INCREASING PRECEDENCE
2395
        ;
2396
        ; Save increasing precedence
2397
        ;
2398
        PUSH    R5B0            ;SAVE OLD PRECEDENCE ADDRESS
2399
        PUSH    R2B0            ;SAVE NEW PRECEDENCE ADDRESS
2400
        ACALL   GCI1            ;EAT THE OPERATOR
2401
        ACALL   EP1             ;EVALUATE REMAINING EXPRESSION
2402
        POP     ACC
2403
        ;
2404
        ; R2 has the action address, now setup and perform operation
2405
        ;
2406
XOP2:   MOV     DPTR,#OPTAB
2407
        ADD     A,#LO(~OPBOL)
2408
        CALL    ISTA1           ;SET UP TO RETURN TO EP2
2409
        AJMP    EP2             ;JUMP TO EVALUATE EXPRESSION
2410
        ;
2411
        ; Built-in operator processing
2412
        ;
2413
XBILT:  ACALL   GCI1            ;EAT THE TOKEN
2414
        ADD     A,#LO(50H+LO(UOPBOL))
2415
        JB      ARGF,EP5        ;XBILT MUST COME AFTER AN OPERATOR
2416
        CJNE    A,#STP,$+3
2417
        JNC     XOP2
2418
        ;
2419
XLPAR:  PUSH    ACC             ;PUT ADDRESS ON THE STACK
2420
        ACALL   P_E
2421
        SJMP    XOP2-2          ;PERFORM OPERATION
2422
        ;
2423
XOP3:   CJNE    A,#T_ADD-T_LPAR,EP5
2424
        ACALL   GCI1
2425
        AJMP    EP2             ;WASTE + SIGN
2426
        ;
2427
        newpage
2428
XPOP:   ACALL   X3120           ;FLIP ARGS THEN POP
2429
        ;
2430
        ;***************************************************************
2431
        ;
2432
        ; POPAS - Pop arg stack and copy variable to R3:R1
2433
        ;
2434
        ;***************************************************************
2435
        ;
2436
POPAS:  LCALL   INC_ASTKA
2437
        JMP     VARCOP          ;COPY THE VARIABLE
2438
        ;
2439
AXTAL:  MOV     R2,#HI(CXTAL)
2440
        MOV     R0,#LO(CXTAL)
2441
        ;
2442
        ; fall thru
2443
        ;
2444
        ;***************************************************************
2445
        ;
2446
PUSHAS: ; Push the Value addressed by R2:R0 onto the arg stack
2447
        ;
2448
        ;***************************************************************
2449
        ;
2450
        CALL    DEC_ASTKA
2451
        SETB    ARGF            ;SAYS THAT SOMTHING IS ON THE STACK
2452
        LJMP    VARCOP
2453
        ;
2454
        ;
2455
        ;***************************************************************
2456
        ;
2457
ST_A:   ; Store at expression
2458
        ;
2459
        ;***************************************************************
2460
        ;
2461
        ACALL   ONE             ;GET THE EXPRESSION
2462
        SJMP    POPAS           ;SAVE IT
2463
        ;
2464
        ;
2465
        ;***************************************************************
2466
        ;
2467
LD_A:   ; Load at expression
2468
        ;
2469
        ;***************************************************************
2470
        ;
2471
        ACALL   ONE             ;GET THE EXPRESSION
2472
        ACALL   X3120           ;FLIP ARGS
2473
        SJMP    PUSHAS
2474
        ;
2475
        newpage
2476
        ;***************************************************************
2477
        ;
2478
CONST:  ; Get a constant fron the text
2479
        ;
2480
        ;***************************************************************
2481
        ;
2482
        CALL    GC              ;FIRST SEE IF LITERAL
2483
        CJNE    A,#T_ASC,C0C    ;SEE IF ASCII TOKEN
2484
        CALL    IGC             ;GET THE CHARACTER AFTER TOKEN
2485
        CJNE    A,#'$',CN0      ;SEE IF A STRING
2486
        ;
2487
CNX:    CALL    CSY             ;CALCULATE IT
2488
        LJMP    AXBYTE+2        ;SAVE IT ON THE STACK ******AA JMP-->LJMP
2489
        ;
2490
CN0:    LCALL   TWO_R2          ;PUT IT ON THE STACK ******AA CALL-->LCALL
2491
        CALL    GCI1            ;BUMP THE POINTER
2492
        LJMP    ERPAR           ;WASTE THE RIGHT PAREN ******AA JMP-->LJMP
2493
        ;
2494
        ;
2495
C0C:    CALL    DP_T            ;GET THE TEXT POINTER
2496
        CALL    GET_NUM         ;GET THE NUMBER
2497
        CJNE    A,#0FFH,C1C     ;SEE IF NO NUMBER
2498
        SETB    C
2499
C2C:    RET
2500
        ;
2501
C1C:    JNZ     FPTST
2502
        CLR     C
2503
        SETB    ARGF
2504
        ;
2505
C3C:    JMP     T_DP
2506
        ;
2507
FPTST:  ANL     A,#00001011B    ;CHECK FOR ERROR
2508
        JZ      C2C             ;EXIT IF ZERO
2509
        ;
2510
        ; Handle the error condition
2511
        ;
2512
        MOV     DPTR,#E2X       ;DIVIDE BY ZERO
2513
        JNB     ACC.0,$+6       ;UNDERFLOW
2514
        MOV     DPTR,#E7X
2515
        JNB     ACC.1,$+6       ;OVERFLOW
2516
        MOV     DPTR,#E11X
2517
        ;
2518
FPTS:   JMP     ERROR
2519
        ;
2520
        newpage
2521
        ;***************************************************************
2522
        ;
2523
        ; The Command action routine - LIST
2524
        ;
2525
        ;***************************************************************
2526
        ;
2527
CLIST:  CALL    NUMC            ;SEE IF TO LINE PORT
2528
        ACALL   FSTK            ;PUT 0FFFFH ON THE STACK
2529
        CALL    INTGER          ;SEE IF USER SUPPLIES LN
2530
        CLR     A               ;LN = 0 TO START
2531
        MOV     R3,A
2532
        MOV     R1,A
2533
        JC      CL1             ;START FROM ZERO
2534
        ;
2535
        CALL    TEMPD           ;SAVE THE START ADDTESS
2536
        CALL    GCI             ;GET THE CHARACTER AFTER LIST
2537
        CJNE    A,#T_SUB,$+10   ;CHECK FOR TERMINATION ADDRESS '-'
2538
        ACALL   INC_ASTKA       ;WASTE 0FFFFH
2539
        LCALL   INTERR          ;GET TERMINATION ADDRESS
2540
        ACALL   TWO_EY          ;PUT TERMINATION ON THE ARG STACK
2541
        MOV     R3,TEMP5        ;GET THE START ADDTESS
2542
        MOV     R1,TEMP4
2543
        ;
2544
CL1:    CALL    GETLIN          ;GET THE LINE NO IN R3:R1
2545
        JZ      CL3             ;RET IF AT END
2546
        ;
2547
CL2:    ACALL   C3C             ;SAVE THE ADDRESS
2548
        INC     DPTR            ;POINT TO LINE NUMBER
2549
        ACALL   PMTOP+3         ;PUT LINE NUMBER ON THE STACK
2550
        ACALL   CMPLK           ;COMPARE LN TO END ADDRESS
2551
        JC      CL3             ;EXIT IF GREATER
2552
        CALL    BCK             ;CHECK FOR A CONTROL C
2553
        ACALL   DEC_ASTKA       ;SAVE THE COMPARE ADDRESS
2554
        CALL    DP_T            ;RESTORE ADDRESS
2555
        ACALL   UPPL            ;UN-PROCESS THE LINE
2556
        ACALL   C3C             ;SAVE THE CR ADDRESS
2557
        ACALL   CL6             ;PRINT IT
2558
        INC     DPTR            ;BUMP POINTER TO NEXT LINE
2559
        MOVX    A,@DPTR         ;GET LIN LENGTH
2560
        DJNZ    ACC,CL2         ;LOOP
2561
        ACALL   INC_ASTKA       ;WASTE THE COMPARE BYTE
2562
        ;
2563
CL3:    AJMP    CMND1           ;BACK TO COMMAND PROCESSOR
2564
        ;
2565
CL6:    MOV     DPTR,#IBUF      ;PRINT IBUF
2566
        CALL    PRNTCR          ;PRINT IT
2567
        CALL    DP_T
2568
        ;
2569
CL7:    JMP     CRLF
2570
        ;
2571
        LCALL   X31DP
2572
        newpage
2573
        ;***************************************************************
2574
        ;
2575
        ;UPPL - UN PREPROCESS A LINE ADDRESSED BY DPTR INTO IBUF
2576
        ;       RETURN SOURCE ADDRESS OF CR IN DPTR ON RETURN
2577
        ;
2578
        ;***************************************************************
2579
        ;
2580
UPPL:   MOV     R3,#HI(IBUF)    ;POINT R3 AT HIGH IBUF
2581
        MOV     R1,#LO(IBUF)    ;POINT R1 AT IBUF
2582
        INC     DPTR            ;SKIP OVER LINE LENGTH
2583
        ACALL   C3C             ;SAVE THE DPTR (DP_T)
2584
        CALL    L20DPI          ;PUT LINE NUMBER IN R2:R0
2585
        CALL    FP_BASE+16      ;CONVERT R2:R0 TO INTEGER
2586
        CALL    DP_T
2587
        INC     DPTR            ;BUMP DPTR PAST THE LINE NUMBER
2588
        ;
2589
UPP0:   CJNE    R1,#LO(IBUF+6),$+3
2590
        JC      UPP1A-4         ;PUT SPACES IN TEXT
2591
        INC     DPTR            ;BUMP PAST LN HIGH
2592
        MOVX    A,@DPTR         ;GET USER TEXT
2593
        MOV     R6,A            ;SAVE A IN R6 FOR TOKE COMPARE
2594
        JB      ACC.7,UPP1      ;IF TOKEN, PROCESS
2595
        CJNE    A,#20H,$+3      ;TRAP THE USER TOKENS
2596
        JNC     $+5
2597
        CJNE    A,#CR,UPP1      ;DO IT IF NOT A CR
2598
        CJNE    A,#'"',UPP9     ;SEE IF STRING
2599
        ACALL   UPP7            ;SAVE IT
2600
        ACALL   UPP8            ;GET THE NEXT CHARACTER AND SAVE IT
2601
        CJNE    A,#'"',$-2      ;LOOP ON QUOTES
2602
        SJMP    UPP0
2603
        ;
2604
UPP9:   CJNE    A,#':',UPP1A    ;PUT A SPACE IN DELIMITER
2605
        ACALL   UPP7A
2606
        MOV     A,R6
2607
        ACALL   UPP7
2608
        ACALL   UPP7A
2609
        SJMP    UPP0
2610
        ;
2611
UPP1A:  ACALL   UPP8+2          ;SAVE THE CHARACTER, UPDATE POINTER
2612
        SJMP    UPP0            ;EXIT IF A CR, ELSE LOOP
2613
        ;
2614
UPP1:   ACALL   C3C             ;SAVE THE TEXT POINTER
2615
        MOV     C,XBIT
2616
        MOV     F0,C            ;SAVE XBIT IN F0
2617
        MOV     DPTR,#TOKTAB    ;POINT AT TOKEN TABLE
2618
        JNB     F0,UPP2
2619
        LCALL   2078H           ;SET UP DPTR FOR LOOKUP
2620
        ;
2621
UPP2:   CLR     A               ;ZERO A FOR LOOKUP
2622
        MOVC    A,@A+DPTR       ;GET TOKEN
2623
        INC     DPTR            ;ADVANCE THE TOKEN POINTER
2624
        CJNE    A,#0FFH,UP_2    ;SEE IF DONE
2625
        JBC     F0,UPP2-9       ;NOW DO NORMAL TABLE
2626
        AJMP    CMND1           ;EXIT IF NOT FOUND
2627
        ;
2628
UP_2:   CJNE    A,R6B0,UPP2     ;LOOP UNTIL THE SAME
2629
        ;
2630
UP_3:   CJNE    A,#T_UOP,$+3
2631
        JNC     UPP3
2632
        ACALL   UPP7A           ;PRINT THE SPACE IF OK
2633
        ;
2634
UPP3:   CLR     A               ;DO LOOKUP
2635
        MOVC    A,@A+DPTR
2636
        JB      ACC.7,UPP4      ;EXIT IF DONE, ELSE SAVE
2637
        JZ      UPP4            ;DONE IF ZERO
2638
        ACALL   UPP7            ;SAVE THE CHARACTER
2639
        INC     DPTR
2640
        SJMP    UPP3            ;LOOP
2641
        ;
2642
UPP4:   CALL    DP_T            ;GET IT BACK
2643
        MOV     A,R6            ;SEE IF A REM TOKEN
2644
        XRL     A,#T_REM
2645
        JNZ     $+6
2646
        ACALL   UPP8
2647
        SJMP    $-2
2648
        JNC     UPP0            ;START OVER AGAIN IF NO TOKEN
2649
        ACALL   UPP7A           ;PRINT THE SPACE IF OK
2650
        SJMP    UPP0            ;DONE
2651
        ;
2652
UPP7A:  MOV     A,#' '          ;OUTPUT A SPACE
2653
        ;
2654
UPP7:   AJMP    PPL9+1          ;SAVE A
2655
        ;
2656
UPP8:   INC     DPTR
2657
        MOVX    A,@DPTR
2658
        CJNE    A,#CR,UPP7
2659
        AJMP    PPL7+1
2660
        ;
2661
        newpage
2662
        ;**************************************************************
2663
        ;
2664
        ; This table contains all of the floating point constants
2665
        ;
2666
        ; The constants in ROM are stored "backwards" from the way
2667
        ; basic normally treats floating point numbers. Instead of
2668
        ; loading from the exponent and decrementing the pointer,
2669
        ; ROM constants pointers load from the most significant
2670
        ; digits and increment the pointers. This is done to 1) make
2671
        ; arg stack loading faster and 2) compensate for the fact that
2672
        ; no decrement data pointer instruction exsist.
2673
        ;
2674
        ; The numbers are stored as follows:
2675
        ;
2676
        ; BYTE X+5    = MOST SIGNIFICANT DIGITS IN BCD
2677
        ; BYTE X+4    = NEXT MOST SIGNIFICANT DIGITS IN BCD
2678
        ; BYTE X+3    = NEXT LEAST SIGNIFICANT DIGITS IN BCD
2679
        ; BYTE X+2    = LEAST SIGNIFICANT DIGITS IN BCD
2680
        ; BYTE X+1    = SIGN OF THE ABOVE MANTISSA 0 = +, 1 = -
2681
        ; BYTE X      = EXPONENT IN TWO'S COMPLEMENT BINARY
2682
        ;               ZERO EXPONENT = THE NUMBER ZERO
2683
        ;
2684
        ;**************************************************************
2685
        ;
2686
ATTAB:  DB      128-2           ; ARCTAN LOOKUP
2687
        DB      00H
2688
        DB      57H
2689
        DB      22H
2690
        DB      66H
2691
        DB      28H
2692
        ;
2693
        DB      128-1
2694
        DB      01H
2695
        DB      37H
2696
        DB      57H
2697
        DB      16H
2698
        DB      16H
2699
        ;
2700
        DB      128-1
2701
        DB      00H
2702
        DB      14H
2703
        DB      96H
2704
        DB      90H
2705
        DB      42H
2706
        ;
2707
        DB      128-1
2708
        DB      01H
2709
        DB      40H
2710
        DB      96H
2711
        DB      28H
2712
        DB      75H
2713
        ;
2714
        DB      128
2715
        DB      00H
2716
        DB      64H
2717
        DB      62H
2718
        DB      65H
2719
        DB      10H
2720
        ;
2721
        DB      128
2722
        DB      01H
2723
        DB      99H
2724
        DB      88H
2725
        DB      20H
2726
        DB      14H
2727
        ;
2728
        DB      128
2729
        DB      00H
2730
        DB      51H
2731
        DB      35H
2732
        DB      99H
2733
        DB      19H
2734
        ;
2735
        DB      128
2736
        DB      01H
2737
        DB      45H
2738
        DB      31H
2739
        DB      33H
2740
        DB      33H
2741
        ;
2742
        DB      129
2743
        DB      00H
2744
        DB      00H
2745
        DB      00H
2746
        DB      00H
2747
        DB      10H
2748
        ;
2749
        DB      0FFH            ;END OF TABLE
2750
        ;
2751
NTWO:   DB      129
2752
        DB      0
2753
        DB      0
2754
        DB      0
2755
        DB      0
2756
        DB      20H
2757
        ;
2758
TTIME:  DB      128-4           ; CLOCK CALCULATION
2759
        DB      00H
2760
        DB      00H
2761
        DB      00H
2762
        DB      04H
2763
        DB      13H
2764
        ;
2765
        newpage
2766
        ;***************************************************************
2767
        ;
2768
        ; COSINE - Add pi/2 to stack, then fall thru to SIN
2769
        ;
2770
        ;***************************************************************
2771
        ;
2772
ACOS:   ACALL   POTWO           ;PUT PI/2 ON THE STACK
2773
        ACALL   AADD            ;TOS = TOS+PI/2
2774
        ;
2775
        ;***************************************************************
2776
        ;
2777
        ; SINE - use taylor series to calculate sin function
2778
        ;
2779
        ;***************************************************************
2780
        ;
2781
ASIN:   ACALL   PIPI            ;PUT PI ON THE STACK
2782
        ACALL   RV              ;REDUCE THE VALUE
2783
        MOV     A,MT2           ;CALCULATE THE SIGN
2784
        ANL     A,#01H          ;SAVE LSB
2785
        XRL     MT1,A           ;SAVE SIGN IN MT1
2786
        ACALL   CSTAKA          ;NOW CONVERT TO ONE QUADRANT
2787
        ACALL   POTWO
2788
        ACALL   CMPLK           ;DO COMPARE
2789
        JC      $+6
2790
        ACALL   PIPI
2791
        ACALL   ASUB
2792
        ACALL   AABS
2793
        MOV     DPTR,#SINTAB    ;SET UP LOOKUP TABLE
2794
        ACALL   POLYC           ;CALCULATE THE POLY
2795
        ACALL   STRIP
2796
        AJMP    SIN0
2797
        ;
2798
        ; Put PI/2 on the stack
2799
        ;
2800
POTWO:  ACALL   PIPI            ;PUT PI ON THE STACK, NOW DIVIDE
2801
        ;
2802
DBTWO:  MOV     DPTR,#NTWO
2803
        ACALL   PUSHC
2804
        ;MOV    A,#2            ;BY TWO
2805
        ;ACALL  TWO_R2
2806
        AJMP    ADIV
2807
        ;
2808
        newpage
2809
        ;*************************************************************
2810
        ;
2811
POLYC:  ; Expand a power series to calculate a polynomial
2812
        ;
2813
        ;*************************************************************
2814
        ;
2815
        ACALL   CSTAKA2         ;COPY THE STACK
2816
        ACALL   AMUL            ;SQUARE THE STACK
2817
        ACALL   POP_T1          ;SAVE X*X
2818
        ACALL   PUSHC           ;PUT CONSTANT ON STACK
2819
        ;
2820
POLY1:  ACALL   PUSH_T1         ;PUT COMPUTED VALUE ON STACK
2821
        ACALL   AMUL            ;MULTIPLY CONSTANT AND COMPUTED VALUE
2822
        ACALL   PUSHC           ;PUT NEXT CONSTANT ON STACK
2823
        ACALL   AADD            ;ADD IT TO THE OLD VALUE
2824
        CLR     A               ;CHECK TO SEE IF DONE
2825
        MOVC    A,@A+DPTR
2826
        CJNE    A,#0FFH,POLY1   ;LOOP UNTIL DONE
2827
        ;
2828
AMUL:   LCALL   FP_BASE+6
2829
        AJMP    FPTST
2830
        ;
2831
        ;*************************************************************
2832
        ;
2833
RV:     ; Reduce a value for Trig and A**X functions
2834
        ;
2835
        ; value = (value/x - INT(value/x)) * x
2836
        ;
2837
        ;*************************************************************
2838
        ;
2839
        ACALL   C_T2            ;COPY TOS TO T2
2840
        ACALL   ADIV            ;TOS = TOS/TEMP2
2841
        ACALL   AABS            ;MAKE THE TOS A POSITIVE NUMBER
2842
        MOV     MT1,A           ;SAVE THE SIGN
2843
        ACALL   CSTAKA2         ;COPY THE STACK TWICE
2844
        ACALL   IFIX            ;PUT THE NUMBER IN R3:R1
2845
        PUSH    R3B0            ;SAVE R3
2846
        MOV     MT2,R1          ;SAVE THE LS BYTE IN MT2
2847
        ACALL   AINT            ;MAKE THE TOS AN INTEGER
2848
        ACALL   ASUB            ;TOS = TOS/T2 - INT(TOS/T2)
2849
        ACALL   P_T2            ;TOS = T2
2850
        ACALL   AMUL            ;TOS = T2*(TOS/T2 - INT(TOS/T2)
2851
        POP     R3B0            ;RESTORE R3
2852
        RET                     ;EXIT
2853
        ;
2854
        newpage
2855
        ;**************************************************************
2856
        ;
2857
        ; TAN
2858
        ;
2859
        ;**************************************************************
2860
        ;
2861
ATAN:   ACALL   CSTAKA          ;DUPLACATE STACK
2862
        ACALL   ASIN            ;TOS = SIN(X)
2863
        ACALL   SWAP_ASTKA      ;TOS = X
2864
        ACALL   ACOS            ;TOS = COS(X)
2865
        AJMP    ADIV            ;TOS = SIN(X)/COS(X)
2866
        ;
2867
STRIP:  ACALL   SETREG          ;SETUP R0
2868
        MOV     R3,#1           ;LOOP COUNT
2869
        AJMP    AI2-1           ;WASTE THE LSB
2870
        ;
2871
        ;************************************************************
2872
        ;
2873
        ; ARC TAN
2874
        ;
2875
        ;************************************************************
2876
        ;
2877
AATAN:  ACALL   AABS
2878
        MOV     MT1,A           ;SAVE THE SIGN
2879
        ACALL   SETREG          ;GET THE EXPONENT
2880
        ADD     A,#7FH          ;BIAS THE EXPONENT
2881
        MOV     UBIT,C          ;SAVE CARRY STATUS
2882
        JNC     $+4             ;SEE IF > 1
2883
        ACALL   RECIP           ;IF > 1, TAKE RECIP
2884
        MOV     DPTR,#ATTAB     ;SET UP TO CALCULATE THE POLY
2885
        ACALL   POLYC           ;CALCULATE THE POLY
2886
        JNB     UBIT,SIN0       ;JUMP IF NOT SET
2887
        ACALL   ANEG            ;MAKE X POLY NEGATIVE
2888
        ACALL   POTWO           ;SUBTRACT PI/2
2889
        ACALL   AADD
2890
        ;
2891
SIN0:   MOV     A,MT1           ;GET THE SIGN
2892
        JZ      SRT
2893
        AJMP    ANEG
2894
        ;
2895
        newpage
2896
        ;*************************************************************
2897
        ;
2898
        ; FCOMP - COMPARE 0FFFFH TO TOS
2899
        ;
2900
        ;*************************************************************
2901
        ;
2902
FCMP:   ACALL   CSTAKA          ;COPY THE STACK
2903
        ACALL   FSTK            ;MAKE THE TOS = 0FFFFH
2904
        ACALL   SWAP_ASTKA      ;NOW COMPARE IS 0FFFFH - X
2905
        ;
2906
CMPLK:  JMP     FP_BASE+4       ;DO THE COMPARE
2907
        ;
2908
        ;*************************************************************
2909
        ;
2910
DEC_ASTKA:      ;Push ARG STACK and check for underflow
2911
        ;
2912
        ;*************************************************************
2913
        ;
2914
        MOV     A,#-FPSIZ
2915
        ADD     A,ASTKA
2916
        CJNE    A,#LO(TM_TOP+6),$+3
2917
        JC      E4YY
2918
        MOV     ASTKA,A
2919
        MOV     R1,A
2920
        MOV     R3,#ASTKAH
2921
        ;
2922
SRT:    RET
2923
        ;
2924
E4YY:   MOV     DPTR,#EXA
2925
        AJMP    FPTS            ;ARG STACK ERROR
2926
        ;
2927
        ;
2928
AXTAL3: ACALL   PUSHC           ;PUSH CONSTANT, THEN MULTIPLY
2929
        ACALL   AMUL
2930
        ;
2931
        ; Fall thru to IFIX
2932
        ;
2933
        newpage
2934
        ;***************************************************************
2935
        ;
2936
IFIX:   ; Convert a floating point number to an integer, put in R3:R1
2937
        ;
2938
        ;***************************************************************
2939
        ;
2940
        CLR     A               ;RESET THE START
2941
        MOV     R3,A
2942
        MOV     R1,A
2943
        MOV     R0,ASTKA        ;GET THE ARG STACK
2944
        MOV     P2,#ASTKAH
2945
        MOVX    A,@R0           ;READ EXPONENT
2946
        CLR     C
2947
        SUBB    A,#81H          ;BASE EXPONENT
2948
        MOV     R4,A            ;SAVE IT
2949
        DEC     R0              ;POINT AT SIGN
2950
        MOVX    A,@R0           ;GET THE SIGN
2951
        JNZ     SQ_ERR          ;ERROR IF NEGATIVE
2952
        JC      INC_ASTKA       ;EXIT IF EXPONENT IS < 81H
2953
        INC     R4              ;ADJUST LOOP COUNTER
2954
        MOV     A,R0            ;BUMP THE POINTER REGISTER
2955
        SUBB    A,#FPSIZ-1
2956
        MOV     R0,A
2957
        ;
2958
I2:     INC     R0              ;POINT AT DIGIT
2959
        MOVX    A,@R0           ;GET DIGIT
2960
        SWAP    A               ;FLIP
2961
        CALL    FP_BASE+20      ;ACCUMULATE
2962
        JC      SQ_ERR
2963
        DJNZ    R4,$+4
2964
        SJMP    INC_ASTKA
2965
        MOVX    A,@R0           ;GET DIGIT
2966
        CALL    FP_BASE+20
2967
        JC      SQ_ERR
2968
        DJNZ    R4,I2
2969
        ;
2970
        newpage
2971
        ;************************************************************
2972
        ;
2973
INC_ASTKA:      ; Pop the ARG STACK and check for overflow
2974
        ;
2975
        ;************************************************************
2976
        ;
2977
        MOV     A,#FPSIZ        ;NUMBER TO POP
2978
        SJMP    SETREG+1
2979
        ;
2980
SETREG: CLR     A               ;DON'T POP ANYTHING
2981
        MOV     R0,ASTKA
2982
        MOV     R2,#ASTKAH
2983
        MOV     P2,R2
2984
        ADD     A,R0
2985
        JC      E4YY
2986
        MOV     ASTKA,A
2987
        MOVX    A,@R0
2988
A_D:    RET
2989
        ;
2990
        ;************************************************************
2991
        ;
2992
        ; EBIAS - Bias a number for E to the X calculations
2993
        ;
2994
        ;************************************************************
2995
        ;
2996
EBIAS:  ACALL   PUSH_ONE
2997
        ACALL   RV
2998
        CJNE    R3,#00H,SQ_ERR  ;ERROR IF R3 <> 0
2999
        ACALL   C_T2            ;TEMP 2 GETS FRACTIONS
3000
        ACALL   INC_ASTKA
3001
        ACALL   POP_T1
3002
        ACALL   PUSH_ONE
3003
        ;
3004
AELP:   MOV     A,MT2
3005
        JNZ     AEL1
3006
        ;
3007
        MOV     A,MT1
3008
        JZ      A_D
3009
        MOV     DPTR,#FPT2-1
3010
        MOVX    @DPTR,A         ;MAKE THE FRACTIONS NEGATIVE
3011
        ;
3012
RECIP:  ACALL   PUSH_ONE
3013
        ACALL   SWAP_ASTKA
3014
        AJMP    ADIV
3015
        ;
3016
AEL1:   DEC     MT2
3017
        ACALL   PUSH_T1
3018
        ACALL   AMUL
3019
        SJMP    AELP
3020
        ;
3021
SQ_ERR: LJMP    E3XX            ;LINK TO BAD ARG
3022
        ;
3023
        newpage
3024
        ;************************************************************
3025
        ;
3026
        ; SQUARE ROOT
3027
        ;
3028
        ;************************************************************
3029
        ;
3030
ASQR:   ACALL   AABS            ;GET THE SIGN
3031
        JNZ     SQ_ERR          ;ERROR IF NEGATIVE
3032
        ACALL   C_T2            ;COPY VARIABLE TO T2
3033
        ACALL   POP_T1          ;SAVE IT IN T1
3034
        MOV     R0,#LO(FPT1)
3035
        MOVX    A,@R0           ;GET EXPONENT
3036
        JZ      ALN-2           ;EXIT IF ZERO
3037
        ADD     A,#128          ;BIAS THE EXPONENT
3038
        JNC     SQR1            ;SEE IF < 80H
3039
        RR      A
3040
        ANL     A,#127
3041
        SJMP    SQR2
3042
        ;
3043
SQR1:   CPL     A               ;FLIP BITS
3044
        INC     A
3045
        RR      A
3046
        ANL     A,#127          ;STRIP MSB
3047
        CPL     A
3048
        INC     A
3049
        ;
3050
SQR2:   ADD     A,#128          ;BIAS EXPONENT
3051
        MOVX    @R0,A           ;SAVE IT
3052
        ;
3053
        ; NEWGUESS = ( X/OLDGUESS + OLDGUESS) / 2
3054
        ;
3055
SQR4:   ACALL   P_T2            ;TOS = X
3056
        ACALL   PUSH_T1         ;PUT NUMBER ON STACK
3057
        ACALL   ADIV            ;TOS = X/GUESS
3058
        ACALL   PUSH_T1         ;PUT ON AGAIN
3059
        ACALL   AADD            ;TOS = X/GUESS + GUESS
3060
        ACALL   DBTWO           ;TOS = ( X/GUESS + GUESS ) / 2
3061
        ACALL   TEMP_COMP       ;SEE IF DONE
3062
        JNB     F0,SQR4
3063
        ;
3064
        AJMP    PUSH_T1         ;PUT THE ANSWER ON THE STACK
3065
        ;
3066
        newpage
3067
        ;*************************************************************
3068
        ;
3069
        ; NATURAL LOG
3070
        ;
3071
        ;*************************************************************
3072
        ;
3073
ALN:    ACALL   AABS            ;MAKE SURE THAT NUM IS POSITIVE
3074
        JNZ     SQ_ERR          ;ERROR IF NOT
3075
        MOV     MT2,A           ;CLEAR FOR LOOP
3076
        INC     R0              ;POINT AT EXPONENT
3077
        MOVX    A,@R0           ;READ THE EXPONENT
3078
        JZ      SQ_ERR          ;ERROR IF EXPONENT IS ZERO
3079
        CJNE    A,#81H,$+3      ;SEE IF NUM >= 1
3080
        MOV     UBIT,C          ;SAVE CARRY STATUS
3081
        JC      $+4             ;TAKE RECIP IF >= 1
3082
        ACALL   RECIP
3083
        ;
3084
        ; Loop to reduce
3085
        ;
3086
ALNL:   ACALL   CSTAKA          ;COPY THE STACK FOR COMPARE
3087
        ACALL   PUSH_ONE        ;COMPARE NUM TO ONE
3088
        ACALL   CMPLK
3089
        JNC     ALNO            ;EXIT IF DONE
3090
        ACALL   SETREG          ;GET THE EXPONENT
3091
        ADD     A,#85H          ;SEE HOW BIG IT IS
3092
        JNC     ALN11           ;BUMP BY EXP(11) IF TOO SMALL
3093
        ACALL   PLNEXP          ;PUT EXP(1) ON STACK
3094
        MOV     A,#1            ;BUMP COUNT
3095
        ;
3096
ALNE:   ADD     A,MT2
3097
        JC      SQ_ERR
3098
        MOV     MT2,A
3099
        ACALL   AMUL            ;BIAS THE NUMBER
3100
        SJMP    ALNL
3101
        ;
3102
ALN11:  MOV     DPTR,#EXP11     ;PUT EXP(11) ON STACK
3103
        ACALL   PUSHC
3104
        MOV     A,#11
3105
        SJMP    ALNE
3106
        ;
3107
        newpage
3108
ALNO:   ACALL   C_T2            ;PUT NUM IN TEMP 2
3109
        ACALL   PUSH_ONE        ;TOS = 1
3110
        ACALL   ASUB            ;TOS = X - 1
3111
        ACALL   P_T2            ;TOS = X
3112
        ACALL   PUSH_ONE        ;TOS = 1
3113
        ACALL   AADD            ;TOS = X + 1
3114
        ACALL   ADIV            ;TOS = (X-1)/(X+1)
3115
        MOV     DPTR,#LNTAB     ;LOG TABLE
3116
        ACALL   POLYC
3117
        INC     DPTR            ;POINT AT LN(10)
3118
        ACALL   PUSHC
3119
        ACALL   AMUL
3120
        MOV     A,MT2           ;GET THE COUNT
3121
        ACALL   TWO_R2          ;PUT IT ON THE STACK
3122
        ACALL   ASUB            ;INT - POLY
3123
        ACALL   STRIP
3124
        JNB     UBIT,AABS
3125
        ;
3126
LN_D:   RET
3127
        ;
3128
        ;*************************************************************
3129
        ;
3130
TEMP_COMP:      ; Compare FPTEMP1 to TOS, FPTEMP1 gets TOS
3131
        ;
3132
        ;*************************************************************
3133
        ;
3134
        ACALL   PUSH_T1         ;SAVE THE TEMP
3135
        ACALL   SWAP_ASTKA      ;TRADE WITH THE NEXT NUMBER
3136
        ACALL   CSTAKA          ;COPY THE STACK
3137
        ACALL   POP_T1          ;SAVE THE NEW NUMBER
3138
        JMP     FP_BASE+4       ;DO THE COMPARE
3139
        ;
3140
        newpage
3141
AETOX:  ACALL   PLNEXP          ;EXP(1) ON TOS
3142
        ACALL   SWAP_ASTKA      ;X ON TOS
3143
        ;
3144
AEXP:   ;EXPONENTIATION
3145
        ;
3146
        ACALL   EBIAS           ;T1=BASE,T2=FRACTIONS,TOS=INT MULTIPLIED
3147
        MOV     DPTR,#FPT2      ;POINT AT FRACTIONS
3148
        MOVX    A,@DPTR         ;READ THE EXP OF THE FRACTIONS
3149
        JZ      LN_D            ;EXIT IF ZERO
3150
        ACALL   P_T2            ;TOS = FRACTIONS
3151
        ACALL   PUSH_T1         ;TOS = BASE
3152
        ACALL   SETREG          ;SEE IF BASE IS ZERO
3153
        JZ      $+4
3154
        ACALL   ALN             ;TOS = LN(BASE)
3155
        ACALL   AMUL            ;TOS = FRACTIONS * LN(BASE)
3156
        ACALL   PLNEXP          ;TOS = EXP(1)
3157
        ACALL   SWAP_ASTKA      ;TOS = FRACTIONS * LN(BASE)
3158
        ACALL   EBIAS           ;T2 = FRACTIONS, TOS = INT MULTIPLIED
3159
        MOV     MT2,#00H        ;NOW CALCULATE E**X
3160
        ACALL   PUSH_ONE
3161
        ACALL   CSTAKA
3162
        ACALL   POP_T1          ;T1 = 1
3163
        ;
3164
AEXL:   ACALL   P_T2            ;TOS = FRACTIONS
3165
        ACALL   AMUL            ;TOS = FRACTIONS * ACCUMLATION
3166
        INC     MT2             ;DO THE DEMONIATOR
3167
        MOV     A,MT2
3168
        ACALL   TWO_R2
3169
        ACALL   ADIV
3170
        ACALL   CSTAKA          ;SAVE THE ITERATION
3171
        ACALL   PUSH_T1         ;NOW ACCUMLATE
3172
        ACALL   AADD            ;ADD ACCUMLATION
3173
        ACALL   TEMP_COMP
3174
        JNB     F0,AEXL         ;LOOP UNTIL DONE
3175
        ;
3176
        ACALL   INC_ASTKA
3177
        ACALL   PUSH_T1
3178
        ACALL   AMUL            ;LAST INT MULTIPLIED
3179
        ;
3180
MU1:    AJMP    AMUL            ;FIRST INT MULTIPLIED
3181
        ;
3182
        newpage
3183
        ;***************************************************************
3184
        ;
3185
        ; integer operator - INT
3186
        ;
3187
        ;***************************************************************
3188
        ;
3189
AINT:   ACALL   SETREG          ;SET UP THE REGISTERS, CLEAR CARRY
3190
        SUBB    A,#129          ;SUBTRACT EXPONENT BIAS
3191
        JNC     AI1             ;JUMP IF ACC > 81H
3192
        ;
3193
        ; Force the number to be a zero
3194
        ;
3195
        ACALL   INC_ASTKA       ;BUMP THE STACK
3196
        ;
3197
P_Z:    MOV     DPTR,#ZRO       ;PUT ZERO ON THE STACK
3198
        AJMP    PUSHC
3199
        ;
3200
AI1:    SUBB    A,#7
3201
        JNC     AI3
3202
        CPL     A
3203
        INC     A
3204
        MOV     R3,A
3205
        DEC     R0              ;POINT AT SIGN
3206
        ;
3207
AI2:    DEC     R0              ;NOW AT LSB'S
3208
        MOVX    A,@R0           ;READ BYTE
3209
        ANL     A,#0F0H         ;STRIP NIBBLE
3210
        MOVX    @R0,A           ;WRITE BYTE
3211
        DJNZ    R3,$+3
3212
        RET
3213
        CLR     A
3214
        MOVX    @R0,A           ;CLEAR THE LOCATION
3215
        DJNZ    R3,AI2
3216
        ;
3217
AI3:    RET                     ;EXIT
3218
        ;
3219
        newpage
3220
        ;***************************************************************
3221
        ;
3222
AABS:   ; Absolute value - Make sign of number positive
3223
        ;                  return sign in ACC
3224
        ;
3225
        ;***************************************************************
3226
        ;
3227
        ACALL   ANEG            ;CHECK TO SEE IF + OR -
3228
        JNZ     ALPAR           ;EXIT IF NON ZERO, BECAUSE THE NUM IS
3229
        MOVX    @R0,A           ;MAKE A POSITIVE SIGN
3230
        RET
3231
        ;
3232
        ;***************************************************************
3233
        ;
3234
ASGN:   ; Returns the sign of the number 1 = +, -1 = -
3235
        ;
3236
        ;***************************************************************
3237
        ;
3238
        ACALL   INC_ASTKA       ;POP STACK, GET EXPONENT
3239
        JZ      P_Z             ;EXIT IF ZERO
3240
        DEC     R0              ;BUMP TO SIGN
3241
        MOVX    A,@R0           ;GET THE SIGN
3242
        MOV     R7,A            ;SAVE THE SIGN
3243
        ACALL   PUSH_ONE        ;PUT A ONE ON THE STACK
3244
        MOV     A,R7            ;GET THE SIGN
3245
        JZ      ALPAR           ;EXIT IF ZERO
3246
        ;
3247
        ; Fall thru to ANEG
3248
        ;
3249
        ;***************************************************************
3250
        ;
3251
ANEG:   ; Flip the sign of the number on the tos
3252
        ;
3253
        ;***************************************************************
3254
        ;
3255
        ACALL   SETREG
3256
        DEC     R0              ;POINT AT THE SIGN OF THE NUMBER
3257
        JZ      ALPAR           ;EXIT IF ZERO
3258
        MOVX    A,@R0
3259
        XRL     A,#01H          ;FLIP THE SIGN
3260
        MOVX    @R0,A
3261
        XRL     A,#01H          ;RESTORE THE SIGN
3262
        ;
3263
ALPAR:  RET
3264
        ;
3265
        newpage
3266
        ;***************************************************************
3267
        ;
3268
ACBYTE: ; Read the ROM
3269
        ;
3270
        ;***************************************************************
3271
        ;
3272
        ACALL   IFIX            ;GET EXPRESSION
3273
        CALL    X31DP           ;PUT R3:R1 INTO THE DP
3274
        CLR     A
3275
        MOVC    A,@A+DPTR
3276
        AJMP    TWO_R2
3277
        ;
3278
        ;***************************************************************
3279
        ;
3280
ADBYTE: ; Read internal memory
3281
        ;
3282
        ;***************************************************************
3283
        ;
3284
        ACALL   IFIX            ;GET THE EXPRESSION
3285
        CALL    R3CK            ;MAKE SURE R3 = 0
3286
        MOV     A,@R1
3287
        AJMP    TWO_R2
3288
        ;
3289
        ;***************************************************************
3290
        ;
3291
AXBYTE: ; Read external memory
3292
        ;
3293
        ;***************************************************************
3294
        ;
3295
        ACALL   IFIX            ;GET THE EXPRESSION
3296
        MOV     P2,R3
3297
        MOVX    A,@R1
3298
        AJMP    TWO_R2
3299
        ;
3300
        newpage
3301
        ;***************************************************************
3302
        ;
3303
        ; The relational operators - EQUAL                        (=)
3304
        ;                            GREATER THAN                 (>)
3305
        ;                            LESS THAN                    (<)
3306
        ;                            GREATER THAN OR EQUAL        (>=)
3307
        ;                            LESS THAN OR EQUAL           (<=)
3308
        ;                            NOT EQUAL                    (<>)
3309
        ;
3310
        ;***************************************************************
3311
        ;
3312
AGT:    ACALL   CMPLK
3313
        ORL     C,F0            ;SEE IF EITHER IS A ONE
3314
        JC      P_Z
3315
        ;
3316
FSTK:   MOV     DPTR,#FS
3317
        AJMP    PUSHC
3318
        ;
3319
FS:     DB      85H
3320
        DB      00H
3321
        DB      00H
3322
        DB      50H
3323
        DB      53H
3324
        DB      65H
3325
        ;
3326
ALT:    ACALL   CMPLK
3327
        CPL     C
3328
        SJMP    AGT+4
3329
        ;
3330
AEQ:    ACALL   CMPLK
3331
        MOV     C,F0
3332
        SJMP    ALT+2
3333
        ;
3334
ANE:    ACALL   CMPLK
3335
        CPL     F0
3336
        SJMP    AEQ+2
3337
        ;
3338
AGE:    ACALL   CMPLK
3339
        SJMP    AGT+4
3340
        ;
3341
ALE:    ACALL   CMPLK
3342
        ORL     C,F0
3343
        SJMP    ALT+2
3344
        ;
3345
        newpage
3346
        ;***************************************************************
3347
        ;
3348
ARND:   ; Generate a random number
3349
        ;
3350
        ;***************************************************************
3351
        ;
3352
        MOV     DPTR,#RCELL     ;GET THE BINARY SEED
3353
        CALL    L31DPI
3354
        MOV     A,R1
3355
        CLR     C
3356
        RRC     A
3357
        MOV     R0,A
3358
        MOV     A,#6
3359
        RRC     A
3360
        ADD     A,R1
3361
        XCH     A,R0
3362
        ADDC    A,R3
3363
        MOV     R2,A
3364
        DEC     DPL             ;SAVE THE NEW SEED
3365
        ACALL   S20DP
3366
        ACALL   TWO_EY
3367
        ACALL   FSTK
3368
        ;
3369
ADIV:   LCALL   FP_BASE+8
3370
        AJMP    FPTST
3371
        ;
3372
        newpage
3373
        ;***************************************************************
3374
        ;
3375
SONERR: ; ON ERROR Statement
3376
        ;
3377
        ;***************************************************************
3378
        ;
3379
        LCALL   INTERR          ;GET THE LINE NUMBER
3380
        SETB    ON_ERR
3381
        MOV     DPTR,#ERRNUM    ;POINT AT THR ERROR LOCATION
3382
        SJMP    S20DP
3383
        ;
3384
        ;
3385
        ;**************************************************************
3386
        ;
3387
SONEXT: ; ON EXT1 Statement
3388
        ;
3389
        ;**************************************************************
3390
        ;
3391
        LCALL   INTERR
3392
        SETB    INTBIT
3393
        ORL     IE,#10000100B   ;ENABLE INTERRUPTS
3394
        MOV     DPTR,#INTLOC
3395
        ;
3396
S20DP:  MOV     A,R2            ;SAVE R2:R0 @DPTR
3397
        MOVX    @DPTR,A
3398
        INC     DPTR
3399
        MOV     A,R0
3400
        MOVX    @DPTR,A
3401
        RET
3402
        ;
3403
        newpage
3404
        ;***************************************************************
3405
        ;
3406
        ; CASTAK - Copy and push another top of arg stack
3407
        ;
3408
        ;***************************************************************
3409
        ;
3410
CSTAKA2:ACALL   CSTAKA          ;COPY STACK TWICE
3411
        ;
3412
CSTAKA: ACALL   SETREG          ;SET UP R2:R0
3413
        SJMP    PUSH_T1+4
3414
        ;
3415
PLNEXP: MOV     DPTR,#EXP1
3416
        ;
3417
        ;***************************************************************
3418
        ;
3419
        ; PUSHC - Push constant on to the arg stack
3420
        ;
3421
        ;***************************************************************
3422
        ;
3423
PUSHC:  ACALL   DEC_ASTKA
3424
        MOV     P2,R3
3425
        MOV     R3,#FPSIZ       ;LOOP COUNTER
3426
        ;
3427
PCL:    CLR     A               ;SET UP A
3428
        MOVC    A,@A+DPTR       ;LOAD IT
3429
        MOVX    @R1,A           ;SAVE IT
3430
        INC     DPTR            ;BUMP POINTERS
3431
        DEC     R1
3432
        DJNZ    R3,PCL          ;LOOP
3433
        ;
3434
        SETB    ARGF
3435
        RET                     ;EXIT
3436
        ;
3437
PUSH_ONE:;
3438
        ;
3439
        MOV     DPTR,#FPONE
3440
        AJMP    PUSHC
3441
        ;
3442
        newpage
3443
        ;
3444
POP_T1:
3445
        ;
3446
        MOV     R3,#HI(FPT1)
3447
        MOV     R1,#LO(FPT1)
3448
        JMP     POPAS
3449
        ;
3450
PUSH_T1:
3451
        ;
3452
        MOV     R0,#LO(FPT1)
3453
        MOV     R2,#HI(FPT1)
3454
        LJMP    PUSHAS
3455
        ;
3456
P_T2:   MOV     R0,#LO(FPT2)
3457
        SJMP    $-7                     ;JUMP TO PUSHAS
3458
        ;
3459
        ;****************************************************************
3460
        ;
3461
SWAP_ASTKA:     ; SWAP TOS<>TOS-1
3462
        ;
3463
        ;****************************************************************
3464
        ;
3465
        ACALL   SETREG          ;SET UP R2:R0 AND P2
3466
        MOV     A,#FPSIZ        ;PUT TOS+1 IN R1
3467
        MOV     R2,A
3468
        ADD     A,R0
3469
        MOV     R1,A
3470
        ;
3471
S_L:    MOVX    A,@R0
3472
        MOV     R3,A
3473
        MOVX    A,@R1
3474
        MOVX    @R0,A
3475
        MOV     A,R3
3476
        MOVX    @R1,A
3477
        DEC     R1
3478
        DEC     R0
3479
        DJNZ    R2,S_L
3480
        RET
3481
        ;
3482
        newpage
3483
        ;
3484
C_T2:   ACALL   SETREG          ;SET UP R2:R0
3485
        MOV     R3,#HI(FPT2)
3486
        MOV     R1,#LO(FPT2)    ;TEMP VALUE
3487
        ;
3488
        ; Fall thru
3489
        ;
3490
        ;***************************************************************
3491
        ;
3492
        ; VARCOP - Copy a variable from R2:R0 to R3:R1
3493
        ;
3494
        ;***************************************************************
3495
        ;
3496
VARCOP: MOV     R4,#FPSIZ       ;LOAD THE LOOP COUNTER
3497
        ;
3498
V_C:    MOV     P2,R2           ;SET UP THE PORTS
3499
        MOVX    A,@R0           ;READ THE VALUE
3500
        MOV     P2,R3           ;PORT TIME AGAIN
3501
        MOVX    @R1,A           ;SAVE IT
3502
        ACALL   DEC3210         ;BUMP POINTERS
3503
        DJNZ    R4,V_C          ;LOOP
3504
        RET                     ;EXIT
3505
        ;
3506
PIPI:   MOV     DPTR,#PIE
3507
        AJMP    PUSHC
3508
        ;
3509
        newpage
3510
        ;***************************************************************
3511
        ;
3512
        ; The logical operators ANL, ORL, XRL, NOT
3513
        ;
3514
        ;***************************************************************
3515
        ;
3516
AANL:   ACALL   TWOL            ;GET THE EXPRESSIONS
3517
        MOV     A,R3            ;DO THE AND
3518
        ANL     A,R7
3519
        MOV     R2,A
3520
        MOV     A,R1
3521
        ANL     A,R6
3522
        SJMP    TWO_EX
3523
        ;
3524
AORL:   ACALL   TWOL            ;SAME THING FOR OR
3525
        MOV     A,R3
3526
        ORL     A,R7
3527
        MOV     R2,A
3528
        MOV     A,R1
3529
        ORL     A,R6
3530
        SJMP    TWO_EX
3531
        ;
3532
ANOT:   ACALL   FSTK            ;PUT 0FFFFH ON THE STACK
3533
        ;
3534
AXRL:   ACALL   TWOL
3535
        MOV     A,R3
3536
        XRL     A,R7
3537
        MOV     R2,A
3538
        MOV     A,R1
3539
        XRL     A,R6
3540
        SJMP    TWO_EX
3541
        ;
3542
TWOL:   ACALL   IFIX
3543
        MOV     R7,R3B0
3544
        MOV     R6,R1B0
3545
        AJMP    IFIX
3546
        ;
3547
        newpage
3548
        ;*************************************************************
3549
        ;
3550
AGET:   ; READ THE BREAK BYTE AND PUT IT ON THE ARG STACK
3551
        ;
3552
        ;*************************************************************
3553
        ;
3554
        MOV     DPTR,#GTB       ;GET THE BREAK BYTE
3555
        MOVX    A,@DPTR
3556
        JBC     GTRD,TWO_R2
3557
        CLR     A
3558
        ;
3559
TWO_R2: MOV     R2,#00H         ;ACC GOES TO STACK
3560
        ;
3561
        ;
3562
TWO_EX: MOV     R0,A            ;R2:ACC GOES TO STACK
3563
        ;
3564
        ;
3565
TWO_EY: SETB    ARGF            ;R2:R0 GETS PUT ON THE STACK
3566
        JMP     FP_BASE+24      ;DO IT
3567
        ;
3568
        newpage
3569
        ;*************************************************************
3570
        ;
3571
        ; Put directs onto the stack
3572
        ;
3573
        ;**************************************************************
3574
        ;
3575
A_IE:   MOV     A,IE            ;IE
3576
        SJMP    TWO_R2
3577
        ;
3578
A_IP:   MOV     A,IP            ;IP
3579
        SJMP    TWO_R2
3580
        ;
3581
ATIM0:  MOV     R2,TH0          ;TIMER 0
3582
        MOV     R0,TL0
3583
        SJMP    TWO_EY
3584
        ;
3585
ATIM1:  MOV     R2,TH1          ;TIMER 1
3586
        MOV     R0,TL1
3587
        SJMP    TWO_EY
3588
        ;
3589
ATIM2:  DB      0AAH            ;MOV R2 DIRECT OP CODE
3590
        DB      0CDH            ;T2 HIGH
3591
        DB      0A8H            ;MOV R0 DIRECT OP CODE
3592
        DB      0CCH            ;T2 LOW
3593
        SJMP    TWO_EY          ;TIMER 2
3594
        ;
3595
AT2CON: DB      0E5H            ;MOV A,DIRECT OPCODE
3596
        DB      0C8H            ;T2CON LOCATION
3597
        SJMP    TWO_R2
3598
        ;
3599
ATCON:  MOV     A,TCON          ;TCON
3600
        SJMP    TWO_R2
3601
        ;
3602
ATMOD:  MOV     A,TMOD          ;TMOD
3603
        SJMP    TWO_R2
3604
        ;
3605
ARCAP2: DB      0AAH            ;MOV R2, DIRECT OP CODE
3606
        DB      0CBH            ;RCAP2H LOCATION
3607
        DB      0A8H            ;MOV R0, DIRECT OP CODE
3608
        DB      0CAH            ;R2CAPL LOCATION
3609
        SJMP    TWO_EY
3610
        ;
3611
AP1:    MOV     A,P1            ;GET P1
3612
        SJMP    TWO_R2          ;PUT IT ON THE STACK
3613
        ;
3614
APCON:  DB      0E5H            ;MOV A, DIRECT OP CODE
3615
        DB      87H             ;ADDRESS OF PCON
3616
        SJMP    TWO_R2          ;PUT PCON ON THE STACK
3617
        ;
3618
        newpage
3619
        ;***************************************************************
3620
        ;
3621
        ;THIS IS THE LINE EDITOR
3622
        ;
3623
        ;TAKE THE PROCESSED LINE IN IBUF AND INSERT IT INTO THE
3624
        ;BASIC TEXT FILE.
3625
        ;
3626
        ;***************************************************************
3627
        ;
3628
        LJMP    NOGO            ;CAN'T EDIT A ROM
3629
        ;
3630
LINE:   MOV     A,BOFAH
3631
        CJNE    A,#HI(PSTART),LINE-3
3632
        CALL    G4              ;GET END ADDRESS FOR EDITING
3633
        MOV     R4,DPL
3634
        MOV     R5,DPH
3635
        MOV     R3,TEMP5        ;GET HIGH ORDER IBLN
3636
        MOV     R1,TEMP4        ;LOW ORDER IBLN
3637
        ;
3638
        CALL    GETLIN          ;FIND THE LINE
3639
        JNZ     INSR            ;INSERT IF NOT ZERO, ELSE APPEND
3640
        ;
3641
        ;APPEND THE LINE AT THE END
3642
        ;
3643
        MOV     A,TEMP3         ;PUT IBCNT IN THE ACC
3644
        CJNE    A,#4H,$+4       ;SEE IF NO ENTRY
3645
        RET                     ;RET IF NO ENTRY
3646
        ;
3647
        ACALL   FULL            ;SEE IF ENOUGH SPACE LEFT
3648
        MOV     R2,R5B0         ;PUT END ADDRESS A INTO TRANSFER
3649
        MOV     R0,R4B0         ;REGISTERS
3650
        ACALL   IMOV            ;DO THE BLOCK MOVE
3651
        ;
3652
UE:     MOV     A,#EOF          ;SAVE EOF CHARACTER
3653
        AJMP    TBR
3654
        ;
3655
        ;INSERT A LINE INTO THE FILE
3656
        ;
3657
INSR:   MOV     R7,A            ;SAVE IT IN R7
3658
        CALL    TEMPD           ;SAVE INSERATION ADDRESS
3659
        MOV     A,TEMP3         ;PUT THE COUNT LENGTH IN THE ACC
3660
        JC      LTX             ;JUMP IF NEW LINE # NOT = OLD LINE #
3661
        CJNE    A,#04H,$+4      ;SEE IF NULL
3662
        CLR     A
3663
        ;
3664
        SUBB    A,R7            ;SUBTRACT LINE COUNT FROM ACC
3665
        JZ      LIN1            ;LINE LENGTHS EQUAL
3666
        JC      GTX             ;SMALLER LINE
3667
        ;
3668
        newpage
3669
        ;
3670
        ;EXPAND FOR A NEW LINE OR A LARGER LINE
3671
        ;
3672
LTX:    MOV     R7,A            ;SAVE A IN R7
3673
        MOV     A,TEMP3         ;GET THE COUNT IN THE ACC
3674
        CJNE    A,#04H,$+4      ;DO NO INSERTATION IF NULL LINE
3675
        RET                     ;EXIT IF IT IS
3676
        ;
3677
        MOV     A,R7            ;GET THE COUNT BACK - DELTA IN A
3678
        ACALL   FULL            ;SEE IF ENOUGH MEMORY NEW EOFA IN R3:R1
3679
        CALL    DTEMP           ;GET INSERATION ADDRESS
3680
        ACALL   NMOV            ;R7:R6 GETS (EOFA)-DPTR
3681
        CALL    X3120
3682
        MOV     R1,R4B0         ;EOFA LOW
3683
        MOV     R3,R5B0         ;EOFA HIGH
3684
        INC     R6              ;INCREMENT BYTE COUNT
3685
        CJNE    R6,#00,$+4      ;NEED TO BUMP HIGH BYTE?
3686
        INC     R7
3687
        ;
3688
        ACALL   RMOV            ;GO DO THE INSERTION
3689
        SJMP    LIN1            ;INSERT THE CURRENT LINE
3690
        ;
3691
GTX:    CPL     A               ;FLIP ACC
3692
        INC     A               ;TWOS COMPLEMENT
3693
        CALL    ADDPTR          ;DO THE ADDITION
3694
        ACALL   NMOV            ;R7:R6 GETS (EOFA)-DPTR
3695
        MOV     R1,DPL          ;SET UP THE REGISTERS
3696
        MOV     R3,DPH
3697
        MOV     R2,TEMP5        ;PUT INSERTATION ADDRESS IN THE RIGHT REG
3698
        MOV     R0,TEMP4
3699
        JZ      $+4             ;IF ACC WAS ZERO FROM NMOV, JUMP
3700
        ACALL   LMOV            ;IF NO ZERO DO A LMOV
3701
        ;
3702
        ACALL   UE              ;SAVE NEW END ADDRESS
3703
        ;
3704
LIN1:   MOV     R2,TEMP5        ;GET THE INSERTATION ADDRESS
3705
        MOV     R0,TEMP4
3706
        MOV     A,TEMP3         ;PUT THE COUNT LENGTH IN ACC
3707
        CJNE    A,#04H,IMOV     ;SEE IF NULL
3708
        RET                     ;EXIT IF NULL
3709
        newpage
3710
        ;***************************************************************
3711
        ;
3712
        ;INSERT A LINE AT ADDRESS R2:R0
3713
        ;
3714
        ;***************************************************************
3715
        ;
3716
IMOV:   CLR     A               ;TO SET UP
3717
        MOV     R1,#LO(IBCNT)   ;INITIALIZE THE REGISTERS
3718
        MOV     R3,A
3719
        MOV     R6,TEMP3        ;PUT THE BYTE COUNT IN R6 FOR LMOV
3720
        MOV     R7,A            ;PUT A 0 IN R7 FOR LMOV
3721
        ;
3722
        ;***************************************************************
3723
        ;
3724
        ;COPY A BLOCK FROM THE BEGINNING
3725
        ;
3726
        ;R2:R0 IS THE DESTINATION ADDRESS
3727
        ;R3:R1 IS THE SOURCE ADDRESS
3728
        ;R7:R6 IS THE COUNT REGISTER
3729
        ;
3730
        ;***************************************************************
3731
        ;
3732
LMOV:   ACALL   TBYTE           ;TRANSFER THE BYTE
3733
        ACALL   INC3210         ;BUMP THE POINTER
3734
        ACALL   DEC76           ;BUMP R7:R6
3735
        JNZ     LMOV            ;LOOP
3736
        RET                     ;GO BACK TO CALLING ROUTINE
3737
        ;
3738
INC3210:INC     R0
3739
        CJNE    R0,#00H,$+4
3740
        INC     R2
3741
        ;
3742
        INC     R1
3743
        CJNE    R1,#00H,$+4
3744
        INC     R3
3745
        RET
3746
        ;
3747
        newpage
3748
        ;***************************************************************
3749
        ;
3750
        ;COPY A BLOCK STARTING AT THE END
3751
        ;
3752
        ;R2:R0 IS THE DESTINATION ADDRESS
3753
        ;R3:R1 IS THE SOURCE ADDRESS
3754
        ;R6:R7 IS THE COUNT REGISTER
3755
        ;
3756
        ;***************************************************************
3757
        ;
3758
RMOV:   ACALL   TBYTE           ;TRANSFER THE BYTE
3759
        ACALL   DEC3210         ;DEC THE LOCATIONS
3760
        ACALL   DEC76           ;BUMP THE COUNTER
3761
        JNZ     RMOV            ;LOOP
3762
        ;
3763
DEC_R:  NOP                     ;CREATE EQUAL TIMING
3764
        RET                     ;EXIT
3765
        ;
3766
DEC3210:DEC     R0              ;BUMP THE POINTER
3767
        CJNE    R0,#0FFH,$+4    ;SEE IF OVERFLOWED
3768
        DEC     R2              ;BUMP THE HIGH BYTE
3769
        DEC     R1              ;BUMP THE POINTER
3770
        CJNE    R1,#0FFH,DEC_R  ;SEE IF OVERFLOWED
3771
        DEC     R3              ;CHANGE THE HIGH BYTE
3772
        RET                     ;EXIT
3773
        ;
3774
        ;***************************************************************
3775
        ;
3776
        ;TBYTE - TRANSFER A BYTE
3777
        ;
3778
        ;***************************************************************
3779
        ;
3780
TBYTE:  MOV     P2,R3           ;OUTPUT SOURCE REGISTER TO PORT
3781
        MOVX    A,@R1           ;PUT BYTE IN ACC
3782
        ;
3783
TBR:    MOV     P2,R2           ;OUTPUT DESTINATION TO PORT
3784
        MOVX    @R0,A           ;SAVE THE BYTE
3785
        RET                     ;EXIT
3786
        ;
3787
        newpage
3788
        ;***************************************************************
3789
        ;
3790
        ;NMOV - R7:R6 = END ADDRESS - DPTR
3791
        ;
3792
        ;ACC GETS CLOBBERED
3793
        ;
3794
        ;***************************************************************
3795
        ;
3796
NMOV:   MOV     A,R4            ;THE LOW BYTE OF EOFA
3797
        CLR     C               ;CLEAR THE CARRY FOR SUBB
3798
        SUBB    A,DPL           ;SUBTRACT DATA POINTER LOW
3799
        MOV     R6,A            ;PUT RESULT IN R6
3800
        MOV     A,R5            ;HIGH BYTE OF EOFA
3801
        SUBB    A,DPH           ;SUBTRACT DATA POINTER HIGH
3802
        MOV     R7,A            ;PUT RESULT IN R7
3803
        ORL     A,R6            ;SEE IF ZERO
3804
        RET                     ;EXIT
3805
        ;
3806
        ;***************************************************************
3807
        ;
3808
        ;CHECK FOR A FILE OVERFLOW
3809
        ;LEAVES THE NEW END ADDRESS IN R3:R1
3810
        ;A HAS THE INCREASE IN SIZE
3811
        ;
3812
        ;***************************************************************
3813
        ;
3814
FULL:   ADD     A,R4            ;ADD A TO END ADDRESS
3815
        MOV     R1,A            ;SAVE IT
3816
        CLR     A
3817
        ADDC    A,R5            ;ADD THE CARRY
3818
        MOV     R3,A
3819
        MOV     DPTR,#VARTOP    ;POINT AT VARTOP
3820
        ;
3821
FUL1:   CALL    DCMPX           ;COMPARE THE TWO
3822
        JC      FULL-1          ;OUT OF ROOM
3823
        ;
3824
TB:     MOV     DPTR,#E5X       ;OUT OF MEMORY
3825
        AJMP    FPTS
3826
        ;
3827
        newpage
3828
        ;***************************************************************
3829
        ;
3830
        ; PP - Preprocesses the line in IBUF back into IBUF
3831
        ;      sets F0 if no line number
3832
        ;      leaves the correct length of processed line in IBCNT
3833
        ;      puts the line number in IBLN
3834
        ;      wastes the text address TXAL and TXAH
3835
        ;
3836
        ;***************************************************************
3837
        ;
3838
PP:     ACALL   T_BUF           ;TXA GETS IBUF
3839
        CALL    INTGER          ;SEE IF A NUMBER PRESENT
3840
        CALL    TEMPD           ;SAVE THE INTEGER IN TEMP5:TEMP4
3841
        MOV     F0,C            ;SAVE INTEGER IF PRESENT
3842
        MOV     DPTR,#IBLN      ;SAVE THE LINE NUMBER, EVEN IF NONE
3843
        ACALL   S20DP
3844
        MOV     R0,TXAL         ;TEXT POINTER
3845
        MOV     R1,#LO(IBUF)    ;STORE POINTER
3846
        ;
3847
        ; Now process the line back into IBUF
3848
        ;
3849
PPL:    CLR     ARGF            ;FIRST PASS DESIGNATOR
3850
        MOV     DPTR,#TOKTAB    ;POINT DPTR AT LOOK UP TABLE
3851
        ;
3852
PPL1:   MOV     R5B0,R0         ;SAVE THE READ POINTER
3853
        CLR     A               ;ZERO A FOR LOOKUP
3854
        MOVC    A,@A+DPTR       ;GET THE TOKEN
3855
        MOV     R7,A            ;SAVE TOKEN IN CASE OF MATCH
3856
        ;
3857
PPL2:   MOVX    A,@R0           ;GET THE USER CHARACTER
3858
        MOV     R3,A            ;SAVE FOR REM
3859
        CJNE    A,#'a',$+3
3860
        JC      PPX             ;CONVERT LOWER TO UPPER CASE
3861
        CJNE    A,#('z'+1),$+3
3862
        JNC     PPX
3863
        CLR     ACC.5
3864
        ;
3865
PPX:    MOV     R2,A
3866
        MOVX    @R0,A           ;SAVE UPPER CASE
3867
        INC     DPTR            ;BUMP THE LOOKUP POINTER
3868
        CLR     A
3869
        MOVC    A,@A+DPTR
3870
        CJNE    A,R2B0,PPL3     ;LEAVE IF NOT THE SAME
3871
        INC     R0              ;BUMP THE USER POINTER
3872
        SJMP    PPL2            ;CONTINUE TO LOOP
3873
        ;
3874
PPL3:   JB      ACC.7,PPL6      ;JUMP IF FOUND MATCH
3875
        JZ      PPL6            ;USER MATCH
3876
        ;
3877
        ;
3878
        ; Scan to the next TOKTAB entry
3879
        ;
3880
PPL4:   INC     DPTR            ;ADVANCE THE POINTER
3881
        CLR     A               ;ZERO A FOR LOOKUP
3882
        MOVC    A,@A+DPTR       ;LOAD A WITH TABLE
3883
        JB      ACC.7,$+6       ;KEEP SCANNING IF NOT A RESERVED WORD
3884
        JNZ     PPL4
3885
        INC     DPTR
3886
        ;
3887
        ; See if at the end of TOKTAB
3888
        ;
3889
        MOV     R0,R5B0         ;RESTORE THE POINTER
3890
        CJNE    A,#0FFH,PPL1    ;SEE IF END OF TABLE
3891
        ;
3892
        ; Character not in TOKTAB, so see what it is
3893
        ;
3894
        CJNE    R2,#' ',PPLX    ;SEE IF A SPACE
3895
        INC     R0              ;BUMP USER POINTER
3896
        SJMP    PPL             ;TRY AGAIN
3897
        ;
3898
PPLX:   JNB     XBIT,PPLY       ;EXTERNAL TRAP
3899
        JB      ARGF,PPLY
3900
        SETB    ARGF            ;SAYS THAT THE USER HAS TABLE
3901
        LCALL   2078H           ;SET UP POINTER
3902
        AJMP    PPL1
3903
        ;
3904
PPLY:   ACALL   PPL7            ;SAVE CHARACTER, EXIT IF A CR
3905
        CJNE    A,#'"',PPL      ;SEE IF QUOTED STRING, START AGAIN IF NOT
3906
        ;
3907
        ; Just copy a quoted string
3908
        ;
3909
        ACALL   PPL7            ;SAVE THE CHARACTER, TEST FOR CR
3910
        CJNE    A,#'"',$-2      ;IS THERE AN ENDQUOTE, IF NOT LOOP
3911
        SJMP    PPL             ;DO IT AGAIN IF ENDQUOTE
3912
        ;
3913
PPL6:   MOV     A,R7            ;GET THE TOKEN
3914
        ACALL   PPL9+1          ;SAVE THE TOKEN
3915
        CJNE    A,#T_REM,PPL    ;SEE IF A REM TOKEN
3916
        MOV     A,R3
3917
        ACALL   PPL7+1          ;WASTE THE REM STATEMENT
3918
        ACALL   PPL7            ;LOOP UNTIL A CR
3919
        SJMP    $-2
3920
        ;
3921
PPL7:   MOVX    A,@R0           ;GET THE CHARACTER
3922
        CJNE    A,#CR,PPL9      ;FINISH IF A CR
3923
        POP     R0B0            ;WASTE THE CALLING STACK
3924
        POP     R0B0
3925
        MOVX    @R1,A           ;SAVE CR IN MEMORY
3926
        INC     R1              ;SAVE A TERMINATOR
3927
        MOV     A,#EOF
3928
        MOVX    @R1,A
3929
        MOV     A,R1            ;SUBTRACT FOR LENGTH
3930
        SUBB    A,#4
3931
        MOV     TEMP3,A         ;SAVE LENGTH
3932
        MOV     R1,#LO(IBCNT)   ;POINT AT BUFFER COUNT
3933
        ;
3934
PPL9:   INC     R0
3935
        MOVX    @R1,A           ;SAVE THE CHARACTER
3936
        INC     R1              ;BUMP THE POINTERS
3937
        RET                     ;EXIT TO CALLING ROUTINE
3938
        ;
3939
        ;
3940
        ;***************************************************************
3941
        ;
3942
        ;DEC76 - DECREMENT THE REGISTER PAIR R7:R6
3943
        ;
3944
        ;ACC = ZERO IF R7:R6 = ZERO ; ELSE ACC DOES NOT
3945
        ;
3946
        ;***************************************************************
3947
        ;
3948
DEC76:  DEC     R6              ;BUMP R6
3949
        CJNE    R6,#0FFH,$+4    ;SEE IF RAPPED AROUND
3950
        DEC     R7
3951
        MOV     A,R7            ;SEE IF ZERO
3952
        ORL     A,R6
3953
        RET                     ;EXIT
3954
        ;
3955
        ;***************************************************************
3956
        ;
3957
        ; MTOP - Get or Put the top of assigned memory
3958
        ;
3959
        ;***************************************************************
3960
        ;
3961
PMTOP:  MOV     DPTR,#MEMTOP
3962
        CALL    L20DPI
3963
        AJMP    TWO_EY          ;PUT R2:R0 ON THE STACK
3964
        ;
3965
        newpage
3966
        ;*************************************************************
3967
        ;
3968
        ; AXTAL - Crystal value calculations
3969
        ;
3970
        ;*************************************************************
3971
        ;
3972
AXTAL0: MOV     DPTR,#XTALV     ;CRYSTAL VALUE
3973
        ACALL   PUSHC
3974
        ;
3975
AXTAL1: ACALL   CSTAKA2         ;COPY CRYSTAL VALUE TWICE
3976
        ACALL   CSTAKA
3977
        MOV     DPTR,#PTIME     ;PROM TIMER
3978
        ACALL   AXTAL2
3979
        MOV     DPTR,#PROGS
3980
        ACALL   S31L
3981
        MOV     DPTR,#IPTIME    ;IPROM TIMER
3982
        ACALL   AXTAL2
3983
        MOV     DPTR,#IPROGS
3984
        ACALL   S31L
3985
        MOV     DPTR,#TTIME     ;CLOCK CALCULATION
3986
        ACALL   AXTAL3
3987
        MOV     A,R1
3988
        CPL     A
3989
        INC     A
3990
        MOV     SAVE_T,A
3991
        MOV     R3,#HI(CXTAL)
3992
        MOV     R1,#LO(CXTAL)
3993
        JMP     POPAS
3994
        ;
3995
AXTAL2: ACALL   AXTAL3
3996
        ;
3997
CBIAS:  ;Bias the crystal calculations
3998
        ;
3999
        MOV     A,R1            ;GET THE LOW COUNT
4000
        CPL     A               ;FLIP IT FOR TIMER LOAD
4001
        ADD     A,#15           ;BIAS FOR CALL AND LOAD TIMES
4002
        MOV     R1,A            ;RESTORE IT
4003
        MOV     A,R3            ;GET THE HIGH COUNT
4004
        CPL     A               ;FLIP IT
4005
        ADDC    A,#00H          ;ADD THE CARRY
4006
        MOV     R3,A            ;RESTORE IT
4007
        RET
4008
        ;
4009
        newpage
4010
        include bas52.pwm       ; ******AA
4011
        newpage
4012
        ;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
4013
        ;
4014
LNTAB:  ; Natural log lookup table
4015
        ;
4016
        ;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
4017
        ;
4018
        DB      80H
4019
        DB      00H
4020
        DB      71H
4021
        DB      37H
4022
        DB      13H
4023
        DB      19H
4024
        ;
4025
        DB      7FH
4026
        DB      00H
4027
        DB      76H
4028
        DB      64H
4029
        DB      37H
4030
        DB      94H
4031
        ;
4032
        DB      80H
4033
        DB      00H
4034
        DB      07H
4035
        DB      22H
4036
        DB      75H
4037
        DB      17H
4038
        ;
4039
        DB      80H
4040
        DB      00H
4041
        DB      52H
4042
        DB      35H
4043
        DB      93H
4044
        DB      28H
4045
        ;
4046
        DB      80H
4047
        DB      00H
4048
        DB      71H
4049
        DB      91H
4050
        DB      85H
4051
        DB      86H
4052
        ;
4053
        DB      0FFH
4054
        ;
4055
        DB      81H
4056
        DB      00H
4057
        DB      51H
4058
        DB      58H
4059
        DB      02H
4060
        DB      23H
4061
        ;
4062
        newpage
4063
        ;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
4064
        ;
4065
SINTAB: ; Sin lookup table
4066
        ;
4067
        ;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
4068
        ;
4069
        DB      128-9
4070
        DB      00H
4071
        DB      44H
4072
        DB      90H
4073
        DB      05H
4074
        DB      16H
4075
        ;
4076
        DB      128-7
4077
        DB      01H
4078
        DB      08H
4079
        DB      21H
4080
        DB      05H
4081
        DB      25H
4082
        ;
4083
        DB      128-5
4084
        DB      00H
4085
        DB      19H
4086
        DB      73H
4087
        DB      55H
4088
        DB      27H
4089
        ;
4090
        newpage
4091
        ;
4092
        DB      128-3
4093
        DB      01H
4094
        DB      70H
4095
        DB      12H
4096
        DB      84H
4097
        DB      19H
4098
        ;
4099
        DB      128-2
4100
        DB      00H
4101
        DB      33H
4102
        DB      33H
4103
        DB      33H
4104
        DB      83H
4105
        ;
4106
        DB      128
4107
        DB      01H
4108
        DB      67H
4109
        DB      66H
4110
        DB      66H
4111
        DB      16H
4112
        ;
4113
FPONE:  DB      128+1
4114
        DB      00H
4115
        DB      00H
4116
        DB      00H
4117
        DB      00H
4118
        DB      10H
4119
        ;
4120
        DB      0FFH            ;END OF TABLE
4121
        ;
4122
        newpage
4123
        ;
4124
SBAUD:  CALL    AXTAL           ;PUT CRYSTAL ON THE STACK
4125
        CALL    EXPRB           ;PUT THE NUMBER AFTER BAUD ON STACK
4126
        MOV     A,#12
4127
        ACALL   TWO_R2          ;TOS = 12
4128
        ACALL   AMUL            ;TOS = 12*BAUD
4129
        ACALL   ADIV            ;TOS = XTAL/(12*BAUD)
4130
        ACALL   IFIX
4131
        ACALL   CBIAS
4132
        MOV     DPTR,#SPV
4133
        ;
4134
S31L:   JMP     S31DP
4135
        ;
4136
AFREE:  CALL    PMTOP           ;PUT MTOP ON STACK
4137
        CALL    G4              ;GET END ADDRESS
4138
        MOV     R0,DPL
4139
        MOV     R2,DPH
4140
        ACALL   TWO_EY
4141
        ;
4142
ASUB:   LCALL   FP_BASE+2       ;DO FP SUB
4143
        AJMP    FPTST
4144
        ;
4145
ALEN:   CALL    CCAL            ;CALCULATE THE LEN OF THE SELECTED PROGRAM
4146
        MOV     R2,R7B0         ;SAVE THE HIGH BYTE
4147
        MOV     A,R6            ;SAVE THE LOW BYTE
4148
        AJMP    TWO_EX          ;PUT IT ON THE STACK
4149
        ;
4150
ATIME:  MOV     C,EA            ;SAVE INTERRUTS
4151
        CLR     EA
4152
        PUSH    MILLIV          ;SAVE MILLI VALUE
4153
        MOV     R2,TVH          ;GET THE TIMER
4154
        MOV     A,TVL
4155
        MOV     EA,C            ;SAVE INTERRUPTS
4156
        ACALL   TWO_EX          ;PUT TIMER ON THE STACK
4157
        POP     ACC             ;GET MILLI
4158
        ACALL   TWO_R2          ;PUT MILLI ON STACK
4159
        MOV     A,#200
4160
        ACALL   TWO_R2          ;DIVIDE MILLI BY 200
4161
        ACALL   ADIV
4162
        ;
4163
AADD:   LCALL   FP_BASE         ;DO FP ADDITION
4164
        AJMP    FPTST           ;CHECK FOR ERRORS
4165
        ;
4166
        newpage
4167
        ;**************************************************************
4168
        ;
4169
        ; Here are some error messages that were moved
4170
        ;
4171
        ;**************************************************************
4172
        ;
4173
        ;
4174
E1X:    DB      "BAD SYNTAX",'"'
4175
E2X:    DB      128+10
4176
        DB      "DIVIDE BY ZERO",'"'
4177
        ;
4178
E6X:    DB      "ARRAY SIZE",'"'
4179
        ;
4180
        newpage
4181
        ;**************************************************************
4182
        ;
4183
T_BUF:  ; TXA gets IBUF
4184
        ;
4185
        ;**************************************************************
4186
        ;
4187
        MOV     TXAH,#HI(IBUF)
4188
        MOV     TXAL,#LO(IBUF)
4189
        RET
4190
        ;
4191
        ;
4192
        ;***************************************************************
4193
        ;
4194
CXFER:  ; Transfer a program from rom to ram
4195
        ;
4196
        ;***************************************************************
4197
        ;
4198
        CALL    CCAL            ;GET EVERYTHING SET UP
4199
        MOV     R2,#HI(PSTART)
4200
        MOV     R0,#LO(PSTART)
4201
        ACALL   LMOV            ;DO THE TRANSFER
4202
        CALL    RCLEAR          ;CLEAR THE MEMORY
4203
        ;
4204
        ; Fall thru to CRAM
4205
        ;
4206
        ;***************************************************************
4207
        ;
4208
CRAM:   ; The command action routine - RAM - Run out of ram
4209
        ;
4210
        ;***************************************************************
4211
        ;
4212
        CLR     CONB            ;CAN'T CONTINUE IF MODE CHANGE
4213
        MOV     BOFAH,#HI(PSTART)
4214
        MOV     BOFAL,#LO(PSTART)
4215
        ;
4216
        ; Fall thru to Command Processor
4217
        ;
4218
        newpage
4219
        ;***************************************************************
4220
        ;
4221
CMND1:  ; The entry point for the command processor
4222
        ;
4223
        ;***************************************************************
4224
        ;
4225
        LCALL   SPRINT+4        ;WASTE AT AND HEX
4226
        CLR     XBIT            ;TO RESET IF NEEDED
4227
        CLR     A
4228
        MOV     DPTR,#2002H     ;CHECK FOR EXTERNAL TRAP PACKAGE
4229
        MOVC    A,@A+DPTR
4230
        CJNE    A,#5AH,$+6
4231
        LCALL   2048H           ;IF PRESENT JUMP TO LOCATION 200BH
4232
        MOV     DPTR,#RDYS      ;PRINT THE READY MESSAGE
4233
        CALL    CRP             ;DO A CR, THEN, PRINT FROM THE ROM
4234
        ;
4235
CMNDR:  SETB    DIRF            ;SET THE DIRECT INPUT BIT
4236
        MOV     SP,SPSAV        ;LOAD THE STACK
4237
        ACALL   CL7             ;DO A CRLF
4238
        ;
4239
CMNX:   CLR     GTRD            ;CLEAR BREAK
4240
        MOV     DPTR,#5EH       ;DO RUN TRAP
4241
        MOVX    A,@DPTR
4242
        XRL     A,#52
4243
        JNZ     $+5
4244
        LJMP    CRUN
4245
        MOV     R5,#'>'         ;OUTPUT A PROMPT
4246
        LCALL   TEROT
4247
        CALL    INLINE          ;INPUT A LINE INTO IBUF
4248
        CALL    PP              ;PRE-PROCESS THE LINE
4249
        JB      F0,CMND3        ;NO LINE NUMBER
4250
        CALL    LINE            ;PROCESS THE LINE
4251
        LCALL   LCLR
4252
        JB      LINEB,CMNX      ;DON'T CLEAR MEMORY IF NO NEED
4253
        SETB    LINEB
4254
        LCALL   RCLEAR          ;CLEAR THE MEMORY
4255
        SJMP    CMNX            ;LOOP BACK
4256
        ;
4257
CMND3:  CALL    T_BUF           ;SET UP THE TEXT POINTER
4258
        CALL    DELTST          ;GET THE CHARACTER
4259
        JZ      CMNDR           ;IF CR, EXIT
4260
        MOV     DPTR,#CMNDD     ;POINT AT THE COMMAND LOOKUP
4261
        CJNE    A,#T_CMND,$+3   ;PROCESS STATEMENT IF NOT A COMMAND
4262
        JC      CMND5
4263
        CALL    GCI1            ;BUMP TXA
4264
        ANL     A,#0FH          ;STRIP MSB'S FOR LOOKUP
4265
        LCALL   ISTA1           ;PROCESS COMMAND
4266
        SJMP    CMNDR
4267
        ;
4268
CMND5:  LJMP    ILOOP           ;CHECK FOR A POSSIBLE BREAK
4269
        ;
4270
        ;
4271
        ;
4272
        ;CONSTANTS
4273
        ;
4274
XTALV:  DB      128+8           ; DEFAULT CRYSTAL VALUE
4275
        DB      00H
4276
        DB      00H
4277
        DB      92H
4278
        DB      05H
4279
        DB      11H
4280
        ;
4281
EXP11:  DB      85H
4282
        DB      00H
4283
        DB      42H
4284
        DB      41H
4285
        DB      87H
4286
        DB      59H
4287
        ;
4288
EXP1:   DB      128+1           ; EXP(1)
4289
        DB      00H
4290
        DB      18H
4291
        DB      28H
4292
        DB      18H
4293
        DB      27H
4294
        ;
4295
IPTIME: DB      128-4           ;FPROG TIMING
4296
        DB      00H
4297
        DB      00H
4298
        DB      00H
4299
        DB      75H
4300
        DB      83H
4301
        ;
4302
PIE:    DB      128+1           ;PI
4303
        DB      00H
4304
        DB      26H
4305
        DB      59H
4306
        DB      41H
4307
        DB      31H             ; 3.1415926
4308
        ;
4309
        newpage
4310
        ;***************************************************************
4311
        ;
4312
        ; The error messages, some have been moved
4313
        ;
4314
        ;***************************************************************
4315
        ;
4316
E7X:    DB      128+30
4317
        DB      "ARITH. UNDERFLOW",'"'
4318
        ;
4319
E5X:    DB      "MEMORY ALLOCATION",'"'
4320
        ;
4321
E3X:    DB      128+40
4322
        DB      "BAD ARGUMENT",'"'
4323
        ;
4324
EXI:    DB      "I-STACK",'"'
4325
        ;
4326
        newpage
4327
        ;***************************************************************
4328
        ;
4329
        ; The command action routine - CONTINUE
4330
        ;
4331
        ;***************************************************************
4332
        ;
4333
CCONT:  MOV     DPTR,#E15X
4334
        JNB     CONB,ERROR      ;ERROR IF CONTINUE IS NOT SET
4335
        ;
4336
CC1:    ;used for input statement entry
4337
        ;
4338
        MOV     TXAH,INTXAH     ;RESTORE TXA
4339
        MOV     TXAL,INTXAL
4340
        JMP     CILOOP          ;EXECUTE
4341
        ;
4342
DTEMP:  MOV     DPH,TEMP5       ;RESTORE DPTR
4343
        MOV     DPL,TEMP4
4344
        RET
4345
        ;
4346
TEMPD:  MOV     TEMP5,DPH
4347
        MOV     TEMP4,DPL
4348
        RET
4349
        ;
4350
        newpage
4351
        ;**************************************************************
4352
        ;
4353
I_DL:   ; IDLE
4354
        ;
4355
        ;**************************************************************
4356
        ;
4357
        JB      DIRF,E1XX       ;SYNTAX ERROR IN DIRECT INPUT
4358
        CLR     DACK            ;ACK IDLE
4359
        ;
4360
U_ID1:  DB      01000011B       ;ORL DIRECT OP CODE
4361
        DB      87H             ;PCON ADDRESS
4362
        DB      01H             ;SET IDLE BIT
4363
        JB      INTPEN,I_RET    ;EXIT IF EXTERNAL INTERRUPT
4364
        JBC     U_IDL,I_RET     ;EXIT IF USER WANTS TO
4365
        JNB     OTS,U_ID1       ;LOOP IF TIMER NOT ENABLED
4366
        LCALL   T_CMP           ;CHECK THE TIMER
4367
        JC      U_ID1           ;LOOP IF TIME NOT BIG ENOUGH
4368
        ;
4369
I_RET:  SETB    DACK            ;RESTORE EXECUTION
4370
        RET                     ;EXIT IF IT IS
4371
        ;
4372
        ;
4373
        ;
4374
ER0:    INC     DPTR            ;BUMP TO TEXT
4375
        JB      DIRF,ERROR0     ;CAN'T GET OUT OF DIRECT MODE
4376
        JNB     ON_ERR,ERROR0   ;IF ON ERROR ISN'T SET, GO BACK
4377
        MOV     DPTR,#ERRLOC    ;SAVE THE ERROR CODE
4378
        CALL    RC2             ;SAVE ERROR AND SET UP THE STACKS
4379
        INC     DPTR            ;POINT AT ERRNUM
4380
        JMP     ERL4            ;LOAD ERR NUM AND EXIT
4381
        ;
4382
        newpage
4383
        ;
4384
        ; Syntax error
4385
        ;
4386
E1XX:   MOV     C,DIRF          ;SEE IF IN DIRECT MODE
4387
        MOV     DPTR,#E1X       ;ERROR MESSAGE
4388
        SJMP    ERROR+1         ;TRAP ON SET DIRF
4389
        ;
4390
        MOV     DPTR,#EXI       ;STACK ERROR
4391
        ;
4392
        ; Falls through
4393
        ;
4394
        ;***************************************************************
4395
        ;
4396
        ;ERROR PROCESSOR - PRINT OUT THE ERROR TYPE, CHECK TO SEE IF IN
4397
        ;                  RUN OR COMMAND MODE, FIND AND PRINT OUT THE
4398
        ;                  LINE NUMBER IF IN RUN MODE
4399
        ;
4400
        ;***************************************************************
4401
        ;
4402
ERROR:  CLR     C               ;RESET STACK
4403
        MOV     SP,SPSAV        ;RESET THE STACK
4404
        LCALL   SPRINT+4        ;CLEAR LINE AND AT MODE
4405
        CLR     A               ;SET UP TO GET ERROR CODE
4406
        MOVC    A,@A+DPTR
4407
        JBC     ACC.7,ER0       ;PROCESS ERROR
4408
        ;
4409
ERROR0: ACALL   TEMPD           ;SAVE THE DATA POINTER
4410
        JC      $+5             ;NO RESET IF CARRY IS SET
4411
        LCALL   RC1             ;RESET THE STACKS
4412
        CALL    CRLF2           ;DO TWO CARRIAGE RET - LINE FEED
4413
        MOV     DPTR,#ERS       ;OUTPUT ERROR MESSAGE
4414
        CALL    ROM_P
4415
        CALL    DTEMP           ;GET THE ERROR MESSAGE BACK
4416
        ;
4417
ERRS:   CALL    ROM_P           ;PRINT ERROR TYPE
4418
        JNB     DIRF,ER1        ;DO NOT PRINT IN LINE IF DIRF=1
4419
        ;
4420
SERR1:  CLR     STOPBIT         ;PRINT STOP THEN EXIT, FOR LIST
4421
        JMP     CMND1
4422
        ;
4423
ER1:    MOV     DPTR,#INS       ;OUTPUT IN LINE
4424
        CALL    ROM_P
4425
        ;
4426
        ;NOW, FIND THE LINE NUMBER
4427
        ;
4428
        ;
4429
        newpage
4430
        ;
4431
        ;
4432
        CALL    DP_B            ;GET THE FIRST ADDRESS OF THE PROGRAM
4433
        CLR     A               ;FOR INITIALIZATION
4434
        ;
4435
ER2:    ACALL   TEMPD           ;SAVE THE DPTR
4436
        CALL    ADDPTR          ;ADD ACC TO DPTR
4437
        ACALL   ER4             ;R3:R1 = TXA-DPTR
4438
 JC     ER3             ;EXIT IF DPTR>TXA
4439
        JZ      ER3             ;EXIT IF DPTR=TXA
4440
        MOVX    A,@DPTR         ;GET LENGTH
4441
        CJNE    A,#EOF,ER2      ;SEE IF AT THE END
4442
        ;
4443
ER3:    ACALL   DTEMP           ;PUT THE LINE IN THE DPTR
4444
        ACALL   ER4             ;R3:R1 = TXA - BEGINNING OF LINE
4445
        MOV     A,R1            ;GET LENGTH
4446
        ADD     A,#10           ;ADD 10 TO LENGTH, DPTR STILL HAS ADR
4447
        MOV     MT1,A           ;SAVE THE COUNT
4448
        INC     DPTR            ;POINT AT LINE NUMBER HIGH BYTE
4449
        CALL    PMTOP+3         ;LOAD R2:R0, PUT IT ON THE STACK
4450
        ACALL   FP_BASE+14      ;OUTPUT IT
4451
        JB      STOPBIT,SERR1   ;EXIT IF STOP BIT SET
4452
        CALL    CRLF2           ;DO SOME CRLF'S
4453
        CALL    DTEMP
4454
        CALL    UPPL            ;UNPROCESS THE LINE
4455
        CALL    CL6             ;PRINT IT
4456
        MOV     R5,#'-'         ;OUTPUT DASHES, THEN AN X
4457
        ACALL   T_L             ;PRINT AN X IF ERROR CHARACTER FOUND
4458
        DJNZ    MT1,$-4         ;LOOP UNTIL DONE
4459
        MOV     R5,#'X'
4460
        ACALL   T_L
4461
        AJMP    SERR1
4462
        ;
4463
ER4:    MOV     R3,TXAH         ;GET TEXT POINTER AND PERFORM SUBTRACTION
4464
        MOV     R1,TXAL
4465
        JMP     DUBSUB
4466
        ;
4467
        newpage
4468
        ;**************************************************************
4469
        ;
4470
        ; Interrupt driven timer
4471
        ;
4472
        ;**************************************************************
4473
        ;
4474
I_DR:   MOV     TH0,SAVE_T      ;LOAD THE TIMER
4475
        XCH     A,MILLIV        ;SAVE A, GET MILLI COUNTER
4476
        INC     A               ;BUMP COUNTER
4477
        CJNE    A,#200,TR       ;CHECK OUT TIMER VALUE
4478
        CLR     A               ;FORCE ACC TO BE ZERO
4479
        INC     TVL             ;INCREMENT LOW TIMER
4480
        CJNE    A,TVL,TR        ;CHECK LOW VALUE
4481
        INC     TVH             ;BUMP TIMER HIGH
4482
        ;
4483
TR:     XCH     A,MILLIV
4484
        POP     PSW
4485
        RETI
4486
        ;
4487
        newpage
4488
        include bas52.clk
4489
        ;***************************************************************
4490
        ;
4491
SUI:    ; Statement USER IN action routine
4492
        ;
4493
        ;***************************************************************
4494
        ;
4495
        ACALL   OTST
4496
        MOV     CIUB,C          ;SET OR CLEAR CIUB
4497
        RET
4498
        ;
4499
        ;***************************************************************
4500
        ;
4501
SUO:    ; Statement USER OUT action routine
4502
        ;
4503
        ;***************************************************************
4504
        ;
4505
        ACALL   OTST
4506
        MOV     COUB,C
4507
        RET
4508
        ;
4509
OTST:   ; Check for a one
4510
        ;
4511
        LCALL   GCI             ;GET THE CHARACTER, CLEARS CARRY
4512
        SUBB    A,#'1'          ;SEE IF A ONE
4513
        CPL     C               ;SETS CARRY IF ONE, CLEARS IT IF ZERO
4514
        RET
4515
        ;
4516
        newpage
4517
        ;**************************************************************
4518
        ;
4519
        ; IBLK - EXECUTE USER SUPPLIED TOKEN
4520
        ;
4521
        ;**************************************************************
4522
        ;
4523
IBLK:   JB      PSW.4,IBLK-1    ;EXIT IF REGISTER BANK <> 0
4524
        JB      PSW.3,IBLK-1
4525
        JBC     ACC.7,$+9       ;SEE IF BIT SEVEN IS SET
4526
        MOV     DPTR,#USENT     ;USER ENTRY LOCATION
4527
        LJMP    ISTA1
4528
        ;
4529
        JB      ACC.0,199FH     ;FLOATING POINT INPUT
4530
        JZ      T_L             ;DO OUTPUT ON 80H
4531
        MOV     DPTR,#FP_BASE-2
4532
        JMP     @A+DPTR
4533
        ;
4534
        ;
4535
        ;**************************************************************
4536
        ;
4537
        ; GET_NUM - GET A NUMBER, EITHER HEX OR FLOAT
4538
        ;
4539
        ;**************************************************************
4540
        ;
4541
GET_NUM:ACALL   FP_BASE+10      ;SCAN FOR HEX
4542
        JNC     FP_BASE+12      ;DO FP INPUT
4543
        ;
4544
        ACALL   FP_BASE+18      ;ASCII STRING TO R2:R0
4545
        JNZ     H_RET
4546
        PUSH    DPH             ;SAVE THE DATA_POINTER
4547
        PUSH    DPL
4548
        ACALL   FP_BASE+24      ;PUT R2:R0 ON THE STACK
4549
        POP     DPL             ;RESTORE THE DATA_POINTER
4550
        POP     DPH
4551
        CLR     A               ;NO ERRORS
4552
        RET                     ;EXIT
4553
        ;
4554
        newpage
4555
        ;**************************************************************
4556
        ;
4557
        ; WB - THE EGO MESSAGE
4558
        ;
4559
        ;**************************************************************
4560
        ;
4561
WB:     DB      'W'+80H,'R'+80H
4562
        DB      'I'+80H,'T'+80H,'T','E'+80H,'N'+80H
4563
        DB      ' ','B'+80H,'Y'+80H,' '
4564
        DB      'J'+80H,'O'+80H,'H'+80H,'N'+80H,' '+80H
4565
        DB      'K','A'+80H,'T'+80H,'A'+80H,'U'+80H
4566
        DB      'S','K'+80H,'Y'+80H
4567
        DB      ", I",'N'+80H,'T'+80H,'E'+80H,'L'+80H
4568
        DB      ' '+80H,'C'+80H,'O'+80H,'R'+80H,'P'+80H
4569
        DB      ". 1",'9'+80H,"85"
4570
H_RET:  RET
4571
        ;
4572
        newpage
4573
        ORG     1990H
4574
        ;
4575
T_L:    LJMP    TEROT
4576
        ;
4577
        ORG     1F78H
4578
        ;
4579
CKS_I:  JB      CKS_B,CS_I
4580
        LJMP    401BH
4581
        ;
4582
CS_I:   LJMP    2088H
4583
        ;
4584
E14X:   DB      "NO DATA",'"'
4585
        ;
4586
E11X:   DB      128+20
4587
        DB      "ARITH. OVERFLOW",'"'
4588
        ;
4589
E16X:   DB      "PROGRAMMING",'"'
4590
        ;
4591
E15X:   DB      "CAN"
4592
        DB      27H
4593
        DB      "T CONTINUE",'"'
4594
        ;
4595
E10X:   DB      "INVALID LINE NUMBER",'"'
4596
        ;
4597
NOROM:  DB      "PROM MODE",'"'
4598
        ;
4599
S_N:    DB      "*MCS-51(tm) BASIC V1.1*",'"'
4600
        ;
4601
        ORG     1FF8H
4602
        ;
4603
ERS:    DB      "ERROR: ",'"'
4604
        ;
4605
        newpage
4606
        ;***************************************************************
4607
        ;
4608
        segment xdata   ;External Ram
4609
        ;
4610
        ;***************************************************************
4611
        ;
4612
        DS      4
4613
IBCNT:  DS      1               ;LENGTH OF A LINE
4614
IBLN:   DS      2               ;THE LINE NUMBER
4615
IBUF:   DS      LINLEN          ;THE INPUT BUFFER
4616
CONVT:  DS      15              ;CONVERSION LOCATION FOR FPIN
4617
        ;
4618
        ORG     100H
4619
        ;
4620
GTB:    DS      1               ;GET LOCATION
4621
ERRLOC: DS      1               ;ERROR TYPE
4622
ERRNUM: DS      2               ;WHERE TO GO ON AN ERROR
4623
VARTOP: DS      2               ;TOP OF VARIABLE STORAGE
4624
ST_ALL: DS      2               ;STORAGE ALLOCATION
4625
MT_ALL: DS      2               ;MATRIX ALLOCATION
4626
MEMTOP: DS      2               ;TOP OF MEMORY
4627
RCELL:  DS      2               ;RANDOM NUMBER CELL
4628
        DS      FPSIZ-1
4629
CXTAL:  DS      1               ;CRYSTAL
4630
        DS      FPSIZ-1
4631
FPT1:   DS      1               ;FLOATINP POINT TEMP 1
4632
        DS      FPSIZ-1
4633
FPT2:   DS      1               ;FLOATING POINT TEMP 2
4634
INTLOC: DS      2               ;LOCATION TO GO TO ON INTERRUPT
4635
STR_AL: DS      2               ;STRING ALLOCATION
4636
SPV:    DS      2               ;SERIAL PORT BAUD RATE
4637
TIV:    DS      2               ;TIMER INTERRUPT NUM AND LOC
4638
PROGS:  DS      2               ;PROGRAM A PROM TIME OUT
4639
IPROGS: DS      2               ;INTELLIGENT PROM PROGRAMMER TIMEOUT
4640
TM_TOP: DS      1
4641
 
4642
        include bas52.fp
4643
 
4644
        END