;*****************************************************************************
|
;*****************************************************************************
|
;* *
|
;* *
|
;* MCS BASIC-52 (tm) Source Listing *
|
;* MCS BASIC-52 (tm) Source Listing *
|
;* December 18, 1986 *
|
;* December 18, 1986 *
|
;* The original source code of V1.1 (BASIC.SRC and FP52.SRC) by *
|
;* The original source code of V1.1 (BASIC.SRC and FP52.SRC) by *
|
;* Intel Corporation, Embedded Controller Operations *
|
;* Intel Corporation, Embedded Controller Operations *
|
;* is public donain *
|
;* is public donain *
|
;* *
|
;* *
|
;*---------------------------------------------------------------------------*
|
;*---------------------------------------------------------------------------*
|
;* Alterations made by D. Wulf , December 18, 1999 *
|
;* Alterations made by D. Wulf , December 18, 1999 *
|
;* Alterations made by D. Wallner , May 4, 2002 *
|
;* Alterations made by D. Wallner , May 4, 2002 *
|
;* *
|
;* *
|
;*****************************************************************************
|
;*****************************************************************************
|
;
|
;
|
; The BASIC.a51 source listing, when compiled without modification,
|
; The BASIC.a51 source listing, when compiled without modification,
|
; create the same object code that is found on the MCS BASIC-52
|
; create the same object code that is found on the MCS BASIC-52
|
; Version 1.1 microcontrollers but with a timing independent baud rate
|
; Version 1.1 microcontrollers but with a timing independent baud rate
|
; recognition routine and a shorter ego message.
|
; recognition routine and a shorter ego message.
|
;
|
;
|
; The following alterations are made to the original source code:
|
; The following alterations are made to the original source code:
|
;
|
;
|
; The original source code had 2 files BASIC.SRC and FP52.SRC those have
|
; The original source code had 2 files BASIC.SRC and FP52.SRC those have
|
; been incorporated into this file for ease of assembly.
|
; been incorporated into this file for ease of assembly.
|
;
|
;
|
; All absolute and relativ jumps and calls without labels were providet
|
; All absolute and relativ jumps and calls without labels were providet
|
; with labels.
|
; with labels.
|
;
|
;
|
; All machine code in the original source, codet in databytes is replaced
|
; All machine code in the original source, codet in databytes is replaced
|
; by the menomics.
|
; by the menomics.
|
;
|
;
|
; One routine in the source was different to the ROM code and is replaced
|
; One routine in the source was different to the ROM code and is replaced
|
; by the ROM code.
|
; by the ROM code.
|
;
|
;
|
; Daniel Wallner , May 4, 2002:
|
; Daniel Wallner , May 4, 2002:
|
; Part of ego message replaced with a different baud recognition routine.
|
; Part of ego message replaced with a different baud recognition routine.
|
;
|
;
|
;*****************************************************************************
|
;*****************************************************************************
|
;
|
;
|
T2CON EQU 0C8H ; This three lines are necessary for MS-DOS freeware
|
T2CON EQU 0C8H ; This three lines are necessary for MS-DOS freeware
|
TL2 EQU 0CCH ; MCS-51 Family Cross Assembler ASEM-51 V1.2
|
TL2 EQU 0CCH ; MCS-51 Family Cross Assembler ASEM-51 V1.2
|
TH2 EQU 0CDH ; from W.W. Heinz (e-mail: ww@andiunx.m.isar.de)
|
TH2 EQU 0CDH ; from W.W. Heinz (e-mail: ww@andiunx.m.isar.de)
|
;
|
;
|
;*****************************************************************************
|
;*****************************************************************************
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; TRAP VECTORS TO MONITOR
|
; TRAP VECTORS TO MONITOR
|
;
|
;
|
; RESET TAG (0AAH) ---------2001H
|
; RESET TAG (0AAH) ---------2001H
|
;
|
;
|
; TAG LOCATION (5AH) ------ 2002H
|
; TAG LOCATION (5AH) ------ 2002H
|
;
|
;
|
; EXTERNAL INTERRUPT 0 ---- 2040H
|
; EXTERNAL INTERRUPT 0 ---- 2040H
|
;
|
;
|
; COMMAND MODE ENTRY ------ 2048H
|
; COMMAND MODE ENTRY ------ 2048H
|
;
|
;
|
; SERIAL PORT ------------- 2050H
|
; SERIAL PORT ------------- 2050H
|
;
|
;
|
; MONITOR (BUBBLE) OUTPUT - 2058H
|
; MONITOR (BUBBLE) OUTPUT - 2058H
|
;
|
;
|
; MONITOR (BUBBLE) INPUT -- 2060H
|
; MONITOR (BUBBLE) INPUT -- 2060H
|
;
|
;
|
; MONITOR (BUBBLE) CSTS --- 2068H
|
; MONITOR (BUBBLE) CSTS --- 2068H
|
;
|
;
|
; GET USER JUMP VECTOR ---- 2070H
|
; GET USER JUMP VECTOR ---- 2070H
|
;
|
;
|
; GET USER LOOKUP VECTOR -- 2078H
|
; GET USER LOOKUP VECTOR -- 2078H
|
;
|
;
|
; PRINT AT VECTOR --------- 2080H
|
; PRINT AT VECTOR --------- 2080H
|
;
|
;
|
; INTERRUPT PWM ----------- 2088H
|
; INTERRUPT PWM ----------- 2088H
|
;
|
;
|
; EXTERNAL RESET ---------- 2090H
|
; EXTERNAL RESET ---------- 2090H
|
;
|
;
|
; USER OUTPUT-------------- 4030H
|
; USER OUTPUT-------------- 4030H
|
;
|
;
|
; USER INPUT -------------- 4033H
|
; USER INPUT -------------- 4033H
|
;
|
;
|
; USER CSTS --------------- 4036H
|
; USER CSTS --------------- 4036H
|
;
|
;
|
; USER RESET -------------- 4039H
|
; USER RESET -------------- 4039H
|
;
|
;
|
; USER DEFINED PRINT @ --- 403CH
|
; USER DEFINED PRINT @ --- 403CH
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; MCS - 51 - 8K BASIC VERSION 1.1
|
; MCS - 51 - 8K BASIC VERSION 1.1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
AJMP CRST ;START THE PROGRAM
|
AJMP CRST ;START THE PROGRAM
|
ADDC A,@R1
|
ADDC A,@R1
|
;
|
;
|
ORG 3H
|
ORG 3H
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;EXTERNAL INTERRUPT 0
|
;EXTERNAL INTERRUPT 0
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
JB DRQ,STQ ;SEE IF DMA IS SET
|
JB DRQ,STQ ;SEE IF DMA IS SET
|
PUSH PSW ;SAVE THE STATUS
|
PUSH PSW ;SAVE THE STATUS
|
LJMP 4003H ;JUMP TO USER IF NOT SET
|
LJMP 4003H ;JUMP TO USER IF NOT SET
|
;
|
;
|
ORG 0BH
|
ORG 0BH
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;TIMER 0 OVERFLOW INTERRUPT
|
;TIMER 0 OVERFLOW INTERRUPT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PUSH PSW ;SAVE THE STATUS
|
PUSH PSW ;SAVE THE STATUS
|
JB C_BIT,STJ ;SEE IF USER WANTS INTERRUPT
|
JB C_BIT,STJ ;SEE IF USER WANTS INTERRUPT
|
LJMP 400BH ;EXIT IF USER WANTS INTERRUPTS
|
LJMP 400BH ;EXIT IF USER WANTS INTERRUPTS
|
;
|
;
|
ORG 13H
|
ORG 13H
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;EXTERNAL INTERRUPT 1
|
;EXTERNAL INTERRUPT 1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
JB INTBIT,STK
|
JB INTBIT,STK
|
PUSH PSW
|
PUSH PSW
|
LJMP 4013H
|
LJMP 4013H
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
ORG 1BH
|
ORG 1BH
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;TIMER 1 OVERFLOW INTERRUPT
|
;TIMER 1 OVERFLOW INTERRUPT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PUSH PSW
|
PUSH PSW
|
LJMP CKS_I
|
LJMP CKS_I
|
;
|
;
|
STJ: LJMP I_DR ;DO THE INTERRUPT
|
STJ: LJMP I_DR ;DO THE INTERRUPT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;SERIAL PORT INTERRUPT
|
;SERIAL PORT INTERRUPT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ORG 23H
|
ORG 23H
|
;
|
;
|
PUSH PSW
|
PUSH PSW
|
JB SPINT,STU ;SEE IF MONITOR EANTS INTERRUPT
|
JB SPINT,STU ;SEE IF MONITOR EANTS INTERRUPT
|
LJMP 4023H
|
LJMP 4023H
|
;
|
;
|
ORG 2BH
|
ORG 2BH
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
;TIMER 2 OVERFLOW INTERRUPT
|
;TIMER 2 OVERFLOW INTERRUPT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
PUSH PSW
|
PUSH PSW
|
LJMP 402BH
|
LJMP 402BH
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
;USER ENTRY
|
;USER ENTRY
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ORG 30H
|
ORG 30H
|
;
|
;
|
LJMP IBLK ;LINK TO USER BLOCK
|
LJMP IBLK ;LINK TO USER BLOCK
|
;
|
;
|
STQ: JB I_T0,STS ;SEE IF MONITOR WANTS IT
|
STQ: JB I_T0,STS ;SEE IF MONITOR WANTS IT
|
CLR DACK
|
CLR DACK
|
JNB P3.2,$ ;WAIT FOR DMA TO END
|
JNB P3.2,$ ;WAIT FOR DMA TO END
|
SETB DACK
|
SETB DACK
|
RETI
|
RETI
|
;
|
;
|
STS: LJMP 2040H ;GO TO THE MONITOR
|
STS: LJMP 2040H ;GO TO THE MONITOR
|
;
|
;
|
STK: SETB INTPEN ;TELL BASIC AN INTERRUPT WAS RECEIVED
|
STK: SETB INTPEN ;TELL BASIC AN INTERRUPT WAS RECEIVED
|
RETI
|
RETI
|
;
|
;
|
STU: LJMP 2050H ;SERIAL PORT INTERRUPT
|
STU: LJMP 2050H ;SERIAL PORT INTERRUPT
|
;
|
;
|
$EJECT
|
$EJECT
|
|
|
;$INCLUDE(:F2:LOOK52.SRC)
|
;$INCLUDE(:F2:LOOK52.SRC)
|
; INCLUDED BELOW
|
; INCLUDED BELOW
|
|
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; This is the equate table for 8052 basic.
|
; This is the equate table for 8052 basic.
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; The register to direct equates for CJNE instructions.
|
; The register to direct equates for CJNE instructions.
|
;
|
;
|
R0B0 EQU 0
|
R0B0 EQU 0
|
R1B0 EQU 1
|
R1B0 EQU 1
|
R2B0 EQU 2
|
R2B0 EQU 2
|
R3B0 EQU 3
|
R3B0 EQU 3
|
R4B0 EQU 4
|
R4B0 EQU 4
|
R5B0 EQU 5
|
R5B0 EQU 5
|
R6B0 EQU 6
|
R6B0 EQU 6
|
R7B0 EQU 7
|
R7B0 EQU 7
|
;
|
;
|
; Register bank 1 contains the text pointer
|
; Register bank 1 contains the text pointer
|
; and the arg stack pointer.
|
; and the arg stack pointer.
|
;
|
;
|
TXAL EQU 8 ;R0 BANK 1 = TEXT POINTER LOW
|
TXAL EQU 8 ;R0 BANK 1 = TEXT POINTER LOW
|
ASTKA EQU 9 ;R1 BANK 1 = ARG STACK
|
ASTKA EQU 9 ;R1 BANK 1 = ARG STACK
|
TXAH EQU 10 ;R2 BANK 1 = TEXT POINTER HIGH
|
TXAH EQU 10 ;R2 BANK 1 = TEXT POINTER HIGH
|
;
|
;
|
; Now five temporary locations that are used by basic.
|
; Now five temporary locations that are used by basic.
|
;
|
;
|
TEMP1 EQU 11
|
TEMP1 EQU 11
|
TEMP2 EQU 12
|
TEMP2 EQU 12
|
TEMP3 EQU 13
|
TEMP3 EQU 13
|
TEMP4 EQU 14
|
TEMP4 EQU 14
|
TEMP5 EQU 15
|
TEMP5 EQU 15
|
;
|
;
|
$EJECT
|
$EJECT
|
; Register bank 2 contains the read text pointer
|
; Register bank 2 contains the read text pointer
|
; and the control stack pointer.
|
; and the control stack pointer.
|
;
|
;
|
RTXAL EQU 16 ;R0 BANK 2 = READ TEXT POINTER LOW
|
RTXAL EQU 16 ;R0 BANK 2 = READ TEXT POINTER LOW
|
CSTKA EQU 17 ;R1 BANK 2 = CONTROL STACK POINTER
|
CSTKA EQU 17 ;R1 BANK 2 = CONTROL STACK POINTER
|
RTXAH EQU 18 ;R2 BANK 2 = READ TEXT POINTER HIGH
|
RTXAH EQU 18 ;R2 BANK 2 = READ TEXT POINTER HIGH
|
;
|
;
|
; Now some internal system equates.
|
; Now some internal system equates.
|
;
|
;
|
BOFAH EQU 19 ;START OF THE BASIC PROGRAM, HIGH BYTE
|
BOFAH EQU 19 ;START OF THE BASIC PROGRAM, HIGH BYTE
|
BOFAL EQU 20 ;START OF THE BASIC PROGRAM, LOW BYTE
|
BOFAL EQU 20 ;START OF THE BASIC PROGRAM, LOW BYTE
|
NULLCT EQU 21 ;NULL COUNT
|
NULLCT EQU 21 ;NULL COUNT
|
PHEAD EQU 22 ;PRINT HEAD POSITION
|
PHEAD EQU 22 ;PRINT HEAD POSITION
|
FORMAT EQU 23
|
FORMAT EQU 23
|
;
|
;
|
; Register bank 3 is for the user and can be loaded
|
; Register bank 3 is for the user and can be loaded
|
; by basic
|
; by basic
|
;
|
;
|
;
|
;
|
;
|
;
|
; Now everything else is used by basic.
|
; Now everything else is used by basic.
|
; First the bit locations, these use bytes 34, 35, 36, 37 and 38
|
; First the bit locations, these use bytes 34, 35, 36, 37 and 38
|
;
|
;
|
$EJECT
|
$EJECT
|
OTS BIT 16 ;34.0-ON TIME INSTRUCTION EXECUTED
|
OTS BIT 16 ;34.0-ON TIME INSTRUCTION EXECUTED
|
INPROG BIT 17 ;34.1-INTERRUPT IN PROCESS
|
INPROG BIT 17 ;34.1-INTERRUPT IN PROCESS
|
INTBIT BIT 18 ;34.2-INTERRUPT SET BIT
|
INTBIT BIT 18 ;34.2-INTERRUPT SET BIT
|
ON_ERR BIT 19 ;34.3-ON ERROR EXECUTED
|
ON_ERR BIT 19 ;34.3-ON ERROR EXECUTED
|
OTI BIT 20 ;34.4-ON TIME INTERRUPT IN PROGRESS
|
OTI BIT 20 ;34.4-ON TIME INTERRUPT IN PROGRESS
|
LINEB BIT 21 ;34.5-LINE CHANGE OCCURED
|
LINEB BIT 21 ;34.5-LINE CHANGE OCCURED
|
INTPEN BIT 22 ;34.6-INTERRUPT PENDING BIT
|
INTPEN BIT 22 ;34.6-INTERRUPT PENDING BIT
|
CONB BIT 23 ;34.7-CAN CONTINUE IF SET
|
CONB BIT 23 ;34.7-CAN CONTINUE IF SET
|
GTRD BIT 24 ;35.0-READ GET LOCATION
|
GTRD BIT 24 ;35.0-READ GET LOCATION
|
LPB BIT 25 ;35.1-PRINT TO LINE PRINTER PORT
|
LPB BIT 25 ;35.1-PRINT TO LINE PRINTER PORT
|
CKS_B BIT 26 ;35.2-FOR PWM INTERRUPT
|
CKS_B BIT 26 ;35.2-FOR PWM INTERRUPT
|
COB BIT 27 ;35.3-CONSOLE OUT BIT
|
COB BIT 27 ;35.3-CONSOLE OUT BIT
|
; 0 = SERIAL PORT
|
; 0 = SERIAL PORT
|
; 1 = LINE PRINTER
|
; 1 = LINE PRINTER
|
COUB BIT 28 ;35.4-USER CONSOLE OUT BIT
|
COUB BIT 28 ;35.4-USER CONSOLE OUT BIT
|
; 0 = SERIAL PORT
|
; 0 = SERIAL PORT
|
; 1 = USER DRIVER
|
; 1 = USER DRIVER
|
INBIT BIT 29 ;35.5-INITIALIZATION BIT
|
INBIT BIT 29 ;35.5-INITIALIZATION BIT
|
CIUB BIT 30 ;35.6-USER CONSOLE IN BIT
|
CIUB BIT 30 ;35.6-USER CONSOLE IN BIT
|
; 0 = SERIAL PORT
|
; 0 = SERIAL PORT
|
; 1 = USER ROUTINE
|
; 1 = USER ROUTINE
|
SPINT BIT 31 ;35.7-SERIAL PORT INTERRUPT
|
SPINT BIT 31 ;35.7-SERIAL PORT INTERRUPT
|
STOPBIT BIT 32 ;36.0-PROGRAM STOP ENCOUNTERED
|
STOPBIT BIT 32 ;36.0-PROGRAM STOP ENCOUNTERED
|
U_IDL BIT 33 ;36.1-USER IDLE BREAK
|
U_IDL BIT 33 ;36.1-USER IDLE BREAK
|
INP_B BIT 34 ;36.2-SET DURING INPUT INSTRUCTION
|
INP_B BIT 34 ;36.2-SET DURING INPUT INSTRUCTION
|
;DCMPXZ BIT 35 ;36.3-DCMPX ZERO FLAG
|
;DCMPXZ BIT 35 ;36.3-DCMPX ZERO FLAG
|
ARGF BIT 36 ;36.4-ARG STACK HAS A VALUE
|
ARGF BIT 36 ;36.4-ARG STACK HAS A VALUE
|
RETBIT BIT 37 ;36.5-RET FROM INTERRUPT EXECUTED
|
RETBIT BIT 37 ;36.5-RET FROM INTERRUPT EXECUTED
|
I_T0 BIT 38 ;36.6-TRAP INTERRUPT ZERO TO MON
|
I_T0 BIT 38 ;36.6-TRAP INTERRUPT ZERO TO MON
|
UPB BIT 39 ;36.7-SET WHEN @ IS VALID
|
UPB BIT 39 ;36.7-SET WHEN @ IS VALID
|
JKBIT BIT 40 ;37.0-WB TRIGGER
|
JKBIT BIT 40 ;37.0-WB TRIGGER
|
ENDBIT BIT 41 ;37.1-GET END OF PROGRAM
|
ENDBIT BIT 41 ;37.1-GET END OF PROGRAM
|
UBIT BIT 42 ;37.2-FOR DIM STATEMENT
|
UBIT BIT 42 ;37.2-FOR DIM STATEMENT
|
ISAV BIT 43 ;37.3-SAVE INTERRUPT STATUS
|
ISAV BIT 43 ;37.3-SAVE INTERRUPT STATUS
|
BO BIT 44 ;37.4-BUBBLE OUTPUT
|
BO BIT 44 ;37.4-BUBBLE OUTPUT
|
XBIT BIT 45 ;37.5-EXTERNAL PROGRAM PRESENT
|
XBIT BIT 45 ;37.5-EXTERNAL PROGRAM PRESENT
|
C_BIT BIT 46 ;37.6-SET WHEN CLOCK RUNNING
|
C_BIT BIT 46 ;37.6-SET WHEN CLOCK RUNNING
|
DIRF BIT 47 ;37.7-DIRECT INPUT MODE
|
DIRF BIT 47 ;37.7-DIRECT INPUT MODE
|
NO_C BIT 48 ;38.0-NO CONTROL C
|
NO_C BIT 48 ;38.0-NO CONTROL C
|
DRQ BIT 49 ;38.1-DMA ENABLED
|
DRQ BIT 49 ;38.1-DMA ENABLED
|
BI BIT 50 ;38.2-BUBBLE INPUT
|
BI BIT 50 ;38.2-BUBBLE INPUT
|
INTELB BIT 51 ;38.3-INTELLIGENT PROM PROGRAMMING
|
INTELB BIT 51 ;38.3-INTELLIGENT PROM PROGRAMMING
|
C0ORX1 BIT 52 ;38.4-PRINT FROM ROM OR RAM
|
C0ORX1 BIT 52 ;38.4-PRINT FROM ROM OR RAM
|
CNT_S BIT 53 ;38.5-CONTROL S ENCOUNTERED
|
CNT_S BIT 53 ;38.5-CONTROL S ENCOUNTERED
|
ZSURP BIT 54 ;38.6-ZERO SUPRESS
|
ZSURP BIT 54 ;38.6-ZERO SUPRESS
|
HMODE BIT 55 ;38.7-HEX MODE PRINT
|
HMODE BIT 55 ;38.7-HEX MODE PRINT
|
LP BIT P1.7 ;SOFTWARE LINE PRINTER
|
LP BIT P1.7 ;SOFTWARE LINE PRINTER
|
DACK BIT P1.6 ;DMA ACK
|
DACK BIT P1.6 ;DMA ACK
|
PROMV BIT P1.5 ;TURN ON PROM VOLTAGE
|
PROMV BIT P1.5 ;TURN ON PROM VOLTAGE
|
PROMP BIT P1.4 ;PROM PULSE
|
PROMP BIT P1.4 ;PROM PULSE
|
ALED BIT P1.3 ;ALE DISABLE
|
ALED BIT P1.3 ;ALE DISABLE
|
T_BIT BIT P1.2 ;I/O TOGGLE BIT
|
T_BIT BIT P1.2 ;I/O TOGGLE BIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
; The next location is a bit addressable byte counter
|
; The next location is a bit addressable byte counter
|
;
|
;
|
BABC EQU 39
|
BABC EQU 39
|
;
|
;
|
; Now floating point and the other temps
|
; Now floating point and the other temps
|
;
|
;
|
; FP Uses to locations 03CH
|
; FP Uses to locations 03CH
|
;
|
;
|
; Now the stack designators.
|
; Now the stack designators.
|
;
|
;
|
SPSAV EQU 3EH
|
SPSAV EQU 3EH
|
S_LEN EQU 3FH
|
S_LEN EQU 3FH
|
T_HH EQU 40H
|
T_HH EQU 40H
|
T_LL EQU 41H
|
T_LL EQU 41H
|
INTXAH EQU 42H
|
INTXAH EQU 42H
|
INTXAL EQU 43H
|
INTXAL EQU 43H
|
MT1 EQU 45H
|
MT1 EQU 45H
|
MT2 EQU 46H
|
MT2 EQU 46H
|
MILLIV EQU 47H ;TIMER LOCATIONS
|
MILLIV EQU 47H ;TIMER LOCATIONS
|
TVH EQU 48H
|
TVH EQU 48H
|
TVL EQU 49H
|
TVL EQU 49H
|
SAVE_T EQU 4AH
|
SAVE_T EQU 4AH
|
SP_H EQU 4BH ;SERIAL PORT TIME OUT
|
SP_H EQU 4BH ;SERIAL PORT TIME OUT
|
SP_L EQU 4CH
|
SP_L EQU 4CH
|
CMNDSP EQU 4DH ;SYSTEM STACK POINTER
|
CMNDSP EQU 4DH ;SYSTEM STACK POINTER
|
RCAPH2 EQU 0CBH
|
RCAPH2 EQU 0CBH
|
RCAPL2 EQU 0CAH
|
RCAPL2 EQU 0CAH
|
IRAMTOP EQU 0FFH ;TOP OF RAM
|
IRAMTOP EQU 0FFH ;TOP OF RAM
|
STACKTP EQU 0FEH ;ARG AND CONTROL STACK TOPS
|
STACKTP EQU 0FEH ;ARG AND CONTROL STACK TOPS
|
;
|
;
|
; The character equates
|
; The character equates
|
;
|
;
|
CR EQU 0DH ;CARRIAGE RETURN
|
CR EQU 0DH ;CARRIAGE RETURN
|
LF EQU 0AH ;LINE FEED
|
LF EQU 0AH ;LINE FEED
|
BELL EQU 07H ;BELL CHARACTER
|
BELL EQU 07H ;BELL CHARACTER
|
BS EQU 08H ;BACK SPACE
|
BS EQU 08H ;BACK SPACE
|
CNTRLC EQU 03H ;CONTROL C
|
CNTRLC EQU 03H ;CONTROL C
|
CNTRLD EQU 04H ;CONTROL D
|
CNTRLD EQU 04H ;CONTROL D
|
NULL EQU 00H ;NULL
|
NULL EQU 00H ;NULL
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
; The internal system equates
|
; The internal system equates
|
;
|
;
|
LINLEN EQU 73 ;THE LENGTH OF AN INPUT LINE
|
LINLEN EQU 73 ;THE LENGTH OF AN INPUT LINE
|
EOF EQU 01 ;END OF FILE CHARACTER
|
EOF EQU 01 ;END OF FILE CHARACTER
|
ASTKAH EQU 01 ;ASTKA IS IN PAGE 1 OF RAM
|
ASTKAH EQU 01 ;ASTKA IS IN PAGE 1 OF RAM
|
CSTKAH EQU 00 ;CSTKA IS IN PAGE 0 OF RAM
|
CSTKAH EQU 00 ;CSTKA IS IN PAGE 0 OF RAM
|
FTYPE EQU 01 ;CONTROL STACK "FOR"
|
FTYPE EQU 01 ;CONTROL STACK "FOR"
|
GTYPE EQU 02 ;CONTROL STACK "GOSUB"
|
GTYPE EQU 02 ;CONTROL STACK "GOSUB"
|
DTYPE EQU 03 ;DO-WHILE/UNTIL TYPE
|
DTYPE EQU 03 ;DO-WHILE/UNTIL TYPE
|
ROMADR EQU 8000H ;LOCATION OF ROM
|
ROMADR EQU 8000H ;LOCATION OF ROM
|
;
|
;
|
; The floating point equates
|
; The floating point equates
|
;
|
;
|
FPSIZ EQU 6 ;NO. OF BYTES IN A FLOATING NUM
|
FPSIZ EQU 6 ;NO. OF BYTES IN A FLOATING NUM
|
DIGIT EQU FPSIZ-2 ;THE MANTISSA OF A FLOATING NUM
|
DIGIT EQU FPSIZ-2 ;THE MANTISSA OF A FLOATING NUM
|
STESIZ EQU FPSIZ+3 ;SIZE OF SYMBOL ADJUSTED TABLE ELEMENT
|
STESIZ EQU FPSIZ+3 ;SIZE OF SYMBOL ADJUSTED TABLE ELEMENT
|
;FP_BASE EQU 1993H ;BASE OF FLOATING POINT ROUTINES
|
;FP_BASE EQU 1993H ;BASE OF FLOATING POINT ROUTINES
|
PSTART EQU 512 ;START OF A PROGRAM IN RAM
|
PSTART EQU 512 ;START OF A PROGRAM IN RAM
|
FSIZE EQU FPSIZ+FPSIZ+2+2+1
|
FSIZE EQU FPSIZ+FPSIZ+2+2+1
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
USENT: ; User entry jump table
|
USENT: ; User entry jump table
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
DW CMND1 ;(00, 00H)COMMAND MODE JUMP
|
DW CMND1 ;(00, 00H)COMMAND MODE JUMP
|
DW IFIX ;(01, 01H)CONVERT FP TO INT
|
DW IFIX ;(01, 01H)CONVERT FP TO INT
|
DW PUSHAS ;(02, 02H)PUSH VALUE ONTO ARG STACK
|
DW PUSHAS ;(02, 02H)PUSH VALUE ONTO ARG STACK
|
DW POPAS ;(03, 03H)POP VALUE OFF ARG STACK
|
DW POPAS ;(03, 03H)POP VALUE OFF ARG STACK
|
DW PG1 ;(04, 04H)PROGRAM A PROM
|
DW PG1 ;(04, 04H)PROGRAM A PROM
|
DW INLINE ;(05, 05H)INPUT A LINE
|
DW INLINE ;(05, 05H)INPUT A LINE
|
DW UPRNT ;(06, 06H)PRINT A LINR
|
DW UPRNT ;(06, 06H)PRINT A LINR
|
DW CRLF ;(07, 07H)OUTPUT A CRLF
|
DW CRLF ;(07, 07H)OUTPUT A CRLF
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; This is the operation jump table for arithmetics
|
; This is the operation jump table for arithmetics
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
OPTAB: DW ALPAR ;(08, 08H)LEFT PAREN
|
OPTAB: DW ALPAR ;(08, 08H)LEFT PAREN
|
DW AEXP ;(09, 09H)EXPONENTAION
|
DW AEXP ;(09, 09H)EXPONENTAION
|
DW AMUL ;(10, 0AH)FP MUL
|
DW AMUL ;(10, 0AH)FP MUL
|
DW AADD ;(11, 0BH)FLOATING POINT ADD
|
DW AADD ;(11, 0BH)FLOATING POINT ADD
|
DW ADIV ;(12, 0CH)FLOATING POINT DIVIDE
|
DW ADIV ;(12, 0CH)FLOATING POINT DIVIDE
|
DW ASUB ;(13, 0DH)FLOATING POINT SUBTRACTION
|
DW ASUB ;(13, 0DH)FLOATING POINT SUBTRACTION
|
DW AXRL ;(14, 0EH)XOR
|
DW AXRL ;(14, 0EH)XOR
|
DW AANL ;(15, 0FH)AND
|
DW AANL ;(15, 0FH)AND
|
DW AORL ;(16, 10H)OR
|
DW AORL ;(16, 10H)OR
|
DW ANEG ;(17, 11H)NEGATE
|
DW ANEG ;(17, 11H)NEGATE
|
DW AEQ ;(18, 12H)EQUAL
|
DW AEQ ;(18, 12H)EQUAL
|
DW AGE ;(19, 13H)GREATER THAN OR EQUAL
|
DW AGE ;(19, 13H)GREATER THAN OR EQUAL
|
DW ALE ;(20, 14H)LESS THAN OR EQUAL
|
DW ALE ;(20, 14H)LESS THAN OR EQUAL
|
DW ANE ;(21, 15H)NOT EQUAL
|
DW ANE ;(21, 15H)NOT EQUAL
|
DW ALT ;(22, 16H)LESS THAN
|
DW ALT ;(22, 16H)LESS THAN
|
DW AGT ;(23, 17H)GREATER THAN
|
DW AGT ;(23, 17H)GREATER THAN
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; This is the jump table for unary operators
|
; This is the jump table for unary operators
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
DW AABS ;(24, 18H)ABSOLUTE VALUE
|
DW AABS ;(24, 18H)ABSOLUTE VALUE
|
DW AINT ;(25, 19H)INTEGER OPERATOR
|
DW AINT ;(25, 19H)INTEGER OPERATOR
|
DW ASGN ;(26, 1AH)SIGN OPERATOR
|
DW ASGN ;(26, 1AH)SIGN OPERATOR
|
DW ANOT ;(27, 1BH)ONE'S COMPLEMENT
|
DW ANOT ;(27, 1BH)ONE'S COMPLEMENT
|
DW ACOS ;(28, 1CH)COSINE
|
DW ACOS ;(28, 1CH)COSINE
|
DW ATAN ;(29, 1DH)TANGENT
|
DW ATAN ;(29, 1DH)TANGENT
|
DW ASIN ;(30, 1EH)SINE
|
DW ASIN ;(30, 1EH)SINE
|
DW ASQR ;(31, 1FH)SQUARE ROOT
|
DW ASQR ;(31, 1FH)SQUARE ROOT
|
DW ACBYTE ;(32, 20H)READ CODE
|
DW ACBYTE ;(32, 20H)READ CODE
|
DW AETOX ;(33, 21H)E TO THE X
|
DW AETOX ;(33, 21H)E TO THE X
|
DW AATAN ;(34, 22H)ARC TANGENT
|
DW AATAN ;(34, 22H)ARC TANGENT
|
DW ALN ;(35, 23H)NATURAL LOG
|
DW ALN ;(35, 23H)NATURAL LOG
|
DW ADBYTE ;(36, 24H)READ DATA MEMORY
|
DW ADBYTE ;(36, 24H)READ DATA MEMORY
|
DW AXBYTE ;(37, 25H)READ EXTERNAL MEMORY
|
DW AXBYTE ;(37, 25H)READ EXTERNAL MEMORY
|
DW PIPI ;(38, 26H)PI
|
DW PIPI ;(38, 26H)PI
|
DW ARND ;(39, 27H)RANDOM NUMBER
|
DW ARND ;(39, 27H)RANDOM NUMBER
|
DW AGET ;(40, 28H)GET INPUT CHARACTER
|
DW AGET ;(40, 28H)GET INPUT CHARACTER
|
DW AFREE ;(41, 29H)COMPUTE #BYTES FREE
|
DW AFREE ;(41, 29H)COMPUTE #BYTES FREE
|
DW ALEN ;(42, 2AH) COMPUTE LEN OF PORGRAM
|
DW ALEN ;(42, 2AH) COMPUTE LEN OF PORGRAM
|
DW AXTAL ;(43, 2BH) CRYSTAL
|
DW AXTAL ;(43, 2BH) CRYSTAL
|
DW PMTOP ;(44, 2CH)TOP OF MEMORY
|
DW PMTOP ;(44, 2CH)TOP OF MEMORY
|
DW ATIME ;(45, 2DH) TIME
|
DW ATIME ;(45, 2DH) TIME
|
DW A_IE ;(46, 2EH) IE
|
DW A_IE ;(46, 2EH) IE
|
DW A_IP ;(47, 2FH) IP
|
DW A_IP ;(47, 2FH) IP
|
DW ATIM0 ;(48, 30H) TIMER 0
|
DW ATIM0 ;(48, 30H) TIMER 0
|
DW ATIM1 ;(49, 31H) TIMER 1
|
DW ATIM1 ;(49, 31H) TIMER 1
|
DW ATIM2 ;(50, 32H) TIMER 2
|
DW ATIM2 ;(50, 32H) TIMER 2
|
DW AT2CON ;(51, 33H) T2CON
|
DW AT2CON ;(51, 33H) T2CON
|
DW ATCON ;(52, 34H) TCON
|
DW ATCON ;(52, 34H) TCON
|
DW ATMOD ;(53, 35H) ATMOD
|
DW ATMOD ;(53, 35H) ATMOD
|
DW ARCAP2 ;(54, 36H) RCAP2
|
DW ARCAP2 ;(54, 36H) RCAP2
|
DW AP1 ;(55, 37H) P1
|
DW AP1 ;(55, 37H) P1
|
DW APCON ;(56, 38H) PCON
|
DW APCON ;(56, 38H) PCON
|
DW EXPRB ;(57, 39H) EVALUATE AN EXPRESSION
|
DW EXPRB ;(57, 39H) EVALUATE AN EXPRESSION
|
DW AXTAL1 ;(58, 3AH) CALCULATE CRYSTAL
|
DW AXTAL1 ;(58, 3AH) CALCULATE CRYSTAL
|
DW LINE ;(59, 3BH) EDIT A LINE
|
DW LINE ;(59, 3BH) EDIT A LINE
|
DW PP ;(60, 3CH) PROCESS A LINE
|
DW PP ;(60, 3CH) PROCESS A LINE
|
DW UPPL0 ;(61, 3DH) UNPROCESS A LINE
|
DW UPPL0 ;(61, 3DH) UNPROCESS A LINE
|
DW VAR ;(62, 3EH) FIND A VARIABLE
|
DW VAR ;(62, 3EH) FIND A VARIABLE
|
DW GC ;(63, 3FH) GET A CHARACTER
|
DW GC ;(63, 3FH) GET A CHARACTER
|
DW GCI ;(64, 40H) GET CHARACTER AND INCREMENT
|
DW GCI ;(64, 40H) GET CHARACTER AND INCREMENT
|
DW INCHAR ;(65, 41H) INPUT A CHARACTER
|
DW INCHAR ;(65, 41H) INPUT A CHARACTER
|
DW CRUN ;(66, 42H) RUN A PROGRAM
|
DW CRUN ;(66, 42H) RUN A PROGRAM
|
$EJECT
|
$EJECT
|
OPBOL: DB 1 ;
|
OPBOL: DB 1 ;
|
;
|
;
|
DB 15 ;LEFT PAREN
|
DB 15 ;LEFT PAREN
|
DB 14 ;EXPONENTIAN **
|
DB 14 ;EXPONENTIAN **
|
DB 10 ;MUL
|
DB 10 ;MUL
|
DB 8 ;ADD
|
DB 8 ;ADD
|
DB 10 ;DIVIDE
|
DB 10 ;DIVIDE
|
DB 8 ;SUB
|
DB 8 ;SUB
|
DB 3 ;XOR
|
DB 3 ;XOR
|
DB 5 ;AND
|
DB 5 ;AND
|
DB 4 ;OR
|
DB 4 ;OR
|
DB 12 ;NEGATE
|
DB 12 ;NEGATE
|
DB 6 ;EQ
|
DB 6 ;EQ
|
DB 6 ;GT
|
DB 6 ;GT
|
DB 6 ;LT
|
DB 6 ;LT
|
DB 6 ;NE
|
DB 6 ;NE
|
DB 6 ;LE
|
DB 6 ;LE
|
DB 6 ;GE
|
DB 6 ;GE
|
;
|
;
|
UOPBOL: DB 15 ;AABS
|
UOPBOL: DB 15 ;AABS
|
DB 15 ;AAINT
|
DB 15 ;AAINT
|
DB 15 ;ASGN
|
DB 15 ;ASGN
|
DB 15 ;ANOT
|
DB 15 ;ANOT
|
DB 15 ;ACOS
|
DB 15 ;ACOS
|
DB 15 ;ATAN
|
DB 15 ;ATAN
|
DB 15 ;ASIN
|
DB 15 ;ASIN
|
DB 15 ;ASQR
|
DB 15 ;ASQR
|
DB 15 ;ACBYTE
|
DB 15 ;ACBYTE
|
DB 15 ;E TO THE X
|
DB 15 ;E TO THE X
|
DB 15 ;AATAN
|
DB 15 ;AATAN
|
DB 15 ;NATURAL LOG
|
DB 15 ;NATURAL LOG
|
DB 15 ;DBYTE
|
DB 15 ;DBYTE
|
DB 15 ;XBYTE
|
DB 15 ;XBYTE
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The ASCII printed messages.
|
; The ASCII printed messages.
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
STP: DB 'STOP"'
|
STP: DB 'STOP"'
|
;
|
;
|
IAN: DB 'TRY AGAIN"'
|
IAN: DB 'TRY AGAIN"'
|
;
|
;
|
RDYS: DB 'READY"'
|
RDYS: DB 'READY"'
|
;
|
;
|
INS: DB ' - IN LINE "'
|
INS: DB ' - IN LINE "'
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; This is the command jump table
|
; This is the command jump table
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
CMNDD: DW CRUN ;RUN
|
CMNDD: DW CRUN ;RUN
|
DW CLIST ;LIST
|
DW CLIST ;LIST
|
DW CNULL ;NULL
|
DW CNULL ;NULL
|
DW CNEW ;NEW
|
DW CNEW ;NEW
|
DW CCONT ;CONTINUE
|
DW CCONT ;CONTINUE
|
DW CPROG ;PROGRAM A PROM
|
DW CPROG ;PROGRAM A PROM
|
DW CXFER ;TRANSFER FROM ROM TO RAM
|
DW CXFER ;TRANSFER FROM ROM TO RAM
|
DW CRAM ;RAM MODE
|
DW CRAM ;RAM MODE
|
DW CROM ;ROM MODE
|
DW CROM ;ROM MODE
|
DW CIPROG ;INTELLIGENT PROM PROGRAMMING
|
DW CIPROG ;INTELLIGENT PROM PROGRAMMING
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; This is the statement jump table.
|
; This is the statement jump table.
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
STATD: ;
|
STATD: ;
|
DW SLET ;LET 80H
|
DW SLET ;LET 80H
|
DW SCLR ;CLEAR 81H
|
DW SCLR ;CLEAR 81H
|
DW SPUSH ;PUSH VAR 82H
|
DW SPUSH ;PUSH VAR 82H
|
DW SGOTO ;GO TO 83H
|
DW SGOTO ;GO TO 83H
|
DW STONE ;TONE 84H
|
DW STONE ;TONE 84H
|
DW SPH0 ;PRINT MODE 0 85H
|
DW SPH0 ;PRINT MODE 0 85H
|
DW SUI ;USER INPUT 86H
|
DW SUI ;USER INPUT 86H
|
DW SUO ;USER OUTPUT 87H
|
DW SUO ;USER OUTPUT 87H
|
DW SPOP ;POP VAR 88H
|
DW SPOP ;POP VAR 88H
|
DW SPRINT ;PRINT 89H
|
DW SPRINT ;PRINT 89H
|
DW SCALL ;CALL 8AH
|
DW SCALL ;CALL 8AH
|
DW SDIMX ;DIMENSION 8BH
|
DW SDIMX ;DIMENSION 8BH
|
DW STRING ;STRING ALLO 8CH
|
DW STRING ;STRING ALLO 8CH
|
DW SBAUD ;SET BAUD 8DH
|
DW SBAUD ;SET BAUD 8DH
|
DW SCLOCK ;CLOCK 8EH
|
DW SCLOCK ;CLOCK 8EH
|
DW SPH1 ;PRINT MODE 1 8FH
|
DW SPH1 ;PRINT MODE 1 8FH
|
;
|
;
|
; No direct mode from here on
|
; No direct mode from here on
|
;
|
;
|
DW SSTOP ;STOP 90H
|
DW SSTOP ;STOP 90H
|
DW SOT ;ON TIME 91H
|
DW SOT ;ON TIME 91H
|
DW SONEXT ;ON EXT INT 92H
|
DW SONEXT ;ON EXT INT 92H
|
DW SRETI ;RET FROM INT 93H
|
DW SRETI ;RET FROM INT 93H
|
DW S_DO ;DO 94H
|
DW S_DO ;DO 94H
|
DW SRESTR ;RESTOR 95H
|
DW SRESTR ;RESTOR 95H
|
DW WCR ;REM 96H
|
DW WCR ;REM 96H
|
DW SNEXT ;NEXT 97H
|
DW SNEXT ;NEXT 97H
|
DW SONERR ;ON ERROR 98H
|
DW SONERR ;ON ERROR 98H
|
DW S_ON ;ON 99H
|
DW S_ON ;ON 99H
|
DW SINPUT ;INPUT 9AH
|
DW SINPUT ;INPUT 9AH
|
DW SREAD ;READ 9BH
|
DW SREAD ;READ 9BH
|
DW FINDCR ;DATA 9CH
|
DW FINDCR ;DATA 9CH
|
DW SRETRN ;RETURN 9DH
|
DW SRETRN ;RETURN 9DH
|
DW SIF ;IF 9EH
|
DW SIF ;IF 9EH
|
DW SGOSUB ;GOSUB 9FH
|
DW SGOSUB ;GOSUB 9FH
|
DW SFOR ;FOR A0H
|
DW SFOR ;FOR A0H
|
DW SWHILE ;WHILE A1H
|
DW SWHILE ;WHILE A1H
|
DW SUNTIL ;UNTIL A2H
|
DW SUNTIL ;UNTIL A2H
|
DW CMND1 ;END A3H
|
DW CMND1 ;END A3H
|
DW I_DL ;IDLE A4H
|
DW I_DL ;IDLE A4H
|
DW ST_A ;STORE AT A5H
|
DW ST_A ;STORE AT A5H
|
DW LD_A ;LOAD AT A6H
|
DW LD_A ;LOAD AT A6H
|
DW PGU ;PGM A7H
|
DW PGU ;PGM A7H
|
DW RROM ;RUN A ROM A9H
|
DW RROM ;RUN A ROM A9H
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
TOKTAB: ; This is the basic token table
|
TOKTAB: ; This is the basic token table
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; First the tokens for statements
|
; First the tokens for statements
|
;
|
;
|
DB 80H ;LET TOKEN
|
DB 80H ;LET TOKEN
|
DB 'LET'
|
DB 'LET'
|
;
|
;
|
DB 81H ;CLEAR TOKEN
|
DB 81H ;CLEAR TOKEN
|
DB 'CLEAR'
|
DB 'CLEAR'
|
;
|
;
|
DB 82H ;PUSH TOKEN
|
DB 82H ;PUSH TOKEN
|
DB 'PUSH'
|
DB 'PUSH'
|
;
|
;
|
T_GOTO EQU 83H
|
T_GOTO EQU 83H
|
;
|
;
|
DB 83H ;GO TO TOKEN
|
DB 83H ;GO TO TOKEN
|
DB 'GOTO'
|
DB 'GOTO'
|
;
|
;
|
DB 84H ;TOGGLE TOKEN
|
DB 84H ;TOGGLE TOKEN
|
DB 'PWM'
|
DB 'PWM'
|
;
|
;
|
DB 85H ;PRINT HEX MODE 0
|
DB 85H ;PRINT HEX MODE 0
|
DB 'PH0.'
|
DB 'PH0.'
|
;
|
;
|
DB 86H ;USER IN TOKEN
|
DB 86H ;USER IN TOKEN
|
DB 'UI'
|
DB 'UI'
|
;
|
;
|
DB 87H ;USER OUT TOKEN
|
DB 87H ;USER OUT TOKEN
|
DB 'UO'
|
DB 'UO'
|
;
|
;
|
DB 88H ;POP TOKEN
|
DB 88H ;POP TOKEN
|
DB 'POP'
|
DB 'POP'
|
;
|
;
|
$EJECT
|
$EJECT
|
DB 89H ;PRINT TOKEN
|
DB 89H ;PRINT TOKEN
|
DB 'PRINT'
|
DB 'PRINT'
|
DB 89H
|
DB 89H
|
DB 'P.' ;P. ALSO MEANS PRINT
|
DB 'P.' ;P. ALSO MEANS PRINT
|
DB 89H ;? ALSO
|
DB 89H ;? ALSO
|
DB '?'
|
DB '?'
|
;
|
;
|
DB 8AH ;CALL TOKEN
|
DB 8AH ;CALL TOKEN
|
DB 'CALL'
|
DB 'CALL'
|
;
|
;
|
DB 8BH ;DIMENSION TOKEN
|
DB 8BH ;DIMENSION TOKEN
|
DB 'DIM'
|
DB 'DIM'
|
;
|
;
|
DB 8CH ;STRING TOKEN
|
DB 8CH ;STRING TOKEN
|
DB 'STRING'
|
DB 'STRING'
|
;
|
;
|
DB 8DH ;SET BAUD RATE
|
DB 8DH ;SET BAUD RATE
|
DB 'BAUD'
|
DB 'BAUD'
|
;
|
;
|
DB 8EH ;CLOCK
|
DB 8EH ;CLOCK
|
DB 'CLOCK'
|
DB 'CLOCK'
|
;
|
;
|
DB 8FH ;PRINT HEX MODE 1
|
DB 8FH ;PRINT HEX MODE 1
|
DB 'PH1.'
|
DB 'PH1.'
|
;
|
;
|
T_STOP EQU 90H ;STOP TOKEN
|
T_STOP EQU 90H ;STOP TOKEN
|
DB T_STOP
|
DB T_STOP
|
DB 'STOP'
|
DB 'STOP'
|
;
|
;
|
T_DIR EQU T_STOP ;NO DIRECT FROM HERE ON
|
T_DIR EQU T_STOP ;NO DIRECT FROM HERE ON
|
;
|
;
|
DB T_STOP+1 ;ON TIMER INTERRUPT
|
DB T_STOP+1 ;ON TIMER INTERRUPT
|
DB 'ONTIME'
|
DB 'ONTIME'
|
;
|
;
|
DB T_STOP+2 ;ON EXTERNAL INTERRUPT
|
DB T_STOP+2 ;ON EXTERNAL INTERRUPT
|
DB 'ONEX1'
|
DB 'ONEX1'
|
;
|
;
|
DB T_STOP+3 ;RETURN FROM INTERRUPT
|
DB T_STOP+3 ;RETURN FROM INTERRUPT
|
DB 'RETI'
|
DB 'RETI'
|
;
|
;
|
DB T_STOP+4 ;DO TOKEN
|
DB T_STOP+4 ;DO TOKEN
|
DB 'DO'
|
DB 'DO'
|
;
|
;
|
DB T_STOP+5 ;RESTORE TOKEN
|
DB T_STOP+5 ;RESTORE TOKEN
|
DB 'RESTORE'
|
DB 'RESTORE'
|
;
|
;
|
$EJECT
|
$EJECT
|
T_REM EQU T_STOP+6 ;REMARK TOKEN
|
T_REM EQU T_STOP+6 ;REMARK TOKEN
|
DB T_REM
|
DB T_REM
|
DB 'REM'
|
DB 'REM'
|
;
|
;
|
DB T_REM+1 ;NEXT TOKEN
|
DB T_REM+1 ;NEXT TOKEN
|
DB 'NEXT'
|
DB 'NEXT'
|
;
|
;
|
DB T_REM+2 ;ON ERROR TOKEN
|
DB T_REM+2 ;ON ERROR TOKEN
|
DB 'ONERR'
|
DB 'ONERR'
|
;
|
;
|
DB T_REM+3 ;ON TOKEN
|
DB T_REM+3 ;ON TOKEN
|
DB 'ON'
|
DB 'ON'
|
;
|
;
|
DB T_REM+4 ;INPUT
|
DB T_REM+4 ;INPUT
|
DB 'INPUT'
|
DB 'INPUT'
|
;
|
;
|
DB T_REM+5 ;READ
|
DB T_REM+5 ;READ
|
DB 'READ'
|
DB 'READ'
|
;
|
;
|
T_DATA EQU T_REM+6 ;DATA
|
T_DATA EQU T_REM+6 ;DATA
|
DB T_DATA
|
DB T_DATA
|
DB 'DATA'
|
DB 'DATA'
|
;
|
;
|
DB T_DATA+1 ;RETURN
|
DB T_DATA+1 ;RETURN
|
DB 'RETURN'
|
DB 'RETURN'
|
;
|
;
|
DB T_DATA+2 ;IF
|
DB T_DATA+2 ;IF
|
DB 'IF'
|
DB 'IF'
|
;
|
;
|
T_GOSB EQU T_DATA+3 ;GOSUB
|
T_GOSB EQU T_DATA+3 ;GOSUB
|
DB T_GOSB
|
DB T_GOSB
|
DB 'GOSUB'
|
DB 'GOSUB'
|
;
|
;
|
DB T_GOSB+1 ;FOR
|
DB T_GOSB+1 ;FOR
|
DB 'FOR'
|
DB 'FOR'
|
;
|
;
|
DB T_GOSB+2 ;WHILE
|
DB T_GOSB+2 ;WHILE
|
DB 'WHILE'
|
DB 'WHILE'
|
;
|
;
|
DB T_GOSB+3 ;UNTIL
|
DB T_GOSB+3 ;UNTIL
|
DB 'UNTIL'
|
DB 'UNTIL'
|
;
|
;
|
DB T_GOSB+4 ;END
|
DB T_GOSB+4 ;END
|
DB 'END'
|
DB 'END'
|
;
|
;
|
$EJECT
|
$EJECT
|
T_LAST EQU T_GOSB+5 ;LAST INITIAL TOKEN
|
T_LAST EQU T_GOSB+5 ;LAST INITIAL TOKEN
|
;
|
;
|
T_TAB EQU T_LAST ;TAB TOKEN
|
T_TAB EQU T_LAST ;TAB TOKEN
|
DB T_TAB
|
DB T_TAB
|
DB 'TAB'
|
DB 'TAB'
|
;
|
;
|
T_THEN EQU T_LAST+1 ;THEN TOKEN
|
T_THEN EQU T_LAST+1 ;THEN TOKEN
|
DB T_THEN
|
DB T_THEN
|
DB 'THEN'
|
DB 'THEN'
|
;
|
;
|
T_TO EQU T_LAST+2 ;TO TOKEN
|
T_TO EQU T_LAST+2 ;TO TOKEN
|
DB T_TO
|
DB T_TO
|
DB 'TO'
|
DB 'TO'
|
;
|
;
|
T_STEP EQU T_LAST+3 ;STEP TOKEN
|
T_STEP EQU T_LAST+3 ;STEP TOKEN
|
DB T_STEP
|
DB T_STEP
|
DB 'STEP'
|
DB 'STEP'
|
;
|
;
|
T_ELSE EQU T_LAST+4 ;ELSE TOKEN
|
T_ELSE EQU T_LAST+4 ;ELSE TOKEN
|
DB T_ELSE
|
DB T_ELSE
|
DB 'ELSE'
|
DB 'ELSE'
|
;
|
;
|
T_SPC EQU T_LAST+5 ;SPACE TOKEN
|
T_SPC EQU T_LAST+5 ;SPACE TOKEN
|
DB T_SPC
|
DB T_SPC
|
DB 'SPC'
|
DB 'SPC'
|
;
|
;
|
T_CR EQU T_LAST+6
|
T_CR EQU T_LAST+6
|
DB T_CR
|
DB T_CR
|
DB 'CR'
|
DB 'CR'
|
;
|
;
|
DB T_CR+1
|
DB T_CR+1
|
DB 'IDLE'
|
DB 'IDLE'
|
;
|
;
|
DB T_CR+2
|
DB T_CR+2
|
DB 'ST@'
|
DB 'ST@'
|
;
|
;
|
DB T_CR+3
|
DB T_CR+3
|
DB 'LD@'
|
DB 'LD@'
|
;
|
;
|
DB T_CR+4
|
DB T_CR+4
|
DB 'PGM'
|
DB 'PGM'
|
;
|
;
|
DB T_CR+5
|
DB T_CR+5
|
DB 'RROM'
|
DB 'RROM'
|
;
|
;
|
$EJECT
|
$EJECT
|
; Operator tokens
|
; Operator tokens
|
;
|
;
|
T_LPAR EQU 0E0H ;LEFT PAREN
|
T_LPAR EQU 0E0H ;LEFT PAREN
|
DB T_LPAR
|
DB T_LPAR
|
DB '('
|
DB '('
|
;
|
;
|
DB T_LPAR+1 ;EXPONENTIAN
|
DB T_LPAR+1 ;EXPONENTIAN
|
DB '**'
|
DB '**'
|
;
|
;
|
DB T_LPAR+2 ;FP MULTIPLY
|
DB T_LPAR+2 ;FP MULTIPLY
|
DB '*'
|
DB '*'
|
;
|
;
|
T_ADD EQU T_LPAR+3
|
T_ADD EQU T_LPAR+3
|
DB T_LPAR+3 ;ADD TOKEN
|
DB T_LPAR+3 ;ADD TOKEN
|
DB '+'
|
DB '+'
|
;
|
;
|
DB T_LPAR+4 ;DIVIDE TOKEN
|
DB T_LPAR+4 ;DIVIDE TOKEN
|
DB '/'
|
DB '/'
|
;
|
;
|
T_SUB EQU T_LPAR+5 ;SUBTRACT TOKEN
|
T_SUB EQU T_LPAR+5 ;SUBTRACT TOKEN
|
DB T_SUB
|
DB T_SUB
|
DB '-'
|
DB '-'
|
;
|
;
|
DB T_LPAR+6 ;LOGICAL EXCLUSIVE OR
|
DB T_LPAR+6 ;LOGICAL EXCLUSIVE OR
|
DB '.XOR.'
|
DB '.XOR.'
|
;
|
;
|
DB T_LPAR+7 ;LOGICAL AND
|
DB T_LPAR+7 ;LOGICAL AND
|
DB '.AND.'
|
DB '.AND.'
|
;
|
;
|
DB T_LPAR+8 ;LOGICAL OR
|
DB T_LPAR+8 ;LOGICAL OR
|
DB '.OR.'
|
DB '.OR.'
|
;
|
;
|
T_NEG EQU T_LPAR+9
|
T_NEG EQU T_LPAR+9
|
;
|
;
|
T_EQU EQU T_LPAR+10 ;EQUAL
|
T_EQU EQU T_LPAR+10 ;EQUAL
|
DB T_EQU
|
DB T_EQU
|
DB '='
|
DB '='
|
;
|
;
|
DB T_LPAR+11 ;GREATER THAN OR EQUAL
|
DB T_LPAR+11 ;GREATER THAN OR EQUAL
|
DB '>='
|
DB '>='
|
;
|
;
|
DB T_LPAR+12 ;LESS THAN OR EQUAL
|
DB T_LPAR+12 ;LESS THAN OR EQUAL
|
DB '<='
|
DB '<='
|
;
|
;
|
DB T_LPAR+13 ;NOT EQUAL
|
DB T_LPAR+13 ;NOT EQUAL
|
DB '<>'
|
DB '<>'
|
;
|
;
|
DB T_LPAR+14 ;LESS THAN
|
DB T_LPAR+14 ;LESS THAN
|
DB '<'
|
DB '<'
|
;
|
;
|
DB T_LPAR+15 ;GREATER THAN
|
DB T_LPAR+15 ;GREATER THAN
|
DB '>'
|
DB '>'
|
;
|
;
|
;
|
;
|
T_UOP EQU 0B0H ;UNARY OP BASE TOKEN
|
T_UOP EQU 0B0H ;UNARY OP BASE TOKEN
|
;
|
;
|
DB T_UOP ;ABS TOKEN
|
DB T_UOP ;ABS TOKEN
|
DB 'ABS'
|
DB 'ABS'
|
;
|
;
|
DB T_UOP+1 ;INTEGER TOKEN
|
DB T_UOP+1 ;INTEGER TOKEN
|
DB 'INT'
|
DB 'INT'
|
;
|
;
|
DB T_UOP+2 ;SIGN TOKEN
|
DB T_UOP+2 ;SIGN TOKEN
|
DB 'SGN'
|
DB 'SGN'
|
;
|
;
|
DB T_UOP+3 ;GET TOKEN
|
DB T_UOP+3 ;GET TOKEN
|
DB 'NOT'
|
DB 'NOT'
|
;
|
;
|
DB T_UOP+4 ;COSINE TOKEN
|
DB T_UOP+4 ;COSINE TOKEN
|
DB 'COS'
|
DB 'COS'
|
;
|
;
|
DB T_UOP+5 ;TANGENT TOKEN
|
DB T_UOP+5 ;TANGENT TOKEN
|
DB 'TAN'
|
DB 'TAN'
|
;
|
;
|
DB T_UOP+6 ;SINE TOKEN
|
DB T_UOP+6 ;SINE TOKEN
|
DB 'SIN'
|
DB 'SIN'
|
;
|
;
|
DB T_UOP+7 ;SQUARE ROOT TOKEN
|
DB T_UOP+7 ;SQUARE ROOT TOKEN
|
DB 'SQR'
|
DB 'SQR'
|
;
|
;
|
DB T_UOP+8 ;CBYTE TOKEN
|
DB T_UOP+8 ;CBYTE TOKEN
|
DB 'CBY'
|
DB 'CBY'
|
;
|
;
|
DB T_UOP+9 ;EXP (E TO THE X) TOKEN
|
DB T_UOP+9 ;EXP (E TO THE X) TOKEN
|
DB 'EXP'
|
DB 'EXP'
|
;
|
;
|
DB T_UOP+10
|
DB T_UOP+10
|
DB 'ATN'
|
DB 'ATN'
|
;
|
;
|
DB T_UOP+11
|
DB T_UOP+11
|
DB 'LOG'
|
DB 'LOG'
|
;
|
;
|
DB T_UOP+12 ;DBYTE TOKEN
|
DB T_UOP+12 ;DBYTE TOKEN
|
DB 'DBY'
|
DB 'DBY'
|
;
|
;
|
DB T_UOP+13 ;XBYTE TOKEN
|
DB T_UOP+13 ;XBYTE TOKEN
|
DB 'XBY'
|
DB 'XBY'
|
;
|
;
|
T_ULAST EQU T_UOP+14 ;LAST OPERATOR NEEDING PARENS
|
T_ULAST EQU T_UOP+14 ;LAST OPERATOR NEEDING PARENS
|
;
|
;
|
DB T_ULAST
|
DB T_ULAST
|
DB 'PI'
|
DB 'PI'
|
;
|
;
|
DB T_ULAST+1 ;RND TOKEN
|
DB T_ULAST+1 ;RND TOKEN
|
DB 'RND'
|
DB 'RND'
|
;
|
;
|
DB T_ULAST+2 ;GET TOKEN
|
DB T_ULAST+2 ;GET TOKEN
|
DB 'GET'
|
DB 'GET'
|
;
|
;
|
DB T_ULAST+3 ;FREE TOKEN
|
DB T_ULAST+3 ;FREE TOKEN
|
DB 'FREE'
|
DB 'FREE'
|
;
|
;
|
DB T_ULAST+4 ;LEN TOKEN
|
DB T_ULAST+4 ;LEN TOKEN
|
DB 'LEN'
|
DB 'LEN'
|
;
|
;
|
T_XTAL EQU T_ULAST+5 ;CRYSTAL TOKEN
|
T_XTAL EQU T_ULAST+5 ;CRYSTAL TOKEN
|
DB T_XTAL
|
DB T_XTAL
|
DB 'XTAL'
|
DB 'XTAL'
|
;
|
;
|
T_MTOP EQU T_ULAST+6 ;MTOP
|
T_MTOP EQU T_ULAST+6 ;MTOP
|
DB T_MTOP
|
DB T_MTOP
|
DB 'MTOP'
|
DB 'MTOP'
|
;
|
;
|
T_IE EQU T_ULAST+8 ;IE REGISTER
|
T_IE EQU T_ULAST+8 ;IE REGISTER
|
DB T_IE
|
DB T_IE
|
DB 'IE'
|
DB 'IE'
|
;
|
;
|
T_IP EQU T_ULAST+9 ;IP REGISTER
|
T_IP EQU T_ULAST+9 ;IP REGISTER
|
DB T_IP
|
DB T_IP
|
DB 'IP'
|
DB 'IP'
|
;
|
;
|
TMR0 EQU T_ULAST+10 ;TIMER 0
|
TMR0 EQU T_ULAST+10 ;TIMER 0
|
DB TMR0
|
DB TMR0
|
DB 'TIMER0'
|
DB 'TIMER0'
|
;
|
;
|
TMR1 EQU T_ULAST+11 ;TIMER 1
|
TMR1 EQU T_ULAST+11 ;TIMER 1
|
DB TMR1
|
DB TMR1
|
DB 'TIMER1'
|
DB 'TIMER1'
|
;
|
;
|
TMR2 EQU T_ULAST+12 ;TIMER 2
|
TMR2 EQU T_ULAST+12 ;TIMER 2
|
DB TMR2
|
DB TMR2
|
DB 'TIMER2'
|
DB 'TIMER2'
|
;
|
;
|
T_TIME EQU T_ULAST+7 ;TIME
|
T_TIME EQU T_ULAST+7 ;TIME
|
DB T_TIME
|
DB T_TIME
|
DB 'TIME'
|
DB 'TIME'
|
;
|
;
|
TT2C EQU T_ULAST+13 ;T2CON
|
TT2C EQU T_ULAST+13 ;T2CON
|
DB TT2C
|
DB TT2C
|
DB 'T2CON'
|
DB 'T2CON'
|
;
|
;
|
TTC EQU T_ULAST+14 ;TCON
|
TTC EQU T_ULAST+14 ;TCON
|
DB TTC
|
DB TTC
|
DB 'TCON'
|
DB 'TCON'
|
;
|
;
|
TTM EQU T_ULAST+15 ;TMOD
|
TTM EQU T_ULAST+15 ;TMOD
|
DB TTM
|
DB TTM
|
DB 'TMOD'
|
DB 'TMOD'
|
;
|
;
|
TRC2 EQU T_ULAST+16 ;RCAP2
|
TRC2 EQU T_ULAST+16 ;RCAP2
|
DB TRC2
|
DB TRC2
|
DB 'RCAP2'
|
DB 'RCAP2'
|
;
|
;
|
T_P1 EQU T_ULAST+17 ;P1
|
T_P1 EQU T_ULAST+17 ;P1
|
DB T_P1
|
DB T_P1
|
DB 'PORT1'
|
DB 'PORT1'
|
;
|
;
|
T_PC EQU T_ULAST+18 ;PCON
|
T_PC EQU T_ULAST+18 ;PCON
|
DB T_PC
|
DB T_PC
|
DB 'PCON'
|
DB 'PCON'
|
;
|
;
|
T_ASC EQU T_ULAST+19 ;ASC TOKEN
|
T_ASC EQU T_ULAST+19 ;ASC TOKEN
|
DB T_ASC
|
DB T_ASC
|
DB 'ASC('
|
DB 'ASC('
|
;
|
;
|
T_USE EQU T_ULAST+20 ;USING TOKEN
|
T_USE EQU T_ULAST+20 ;USING TOKEN
|
DB T_USE
|
DB T_USE
|
DB 'USING('
|
DB 'USING('
|
DB T_USE
|
DB T_USE
|
DB 'U.('
|
DB 'U.('
|
;
|
;
|
T_CHR EQU T_ULAST+21 ;CHR TOKEN
|
T_CHR EQU T_ULAST+21 ;CHR TOKEN
|
DB T_CHR
|
DB T_CHR
|
DB 'CHR('
|
DB 'CHR('
|
;
|
;
|
$EJECT
|
$EJECT
|
T_CMND EQU 0F0H ;COMMAND BASE
|
T_CMND EQU 0F0H ;COMMAND BASE
|
;
|
;
|
DB 0F0H ;RUN TOKEN
|
DB 0F0H ;RUN TOKEN
|
DB 'RUN'
|
DB 'RUN'
|
;
|
;
|
DB 0F1H ;LIST TOKEN
|
DB 0F1H ;LIST TOKEN
|
DB 'LIST'
|
DB 'LIST'
|
;
|
;
|
DB 0F2H ;NULL TOKEN
|
DB 0F2H ;NULL TOKEN
|
DB 'NULL'
|
DB 'NULL'
|
;
|
;
|
DB 0F3H ;NEW TOKEN
|
DB 0F3H ;NEW TOKEN
|
DB 'NEW'
|
DB 'NEW'
|
;
|
;
|
DB 0F4H ;CONTINUE TOKEN
|
DB 0F4H ;CONTINUE TOKEN
|
DB 'CONT'
|
DB 'CONT'
|
;
|
;
|
DB 0F5H ;PROGRAM TOKEN
|
DB 0F5H ;PROGRAM TOKEN
|
DB 'PROG'
|
DB 'PROG'
|
;
|
;
|
DB 0F6H ;TRANSFER TOKEN
|
DB 0F6H ;TRANSFER TOKEN
|
DB 'XFER'
|
DB 'XFER'
|
;
|
;
|
DB 0F7H ;RAM MODE
|
DB 0F7H ;RAM MODE
|
DB 'RAM'
|
DB 'RAM'
|
;
|
;
|
DB 0F8H ;ROM MODE
|
DB 0F8H ;ROM MODE
|
DB 'ROM'
|
DB 'ROM'
|
;
|
;
|
DB 0F9H ;INTELLIGENT PROM PROGRAMMING
|
DB 0F9H ;INTELLIGENT PROM PROGRAMMING
|
DB 'FPROG'
|
DB 'FPROG'
|
;
|
;
|
DB 0FFH ;END OF TABLE
|
DB 0FFH ;END OF TABLE
|
;
|
;
|
|
|
; END OF INCLUDE LOOK52
|
; END OF INCLUDE LOOK52
|
;$INCLUDE(:F2:LOOK52.SRC)
|
;$INCLUDE(:F2:LOOK52.SRC)
|
;
|
;
|
EIG: DB 'EXTRA IGNORED"'
|
EIG: DB 'EXTRA IGNORED"'
|
;
|
;
|
EXA: DB 'A-STACK"'
|
EXA: DB 'A-STACK"'
|
;
|
;
|
EXC: DB 'C-STACK"'
|
EXC: DB 'C-STACK"'
|
;
|
;
|
$EJECT
|
$EJECT
|
;$INCLUDE(:F2:BAS52.RST)
|
;$INCLUDE(:F2:BAS52.RST)
|
; BEGINNING
|
; BEGINNING
|
|
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
CRST: ; This performs system initialzation, it was moved here so the
|
CRST: ; This performs system initialzation, it was moved here so the
|
; new power on reset functions could be tested in an 8751.
|
; new power on reset functions could be tested in an 8751.
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; First, initialize SFR's
|
; First, initialize SFR's
|
;
|
;
|
MOV SCON,#5AH ;INITIALIZE SFR'S
|
MOV SCON,#5AH ;INITIALIZE SFR'S
|
MOV TMOD,#10H
|
MOV TMOD,#10H
|
MOV TCON,#54H
|
MOV TCON,#54H
|
MOV T2CON,#34H
|
MOV T2CON,#34H
|
; DB 75H ;MOV DIRECT, # OP CODE
|
; DB 75H ;MOV DIRECT, # OP CODE
|
; DB 0C8H ;T2CON LOCATION
|
; DB 0C8H ;T2CON LOCATION
|
; DB 34H ;CONFIGURATION BYTE
|
; DB 34H ;CONFIGURATION BYTE
|
;
|
;
|
MOV DPTR,#2001H ;READ CODE AT 2001H
|
MOV DPTR,#2001H ;READ CODE AT 2001H
|
CLR A
|
CLR A
|
MOVC A,@A+DPTR
|
MOVC A,@A+DPTR
|
CJNE A,#0AAH,CRST1 ;IF IT IS AN AAH, DO USER RESET
|
CJNE A,#0AAH,CRST1 ;IF IT IS AN AAH, DO USER RESET
|
LCALL 2090H
|
LCALL 2090H
|
;
|
;
|
CRST1: MOV R0,#IRAMTOP ;PUT THE TOP OF RAM IN R0
|
CRST1: MOV R0,#IRAMTOP ;PUT THE TOP OF RAM IN R0
|
CLR A ;ZERO THE ACC
|
CLR A ;ZERO THE ACC
|
;
|
;
|
CRST2: MOV @R0,A ;CLEAR INTERNAL MEMORY
|
CRST2: MOV @R0,A ;CLEAR INTERNAL MEMORY
|
DJNZ R0,CRST2 ;LOOP TIL DONE
|
DJNZ R0,CRST2 ;LOOP TIL DONE
|
;
|
;
|
; Now, test the external memory
|
; Now, test the external memory
|
;
|
;
|
MOV SPSAV,#CMNDSP ;SET UP THE STACK
|
MOV SPSAV,#CMNDSP ;SET UP THE STACK
|
MOV SP,SPSAV
|
MOV SP,SPSAV
|
;
|
;
|
MOV BOFAH,#HIGH ROMADR
|
MOV BOFAH,#HIGH ROMADR
|
MOV BOFAL,#LOW ROMADR+17
|
MOV BOFAL,#LOW ROMADR+17
|
MOV DPTR,#ROMADR ;GET THE BYTE AT 8000H
|
MOV DPTR,#ROMADR ;GET THE BYTE AT 8000H
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
CLR C
|
CLR C
|
SUBB A,#31H ;FOR BIAS
|
SUBB A,#31H ;FOR BIAS
|
MOV MT1,A ;SAVE IN DIRECT MATH LOC
|
MOV MT1,A ;SAVE IN DIRECT MATH LOC
|
CLR ACC.2 ;SAVE FOR RESET
|
CLR ACC.2 ;SAVE FOR RESET
|
MOV R7,A ;SAVE IT IN R7
|
MOV R7,A ;SAVE IT IN R7
|
INC DPTR
|
INC DPTR
|
ACALL L31DPI ;SAVE BAUD RATE
|
ACALL L31DPI ;SAVE BAUD RATE
|
LCALL RCL
|
LCALL RCL
|
INC DPTR ;GET MEMTOP
|
INC DPTR ;GET MEMTOP
|
ACALL L31DPI
|
ACALL L31DPI
|
MOV DPTR,#5FH ;READ THE EXTERNAL BYTE
|
MOV DPTR,#5FH ;READ THE EXTERNAL BYTE
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
MOV DPTR,#0 ;ESTABLISH BASE FOR CLEAR
|
MOV DPTR,#0 ;ESTABLISH BASE FOR CLEAR
|
CJNE A,#0A5H,CRS
|
CJNE A,#0A5H,CRS
|
MOV A,MT1
|
MOV A,MT1
|
CLR ACC.0 ;CLEAR BIT ONE
|
CLR ACC.0 ;CLEAR BIT ONE
|
XRL A,#4H
|
XRL A,#4H
|
JZ CR2
|
JZ CR2
|
;
|
;
|
CRS: CJNE R7,#2,CRS1
|
CRS: CJNE R7,#2,CRS1
|
SJMP CRS2
|
SJMP CRS2
|
CRS1: CJNE R7,#3,CR0
|
CRS1: CJNE R7,#3,CR0
|
CRS2: ACALL CL_1
|
CRS2: ACALL CL_1
|
SJMP CR1
|
SJMP CR1
|
;
|
;
|
CR0: MOV R3,DPH ;SAVE THE DPTR
|
CR0: MOV R3,DPH ;SAVE THE DPTR
|
MOV R1,DPL
|
MOV R1,DPL
|
INC DPTR
|
INC DPTR
|
MOV A,#5AH
|
MOV A,#5AH
|
MOVX @DPTR,A
|
MOVX @DPTR,A
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
CJNE A,#5AH,CR1
|
CJNE A,#5AH,CR1
|
CLR A
|
CLR A
|
MOVX @DPTR,A
|
MOVX @DPTR,A
|
CJNE R3,#0E0H,CR0
|
CJNE R3,#0E0H,CR0
|
;
|
;
|
CR1: CJNE R3,#03H,CR11 ;NEED THIS MUCH RAM
|
CR1: CJNE R3,#03H,CR11 ;NEED THIS MUCH RAM
|
CR11: JC CRST
|
CR11: JC CRST
|
MOV DPTR,#MEMTOP ;SAVE MEMTOP
|
MOV DPTR,#MEMTOP ;SAVE MEMTOP
|
ACALL S31DP2 ;SAVE MEMTOP AND SEED RCELL
|
ACALL S31DP2 ;SAVE MEMTOP AND SEED RCELL
|
ACALL CNEW ;CLEAR THE MEMORY AND SET UP POINTERS
|
ACALL CNEW ;CLEAR THE MEMORY AND SET UP POINTERS
|
;
|
;
|
CR2: ACALL RC1 ;SET UP STACKS IF NOT DONE
|
CR2: ACALL RC1 ;SET UP STACKS IF NOT DONE
|
;
|
;
|
LCALL AXTAL0 ;DO THE CRYSTAL
|
LCALL AXTAL0 ;DO THE CRYSTAL
|
MOV A,MT1 ;GET THE RESET BYTE
|
MOV A,MT1 ;GET THE RESET BYTE
|
CJNE A,#5,CR20
|
CJNE A,#5,CR20
|
LCALL 4039H
|
LCALL 4039H
|
CR20: JNC BG1 ;CHECK FOR 0,1,2,3, OR 4
|
CR20: JNC BG1 ;CHECK FOR 0,1,2,3, OR 4
|
JNB ACC.0,BG3 ;NO RUN IF WRONG TYPE
|
JNB ACC.0,BG3 ;NO RUN IF WRONG TYPE
|
MOV DPTR,#ROMADR+16
|
MOV DPTR,#ROMADR+16
|
MOVX A,@DPTR ;READ THE BYTE
|
MOVX A,@DPTR ;READ THE BYTE
|
CJNE A,#55H,BG3
|
CJNE A,#55H,BG3
|
LJMP CRUN
|
LJMP CRUN
|
|
|
; START OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
; START OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
|
|
BG1: CLR A ;DO BAUD RATE
|
BG1: CLR A ;DO BAUD RATE
|
MOV R3,A
|
MOV R3,A
|
MOV R1,A
|
MOV R1,A
|
MOV TL2,A
|
MOV TL2,A
|
CLR T2CON.2
|
CLR T2CON.2
|
JB RXD,$ ;LOOP UNTIL A CHARACTER IS RECEIVED
|
JB RXD,$ ;LOOP UNTIL A CHARACTER IS RECEIVED
|
MOV T2CON,#5
|
MOV T2CON,#5
|
CALL TIB2
|
CALL TIB2
|
JNB RXD,$
|
JNB RXD,$
|
MOV T2CON,#34H
|
MOV T2CON,#34H
|
CALL RCL ;LOAD THE TIMER
|
CALL RCL ;LOAD THE TIMER
|
NOP
|
NOP
|
NOP
|
NOP
|
|
|
; END OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
; END OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
|
|
|
|
BG3: MOV DPTR,#S_N ;GET THE MESSAGE
|
BG3: MOV DPTR,#S_N ;GET THE MESSAGE
|
ACALL CRP ;PRINT IT
|
ACALL CRP ;PRINT IT
|
LJMP CRAM
|
LJMP CRAM
|
|
|
; END
|
; END
|
;$INCLUDE(:F2:BAS52.RST)
|
;$INCLUDE(:F2:BAS52.RST)
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; CIPROG AND CPROG - Program a prom
|
; CIPROG AND CPROG - Program a prom
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;$INCLUDE(:F2:BAS52.PGM)
|
;$INCLUDE(:F2:BAS52.PGM)
|
;BEGINNING
|
;BEGINNING
|
|
|
PG8: MOV R7,#00H ;PROGRAM ONE BYTE AT A TIME
|
PG8: MOV R7,#00H ;PROGRAM ONE BYTE AT A TIME
|
MOV R6,#01H
|
MOV R6,#01H
|
MOV R2,#HIGH ROMADR-1
|
MOV R2,#HIGH ROMADR-1
|
MOV R0,#LOW ROMADR-1;LOAD PROM ADDRESS
|
MOV R0,#LOW ROMADR-1;LOAD PROM ADDRESS
|
ACALL PG101
|
ACALL PG101
|
INC R6
|
INC R6
|
MOV A,RCAPH2
|
MOV A,RCAPH2
|
; DB 0E5H ;MOV A DIRECT OP CODE
|
; DB 0E5H ;MOV A DIRECT OP CODE
|
; DB 0CBH ;ADDRESS OF R2CAP HIGH
|
; DB 0CBH ;ADDRESS OF R2CAP HIGH
|
ACALL PG101
|
ACALL PG101
|
MOV A,RCAPL2
|
MOV A,RCAPL2
|
; DB 0E5H ;MOV A, DIRECT OP CODE
|
; DB 0E5H ;MOV A, DIRECT OP CODE
|
; DB 0CAH ;R2CAP LOW
|
; DB 0CAH ;R2CAP LOW
|
MOV R6,#3
|
MOV R6,#3
|
MOV R1,#LOW MEMTOP-1
|
MOV R1,#LOW MEMTOP-1
|
MOV R3,#HIGH MEMTOP
|
MOV R3,#HIGH MEMTOP
|
ACALL PG101 ;SAVE MEMTOP
|
ACALL PG101 ;SAVE MEMTOP
|
SJMP PGR
|
SJMP PGR
|
;
|
;
|
CIPROG: MOV DPTR,#IPROGS ;LOAD IPROG LOCATION
|
CIPROG: MOV DPTR,#IPROGS ;LOAD IPROG LOCATION
|
SETB INTELB
|
SETB INTELB
|
SJMP CPROG1 ;GO DO PROG
|
SJMP CPROG1 ;GO DO PROG
|
;
|
;
|
CPROG: MOV DPTR,#PROGS ;LOAD PROG LOCATION
|
CPROG: MOV DPTR,#PROGS ;LOAD PROG LOCATION
|
CLR INTELB
|
CLR INTELB
|
;
|
;
|
CPROG1: ACALL LD_T ;LOAD THE TIMER
|
CPROG1: ACALL LD_T ;LOAD THE TIMER
|
CLR PROMV ;TURN ON THE PROM VOLTAGE
|
CLR PROMV ;TURN ON THE PROM VOLTAGE
|
CALL DELTST ;SEE IF A CR
|
CALL DELTST ;SEE IF A CR
|
JNZ PG8 ;SAVE TIMER IF SO
|
JNZ PG8 ;SAVE TIMER IF SO
|
MOV R4,#0FEH
|
MOV R4,#0FEH
|
SETB INBIT
|
SETB INBIT
|
ACALL ROMFD ;GET THE ROM ADDRESS OF THE LAST LOCATION
|
ACALL ROMFD ;GET THE ROM ADDRESS OF THE LAST LOCATION
|
CALL TEMPD ;SAVE THE ADDRESS
|
CALL TEMPD ;SAVE THE ADDRESS
|
MOV A,R4 ;GET COUNT
|
MOV A,R4 ;GET COUNT
|
CPL A
|
CPL A
|
CALL TWO_R2 ;PUT IT ON THE STACK
|
CALL TWO_R2 ;PUT IT ON THE STACK
|
CALL FP_BASE7 ;OUTPUT IT
|
CALL FP_BASE7 ;OUTPUT IT
|
ACALL CCAL ;GET THE PROGRAM
|
ACALL CCAL ;GET THE PROGRAM
|
ACALL CRLF ;DO CRLF
|
ACALL CRLF ;DO CRLF
|
MOV R0,TEMP4 ;GET ADDRESS
|
MOV R0,TEMP4 ;GET ADDRESS
|
MOV R2,TEMP5
|
MOV R2,TEMP5
|
MOV A,#55H ;LOAD SIGNIFIER
|
MOV A,#55H ;LOAD SIGNIFIER
|
INC R6 ;LOAD LEN + 1
|
INC R6 ;LOAD LEN + 1
|
CJNE R6,#00,CPROG2
|
CJNE R6,#00,CPROG2
|
INC R7
|
INC R7
|
CPROG2: ACALL PG102
|
CPROG2: ACALL PG102
|
;
|
;
|
$EJECT
|
$EJECT
|
PGR: SETB PROMV
|
PGR: SETB PROMV
|
AJMP C_K
|
AJMP C_K
|
;
|
;
|
PG1: MOV P2,R3 ;GET THE BYTE TO PROGRAM
|
PG1: MOV P2,R3 ;GET THE BYTE TO PROGRAM
|
MOVX A,@R1
|
MOVX A,@R1
|
PG101: LCALL INC3210 ;BUMP POINTERS
|
PG101: LCALL INC3210 ;BUMP POINTERS
|
PG102: MOV R5,#1 ;SET UP INTELLIGENT COUMTER
|
PG102: MOV R5,#1 ;SET UP INTELLIGENT COUMTER
|
;
|
;
|
PG2: MOV R4,A ;SAVE THE BYTE IN R4
|
PG2: MOV R4,A ;SAVE THE BYTE IN R4
|
ACALL PG7 ;PROGRAM THE BYTE
|
ACALL PG7 ;PROGRAM THE BYTE
|
ACALL PG9
|
ACALL PG9
|
JB INTELB,PG4 ;SEE IF INTELLIGENT PROGRAMMING
|
JB INTELB,PG4 ;SEE IF INTELLIGENT PROGRAMMING
|
;
|
;
|
PG3: XRL A,R4
|
PG3: XRL A,R4
|
JNZ PG6 ;ERROR IF NOT THE SAME
|
JNZ PG6 ;ERROR IF NOT THE SAME
|
CALL DEC76 ;BUMP THE COUNTERS
|
CALL DEC76 ;BUMP THE COUNTERS
|
JNZ PG1 ;LOOP IF NOT DONE
|
JNZ PG1 ;LOOP IF NOT DONE
|
ANL PSW,#11100111B ;INSURE RB0
|
ANL PSW,#11100111B ;INSURE RB0
|
PG31: RET
|
PG31: RET
|
;
|
;
|
PG4: XRL A,R4 ;SEE IF PROGRAMMED
|
PG4: XRL A,R4 ;SEE IF PROGRAMMED
|
JNZ PG5 ;JUMP IF NOT
|
JNZ PG5 ;JUMP IF NOT
|
MOV A,R4 ;GET THE DATA BACK
|
MOV A,R4 ;GET THE DATA BACK
|
ACALL PG7 ;PROGRAM THE LOCATION
|
ACALL PG7 ;PROGRAM THE LOCATION
|
PG41: ACALL ZRO ;AGAIN
|
PG41: ACALL ZRO ;AGAIN
|
ACALL ZRO ;AND AGAIN
|
ACALL ZRO ;AND AGAIN
|
ACALL ZRO ;AND AGAIN
|
ACALL ZRO ;AND AGAIN
|
DJNZ R5,PG41 ;KEEP DOING IT
|
DJNZ R5,PG41 ;KEEP DOING IT
|
ACALL PG9 ;RESET PROG
|
ACALL PG9 ;RESET PROG
|
SJMP PG3 ;FINISH THE LOOP
|
SJMP PG3 ;FINISH THE LOOP
|
;
|
;
|
PG5: INC R5 ;BUMP THE COUNTER
|
PG5: INC R5 ;BUMP THE COUNTER
|
MOV A,R4 ;GET THE BYTE
|
MOV A,R4 ;GET THE BYTE
|
CJNE R5,#25,PG2 ;SEE IF TRIED 25 TIMES
|
CJNE R5,#25,PG2 ;SEE IF TRIED 25 TIMES
|
;
|
;
|
PG6: SETB PROMV ;TURN OFF PROM VOLTAGE
|
PG6: SETB PROMV ;TURN OFF PROM VOLTAGE
|
MOV PSW,#0 ;INSURE RB0
|
MOV PSW,#0 ;INSURE RB0
|
JNB DIRF,PG31 ;EXIT IF IN RUN MODE
|
JNB DIRF,PG31 ;EXIT IF IN RUN MODE
|
MOV DPTR,#E16X ;PROGRAMMING ERROR
|
MOV DPTR,#E16X ;PROGRAMMING ERROR
|
;
|
;
|
ERRLK: LJMP ERROR ;PROCESS THE ERROR
|
ERRLK: LJMP ERROR ;PROCESS THE ERROR
|
;
|
;
|
$EJECT
|
$EJECT
|
PG7: MOV P0,R0 ;SET UP THE PORTS
|
PG7: MOV P0,R0 ;SET UP THE PORTS
|
MOV P2,R2 ;LATCH LOW ORDER ADDRESS
|
MOV P2,R2 ;LATCH LOW ORDER ADDRESS
|
ACALL PG11 ;DELAY FOR 8748/9
|
ACALL PG11 ;DELAY FOR 8748/9
|
CLR ALED
|
CLR ALED
|
MOV P0,A ;PUT DATA ON THE PORT
|
MOV P0,A ;PUT DATA ON THE PORT
|
;
|
;
|
ZRO: NOP ;SETTLEING TIME + FP ZERO
|
ZRO: NOP ;SETTLEING TIME + FP ZERO
|
NOP
|
NOP
|
NOP
|
NOP
|
NOP
|
NOP
|
NOP
|
NOP
|
NOP
|
NOP
|
ACALL PG11 ;DELAY A WHILE
|
ACALL PG11 ;DELAY A WHILE
|
CLR PROMP ;START PROGRAMMING
|
CLR PROMP ;START PROGRAMMING
|
ACALL TIMER_LOAD ;START THE TIMER
|
ACALL TIMER_LOAD ;START THE TIMER
|
JNB TF1,$ ;WAIT FOR PART TO PROGRAM
|
JNB TF1,$ ;WAIT FOR PART TO PROGRAM
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
PG9: SETB PROMP
|
PG9: SETB PROMP
|
ACALL PG11 ;DELAY FOR A WHILE
|
ACALL PG11 ;DELAY FOR A WHILE
|
JNB P3.2,$ ;LOOP FOR EEPROMS
|
JNB P3.2,$ ;LOOP FOR EEPROMS
|
MOV P0,#0FFH
|
MOV P0,#0FFH
|
CLR P3.7 ;LOWER READ
|
CLR P3.7 ;LOWER READ
|
ACALL PG11
|
ACALL PG11
|
MOV A,P0 ;READ THE PORT
|
MOV A,P0 ;READ THE PORT
|
SETB P3.7
|
SETB P3.7
|
SETB ALED
|
SETB ALED
|
RET
|
RET
|
;
|
;
|
PG11: MOV TEMP5,#12 ;DELAY 30uS AT 12 MHZ
|
PG11: MOV TEMP5,#12 ;DELAY 30uS AT 12 MHZ
|
DJNZ TEMP5,$
|
DJNZ TEMP5,$
|
RET
|
RET
|
;
|
;
|
|
|
;END
|
;END
|
;$INCLUDE(:F2:BAS52.PGM)
|
;$INCLUDE(:F2:BAS52.PGM)
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
PGU: ;PROGRAM A PROM FOR THE USER
|
PGU: ;PROGRAM A PROM FOR THE USER
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
CLR PROMV ;TURN ON THE VOLTAGE
|
CLR PROMV ;TURN ON THE VOLTAGE
|
MOV PSW,#00011000B ;SELECT RB3
|
MOV PSW,#00011000B ;SELECT RB3
|
ACALL PG1 ;DO IT
|
ACALL PG1 ;DO IT
|
SETB PROMV ;TURN IT OFF
|
SETB PROMV ;TURN IT OFF
|
RET
|
RET
|
;
|
;
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
CCAL: ; Set up for prom moves
|
CCAL: ; Set up for prom moves
|
; R3:R1 gets source
|
; R3:R1 gets source
|
; R7:R6 gets # of bytes
|
; R7:R6 gets # of bytes
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL GETEND ;GET THE LAST LOCATION
|
ACALL GETEND ;GET THE LAST LOCATION
|
INC DPTR ;BUMP TO LOAD EOF
|
INC DPTR ;BUMP TO LOAD EOF
|
MOV R3,BOFAH
|
MOV R3,BOFAH
|
MOV R1,BOFAL ;RESTORE START
|
MOV R1,BOFAL ;RESTORE START
|
CLR C ;PREPARE FOR SUBB
|
CLR C ;PREPARE FOR SUBB
|
MOV A,DPL ;SUB DPTR - BOFA > R7:R6
|
MOV A,DPL ;SUB DPTR - BOFA > R7:R6
|
SUBB A,R1
|
SUBB A,R1
|
MOV R6,A
|
MOV R6,A
|
MOV A,DPH
|
MOV A,DPH
|
SUBB A,R3
|
SUBB A,R3
|
MOV R7,A
|
MOV R7,A
|
CCAL1: RET
|
CCAL1: RET
|
;
|
;
|
;
|
;
|
;$INCLUDE(:F2:BAS52.TL)
|
;$INCLUDE(:F2:BAS52.TL)
|
;BEGINNING
|
;BEGINNING
|
|
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
TIMER_LOAD:; Load the timer
|
TIMER_LOAD:; Load the timer
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL CCAL1 ;DELAY FOUR CLOCKS
|
ACALL CCAL1 ;DELAY FOUR CLOCKS
|
TIMER_LOAD1:
|
TIMER_LOAD1:
|
CLR TR1 ;STOP IT WHILE IT'S LOADED
|
CLR TR1 ;STOP IT WHILE IT'S LOADED
|
MOV TH1,T_HH
|
MOV TH1,T_HH
|
MOV TL1,T_LL
|
MOV TL1,T_LL
|
CLR TF1 ;CLEAR THE OVERFLOW FLAG
|
CLR TF1 ;CLEAR THE OVERFLOW FLAG
|
SETB TR1 ;START IT NOW
|
SETB TR1 ;START IT NOW
|
RET
|
RET
|
;
|
;
|
|
|
;END
|
;END
|
;$INCLUDE(:F2:BAS52.TL)
|
;$INCLUDE(:F2:BAS52.TL)
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CROM: ; The command action routine - ROM - Run out of rom
|
CROM: ; The command action routine - ROM - Run out of rom
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
|
CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
|
ACALL RO1 ;DO IT
|
ACALL RO1 ;DO IT
|
;
|
;
|
C_K: LJMP CL3 ;EXIT
|
C_K: LJMP CL3 ;EXIT
|
;
|
;
|
;RO1: CALL INTGER ;SEE IF INTGER PRESENT
|
;RO1: CALL INTGER ;SEE IF INTGER PRESENT
|
; MOV R4,R0B0 ;SAVE THE NUMBER
|
; MOV R4,R0B0 ;SAVE THE NUMBER
|
; JNC $+4
|
; JNC $+4
|
; MOV R4,#01H ;ONE IF NO INTEGER PRESENT
|
; MOV R4,#01H ;ONE IF NO INTEGER PRESENT
|
; CALL ROMFD ;FIND THE PROGRAM
|
; CALL ROMFD ;FIND THE PROGRAM
|
; ACALL ROMFD ;FIND THE PROGRAM
|
; ACALL ROMFD ;FIND THE PROGRAM
|
|
|
RO1: CALL DELTST
|
RO1: CALL DELTST
|
MOV R4,#1
|
MOV R4,#1
|
JNC RO11
|
JNC RO11
|
CALL ONE
|
CALL ONE
|
MOV R4,A
|
MOV R4,A
|
RO11: ACALL ROMFD
|
RO11: ACALL ROMFD
|
CJNE R4,#0,RFX ;EXIT IF R4 <> 0
|
CJNE R4,#0,RFX ;EXIT IF R4 <> 0
|
INC DPTR ;BUMP PAST TAG
|
INC DPTR ;BUMP PAST TAG
|
MOV BOFAH,DPH ;SAVE THE ADDRESS
|
MOV BOFAH,DPH ;SAVE THE ADDRESS
|
MOV BOFAL,DPL
|
MOV BOFAL,DPL
|
RET
|
RET
|
;
|
;
|
ROMFD: MOV DPTR,#ROMADR+16 ;START OF USER PROGRAM
|
ROMFD: MOV DPTR,#ROMADR+16 ;START OF USER PROGRAM
|
;
|
;
|
RF1: MOVX A,@DPTR ;GET THE BYTE
|
RF1: MOVX A,@DPTR ;GET THE BYTE
|
CJNE A,#55H,RF3 ;SEE IF PROPER TAG
|
CJNE A,#55H,RF3 ;SEE IF PROPER TAG
|
DJNZ R4,RF2 ;BUMP COUNTER
|
DJNZ R4,RF2 ;BUMP COUNTER
|
;
|
;
|
RFX: RET ;DPTR HAS THE START ADDRESS
|
RFX: RET ;DPTR HAS THE START ADDRESS
|
;
|
;
|
RF2: INC DPTR ;BUMP PAST TAG
|
RF2: INC DPTR ;BUMP PAST TAG
|
ACALL G5
|
ACALL G5
|
INC DPTR ;BUMP TO NEXT PROGRAM
|
INC DPTR ;BUMP TO NEXT PROGRAM
|
SJMP RF1 ;DO IT AGAIN
|
SJMP RF1 ;DO IT AGAIN
|
;
|
;
|
RF3: JBC INBIT,RFX ;EXIT IF SET
|
RF3: JBC INBIT,RFX ;EXIT IF SET
|
;
|
;
|
NOGO: MOV DPTR,#NOROM
|
NOGO: MOV DPTR,#NOROM
|
AJMP ERRLK
|
AJMP ERRLK
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
L20DPI: ; load R2:R0 with the location the DPTR is pointing to
|
L20DPI: ; load R2:R0 with the location the DPTR is pointing to
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
MOV R2,A
|
MOV R2,A
|
INC DPTR
|
INC DPTR
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
MOV R0,A
|
MOV R0,A
|
RET ;DON'T BUMP DPTR
|
RET ;DON'T BUMP DPTR
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
X31DP: ; swap R3:R1 with DPTR
|
X31DP: ; swap R3:R1 with DPTR
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
XCH A,R3
|
XCH A,R3
|
XCH A,DPH
|
XCH A,DPH
|
XCH A,R3
|
XCH A,R3
|
XCH A,R1
|
XCH A,R1
|
XCH A,DPL
|
XCH A,DPL
|
XCH A,R1
|
XCH A,R1
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LD_T: ; Load the timer save location with the value the DPTR is
|
LD_T: ; Load the timer save location with the value the DPTR is
|
; pointing to.
|
; pointing to.
|
;
|
;
|
;****************************************************************
|
;****************************************************************
|
;
|
;
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
MOV T_HH,A
|
MOV T_HH,A
|
INC DPTR
|
INC DPTR
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
MOV T_LL,A
|
MOV T_LL,A
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;GETLIN - FIND THE LOCATION OF THE LINE NUMBER IN R3:R1
|
;GETLIN - FIND THE LOCATION OF THE LINE NUMBER IN R3:R1
|
; IF ACC = 0 THE LINE WAS NOT FOUND I.E. R3:R1
|
; IF ACC = 0 THE LINE WAS NOT FOUND I.E. R3:R1
|
; WAS TOO BIG, ELSE ACC <> 0 AND THE DPTR POINTS
|
; WAS TOO BIG, ELSE ACC <> 0 AND THE DPTR POINTS
|
; AT THE LINE THAT IS GREATER THAN OR EQUAL TO THE
|
; AT THE LINE THAT IS GREATER THAN OR EQUAL TO THE
|
; VALUE IN R3:R1.
|
; VALUE IN R3:R1.
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
GETEND: SETB ENDBIT ;GET THE END OF THE PROGRAM
|
GETEND: SETB ENDBIT ;GET THE END OF THE PROGRAM
|
;
|
;
|
GETLIN: CALL DP_B ;GET BEGINNING ADDRESS
|
GETLIN: CALL DP_B ;GET BEGINNING ADDRESS
|
;
|
;
|
G1: CALL B_C
|
G1: CALL B_C
|
JZ G3 ;EXIT WITH A ZERO IN A IF AT END
|
JZ G3 ;EXIT WITH A ZERO IN A IF AT END
|
INC DPTR ;POINT AT THE LINE NUMBER
|
INC DPTR ;POINT AT THE LINE NUMBER
|
JB ENDBIT,G2 ;SEE IF WE WANT TO FIND THE END
|
JB ENDBIT,G2 ;SEE IF WE WANT TO FIND THE END
|
ACALL DCMPX ;SEE IF (DPTR) = R3:R1
|
ACALL DCMPX ;SEE IF (DPTR) = R3:R1
|
ACALL DECDP ;POINT AT LINE COUNT
|
ACALL DECDP ;POINT AT LINE COUNT
|
MOVX A,@DPTR ;PUT LINE LENGTH INTO ACC
|
MOVX A,@DPTR ;PUT LINE LENGTH INTO ACC
|
JB UBIT,G3 ;EXIT IF EQUAL
|
JB UBIT,G3 ;EXIT IF EQUAL
|
JC G3 ;SEE IF LESS THAN OR ZERO
|
JC G3 ;SEE IF LESS THAN OR ZERO
|
;
|
;
|
G2: ACALL ADDPTR ;ADD IT TO DPTR
|
G2: ACALL ADDPTR ;ADD IT TO DPTR
|
SJMP G1 ;LOOP
|
SJMP G1 ;LOOP
|
;
|
;
|
G3: CLR ENDBIT ;RESET ENDBIT
|
G3: CLR ENDBIT ;RESET ENDBIT
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
G4: MOV DPTR,#PSTART ;DO RAM
|
G4: MOV DPTR,#PSTART ;DO RAM
|
;
|
;
|
G5: SETB ENDBIT
|
G5: SETB ENDBIT
|
SJMP G1 ;NOW DO TEST
|
SJMP G1 ;NOW DO TEST
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; LDPTRI - Load the DATA POINTER with the value it is pointing
|
; LDPTRI - Load the DATA POINTER with the value it is pointing
|
; to - DPH = (DPTR) , DPL = (DPTR+1)
|
; to - DPH = (DPTR) , DPL = (DPTR+1)
|
;
|
;
|
; acc gets wasted
|
; acc gets wasted
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LDPTRI: MOVX A,@DPTR ;GET THE HIGH BYTE
|
LDPTRI: MOVX A,@DPTR ;GET THE HIGH BYTE
|
PUSH ACC ;SAVE IT
|
PUSH ACC ;SAVE IT
|
INC DPTR ;BUMP THE POINTER
|
INC DPTR ;BUMP THE POINTER
|
MOVX A,@DPTR ;GET THE LOW BYTE
|
MOVX A,@DPTR ;GET THE LOW BYTE
|
MOV DPL,A ;PUT IT IN DPL
|
MOV DPL,A ;PUT IT IN DPL
|
POP DPH ;GET THE HIGH BYTE
|
POP DPH ;GET THE HIGH BYTE
|
RET ;GO BACK
|
RET ;GO BACK
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;L31DPI - LOAD R3 WITH (DPTR) AND R1 WITH (DPTR+1)
|
;L31DPI - LOAD R3 WITH (DPTR) AND R1 WITH (DPTR+1)
|
;
|
;
|
;ACC GETS CLOBBERED
|
;ACC GETS CLOBBERED
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
L31DPI: MOVX A,@DPTR ;GET THE HIGH BYTE
|
L31DPI: MOVX A,@DPTR ;GET THE HIGH BYTE
|
MOV R3,A ;PUT IT IN THE REG
|
MOV R3,A ;PUT IT IN THE REG
|
INC DPTR ;BUMP THE POINTER
|
INC DPTR ;BUMP THE POINTER
|
MOVX A,@DPTR ;GET THE NEXT BYTE
|
MOVX A,@DPTR ;GET THE NEXT BYTE
|
MOV R1,A ;SAVE IT
|
MOV R1,A ;SAVE IT
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;DECDP - DECREMENT THE DATA POINTER - USED TO SAVE SPACE
|
;DECDP - DECREMENT THE DATA POINTER - USED TO SAVE SPACE
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
DECDP2: ACALL DECDP
|
DECDP2: ACALL DECDP
|
;
|
;
|
DECDP: XCH A,DPL ;GET DPL
|
DECDP: XCH A,DPL ;GET DPL
|
JNZ DECDP1 ;BUMP IF ZERO
|
JNZ DECDP1 ;BUMP IF ZERO
|
DEC DPH
|
DEC DPH
|
DECDP1: DEC A ;DECREMENT IT
|
DECDP1: DEC A ;DECREMENT IT
|
XCH A,DPL ;GET A BACK
|
XCH A,DPL ;GET A BACK
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;DCMPX - DOUBLE COMPARE - COMPARE (DPTR) TO R3:R1
|
;DCMPX - DOUBLE COMPARE - COMPARE (DPTR) TO R3:R1
|
;R3:R1 - (DPTR) = SET CARRY FLAG
|
;R3:R1 - (DPTR) = SET CARRY FLAG
|
;
|
;
|
;IF R3:R1 > (DPTR) THEN C = 0
|
;IF R3:R1 > (DPTR) THEN C = 0
|
;IF R3:R1 < (DPTR) THEN C = 1
|
;IF R3:R1 < (DPTR) THEN C = 1
|
;IF R3:R1 = (DPTR) THEN C = 0
|
;IF R3:R1 = (DPTR) THEN C = 0
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
DCMPX: CLR UBIT ;ASSUME NOT EQUAL
|
DCMPX: CLR UBIT ;ASSUME NOT EQUAL
|
MOVX A,@DPTR ;GET THE BYTE
|
MOVX A,@DPTR ;GET THE BYTE
|
CJNE A,R3B0,D1 ;IF A IS GREATER THAN R3 THEN NO CARRY
|
CJNE A,R3B0,D1 ;IF A IS GREATER THAN R3 THEN NO CARRY
|
;WHICH IS R3<@DPTR = NO CARRY AND
|
;WHICH IS R3<@DPTR = NO CARRY AND
|
;R3>@DPTR CARRY IS SET
|
;R3>@DPTR CARRY IS SET
|
INC DPTR ;BUMP THE DATA POINTER
|
INC DPTR ;BUMP THE DATA POINTER
|
MOVX A,@DPTR ;GET THE BYTE
|
MOVX A,@DPTR ;GET THE BYTE
|
ACALL DECDP ;PUT DPTR BACK
|
ACALL DECDP ;PUT DPTR BACK
|
CJNE A,R1B0,D1 ;DO THE COMPARE
|
CJNE A,R1B0,D1 ;DO THE COMPARE
|
CPL C ;FLIP CARRY
|
CPL C ;FLIP CARRY
|
;
|
;
|
CPL UBIT ;SET IT
|
CPL UBIT ;SET IT
|
D1: CPL C ;GET THE CARRY RIGHT
|
D1: CPL C ;GET THE CARRY RIGHT
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; ADDPTR - Add acc to the dptr
|
; ADDPTR - Add acc to the dptr
|
;
|
;
|
; acc gets wasted
|
; acc gets wasted
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ADDPTR: ADD A,DPL ;ADD THE ACC TO DPL
|
ADDPTR: ADD A,DPL ;ADD THE ACC TO DPL
|
MOV DPL,A ;PUT IT IN DPL
|
MOV DPL,A ;PUT IT IN DPL
|
JNC ADDPTR1 ;JUMP IF NO CARRY
|
JNC ADDPTR1 ;JUMP IF NO CARRY
|
INC DPH ;BUMP DPH
|
INC DPH ;BUMP DPH
|
ADDPTR1:RET ;EXIT
|
ADDPTR1:RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
LCLR: ; Set up the storage allocation
|
LCLR: ; Set up the storage allocation
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL ICLR ;CLEAR THE INTERRUPTS
|
ACALL ICLR ;CLEAR THE INTERRUPTS
|
ACALL G4 ;PUT END ADDRESS INTO DPTR
|
ACALL G4 ;PUT END ADDRESS INTO DPTR
|
MOV A,#6 ;ADJUST MATRIX SPACE
|
MOV A,#6 ;ADJUST MATRIX SPACE
|
ACALL ADDPTR ;ADD FOR PROPER BOUNDS
|
ACALL ADDPTR ;ADD FOR PROPER BOUNDS
|
ACALL X31DP ;PUT MATRIX BOUNDS IN R3:R1
|
ACALL X31DP ;PUT MATRIX BOUNDS IN R3:R1
|
MOV DPTR,#MT_ALL ;SAVE R3:R1 IN MATRIX FREE SPACE
|
MOV DPTR,#MT_ALL ;SAVE R3:R1 IN MATRIX FREE SPACE
|
ACALL S31DP ;DPTR POINTS TO MEMTOP
|
ACALL S31DP ;DPTR POINTS TO MEMTOP
|
ACALL L31DPI ;LOAD MEMTOP INTO R3:R1
|
ACALL L31DPI ;LOAD MEMTOP INTO R3:R1
|
MOV DPTR,#STR_AL ;GET MEMORY ALLOCATED FOR STRINGS
|
MOV DPTR,#STR_AL ;GET MEMORY ALLOCATED FOR STRINGS
|
ACALL LDPTRI
|
ACALL LDPTRI
|
CALL DUBSUB ;R3:R1 = MEMTOP - STRING ALLOCATION
|
CALL DUBSUB ;R3:R1 = MEMTOP - STRING ALLOCATION
|
MOV DPTR,#VARTOP ;SAVE R3:R1 IN VARTOP
|
MOV DPTR,#VARTOP ;SAVE R3:R1 IN VARTOP
|
;
|
;
|
; FALL THRU TO S31DP2
|
; FALL THRU TO S31DP2
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;S31DP - STORE R3 INTO (DPTR) AND R1 INTO (DPTR+1)
|
;S31DP - STORE R3 INTO (DPTR) AND R1 INTO (DPTR+1)
|
;
|
;
|
;ACC GETS CLOBBERED
|
;ACC GETS CLOBBERED
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
S31DP2: ACALL S31DP ;DO IT TWICE
|
S31DP2: ACALL S31DP ;DO IT TWICE
|
;
|
;
|
S31DP: MOV A,R3 ;GET R3 INTO ACC
|
S31DP: MOV A,R3 ;GET R3 INTO ACC
|
MOVX @DPTR,A ;STORE IT
|
MOVX @DPTR,A ;STORE IT
|
INC DPTR ;BUMP DPTR
|
INC DPTR ;BUMP DPTR
|
MOV A,R1 ;GET R1
|
MOV A,R1 ;GET R1
|
MOVX @DPTR,A ;STORE IT
|
MOVX @DPTR,A ;STORE IT
|
INC DPTR ;BUMP IT AGAIN TO SAVE PROGRAM SPACE
|
INC DPTR ;BUMP IT AGAIN TO SAVE PROGRAM SPACE
|
RET ;GO BACK
|
RET ;GO BACK
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
STRING: ; Allocate memory for strings
|
STRING: ; Allocate memory for strings
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LCALL TWO ;R3:R1 = NUMBER, R2:R0 = LEN
|
LCALL TWO ;R3:R1 = NUMBER, R2:R0 = LEN
|
MOV DPTR,#STR_AL ;SAVE STRING ALLOCATION
|
MOV DPTR,#STR_AL ;SAVE STRING ALLOCATION
|
ACALL S31DP
|
ACALL S31DP
|
INC R6 ;BUMP
|
INC R6 ;BUMP
|
MOV S_LEN,R6 ;SAVE STRING LENGTH
|
MOV S_LEN,R6 ;SAVE STRING LENGTH
|
AJMP RCLEAR ;CLEAR AND SET IT UP
|
AJMP RCLEAR ;CLEAR AND SET IT UP
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; F_VAR - Find the variable in symbol table
|
; F_VAR - Find the variable in symbol table
|
; R7:R6 contain the variable name
|
; R7:R6 contain the variable name
|
; If not found create a zero entry and set the carry
|
; If not found create a zero entry and set the carry
|
; R2:R0 has the address of variable on return
|
; R2:R0 has the address of variable on return
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
F_VAR: MOV DPTR,#VARTOP ;PUT VARTOP IN DPTR
|
F_VAR: MOV DPTR,#VARTOP ;PUT VARTOP IN DPTR
|
ACALL LDPTRI
|
ACALL LDPTRI
|
ACALL DECDP2 ;ADJUST DPTR FOR LOOKUP
|
ACALL DECDP2 ;ADJUST DPTR FOR LOOKUP
|
;
|
;
|
F_VAR0: MOVX A,@DPTR ;LOAD THE VARIABLE
|
F_VAR0: MOVX A,@DPTR ;LOAD THE VARIABLE
|
JZ F_VAR2 ;TEST IF AT THE END OF THE TABLE
|
JZ F_VAR2 ;TEST IF AT THE END OF THE TABLE
|
INC DPTR ;BUMP FOR NEXT BYTE
|
INC DPTR ;BUMP FOR NEXT BYTE
|
CJNE A,R7B0,F_VAR1 ;SEE IF MATCH
|
CJNE A,R7B0,F_VAR1 ;SEE IF MATCH
|
MOVX A,@DPTR ;LOAD THE NAME
|
MOVX A,@DPTR ;LOAD THE NAME
|
CJNE A,R6B0,F_VAR1
|
CJNE A,R6B0,F_VAR1
|
;
|
;
|
; Found the variable now adjust and put in R2:R0
|
; Found the variable now adjust and put in R2:R0
|
;
|
;
|
DLD: MOV A,DPL ;R2:R0 = DPTR-2
|
DLD: MOV A,DPL ;R2:R0 = DPTR-2
|
SUBB A,#2
|
SUBB A,#2
|
MOV R0,A
|
MOV R0,A
|
MOV A,DPH
|
MOV A,DPH
|
SUBB A,#0 ;CARRY IS CLEARED
|
SUBB A,#0 ;CARRY IS CLEARED
|
MOV R2,A
|
MOV R2,A
|
RET
|
RET
|
;
|
;
|
F_VAR1: MOV A,DPL ;SUBTRACT THE STACK SIZE+ADJUST
|
F_VAR1: MOV A,DPL ;SUBTRACT THE STACK SIZE+ADJUST
|
CLR C
|
CLR C
|
SUBB A,#STESIZ
|
SUBB A,#STESIZ
|
MOV DPL,A ;RESTORE DPL
|
MOV DPL,A ;RESTORE DPL
|
JNC F_VAR0
|
JNC F_VAR0
|
DEC DPH
|
DEC DPH
|
SJMP F_VAR0 ;CONTINUE COMPARE
|
SJMP F_VAR0 ;CONTINUE COMPARE
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
; Add the entry to the symbol table
|
; Add the entry to the symbol table
|
;
|
;
|
F_VAR2: LCALL R76S ;SAVE R7 AND R6
|
F_VAR2: LCALL R76S ;SAVE R7 AND R6
|
CLR C
|
CLR C
|
ACALL DLD ;BUMP THE POINTER TO GET ENTRY ADDRESS
|
ACALL DLD ;BUMP THE POINTER TO GET ENTRY ADDRESS
|
;
|
;
|
; Adjust pointer and save storage allocation
|
; Adjust pointer and save storage allocation
|
; and make sure we aren't wiping anything out
|
; and make sure we aren't wiping anything out
|
; First calculate new storage allocation
|
; First calculate new storage allocation
|
;
|
;
|
MOV A,R0
|
MOV A,R0
|
SUBB A,#STESIZ-3 ;NEED THIS MUCH RAM
|
SUBB A,#STESIZ-3 ;NEED THIS MUCH RAM
|
MOV R1,A
|
MOV R1,A
|
MOV A,R2
|
MOV A,R2
|
SUBB A,#0
|
SUBB A,#0
|
MOV R3,A
|
MOV R3,A
|
;
|
;
|
; Now save the new storage allocation
|
; Now save the new storage allocation
|
;
|
;
|
MOV DPTR,#ST_ALL
|
MOV DPTR,#ST_ALL
|
CALL S31DP ;SAVE STORAGE ALLOCATION
|
CALL S31DP ;SAVE STORAGE ALLOCATION
|
;
|
;
|
; Now make sure we didn't blow it, by wiping out MT_ALL
|
; Now make sure we didn't blow it, by wiping out MT_ALL
|
;
|
;
|
ACALL DCMPX ;COMPARE STORAGE ALLOCATION
|
ACALL DCMPX ;COMPARE STORAGE ALLOCATION
|
JC CCLR3 ;ERROR IF CARRY
|
JC CCLR3 ;ERROR IF CARRY
|
SETB C ;DID NOT FIND ENTRY
|
SETB C ;DID NOT FIND ENTRY
|
RET ;EXIT IF TEST IS OK
|
RET ;EXIT IF TEST IS OK
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; Command action routine - NEW
|
; Command action routine - NEW
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CNEW: MOV DPTR,#PSTART ;SAVE THE START OF PROGRAM
|
CNEW: MOV DPTR,#PSTART ;SAVE THE START OF PROGRAM
|
MOV A,#EOF ;END OF FILE
|
MOV A,#EOF ;END OF FILE
|
MOVX @DPTR,A ;PUT IT IN MEMORY
|
MOVX @DPTR,A ;PUT IT IN MEMORY
|
;
|
;
|
; falls thru
|
; falls thru
|
;
|
;
|
;*****************************************************************
|
;*****************************************************************
|
;
|
;
|
; The statement action routine - CLEAR
|
; The statement action routine - CLEAR
|
;
|
;
|
;*****************************************************************
|
;*****************************************************************
|
;
|
;
|
CNEW1: CLR LINEB ;SET UP FOR RUN AND GOTO
|
CNEW1: CLR LINEB ;SET UP FOR RUN AND GOTO
|
;
|
;
|
RCLEAR: ACALL LCLR ;CLEAR THE INTERRUPTS, SET UP MATRICES
|
RCLEAR: ACALL LCLR ;CLEAR THE INTERRUPTS, SET UP MATRICES
|
MOV DPTR,#MEMTOP ;PUT MEMTOP IN R3:R1
|
MOV DPTR,#MEMTOP ;PUT MEMTOP IN R3:R1
|
ACALL L31DPI
|
ACALL L31DPI
|
ACALL G4 ;DPTR GETS END ADDRESS
|
ACALL G4 ;DPTR GETS END ADDRESS
|
ACALL CL_1 ;CLEAR THE MEMORY
|
ACALL CL_1 ;CLEAR THE MEMORY
|
;
|
;
|
RC1: MOV DPTR,#STACKTP ;POINT AT CONTROL STACK TOP
|
RC1: MOV DPTR,#STACKTP ;POINT AT CONTROL STACK TOP
|
CLR A ;CONTROL UNDERFLOW
|
CLR A ;CONTROL UNDERFLOW
|
;
|
;
|
RC2: MOVX @DPTR,A ;SAVE IN MEMORY
|
RC2: MOVX @DPTR,A ;SAVE IN MEMORY
|
MOV CSTKA,#STACKTP
|
MOV CSTKA,#STACKTP
|
MOV ASTKA,#STACKTP
|
MOV ASTKA,#STACKTP
|
CLR CONB ;CAN'T CONTINUE
|
CLR CONB ;CAN'T CONTINUE
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; Loop until the memory is cleared
|
; Loop until the memory is cleared
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CL_1: INC DPTR ;BUMP MEMORY POINTER
|
CL_1: INC DPTR ;BUMP MEMORY POINTER
|
CLR A ;CLEAR THE MEMORY
|
CLR A ;CLEAR THE MEMORY
|
MOVX @DPTR,A ;CLEAR THE RAM
|
MOVX @DPTR,A ;CLEAR THE RAM
|
MOVX A,@DPTR ;READ IT
|
MOVX A,@DPTR ;READ IT
|
JNZ CCLR3 ;MAKE SURE IT IS CLEARED
|
JNZ CCLR3 ;MAKE SURE IT IS CLEARED
|
MOV A,R3 ;GET POINTER FOR COMPARE
|
MOV A,R3 ;GET POINTER FOR COMPARE
|
CJNE A,DPH,CL_1 ;SEE TO LOOP
|
CJNE A,DPH,CL_1 ;SEE TO LOOP
|
MOV A,R1 ;NOW TEST LOW BYTE
|
MOV A,R1 ;NOW TEST LOW BYTE
|
CJNE A,DPL,CL_1
|
CJNE A,DPL,CL_1
|
;
|
;
|
CL_2: RET
|
CL_2: RET
|
;
|
;
|
CCLR3: JMP TB ;ALLOCATED MEMORY DOESN'T EXSIST
|
CCLR3: JMP TB ;ALLOCATED MEMORY DOESN'T EXSIST
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
SCLR: ;Entry point for clear return
|
SCLR: ;Entry point for clear return
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
CALL DELTST ;TEST FOR A CR
|
CALL DELTST ;TEST FOR A CR
|
JNC RCLEAR
|
JNC RCLEAR
|
CALL GCI1 ;BUMP THE TEST POINTER
|
CALL GCI1 ;BUMP THE TEST POINTER
|
CJNE A,#'I',RC1 ;SEE IF I, ELSE RESET THE STACK
|
CJNE A,#'I',RC1 ;SEE IF I, ELSE RESET THE STACK
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ICLR: ; Clear interrupts and system garbage
|
ICLR: ; Clear interrupts and system garbage
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
JNB INTBIT,ICLR1 ;SEE IF BASIC HAS INTERRUPTS
|
JNB INTBIT,ICLR1 ;SEE IF BASIC HAS INTERRUPTS
|
CLR EX1 ;IF SO, CLEAR INTERRUPTS
|
CLR EX1 ;IF SO, CLEAR INTERRUPTS
|
ICLR1: ANL 34,#00100000B ;SET INTERRUPTS + CONTINUE
|
ICLR1: ANL 34,#00100000B ;SET INTERRUPTS + CONTINUE
|
RETI
|
RETI
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;OUTPUT ROUTINES
|
;OUTPUT ROUTINES
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CRLF2: ACALL CRLF ;DO TWO CRLF'S
|
CRLF2: ACALL CRLF ;DO TWO CRLF'S
|
;
|
;
|
CRLF: MOV R5,#CR ;LOAD THE CR
|
CRLF: MOV R5,#CR ;LOAD THE CR
|
ACALL TEROT ;CALL TERMINAL OUT
|
ACALL TEROT ;CALL TERMINAL OUT
|
MOV R5,#LF ;LOAD THE LF
|
MOV R5,#LF ;LOAD THE LF
|
AJMP TEROT ;OUTPUT IT AND RETURN
|
AJMP TEROT ;OUTPUT IT AND RETURN
|
;
|
;
|
;PRINT THE MESSAGE ADDRESSED IN ROM OR RAM BY THE DPTR
|
;PRINT THE MESSAGE ADDRESSED IN ROM OR RAM BY THE DPTR
|
;ENDS WITH THE CHARACTER IN R4
|
;ENDS WITH THE CHARACTER IN R4
|
;DPTR HAS THE ADDRESS OF THE TERMINATOR
|
;DPTR HAS THE ADDRESS OF THE TERMINATOR
|
;
|
;
|
CRP: ACALL CRLF ;DO A CR THEN PRINT ROM
|
CRP: ACALL CRLF ;DO A CR THEN PRINT ROM
|
;
|
;
|
ROM_P: CLR A ;CLEAR A FOR LOOKUP
|
ROM_P: CLR A ;CLEAR A FOR LOOKUP
|
MOVC A,@A+DPTR ;GET THE CHARACTER
|
MOVC A,@A+DPTR ;GET THE CHARACTER
|
CLR ACC.7 ;CLEAR MS BIT
|
CLR ACC.7 ;CLEAR MS BIT
|
CJNE A,#'"',ROM_P1 ;EXIT IF TERMINATOR
|
CJNE A,#'"',ROM_P1 ;EXIT IF TERMINATOR
|
RET
|
RET
|
ROM_P1: SETB C0ORX1
|
ROM_P1: SETB C0ORX1
|
;
|
;
|
PN1: MOV R5,A ;OUTPUT THE CHARACTER
|
PN1: MOV R5,A ;OUTPUT THE CHARACTER
|
ACALL TEROT
|
ACALL TEROT
|
INC DPTR ;BUMP THE POINTER
|
INC DPTR ;BUMP THE POINTER
|
SJMP PN0
|
SJMP PN0
|
;
|
;
|
UPRNT: ACALL X31DP
|
UPRNT: ACALL X31DP
|
;
|
;
|
PRNTCR: MOV R4,#CR ;OUTPUT UNTIL A CR
|
PRNTCR: MOV R4,#CR ;OUTPUT UNTIL A CR
|
;
|
;
|
PN0: JBC C0ORX1,ROM_P
|
PN0: JBC C0ORX1,ROM_P
|
MOVX A,@DPTR ;GET THE RAM BYTE
|
MOVX A,@DPTR ;GET THE RAM BYTE
|
JZ PN01
|
JZ PN01
|
CJNE A,R4B0,PN02 ;SEE IF THE SAME AS TERMINATOR
|
CJNE A,R4B0,PN02 ;SEE IF THE SAME AS TERMINATOR
|
PN01: RET ;EXIT IF THE SAME
|
PN01: RET ;EXIT IF THE SAME
|
PN02: CJNE A,#CR,PN1 ;NEVER PRINT A CR IN THIS ROUTINE
|
PN02: CJNE A,#CR,PN1 ;NEVER PRINT A CR IN THIS ROUTINE
|
LJMP E1XX ;BAD SYNTAX
|
LJMP E1XX ;BAD SYNTAX
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; INLINE - Input a line to IBUF, exit when a CR is received
|
; INLINE - Input a line to IBUF, exit when a CR is received
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
INL2: CJNE A,#CNTRLD,INL2B ;SEE IF A CONTROL D
|
INL2: CJNE A,#CNTRLD,INL2B ;SEE IF A CONTROL D
|
;
|
;
|
INL0: ACALL CRLF ;DO A CR
|
INL0: ACALL CRLF ;DO A CR
|
;
|
;
|
INLINE: MOV P2,#HIGH IBUF ;IBUF IS IN THE ZERO PAGE
|
INLINE: MOV P2,#HIGH IBUF ;IBUF IS IN THE ZERO PAGE
|
MOV R0,#LOW IBUF ;POINT AT THE INPUT BUFFER
|
MOV R0,#LOW IBUF ;POINT AT THE INPUT BUFFER
|
;
|
;
|
INL1: ACALL INCHAR ;GET A CHARACTER
|
INL1: ACALL INCHAR ;GET A CHARACTER
|
MOV R5,A ;SAVE IN R5 FOR OUTPUT
|
MOV R5,A ;SAVE IN R5 FOR OUTPUT
|
CJNE A,#7FH,INL2 ;SEE IF A DELETE CHARACTER
|
CJNE A,#7FH,INL2 ;SEE IF A DELETE CHARACTER
|
CJNE R0,#LOW IBUF,INL6
|
CJNE R0,#LOW IBUF,INL6
|
INL11: MOV R5,#BELL ;OUTPUT A BELL
|
INL11: MOV R5,#BELL ;OUTPUT A BELL
|
;
|
;
|
INLX: ACALL TEROT ;OUTPUT CHARACTER
|
INLX: ACALL TEROT ;OUTPUT CHARACTER
|
SJMP INL1 ;DO IT AGAIN
|
SJMP INL1 ;DO IT AGAIN
|
;
|
;
|
INL2B: MOVX @R0,A ;SAVE THE CHARACTER
|
INL2B: MOVX @R0,A ;SAVE THE CHARACTER
|
CJNE A,#CR,INL2B1 ;IS IT A CR
|
CJNE A,#CR,INL2B1 ;IS IT A CR
|
AJMP CRLF ;OUTPUT A CRLF AND EXIT
|
AJMP CRLF ;OUTPUT A CRLF AND EXIT
|
INL2B1: CJNE A,#20H,INL2B2
|
INL2B1: CJNE A,#20H,INL2B2
|
INL2B2: JC INLX ;ONLY ECHO CONTROL CHARACTERS
|
INL2B2: JC INLX ;ONLY ECHO CONTROL CHARACTERS
|
INC R0 ;BUMP THE POINTER
|
INC R0 ;BUMP THE POINTER
|
CJNE R0,#IBUF+79,INLX
|
CJNE R0,#IBUF+79,INLX
|
DEC R0 ;FORCE 79
|
DEC R0 ;FORCE 79
|
SJMP INL11 ;OUTPUT A BELL
|
SJMP INL11 ;OUTPUT A BELL
|
;
|
;
|
INL6: DEC R0 ;DEC THE RAM POINTER
|
INL6: DEC R0 ;DEC THE RAM POINTER
|
MOV R5,#BS ;OUTPUT A BACK SPACE
|
MOV R5,#BS ;OUTPUT A BACK SPACE
|
ACALL TEROT
|
ACALL TEROT
|
ACALL STEROT ;OUTPUT A SPACE
|
ACALL STEROT ;OUTPUT A SPACE
|
MOV R5,#BS ;ANOTHER BACK SPACE
|
MOV R5,#BS ;ANOTHER BACK SPACE
|
SJMP INLX ;OUTPUT IT
|
SJMP INLX ;OUTPUT IT
|
;
|
;
|
PTIME: DB 128-2 ; PROM PROGRAMMER TIMER
|
PTIME: DB 128-2 ; PROM PROGRAMMER TIMER
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 50H
|
DB 50H
|
DB 67H
|
DB 67H
|
DB 41H
|
DB 41H
|
;
|
;
|
$EJECT
|
$EJECT
|
;$INCLUDE(:F2:BAS52.OUT)
|
;$INCLUDE(:F2:BAS52.OUT)
|
;BEGINNING
|
;BEGINNING
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; TEROT - Output a character to the system console
|
; TEROT - Output a character to the system console
|
; update PHEAD position.
|
; update PHEAD position.
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
STEROT: MOV R5,#' ' ;OUTPUT A SPACE
|
STEROT: MOV R5,#' ' ;OUTPUT A SPACE
|
;
|
;
|
TEROT: PUSH ACC ;SAVE THE ACCUMULATOR
|
TEROT: PUSH ACC ;SAVE THE ACCUMULATOR
|
PUSH DPH ;SAVE THE DPTR
|
PUSH DPH ;SAVE THE DPTR
|
PUSH DPL
|
PUSH DPL
|
TEROT01:JNB CNT_S,TEROT02 ;WAIT FOR A CONTROL Q
|
TEROT01:JNB CNT_S,TEROT02 ;WAIT FOR A CONTROL Q
|
ACALL BCK ;GET SERIAL STATUS
|
ACALL BCK ;GET SERIAL STATUS
|
SJMP TEROT01
|
SJMP TEROT01
|
TEROT02:MOV A,R5 ;PUT OUTPUT BYTE IN A
|
TEROT02:MOV A,R5 ;PUT OUTPUT BYTE IN A
|
JNB BO,TEROT03 ;CHECK FOR MONITOR
|
JNB BO,TEROT03 ;CHECK FOR MONITOR
|
LCALL 2040H ;DO THE MONITOR
|
LCALL 2040H ;DO THE MONITOR
|
AJMP TEROT1 ;CLEAN UP
|
AJMP TEROT1 ;CLEAN UP
|
TEROT03:JNB COUB,TEROT04 ;SEE IF USER WANTS OUTPUT
|
TEROT03:JNB COUB,TEROT04 ;SEE IF USER WANTS OUTPUT
|
LCALL 4030H
|
LCALL 4030H
|
AJMP TEROT1
|
AJMP TEROT1
|
TEROT04:JNB UPB,T_1 ;NO AT IF NO XBIT
|
TEROT04:JNB UPB,T_1 ;NO AT IF NO XBIT
|
JNB LPB,T_1 ;AT PRINT
|
JNB LPB,T_1 ;AT PRINT
|
LCALL 403CH ;CALL AT LOCATION
|
LCALL 403CH ;CALL AT LOCATION
|
AJMP TEROT1 ;FINISH OFF OUTPUT
|
AJMP TEROT1 ;FINISH OFF OUTPUT
|
;
|
;
|
T_1: JNB COB,TXX ;SEE IF LIST SET
|
T_1: JNB COB,TXX ;SEE IF LIST SET
|
MOV DPTR,#SPV ;LOAD BAUD RATE
|
MOV DPTR,#SPV ;LOAD BAUD RATE
|
ACALL LD_T
|
ACALL LD_T
|
CLR LP ;OUTPUT START BIT
|
CLR LP ;OUTPUT START BIT
|
ACALL TIMER_LOAD ;LOAD AND START THE TIMER
|
ACALL TIMER_LOAD ;LOAD AND START THE TIMER
|
MOV A,R5 ;GET THE OUTPUT BYTE
|
MOV A,R5 ;GET THE OUTPUT BYTE
|
SETB C ;SET CARRY FOR LAST OUTPUT
|
SETB C ;SET CARRY FOR LAST OUTPUT
|
MOV R5,#9 ;LOAD TIMER COUNTDOWN
|
MOV R5,#9 ;LOAD TIMER COUNTDOWN
|
;
|
;
|
LTOUT1: RRC A ;ROTATE A
|
LTOUT1: RRC A ;ROTATE A
|
JNB TF1,$ ;WAIT TILL TIMER READY
|
JNB TF1,$ ;WAIT TILL TIMER READY
|
MOV LP,C ;OUTPUT THE BIT
|
MOV LP,C ;OUTPUT THE BIT
|
ACALL TIMER_LOAD ;DO THE NEXT BIT
|
ACALL TIMER_LOAD ;DO THE NEXT BIT
|
DJNZ R5,LTOUT1 ;LOOP UNTIL DONE
|
DJNZ R5,LTOUT1 ;LOOP UNTIL DONE
|
JNB TF1,$ ;FIRST STOP BIT
|
JNB TF1,$ ;FIRST STOP BIT
|
ACALL TIMER_LOAD
|
ACALL TIMER_LOAD
|
JNB TF1,$ ;SECOND STOP BIT
|
JNB TF1,$ ;SECOND STOP BIT
|
MOV R5,A ;RESTORE R5
|
MOV R5,A ;RESTORE R5
|
SJMP TEROT1 ;BACK TO TEROT
|
SJMP TEROT1 ;BACK TO TEROT
|
;
|
;
|
$EJECT
|
$EJECT
|
TXX: JNB TI,$ ;WAIT FOR TRANSMIT READY
|
TXX: JNB TI,$ ;WAIT FOR TRANSMIT READY
|
CLR TI
|
CLR TI
|
MOV SBUF,R5 ;SEND OUT THE CHARACTER
|
MOV SBUF,R5 ;SEND OUT THE CHARACTER
|
;
|
;
|
TEROT1: CJNE R5,#CR,TEROT11 ;SEE IF A CR
|
TEROT1: CJNE R5,#CR,TEROT11 ;SEE IF A CR
|
MOV PHEAD,#00H ;IF A CR, RESET PHEAD AND
|
MOV PHEAD,#00H ;IF A CR, RESET PHEAD AND
|
;
|
;
|
TEROT11:CJNE R5,#LF,NLC ;SEE IF A LF
|
TEROT11:CJNE R5,#LF,NLC ;SEE IF A LF
|
MOV A,NULLCT ;GET THE NULL COUNT
|
MOV A,NULLCT ;GET THE NULL COUNT
|
JZ NLC ;NO NULLS IF ZERO
|
JZ NLC ;NO NULLS IF ZERO
|
;
|
;
|
TEROT2: MOV R5,#NULL ;PUT THE NULL IN THE OUTPUT REGISTER
|
TEROT2: MOV R5,#NULL ;PUT THE NULL IN THE OUTPUT REGISTER
|
ACALL TEROT ;OUTPUT THE NULL
|
ACALL TEROT ;OUTPUT THE NULL
|
DEC A ;DECREMENT NULL COUNT
|
DEC A ;DECREMENT NULL COUNT
|
JNZ TEROT2 ;LOOP UNTIL DONE
|
JNZ TEROT2 ;LOOP UNTIL DONE
|
;
|
;
|
NLC: CJNE R5,#BS,NLC1 ;DEC PHEAD IF A BACKSPACE
|
NLC: CJNE R5,#BS,NLC1 ;DEC PHEAD IF A BACKSPACE
|
DEC PHEAD
|
DEC PHEAD
|
NLC1: CJNE R5,#20H,NLC2 ;IS IT A PRINTABLE CHARACTER?
|
NLC1: CJNE R5,#20H,NLC2 ;IS IT A PRINTABLE CHARACTER?
|
NLC2: JC NLC3 ;DON'T INCREMENT PHEAD IF NOT PRINTABLE
|
NLC2: JC NLC3 ;DON'T INCREMENT PHEAD IF NOT PRINTABLE
|
INC PHEAD ;BUMP PRINT HEAD
|
INC PHEAD ;BUMP PRINT HEAD
|
NLC3: POP DPL ;RESTORE DPTR
|
NLC3: POP DPL ;RESTORE DPTR
|
POP DPH
|
POP DPH
|
POP ACC ;RESTORE ACC
|
POP ACC ;RESTORE ACC
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
|
|
;END
|
;END
|
;$INCLUDE(:F2:BAS52.OUT)
|
;$INCLUDE(:F2:BAS52.OUT)
|
;
|
;
|
BCK: ACALL CSTS ;CHECK STATUS
|
BCK: ACALL CSTS ;CHECK STATUS
|
JNC CI_RET1 ;EXIT IF NO CHARACTER
|
JNC CI_RET1 ;EXIT IF NO CHARACTER
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;INPUTS A CHARACTER FROM THE SYSTEM CONSOLE.
|
;INPUTS A CHARACTER FROM THE SYSTEM CONSOLE.
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
INCHAR: JNB BI,INCHAR1 ;CHECK FOR MONITOR (BUBBLE)
|
INCHAR: JNB BI,INCHAR1 ;CHECK FOR MONITOR (BUBBLE)
|
LCALL 2060H
|
LCALL 2060H
|
SJMP INCH1
|
SJMP INCH1
|
INCHAR1:JNB CIUB,INCHAR2 ;CHECK FOR USER
|
INCHAR1:JNB CIUB,INCHAR2 ;CHECK FOR USER
|
LCALL 4033H
|
LCALL 4033H
|
SJMP INCH1
|
SJMP INCH1
|
INCHAR2:JNB RI,$ ;WAIT FOR RECEIVER READY.
|
INCHAR2:JNB RI,$ ;WAIT FOR RECEIVER READY.
|
MOV A,SBUF
|
MOV A,SBUF
|
CLR RI ;RESET READY
|
CLR RI ;RESET READY
|
CLR ACC.7 ;NO BIT 7
|
CLR ACC.7 ;NO BIT 7
|
;
|
;
|
INCH1: CJNE A,#13H,INCH11
|
INCH1: CJNE A,#13H,INCH11
|
SETB CNT_S
|
SETB CNT_S
|
INCH11: CJNE A,#11H,INCH12
|
INCH11: CJNE A,#11H,INCH12
|
CLR CNT_S
|
CLR CNT_S
|
INCH12: CJNE A,#CNTRLC,INCH13
|
INCH12: CJNE A,#CNTRLC,INCH13
|
JNB NO_C,C_EX ;TRAP NO CONTROL C
|
JNB NO_C,C_EX ;TRAP NO CONTROL C
|
RET
|
RET
|
;
|
;
|
INCH13: CLR JKBIT
|
INCH13: CLR JKBIT
|
CJNE A,#17H,CI_RET ;CONTROL W
|
CJNE A,#17H,CI_RET ;CONTROL W
|
SETB JKBIT
|
SETB JKBIT
|
;
|
;
|
CI_RET: SETB C ;CARRY SET IF A CHARACTER
|
CI_RET: SETB C ;CARRY SET IF A CHARACTER
|
CI_RET1:RET ;EXIT
|
CI_RET1:RET ;EXIT
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
;RROM - The Statement Action Routine RROM
|
;RROM - The Statement Action Routine RROM
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
RROM: SETB INBIT ;SO NO ERRORS
|
RROM: SETB INBIT ;SO NO ERRORS
|
ACALL RO1 ;FIND THE LINE NUMBER
|
ACALL RO1 ;FIND THE LINE NUMBER
|
JBC INBIT,CRUN
|
JBC INBIT,CRUN
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CSTS: ; RETURNS CARRY = 1 IF THERE IS A CHARACTER WAITING FROM
|
CSTS: ; RETURNS CARRY = 1 IF THERE IS A CHARACTER WAITING FROM
|
; THE SYSTEM CONSOLE. IF NO CHARACTER THE READY CHARACTER
|
; THE SYSTEM CONSOLE. IF NO CHARACTER THE READY CHARACTER
|
; WILL BE CLEARED
|
; WILL BE CLEARED
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
JNB BI,CSTS1 ;BUBBLE STATUS
|
JNB BI,CSTS1 ;BUBBLE STATUS
|
LJMP 2068H
|
LJMP 2068H
|
CSTS1: JNB CIUB,CSTS2 ;SEE IF EXTERNAL CONSOLE
|
CSTS1: JNB CIUB,CSTS2 ;SEE IF EXTERNAL CONSOLE
|
LJMP 4036H
|
LJMP 4036H
|
CSTS2: MOV C,RI
|
CSTS2: MOV C,RI
|
RET
|
RET
|
;
|
;
|
C_EX0: MOV DPTR,#WB ;EGO MESSAGE
|
C_EX0: MOV DPTR,#WB ;EGO MESSAGE
|
ACALL ROM_P
|
ACALL ROM_P
|
;
|
;
|
C_EX: CLR CNT_S ;NO OUTPUT STOP
|
C_EX: CLR CNT_S ;NO OUTPUT STOP
|
LCALL SPRINT1 ;ASSURE CONSOLE
|
LCALL SPRINT1 ;ASSURE CONSOLE
|
ACALL CRLF
|
ACALL CRLF
|
JBC JKBIT,C_EX0
|
JBC JKBIT,C_EX0
|
;
|
;
|
JNB DIRF,SSTOP0
|
JNB DIRF,SSTOP0
|
AJMP C_K ;CLEAR COB AND EXIT
|
AJMP C_K ;CLEAR COB AND EXIT
|
;
|
;
|
T_CMP: MOV A,TVH ;COMPARE TIMER TO SP_H AND SP_L
|
T_CMP: MOV A,TVH ;COMPARE TIMER TO SP_H AND SP_L
|
MOV R1,TVL
|
MOV R1,TVL
|
CJNE A,TVH,T_CMP
|
CJNE A,TVH,T_CMP
|
XCH A,R1
|
XCH A,R1
|
SUBB A,SP_L
|
SUBB A,SP_L
|
MOV A,R1
|
MOV A,R1
|
SUBB A,SP_H
|
SUBB A,SP_H
|
RET
|
RET
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
BR0: ; Trap the timer interrupt
|
BR0: ; Trap the timer interrupt
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
CALL T_CMP ;COMPARE TIMER
|
CALL T_CMP ;COMPARE TIMER
|
JC BCHR1 ;EXIT IF TEST FAILS
|
JC BCHR1 ;EXIT IF TEST FAILS
|
SETB OTI ;DOING THE TIMER INTERRUPT
|
SETB OTI ;DOING THE TIMER INTERRUPT
|
CLR OTS ;CLEAR TIMER BIT
|
CLR OTS ;CLEAR TIMER BIT
|
MOV C,INPROG ;SAVE IN PROGRESS
|
MOV C,INPROG ;SAVE IN PROGRESS
|
MOV ISAV,C
|
MOV ISAV,C
|
MOV DPTR,#TIV
|
MOV DPTR,#TIV
|
SJMP BR2
|
SJMP BR2
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The command action routine - RUN
|
; The command action routine - RUN
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CRUN: LCALL CNEW1 ;CLEAR THE STORAGE ARRAYS
|
CRUN: LCALL CNEW1 ;CLEAR THE STORAGE ARRAYS
|
ACALL SRESTR1 ;GET THE STARTING ADDRESS
|
ACALL SRESTR1 ;GET THE STARTING ADDRESS
|
ACALL B_C
|
ACALL B_C
|
JZ CMNDLK ;IF NULL GO TO COMMAND MODE
|
JZ CMNDLK ;IF NULL GO TO COMMAND MODE
|
;
|
;
|
ACALL T_DP
|
ACALL T_DP
|
ACALL B_TXA ;BUMP TO STARTING LINE
|
ACALL B_TXA ;BUMP TO STARTING LINE
|
;
|
;
|
CILOOP: ACALL SP0 ;DO A CR AND A LF
|
CILOOP: ACALL SP0 ;DO A CR AND A LF
|
CILOOP1:CLR DIRF ;NOT IN DIRECT MODE
|
CILOOP1:CLR DIRF ;NOT IN DIRECT MODE
|
;
|
;
|
;INTERPERTER DRIVER
|
;INTERPERTER DRIVER
|
;
|
;
|
ILOOP: MOV SP,SPSAV ;RESTORE THE STACK EACH TIME
|
ILOOP: MOV SP,SPSAV ;RESTORE THE STACK EACH TIME
|
JB DIRF,ILOOP1 ;NO INTERRUPTS IF IN DIRECT MODE
|
JB DIRF,ILOOP1 ;NO INTERRUPTS IF IN DIRECT MODE
|
MOV INTXAH,TXAH ;SAVE THE TEXT POINTER
|
MOV INTXAH,TXAH ;SAVE THE TEXT POINTER
|
MOV INTXAL,TXAL
|
MOV INTXAL,TXAL
|
ILOOP1: LCALL BCK ;GET CONSOLE STATUS
|
ILOOP1: LCALL BCK ;GET CONSOLE STATUS
|
JB DIRF,I_L ;DIRECT MODE
|
JB DIRF,I_L ;DIRECT MODE
|
ANL C,/GTRD ;SEE IF CHARACTER READY
|
ANL C,/GTRD ;SEE IF CHARACTER READY
|
JNC BCHR ;NO CHARACTER = NO CARRY
|
JNC BCHR ;NO CHARACTER = NO CARRY
|
;
|
;
|
; DO TRAP OPERATION
|
; DO TRAP OPERATION
|
;
|
;
|
MOV DPTR,#GTB ;SAVE TRAP CHARACTER
|
MOV DPTR,#GTB ;SAVE TRAP CHARACTER
|
MOVX @DPTR,A
|
MOVX @DPTR,A
|
SETB GTRD ;SAYS READ A BYTE
|
SETB GTRD ;SAYS READ A BYTE
|
;
|
;
|
BCHR: JB OTI,I_L ;EXIT IF TIMER INTERRUPT IN PROGRESS
|
BCHR: JB OTI,I_L ;EXIT IF TIMER INTERRUPT IN PROGRESS
|
JB OTS,BR0 ;TEST TIMER VALUE IF SET
|
JB OTS,BR0 ;TEST TIMER VALUE IF SET
|
BCHR1: JNB INTPEN,I_L ;SEE IF INTERRUPT PENDING
|
BCHR1: JNB INTPEN,I_L ;SEE IF INTERRUPT PENDING
|
JB INPROG,I_L ;DON'T DO IT AGAIN IF IN PROGRESS
|
JB INPROG,I_L ;DON'T DO IT AGAIN IF IN PROGRESS
|
MOV DPTR,#INTLOC ;POINT AT INTERRUPT LOCATION
|
MOV DPTR,#INTLOC ;POINT AT INTERRUPT LOCATION
|
;
|
;
|
BR2: MOV R4,#GTYPE ;SETUP FOR A FORCED GOSUB
|
BR2: MOV R4,#GTYPE ;SETUP FOR A FORCED GOSUB
|
ACALL SGS1 ;PUT TXA ON STACK
|
ACALL SGS1 ;PUT TXA ON STACK
|
SETB INPROG ;INTERRUPT IN PROGRESS
|
SETB INPROG ;INTERRUPT IN PROGRESS
|
;
|
;
|
ERL4: CALL L20DPI
|
ERL4: CALL L20DPI
|
AJMP D_L1 ;GET THE LINE NUMBER
|
AJMP D_L1 ;GET THE LINE NUMBER
|
;
|
;
|
I_L: ACALL ISTAT ;LOOP
|
I_L: ACALL ISTAT ;LOOP
|
ACALL CLN_UP ;FINISH IT OFF
|
ACALL CLN_UP ;FINISH IT OFF
|
JNC ILOOP ;LOOP ON THE DRIVER
|
JNC ILOOP ;LOOP ON THE DRIVER
|
JNB DIRF,CMNDLK ;CMND1 IF IN RUN MODE
|
JNB DIRF,CMNDLK ;CMND1 IF IN RUN MODE
|
LJMP CMNDR ;DON'T PRINT READY
|
LJMP CMNDR ;DON'T PRINT READY
|
;
|
;
|
CMNDLK: JMP CMND1 ;DONE
|
CMNDLK: JMP CMND1 ;DONE
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; The Statement Action Routine - STOP
|
; The Statement Action Routine - STOP
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
SSTOP: ACALL CLN_UP ;FINISH OFF THIS LINE
|
SSTOP: ACALL CLN_UP ;FINISH OFF THIS LINE
|
MOV INTXAH,TXAH ;SAVE TEXT POINTER FOR CONT
|
MOV INTXAH,TXAH ;SAVE TEXT POINTER FOR CONT
|
MOV INTXAL,TXAL
|
MOV INTXAL,TXAL
|
;
|
;
|
SSTOP0: SETB CONB ;CONTINUE WILL WORK
|
SSTOP0: SETB CONB ;CONTINUE WILL WORK
|
MOV DPTR,#STP ;PRINT THE STOP MESSAGE
|
MOV DPTR,#STP ;PRINT THE STOP MESSAGE
|
SETB STOPBIT ;SET FOR ERROR ROUTINE
|
SETB STOPBIT ;SET FOR ERROR ROUTINE
|
JMP ERRS ;JUMP TO ERROR ROUTINE
|
JMP ERRS ;JUMP TO ERROR ROUTINE
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; ITRAP - Trap special function register operators
|
; ITRAP - Trap special function register operators
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ITRAP: CJNE A,#TMR0,ITRAP1 ;TIMER 0
|
ITRAP: CJNE A,#TMR0,ITRAP1 ;TIMER 0
|
MOV TH0,R3
|
MOV TH0,R3
|
MOV TL0,R1
|
MOV TL0,R1
|
RET
|
RET
|
;
|
;
|
ITRAP1: CJNE A,#TMR1,ITRAP2 ;TIMER 1
|
ITRAP1: CJNE A,#TMR1,ITRAP2 ;TIMER 1
|
MOV TH1,R3
|
MOV TH1,R3
|
MOV TL1,R1
|
MOV TL1,R1
|
RET
|
RET
|
;
|
;
|
ITRAP2: CJNE A,#TMR2,ITRAP3 ;TIMER 2
|
ITRAP2: CJNE A,#TMR2,ITRAP3 ;TIMER 2
|
MOV TH2,R3
|
MOV TH2,R3
|
MOV TL2,R1
|
MOV TL2,R1
|
; DB 8BH ;MOV R3 DIRECT OP CODE
|
; DB 8BH ;MOV R3 DIRECT OP CODE
|
; DB 0CDH ;T2H LOCATION
|
; DB 0CDH ;T2H LOCATION
|
; DB 89H ;MOV R1 DIRECT OP CODE
|
; DB 89H ;MOV R1 DIRECT OP CODE
|
; DB 0CCH ;T2L LOCATION
|
; DB 0CCH ;T2L LOCATION
|
RET
|
RET
|
;
|
;
|
ITRAP3: CJNE A,#TRC2,RCL1 ;RCAP2 TOKEN
|
ITRAP3: CJNE A,#TRC2,RCL1 ;RCAP2 TOKEN
|
RCL: MOV RCAPH2,R3
|
RCL: MOV RCAPH2,R3
|
MOV RCAPL2,R1
|
MOV RCAPL2,R1
|
; DB 8BH ;MOV R3 DIRECT OP CODE
|
; DB 8BH ;MOV R3 DIRECT OP CODE
|
; DB 0CBH ;RCAP2H LOCATION
|
; DB 0CBH ;RCAP2H LOCATION
|
; DB 89H ;MOV R1 DIRECT OP CODE
|
; DB 89H ;MOV R1 DIRECT OP CODE
|
; DB 0CAH ;RCAP2L LOCATION
|
; DB 0CAH ;RCAP2L LOCATION
|
RET
|
RET
|
;
|
;
|
RCL1: ACALL R3CK ;MAKE SURE THAT R3 IS ZERO
|
RCL1: ACALL R3CK ;MAKE SURE THAT R3 IS ZERO
|
CJNE A,#TT2C,RCL2
|
CJNE A,#TT2C,RCL2
|
MOV T2CON,R1
|
MOV T2CON,R1
|
; DB 89H ;MOV R1 DIRECT OP CODE
|
; DB 89H ;MOV R1 DIRECT OP CODE
|
; DB 0C8H ;T2CON LOCATION
|
; DB 0C8H ;T2CON LOCATION
|
RET
|
RET
|
;
|
;
|
RCL2: CJNE A,#T_IE,RCL3 ;IE TOKEN
|
RCL2: CJNE A,#T_IE,RCL3 ;IE TOKEN
|
MOV IE,R1
|
MOV IE,R1
|
RET
|
RET
|
;
|
;
|
RCL3: CJNE A,#T_IP,RCL4 ;IP TOKEN
|
RCL3: CJNE A,#T_IP,RCL4 ;IP TOKEN
|
MOV IP,R1
|
MOV IP,R1
|
RET
|
RET
|
;
|
;
|
RCL4: CJNE A,#TTC,RCL5 ;TCON TOKEN
|
RCL4: CJNE A,#TTC,RCL5 ;TCON TOKEN
|
MOV TCON,R1
|
MOV TCON,R1
|
RET
|
RET
|
;
|
;
|
RCL5: CJNE A,#TTM,RCL6 ;TMOD TOKEN
|
RCL5: CJNE A,#TTM,RCL6 ;TMOD TOKEN
|
MOV TMOD,R1
|
MOV TMOD,R1
|
RET
|
RET
|
;
|
;
|
RCL6: CJNE A,#T_P1,T_T2 ;P1 TOKEN
|
RCL6: CJNE A,#T_P1,T_T2 ;P1 TOKEN
|
MOV P1,R1
|
MOV P1,R1
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; T_TRAP - Trap special operators
|
; T_TRAP - Trap special operators
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
T_T: MOV TEMP5,A ;SAVE THE TOKEN
|
T_T: MOV TEMP5,A ;SAVE THE TOKEN
|
ACALL GCI1 ;BUMP POINTER
|
ACALL GCI1 ;BUMP POINTER
|
ACALL SLET2 ;EVALUATE AFTER =
|
ACALL SLET2 ;EVALUATE AFTER =
|
MOV A,TEMP5 ;GET THE TOKEN BACK
|
MOV A,TEMP5 ;GET THE TOKEN BACK
|
CJNE A,#T_XTAL,T_T01
|
CJNE A,#T_XTAL,T_T01
|
LJMP AXTAL1 ;SET UP CRYSTAL
|
LJMP AXTAL1 ;SET UP CRYSTAL
|
;
|
;
|
T_T01: ACALL IFIXL ;R3:R1 HAS THE TOS
|
T_T01: ACALL IFIXL ;R3:R1 HAS THE TOS
|
MOV A,TEMP5 ;GET THE TOKEN AGAIN
|
MOV A,TEMP5 ;GET THE TOKEN AGAIN
|
CJNE A,#T_MTOP,T_T1 ;SEE IF MTOP TOKEN
|
CJNE A,#T_MTOP,T_T1 ;SEE IF MTOP TOKEN
|
MOV DPTR,#MEMTOP
|
MOV DPTR,#MEMTOP
|
CALL S31DP
|
CALL S31DP
|
JMP RCLEAR ;CLEAR THE MEMORY
|
JMP RCLEAR ;CLEAR THE MEMORY
|
;
|
;
|
T_T1: CJNE A,#T_TIME,ITRAP ;SEE IF A TIME TOKEN
|
T_T1: CJNE A,#T_TIME,ITRAP ;SEE IF A TIME TOKEN
|
MOV C,EA ;SAVE INTERRUPTS
|
MOV C,EA ;SAVE INTERRUPTS
|
CLR EA ;NO TIMER 0 INTERRUPTS DURING LOAD
|
CLR EA ;NO TIMER 0 INTERRUPTS DURING LOAD
|
MOV TVH,R3 ;SAVE THE TIME
|
MOV TVH,R3 ;SAVE THE TIME
|
MOV TVL,R1
|
MOV TVL,R1
|
MOV EA,C ;RESTORE INTERRUPTS
|
MOV EA,C ;RESTORE INTERRUPTS
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
T_T2: CJNE A,#T_PC,INTERX ;PCON TOKEN
|
T_T2: CJNE A,#T_PC,INTERX ;PCON TOKEN
|
MOV PCON,R1
|
MOV PCON,R1
|
; DB 89H ;MOV DIRECT, R1 OP CODE
|
; DB 89H ;MOV DIRECT, R1 OP CODE
|
; DB 87H ;ADDRESS OF PCON
|
; DB 87H ;ADDRESS OF PCON
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
T_TRAP: CJNE A,#T_ASC,T_T ;SEE IF ASC TOKEN
|
T_TRAP: CJNE A,#T_ASC,T_T ;SEE IF ASC TOKEN
|
ACALL IGC ;EAT IT AND GET THE NEXT CHARACTER
|
ACALL IGC ;EAT IT AND GET THE NEXT CHARACTER
|
CJNE A,#'$',INTERX ;ERROR IF NOT A STRING
|
CJNE A,#'$',INTERX ;ERROR IF NOT A STRING
|
ACALL CSY ;CALCULATE ADDRESS
|
ACALL CSY ;CALCULATE ADDRESS
|
ACALL X3120
|
ACALL X3120
|
CALL TWO_EY
|
CALL TWO_EY
|
ACALL SPEOP1 ;EVALUATE AFTER EQUALS
|
ACALL SPEOP1 ;EVALUATE AFTER EQUALS
|
AJMP ISTAX1 ;SAVE THE CHARACTER
|
AJMP ISTAX1 ;SAVE THE CHARACTER
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
;INTERPERT THE STATEMENT POINTED TO BY TXAL AND TXAH
|
;INTERPERT THE STATEMENT POINTED TO BY TXAL AND TXAH
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ISTAT: ACALL GC ;GET THR FIRST CHARACTER
|
ISTAT: ACALL GC ;GET THR FIRST CHARACTER
|
JNB XBIT,IAT ;TRAP TO EXTERNAL RUN PACKAGE
|
JNB XBIT,IAT ;TRAP TO EXTERNAL RUN PACKAGE
|
CJNE A,#20H,ISTAT1
|
CJNE A,#20H,ISTAT1
|
ISTAT1: JNC IAT
|
ISTAT1: JNC IAT
|
LCALL 2070H ;LET THE USER SET UP THE DPTR
|
LCALL 2070H ;LET THE USER SET UP THE DPTR
|
ACALL GCI1
|
ACALL GCI1
|
ANL A,#0FH ;STRIP OFF BIAS
|
ANL A,#0FH ;STRIP OFF BIAS
|
SJMP ISTA1
|
SJMP ISTA1
|
;
|
;
|
IAT: CJNE A,#T_XTAL,IAT1
|
IAT: CJNE A,#T_XTAL,IAT1
|
IAT1: JNC T_TRAP
|
IAT1: JNC T_TRAP
|
JNB ACC.7,SLET ;IMPLIED LET IF BIT 7 NOT SET
|
JNB ACC.7,SLET ;IMPLIED LET IF BIT 7 NOT SET
|
CJNE A,#T_UOP+12,ISTAX ;DBYTE TOKEN
|
CJNE A,#T_UOP+12,ISTAX ;DBYTE TOKEN
|
ACALL SPEOP ;EVALUATE SPECIAL OPERATOR
|
ACALL SPEOP ;EVALUATE SPECIAL OPERATOR
|
ACALL R3CK ;CHECK LOCATION
|
ACALL R3CK ;CHECK LOCATION
|
MOV @R1,A ;SAVE IT
|
MOV @R1,A ;SAVE IT
|
RET
|
RET
|
;
|
;
|
ISTAX: CJNE A,#T_UOP+13,ISTAY ;XBYTE TOKEN
|
ISTAX: CJNE A,#T_UOP+13,ISTAY ;XBYTE TOKEN
|
ACALL SPEOP
|
ACALL SPEOP
|
;
|
;
|
ISTAX1: MOV P2,R3
|
ISTAX1: MOV P2,R3
|
MOVX @R1,A
|
MOVX @R1,A
|
RET
|
RET
|
;
|
;
|
ISTAY: CJNE A,#T_CR+1,ISTAY1;TRAP NEW OPERATORS
|
ISTAY: CJNE A,#T_CR+1,ISTAY1;TRAP NEW OPERATORS
|
ISTAY1: JC I_S
|
ISTAY1: JC I_S
|
CJNE A,#0B0H,ISTAY2 ;SEE IF TOO BIG
|
CJNE A,#0B0H,ISTAY2 ;SEE IF TOO BIG
|
ISTAY2: JNC INTERX
|
ISTAY2: JNC INTERX
|
ADD A,#0F9H ;BIAS FOR LOOKUP TABLE
|
ADD A,#0F9H ;BIAS FOR LOOKUP TABLE
|
SJMP ISTA0 ;DO THE OPERATION
|
SJMP ISTA0 ;DO THE OPERATION
|
;
|
;
|
I_S: CJNE A,#T_LAST,I_S1 ;MAKE SURE AN INITIAL RESERVED WORD
|
I_S: CJNE A,#T_LAST,I_S1 ;MAKE SURE AN INITIAL RESERVED WORD
|
I_S1: JC INTERX1 ;ERROR IF NOT
|
I_S1: JC INTERX1 ;ERROR IF NOT
|
;
|
;
|
INTERX: LJMP E1XX ;SYNTAX ERROR
|
INTERX: LJMP E1XX ;SYNTAX ERROR
|
;
|
;
|
INTERX1:JNB DIRF,ISTA0 ;EXECUTE ALL STATEMENTS IF IN RUN MODE
|
INTERX1:JNB DIRF,ISTA0 ;EXECUTE ALL STATEMENTS IF IN RUN MODE
|
CJNE A,#T_DIR,INTERX2;SEE IF ON TOKEN
|
CJNE A,#T_DIR,INTERX2;SEE IF ON TOKEN
|
INTERX2:JC ISTA0 ;OK IF DIRECT
|
INTERX2:JC ISTA0 ;OK IF DIRECT
|
CJNE A,#T_GOSB+1,INTERX3;SEE IF FOR
|
CJNE A,#T_GOSB+1,INTERX3;SEE IF FOR
|
SJMP ISTA0 ;FOR IS OK
|
SJMP ISTA0 ;FOR IS OK
|
INTERX3:CJNE A,#T_REM+1,INTERX4 ;NEXT IS OK
|
INTERX3:CJNE A,#T_REM+1,INTERX4 ;NEXT IS OK
|
SJMP ISTA0
|
SJMP ISTA0
|
INTERX4:CJNE A,#T_STOP+6,INTERX ;SO IS REM
|
INTERX4:CJNE A,#T_STOP+6,INTERX ;SO IS REM
|
;
|
;
|
$EJECT
|
$EJECT
|
ISTA0: ACALL GCI1 ;ADVANCE THE TEXT POINTER
|
ISTA0: ACALL GCI1 ;ADVANCE THE TEXT POINTER
|
MOV DPTR,#STATD ;POINT DPTR TO LOOKUP TABLE
|
MOV DPTR,#STATD ;POINT DPTR TO LOOKUP TABLE
|
CJNE A,#T_GOTO-3,ISTA01;SEE IF LET TOKEN
|
CJNE A,#T_GOTO-3,ISTA01;SEE IF LET TOKEN
|
SJMP ISTAT ;WASTE LET TOKEN
|
SJMP ISTAT ;WASTE LET TOKEN
|
ISTA01: ANL A,#3FH ;STRIP OFF THE GARBAGE
|
ISTA01: ANL A,#3FH ;STRIP OFF THE GARBAGE
|
;
|
;
|
ISTA1: RL A ;ROTATE FOR OFFSET
|
ISTA1: RL A ;ROTATE FOR OFFSET
|
ADD A,DPL ;BUMP
|
ADD A,DPL ;BUMP
|
MOV DPL,A ;SAVE IT
|
MOV DPL,A ;SAVE IT
|
CLR A
|
CLR A
|
MOVC A,@A+DPTR ;GET HIGH BYTE
|
MOVC A,@A+DPTR ;GET HIGH BYTE
|
PUSH ACC ;SAVE IT
|
PUSH ACC ;SAVE IT
|
INC DPTR
|
INC DPTR
|
CLR A
|
CLR A
|
MOVC A,@A+DPTR ;GET LOW BYTE
|
MOVC A,@A+DPTR ;GET LOW BYTE
|
POP DPH
|
POP DPH
|
MOV DPL,A
|
MOV DPL,A
|
;
|
;
|
AC1: CLR A
|
AC1: CLR A
|
JMP @A+DPTR ;GO DO IT
|
JMP @A+DPTR ;GO DO IT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - LET
|
; The statement action routine - LET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SLET: ACALL S_C ;CHECK FOR POSSIBLE STRING
|
SLET: ACALL S_C ;CHECK FOR POSSIBLE STRING
|
JC SLET0 ;NO STRING
|
JC SLET0 ;NO STRING
|
CLR LINEB ;USED STRINGS
|
CLR LINEB ;USED STRINGS
|
;
|
;
|
CALL X31DP ;PUT ADDRESS IN DPTR
|
CALL X31DP ;PUT ADDRESS IN DPTR
|
MOV R7,#T_EQU ;WASTE =
|
MOV R7,#T_EQU ;WASTE =
|
ACALL EATC
|
ACALL EATC
|
ACALL GC ;GET THE NEXT CHARACTER
|
ACALL GC ;GET THE NEXT CHARACTER
|
CJNE A,#'"',S_3 ;CHECK FOR A "
|
CJNE A,#'"',S_3 ;CHECK FOR A "
|
MOV R7,S_LEN ;GET THE STRING LENGTH
|
MOV R7,S_LEN ;GET THE STRING LENGTH
|
;
|
;
|
S_0: ACALL GCI1 ;BUMP PAST "
|
S_0: ACALL GCI1 ;BUMP PAST "
|
ACALL DELTST ;CHECK FOR DELIMITER
|
ACALL DELTST ;CHECK FOR DELIMITER
|
JZ INTERX ;EXIT IF CARRIAGE RETURN
|
JZ INTERX ;EXIT IF CARRIAGE RETURN
|
MOVX @DPTR,A ;SAVE THE CHARACTER
|
MOVX @DPTR,A ;SAVE THE CHARACTER
|
CJNE A,#'"',S_1 ;SEE IF DONE
|
CJNE A,#'"',S_1 ;SEE IF DONE
|
;
|
;
|
S_E: MOV A,#CR ;PUT A CR IN A
|
S_E: MOV A,#CR ;PUT A CR IN A
|
MOVX @DPTR,A ;SAVE CR
|
MOVX @DPTR,A ;SAVE CR
|
AJMP GCI1
|
AJMP GCI1
|
;
|
;
|
S_3: PUSH DPH
|
S_3: PUSH DPH
|
PUSH DPL ;SAVE DESTINATION
|
PUSH DPL ;SAVE DESTINATION
|
ACALL S_C ;CALCULATE SOURCE
|
ACALL S_C ;CALCULATE SOURCE
|
JC INTERX ;ERROR IF CARRY
|
JC INTERX ;ERROR IF CARRY
|
POP R0B0 ;GET DESTINATION BACK
|
POP R0B0 ;GET DESTINATION BACK
|
POP R2B0
|
POP R2B0
|
;
|
;
|
SSOOP: MOV R7,S_LEN ;SET UP COUNTER
|
SSOOP: MOV R7,S_LEN ;SET UP COUNTER
|
;
|
;
|
S_4: CALL TBYTE ;TRANSFER THE BYTE
|
S_4: CALL TBYTE ;TRANSFER THE BYTE
|
CJNE A,#CR,S_41 ;EXIT IF A CR
|
CJNE A,#CR,S_41 ;EXIT IF A CR
|
RET
|
RET
|
S_41: DJNZ R7,S_5 ;BUMP COUNTER
|
S_41: DJNZ R7,S_5 ;BUMP COUNTER
|
MOV A,#CR ;SAVE A CR
|
MOV A,#CR ;SAVE A CR
|
MOVX @R0,A
|
MOVX @R0,A
|
AJMP EIGP ;PRINT EXTRA IGNORED
|
AJMP EIGP ;PRINT EXTRA IGNORED
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
S_5: CALL INC3210 ;BUMP POINTERS
|
S_5: CALL INC3210 ;BUMP POINTERS
|
SJMP S_4 ;LOOP
|
SJMP S_4 ;LOOP
|
;
|
;
|
S_1: DJNZ R7,S_11 ;SEE IF DONE
|
S_1: DJNZ R7,S_11 ;SEE IF DONE
|
ACALL S_E
|
ACALL S_E
|
ACALL EIGP ;PRINT EXTRA IGNORED
|
ACALL EIGP ;PRINT EXTRA IGNORED
|
AJMP FINDCR ;GO FIND THE END
|
AJMP FINDCR ;GO FIND THE END
|
S_11: INC DPTR ;BUMP THE STORE POINTER
|
S_11: INC DPTR ;BUMP THE STORE POINTER
|
SJMP S_0 ;CONTINUE TO LOOP
|
SJMP S_0 ;CONTINUE TO LOOP
|
;
|
;
|
E3XX: MOV DPTR,#E3X ;BAD ARG ERROR
|
E3XX: MOV DPTR,#E3X ;BAD ARG ERROR
|
AJMP EK
|
AJMP EK
|
;
|
;
|
SLET0: ACALL SLET1
|
SLET0: ACALL SLET1
|
AJMP POPAS ;COPY EXPRESSION TO VARIABLE
|
AJMP POPAS ;COPY EXPRESSION TO VARIABLE
|
;
|
;
|
SLET1: ACALL VAR_ER ;CHECK FOR A"VARIABLE"
|
SLET1: ACALL VAR_ER ;CHECK FOR A"VARIABLE"
|
;
|
;
|
SLET2: PUSH R2B0 ;SAVE THE VARIABLE ADDRESS
|
SLET2: PUSH R2B0 ;SAVE THE VARIABLE ADDRESS
|
PUSH R0B0
|
PUSH R0B0
|
MOV R7,#T_EQU ;GET EQUAL TOKEN
|
MOV R7,#T_EQU ;GET EQUAL TOKEN
|
ACALL WE
|
ACALL WE
|
POP R1B0 ;POP VARIABLE TO R3:R1
|
POP R1B0 ;POP VARIABLE TO R3:R1
|
POP R3B0
|
POP R3B0
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
R3CK: CJNE R3,#00H,E3XX ;CHECK TO SEE IF R3 IS ZERO
|
R3CK: CJNE R3,#00H,E3XX ;CHECK TO SEE IF R3 IS ZERO
|
RET
|
RET
|
;
|
;
|
SPEOP: ACALL GCI1 ;BUMP TXA
|
SPEOP: ACALL GCI1 ;BUMP TXA
|
ACALL P_E ;EVALUATE PAREN
|
ACALL P_E ;EVALUATE PAREN
|
SPEOP1: ACALL SLET2 ;EVALUATE AFTER =
|
SPEOP1: ACALL SLET2 ;EVALUATE AFTER =
|
CALL TWOL ;R7:R6 GETS VALUE, R3:R1 GETS LOCATION
|
CALL TWOL ;R7:R6 GETS VALUE, R3:R1 GETS LOCATION
|
MOV A,R6 ;SAVE THE VALUE
|
MOV A,R6 ;SAVE THE VALUE
|
;
|
;
|
CJNE R7,#00H,E3XX ;R2 MUST BE = 0
|
CJNE R7,#00H,E3XX ;R2 MUST BE = 0
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; ST_CAL - Calculate string Address
|
; ST_CAL - Calculate string Address
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
IST_CAL:;
|
IST_CAL:;
|
;
|
;
|
ACALL I_PI ;BUMP TEXT, THEN EVALUATE
|
ACALL I_PI ;BUMP TEXT, THEN EVALUATE
|
ACALL R3CK ;ERROR IF R3 <> 0
|
ACALL R3CK ;ERROR IF R3 <> 0
|
INC R1 ;BUMP FOR OFFSET
|
INC R1 ;BUMP FOR OFFSET
|
MOV A,R1 ;ERROR IF R1 = 255
|
MOV A,R1 ;ERROR IF R1 = 255
|
JZ E3XX
|
JZ E3XX
|
MOV DPTR,#VARTOP ;GET TOP OF VARIABLE STORAGE
|
MOV DPTR,#VARTOP ;GET TOP OF VARIABLE STORAGE
|
MOV B,S_LEN ;MULTIPLY FOR LOCATION
|
MOV B,S_LEN ;MULTIPLY FOR LOCATION
|
ACALL VARD ;CALCULATE THE LOCATION
|
ACALL VARD ;CALCULATE THE LOCATION
|
MOV DPTR,#MEMTOP ;SEE IF BLEW IT
|
MOV DPTR,#MEMTOP ;SEE IF BLEW IT
|
CALL FUL1
|
CALL FUL1
|
MOV DPL,S_LEN ;GET STRING LENGTH, DPH = 00H
|
MOV DPL,S_LEN ;GET STRING LENGTH, DPH = 00H
|
DEC DPH ;DPH = 0
|
DEC DPH ;DPH = 0
|
;
|
;
|
DUBSUB: CLR C
|
DUBSUB: CLR C
|
MOV A,R1
|
MOV A,R1
|
SUBB A,DPL
|
SUBB A,DPL
|
MOV R1,A
|
MOV R1,A
|
MOV A,R3
|
MOV A,R3
|
SUBB A,DPH
|
SUBB A,DPH
|
MOV R3,A
|
MOV R3,A
|
ORL A,R1
|
ORL A,R1
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;VARD - Calculate the offset base
|
;VARD - Calculate the offset base
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
VARB: MOV B,#FPSIZ ;SET UP FOR OPERATION
|
VARB: MOV B,#FPSIZ ;SET UP FOR OPERATION
|
;
|
;
|
VARD: CALL LDPTRI ;LOAD DPTR
|
VARD: CALL LDPTRI ;LOAD DPTR
|
MOV A,R1 ;MULTIPLY BASE
|
MOV A,R1 ;MULTIPLY BASE
|
MUL AB
|
MUL AB
|
ADD A,DPL
|
ADD A,DPL
|
MOV R1,A
|
MOV R1,A
|
MOV A,B
|
MOV A,B
|
ADDC A,DPH
|
ADDC A,DPH
|
MOV R3,A
|
MOV R3,A
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
CSY: ; Calculate a biased string address and put in R3:R1
|
CSY: ; Calculate a biased string address and put in R3:R1
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL IST_CAL ;CALCULATE IT
|
ACALL IST_CAL ;CALCULATE IT
|
PUSH R3B0 ;SAVE IT
|
PUSH R3B0 ;SAVE IT
|
PUSH R1B0
|
PUSH R1B0
|
MOV R7,#',' ;WASTE THE COMMA
|
MOV R7,#',' ;WASTE THE COMMA
|
ACALL EATC
|
ACALL EATC
|
ACALL ONE ;GET THE NEXT EXPRESSION
|
ACALL ONE ;GET THE NEXT EXPRESSION
|
MOV A,R1 ;CHECK FOR BOUNDS
|
MOV A,R1 ;CHECK FOR BOUNDS
|
CJNE A,S_LEN,CSY1
|
CJNE A,S_LEN,CSY1
|
CSY1: JNC E3XX ;MUST HAVE A CARRY
|
CSY1: JNC E3XX ;MUST HAVE A CARRY
|
DEC R1 ;BIAS THE POINTER
|
DEC R1 ;BIAS THE POINTER
|
POP ACC ;GET VALUE LOW
|
POP ACC ;GET VALUE LOW
|
ADD A,R1 ;ADD IT TO BASE
|
ADD A,R1 ;ADD IT TO BASE
|
MOV R1,A ;SAVE IT
|
MOV R1,A ;SAVE IT
|
POP R3B0 ;GET HIGH ADDRESS
|
POP R3B0 ;GET HIGH ADDRESS
|
JNC CSY2 ;PROPAGATE THE CARRY
|
JNC CSY2 ;PROPAGATE THE CARRY
|
INC R3
|
INC R3
|
CSY2: AJMP ERPAR ;WASTE THE RIGHT PAREN
|
CSY2: AJMP ERPAR ;WASTE THE RIGHT PAREN
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine FOR
|
; The statement action routine FOR
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SFOR: ACALL SLET1 ;SET UP CONTROL VARIABLE
|
SFOR: ACALL SLET1 ;SET UP CONTROL VARIABLE
|
PUSH R3B0 ;SAVE THE CONTROL VARIABLE LOCATION
|
PUSH R3B0 ;SAVE THE CONTROL VARIABLE LOCATION
|
PUSH R1B0
|
PUSH R1B0
|
ACALL POPAS ;POP ARG STACK AND COPY CONTROL VAR
|
ACALL POPAS ;POP ARG STACK AND COPY CONTROL VAR
|
MOV R7,#T_TO ;GET TO TOKEN
|
MOV R7,#T_TO ;GET TO TOKEN
|
ACALL WE
|
ACALL WE
|
ACALL GC ;GET NEXT CHARACTER
|
ACALL GC ;GET NEXT CHARACTER
|
CJNE A,#T_STEP,SF2
|
CJNE A,#T_STEP,SF2
|
ACALL GCI1 ;EAT THE TOKEN
|
ACALL GCI1 ;EAT THE TOKEN
|
ACALL EXPRB ;EVALUATE EXPRESSION
|
ACALL EXPRB ;EVALUATE EXPRESSION
|
SJMP SF21 ;JUMP OVER
|
SJMP SF21 ;JUMP OVER
|
;
|
;
|
SF2: LCALL PUSH_ONE ;PUT ONE ON THE STACK
|
SF2: LCALL PUSH_ONE ;PUT ONE ON THE STACK
|
;
|
;
|
SF21: MOV A,#-FSIZE ;ALLOCATE FSIZE BYTES ON THE CONTROL STACK
|
SF21: MOV A,#-FSIZE ;ALLOCATE FSIZE BYTES ON THE CONTROL STACK
|
ACALL PUSHCS ;GET CS IN R0
|
ACALL PUSHCS ;GET CS IN R0
|
ACALL CSC ;CHECK CONTROL STACK
|
ACALL CSC ;CHECK CONTROL STACK
|
MOV R3,#CSTKAH ;IN CONTROL STACK
|
MOV R3,#CSTKAH ;IN CONTROL STACK
|
MOV R1,R0B0 ;STACK ADDRESS
|
MOV R1,R0B0 ;STACK ADDRESS
|
ACALL POPAS ;PUT STEP ON STACK
|
ACALL POPAS ;PUT STEP ON STACK
|
ACALL POPAS ;PUT LIMIT ON STACK
|
ACALL POPAS ;PUT LIMIT ON STACK
|
ACALL DP_T ;DPTR GETS TEXT
|
ACALL DP_T ;DPTR GETS TEXT
|
MOV R0,R1B0 ;GET THE POINTER
|
MOV R0,R1B0 ;GET THE POINTER
|
ACALL T_X_S ;SAVE THE TEXT
|
ACALL T_X_S ;SAVE THE TEXT
|
POP TXAL ;GET CONTROL VARIABLE
|
POP TXAL ;GET CONTROL VARIABLE
|
POP TXAH
|
POP TXAH
|
MOV R4,#FTYPE ;AND THE TYPE
|
MOV R4,#FTYPE ;AND THE TYPE
|
ACALL T_X_S ;SAVE IT
|
ACALL T_X_S ;SAVE IT
|
;
|
;
|
SF3: ACALL T_DP ;GET THE TEXT POINTER
|
SF3: ACALL T_DP ;GET THE TEXT POINTER
|
AJMP ILOOP ;CONTINUE TO PROCESS
|
AJMP ILOOP ;CONTINUE TO PROCESS
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; The statement action routines - PUSH and POP
|
; The statement action routines - PUSH and POP
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
SPUSH: ACALL EXPRB ;PUT EXPRESSION ON STACK
|
SPUSH: ACALL EXPRB ;PUT EXPRESSION ON STACK
|
ACALL C_TST ;SEE IF MORE TO DO
|
ACALL C_TST ;SEE IF MORE TO DO
|
JNC SPUSH ;IF A COMMA PUSH ANOTHER
|
JNC SPUSH ;IF A COMMA PUSH ANOTHER
|
RET
|
RET
|
;
|
;
|
;
|
;
|
SPOP: ACALL VAR_ER ;GET VARIABLE
|
SPOP: ACALL VAR_ER ;GET VARIABLE
|
ACALL XPOP ;FLIP THE REGISTERS FOR POPAS
|
ACALL XPOP ;FLIP THE REGISTERS FOR POPAS
|
ACALL C_TST ;SEE IF MORE TO DO
|
ACALL C_TST ;SEE IF MORE TO DO
|
JNC SPOP
|
JNC SPOP
|
;
|
;
|
SPOP1: RET
|
SPOP1: RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - IF
|
; The statement action routine - IF
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SIF: ACALL RTST ;EVALUATE THE EXPRESSION
|
SIF: ACALL RTST ;EVALUATE THE EXPRESSION
|
MOV R1,A ;SAVE THE RESULT
|
MOV R1,A ;SAVE THE RESULT
|
ACALL GC ;GET THE CHARACTER AFTER EXPR
|
ACALL GC ;GET THE CHARACTER AFTER EXPR
|
CJNE A,#T_THEN,SIF1 ;SEE IF THEN TOKEN
|
CJNE A,#T_THEN,SIF1 ;SEE IF THEN TOKEN
|
ACALL GCI1 ;WASTE THEN TOKEN
|
ACALL GCI1 ;WASTE THEN TOKEN
|
SIF1: CJNE R1,#0,T_F1 ;CHECK R_OP RESULT
|
SIF1: CJNE R1,#0,T_F1 ;CHECK R_OP RESULT
|
;
|
;
|
E_FIND: MOV R7,#T_ELSE ;FIND ELSE TOKEN
|
E_FIND: MOV R7,#T_ELSE ;FIND ELSE TOKEN
|
ACALL FINDC
|
ACALL FINDC
|
JZ SPOP1 ;EXIT IF A CR
|
JZ SPOP1 ;EXIT IF A CR
|
ACALL GCI1 ;BUMP PAST TOKEN
|
ACALL GCI1 ;BUMP PAST TOKEN
|
CJNE A,#T_ELSE,E_FIND;WASTE IF NO ELSE
|
CJNE A,#T_ELSE,E_FIND;WASTE IF NO ELSE
|
;
|
;
|
T_F1: ACALL INTGER ;SEE IF NUMBER
|
T_F1: ACALL INTGER ;SEE IF NUMBER
|
JNC D_L1 ;EXECUTE LINE NUMBER
|
JNC D_L1 ;EXECUTE LINE NUMBER
|
AJMP ISTAT ;EXECUTE STATEMENT IN NOT
|
AJMP ISTAT ;EXECUTE STATEMENT IN NOT
|
;
|
;
|
B_C: MOVX A,@DPTR
|
B_C: MOVX A,@DPTR
|
DEC A
|
DEC A
|
JB ACC.7,FL11
|
JB ACC.7,FL11
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - GOTO
|
; The statement action routine - GOTO
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SGOTO: ACALL RLINE ;R2:R0 AND DPTR GET INTGER
|
SGOTO: ACALL RLINE ;R2:R0 AND DPTR GET INTGER
|
;
|
;
|
SGT1: ACALL T_DP ;TEXT POINTER GETS DPTR
|
SGT1: ACALL T_DP ;TEXT POINTER GETS DPTR
|
;
|
;
|
JBC RETBIT,SGT2 ;SEE IF RETI EXECUTED
|
JBC RETBIT,SGT2 ;SEE IF RETI EXECUTED
|
;
|
;
|
JNB LINEB,SGT11 ;SEE IF A LINE WAS EDITED
|
JNB LINEB,SGT11 ;SEE IF A LINE WAS EDITED
|
LCALL CNEW1 ;CLEAR THE MEMORY IF SET
|
LCALL CNEW1 ;CLEAR THE MEMORY IF SET
|
SGT11: AJMP CILOOP1 ;CLEAR DIRF AND LOOP
|
SGT11: AJMP CILOOP1 ;CLEAR DIRF AND LOOP
|
;
|
;
|
SGT2: JBC OTI,SGT21 ;SEE IF TIMER INTERRUPT
|
SGT2: JBC OTI,SGT21 ;SEE IF TIMER INTERRUPT
|
ANL 34,#10111101B ;CLEAR INTERRUPTS
|
ANL 34,#10111101B ;CLEAR INTERRUPTS
|
AJMP ILOOP ;EXECUTE
|
AJMP ILOOP ;EXECUTE
|
SGT21: MOV C,ISAV
|
SGT21: MOV C,ISAV
|
MOV INPROG,C
|
MOV INPROG,C
|
AJMP ILOOP ;RESTORE INTERRUPTS AND RET
|
AJMP ILOOP ;RESTORE INTERRUPTS AND RET
|
;
|
;
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
RTST: ; Test for ZERO
|
RTST: ; Test for ZERO
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL EXPRB ;EVALUATE EXPRESSION
|
ACALL EXPRB ;EVALUATE EXPRESSION
|
CALL INC_ASTKA ;BUMP ARG STACK
|
CALL INC_ASTKA ;BUMP ARG STACK
|
JZ RTST1 ;EXIT WITH ZERO OR 0FFH
|
JZ RTST1 ;EXIT WITH ZERO OR 0FFH
|
MOV A,#0FFH
|
MOV A,#0FFH
|
RTST1: RET
|
RTST1: RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; GLN - get the line number in R2:R0, return in DPTR
|
; GLN - get the line number in R2:R0, return in DPTR
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
GLN: ACALL DP_B ;GET THE BEGINNING ADDRESS
|
GLN: ACALL DP_B ;GET THE BEGINNING ADDRESS
|
;
|
;
|
FL1: MOVX A,@DPTR ;GET THE LENGTH
|
FL1: MOVX A,@DPTR ;GET THE LENGTH
|
MOV R7,A ;SAVE THE LENGTH
|
MOV R7,A ;SAVE THE LENGTH
|
DJNZ R7,FL3 ;SEE IF END OF FILE
|
DJNZ R7,FL3 ;SEE IF END OF FILE
|
;
|
;
|
FL11: MOV DPTR,#E10X ;NO LINE NUMBER
|
FL11: MOV DPTR,#E10X ;NO LINE NUMBER
|
AJMP EK ;HANDLE THE ERROR
|
AJMP EK ;HANDLE THE ERROR
|
;
|
;
|
FL3: JB ACC.7,FL11 ;CHECK FOR BIT 7
|
FL3: JB ACC.7,FL11 ;CHECK FOR BIT 7
|
INC DPTR ;POINT AT HIGH BYTE
|
INC DPTR ;POINT AT HIGH BYTE
|
MOVX A,@DPTR ;GET HIGH BYTE
|
MOVX A,@DPTR ;GET HIGH BYTE
|
CJNE A,R2B0,FL2 ;SEE IF MATCH
|
CJNE A,R2B0,FL2 ;SEE IF MATCH
|
INC DPTR ;BUMP TO LOW BYTE
|
INC DPTR ;BUMP TO LOW BYTE
|
DEC R7 ;ADJUST AGAIN
|
DEC R7 ;ADJUST AGAIN
|
MOVX A,@DPTR ;GET THE LOW BYTE
|
MOVX A,@DPTR ;GET THE LOW BYTE
|
CJNE A,R0B0,FL2 ;SEE IF LOW BYTE MATCH
|
CJNE A,R0B0,FL2 ;SEE IF LOW BYTE MATCH
|
INC DPTR ;POINT AT FIRST CHARACTER
|
INC DPTR ;POINT AT FIRST CHARACTER
|
RET ;FOUND IT
|
RET ;FOUND IT
|
;
|
;
|
FL2: MOV A,R7 ;GET THE LENGTH COUNTER
|
FL2: MOV A,R7 ;GET THE LENGTH COUNTER
|
CALL ADDPTR ;ADD A TO DATA POINTER
|
CALL ADDPTR ;ADD A TO DATA POINTER
|
SJMP FL1 ;LOOP
|
SJMP FL1 ;LOOP
|
;
|
;
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
;RLINE - Read in ASCII string, get line, and clean it up
|
;RLINE - Read in ASCII string, get line, and clean it up
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
RLINE: ACALL INTERR ;GET THE INTEGER
|
RLINE: ACALL INTERR ;GET THE INTEGER
|
;
|
;
|
RL1: ACALL GLN
|
RL1: ACALL GLN
|
AJMP CLN_UP
|
AJMP CLN_UP
|
;
|
;
|
;
|
;
|
D_L1: ACALL GLN ;GET THE LINE
|
D_L1: ACALL GLN ;GET THE LINE
|
AJMP SGT1 ;EXECUTE THE LINE
|
AJMP SGT1 ;EXECUTE THE LINE
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routines WHILE and UNTIL
|
; The statement action routines WHILE and UNTIL
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SWHILE: ACALL RTST ;EVALUATE RELATIONAL EXPRESSION
|
SWHILE: ACALL RTST ;EVALUATE RELATIONAL EXPRESSION
|
CPL A
|
CPL A
|
SJMP S_WU
|
SJMP S_WU
|
;
|
;
|
SUNTIL: ACALL RTST ;EVALUATE RELATIONAL EXPRESSION
|
SUNTIL: ACALL RTST ;EVALUATE RELATIONAL EXPRESSION
|
;
|
;
|
S_WU: MOV R4,#DTYPE ;DO EXPECTED
|
S_WU: MOV R4,#DTYPE ;DO EXPECTED
|
MOV R5,A ;SAVE R_OP RESULT
|
MOV R5,A ;SAVE R_OP RESULT
|
SJMP SR0 ;GO PROCESS
|
SJMP SR0 ;GO PROCESS
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CNULL: ; The Command Action Routine - NULL
|
CNULL: ; The Command Action Routine - NULL
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL INTERR ;GET AN INTEGER FOLLOWING NULL
|
ACALL INTERR ;GET AN INTEGER FOLLOWING NULL
|
MOV NULLCT,R0 ;SAVE THE NULLCOUNT
|
MOV NULLCT,R0 ;SAVE THE NULLCOUNT
|
AJMP CMNDLK ;JUMP TO COMMAND MODE
|
AJMP CMNDLK ;JUMP TO COMMAND MODE
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - RETI
|
; The statement action routine - RETI
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SRETI: SETB RETBIT ;SAYS THAT RETI HAS BEEN EXECUTED
|
SRETI: SETB RETBIT ;SAYS THAT RETI HAS BEEN EXECUTED
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - RETURN
|
; The statement action routine - RETURN
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SRETRN: MOV R4,#GTYPE ;MAKE SURE OF GOSUB
|
SRETRN: MOV R4,#GTYPE ;MAKE SURE OF GOSUB
|
MOV R5,#55H ;TYPE RETURN TYPE
|
MOV R5,#55H ;TYPE RETURN TYPE
|
;
|
;
|
SR0: ACALL CSETUP ;SET UP CONTROL STACK
|
SR0: ACALL CSETUP ;SET UP CONTROL STACK
|
MOVX A,@R0 ;GET RETURN TEXT ADDRESS
|
MOVX A,@R0 ;GET RETURN TEXT ADDRESS
|
MOV DPH,A
|
MOV DPH,A
|
INC R0
|
INC R0
|
MOVX A,@R0
|
MOVX A,@R0
|
MOV DPL,A
|
MOV DPL,A
|
INC R0 ;POP CONTROL STACK
|
INC R0 ;POP CONTROL STACK
|
MOVX A,@DPTR ;SEE IF GOSUB WAS THE LAST STATEMENT
|
MOVX A,@DPTR ;SEE IF GOSUB WAS THE LAST STATEMENT
|
CJNE A,#EOF,SR01
|
CJNE A,#EOF,SR01
|
AJMP CMNDLK
|
AJMP CMNDLK
|
SR01: MOV A,R5 ;GET TYPE
|
SR01: MOV A,R5 ;GET TYPE
|
JZ SGT1 ;EXIT IF ZERO
|
JZ SGT1 ;EXIT IF ZERO
|
MOV CSTKA,R0 ;POP THE STACK
|
MOV CSTKA,R0 ;POP THE STACK
|
CPL A ;OPTION TEST, 00H, 55H, 0FFH, NOW 55H
|
CPL A ;OPTION TEST, 00H, 55H, 0FFH, NOW 55H
|
JNZ SGT1 ;MUST BE GOSUB
|
JNZ SGT1 ;MUST BE GOSUB
|
RET ;NORMAL FALL THRU EXIT FOR NO MATCH
|
RET ;NORMAL FALL THRU EXIT FOR NO MATCH
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - GOSUB
|
; The statement action routine - GOSUB
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SGOSUB: ACALL RLINE ;NEW TXA IN DPTR
|
SGOSUB: ACALL RLINE ;NEW TXA IN DPTR
|
;
|
;
|
SGS0: MOV R4,#GTYPE
|
SGS0: MOV R4,#GTYPE
|
ACALL SGS1 ;SET EVERYTHING UP
|
ACALL SGS1 ;SET EVERYTHING UP
|
AJMP SF3 ;EXIT
|
AJMP SF3 ;EXIT
|
;
|
;
|
SGS1: MOV A,#-3 ;ALLOCATE 3 BYTES ON CONTROL STACK
|
SGS1: MOV A,#-3 ;ALLOCATE 3 BYTES ON CONTROL STACK
|
ACALL PUSHCS
|
ACALL PUSHCS
|
;
|
;
|
T_X_S: MOV P2,#CSTKAH ;SET UP PORT FOR CONTROL STACK
|
T_X_S: MOV P2,#CSTKAH ;SET UP PORT FOR CONTROL STACK
|
MOV A,TXAL ;GET RETURN ADDRESS AND SAVE IT
|
MOV A,TXAL ;GET RETURN ADDRESS AND SAVE IT
|
MOVX @R0,A
|
MOVX @R0,A
|
DEC R0
|
DEC R0
|
MOV A,TXAH
|
MOV A,TXAH
|
MOVX @R0,A
|
MOVX @R0,A
|
DEC R0
|
DEC R0
|
MOV A,R4 ;GET TYPE
|
MOV A,R4 ;GET TYPE
|
MOVX @R0,A ;SAVE TYPE
|
MOVX @R0,A ;SAVE TYPE
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
;
|
;
|
CS1: MOV A,#3 ;POP 3 BYTES
|
CS1: MOV A,#3 ;POP 3 BYTES
|
ACALL PUSHCS
|
ACALL PUSHCS
|
;
|
;
|
CSETUP: MOV R0,CSTKA ;GET CONTROL STACK
|
CSETUP: MOV R0,CSTKA ;GET CONTROL STACK
|
MOV P2,#CSTKAH
|
MOV P2,#CSTKAH
|
MOVX A,@R0 ;GET BYTE
|
MOVX A,@R0 ;GET BYTE
|
CJNE A,R4B0,CSETUP1 ;SEE IF TYPE MATCH
|
CJNE A,R4B0,CSETUP1 ;SEE IF TYPE MATCH
|
INC R0
|
INC R0
|
RET
|
RET
|
CSETUP1:JZ E4XX ;EXIT IF STACK UNDERFLOW
|
CSETUP1:JZ E4XX ;EXIT IF STACK UNDERFLOW
|
CJNE A,#FTYPE,CS1 ;SEE IF FOR TYPE
|
CJNE A,#FTYPE,CS1 ;SEE IF FOR TYPE
|
ACALL XXI3 ;WASTE THE FOR TYPE
|
ACALL XXI3 ;WASTE THE FOR TYPE
|
SJMP CSETUP ;LOOP
|
SJMP CSETUP ;LOOP
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - NEXT
|
; The statement action routine - NEXT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SNEXT: MOV R4,#FTYPE ;FOR TYPE
|
SNEXT: MOV R4,#FTYPE ;FOR TYPE
|
ACALL CSETUP ;SETUP CONTROL STACK
|
ACALL CSETUP ;SETUP CONTROL STACK
|
MOV TEMP5,R0 ;SAVE CONTROL VARIABLE ADDRESS
|
MOV TEMP5,R0 ;SAVE CONTROL VARIABLE ADDRESS
|
MOV R1,#TEMP1 ;SAVE VAR + RETURN IN TEMP1-4
|
MOV R1,#TEMP1 ;SAVE VAR + RETURN IN TEMP1-4
|
;
|
;
|
XXI: MOVX A,@R0 ;LOOP UNTIL DONE
|
XXI: MOVX A,@R0 ;LOOP UNTIL DONE
|
MOV @R1,A
|
MOV @R1,A
|
INC R1
|
INC R1
|
INC R0
|
INC R0
|
CJNE R1,#TEMP5,XXI
|
CJNE R1,#TEMP5,XXI
|
;
|
;
|
ACALL VAR ;SEE IF THE USER HAS A VARIABLE
|
ACALL VAR ;SEE IF THE USER HAS A VARIABLE
|
JNC XXI1
|
JNC XXI1
|
MOV R2,TEMP1
|
MOV R2,TEMP1
|
MOV R0,TEMP2
|
MOV R0,TEMP2
|
XXI1: MOV A,R2 ;SEE IF VAR'S AGREE
|
XXI1: MOV A,R2 ;SEE IF VAR'S AGREE
|
CJNE A,TEMP1,E4XX
|
CJNE A,TEMP1,E4XX
|
MOV A,R0
|
MOV A,R0
|
CJNE A,TEMP2,E4XX
|
CJNE A,TEMP2,E4XX
|
ACALL PUSHAS ;PUT CONTROL VARIABLE ON STACK
|
ACALL PUSHAS ;PUT CONTROL VARIABLE ON STACK
|
MOV A,#FPSIZ+FPSIZ+2;COMPUTE ADDRESS TO STEP VALUE SIGN
|
MOV A,#FPSIZ+FPSIZ+2;COMPUTE ADDRESS TO STEP VALUE SIGN
|
ADD A,TEMP5 ;ADD IT TO BASE OF STACK
|
ADD A,TEMP5 ;ADD IT TO BASE OF STACK
|
MOV R0,A ;SAVE IN R0
|
MOV R0,A ;SAVE IN R0
|
MOV R2,#CSTKAH ;SET UP TO PUSH STEP VALUE
|
MOV R2,#CSTKAH ;SET UP TO PUSH STEP VALUE
|
MOV P2,R2 ;SET UP PORT
|
MOV P2,R2 ;SET UP PORT
|
MOVX A,@R0 ;GET SIGN
|
MOVX A,@R0 ;GET SIGN
|
INC R0 ;BACK TO EXPONENT
|
INC R0 ;BACK TO EXPONENT
|
PUSH ACC ;SAVE SIGN OF STEP
|
PUSH ACC ;SAVE SIGN OF STEP
|
ACALL PUSHAS ;PUT STEP VALUE ON STACK
|
ACALL PUSHAS ;PUT STEP VALUE ON STACK
|
PUSH R0B0 ;SAVE LIMIT VALUE LOCATION
|
PUSH R0B0 ;SAVE LIMIT VALUE LOCATION
|
CALL AADD ;ADD STEP VALUE TO VARIABLE
|
CALL AADD ;ADD STEP VALUE TO VARIABLE
|
CALL CSTAKA ;COPY STACK
|
CALL CSTAKA ;COPY STACK
|
MOV R3,TEMP1 ;GET CONTROL VARIABLE
|
MOV R3,TEMP1 ;GET CONTROL VARIABLE
|
MOV R1,TEMP2
|
MOV R1,TEMP2
|
ACALL POPAS ;SAVE THE RESULT
|
ACALL POPAS ;SAVE THE RESULT
|
MOV R2,#CSTKAH ;RESTORE LIMIT LOCATION
|
MOV R2,#CSTKAH ;RESTORE LIMIT LOCATION
|
POP R0B0
|
POP R0B0
|
ACALL PUSHAS ;PUT LIMIT ON STACK
|
ACALL PUSHAS ;PUT LIMIT ON STACK
|
CALL FP_BASE2 ;DO THE COMPARE
|
CALL FP_BASE2 ;DO THE COMPARE
|
POP ACC ;GET LIMIT SIGN BACK
|
POP ACC ;GET LIMIT SIGN BACK
|
JZ XXI2 ;IF SIGN NEGATIVE, TEST "BACKWARDS"
|
JZ XXI2 ;IF SIGN NEGATIVE, TEST "BACKWARDS"
|
CPL C
|
CPL C
|
XXI2: ORL C,F0 ;SEE IF EQUAL
|
XXI2: ORL C,F0 ;SEE IF EQUAL
|
JC N4 ;STILL SMALLER THAN LIMIT?
|
JC N4 ;STILL SMALLER THAN LIMIT?
|
XXI3: MOV A,#FSIZE ;REMOVE CONTROL STACK ENTRY
|
XXI3: MOV A,#FSIZE ;REMOVE CONTROL STACK ENTRY
|
;
|
;
|
; Fall thru to PUSHCS
|
; Fall thru to PUSHCS
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; PUSHCS - push frame onto control stack
|
; PUSHCS - push frame onto control stack
|
; acc has - number of bytes, also test for overflow
|
; acc has - number of bytes, also test for overflow
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PUSHCS: ADD A,CSTKA ;BUMP CONTROL STACK
|
PUSHCS: ADD A,CSTKA ;BUMP CONTROL STACK
|
CJNE A,#CONVT+17,PUSHCS1 ;SEE IF OVERFLOWED
|
CJNE A,#CONVT+17,PUSHCS1 ;SEE IF OVERFLOWED
|
PUSHCS1:JC E4XX ;EXIT IF STACK OVERFLOW
|
PUSHCS1:JC E4XX ;EXIT IF STACK OVERFLOW
|
XCH A,CSTKA ;STORE NEW CONTROL STACK VALUE, GET OLD
|
XCH A,CSTKA ;STORE NEW CONTROL STACK VALUE, GET OLD
|
DEC A ;BUMP OLD VALUE
|
DEC A ;BUMP OLD VALUE
|
MOV R0,A ;PUT OLD-1 IN R0
|
MOV R0,A ;PUT OLD-1 IN R0
|
;
|
;
|
PUSHCS2:RET ;EXIT
|
PUSHCS2:RET ;EXIT
|
;
|
;
|
CSC: ACALL CLN_UP ;FINISH OFF THE LINE
|
CSC: ACALL CLN_UP ;FINISH OFF THE LINE
|
JNC PUSHCS2 ;EXIT IF NO TERMINATOR
|
JNC PUSHCS2 ;EXIT IF NO TERMINATOR
|
;
|
;
|
E4XX: MOV DPTR,#EXC ;CONTROL STACK ERROR
|
E4XX: MOV DPTR,#EXC ;CONTROL STACK ERROR
|
AJMP EK ;STACK ERROR
|
AJMP EK ;STACK ERROR
|
;
|
;
|
N4: MOV TXAH,TEMP3 ;GET TEXT POINTER
|
N4: MOV TXAH,TEMP3 ;GET TEXT POINTER
|
MOV TXAL,TEMP4
|
MOV TXAL,TEMP4
|
AJMP ILOOP ;EXIT
|
AJMP ILOOP ;EXIT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - RESTORE
|
; The statement action routine - RESTORE
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SRESTR: ACALL X_TR ;SWAP POINTERS
|
SRESTR: ACALL X_TR ;SWAP POINTERS
|
SRESTR1:ACALL DP_B ;GET THE STARTING ADDRESS
|
SRESTR1:ACALL DP_B ;GET THE STARTING ADDRESS
|
ACALL T_DP ;PUT STARTING ADDRESS IN TEXT POINTER
|
ACALL T_DP ;PUT STARTING ADDRESS IN TEXT POINTER
|
ACALL B_TXA ;BUMP TXA
|
ACALL B_TXA ;BUMP TXA
|
;
|
;
|
; Fall thru
|
; Fall thru
|
;
|
;
|
X_TR: ;swap txa and rtxa
|
X_TR: ;swap txa and rtxa
|
;
|
;
|
XCH A,TXAH
|
XCH A,TXAH
|
XCH A,RTXAH
|
XCH A,RTXAH
|
XCH A,TXAH
|
XCH A,TXAH
|
XCH A,TXAL
|
XCH A,TXAL
|
XCH A,RTXAL
|
XCH A,RTXAL
|
XCH A,TXAL
|
XCH A,TXAL
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - READ
|
; The statement action routine - READ
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SREAD: ACALL X_TR ;SWAP POINTERS
|
SREAD: ACALL X_TR ;SWAP POINTERS
|
;
|
;
|
SRD0: ACALL C_TST ;CHECK FOR COMMA
|
SRD0: ACALL C_TST ;CHECK FOR COMMA
|
JC SRD4 ;SEE WHAT IT IS
|
JC SRD4 ;SEE WHAT IT IS
|
;
|
;
|
SRD: ACALL EXPRB ;EVALUATE THE EXPRESSION
|
SRD: ACALL EXPRB ;EVALUATE THE EXPRESSION
|
ACALL GC ;GET THE CHARACTER AFTER EXPRESSION
|
ACALL GC ;GET THE CHARACTER AFTER EXPRESSION
|
CJNE A,#',',SRD1 ;SEE IF MORE DATA
|
CJNE A,#',',SRD1 ;SEE IF MORE DATA
|
SJMP SRD2 ;BYBASS CLEAN UP IF A COMMA
|
SJMP SRD2 ;BYBASS CLEAN UP IF A COMMA
|
;
|
;
|
SRD1: ACALL CLN_UP ;FINISH OFF THE LINE, IF AT END
|
SRD1: ACALL CLN_UP ;FINISH OFF THE LINE, IF AT END
|
;
|
;
|
SRD2: ACALL X_TR ;RESTORE POINTERS
|
SRD2: ACALL X_TR ;RESTORE POINTERS
|
ACALL VAR_ER ;GET VARIABLE ADDRESS
|
ACALL VAR_ER ;GET VARIABLE ADDRESS
|
ACALL XPOP ;FLIP THE REGISTERS FOR POPAS
|
ACALL XPOP ;FLIP THE REGISTERS FOR POPAS
|
ACALL C_TST ;SEE IF A COMMA
|
ACALL C_TST ;SEE IF A COMMA
|
JNC SREAD ;READ AGAIN IF A COMMA
|
JNC SREAD ;READ AGAIN IF A COMMA
|
SRD21: RET ;EXIT IF NOT
|
SRD21: RET ;EXIT IF NOT
|
;
|
;
|
SRD4: CJNE A,#T_DATA,SRD5 ;SEE IF DATA
|
SRD4: CJNE A,#T_DATA,SRD5 ;SEE IF DATA
|
ACALL GCI1 ;BUMP POINTER
|
ACALL GCI1 ;BUMP POINTER
|
SJMP SRD
|
SJMP SRD
|
;
|
;
|
SRD5: CJNE A,#EOF,SRD6 ;SEE IF YOU BLEW IT
|
SRD5: CJNE A,#EOF,SRD6 ;SEE IF YOU BLEW IT
|
SRD51: ACALL X_TR ;GET THE TEXT POINTER BACK
|
SRD51: ACALL X_TR ;GET THE TEXT POINTER BACK
|
MOV DPTR,#E14X ;READ ERROR
|
MOV DPTR,#E14X ;READ ERROR
|
;
|
;
|
EK: LJMP ERROR
|
EK: LJMP ERROR
|
;
|
;
|
SRD6: ACALL FINDCR ;WASTE THIS LINE
|
SRD6: ACALL FINDCR ;WASTE THIS LINE
|
ACALL CLN_UP ;CLEAN IT UP
|
ACALL CLN_UP ;CLEAN IT UP
|
JC SRD51 ;ERROR IF AT END
|
JC SRD51 ;ERROR IF AT END
|
SJMP SRD0
|
SJMP SRD0
|
;
|
;
|
NUMC: ACALL GC ;GET A CHARACTER
|
NUMC: ACALL GC ;GET A CHARACTER
|
CJNE A,#'#',NUMC1 ;SEE IF A #
|
CJNE A,#'#',NUMC1 ;SEE IF A #
|
SETB COB ;VALID LINE PRINT
|
SETB COB ;VALID LINE PRINT
|
AJMP IGC ;BUMP THE TEXT POINTER
|
AJMP IGC ;BUMP THE TEXT POINTER
|
;
|
;
|
NUMC1: CJNE A,#'@',SRD21 ;EXIT IF NO GOOD
|
NUMC1: CJNE A,#'@',SRD21 ;EXIT IF NO GOOD
|
SETB LPB
|
SETB LPB
|
AJMP IGC
|
AJMP IGC
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - PRINT
|
; The statement action routine - PRINT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SPH0: SETB ZSURP ;NO ZEROS
|
SPH0: SETB ZSURP ;NO ZEROS
|
;
|
;
|
SPH1: SETB HMODE ;HEX MODE
|
SPH1: SETB HMODE ;HEX MODE
|
;
|
;
|
SPRINT: ACALL NUMC ;TEST FOR A LINE PRINT
|
SPRINT: ACALL NUMC ;TEST FOR A LINE PRINT
|
ACALL SPRINT2 ;PROCEED
|
ACALL SPRINT2 ;PROCEED
|
SPRINT1:ANL 35,#11110101B ;CLEAR COB AND LPB
|
SPRINT1:ANL 35,#11110101B ;CLEAR COB AND LPB
|
ANL 38,#00111111B ;NO HEX MODE
|
ANL 38,#00111111B ;NO HEX MODE
|
;
|
;
|
RET
|
RET
|
;
|
;
|
SPRINT2:ACALL DELTST ;CHECK FOR A DELIMITER
|
SPRINT2:ACALL DELTST ;CHECK FOR A DELIMITER
|
JC SP1
|
JC SP1
|
;
|
;
|
SP0: JMP CRLF ;EXIT WITH A CR IF SO
|
SP0: JMP CRLF ;EXIT WITH A CR IF SO
|
;
|
;
|
SP2: ACALL C_TST ;CHECK FOR A COMMA
|
SP2: ACALL C_TST ;CHECK FOR A COMMA
|
JC SP0 ;EXIT IF NO COMMA
|
JC SP0 ;EXIT IF NO COMMA
|
;
|
;
|
SP1: ACALL CPS ;SEE IF A STRING TO PRINT
|
SP1: ACALL CPS ;SEE IF A STRING TO PRINT
|
JNC SP2 ;IF A STRING, CHECK FOR A COMMA
|
JNC SP2 ;IF A STRING, CHECK FOR A COMMA
|
;
|
;
|
SP4: CJNE A,#T_TAB,SP6
|
SP4: CJNE A,#T_TAB,SP6
|
ACALL I_PI ;ALWAYS CLEARS CARRY
|
ACALL I_PI ;ALWAYS CLEARS CARRY
|
SUBB A,PHEAD ;TAKE DELTA BETWEEN TAB AND PHEAD
|
SUBB A,PHEAD ;TAKE DELTA BETWEEN TAB AND PHEAD
|
JC SP2 ;EXIT IF PHEAD > TAB
|
JC SP2 ;EXIT IF PHEAD > TAB
|
SJMP SP7 ;OUTPUT SPACES
|
SJMP SP7 ;OUTPUT SPACES
|
;
|
;
|
SP6: CJNE A,#T_SPC,SM
|
SP6: CJNE A,#T_SPC,SM
|
ACALL I_PI ;SET UP PAREN VALUE
|
ACALL I_PI ;SET UP PAREN VALUE
|
;
|
;
|
SP7: JZ SP2
|
SP7: JZ SP2
|
LCALL STEROT ;OUTPUT A SPACE
|
LCALL STEROT ;OUTPUT A SPACE
|
DEC A ;DECREMENT COUNTER
|
DEC A ;DECREMENT COUNTER
|
SJMP SP7 ;LOOP
|
SJMP SP7 ;LOOP
|
;
|
;
|
$EJECT
|
$EJECT
|
SM: CJNE A,#T_CHR,SP8
|
SM: CJNE A,#T_CHR,SP8
|
ACALL IGC
|
ACALL IGC
|
CJNE A,#'$',SM01
|
CJNE A,#'$',SM01
|
ACALL CNX ;PUT THE CHARACTER ON THE STACK
|
ACALL CNX ;PUT THE CHARACTER ON THE STACK
|
ACALL IFIXL ;PUT THE CHARACTER IN R1
|
ACALL IFIXL ;PUT THE CHARACTER IN R1
|
SJMP SM02
|
SJMP SM02
|
SM01: ACALL ONE ;EVALUATE THE EXPRESSION, PUT IN R3:R1
|
SM01: ACALL ONE ;EVALUATE THE EXPRESSION, PUT IN R3:R1
|
ACALL ERPAR
|
ACALL ERPAR
|
SM02: MOV R5,R1B0 ;BYTE TO OUTPUT
|
SM02: MOV R5,R1B0 ;BYTE TO OUTPUT
|
SJMP SQ
|
SJMP SQ
|
;
|
;
|
SP8: CJNE A,#T_CR,SX
|
SP8: CJNE A,#T_CR,SX
|
ACALL GCI1 ;EAT THE TOKEN
|
ACALL GCI1 ;EAT THE TOKEN
|
MOV R5,#CR
|
MOV R5,#CR
|
;
|
;
|
SQ: CALL TEROT
|
SQ: CALL TEROT
|
SJMP SP2 ;OUTPUT A CR AND DO IT AGAIN
|
SJMP SP2 ;OUTPUT A CR AND DO IT AGAIN
|
;
|
;
|
SX: CJNE A,#T_USE,SP9 ;USING TOKEN
|
SX: CJNE A,#T_USE,SP9 ;USING TOKEN
|
ACALL IGC ;GE THE CHARACTER AFTER THE USING TOKEN
|
ACALL IGC ;GE THE CHARACTER AFTER THE USING TOKEN
|
CJNE A,#'F',U4 ;SEE IF FLOATING
|
CJNE A,#'F',U4 ;SEE IF FLOATING
|
MOV FORMAT,#0F0H ;SET FLOATING
|
MOV FORMAT,#0F0H ;SET FLOATING
|
ACALL IGC ;BUMP THE POINTER AND GET THE CHARACTER
|
ACALL IGC ;BUMP THE POINTER AND GET THE CHARACTER
|
ACALL GCI1 ;BUMP IT AGAIN
|
ACALL GCI1 ;BUMP IT AGAIN
|
ANL A,#0FH ;STRIP OFF ASCII BIAS
|
ANL A,#0FH ;STRIP OFF ASCII BIAS
|
JZ U3 ;EXIT IF ZERO
|
JZ U3 ;EXIT IF ZERO
|
CJNE A,#3,SX1 ;SEE IF AT LEAST A THREE
|
CJNE A,#3,SX1 ;SEE IF AT LEAST A THREE
|
SX1: JNC U3 ;FORCE A THREE IF NOT A THREE
|
SX1: JNC U3 ;FORCE A THREE IF NOT A THREE
|
MOV A,#3
|
MOV A,#3
|
;
|
;
|
U3: ORL FORMAT,A ;PUT DIGIT IN FORMAT
|
U3: ORL FORMAT,A ;PUT DIGIT IN FORMAT
|
SJMP U8 ;CLEAN UP END
|
SJMP U8 ;CLEAN UP END
|
;
|
;
|
U4: CJNE A,#'0',U5
|
U4: CJNE A,#'0',U5
|
MOV FORMAT,#0 ;FREE FORMAT
|
MOV FORMAT,#0 ;FREE FORMAT
|
ACALL GCI1 ;BUMP THE POINTER
|
ACALL GCI1 ;BUMP THE POINTER
|
SJMP U8
|
SJMP U8
|
;
|
;
|
U5: CJNE A,#'#',U8 ;SEE IF INTGER FORMAT
|
U5: CJNE A,#'#',U8 ;SEE IF INTGER FORMAT
|
ACALL U6
|
ACALL U6
|
MOV FORMAT,R7 ;SAVE THE FORMAT
|
MOV FORMAT,R7 ;SAVE THE FORMAT
|
CJNE A,#'.',U8A ;SEE IF TERMINATOR WAS RADIX
|
CJNE A,#'.',U8A ;SEE IF TERMINATOR WAS RADIX
|
ACALL IGC ;BUMP PAST .
|
ACALL IGC ;BUMP PAST .
|
ACALL U6 ;LOOP AGAIN
|
ACALL U6 ;LOOP AGAIN
|
MOV A,R7 ;GET COUNT
|
MOV A,R7 ;GET COUNT
|
ADD A,FORMAT ;SEE IF TOO BIG
|
ADD A,FORMAT ;SEE IF TOO BIG
|
ADD A,#0F7H
|
ADD A,#0F7H
|
JNC U5A
|
JNC U5A
|
;
|
;
|
$EJECT
|
$EJECT
|
SE0: AJMP INTERX ;ERROR, BAD SYNTAX
|
SE0: AJMP INTERX ;ERROR, BAD SYNTAX
|
;
|
;
|
U5A: MOV A,R7 ;GET THE COUNT BACK
|
U5A: MOV A,R7 ;GET THE COUNT BACK
|
SWAP A ;ADJUST
|
SWAP A ;ADJUST
|
ORL FORMAT,A ;GET THE COUNT
|
ORL FORMAT,A ;GET THE COUNT
|
;
|
;
|
U8A: MOV A,FORMAT
|
U8A: MOV A,FORMAT
|
;
|
;
|
U8B: SWAP A ;GET THE FORMAT RIGHT
|
U8B: SWAP A ;GET THE FORMAT RIGHT
|
MOV FORMAT,A
|
MOV FORMAT,A
|
;
|
;
|
U8: ACALL ERPAR
|
U8: ACALL ERPAR
|
AJMP SP2 ;DONE
|
AJMP SP2 ;DONE
|
;
|
;
|
U6: MOV R7,#0 ;SET COUNTER
|
U6: MOV R7,#0 ;SET COUNTER
|
;
|
;
|
U7: CJNE A,#'#',SP9A ;EXIT IF NOT A #
|
U7: CJNE A,#'#',SP9A ;EXIT IF NOT A #
|
INC R7 ;BUMP COUNTER
|
INC R7 ;BUMP COUNTER
|
ACALL IGC ;GET THE NEXT CHARACTER
|
ACALL IGC ;GET THE NEXT CHARACTER
|
SJMP U7 ;LOOP
|
SJMP U7 ;LOOP
|
;
|
;
|
SP9: ACALL DELTST1 ;CHECK FOR DELIMITER
|
SP9: ACALL DELTST1 ;CHECK FOR DELIMITER
|
JNC SP9A ;EXIT IF A DELIMITER
|
JNC SP9A ;EXIT IF A DELIMITER
|
;
|
;
|
CJNE A,#T_ELSE,SS
|
CJNE A,#T_ELSE,SS
|
;
|
;
|
SP9A: RET ;EXIT IF ELSE TOKEN
|
SP9A: RET ;EXIT IF ELSE TOKEN
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; P_E - Evaluate an expression in parens ( )
|
; P_E - Evaluate an expression in parens ( )
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
P_E: MOV R7,#T_LPAR
|
P_E: MOV R7,#T_LPAR
|
ACALL WE
|
ACALL WE
|
;
|
;
|
ERPAR: MOV R7,#')' ;EAT A RIGHT PAREN
|
ERPAR: MOV R7,#')' ;EAT A RIGHT PAREN
|
;
|
;
|
EATC: ACALL GCI ;GET THE CHARACTER
|
EATC: ACALL GCI ;GET THE CHARACTER
|
CJNE A,R7B0,SE0 ;ERROR IF NOT THE SAME
|
CJNE A,R7B0,SE0 ;ERROR IF NOT THE SAME
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
S_ON: ; ON Statement
|
S_ON: ; ON Statement
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL ONE ;GET THE EXPRESSION
|
ACALL ONE ;GET THE EXPRESSION
|
ACALL GCI ;GET THE NEXT CHARACTER
|
ACALL GCI ;GET THE NEXT CHARACTER
|
CJNE A,#T_GOTO,C0
|
CJNE A,#T_GOTO,C0
|
ACALL C1 ;EAT THE COMMAS
|
ACALL C1 ;EAT THE COMMAS
|
AJMP SF3 ;DO GOTO
|
AJMP SF3 ;DO GOTO
|
;
|
;
|
C0: CJNE A,#T_GOSB,SE0
|
C0: CJNE A,#T_GOSB,SE0
|
ACALL C1
|
ACALL C1
|
AJMP SGS0 ;DO GOSUB
|
AJMP SGS0 ;DO GOSUB
|
;
|
;
|
C1: CJNE R1,#0,C2
|
C1: CJNE R1,#0,C2
|
ACALL INTERR ;GET THE LINE NUMBER
|
ACALL INTERR ;GET THE LINE NUMBER
|
ACALL FINDCR
|
ACALL FINDCR
|
AJMP RL1 ;FINISH UP THIS LINE
|
AJMP RL1 ;FINISH UP THIS LINE
|
;
|
;
|
C2: MOV R7,#','
|
C2: MOV R7,#','
|
ACALL FINDC
|
ACALL FINDC
|
CJNE A,#',',SE0 ;ERROR IF NOT A COMMA
|
CJNE A,#',',SE0 ;ERROR IF NOT A COMMA
|
DEC R1
|
DEC R1
|
ACALL GCI1 ;BUMP PAST COMMA
|
ACALL GCI1 ;BUMP PAST COMMA
|
SJMP C1
|
SJMP C1
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
SS: ACALL S_C ;SEE IF A STRING
|
SS: ACALL S_C ;SEE IF A STRING
|
JC SA ;NO STRING IF CARRY IS SET
|
JC SA ;NO STRING IF CARRY IS SET
|
LCALL UPRNT ;PUT POINTER IN DPTR
|
LCALL UPRNT ;PUT POINTER IN DPTR
|
AJMP SP2 ;SEE IF MORE
|
AJMP SP2 ;SEE IF MORE
|
;
|
;
|
SA: ACALL EXPRB ;MUST BE AN EXPRESSION
|
SA: ACALL EXPRB ;MUST BE AN EXPRESSION
|
MOV A,#72
|
MOV A,#72
|
CJNE A,PHEAD,SA1 ;CHECK PHEAD POSITION
|
CJNE A,PHEAD,SA1 ;CHECK PHEAD POSITION
|
SA1: JNC SA2
|
SA1: JNC SA2
|
ACALL SP0 ;FORCE A CRLF
|
ACALL SP0 ;FORCE A CRLF
|
SA2: JNB HMODE,S13 ;HEX MODE?
|
SA2: JNB HMODE,S13 ;HEX MODE?
|
CALL FCMP ;SEE IF TOS IS < 0FFFH
|
CALL FCMP ;SEE IF TOS IS < 0FFFH
|
JC S13 ;EXIT IF GREATER
|
JC S13 ;EXIT IF GREATER
|
CALL AABS ;GET THE SIGN
|
CALL AABS ;GET THE SIGN
|
JNZ OOPS ;WASTE IF NEGATIVE
|
JNZ OOPS ;WASTE IF NEGATIVE
|
ACALL IFIXL
|
ACALL IFIXL
|
CALL FP_BASE11 ;PRINT HEXMODE
|
CALL FP_BASE11 ;PRINT HEXMODE
|
AJMP SP2
|
AJMP SP2
|
OOPS: CALL ANEG ;MAKE IT NEGATIVE
|
OOPS: CALL ANEG ;MAKE IT NEGATIVE
|
;
|
;
|
S13: CALL FP_BASE7 ;DO FP OUTPUT
|
S13: CALL FP_BASE7 ;DO FP OUTPUT
|
MOV A,#1 ;OUTPUT A SPACE
|
MOV A,#1 ;OUTPUT A SPACE
|
AJMP SP7
|
AJMP SP7
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; ANU - Get variable name from text - set carry if not found
|
; ANU - Get variable name from text - set carry if not found
|
; if succeeds returns variable in R7:R6
|
; if succeeds returns variable in R7:R6
|
; R6 = 0 if no digit in name
|
; R6 = 0 if no digit in name
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ANU: ACALL IGC ;INCREMENT AND GET CHARACTER
|
ANU: ACALL IGC ;INCREMENT AND GET CHARACTER
|
LCALL DIGIT_CHECK ;CHECK FOR DIGIT
|
LCALL DIGIT_CHECK ;CHECK FOR DIGIT
|
JC AL2 ;EXIT IF VALID DIGIT
|
JC AL2 ;EXIT IF VALID DIGIT
|
CJNE A,#'_',AL ;SEE IF A _
|
CJNE A,#'_',AL ;SEE IF A _
|
RET
|
RET
|
;
|
;
|
AL: CJNE A,#'A',AL1 ;IS IT AN ASCII A?
|
AL: CJNE A,#'A',AL1 ;IS IT AN ASCII A?
|
AL1: JC AL3 ;EXIT IF CARRY IS SET
|
AL1: JC AL3 ;EXIT IF CARRY IS SET
|
CJNE A,#'Z'+1,AL2 ;IS IT LESS THAN AN ASCII Z
|
CJNE A,#'Z'+1,AL2 ;IS IT LESS THAN AN ASCII Z
|
AL2: CPL C ;FLIP CARRY
|
AL2: CPL C ;FLIP CARRY
|
AL3: RET
|
AL3: RET
|
;
|
;
|
SD01: JNB F0,VAR2
|
SD01: JNB F0,VAR2
|
;
|
;
|
SD0: MOV DPTR,#E6X
|
SD0: MOV DPTR,#E6X
|
AJMP EK
|
AJMP EK
|
;
|
;
|
SDIMX: SETB F0 ;SAYS DOING A DIMENSION
|
SDIMX: SETB F0 ;SAYS DOING A DIMENSION
|
SJMP VAR1
|
SJMP VAR1
|
;
|
;
|
VAR: CLR F0 ;SAYS DOING A VARIABLE
|
VAR: CLR F0 ;SAYS DOING A VARIABLE
|
;
|
;
|
VAR1: ACALL GC ;GET THE CHARACTER
|
VAR1: ACALL GC ;GET THE CHARACTER
|
ACALL AL ;CHECK FOR ALPHA
|
ACALL AL ;CHECK FOR ALPHA
|
JNC VAR11 ;ERROR IF IN DIM
|
JNC VAR11 ;ERROR IF IN DIM
|
JB F0,SD0
|
JB F0,SD0
|
RET
|
RET
|
VAR11: MOV R7,A ;SAVE ALPHA CHARACTER
|
VAR11: MOV R7,A ;SAVE ALPHA CHARACTER
|
CLR A ;ZERO IN CASE OF FAILURE
|
CLR A ;ZERO IN CASE OF FAILURE
|
MOV R5,A ;SAVE IT
|
MOV R5,A ;SAVE IT
|
;
|
;
|
VY: MOV R6,A
|
VY: MOV R6,A
|
ACALL ANU ;CHECK FOR ALPHA OR NUMBER
|
ACALL ANU ;CHECK FOR ALPHA OR NUMBER
|
JC VX ;EXIT IF NO ALPHA OR NUM
|
JC VX ;EXIT IF NO ALPHA OR NUM
|
;
|
;
|
XCH A,R7
|
XCH A,R7
|
ADD A,R5 ;NUMBER OF CHARACTERS IN ALPHABET
|
ADD A,R5 ;NUMBER OF CHARACTERS IN ALPHABET
|
XCH A,R7 ;PUT IT BACK
|
XCH A,R7 ;PUT IT BACK
|
MOV R5,#26 ;FOR THE SECOND TIME AROUND
|
MOV R5,#26 ;FOR THE SECOND TIME AROUND
|
SJMP VY
|
SJMP VY
|
;
|
;
|
VX: CLR LINEB ;TELL EDITOR A VARIABLE IS DECLARED
|
VX: CLR LINEB ;TELL EDITOR A VARIABLE IS DECLARED
|
CJNE A,#T_LPAR,V4 ;SEE IF A LEFT PAREN
|
CJNE A,#T_LPAR,V4 ;SEE IF A LEFT PAREN
|
;
|
;
|
ORL R6B0,#80H ;SET BIT 7 TO SIGINIFY MATRIX
|
ORL R6B0,#80H ;SET BIT 7 TO SIGINIFY MATRIX
|
CALL F_VAR ;FIND THE VARIABLE
|
CALL F_VAR ;FIND THE VARIABLE
|
PUSH R2B0 ;SAVE THE LOCATION
|
PUSH R2B0 ;SAVE THE LOCATION
|
PUSH R0B0
|
PUSH R0B0
|
JNC SD01 ;DEFAULT IF NOT IN TABLE
|
JNC SD01 ;DEFAULT IF NOT IN TABLE
|
JB F0,SDI ;NO DEFAULT FOR DIMENSION
|
JB F0,SDI ;NO DEFAULT FOR DIMENSION
|
MOV R1,#10
|
MOV R1,#10
|
MOV R3,#0
|
MOV R3,#0
|
ACALL D_CHK
|
ACALL D_CHK
|
;
|
;
|
VAR2: ACALL PAREN_INT ;EVALUATE INTEGER IN PARENS
|
VAR2: ACALL PAREN_INT ;EVALUATE INTEGER IN PARENS
|
CJNE R3,#0,SD0 ;ERROR IF R3<>0
|
CJNE R3,#0,SD0 ;ERROR IF R3<>0
|
POP DPL ;GET VAR FOR LOOKUP
|
POP DPL ;GET VAR FOR LOOKUP
|
POP DPH
|
POP DPH
|
MOVX A,@DPTR ;GET DIMENSION
|
MOVX A,@DPTR ;GET DIMENSION
|
DEC A ;BUMP OFFSET
|
DEC A ;BUMP OFFSET
|
SUBB A,R1 ;A MUST BE > R1
|
SUBB A,R1 ;A MUST BE > R1
|
JC SD0
|
JC SD0
|
LCALL DECDP2 ;BUMP POINTER TWICE
|
LCALL DECDP2 ;BUMP POINTER TWICE
|
ACALL VARB ;CALCULATE THE BASE
|
ACALL VARB ;CALCULATE THE BASE
|
;
|
;
|
X3120: XCH A,R1 ;SWAP R2:R0, R3:R1
|
X3120: XCH A,R1 ;SWAP R2:R0, R3:R1
|
XCH A,R0
|
XCH A,R0
|
XCH A,R1
|
XCH A,R1
|
XCH A,R3
|
XCH A,R3
|
XCH A,R2
|
XCH A,R2
|
XCH A,R3
|
XCH A,R3
|
RET
|
RET
|
;
|
;
|
V4: JB F0,SD0 ;ERROR IF NO LPAR FOR DIM
|
V4: JB F0,SD0 ;ERROR IF NO LPAR FOR DIM
|
LCALL F_VAR ;GET SCALAR VARIABLE
|
LCALL F_VAR ;GET SCALAR VARIABLE
|
CLR C
|
CLR C
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
SDI: ACALL PAREN_INT ;EVALUATE PAREN EXPRESSION
|
SDI: ACALL PAREN_INT ;EVALUATE PAREN EXPRESSION
|
CJNE R3,#0,SD0 ;ERROR IF NOT ZERO
|
CJNE R3,#0,SD0 ;ERROR IF NOT ZERO
|
POP R0B0 ;SET UP R2:R0
|
POP R0B0 ;SET UP R2:R0
|
POP R2B0
|
POP R2B0
|
ACALL D_CHK ;DO DIM
|
ACALL D_CHK ;DO DIM
|
ACALL C_TST ;CHECK FOR COMMA
|
ACALL C_TST ;CHECK FOR COMMA
|
JNC SDIMX ;LOOP IF COMMA
|
JNC SDIMX ;LOOP IF COMMA
|
RET ;RETURN IF NO COMMA
|
RET ;RETURN IF NO COMMA
|
;
|
;
|
D_CHK: INC R1 ;BUMP FOR TABLE LOOKUP
|
D_CHK: INC R1 ;BUMP FOR TABLE LOOKUP
|
MOV A,R1
|
MOV A,R1
|
JZ SD0 ;ERROR IF 0FFFFH
|
JZ SD0 ;ERROR IF 0FFFFH
|
MOV R4,A ;SAVE FOR LATER
|
MOV R4,A ;SAVE FOR LATER
|
MOV DPTR,#MT_ALL ;GET MATRIX ALLOCATION
|
MOV DPTR,#MT_ALL ;GET MATRIX ALLOCATION
|
ACALL VARB ;DO THE CALCULATION
|
ACALL VARB ;DO THE CALCULATION
|
MOV R7,DPH ;SAVE MATRIX ALLOCATION
|
MOV R7,DPH ;SAVE MATRIX ALLOCATION
|
MOV R6,DPL
|
MOV R6,DPL
|
MOV DPTR,#ST_ALL ;SEE IF TOO MUCH MEMORY TAKEN
|
MOV DPTR,#ST_ALL ;SEE IF TOO MUCH MEMORY TAKEN
|
CALL FUL1 ;ST_ALL SHOULD BE > R3:R1
|
CALL FUL1 ;ST_ALL SHOULD BE > R3:R1
|
MOV DPTR,#MT_ALL ;SAVE THE NEW MATRIX POINTER
|
MOV DPTR,#MT_ALL ;SAVE THE NEW MATRIX POINTER
|
CALL S31DP
|
CALL S31DP
|
MOV DPL,R0 ;GET VARIABLE ADDRESS
|
MOV DPL,R0 ;GET VARIABLE ADDRESS
|
MOV DPH,R2
|
MOV DPH,R2
|
MOV A,R4 ;DIMENSION SIZE
|
MOV A,R4 ;DIMENSION SIZE
|
MOVX @DPTR,A ;SAVE IT
|
MOVX @DPTR,A ;SAVE IT
|
CALL DECDP2 ;SAVE TARGET ADDRESS
|
CALL DECDP2 ;SAVE TARGET ADDRESS
|
;
|
;
|
R76S: MOV A,R7
|
R76S: MOV A,R7
|
MOVX @DPTR,A
|
MOVX @DPTR,A
|
INC DPTR
|
INC DPTR
|
MOV A,R6 ;ELEMENT SIZE
|
MOV A,R6 ;ELEMENT SIZE
|
MOVX @DPTR,A
|
MOVX @DPTR,A
|
RET ;R2:R0 STILL HAS SYMBOL TABLE ADDRESS
|
RET ;R2:R0 STILL HAS SYMBOL TABLE ADDRESS
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The statement action routine - INPUT
|
; The statement action routine - INPUT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SINPUT: ACALL CPS ;PRINT STRING IF THERE
|
SINPUT: ACALL CPS ;PRINT STRING IF THERE
|
;
|
;
|
ACALL C_TST ;CHECK FOR A COMMA
|
ACALL C_TST ;CHECK FOR A COMMA
|
JNC IN2A ;NO CRLF
|
JNC IN2A ;NO CRLF
|
ACALL SP0 ;DO A CRLF
|
ACALL SP0 ;DO A CRLF
|
;
|
;
|
IN2: MOV R5,#'?' ;OUTPUT A ?
|
IN2: MOV R5,#'?' ;OUTPUT A ?
|
CALL TEROT
|
CALL TEROT
|
;
|
;
|
IN2A: SETB INP_B ;DOING INPUT
|
IN2A: SETB INP_B ;DOING INPUT
|
CALL INLINE ;INPUT THE LINE
|
CALL INLINE ;INPUT THE LINE
|
CLR INP_B
|
CLR INP_B
|
MOV TEMP5,#HIGH IBUF
|
MOV TEMP5,#HIGH IBUF
|
MOV TEMP4,#LOW IBUF
|
MOV TEMP4,#LOW IBUF
|
;
|
;
|
IN3: ACALL S_C ;SEE IF A STRING
|
IN3: ACALL S_C ;SEE IF A STRING
|
JC IN3A ;IF CARRY IS SET, NO STRING
|
JC IN3A ;IF CARRY IS SET, NO STRING
|
ACALL X3120 ;FLIP THE ADDRESSES
|
ACALL X3120 ;FLIP THE ADDRESSES
|
MOV R3,TEMP5
|
MOV R3,TEMP5
|
MOV R1,TEMP4
|
MOV R1,TEMP4
|
ACALL SSOOP
|
ACALL SSOOP
|
ACALL C_TST ;SEE IF MORE TO DO
|
ACALL C_TST ;SEE IF MORE TO DO
|
JNC IN2
|
JNC IN2
|
RET
|
RET
|
;
|
;
|
IN3A: CALL DTEMP ;GET THE USER LOCATION
|
IN3A: CALL DTEMP ;GET THE USER LOCATION
|
CALL GET_NUM ;GET THE USER SUPPLIED NUMBER
|
CALL GET_NUM ;GET THE USER SUPPLIED NUMBER
|
JNZ IN5 ;ERROR IF NOT ZERO
|
JNZ IN5 ;ERROR IF NOT ZERO
|
CALL TEMPD ;SAVE THE DATA POINTER
|
CALL TEMPD ;SAVE THE DATA POINTER
|
ACALL VAR_ER ;GET THE VARIABLE
|
ACALL VAR_ER ;GET THE VARIABLE
|
ACALL XPOP ;SAVE THE VARIABLE
|
ACALL XPOP ;SAVE THE VARIABLE
|
CALL DTEMP ;GET DPTR BACK FROM VAR_ER
|
CALL DTEMP ;GET DPTR BACK FROM VAR_ER
|
ACALL C_TST ;SEE IF MORE TO DO
|
ACALL C_TST ;SEE IF MORE TO DO
|
JC IN6 ;EXIT IF NO COMMA
|
JC IN6 ;EXIT IF NO COMMA
|
MOVX A,@DPTR ;GET INPUT TERMINATOR
|
MOVX A,@DPTR ;GET INPUT TERMINATOR
|
CJNE A,#',',IN5 ;IF NOT A COMMA DO A CR AND TRY AGAIN
|
CJNE A,#',',IN5 ;IF NOT A COMMA DO A CR AND TRY AGAIN
|
INC DPTR ;BUMP PAST COMMA AND READ NEXT VALUE
|
INC DPTR ;BUMP PAST COMMA AND READ NEXT VALUE
|
CALL TEMPD
|
CALL TEMPD
|
SJMP IN3
|
SJMP IN3
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
IN5: MOV DPTR,#IAN ;PRINT INPUT A NUMBER
|
IN5: MOV DPTR,#IAN ;PRINT INPUT A NUMBER
|
CALL CRP ;DO A CR, THEN, PRINT FROM ROM
|
CALL CRP ;DO A CR, THEN, PRINT FROM ROM
|
LJMP CC1 ;TRY IT AGAIN
|
LJMP CC1 ;TRY IT AGAIN
|
;
|
;
|
IN6: MOVX A,@DPTR
|
IN6: MOVX A,@DPTR
|
CJNE A,#CR,EIGP
|
CJNE A,#CR,EIGP
|
RET
|
RET
|
;
|
;
|
EIGP: MOV DPTR,#EIG
|
EIGP: MOV DPTR,#EIG
|
CALL CRP ;PRINT THE MESSAGE AND EXIT
|
CALL CRP ;PRINT THE MESSAGE AND EXIT
|
AJMP SP0 ;EXIT WITH A CRLF
|
AJMP SP0 ;EXIT WITH A CRLF
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SOT: ; On timer interrupt
|
SOT: ; On timer interrupt
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL TWO ;GET THE NUMBERS
|
ACALL TWO ;GET THE NUMBERS
|
MOV SP_H,R3
|
MOV SP_H,R3
|
MOV SP_L,R1
|
MOV SP_L,R1
|
MOV DPTR,#TIV ;SAVE THE NUMBER
|
MOV DPTR,#TIV ;SAVE THE NUMBER
|
SETB OTS
|
SETB OTS
|
AJMP R76S ;EXIT
|
AJMP R76S ;EXIT
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SCALL: ; Call a user rountine
|
SCALL: ; Call a user rountine
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL INTERR ;CONVERT INTEGER
|
ACALL INTERR ;CONVERT INTEGER
|
CJNE R2,#0,S_C_1 ;SEE IF TRAP
|
CJNE R2,#0,S_C_1 ;SEE IF TRAP
|
MOV A,R0
|
MOV A,R0
|
JB ACC.7,S_C_1
|
JB ACC.7,S_C_1
|
ADD A,R0
|
ADD A,R0
|
MOV DPTR,#4100H
|
MOV DPTR,#4100H
|
MOV DPL,A
|
MOV DPL,A
|
;
|
;
|
S_C_1: ACALL AC1 ;JUMP TO USER PROGRAM
|
S_C_1: ACALL AC1 ;JUMP TO USER PROGRAM
|
ANL PSW,#11100111B ;BACK TO BANK 0
|
ANL PSW,#11100111B ;BACK TO BANK 0
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
THREE: ; Save value for timer function
|
THREE: ; Save value for timer function
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ACALL ONE ;GET THE FIRST INTEGER
|
ACALL ONE ;GET THE FIRST INTEGER
|
CALL CBIAS ;BIAS FOR TIMER LOAD
|
CALL CBIAS ;BIAS FOR TIMER LOAD
|
MOV T_HH,R3
|
MOV T_HH,R3
|
MOV T_LL,R1
|
MOV T_LL,R1
|
MOV R7,#',' ;WASTE A COMMA
|
MOV R7,#',' ;WASTE A COMMA
|
ACALL EATC ;FALL THRU TO TWO
|
ACALL EATC ;FALL THRU TO TWO
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
TWO: ; Get two values seperated by a comma off the stack
|
TWO: ; Get two values seperated by a comma off the stack
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ACALL EXPRB
|
ACALL EXPRB
|
MOV R7,#',' ;WASTE THE COMMA
|
MOV R7,#',' ;WASTE THE COMMA
|
ACALL WE
|
ACALL WE
|
JMP TWOL ;EXIT
|
JMP TWOL ;EXIT
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ONE: ; Evaluate an expression and get an integer
|
ONE: ; Evaluate an expression and get an integer
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL EXPRB ;EVALUATE EXPERSSION
|
ACALL EXPRB ;EVALUATE EXPERSSION
|
;
|
;
|
IFIXL: CALL IFIX ;INTEGERS IN R3:R1
|
IFIXL: CALL IFIX ;INTEGERS IN R3:R1
|
MOV A,R1
|
MOV A,R1
|
RET
|
RET
|
;
|
;
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
I_PI: ; Increment text pointer then get an integer
|
I_PI: ; Increment text pointer then get an integer
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL GCI1 ;BUMP TEXT, THEN GET INTEGER
|
ACALL GCI1 ;BUMP TEXT, THEN GET INTEGER
|
;
|
;
|
PAREN_INT:; Get an integer in parens ( )
|
PAREN_INT:; Get an integer in parens ( )
|
;
|
;
|
ACALL P_E
|
ACALL P_E
|
SJMP IFIXL
|
SJMP IFIXL
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
DP_B: MOV DPH,BOFAH
|
DP_B: MOV DPH,BOFAH
|
MOV DPL,BOFAL
|
MOV DPL,BOFAL
|
RET
|
RET
|
;
|
;
|
DP_T: MOV DPH,TXAH
|
DP_T: MOV DPH,TXAH
|
MOV DPL,TXAL
|
MOV DPL,TXAL
|
RET
|
RET
|
;
|
;
|
CPS: ACALL GC ;GET THE CHARACTER
|
CPS: ACALL GC ;GET THE CHARACTER
|
CJNE A,#'"',NOPASS ;EXIT IF NO STRING
|
CJNE A,#'"',NOPASS ;EXIT IF NO STRING
|
ACALL DP_T ;GET TEXT POINTER
|
ACALL DP_T ;GET TEXT POINTER
|
INC DPTR ;BUMP PAST "
|
INC DPTR ;BUMP PAST "
|
MOV R4,#'"'
|
MOV R4,#'"'
|
CALL PN0 ;DO THE PRINT
|
CALL PN0 ;DO THE PRINT
|
INC DPTR ;GO PAST QUOTE
|
INC DPTR ;GO PAST QUOTE
|
CLR C ;PASSED TEST
|
CLR C ;PASSED TEST
|
;
|
;
|
T_DP: MOV TXAH,DPH ;TEXT POINTER GETS DPTR
|
T_DP: MOV TXAH,DPH ;TEXT POINTER GETS DPTR
|
MOV TXAL,DPL
|
MOV TXAL,DPL
|
RET
|
RET
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
S_C: ; Check for a string
|
S_C: ; Check for a string
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL GC ;GET THE CHARACTER
|
ACALL GC ;GET THE CHARACTER
|
CJNE A,#'$',NOPASS ;SET CARRY IF NOT A STRING
|
CJNE A,#'$',NOPASS ;SET CARRY IF NOT A STRING
|
AJMP IST_CAL ;CLEAR CARRY, CALCULATE OFFSET
|
AJMP IST_CAL ;CLEAR CARRY, CALCULATE OFFSET
|
;
|
;
|
;
|
;
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
C_TST: ACALL GC ;GET A CHARACTER
|
C_TST: ACALL GC ;GET A CHARACTER
|
CJNE A,#',',NOPASS ;SEE IF A COMMA
|
CJNE A,#',',NOPASS ;SEE IF A COMMA
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;GC AND GCI - GET A CHARACTER FROM TEXT (NO BLANKS)
|
;GC AND GCI - GET A CHARACTER FROM TEXT (NO BLANKS)
|
; PUT CHARACTER IN THE ACC
|
; PUT CHARACTER IN THE ACC
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
IGC: ACALL GCI1 ;BUMP POINTER, THEN GET CHARACTER
|
IGC: ACALL GCI1 ;BUMP POINTER, THEN GET CHARACTER
|
;
|
;
|
GC: SETB RS0 ;USE BANK 1
|
GC: SETB RS0 ;USE BANK 1
|
MOV P2,R2 ;SET UP PORT 2
|
MOV P2,R2 ;SET UP PORT 2
|
MOVX A,@R0 ;GET EXTERNAL BYTE
|
MOVX A,@R0 ;GET EXTERNAL BYTE
|
CLR RS0 ;BACK TO BANK 0
|
CLR RS0 ;BACK TO BANK 0
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
GCI: ACALL GC
|
GCI: ACALL GC
|
;
|
;
|
; This routine bumps txa by one and always clears the carry
|
; This routine bumps txa by one and always clears the carry
|
;
|
;
|
GCI1: SETB RS0 ;BANK 1
|
GCI1: SETB RS0 ;BANK 1
|
INC R0 ;BUMP TXA
|
INC R0 ;BUMP TXA
|
CJNE R0,#0,GCI11
|
CJNE R0,#0,GCI11
|
INC R2
|
INC R2
|
GCI11: CLR RS0
|
GCI11: CLR RS0
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; Check delimiters
|
; Check delimiters
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
DELTST: ACALL GC ;GET A CHARACTER
|
DELTST: ACALL GC ;GET A CHARACTER
|
DELTST1:CJNE A,#CR,DT1 ;SEE IF A CR
|
DELTST1:CJNE A,#CR,DT1 ;SEE IF A CR
|
CLR A
|
CLR A
|
RET
|
RET
|
;
|
;
|
DT1: CJNE A,#':',NOPASS ;SET CARRY IF NO MATCH
|
DT1: CJNE A,#':',NOPASS ;SET CARRY IF NO MATCH
|
;
|
;
|
L_RET: RET
|
L_RET: RET
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; FINDC - Find the character in R7, update TXA
|
; FINDC - Find the character in R7, update TXA
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
FINDCR: MOV R7,#CR ;KILL A STATEMENT LINE
|
FINDCR: MOV R7,#CR ;KILL A STATEMENT LINE
|
;
|
;
|
FINDC: ACALL DELTST
|
FINDC: ACALL DELTST
|
JNC L_RET
|
JNC L_RET
|
;
|
;
|
CJNE A,R7B0,FNDCL2 ;MATCH?
|
CJNE A,R7B0,FNDCL2 ;MATCH?
|
RET
|
RET
|
;
|
;
|
FNDCL2: ACALL GCI1
|
FNDCL2: ACALL GCI1
|
SJMP FINDC ;LOOP
|
SJMP FINDC ;LOOP
|
;
|
;
|
FNDCL3: ACALL GCI1
|
FNDCL3: ACALL GCI1
|
;
|
;
|
WCR: ACALL DELTST ;WASTE UNTIL A "REAL" CR
|
WCR: ACALL DELTST ;WASTE UNTIL A "REAL" CR
|
JNZ FNDCL3
|
JNZ FNDCL3
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; VAR_ER - Check for a variable, exit if error
|
; VAR_ER - Check for a variable, exit if error
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
VAR_ER: ACALL VAR
|
VAR_ER: ACALL VAR
|
SJMP INTERR1
|
SJMP INTERR1
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; S_D0 - The Statement Action Routine DO
|
; S_D0 - The Statement Action Routine DO
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
S_DO: ACALL CSC ;FINISH UP THE LINE
|
S_DO: ACALL CSC ;FINISH UP THE LINE
|
MOV R4,#DTYPE ;TYPE FOR STACK
|
MOV R4,#DTYPE ;TYPE FOR STACK
|
ACALL SGS1 ;SAVE ON STACK
|
ACALL SGS1 ;SAVE ON STACK
|
AJMP ILOOP ;EXIT
|
AJMP ILOOP ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; CLN_UP - Clean up the end of a statement, see if at end of
|
; CLN_UP - Clean up the end of a statement, see if at end of
|
; file, eat character and line count after CR
|
; file, eat character and line count after CR
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
C_2: CJNE A,#':',C_1 ;SEE IF A TERMINATOR
|
C_2: CJNE A,#':',C_1 ;SEE IF A TERMINATOR
|
AJMP GCI1 ;BUMP POINTER AND EXIT, IF SO
|
AJMP GCI1 ;BUMP POINTER AND EXIT, IF SO
|
;
|
;
|
C_1: CJNE A,#T_ELSE,EP5
|
C_1: CJNE A,#T_ELSE,EP5
|
ACALL WCR ;WASTE UNTIL A CR
|
ACALL WCR ;WASTE UNTIL A CR
|
;
|
;
|
CLN_UP: ACALL GC ;GET THE CHARACTER
|
CLN_UP: ACALL GC ;GET THE CHARACTER
|
CJNE A,#CR,C_2 ;SEE IF A CR
|
CJNE A,#CR,C_2 ;SEE IF A CR
|
ACALL IGC ;GET THE NEXT CHARACTER
|
ACALL IGC ;GET THE NEXT CHARACTER
|
CJNE A,#EOF,B_TXA ;SEE IF TERMINATOR
|
CJNE A,#EOF,B_TXA ;SEE IF TERMINATOR
|
;
|
;
|
NOPASS: SETB C
|
NOPASS: SETB C
|
RET
|
RET
|
;
|
;
|
B_TXA: XCH A,TXAL ;BUMP TXA BY THREE
|
B_TXA: XCH A,TXAL ;BUMP TXA BY THREE
|
ADD A,#3
|
ADD A,#3
|
XCH A,TXAL
|
XCH A,TXAL
|
JBC CY,B_TXA1
|
JBC CY,B_TXA1
|
RET
|
RET
|
B_TXA1: INC TXAH
|
B_TXA1: INC TXAH
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; Get an INTEGER from the text
|
; Get an INTEGER from the text
|
; sets CARRY if not found
|
; sets CARRY if not found
|
; returns the INTGER value in DPTR and R2:R0
|
; returns the INTGER value in DPTR and R2:R0
|
; returns the terminator in ACC
|
; returns the terminator in ACC
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
INTERR: ACALL INTGER ;GET THE INTEGER
|
INTERR: ACALL INTGER ;GET THE INTEGER
|
INTERR1:JC EP5 ;ERROR IF NOT FOUND
|
INTERR1:JC EP5 ;ERROR IF NOT FOUND
|
RET ;EXIT IF FOUND
|
RET ;EXIT IF FOUND
|
;
|
;
|
INTGER: ACALL DP_T
|
INTGER: ACALL DP_T
|
CALL FP_BASE9 ;CONVERT THE INTEGER
|
CALL FP_BASE9 ;CONVERT THE INTEGER
|
ACALL T_DP
|
ACALL T_DP
|
MOV DPH,R2 ;PUT THE RETURNED VALUE IN THE DPTR
|
MOV DPH,R2 ;PUT THE RETURNED VALUE IN THE DPTR
|
MOV DPL,R0
|
MOV DPL,R0
|
;
|
;
|
ITRET: RET ;EXIT
|
ITRET: RET ;EXIT
|
;
|
;
|
;
|
;
|
WE: ACALL EATC ;WASTE THE CHARACTER
|
WE: ACALL EATC ;WASTE THE CHARACTER
|
;
|
;
|
; Fall thru to evaluate the expression
|
; Fall thru to evaluate the expression
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; EXPRB - Evaluate an expression
|
; EXPRB - Evaluate an expression
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
EXPRB: MOV R2,#LOW OPBOL ;BASE PRECEDENCE
|
EXPRB: MOV R2,#LOW OPBOL ;BASE PRECEDENCE
|
;
|
;
|
EP1: PUSH R2B0 ;SAVE OPERATOR PRECEDENCE
|
EP1: PUSH R2B0 ;SAVE OPERATOR PRECEDENCE
|
CLR ARGF ;RESET STACK DESIGNATOR
|
CLR ARGF ;RESET STACK DESIGNATOR
|
;
|
;
|
EP2: MOV A,SP ;GET THE STACK POINTER
|
EP2: MOV A,SP ;GET THE STACK POINTER
|
ADD A,#12 ;NEED AT LEAST 12 BYTES
|
ADD A,#12 ;NEED AT LEAST 12 BYTES
|
JNC EP21
|
JNC EP21
|
LJMP E1XX2
|
LJMP E1XX2
|
EP21: MOV A,ASTKA ;GET THE ARG STACK
|
EP21: MOV A,ASTKA ;GET THE ARG STACK
|
SUBB A,#LOW TM_TOP+12;NEED 12 BYTES ALSO
|
SUBB A,#LOW TM_TOP+12;NEED 12 BYTES ALSO
|
JNC EP22
|
JNC EP22
|
LJMP E4YY
|
LJMP E4YY
|
EP22: JB ARGF,EP4 ;MUST BE AN OPERATOR, IF SET
|
EP22: JB ARGF,EP4 ;MUST BE AN OPERATOR, IF SET
|
ACALL VAR ;IS THE VALUE A VARIABLE?
|
ACALL VAR ;IS THE VALUE A VARIABLE?
|
JNC EP3 ;PUT VARIABLE ON STACK
|
JNC EP3 ;PUT VARIABLE ON STACK
|
;
|
;
|
ACALL CONST ;IS THE VALUE A NUMERIC CONSTANT?
|
ACALL CONST ;IS THE VALUE A NUMERIC CONSTANT?
|
JNC EP4 ;IF SO, CONTINUE, IF NOT, SEE WHAT
|
JNC EP4 ;IF SO, CONTINUE, IF NOT, SEE WHAT
|
CALL GC ;GET THE CHARACTER
|
CALL GC ;GET THE CHARACTER
|
CJNE A,#T_LPAR,EP4 ;SEE IF A LEFT PAREN
|
CJNE A,#T_LPAR,EP4 ;SEE IF A LEFT PAREN
|
MOV A,#(LOW OPBOL+1)
|
MOV A,#(LOW OPBOL+1)
|
SJMP XLPAR ;PROCESS THE LEFT PAREN
|
SJMP XLPAR ;PROCESS THE LEFT PAREN
|
;
|
;
|
EP3: ACALL PUSHAS ;SAVE VAR ON STACK
|
EP3: ACALL PUSHAS ;SAVE VAR ON STACK
|
;
|
;
|
EP4: ACALL GC ;GET THE OPERATOR
|
EP4: ACALL GC ;GET THE OPERATOR
|
;
|
;
|
CJNE A,#T_LPAR,EP41 ;IS IT AN OPERATOR
|
CJNE A,#T_LPAR,EP41 ;IS IT AN OPERATOR
|
EP41: JNC XOP ;PROCESS OPERATOR
|
EP41: JNC XOP ;PROCESS OPERATOR
|
CJNE A,#T_UOP,EP42 ;IS IT A UNARY OPERATOR
|
CJNE A,#T_UOP,EP42 ;IS IT A UNARY OPERATOR
|
EP42: JNC XBILT ;PROCESS UNARY (BUILT IN) OPERATOR
|
EP42: JNC XBILT ;PROCESS UNARY (BUILT IN) OPERATOR
|
POP R2B0 ;GET BACK PREVIOUS OPERATOR PRECEDENCE
|
POP R2B0 ;GET BACK PREVIOUS OPERATOR PRECEDENCE
|
JB ARGF,ITRET ;OK IF ARG FLAG IS SET
|
JB ARGF,ITRET ;OK IF ARG FLAG IS SET
|
;
|
;
|
EP5: CLR C ;NO RECOVERY
|
EP5: CLR C ;NO RECOVERY
|
LJMP E1XX1
|
LJMP E1XX1
|
;
|
;
|
; Process the operator
|
; Process the operator
|
;
|
;
|
XOP: ANL A,#1FH ;STRIP OFF THE TOKE BITS
|
XOP: ANL A,#1FH ;STRIP OFF THE TOKE BITS
|
JB ARGF,XOP1 ;IF ARG FLAG IS SET, PROCESS
|
JB ARGF,XOP1 ;IF ARG FLAG IS SET, PROCESS
|
CJNE A,#T_SUB-T_LPAR,XOP3
|
CJNE A,#T_SUB-T_LPAR,XOP3
|
MOV A,#T_NEG-T_LPAR
|
MOV A,#T_NEG-T_LPAR
|
;
|
;
|
$EJECT
|
$EJECT
|
XOP1: ADD A,#LOW OPBOL+1 ;BIAS THE TABLE
|
XOP1: ADD A,#LOW OPBOL+1 ;BIAS THE TABLE
|
MOV R2,A
|
MOV R2,A
|
MOV DPTR,#00H
|
MOV DPTR,#00H
|
MOVC A,@A+DPTR ;GET THE CURRENT PRECEDENCE
|
MOVC A,@A+DPTR ;GET THE CURRENT PRECEDENCE
|
MOV R4,A
|
MOV R4,A
|
POP ACC ;GET THE PREVIOUS PRECEDENCE
|
POP ACC ;GET THE PREVIOUS PRECEDENCE
|
MOV R5,A ;SAVE THE PREVIOUS PRECEDENCE
|
MOV R5,A ;SAVE THE PREVIOUS PRECEDENCE
|
MOVC A,@A+DPTR ;GET IT
|
MOVC A,@A+DPTR ;GET IT
|
CJNE A,R4B0,XOP11 ;SEE WHICH HAS HIGHER PRECEDENCE
|
CJNE A,R4B0,XOP11 ;SEE WHICH HAS HIGHER PRECEDENCE
|
CJNE A,#12,ITRET ;SEE IF ANEG
|
CJNE A,#12,ITRET ;SEE IF ANEG
|
SETB C
|
SETB C
|
XOP11: JNC ITRET ;PROCESS NON-INCREASING PRECEDENCE
|
XOP11: JNC ITRET ;PROCESS NON-INCREASING PRECEDENCE
|
;
|
;
|
; Save increasing precedence
|
; Save increasing precedence
|
;
|
;
|
PUSH R5B0 ;SAVE OLD PRECEDENCE ADDRESS
|
PUSH R5B0 ;SAVE OLD PRECEDENCE ADDRESS
|
PUSH R2B0 ;SAVE NEW PRECEDENCE ADDRESS
|
PUSH R2B0 ;SAVE NEW PRECEDENCE ADDRESS
|
ACALL GCI1 ;EAT THE OPERATOR
|
ACALL GCI1 ;EAT THE OPERATOR
|
ACALL EP1 ;EVALUATE REMAINING EXPRESSION
|
ACALL EP1 ;EVALUATE REMAINING EXPRESSION
|
XOP12: POP ACC
|
XOP12: POP ACC
|
;
|
;
|
; R2 has the action address, now setup and perform operation
|
; R2 has the action address, now setup and perform operation
|
;
|
;
|
XOP2: MOV DPTR,#OPTAB
|
XOP2: MOV DPTR,#OPTAB
|
ADD A,#LOW (NOT OPBOL)
|
ADD A,#LOW (NOT OPBOL)
|
CALL ISTA1 ;SET UP TO RETURN TO EP2
|
CALL ISTA1 ;SET UP TO RETURN TO EP2
|
AJMP EP2 ;JUMP TO EVALUATE EXPRESSION
|
AJMP EP2 ;JUMP TO EVALUATE EXPRESSION
|
;
|
;
|
; Built-in operator processing
|
; Built-in operator processing
|
;
|
;
|
XBILT: ACALL GCI1 ;EAT THE TOKEN
|
XBILT: ACALL GCI1 ;EAT THE TOKEN
|
ADD A,#LOW (50H+LOW UOPBOL)
|
ADD A,#LOW (50H+LOW UOPBOL)
|
JB ARGF,EP5 ;XBILT MUST COME AFTER AN OPERATOR
|
JB ARGF,EP5 ;XBILT MUST COME AFTER AN OPERATOR
|
CJNE A,#STP,XBILT1
|
CJNE A,#STP,XBILT1
|
XBILT1: JNC XOP2
|
XBILT1: JNC XOP2
|
;
|
;
|
XLPAR: PUSH ACC ;PUT ADDRESS ON THE STACK
|
XLPAR: PUSH ACC ;PUT ADDRESS ON THE STACK
|
ACALL P_E
|
ACALL P_E
|
SJMP XOP12 ;PERFORM OPERATION
|
SJMP XOP12 ;PERFORM OPERATION
|
;
|
;
|
XOP3: CJNE A,#T_ADD-T_LPAR,EP5
|
XOP3: CJNE A,#T_ADD-T_LPAR,EP5
|
ACALL GCI1
|
ACALL GCI1
|
AJMP EP2 ;WASTE + SIGN
|
AJMP EP2 ;WASTE + SIGN
|
;
|
;
|
$EJECT
|
$EJECT
|
XPOP: ACALL X3120 ;FLIP ARGS THEN POP
|
XPOP: ACALL X3120 ;FLIP ARGS THEN POP
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; POPAS - Pop arg stack and copy variable to R3:R1
|
; POPAS - Pop arg stack and copy variable to R3:R1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
POPAS: LCALL INC_ASTKA
|
POPAS: LCALL INC_ASTKA
|
JMP VARCOP ;COPY THE VARIABLE
|
JMP VARCOP ;COPY THE VARIABLE
|
;
|
;
|
AXTAL: MOV R2,#HIGH CXTAL
|
AXTAL: MOV R2,#HIGH CXTAL
|
MOV R0,#LOW CXTAL
|
MOV R0,#LOW CXTAL
|
;
|
;
|
; fall thru
|
; fall thru
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PUSHAS: ; Push the Value addressed by R2:R0 onto the arg stack
|
PUSHAS: ; Push the Value addressed by R2:R0 onto the arg stack
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CALL DEC_ASTKA
|
CALL DEC_ASTKA
|
SETB ARGF ;SAYS THAT SOMTHING IS ON THE STACK
|
SETB ARGF ;SAYS THAT SOMTHING IS ON THE STACK
|
LJMP VARCOP
|
LJMP VARCOP
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ST_A: ; Store at expression
|
ST_A: ; Store at expression
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL ONE ;GET THE EXPRESSION
|
ACALL ONE ;GET THE EXPRESSION
|
SJMP POPAS ;SAVE IT
|
SJMP POPAS ;SAVE IT
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LD_A: ; Load at expression
|
LD_A: ; Load at expression
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL ONE ;GET THE EXPRESSION
|
ACALL ONE ;GET THE EXPRESSION
|
ACALL X3120 ;FLIP ARGS
|
ACALL X3120 ;FLIP ARGS
|
SJMP PUSHAS
|
SJMP PUSHAS
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CONST: ; Get a constant fron the text
|
CONST: ; Get a constant fron the text
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CALL GC ;FIRST SEE IF LITERAL
|
CALL GC ;FIRST SEE IF LITERAL
|
CJNE A,#T_ASC,C0C ;SEE IF ASCII TOKEN
|
CJNE A,#T_ASC,C0C ;SEE IF ASCII TOKEN
|
CALL IGC ;GET THE CHARACTER AFTER TOKEN
|
CALL IGC ;GET THE CHARACTER AFTER TOKEN
|
CJNE A,#'$',CN0 ;SEE IF A STRING
|
CJNE A,#'$',CN0 ;SEE IF A STRING
|
;
|
;
|
CNX: CALL CSY ;CALCULATE IT
|
CNX: CALL CSY ;CALCULATE IT
|
JMP AXBYTE1 ;SAVE IT ON THE STACK
|
JMP AXBYTE1 ;SAVE IT ON THE STACK
|
;
|
;
|
CN0: CALL TWO_R2 ;PUT IT ON THE STACK
|
CN0: CALL TWO_R2 ;PUT IT ON THE STACK
|
CALL GCI1 ;BUMP THE POINTER
|
CALL GCI1 ;BUMP THE POINTER
|
JMP ERPAR ;WASTE THE RIGHT PAREN
|
JMP ERPAR ;WASTE THE RIGHT PAREN
|
;
|
;
|
;
|
;
|
C0C: CALL DP_T ;GET THE TEXT POINTER
|
C0C: CALL DP_T ;GET THE TEXT POINTER
|
CALL GET_NUM ;GET THE NUMBER
|
CALL GET_NUM ;GET THE NUMBER
|
CJNE A,#0FFH,C1C ;SEE IF NO NUMBER
|
CJNE A,#0FFH,C1C ;SEE IF NO NUMBER
|
SETB C
|
SETB C
|
C2C: RET
|
C2C: RET
|
;
|
;
|
C1C: JNZ FPTST
|
C1C: JNZ FPTST
|
CLR C
|
CLR C
|
SETB ARGF
|
SETB ARGF
|
;
|
;
|
C3C: JMP T_DP
|
C3C: JMP T_DP
|
;
|
;
|
FPTST: ANL A,#00001011B ;CHECK FOR ERROR
|
FPTST: ANL A,#00001011B ;CHECK FOR ERROR
|
JZ C2C ;EXIT IF ZERO
|
JZ C2C ;EXIT IF ZERO
|
;
|
;
|
; Handle the error condition
|
; Handle the error condition
|
;
|
;
|
MOV DPTR,#E2X ;DIVIDE BY ZERO
|
MOV DPTR,#E2X ;DIVIDE BY ZERO
|
JNB ACC.0,FPTST1 ;UNDERFLOW
|
JNB ACC.0,FPTST1 ;UNDERFLOW
|
MOV DPTR,#E7X
|
MOV DPTR,#E7X
|
FPTST1: JNB ACC.1,FPTS ;OVERFLOW
|
FPTST1: JNB ACC.1,FPTS ;OVERFLOW
|
MOV DPTR,#E11X
|
MOV DPTR,#E11X
|
;
|
;
|
FPTS: JMP ERROR
|
FPTS: JMP ERROR
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The Command action routine - LIST
|
; The Command action routine - LIST
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CLIST: CALL NUMC ;SEE IF TO LINE PORT
|
CLIST: CALL NUMC ;SEE IF TO LINE PORT
|
ACALL FSTK ;PUT 0FFFFH ON THE STACK
|
ACALL FSTK ;PUT 0FFFFH ON THE STACK
|
CALL INTGER ;SEE IF USER SUPPLIES LN
|
CALL INTGER ;SEE IF USER SUPPLIES LN
|
CLR A ;LN = 0 TO START
|
CLR A ;LN = 0 TO START
|
MOV R3,A
|
MOV R3,A
|
MOV R1,A
|
MOV R1,A
|
JC CL1 ;START FROM ZERO
|
JC CL1 ;START FROM ZERO
|
;
|
;
|
CALL TEMPD ;SAVE THE START ADDTESS
|
CALL TEMPD ;SAVE THE START ADDTESS
|
CALL GCI ;GET THE CHARACTER AFTER LIST
|
CALL GCI ;GET THE CHARACTER AFTER LIST
|
CJNE A,#T_SUB,CLIST1 ;CHECK FOR TERMINATION ADDRESS '-'
|
CJNE A,#T_SUB,CLIST1 ;CHECK FOR TERMINATION ADDRESS '-'
|
ACALL INC_ASTKA ;WASTE 0FFFFH
|
ACALL INC_ASTKA ;WASTE 0FFFFH
|
LCALL INTERR ;GET TERMINATION ADDRESS
|
LCALL INTERR ;GET TERMINATION ADDRESS
|
ACALL TWO_EY ;PUT TERMINATION ON THE ARG STACK
|
ACALL TWO_EY ;PUT TERMINATION ON THE ARG STACK
|
CLIST1: MOV R3,TEMP5 ;GET THE START ADDTESS
|
CLIST1: MOV R3,TEMP5 ;GET THE START ADDTESS
|
MOV R1,TEMP4
|
MOV R1,TEMP4
|
;
|
;
|
CL1: CALL GETLIN ;GET THE LINE NO IN R3:R1
|
CL1: CALL GETLIN ;GET THE LINE NO IN R3:R1
|
JZ CL3 ;RET IF AT END
|
JZ CL3 ;RET IF AT END
|
;
|
;
|
CL2: ACALL C3C ;SAVE THE ADDRESS
|
CL2: ACALL C3C ;SAVE THE ADDRESS
|
INC DPTR ;POINT TO LINE NUMBER
|
INC DPTR ;POINT TO LINE NUMBER
|
ACALL PMTOP1 ;PUT LINE NUMBER ON THE STACK
|
ACALL PMTOP1 ;PUT LINE NUMBER ON THE STACK
|
ACALL CMPLK ;COMPARE LN TO END ADDRESS
|
ACALL CMPLK ;COMPARE LN TO END ADDRESS
|
JC CL3 ;EXIT IF GREATER
|
JC CL3 ;EXIT IF GREATER
|
CALL BCK ;CHECK FOR A CONTROL C
|
CALL BCK ;CHECK FOR A CONTROL C
|
ACALL DEC_ASTKA ;SAVE THE COMPARE ADDRESS
|
ACALL DEC_ASTKA ;SAVE THE COMPARE ADDRESS
|
CALL DP_T ;RESTORE ADDRESS
|
CALL DP_T ;RESTORE ADDRESS
|
ACALL UPPL ;UN-PROCESS THE LINE
|
ACALL UPPL ;UN-PROCESS THE LINE
|
ACALL C3C ;SAVE THE CR ADDRESS
|
ACALL C3C ;SAVE THE CR ADDRESS
|
ACALL CL6 ;PRINT IT
|
ACALL CL6 ;PRINT IT
|
INC DPTR ;BUMP POINTER TO NEXT LINE
|
INC DPTR ;BUMP POINTER TO NEXT LINE
|
MOVX A,@DPTR ;GET LIN LENGTH
|
MOVX A,@DPTR ;GET LIN LENGTH
|
DJNZ ACC,CL2 ;LOOP
|
DJNZ ACC,CL2 ;LOOP
|
ACALL INC_ASTKA ;WASTE THE COMPARE BYTE
|
ACALL INC_ASTKA ;WASTE THE COMPARE BYTE
|
;
|
;
|
CL3: AJMP CMND1 ;BACK TO COMMAND PROCESSOR
|
CL3: AJMP CMND1 ;BACK TO COMMAND PROCESSOR
|
;
|
;
|
CL6: MOV DPTR,#IBUF ;PRINT IBUF
|
CL6: MOV DPTR,#IBUF ;PRINT IBUF
|
CALL PRNTCR ;PRINT IT
|
CALL PRNTCR ;PRINT IT
|
CALL DP_T
|
CALL DP_T
|
;
|
;
|
CL7: JMP CRLF
|
CL7: JMP CRLF
|
;
|
;
|
UPPL0: LCALL X31DP
|
UPPL0: LCALL X31DP
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;UPPL - UN PREPROCESS A LINE ADDRESSED BY DPTR INTO IBUF
|
;UPPL - UN PREPROCESS A LINE ADDRESSED BY DPTR INTO IBUF
|
; RETURN SOURCE ADDRESS OF CR IN DPTR ON RETURN
|
; RETURN SOURCE ADDRESS OF CR IN DPTR ON RETURN
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
UPPL: MOV R3,#HIGH IBUF ;POINT R3 AT HIGH IBUF
|
UPPL: MOV R3,#HIGH IBUF ;POINT R3 AT HIGH IBUF
|
MOV R1,#LOW IBUF ;POINT R1 AT IBUF
|
MOV R1,#LOW IBUF ;POINT R1 AT IBUF
|
INC DPTR ;SKIP OVER LINE LENGTH
|
INC DPTR ;SKIP OVER LINE LENGTH
|
ACALL C3C ;SAVE THE DPTR (DP_T)
|
ACALL C3C ;SAVE THE DPTR (DP_T)
|
CALL L20DPI ;PUT LINE NUMBER IN R2:R0
|
CALL L20DPI ;PUT LINE NUMBER IN R2:R0
|
CALL FP_BASE8 ;CONVERT R2:R0 TO INTEGER
|
CALL FP_BASE8 ;CONVERT R2:R0 TO INTEGER
|
CALL DP_T
|
CALL DP_T
|
INC DPTR ;BUMP DPTR PAST THE LINE NUMBER
|
INC DPTR ;BUMP DPTR PAST THE LINE NUMBER
|
;
|
;
|
UPP0: CJNE R1,#LOW IBUF+6,UPP01
|
UPP0: CJNE R1,#LOW IBUF+6,UPP01
|
UPP01: JC UPP91 ;PUT SPACES IN TEXT
|
UPP01: JC UPP91 ;PUT SPACES IN TEXT
|
INC DPTR ;BUMP PAST LN HIGH
|
INC DPTR ;BUMP PAST LN HIGH
|
MOVX A,@DPTR ;GET USER TEXT
|
MOVX A,@DPTR ;GET USER TEXT
|
MOV R6,A ;SAVE A IN R6 FOR TOKE COMPARE
|
MOV R6,A ;SAVE A IN R6 FOR TOKE COMPARE
|
JB ACC.7,UPP1 ;IF TOKEN, PROCESS
|
JB ACC.7,UPP1 ;IF TOKEN, PROCESS
|
CJNE A,#20H,UPP02 ;TRAP THE USER TOKENS
|
CJNE A,#20H,UPP02 ;TRAP THE USER TOKENS
|
UPP02: JNC UPP03
|
UPP02: JNC UPP03
|
CJNE A,#CR,UPP1 ;DO IT IF NOT A CR
|
CJNE A,#CR,UPP1 ;DO IT IF NOT A CR
|
UPP03: CJNE A,#'"',UPP9 ;SEE IF STRING
|
UPP03: CJNE A,#'"',UPP9 ;SEE IF STRING
|
ACALL UPP7 ;SAVE IT
|
ACALL UPP7 ;SAVE IT
|
UPP04: ACALL UPP8 ;GET THE NEXT CHARACTER AND SAVE IT
|
UPP04: ACALL UPP8 ;GET THE NEXT CHARACTER AND SAVE IT
|
CJNE A,#'"',UPP04 ;LOOP ON QUOTES
|
CJNE A,#'"',UPP04 ;LOOP ON QUOTES
|
SJMP UPP0
|
SJMP UPP0
|
;
|
;
|
UPP9: CJNE A,#':',UPP1A ;PUT A SPACE IN DELIMITER
|
UPP9: CJNE A,#':',UPP1A ;PUT A SPACE IN DELIMITER
|
ACALL UPP7A
|
ACALL UPP7A
|
MOV A,R6
|
MOV A,R6
|
ACALL UPP7
|
ACALL UPP7
|
UPP91: ACALL UPP7A
|
UPP91: ACALL UPP7A
|
SJMP UPP0
|
SJMP UPP0
|
;
|
;
|
UPP1A: ACALL UPP81 ;SAVE THE CHARACTER, UPDATE POINTER
|
UPP1A: ACALL UPP81 ;SAVE THE CHARACTER, UPDATE POINTER
|
SJMP UPP0 ;EXIT IF A CR, ELSE LOOP
|
SJMP UPP0 ;EXIT IF A CR, ELSE LOOP
|
;
|
;
|
UPP1: ACALL C3C ;SAVE THE TEXT POINTER
|
UPP1: ACALL C3C ;SAVE THE TEXT POINTER
|
MOV C,XBIT
|
MOV C,XBIT
|
MOV F0,C ;SAVE XBIT IN F0
|
MOV F0,C ;SAVE XBIT IN F0
|
UPP11: MOV DPTR,#TOKTAB ;POINT AT TOKEN TABLE
|
UPP11: MOV DPTR,#TOKTAB ;POINT AT TOKEN TABLE
|
JNB F0,UPP2
|
JNB F0,UPP2
|
LCALL 2078H ;SET UP DPTR FOR LOOKUP
|
LCALL 2078H ;SET UP DPTR FOR LOOKUP
|
;
|
;
|
UPP2: CLR A ;ZERO A FOR LOOKUP
|
UPP2: CLR A ;ZERO A FOR LOOKUP
|
MOVC A,@A+DPTR ;GET TOKEN
|
MOVC A,@A+DPTR ;GET TOKEN
|
INC DPTR ;ADVANCE THE TOKEN POINTER
|
INC DPTR ;ADVANCE THE TOKEN POINTER
|
CJNE A,#0FFH,UP_2 ;SEE IF DONE
|
CJNE A,#0FFH,UP_2 ;SEE IF DONE
|
JBC F0,UPP11 ;NOW DO NORMAL TABLE
|
JBC F0,UPP11 ;NOW DO NORMAL TABLE
|
AJMP CMND1 ;EXIT IF NOT FOUND
|
AJMP CMND1 ;EXIT IF NOT FOUND
|
;
|
;
|
UP_2: CJNE A,R6B0,UPP2 ;LOOP UNTIL THE SAME
|
UP_2: CJNE A,R6B0,UPP2 ;LOOP UNTIL THE SAME
|
;
|
;
|
UP_3: CJNE A,#T_UOP,UP_4
|
UP_3: CJNE A,#T_UOP,UP_4
|
UP_4: JNC UPP3
|
UP_4: JNC UPP3
|
ACALL UPP7A ;PRINT THE SPACE IF OK
|
ACALL UPP7A ;PRINT THE SPACE IF OK
|
;
|
;
|
UPP3: CLR A ;DO LOOKUP
|
UPP3: CLR A ;DO LOOKUP
|
MOVC A,@A+DPTR
|
MOVC A,@A+DPTR
|
JB ACC.7,UPP4 ;EXIT IF DONE, ELSE SAVE
|
JB ACC.7,UPP4 ;EXIT IF DONE, ELSE SAVE
|
JZ UPP4 ;DONE IF ZERO
|
JZ UPP4 ;DONE IF ZERO
|
ACALL UPP7 ;SAVE THE CHARACTER
|
ACALL UPP7 ;SAVE THE CHARACTER
|
INC DPTR
|
INC DPTR
|
SJMP UPP3 ;LOOP
|
SJMP UPP3 ;LOOP
|
;
|
;
|
UPP4: CALL DP_T ;GET IT BACK
|
UPP4: CALL DP_T ;GET IT BACK
|
MOV A,R6 ;SEE IF A REM TOKEN
|
MOV A,R6 ;SEE IF A REM TOKEN
|
XRL A,#T_REM
|
XRL A,#T_REM
|
JNZ UPP42
|
JNZ UPP42
|
UPP41: ACALL UPP8
|
UPP41: ACALL UPP8
|
SJMP UPP41
|
SJMP UPP41
|
UPP42: JNC UPP0 ;START OVER AGAIN IF NO TOKEN
|
UPP42: JNC UPP0 ;START OVER AGAIN IF NO TOKEN
|
ACALL UPP7A ;PRINT THE SPACE IF OK
|
ACALL UPP7A ;PRINT THE SPACE IF OK
|
SJMP UPP0 ;DONE
|
SJMP UPP0 ;DONE
|
;
|
;
|
UPP7A: MOV A,#' ' ;OUTPUT A SPACE
|
UPP7A: MOV A,#' ' ;OUTPUT A SPACE
|
;
|
;
|
UPP7: AJMP PPL91 ;SAVE A
|
UPP7: AJMP PPL91 ;SAVE A
|
;
|
;
|
UPP8: INC DPTR
|
UPP8: INC DPTR
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
UPP81: CJNE A,#CR,UPP7
|
UPP81: CJNE A,#CR,UPP7
|
AJMP PPL71
|
AJMP PPL71
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; This table contains all of the floating point constants
|
; This table contains all of the floating point constants
|
;
|
;
|
; The constants in ROM are stored "backwards" from the way
|
; The constants in ROM are stored "backwards" from the way
|
; basic normally treats floating point numbers. Instead of
|
; basic normally treats floating point numbers. Instead of
|
; loading from the exponent and decrementing the pointer,
|
; loading from the exponent and decrementing the pointer,
|
; ROM constants pointers load from the most significant
|
; ROM constants pointers load from the most significant
|
; digits and increment the pointers. This is done to 1) make
|
; digits and increment the pointers. This is done to 1) make
|
; arg stack loading faster and 2) compensate for the fact that
|
; arg stack loading faster and 2) compensate for the fact that
|
; no decrement data pointer instruction exsist.
|
; no decrement data pointer instruction exsist.
|
;
|
;
|
; The numbers are stored as follows:
|
; The numbers are stored as follows:
|
;
|
;
|
; BYTE X+5 = MOST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+5 = MOST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+4 = NEXT MOST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+4 = NEXT MOST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+3 = NEXT LEAST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+3 = NEXT LEAST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+2 = LEAST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+2 = LEAST SIGNIFICANT DIGITS IN BCD
|
; BYTE X+1 = SIGN OF THE ABOVE MANTISSA 0 = +, 1 = -
|
; BYTE X+1 = SIGN OF THE ABOVE MANTISSA 0 = +, 1 = -
|
; BYTE X = EXPONENT IN TWO'S COMPLEMENT BINARY
|
; BYTE X = EXPONENT IN TWO'S COMPLEMENT BINARY
|
; ZERO EXPONENT = THE NUMBER ZERO
|
; ZERO EXPONENT = THE NUMBER ZERO
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ATTAB: DB 128-2 ; ARCTAN LOOKUP
|
ATTAB: DB 128-2 ; ARCTAN LOOKUP
|
DB 00H
|
DB 00H
|
DB 57H
|
DB 57H
|
DB 22H
|
DB 22H
|
DB 66H
|
DB 66H
|
DB 28H
|
DB 28H
|
;
|
;
|
DB 128-1
|
DB 128-1
|
DB 01H
|
DB 01H
|
DB 37H
|
DB 37H
|
DB 57H
|
DB 57H
|
DB 16H
|
DB 16H
|
DB 16H
|
DB 16H
|
;
|
;
|
DB 128-1
|
DB 128-1
|
DB 00H
|
DB 00H
|
DB 14H
|
DB 14H
|
DB 96H
|
DB 96H
|
DB 90H
|
DB 90H
|
DB 42H
|
DB 42H
|
;
|
;
|
DB 128-1
|
DB 128-1
|
DB 01H
|
DB 01H
|
DB 40H
|
DB 40H
|
DB 96H
|
DB 96H
|
DB 28H
|
DB 28H
|
DB 75H
|
DB 75H
|
;
|
;
|
DB 128
|
DB 128
|
DB 00H
|
DB 00H
|
DB 64H
|
DB 64H
|
DB 62H
|
DB 62H
|
DB 65H
|
DB 65H
|
DB 10H
|
DB 10H
|
;
|
;
|
DB 128
|
DB 128
|
DB 01H
|
DB 01H
|
DB 99H
|
DB 99H
|
DB 88H
|
DB 88H
|
DB 20H
|
DB 20H
|
DB 14H
|
DB 14H
|
;
|
;
|
DB 128
|
DB 128
|
DB 00H
|
DB 00H
|
DB 51H
|
DB 51H
|
DB 35H
|
DB 35H
|
DB 99H
|
DB 99H
|
DB 19H
|
DB 19H
|
;
|
;
|
DB 128
|
DB 128
|
DB 01H
|
DB 01H
|
DB 45H
|
DB 45H
|
DB 31H
|
DB 31H
|
DB 33H
|
DB 33H
|
DB 33H
|
DB 33H
|
;
|
;
|
DB 129
|
DB 129
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 10H
|
DB 10H
|
;
|
;
|
DB 0FFH ;END OF TABLE
|
DB 0FFH ;END OF TABLE
|
;
|
;
|
NTWO: DB 129
|
NTWO: DB 129
|
DB 0
|
DB 0
|
DB 0
|
DB 0
|
DB 0
|
DB 0
|
DB 0
|
DB 0
|
DB 20H
|
DB 20H
|
;
|
;
|
TTIME: DB 128-4 ; CLOCK CALCULATION
|
TTIME: DB 128-4 ; CLOCK CALCULATION
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 04H
|
DB 04H
|
DB 13H
|
DB 13H
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; COSINE - Add pi/2 to stack, then fall thru to SIN
|
; COSINE - Add pi/2 to stack, then fall thru to SIN
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACOS: ACALL POTWO ;PUT PI/2 ON THE STACK
|
ACOS: ACALL POTWO ;PUT PI/2 ON THE STACK
|
ACALL AADD ;TOS = TOS+PI/2
|
ACALL AADD ;TOS = TOS+PI/2
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; SINE - use taylor series to calculate sin function
|
; SINE - use taylor series to calculate sin function
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ASIN: ACALL PIPI ;PUT PI ON THE STACK
|
ASIN: ACALL PIPI ;PUT PI ON THE STACK
|
ACALL RV ;REDUCE THE VALUE
|
ACALL RV ;REDUCE THE VALUE
|
MOV A,MT2 ;CALCULATE THE SIGN
|
MOV A,MT2 ;CALCULATE THE SIGN
|
ANL A,#01H ;SAVE LSB
|
ANL A,#01H ;SAVE LSB
|
XRL MT1,A ;SAVE SIGN IN MT1
|
XRL MT1,A ;SAVE SIGN IN MT1
|
ACALL CSTAKA ;NOW CONVERT TO ONE QUADRANT
|
ACALL CSTAKA ;NOW CONVERT TO ONE QUADRANT
|
ACALL POTWO
|
ACALL POTWO
|
ACALL CMPLK ;DO COMPARE
|
ACALL CMPLK ;DO COMPARE
|
JC ASIN1
|
JC ASIN1
|
ACALL PIPI
|
ACALL PIPI
|
ACALL ASUB
|
ACALL ASUB
|
ASIN1: ACALL AABS
|
ASIN1: ACALL AABS
|
MOV DPTR,#SINTAB ;SET UP LOOKUP TABLE
|
MOV DPTR,#SINTAB ;SET UP LOOKUP TABLE
|
ACALL POLYC ;CALCULATE THE POLY
|
ACALL POLYC ;CALCULATE THE POLY
|
ACALL STRIP
|
ACALL STRIP
|
AJMP SIN0
|
AJMP SIN0
|
;
|
;
|
; Put PI/2 on the stack
|
; Put PI/2 on the stack
|
;
|
;
|
POTWO: ACALL PIPI ;PUT PI ON THE STACK, NOW DIVIDE
|
POTWO: ACALL PIPI ;PUT PI ON THE STACK, NOW DIVIDE
|
;
|
;
|
DBTWO: MOV DPTR,#NTWO
|
DBTWO: MOV DPTR,#NTWO
|
ACALL PUSHC
|
ACALL PUSHC
|
;MOV A,#2 ;BY TWO
|
;MOV A,#2 ;BY TWO
|
;ACALL TWO_R2
|
;ACALL TWO_R2
|
AJMP ADIV
|
AJMP ADIV
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
POLYC: ; Expand a power series to calculate a polynomial
|
POLYC: ; Expand a power series to calculate a polynomial
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL CSTAKA2 ;COPY THE STACK
|
ACALL CSTAKA2 ;COPY THE STACK
|
ACALL AMUL ;SQUARE THE STACK
|
ACALL AMUL ;SQUARE THE STACK
|
ACALL POP_T1 ;SAVE X*X
|
ACALL POP_T1 ;SAVE X*X
|
ACALL PUSHC ;PUT CONSTANT ON STACK
|
ACALL PUSHC ;PUT CONSTANT ON STACK
|
;
|
;
|
POLY1: ACALL PUSH_T1 ;PUT COMPUTED VALUE ON STACK
|
POLY1: ACALL PUSH_T1 ;PUT COMPUTED VALUE ON STACK
|
ACALL AMUL ;MULTIPLY CONSTANT AND COMPUTED VALUE
|
ACALL AMUL ;MULTIPLY CONSTANT AND COMPUTED VALUE
|
ACALL PUSHC ;PUT NEXT CONSTANT ON STACK
|
ACALL PUSHC ;PUT NEXT CONSTANT ON STACK
|
ACALL AADD ;ADD IT TO THE OLD VALUE
|
ACALL AADD ;ADD IT TO THE OLD VALUE
|
CLR A ;CHECK TO SEE IF DONE
|
CLR A ;CHECK TO SEE IF DONE
|
MOVC A,@A+DPTR
|
MOVC A,@A+DPTR
|
CJNE A,#0FFH,POLY1 ;LOOP UNTIL DONE
|
CJNE A,#0FFH,POLY1 ;LOOP UNTIL DONE
|
;
|
;
|
AMUL: LCALL FP_BASE3
|
AMUL: LCALL FP_BASE3
|
AJMP FPTST
|
AJMP FPTST
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
RV: ; Reduce a value for Trig and A**X functions
|
RV: ; Reduce a value for Trig and A**X functions
|
;
|
;
|
; value = (value/x - INT(value/x)) * x
|
; value = (value/x - INT(value/x)) * x
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL C2_T2 ;COPY TOS TO T2
|
ACALL C2_T2 ;COPY TOS TO T2
|
ACALL ADIV ;TOS = TOS/TEMP2
|
ACALL ADIV ;TOS = TOS/TEMP2
|
ACALL AABS ;MAKE THE TOS A POSITIVE NUMBER
|
ACALL AABS ;MAKE THE TOS A POSITIVE NUMBER
|
MOV MT1,A ;SAVE THE SIGN
|
MOV MT1,A ;SAVE THE SIGN
|
ACALL CSTAKA2 ;COPY THE STACK TWICE
|
ACALL CSTAKA2 ;COPY THE STACK TWICE
|
ACALL IFIX ;PUT THE NUMBER IN R3:R1
|
ACALL IFIX ;PUT THE NUMBER IN R3:R1
|
PUSH R3B0 ;SAVE R3
|
PUSH R3B0 ;SAVE R3
|
MOV MT2,R1 ;SAVE THE LS BYTE IN MT2
|
MOV MT2,R1 ;SAVE THE LS BYTE IN MT2
|
ACALL AINT ;MAKE THE TOS AN INTEGER
|
ACALL AINT ;MAKE THE TOS AN INTEGER
|
ACALL ASUB ;TOS = TOS/T2 - INT(TOS/T2)
|
ACALL ASUB ;TOS = TOS/T2 - INT(TOS/T2)
|
ACALL P_T2 ;TOS = T2
|
ACALL P_T2 ;TOS = T2
|
ACALL AMUL ;TOS = T2*(TOS/T2 - INT(TOS/T2)
|
ACALL AMUL ;TOS = T2*(TOS/T2 - INT(TOS/T2)
|
POP R3B0 ;RESTORE R3
|
POP R3B0 ;RESTORE R3
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; TAN
|
; TAN
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ATAN: ACALL CSTAKA ;DUPLACATE STACK
|
ATAN: ACALL CSTAKA ;DUPLACATE STACK
|
ACALL ASIN ;TOS = SIN(X)
|
ACALL ASIN ;TOS = SIN(X)
|
ACALL SWAP_ASTKA ;TOS = X
|
ACALL SWAP_ASTKA ;TOS = X
|
ACALL ACOS ;TOS = COS(X)
|
ACALL ACOS ;TOS = COS(X)
|
AJMP ADIV ;TOS = SIN(X)/COS(X)
|
AJMP ADIV ;TOS = SIN(X)/COS(X)
|
;
|
;
|
STRIP: ACALL SETREG ;SETUP R0
|
STRIP: ACALL SETREG ;SETUP R0
|
MOV R3,#1 ;LOOP COUNT
|
MOV R3,#1 ;LOOP COUNT
|
AJMP AI11 ;WASTE THE LSB
|
AJMP AI11 ;WASTE THE LSB
|
;
|
;
|
;************************************************************
|
;************************************************************
|
;
|
;
|
; ARC TAN
|
; ARC TAN
|
;
|
;
|
;************************************************************
|
;************************************************************
|
;
|
;
|
AATAN: ACALL AABS
|
AATAN: ACALL AABS
|
MOV MT1,A ;SAVE THE SIGN
|
MOV MT1,A ;SAVE THE SIGN
|
ACALL SETREG ;GET THE EXPONENT
|
ACALL SETREG ;GET THE EXPONENT
|
ADD A,#7FH ;BIAS THE EXPONENT
|
ADD A,#7FH ;BIAS THE EXPONENT
|
MOV UBIT,C ;SAVE CARRY STATUS
|
MOV UBIT,C ;SAVE CARRY STATUS
|
JNC AATAN1 ;SEE IF > 1
|
JNC AATAN1 ;SEE IF > 1
|
ACALL RECIP ;IF > 1, TAKE RECIP
|
ACALL RECIP ;IF > 1, TAKE RECIP
|
AATAN1: MOV DPTR,#ATTAB ;SET UP TO CALCULATE THE POLY
|
AATAN1: MOV DPTR,#ATTAB ;SET UP TO CALCULATE THE POLY
|
ACALL POLYC ;CALCULATE THE POLY
|
ACALL POLYC ;CALCULATE THE POLY
|
JNB UBIT,SIN0 ;JUMP IF NOT SET
|
JNB UBIT,SIN0 ;JUMP IF NOT SET
|
ACALL ANEG ;MAKE X POLY NEGATIVE
|
ACALL ANEG ;MAKE X POLY NEGATIVE
|
ACALL POTWO ;SUBTRACT PI/2
|
ACALL POTWO ;SUBTRACT PI/2
|
ACALL AADD
|
ACALL AADD
|
;
|
;
|
SIN0: MOV A,MT1 ;GET THE SIGN
|
SIN0: MOV A,MT1 ;GET THE SIGN
|
JZ SRT
|
JZ SRT
|
AJMP ANEG
|
AJMP ANEG
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
; FCOMP - COMPARE 0FFFFH TO TOS
|
; FCOMP - COMPARE 0FFFFH TO TOS
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
FCMP: ACALL CSTAKA ;COPY THE STACK
|
FCMP: ACALL CSTAKA ;COPY THE STACK
|
ACALL FSTK ;MAKE THE TOS = 0FFFFH
|
ACALL FSTK ;MAKE THE TOS = 0FFFFH
|
ACALL SWAP_ASTKA ;NOW COMPARE IS 0FFFFH - X
|
ACALL SWAP_ASTKA ;NOW COMPARE IS 0FFFFH - X
|
;
|
;
|
CMPLK: JMP FP_BASE2 ;DO THE COMPARE
|
CMPLK: JMP FP_BASE2 ;DO THE COMPARE
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
DEC_ASTKA: ;Push ARG STACK and check for underflow
|
DEC_ASTKA: ;Push ARG STACK and check for underflow
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
MOV A,#-FPSIZ
|
MOV A,#-FPSIZ
|
ADD A,ASTKA
|
ADD A,ASTKA
|
CJNE A,#LOW TM_TOP+6,DEC_ASTKA1
|
CJNE A,#LOW TM_TOP+6,DEC_ASTKA1
|
DEC_ASTKA1:
|
DEC_ASTKA1:
|
JC E4YY
|
JC E4YY
|
MOV ASTKA,A
|
MOV ASTKA,A
|
MOV R1,A
|
MOV R1,A
|
MOV R3,#ASTKAH
|
MOV R3,#ASTKAH
|
;
|
;
|
SRT: RET
|
SRT: RET
|
;
|
;
|
E4YY: MOV DPTR,#EXA
|
E4YY: MOV DPTR,#EXA
|
AJMP FPTS ;ARG STACK ERROR
|
AJMP FPTS ;ARG STACK ERROR
|
;
|
;
|
;
|
;
|
AXTAL3: ACALL PUSHC ;PUSH CONSTANT, THEN MULTIPLY
|
AXTAL3: ACALL PUSHC ;PUSH CONSTANT, THEN MULTIPLY
|
ACALL AMUL
|
ACALL AMUL
|
;
|
;
|
; Fall thru to IFIX
|
; Fall thru to IFIX
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
IFIX: ; Convert a floating point number to an integer, put in R3:R1
|
IFIX: ; Convert a floating point number to an integer, put in R3:R1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CLR A ;RESET THE START
|
CLR A ;RESET THE START
|
MOV R3,A
|
MOV R3,A
|
MOV R1,A
|
MOV R1,A
|
MOV R0,ASTKA ;GET THE ARG STACK
|
MOV R0,ASTKA ;GET THE ARG STACK
|
MOV P2,#ASTKAH
|
MOV P2,#ASTKAH
|
MOVX A,@R0 ;READ EXPONENT
|
MOVX A,@R0 ;READ EXPONENT
|
CLR C
|
CLR C
|
SUBB A,#81H ;BASE EXPONENT
|
SUBB A,#81H ;BASE EXPONENT
|
MOV R4,A ;SAVE IT
|
MOV R4,A ;SAVE IT
|
DEC R0 ;POINT AT SIGN
|
DEC R0 ;POINT AT SIGN
|
MOVX A,@R0 ;GET THE SIGN
|
MOVX A,@R0 ;GET THE SIGN
|
JNZ SQ_ERR ;ERROR IF NEGATIVE
|
JNZ SQ_ERR ;ERROR IF NEGATIVE
|
JC INC_ASTKA ;EXIT IF EXPONENT IS < 81H
|
JC INC_ASTKA ;EXIT IF EXPONENT IS < 81H
|
INC R4 ;ADJUST LOOP COUNTER
|
INC R4 ;ADJUST LOOP COUNTER
|
MOV A,R0 ;BUMP THE POINTER REGISTER
|
MOV A,R0 ;BUMP THE POINTER REGISTER
|
SUBB A,#FPSIZ-1
|
SUBB A,#FPSIZ-1
|
MOV R0,A
|
MOV R0,A
|
;
|
;
|
I2: INC R0 ;POINT AT DIGIT
|
I2: INC R0 ;POINT AT DIGIT
|
MOVX A,@R0 ;GET DIGIT
|
MOVX A,@R0 ;GET DIGIT
|
SWAP A ;FLIP
|
SWAP A ;FLIP
|
CALL FP_BASE10 ;ACCUMULATE
|
CALL FP_BASE10 ;ACCUMULATE
|
JC SQ_ERR
|
JC SQ_ERR
|
DJNZ R4,I21
|
DJNZ R4,I21
|
SJMP INC_ASTKA
|
SJMP INC_ASTKA
|
I21: MOVX A,@R0 ;GET DIGIT
|
I21: MOVX A,@R0 ;GET DIGIT
|
CALL FP_BASE10
|
CALL FP_BASE10
|
JC SQ_ERR
|
JC SQ_ERR
|
DJNZ R4,I2
|
DJNZ R4,I2
|
;
|
;
|
$EJECT
|
$EJECT
|
;************************************************************
|
;************************************************************
|
;
|
;
|
INC_ASTKA: ; Pop the ARG STACK and check for overflow
|
INC_ASTKA: ; Pop the ARG STACK and check for overflow
|
;
|
;
|
;************************************************************
|
;************************************************************
|
;
|
;
|
MOV A,#FPSIZ ;NUMBER TO POP
|
MOV A,#FPSIZ ;NUMBER TO POP
|
SJMP SETREG1
|
SJMP SETREG1
|
;
|
;
|
SETREG: CLR A ;DON'T POP ANYTHING
|
SETREG: CLR A ;DON'T POP ANYTHING
|
SETREG1:MOV R0,ASTKA
|
SETREG1:MOV R0,ASTKA
|
MOV R2,#ASTKAH
|
MOV R2,#ASTKAH
|
MOV P2,R2
|
MOV P2,R2
|
ADD A,R0
|
ADD A,R0
|
JC E4YY
|
JC E4YY
|
MOV ASTKA,A
|
MOV ASTKA,A
|
MOVX A,@R0
|
MOVX A,@R0
|
A_D: RET
|
A_D: RET
|
;
|
;
|
;************************************************************
|
;************************************************************
|
;
|
;
|
; EBIAS - Bias a number for E to the X calculations
|
; EBIAS - Bias a number for E to the X calculations
|
;
|
;
|
;************************************************************
|
;************************************************************
|
;
|
;
|
EBIAS: ACALL PUSH_ONE
|
EBIAS: ACALL PUSH_ONE
|
ACALL RV
|
ACALL RV
|
CJNE R3,#00H,SQ_ERR ;ERROR IF R3 <> 0
|
CJNE R3,#00H,SQ_ERR ;ERROR IF R3 <> 0
|
ACALL C2_T2 ;TEMP 2 GETS FRACTIONS
|
ACALL C2_T2 ;TEMP 2 GETS FRACTIONS
|
ACALL INC_ASTKA
|
ACALL INC_ASTKA
|
ACALL POP_T1
|
ACALL POP_T1
|
ACALL PUSH_ONE
|
ACALL PUSH_ONE
|
;
|
;
|
AELP: MOV A,MT2
|
AELP: MOV A,MT2
|
JNZ AEL1
|
JNZ AEL1
|
;
|
;
|
MOV A,MT1
|
MOV A,MT1
|
JZ A_D
|
JZ A_D
|
MOV DPTR,#FPT2-1
|
MOV DPTR,#FPT2-1
|
MOVX @DPTR,A ;MAKE THE FRACTIONS NEGATIVE
|
MOVX @DPTR,A ;MAKE THE FRACTIONS NEGATIVE
|
;
|
;
|
RECIP: ACALL PUSH_ONE
|
RECIP: ACALL PUSH_ONE
|
ACALL SWAP_ASTKA
|
ACALL SWAP_ASTKA
|
AJMP ADIV
|
AJMP ADIV
|
;
|
;
|
AEL1: DEC MT2
|
AEL1: DEC MT2
|
ACALL PUSH_T1
|
ACALL PUSH_T1
|
ACALL AMUL
|
ACALL AMUL
|
SJMP AELP
|
SJMP AELP
|
;
|
;
|
SQ_ERR: LJMP E3XX ;LINK TO BAD ARG
|
SQ_ERR: LJMP E3XX ;LINK TO BAD ARG
|
;
|
;
|
$EJECT
|
$EJECT
|
;************************************************************
|
;************************************************************
|
;
|
;
|
; SQUARE ROOT
|
; SQUARE ROOT
|
;
|
;
|
;************************************************************
|
;************************************************************
|
;
|
;
|
ASQR: ACALL AABS ;GET THE SIGN
|
ASQR: ACALL AABS ;GET THE SIGN
|
JNZ SQ_ERR ;ERROR IF NEGATIVE
|
JNZ SQ_ERR ;ERROR IF NEGATIVE
|
ACALL C2_T2 ;COPY VARIABLE TO T2
|
ACALL C2_T2 ;COPY VARIABLE TO T2
|
ACALL POP_T1 ;SAVE IT IN T1
|
ACALL POP_T1 ;SAVE IT IN T1
|
MOV R0,#LOW FPT1
|
MOV R0,#LOW FPT1
|
MOVX A,@R0 ;GET EXPONENT
|
MOVX A,@R0 ;GET EXPONENT
|
JZ SQR41 ;EXIT IF ZERO
|
JZ SQR41 ;EXIT IF ZERO
|
ADD A,#128 ;BIAS THE EXPONENT
|
ADD A,#128 ;BIAS THE EXPONENT
|
JNC SQR1 ;SEE IF < 80H
|
JNC SQR1 ;SEE IF < 80H
|
RR A
|
RR A
|
ANL A,#127
|
ANL A,#127
|
SJMP SQR2
|
SJMP SQR2
|
;
|
;
|
SQR1: CPL A ;FLIP BITS
|
SQR1: CPL A ;FLIP BITS
|
INC A
|
INC A
|
RR A
|
RR A
|
ANL A,#127 ;STRIP MSB
|
ANL A,#127 ;STRIP MSB
|
CPL A
|
CPL A
|
INC A
|
INC A
|
;
|
;
|
SQR2: ADD A,#128 ;BIAS EXPONENT
|
SQR2: ADD A,#128 ;BIAS EXPONENT
|
MOVX @R0,A ;SAVE IT
|
MOVX @R0,A ;SAVE IT
|
;
|
;
|
; NEWGUESS = ( X/OLDGUESS + OLDGUESS) / 2
|
; NEWGUESS = ( X/OLDGUESS + OLDGUESS) / 2
|
;
|
;
|
SQR4: ACALL P_T2 ;TOS = X
|
SQR4: ACALL P_T2 ;TOS = X
|
ACALL PUSH_T1 ;PUT NUMBER ON STACK
|
ACALL PUSH_T1 ;PUT NUMBER ON STACK
|
ACALL ADIV ;TOS = X/GUESS
|
ACALL ADIV ;TOS = X/GUESS
|
ACALL PUSH_T1 ;PUT ON AGAIN
|
ACALL PUSH_T1 ;PUT ON AGAIN
|
ACALL AADD ;TOS = X/GUESS + GUESS
|
ACALL AADD ;TOS = X/GUESS + GUESS
|
ACALL DBTWO ;TOS = ( X/GUESS + GUESS ) / 2
|
ACALL DBTWO ;TOS = ( X/GUESS + GUESS ) / 2
|
ACALL TEMP_COMP ;SEE IF DONE
|
ACALL TEMP_COMP ;SEE IF DONE
|
JNB F0,SQR4
|
JNB F0,SQR4
|
;
|
;
|
SQR41: AJMP PUSH_T1 ;PUT THE ANSWER ON THE STACK
|
SQR41: AJMP PUSH_T1 ;PUT THE ANSWER ON THE STACK
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
; NATURAL LOG
|
; NATURAL LOG
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ALN: ACALL AABS ;MAKE SURE THAT NUM IS POSITIVE
|
ALN: ACALL AABS ;MAKE SURE THAT NUM IS POSITIVE
|
JNZ SQ_ERR ;ERROR IF NOT
|
JNZ SQ_ERR ;ERROR IF NOT
|
MOV MT2,A ;CLEAR FOR LOOP
|
MOV MT2,A ;CLEAR FOR LOOP
|
INC R0 ;POINT AT EXPONENT
|
INC R0 ;POINT AT EXPONENT
|
MOVX A,@R0 ;READ THE EXPONENT
|
MOVX A,@R0 ;READ THE EXPONENT
|
JZ SQ_ERR ;ERROR IF EXPONENT IS ZERO
|
JZ SQ_ERR ;ERROR IF EXPONENT IS ZERO
|
CJNE A,#81H,ALN1 ;SEE IF NUM >= 1
|
CJNE A,#81H,ALN1 ;SEE IF NUM >= 1
|
ALN1: MOV UBIT,C ;SAVE CARRY STATUS
|
ALN1: MOV UBIT,C ;SAVE CARRY STATUS
|
JC ALNL ;TAKE RECIP IF >= 1
|
JC ALNL ;TAKE RECIP IF >= 1
|
ACALL RECIP
|
ACALL RECIP
|
;
|
;
|
; Loop to reduce
|
; Loop to reduce
|
;
|
;
|
ALNL: ACALL CSTAKA ;COPY THE STACK FOR COMPARE
|
ALNL: ACALL CSTAKA ;COPY THE STACK FOR COMPARE
|
ACALL PUSH_ONE ;COMPARE NUM TO ONE
|
ACALL PUSH_ONE ;COMPARE NUM TO ONE
|
ACALL CMPLK
|
ACALL CMPLK
|
JNC ALNO ;EXIT IF DONE
|
JNC ALNO ;EXIT IF DONE
|
ACALL SETREG ;GET THE EXPONENT
|
ACALL SETREG ;GET THE EXPONENT
|
ADD A,#85H ;SEE HOW BIG IT IS
|
ADD A,#85H ;SEE HOW BIG IT IS
|
JNC ALN11 ;BUMP BY EXP(11) IF TOO SMALL
|
JNC ALN11 ;BUMP BY EXP(11) IF TOO SMALL
|
ACALL PLNEXP ;PUT EXP(1) ON STACK
|
ACALL PLNEXP ;PUT EXP(1) ON STACK
|
MOV A,#1 ;BUMP COUNT
|
MOV A,#1 ;BUMP COUNT
|
;
|
;
|
ALNE: ADD A,MT2
|
ALNE: ADD A,MT2
|
JC SQ_ERR
|
JC SQ_ERR
|
MOV MT2,A
|
MOV MT2,A
|
ACALL AMUL ;BIAS THE NUMBER
|
ACALL AMUL ;BIAS THE NUMBER
|
SJMP ALNL
|
SJMP ALNL
|
;
|
;
|
ALN11: MOV DPTR,#EXP11 ;PUT EXP(11) ON STACK
|
ALN11: MOV DPTR,#EXP11 ;PUT EXP(11) ON STACK
|
ACALL PUSHC
|
ACALL PUSHC
|
MOV A,#11
|
MOV A,#11
|
SJMP ALNE
|
SJMP ALNE
|
;
|
;
|
$EJECT
|
$EJECT
|
ALNO: ACALL C2_T2 ;PUT NUM IN TEMP 2
|
ALNO: ACALL C2_T2 ;PUT NUM IN TEMP 2
|
ACALL PUSH_ONE ;TOS = 1
|
ACALL PUSH_ONE ;TOS = 1
|
ACALL ASUB ;TOS = X - 1
|
ACALL ASUB ;TOS = X - 1
|
ACALL P_T2 ;TOS = X
|
ACALL P_T2 ;TOS = X
|
ACALL PUSH_ONE ;TOS = 1
|
ACALL PUSH_ONE ;TOS = 1
|
ACALL AADD ;TOS = X + 1
|
ACALL AADD ;TOS = X + 1
|
ACALL ADIV ;TOS = (X-1)/(X+1)
|
ACALL ADIV ;TOS = (X-1)/(X+1)
|
MOV DPTR,#LNTAB ;LOG TABLE
|
MOV DPTR,#LNTAB ;LOG TABLE
|
ACALL POLYC
|
ACALL POLYC
|
INC DPTR ;POINT AT LN(10)
|
INC DPTR ;POINT AT LN(10)
|
ACALL PUSHC
|
ACALL PUSHC
|
ACALL AMUL
|
ACALL AMUL
|
MOV A,MT2 ;GET THE COUNT
|
MOV A,MT2 ;GET THE COUNT
|
ACALL TWO_R2 ;PUT IT ON THE STACK
|
ACALL TWO_R2 ;PUT IT ON THE STACK
|
ACALL ASUB ;INT - POLY
|
ACALL ASUB ;INT - POLY
|
ACALL STRIP
|
ACALL STRIP
|
JNB UBIT,AABS
|
JNB UBIT,AABS
|
;
|
;
|
LN_D: RET
|
LN_D: RET
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
TEMP_COMP: ; Compare FPTEMP1 to TOS, FPTEMP1 gets TOS
|
TEMP_COMP: ; Compare FPTEMP1 to TOS, FPTEMP1 gets TOS
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
ACALL PUSH_T1 ;SAVE THE TEMP
|
ACALL PUSH_T1 ;SAVE THE TEMP
|
ACALL SWAP_ASTKA ;TRADE WITH THE NEXT NUMBER
|
ACALL SWAP_ASTKA ;TRADE WITH THE NEXT NUMBER
|
ACALL CSTAKA ;COPY THE STACK
|
ACALL CSTAKA ;COPY THE STACK
|
ACALL POP_T1 ;SAVE THE NEW NUMBER
|
ACALL POP_T1 ;SAVE THE NEW NUMBER
|
JMP FP_BASE2 ;DO THE COMPARE
|
JMP FP_BASE2 ;DO THE COMPARE
|
;
|
;
|
$EJECT
|
$EJECT
|
AETOX: ACALL PLNEXP ;EXP(1) ON TOS
|
AETOX: ACALL PLNEXP ;EXP(1) ON TOS
|
ACALL SWAP_ASTKA ;X ON TOS
|
ACALL SWAP_ASTKA ;X ON TOS
|
;
|
;
|
AEXP: ;EXPONENTIATION
|
AEXP: ;EXPONENTIATION
|
;
|
;
|
ACALL EBIAS ;T1=BASE,T2=FRACTIONS,TOS=INT MULTIPLIED
|
ACALL EBIAS ;T1=BASE,T2=FRACTIONS,TOS=INT MULTIPLIED
|
MOV DPTR,#FPT2 ;POINT AT FRACTIONS
|
MOV DPTR,#FPT2 ;POINT AT FRACTIONS
|
MOVX A,@DPTR ;READ THE EXP OF THE FRACTIONS
|
MOVX A,@DPTR ;READ THE EXP OF THE FRACTIONS
|
JZ LN_D ;EXIT IF ZERO
|
JZ LN_D ;EXIT IF ZERO
|
ACALL P_T2 ;TOS = FRACTIONS
|
ACALL P_T2 ;TOS = FRACTIONS
|
ACALL PUSH_T1 ;TOS = BASE
|
ACALL PUSH_T1 ;TOS = BASE
|
ACALL SETREG ;SEE IF BASE IS ZERO
|
ACALL SETREG ;SEE IF BASE IS ZERO
|
JZ AEXP1
|
JZ AEXP1
|
ACALL ALN ;TOS = LN(BASE)
|
ACALL ALN ;TOS = LN(BASE)
|
AEXP1: ACALL AMUL ;TOS = FRACTIONS * LN(BASE)
|
AEXP1: ACALL AMUL ;TOS = FRACTIONS * LN(BASE)
|
ACALL PLNEXP ;TOS = EXP(1)
|
ACALL PLNEXP ;TOS = EXP(1)
|
ACALL SWAP_ASTKA ;TOS = FRACTIONS * LN(BASE)
|
ACALL SWAP_ASTKA ;TOS = FRACTIONS * LN(BASE)
|
ACALL EBIAS ;T2 = FRACTIONS, TOS = INT MULTIPLIED
|
ACALL EBIAS ;T2 = FRACTIONS, TOS = INT MULTIPLIED
|
MOV MT2,#00H ;NOW CALCULATE E**X
|
MOV MT2,#00H ;NOW CALCULATE E**X
|
ACALL PUSH_ONE
|
ACALL PUSH_ONE
|
ACALL CSTAKA
|
ACALL CSTAKA
|
ACALL POP_T1 ;T1 = 1
|
ACALL POP_T1 ;T1 = 1
|
;
|
;
|
AEXL: ACALL P_T2 ;TOS = FRACTIONS
|
AEXL: ACALL P_T2 ;TOS = FRACTIONS
|
ACALL AMUL ;TOS = FRACTIONS * ACCUMLATION
|
ACALL AMUL ;TOS = FRACTIONS * ACCUMLATION
|
INC MT2 ;DO THE DEMONIATOR
|
INC MT2 ;DO THE DEMONIATOR
|
MOV A,MT2
|
MOV A,MT2
|
ACALL TWO_R2
|
ACALL TWO_R2
|
ACALL ADIV
|
ACALL ADIV
|
ACALL CSTAKA ;SAVE THE ITERATION
|
ACALL CSTAKA ;SAVE THE ITERATION
|
ACALL PUSH_T1 ;NOW ACCUMLATE
|
ACALL PUSH_T1 ;NOW ACCUMLATE
|
ACALL AADD ;ADD ACCUMLATION
|
ACALL AADD ;ADD ACCUMLATION
|
ACALL TEMP_COMP
|
ACALL TEMP_COMP
|
JNB F0,AEXL ;LOOP UNTIL DONE
|
JNB F0,AEXL ;LOOP UNTIL DONE
|
;
|
;
|
ACALL INC_ASTKA
|
ACALL INC_ASTKA
|
ACALL PUSH_T1
|
ACALL PUSH_T1
|
ACALL AMUL ;LAST INT MULTIPLIED
|
ACALL AMUL ;LAST INT MULTIPLIED
|
;
|
;
|
MU1: AJMP AMUL ;FIRST INT MULTIPLIED
|
MU1: AJMP AMUL ;FIRST INT MULTIPLIED
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; integer operator - INT
|
; integer operator - INT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
AINT: ACALL SETREG ;SET UP THE REGISTERS, CLEAR CARRY
|
AINT: ACALL SETREG ;SET UP THE REGISTERS, CLEAR CARRY
|
SUBB A,#129 ;SUBTRACT EXPONENT BIAS
|
SUBB A,#129 ;SUBTRACT EXPONENT BIAS
|
JNC AI1 ;JUMP IF ACC > 81H
|
JNC AI1 ;JUMP IF ACC > 81H
|
;
|
;
|
; Force the number to be a zero
|
; Force the number to be a zero
|
;
|
;
|
ACALL INC_ASTKA ;BUMP THE STACK
|
ACALL INC_ASTKA ;BUMP THE STACK
|
;
|
;
|
P_Z: MOV DPTR,#ZRO ;PUT ZERO ON THE STACK
|
P_Z: MOV DPTR,#ZRO ;PUT ZERO ON THE STACK
|
AJMP PUSHC
|
AJMP PUSHC
|
;
|
;
|
AI1: SUBB A,#7
|
AI1: SUBB A,#7
|
JNC AI3
|
JNC AI3
|
CPL A
|
CPL A
|
INC A
|
INC A
|
MOV R3,A
|
MOV R3,A
|
AI11: DEC R0 ;POINT AT SIGN
|
AI11: DEC R0 ;POINT AT SIGN
|
;
|
;
|
AI2: DEC R0 ;NOW AT LSB'S
|
AI2: DEC R0 ;NOW AT LSB'S
|
MOVX A,@R0 ;READ BYTE
|
MOVX A,@R0 ;READ BYTE
|
ANL A,#0F0H ;STRIP NIBBLE
|
ANL A,#0F0H ;STRIP NIBBLE
|
MOVX @R0,A ;WRITE BYTE
|
MOVX @R0,A ;WRITE BYTE
|
DJNZ R3,AI21
|
DJNZ R3,AI21
|
RET
|
RET
|
AI21: CLR A
|
AI21: CLR A
|
MOVX @R0,A ;CLEAR THE LOCATION
|
MOVX @R0,A ;CLEAR THE LOCATION
|
DJNZ R3,AI2
|
DJNZ R3,AI2
|
;
|
;
|
AI3: RET ;EXIT
|
AI3: RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
AABS: ; Absolute value - Make sign of number positive
|
AABS: ; Absolute value - Make sign of number positive
|
; return sign in ACC
|
; return sign in ACC
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL ANEG ;CHECK TO SEE IF + OR -
|
ACALL ANEG ;CHECK TO SEE IF + OR -
|
JNZ ALPAR ;EXIT IF NON ZERO, BECAUSE THE NUM IS
|
JNZ ALPAR ;EXIT IF NON ZERO, BECAUSE THE NUM IS
|
MOVX @R0,A ;MAKE A POSITIVE SIGN
|
MOVX @R0,A ;MAKE A POSITIVE SIGN
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ASGN: ; Returns the sign of the number 1 = +, -1 = -
|
ASGN: ; Returns the sign of the number 1 = +, -1 = -
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL INC_ASTKA ;POP STACK, GET EXPONENT
|
ACALL INC_ASTKA ;POP STACK, GET EXPONENT
|
JZ P_Z ;EXIT IF ZERO
|
JZ P_Z ;EXIT IF ZERO
|
DEC R0 ;BUMP TO SIGN
|
DEC R0 ;BUMP TO SIGN
|
MOVX A,@R0 ;GET THE SIGN
|
MOVX A,@R0 ;GET THE SIGN
|
MOV R7,A ;SAVE THE SIGN
|
MOV R7,A ;SAVE THE SIGN
|
ACALL PUSH_ONE ;PUT A ONE ON THE STACK
|
ACALL PUSH_ONE ;PUT A ONE ON THE STACK
|
MOV A,R7 ;GET THE SIGN
|
MOV A,R7 ;GET THE SIGN
|
JZ ALPAR ;EXIT IF ZERO
|
JZ ALPAR ;EXIT IF ZERO
|
;
|
;
|
; Fall thru to ANEG
|
; Fall thru to ANEG
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ANEG: ; Flip the sign of the number on the tos
|
ANEG: ; Flip the sign of the number on the tos
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL SETREG
|
ACALL SETREG
|
DEC R0 ;POINT AT THE SIGN OF THE NUMBER
|
DEC R0 ;POINT AT THE SIGN OF THE NUMBER
|
JZ ALPAR ;EXIT IF ZERO
|
JZ ALPAR ;EXIT IF ZERO
|
MOVX A,@R0
|
MOVX A,@R0
|
XRL A,#01H ;FLIP THE SIGN
|
XRL A,#01H ;FLIP THE SIGN
|
MOVX @R0,A
|
MOVX @R0,A
|
XRL A,#01H ;RESTORE THE SIGN
|
XRL A,#01H ;RESTORE THE SIGN
|
;
|
;
|
ALPAR: RET
|
ALPAR: RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACBYTE: ; Read the ROM
|
ACBYTE: ; Read the ROM
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL IFIX ;GET EXPRESSION
|
ACALL IFIX ;GET EXPRESSION
|
CALL X31DP ;PUT R3:R1 INTO THE DP
|
CALL X31DP ;PUT R3:R1 INTO THE DP
|
CLR A
|
CLR A
|
MOVC A,@A+DPTR
|
MOVC A,@A+DPTR
|
AJMP TWO_R2
|
AJMP TWO_R2
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ADBYTE: ; Read internal memory
|
ADBYTE: ; Read internal memory
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL IFIX ;GET THE EXPRESSION
|
ACALL IFIX ;GET THE EXPRESSION
|
CALL R3CK ;MAKE SURE R3 = 0
|
CALL R3CK ;MAKE SURE R3 = 0
|
MOV A,@R1
|
MOV A,@R1
|
AJMP TWO_R2
|
AJMP TWO_R2
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
AXBYTE: ; Read external memory
|
AXBYTE: ; Read external memory
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL IFIX ;GET THE EXPRESSION
|
ACALL IFIX ;GET THE EXPRESSION
|
AXBYTE1:MOV P2,R3
|
AXBYTE1:MOV P2,R3
|
MOVX A,@R1
|
MOVX A,@R1
|
AJMP TWO_R2
|
AJMP TWO_R2
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The relational operators - EQUAL (=)
|
; The relational operators - EQUAL (=)
|
; GREATER THAN (>)
|
; GREATER THAN (>)
|
; LESS THAN (<)
|
; LESS THAN (<)
|
; GREATER THAN OR EQUAL (>=)
|
; GREATER THAN OR EQUAL (>=)
|
; LESS THAN OR EQUAL (<=)
|
; LESS THAN OR EQUAL (<=)
|
; NOT EQUAL (<>)
|
; NOT EQUAL (<>)
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
AGT: ACALL CMPLK
|
AGT: ACALL CMPLK
|
ORL C,F0 ;SEE IF EITHER IS A ONE
|
ORL C,F0 ;SEE IF EITHER IS A ONE
|
AGT1: JC P_Z
|
AGT1: JC P_Z
|
;
|
;
|
FSTK: MOV DPTR,#FS
|
FSTK: MOV DPTR,#FS
|
AJMP PUSHC
|
AJMP PUSHC
|
;
|
;
|
FS: DB 85H
|
FS: DB 85H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 50H
|
DB 50H
|
DB 53H
|
DB 53H
|
DB 65H
|
DB 65H
|
;
|
;
|
ALT: ACALL CMPLK
|
ALT: ACALL CMPLK
|
ALT1: CPL C
|
ALT1: CPL C
|
SJMP AGT1
|
SJMP AGT1
|
;
|
;
|
AEQ: ACALL CMPLK
|
AEQ: ACALL CMPLK
|
AEQ1: MOV C,F0
|
AEQ1: MOV C,F0
|
SJMP ALT1
|
SJMP ALT1
|
;
|
;
|
ANE: ACALL CMPLK
|
ANE: ACALL CMPLK
|
CPL F0
|
CPL F0
|
SJMP AEQ1
|
SJMP AEQ1
|
;
|
;
|
AGE: ACALL CMPLK
|
AGE: ACALL CMPLK
|
SJMP AGT1
|
SJMP AGT1
|
;
|
;
|
ALE: ACALL CMPLK
|
ALE: ACALL CMPLK
|
ORL C,F0
|
ORL C,F0
|
SJMP ALT1
|
SJMP ALT1
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ARND: ; Generate a random number
|
ARND: ; Generate a random number
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
MOV DPTR,#RCELL ;GET THE BINARY SEED
|
MOV DPTR,#RCELL ;GET THE BINARY SEED
|
CALL L31DPI
|
CALL L31DPI
|
MOV A,R1
|
MOV A,R1
|
CLR C
|
CLR C
|
RRC A
|
RRC A
|
MOV R0,A
|
MOV R0,A
|
MOV A,#6
|
MOV A,#6
|
RRC A
|
RRC A
|
ADD A,R1
|
ADD A,R1
|
XCH A,R0
|
XCH A,R0
|
ADDC A,R3
|
ADDC A,R3
|
MOV R2,A
|
MOV R2,A
|
DEC DPL ;SAVE THE NEW SEED
|
DEC DPL ;SAVE THE NEW SEED
|
ACALL S20DP
|
ACALL S20DP
|
ACALL TWO_EY
|
ACALL TWO_EY
|
ACALL FSTK
|
ACALL FSTK
|
;
|
;
|
ADIV: LCALL FP_BASE4
|
ADIV: LCALL FP_BASE4
|
AJMP FPTST
|
AJMP FPTST
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SONERR: ; ON ERROR Statement
|
SONERR: ; ON ERROR Statement
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LCALL INTERR ;GET THE LINE NUMBER
|
LCALL INTERR ;GET THE LINE NUMBER
|
SETB ON_ERR
|
SETB ON_ERR
|
MOV DPTR,#ERRNUM ;POINT AT THR ERROR LOCATION
|
MOV DPTR,#ERRNUM ;POINT AT THR ERROR LOCATION
|
SJMP S20DP
|
SJMP S20DP
|
;
|
;
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
SONEXT: ; ON EXT1 Statement
|
SONEXT: ; ON EXT1 Statement
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
LCALL INTERR
|
LCALL INTERR
|
SETB INTBIT
|
SETB INTBIT
|
ORL IE,#10000100B ;ENABLE INTERRUPTS
|
ORL IE,#10000100B ;ENABLE INTERRUPTS
|
MOV DPTR,#INTLOC
|
MOV DPTR,#INTLOC
|
;
|
;
|
S20DP: MOV A,R2 ;SAVE R2:R0 @DPTR
|
S20DP: MOV A,R2 ;SAVE R2:R0 @DPTR
|
MOVX @DPTR,A
|
MOVX @DPTR,A
|
INC DPTR
|
INC DPTR
|
MOV A,R0
|
MOV A,R0
|
MOVX @DPTR,A
|
MOVX @DPTR,A
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; CASTAK - Copy and push another top of arg stack
|
; CASTAK - Copy and push another top of arg stack
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CSTAKA2:ACALL CSTAKA ;COPY STACK TWICE
|
CSTAKA2:ACALL CSTAKA ;COPY STACK TWICE
|
;
|
;
|
CSTAKA: ACALL SETREG ;SET UP R2:R0
|
CSTAKA: ACALL SETREG ;SET UP R2:R0
|
SJMP PUSH_T12
|
SJMP PUSH_T12
|
;
|
;
|
PLNEXP: MOV DPTR,#EXP1
|
PLNEXP: MOV DPTR,#EXP1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; PUSHC - Push constant on to the arg stack
|
; PUSHC - Push constant on to the arg stack
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PUSHC: ACALL DEC_ASTKA
|
PUSHC: ACALL DEC_ASTKA
|
MOV P2,R3
|
MOV P2,R3
|
MOV R3,#FPSIZ ;LOOP COUNTER
|
MOV R3,#FPSIZ ;LOOP COUNTER
|
;
|
;
|
PCL: CLR A ;SET UP A
|
PCL: CLR A ;SET UP A
|
MOVC A,@A+DPTR ;LOAD IT
|
MOVC A,@A+DPTR ;LOAD IT
|
MOVX @R1,A ;SAVE IT
|
MOVX @R1,A ;SAVE IT
|
INC DPTR ;BUMP POINTERS
|
INC DPTR ;BUMP POINTERS
|
DEC R1
|
DEC R1
|
DJNZ R3,PCL ;LOOP
|
DJNZ R3,PCL ;LOOP
|
;
|
;
|
SETB ARGF
|
SETB ARGF
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
PUSH_ONE:;
|
PUSH_ONE:;
|
;
|
;
|
MOV DPTR,#FPONE
|
MOV DPTR,#FPONE
|
AJMP PUSHC
|
AJMP PUSHC
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
POP_T1:
|
POP_T1:
|
;
|
;
|
MOV R3,#HIGH FPT1
|
MOV R3,#HIGH FPT1
|
MOV R1,#LOW FPT1
|
MOV R1,#LOW FPT1
|
JMP POPAS
|
JMP POPAS
|
;
|
;
|
PUSH_T1:
|
PUSH_T1:
|
;
|
;
|
MOV R0,#LOW FPT1
|
MOV R0,#LOW FPT1
|
PUSH_T11:
|
PUSH_T11:
|
MOV R2,#HIGH FPT1
|
MOV R2,#HIGH FPT1
|
PUSH_T12:
|
PUSH_T12:
|
LJMP PUSHAS
|
LJMP PUSHAS
|
;
|
;
|
P_T2: MOV R0,#LOW FPT2
|
P_T2: MOV R0,#LOW FPT2
|
SJMP PUSH_T11 ;JUMP TO PUSHAS
|
SJMP PUSH_T11 ;JUMP TO PUSHAS
|
;
|
;
|
;****************************************************************
|
;****************************************************************
|
;
|
;
|
SWAP_ASTKA: ; SWAP TOS<>TOS-1
|
SWAP_ASTKA: ; SWAP TOS<>TOS-1
|
;
|
;
|
;****************************************************************
|
;****************************************************************
|
;
|
;
|
ACALL SETREG ;SET UP R2:R0 AND P2
|
ACALL SETREG ;SET UP R2:R0 AND P2
|
MOV A,#FPSIZ ;PUT TOS+1 IN R1
|
MOV A,#FPSIZ ;PUT TOS+1 IN R1
|
MOV R2,A
|
MOV R2,A
|
ADD A,R0
|
ADD A,R0
|
MOV R1,A
|
MOV R1,A
|
;
|
;
|
S_L: MOVX A,@R0
|
S_L: MOVX A,@R0
|
MOV R3,A
|
MOV R3,A
|
MOVX A,@R1
|
MOVX A,@R1
|
MOVX @R0,A
|
MOVX @R0,A
|
MOV A,R3
|
MOV A,R3
|
MOVX @R1,A
|
MOVX @R1,A
|
DEC R1
|
DEC R1
|
DEC R0
|
DEC R0
|
DJNZ R2,S_L
|
DJNZ R2,S_L
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
C2_T2: ACALL SETREG ;SET UP R2:R0
|
C2_T2: ACALL SETREG ;SET UP R2:R0
|
MOV R3,#HIGH FPT2
|
MOV R3,#HIGH FPT2
|
MOV R1,#LOW FPT2 ;TEMP VALUE
|
MOV R1,#LOW FPT2 ;TEMP VALUE
|
;
|
;
|
; Fall thru
|
; Fall thru
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; VARCOP - Copy a variable from R2:R0 to R3:R1
|
; VARCOP - Copy a variable from R2:R0 to R3:R1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
VARCOP: MOV R4,#FPSIZ ;LOAD THE LOOP COUNTER
|
VARCOP: MOV R4,#FPSIZ ;LOAD THE LOOP COUNTER
|
;
|
;
|
V_C: MOV P2,R2 ;SET UP THE PORTS
|
V_C: MOV P2,R2 ;SET UP THE PORTS
|
MOVX A,@R0 ;READ THE VALUE
|
MOVX A,@R0 ;READ THE VALUE
|
MOV P2,R3 ;PORT TIME AGAIN
|
MOV P2,R3 ;PORT TIME AGAIN
|
MOVX @R1,A ;SAVE IT
|
MOVX @R1,A ;SAVE IT
|
ACALL DEC3210 ;BUMP POINTERS
|
ACALL DEC3210 ;BUMP POINTERS
|
DJNZ R4,V_C ;LOOP
|
DJNZ R4,V_C ;LOOP
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
PIPI: MOV DPTR,#PIE
|
PIPI: MOV DPTR,#PIE
|
AJMP PUSHC
|
AJMP PUSHC
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The logical operators ANL, ORL, XRL, NOT
|
; The logical operators ANL, ORL, XRL, NOT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
AANL: ACALL TWOL ;GET THE EXPRESSIONS
|
AANL: ACALL TWOL ;GET THE EXPRESSIONS
|
MOV A,R3 ;DO THE AND
|
MOV A,R3 ;DO THE AND
|
ANL A,R7
|
ANL A,R7
|
MOV R2,A
|
MOV R2,A
|
MOV A,R1
|
MOV A,R1
|
ANL A,R6
|
ANL A,R6
|
SJMP TWO_EX
|
SJMP TWO_EX
|
;
|
;
|
AORL: ACALL TWOL ;SAME THING FOR OR
|
AORL: ACALL TWOL ;SAME THING FOR OR
|
MOV A,R3
|
MOV A,R3
|
ORL A,R7
|
ORL A,R7
|
MOV R2,A
|
MOV R2,A
|
MOV A,R1
|
MOV A,R1
|
ORL A,R6
|
ORL A,R6
|
SJMP TWO_EX
|
SJMP TWO_EX
|
;
|
;
|
ANOT: ACALL FSTK ;PUT 0FFFFH ON THE STACK
|
ANOT: ACALL FSTK ;PUT 0FFFFH ON THE STACK
|
;
|
;
|
AXRL: ACALL TWOL
|
AXRL: ACALL TWOL
|
MOV A,R3
|
MOV A,R3
|
XRL A,R7
|
XRL A,R7
|
MOV R2,A
|
MOV R2,A
|
MOV A,R1
|
MOV A,R1
|
XRL A,R6
|
XRL A,R6
|
SJMP TWO_EX
|
SJMP TWO_EX
|
;
|
;
|
TWOL: ACALL IFIX
|
TWOL: ACALL IFIX
|
MOV R7,R3B0
|
MOV R7,R3B0
|
MOV R6,R1B0
|
MOV R6,R1B0
|
AJMP IFIX
|
AJMP IFIX
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
AGET: ; READ THE BREAK BYTE AND PUT IT ON THE ARG STACK
|
AGET: ; READ THE BREAK BYTE AND PUT IT ON THE ARG STACK
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
MOV DPTR,#GTB ;GET THE BREAK BYTE
|
MOV DPTR,#GTB ;GET THE BREAK BYTE
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
JBC GTRD,TWO_R2
|
JBC GTRD,TWO_R2
|
CLR A
|
CLR A
|
;
|
;
|
TWO_R2: MOV R2,#00H ;ACC GOES TO STACK
|
TWO_R2: MOV R2,#00H ;ACC GOES TO STACK
|
;
|
;
|
;
|
;
|
TWO_EX: MOV R0,A ;R2:ACC GOES TO STACK
|
TWO_EX: MOV R0,A ;R2:ACC GOES TO STACK
|
;
|
;
|
;
|
;
|
TWO_EY: SETB ARGF ;R2:R0 GETS PUT ON THE STACK
|
TWO_EY: SETB ARGF ;R2:R0 GETS PUT ON THE STACK
|
JMP FP_BASE12 ;DO IT
|
JMP FP_BASE12 ;DO IT
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
; Put directs onto the stack
|
; Put directs onto the stack
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
A_IE: MOV A,IE ;IE
|
A_IE: MOV A,IE ;IE
|
SJMP TWO_R2
|
SJMP TWO_R2
|
;
|
;
|
A_IP: MOV A,IP ;IP
|
A_IP: MOV A,IP ;IP
|
SJMP TWO_R2
|
SJMP TWO_R2
|
;
|
;
|
ATIM0: MOV R2,TH0 ;TIMER 0
|
ATIM0: MOV R2,TH0 ;TIMER 0
|
MOV R0,TL0
|
MOV R0,TL0
|
SJMP TWO_EY
|
SJMP TWO_EY
|
;
|
;
|
ATIM1: MOV R2,TH1 ;TIMER 1
|
ATIM1: MOV R2,TH1 ;TIMER 1
|
MOV R0,TL1
|
MOV R0,TL1
|
SJMP TWO_EY
|
SJMP TWO_EY
|
;
|
;
|
ATIM2: MOV R2,TH2
|
ATIM2: MOV R2,TH2
|
MOV R0,TL2
|
MOV R0,TL2
|
; DB 0AAH ;MOV R2 DIRECT OP CODE
|
; DB 0AAH ;MOV R2 DIRECT OP CODE
|
; DB 0CDH ;T2 HIGH
|
; DB 0CDH ;T2 HIGH
|
; DB 0A8H ;MOV R0 DIRECT OP CODE
|
; DB 0A8H ;MOV R0 DIRECT OP CODE
|
; DB 0CCH ;T2 LOW
|
; DB 0CCH ;T2 LOW
|
SJMP TWO_EY ;TIMER 2
|
SJMP TWO_EY ;TIMER 2
|
;
|
;
|
AT2CON: MOV A,T2CON
|
AT2CON: MOV A,T2CON
|
; DB 0E5H ;MOV A,DIRECT OPCODE
|
; DB 0E5H ;MOV A,DIRECT OPCODE
|
; DB 0C8H ;T2CON LOCATION
|
; DB 0C8H ;T2CON LOCATION
|
SJMP TWO_R2
|
SJMP TWO_R2
|
;
|
;
|
ATCON: MOV A,TCON ;TCON
|
ATCON: MOV A,TCON ;TCON
|
SJMP TWO_R2
|
SJMP TWO_R2
|
;
|
;
|
ATMOD: MOV A,TMOD ;TMOD
|
ATMOD: MOV A,TMOD ;TMOD
|
SJMP TWO_R2
|
SJMP TWO_R2
|
;
|
;
|
ARCAP2: MOV R2,RCAPH2
|
ARCAP2: MOV R2,RCAPH2
|
MOV R0,RCAPL2
|
MOV R0,RCAPL2
|
; DB 0AAH ;MOV R2, DIRECT OP CODE
|
; DB 0AAH ;MOV R2, DIRECT OP CODE
|
; DB 0CBH ;RCAP2H LOCATION
|
; DB 0CBH ;RCAP2H LOCATION
|
; DB 0A8H ;MOV R0, DIRECT OP CODE
|
; DB 0A8H ;MOV R0, DIRECT OP CODE
|
; DB 0CAH ;R2CAPL LOCATION
|
; DB 0CAH ;R2CAPL LOCATION
|
SJMP TWO_EY
|
SJMP TWO_EY
|
;
|
;
|
AP1: MOV A,P1 ;GET P1
|
AP1: MOV A,P1 ;GET P1
|
SJMP TWO_R2 ;PUT IT ON THE STACK
|
SJMP TWO_R2 ;PUT IT ON THE STACK
|
;
|
;
|
APCON: MOV A,PCON
|
APCON: MOV A,PCON
|
; DB 0E5H ;MOV A, DIRECT OP CODE
|
; DB 0E5H ;MOV A, DIRECT OP CODE
|
; DB 87H ;ADDRESS OF PCON
|
; DB 87H ;ADDRESS OF PCON
|
SJMP TWO_R2 ;PUT PCON ON THE STACK
|
SJMP TWO_R2 ;PUT PCON ON THE STACK
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;THIS IS THE LINE EDITOR
|
;THIS IS THE LINE EDITOR
|
;
|
;
|
;TAKE THE PROCESSED LINE IN IBUF AND INSERT IT INTO THE
|
;TAKE THE PROCESSED LINE IN IBUF AND INSERT IT INTO THE
|
;BASIC TEXT FILE.
|
;BASIC TEXT FILE.
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LINE0: LJMP NOGO ;CAN'T EDIT A ROM
|
LINE0: LJMP NOGO ;CAN'T EDIT A ROM
|
;
|
;
|
LINE: MOV A,BOFAH
|
LINE: MOV A,BOFAH
|
CJNE A,#HIGH PSTART,LINE0
|
CJNE A,#HIGH PSTART,LINE0
|
CALL G4 ;GET END ADDRESS FOR EDITING
|
CALL G4 ;GET END ADDRESS FOR EDITING
|
MOV R4,DPL
|
MOV R4,DPL
|
MOV R5,DPH
|
MOV R5,DPH
|
MOV R3,TEMP5 ;GET HIGH ORDER IBLN
|
MOV R3,TEMP5 ;GET HIGH ORDER IBLN
|
MOV R1,TEMP4 ;LOW ORDER IBLN
|
MOV R1,TEMP4 ;LOW ORDER IBLN
|
;
|
;
|
CALL GETLIN ;FIND THE LINE
|
CALL GETLIN ;FIND THE LINE
|
JNZ INSR ;INSERT IF NOT ZERO, ELSE APPEND
|
JNZ INSR ;INSERT IF NOT ZERO, ELSE APPEND
|
;
|
;
|
;APPEND THE LINE AT THE END
|
;APPEND THE LINE AT THE END
|
;
|
;
|
MOV A,TEMP3 ;PUT IBCNT IN THE ACC
|
MOV A,TEMP3 ;PUT IBCNT IN THE ACC
|
CJNE A,#4H,LINE1 ;SEE IF NO ENTRY
|
CJNE A,#4H,LINE1 ;SEE IF NO ENTRY
|
RET ;RET IF NO ENTRY
|
RET ;RET IF NO ENTRY
|
;
|
;
|
LINE1: ACALL FULL ;SEE IF ENOUGH SPACE LEFT
|
LINE1: ACALL FULL ;SEE IF ENOUGH SPACE LEFT
|
MOV R2,R5B0 ;PUT END ADDRESS A INTO TRANSFER
|
MOV R2,R5B0 ;PUT END ADDRESS A INTO TRANSFER
|
MOV R0,R4B0 ;REGISTERS
|
MOV R0,R4B0 ;REGISTERS
|
ACALL IMOV ;DO THE BLOCK MOVE
|
ACALL IMOV ;DO THE BLOCK MOVE
|
;
|
;
|
UE: MOV A,#EOF ;SAVE EOF CHARACTER
|
UE: MOV A,#EOF ;SAVE EOF CHARACTER
|
AJMP TBR
|
AJMP TBR
|
;
|
;
|
;INSERT A LINE INTO THE FILE
|
;INSERT A LINE INTO THE FILE
|
;
|
;
|
INSR: MOV R7,A ;SAVE IT IN R7
|
INSR: MOV R7,A ;SAVE IT IN R7
|
CALL TEMPD ;SAVE INSERATION ADDRESS
|
CALL TEMPD ;SAVE INSERATION ADDRESS
|
MOV A,TEMP3 ;PUT THE COUNT LENGTH IN THE ACC
|
MOV A,TEMP3 ;PUT THE COUNT LENGTH IN THE ACC
|
JC LTX ;JUMP IF NEW LINE # NOT = OLD LINE #
|
JC LTX ;JUMP IF NEW LINE # NOT = OLD LINE #
|
CJNE A,#04H,INSR1 ;SEE IF NULL
|
CJNE A,#04H,INSR1 ;SEE IF NULL
|
CLR A
|
CLR A
|
;
|
;
|
INSR1: SUBB A,R7 ;SUBTRACT LINE COUNT FROM ACC
|
INSR1: SUBB A,R7 ;SUBTRACT LINE COUNT FROM ACC
|
JZ LIN1 ;LINE LENGTHS EQUAL
|
JZ LIN1 ;LINE LENGTHS EQUAL
|
JC GTX ;SMALLER LINE
|
JC GTX ;SMALLER LINE
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
;EXPAND FOR A NEW LINE OR A LARGER LINE
|
;EXPAND FOR A NEW LINE OR A LARGER LINE
|
;
|
;
|
LTX: MOV R7,A ;SAVE A IN R7
|
LTX: MOV R7,A ;SAVE A IN R7
|
MOV A,TEMP3 ;GET THE COUNT IN THE ACC
|
MOV A,TEMP3 ;GET THE COUNT IN THE ACC
|
CJNE A,#04H,LTX1 ;DO NO INSERTATION IF NULL LINE
|
CJNE A,#04H,LTX1 ;DO NO INSERTATION IF NULL LINE
|
RET ;EXIT IF IT IS
|
RET ;EXIT IF IT IS
|
;
|
;
|
LTX1: MOV A,R7 ;GET THE COUNT BACK - DELTA IN A
|
LTX1: MOV A,R7 ;GET THE COUNT BACK - DELTA IN A
|
ACALL FULL ;SEE IF ENOUGH MEMORY NEW EOFA IN R3:R1
|
ACALL FULL ;SEE IF ENOUGH MEMORY NEW EOFA IN R3:R1
|
CALL DTEMP ;GET INSERATION ADDRESS
|
CALL DTEMP ;GET INSERATION ADDRESS
|
ACALL NMOV ;R7:R6 GETS (EOFA)-DPTR
|
ACALL NMOV ;R7:R6 GETS (EOFA)-DPTR
|
CALL X3120
|
CALL X3120
|
MOV R1,R4B0 ;EOFA LOW
|
MOV R1,R4B0 ;EOFA LOW
|
MOV R3,R5B0 ;EOFA HIGH
|
MOV R3,R5B0 ;EOFA HIGH
|
INC R6 ;INCREMENT BYTE COUNT
|
INC R6 ;INCREMENT BYTE COUNT
|
CJNE R6,#00,LTX2 ;NEED TO BUMP HIGH BYTE?
|
CJNE R6,#00,LTX2 ;NEED TO BUMP HIGH BYTE?
|
INC R7
|
INC R7
|
;
|
;
|
LTX2: ACALL RMOV ;GO DO THE INSERTION
|
LTX2: ACALL RMOV ;GO DO THE INSERTION
|
SJMP LIN1 ;INSERT THE CURRENT LINE
|
SJMP LIN1 ;INSERT THE CURRENT LINE
|
;
|
;
|
GTX: CPL A ;FLIP ACC
|
GTX: CPL A ;FLIP ACC
|
INC A ;TWOS COMPLEMENT
|
INC A ;TWOS COMPLEMENT
|
CALL ADDPTR ;DO THE ADDITION
|
CALL ADDPTR ;DO THE ADDITION
|
ACALL NMOV ;R7:R6 GETS (EOFA)-DPTR
|
ACALL NMOV ;R7:R6 GETS (EOFA)-DPTR
|
MOV R1,DPL ;SET UP THE REGISTERS
|
MOV R1,DPL ;SET UP THE REGISTERS
|
MOV R3,DPH
|
MOV R3,DPH
|
MOV R2,TEMP5 ;PUT INSERTATION ADDRESS IN THE RIGHT REG
|
MOV R2,TEMP5 ;PUT INSERTATION ADDRESS IN THE RIGHT REG
|
MOV R0,TEMP4
|
MOV R0,TEMP4
|
JZ GTX1 ;IF ACC WAS ZERO FROM NMOV, JUMP
|
JZ GTX1 ;IF ACC WAS ZERO FROM NMOV, JUMP
|
ACALL LMOV ;IF NO ZERO DO A LMOV
|
ACALL LMOV ;IF NO ZERO DO A LMOV
|
;
|
;
|
GTX1: ACALL UE ;SAVE NEW END ADDRESS
|
GTX1: ACALL UE ;SAVE NEW END ADDRESS
|
;
|
;
|
LIN1: MOV R2,TEMP5 ;GET THE INSERTATION ADDRESS
|
LIN1: MOV R2,TEMP5 ;GET THE INSERTATION ADDRESS
|
MOV R0,TEMP4
|
MOV R0,TEMP4
|
MOV A,TEMP3 ;PUT THE COUNT LENGTH IN ACC
|
MOV A,TEMP3 ;PUT THE COUNT LENGTH IN ACC
|
CJNE A,#04H,IMOV ;SEE IF NULL
|
CJNE A,#04H,IMOV ;SEE IF NULL
|
RET ;EXIT IF NULL
|
RET ;EXIT IF NULL
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;INSERT A LINE AT ADDRESS R2:R0
|
;INSERT A LINE AT ADDRESS R2:R0
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
IMOV: CLR A ;TO SET UP
|
IMOV: CLR A ;TO SET UP
|
MOV R1,#LOW IBCNT ;INITIALIZE THE REGISTERS
|
MOV R1,#LOW IBCNT ;INITIALIZE THE REGISTERS
|
MOV R3,A
|
MOV R3,A
|
MOV R6,TEMP3 ;PUT THE BYTE COUNT IN R6 FOR LMOV
|
MOV R6,TEMP3 ;PUT THE BYTE COUNT IN R6 FOR LMOV
|
MOV R7,A ;PUT A 0 IN R7 FOR LMOV
|
MOV R7,A ;PUT A 0 IN R7 FOR LMOV
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;COPY A BLOCK FROM THE BEGINNING
|
;COPY A BLOCK FROM THE BEGINNING
|
;
|
;
|
;R2:R0 IS THE DESTINATION ADDRESS
|
;R2:R0 IS THE DESTINATION ADDRESS
|
;R3:R1 IS THE SOURCE ADDRESS
|
;R3:R1 IS THE SOURCE ADDRESS
|
;R7:R6 IS THE COUNT REGISTER
|
;R7:R6 IS THE COUNT REGISTER
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LMOV: ACALL TBYTE ;TRANSFER THE BYTE
|
LMOV: ACALL TBYTE ;TRANSFER THE BYTE
|
ACALL INC3210 ;BUMP THE POINTER
|
ACALL INC3210 ;BUMP THE POINTER
|
ACALL DEC76 ;BUMP R7:R6
|
ACALL DEC76 ;BUMP R7:R6
|
JNZ LMOV ;LOOP
|
JNZ LMOV ;LOOP
|
RET ;GO BACK TO CALLING ROUTINE
|
RET ;GO BACK TO CALLING ROUTINE
|
;
|
;
|
INC3210:INC R0
|
INC3210:INC R0
|
CJNE R0,#00H,INC3211
|
CJNE R0,#00H,INC3211
|
INC R2
|
INC R2
|
;
|
;
|
INC3211:INC R1
|
INC3211:INC R1
|
CJNE R1,#00H,INC3212
|
CJNE R1,#00H,INC3212
|
INC R3
|
INC R3
|
INC3212:RET
|
INC3212:RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;COPY A BLOCK STARTING AT THE END
|
;COPY A BLOCK STARTING AT THE END
|
;
|
;
|
;R2:R0 IS THE DESTINATION ADDRESS
|
;R2:R0 IS THE DESTINATION ADDRESS
|
;R3:R1 IS THE SOURCE ADDRESS
|
;R3:R1 IS THE SOURCE ADDRESS
|
;R6:R7 IS THE COUNT REGISTER
|
;R6:R7 IS THE COUNT REGISTER
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
RMOV: ACALL TBYTE ;TRANSFER THE BYTE
|
RMOV: ACALL TBYTE ;TRANSFER THE BYTE
|
ACALL DEC3210 ;DEC THE LOCATIONS
|
ACALL DEC3210 ;DEC THE LOCATIONS
|
ACALL DEC76 ;BUMP THE COUNTER
|
ACALL DEC76 ;BUMP THE COUNTER
|
JNZ RMOV ;LOOP
|
JNZ RMOV ;LOOP
|
;
|
;
|
DEC_R: NOP ;CREATE EQUAL TIMING
|
DEC_R: NOP ;CREATE EQUAL TIMING
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
DEC3210:DEC R0 ;BUMP THE POINTER
|
DEC3210:DEC R0 ;BUMP THE POINTER
|
CJNE R0,#0FFH,DEC3212;SEE IF OVERFLOWED
|
CJNE R0,#0FFH,DEC3212;SEE IF OVERFLOWED
|
DEC3211:DEC R2 ;BUMP THE HIGH BYTE
|
DEC3211:DEC R2 ;BUMP THE HIGH BYTE
|
DEC3212:DEC R1 ;BUMP THE POINTER
|
DEC3212:DEC R1 ;BUMP THE POINTER
|
CJNE R1,#0FFH,DEC_R ;SEE IF OVERFLOWED
|
CJNE R1,#0FFH,DEC_R ;SEE IF OVERFLOWED
|
DEC R3 ;CHANGE THE HIGH BYTE
|
DEC R3 ;CHANGE THE HIGH BYTE
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;TBYTE - TRANSFER A BYTE
|
;TBYTE - TRANSFER A BYTE
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
TBYTE: MOV P2,R3 ;OUTPUT SOURCE REGISTER TO PORT
|
TBYTE: MOV P2,R3 ;OUTPUT SOURCE REGISTER TO PORT
|
MOVX A,@R1 ;PUT BYTE IN ACC
|
MOVX A,@R1 ;PUT BYTE IN ACC
|
;
|
;
|
TBR: MOV P2,R2 ;OUTPUT DESTINATION TO PORT
|
TBR: MOV P2,R2 ;OUTPUT DESTINATION TO PORT
|
MOVX @R0,A ;SAVE THE BYTE
|
MOVX @R0,A ;SAVE THE BYTE
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;NMOV - R7:R6 = END ADDRESS - DPTR
|
;NMOV - R7:R6 = END ADDRESS - DPTR
|
;
|
;
|
;ACC GETS CLOBBERED
|
;ACC GETS CLOBBERED
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
NMOV: MOV A,R4 ;THE LOW BYTE OF EOFA
|
NMOV: MOV A,R4 ;THE LOW BYTE OF EOFA
|
CLR C ;CLEAR THE CARRY FOR SUBB
|
CLR C ;CLEAR THE CARRY FOR SUBB
|
SUBB A,DPL ;SUBTRACT DATA POINTER LOW
|
SUBB A,DPL ;SUBTRACT DATA POINTER LOW
|
MOV R6,A ;PUT RESULT IN R6
|
MOV R6,A ;PUT RESULT IN R6
|
MOV A,R5 ;HIGH BYTE OF EOFA
|
MOV A,R5 ;HIGH BYTE OF EOFA
|
SUBB A,DPH ;SUBTRACT DATA POINTER HIGH
|
SUBB A,DPH ;SUBTRACT DATA POINTER HIGH
|
MOV R7,A ;PUT RESULT IN R7
|
MOV R7,A ;PUT RESULT IN R7
|
ORL A,R6 ;SEE IF ZERO
|
ORL A,R6 ;SEE IF ZERO
|
NMOV1: RET ;EXIT
|
NMOV1: RET ;EXIT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;CHECK FOR A FILE OVERFLOW
|
;CHECK FOR A FILE OVERFLOW
|
;LEAVES THE NEW END ADDRESS IN R3:R1
|
;LEAVES THE NEW END ADDRESS IN R3:R1
|
;A HAS THE INCREASE IN SIZE
|
;A HAS THE INCREASE IN SIZE
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
FULL: ADD A,R4 ;ADD A TO END ADDRESS
|
FULL: ADD A,R4 ;ADD A TO END ADDRESS
|
MOV R1,A ;SAVE IT
|
MOV R1,A ;SAVE IT
|
CLR A
|
CLR A
|
ADDC A,R5 ;ADD THE CARRY
|
ADDC A,R5 ;ADD THE CARRY
|
MOV R3,A
|
MOV R3,A
|
MOV DPTR,#VARTOP ;POINT AT VARTOP
|
MOV DPTR,#VARTOP ;POINT AT VARTOP
|
;
|
;
|
FUL1: CALL DCMPX ;COMPARE THE TWO
|
FUL1: CALL DCMPX ;COMPARE THE TWO
|
JC NMOV1 ;OUT OF ROOM
|
JC NMOV1 ;OUT OF ROOM
|
;
|
;
|
TB: MOV DPTR,#E5X ;OUT OF MEMORY
|
TB: MOV DPTR,#E5X ;OUT OF MEMORY
|
AJMP FPTS
|
AJMP FPTS
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; PP - Preprocesses the line in IBUF back into IBUF
|
; PP - Preprocesses the line in IBUF back into IBUF
|
; sets F0 if no line number
|
; sets F0 if no line number
|
; leaves the correct length of processed line in IBCNT
|
; leaves the correct length of processed line in IBCNT
|
; puts the line number in IBLN
|
; puts the line number in IBLN
|
; wastes the text address TXAL and TXAH
|
; wastes the text address TXAL and TXAH
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PP: ACALL T_BUF ;TXA GETS IBUF
|
PP: ACALL T_BUF ;TXA GETS IBUF
|
CALL INTGER ;SEE IF A NUMBER PRESENT
|
CALL INTGER ;SEE IF A NUMBER PRESENT
|
CALL TEMPD ;SAVE THE INTEGER IN TEMP5:TEMP4
|
CALL TEMPD ;SAVE THE INTEGER IN TEMP5:TEMP4
|
MOV F0,C ;SAVE INTEGER IF PRESENT
|
MOV F0,C ;SAVE INTEGER IF PRESENT
|
MOV DPTR,#IBLN ;SAVE THE LINE NUMBER, EVEN IF NONE
|
MOV DPTR,#IBLN ;SAVE THE LINE NUMBER, EVEN IF NONE
|
ACALL S20DP
|
ACALL S20DP
|
MOV R0,TXAL ;TEXT POINTER
|
MOV R0,TXAL ;TEXT POINTER
|
MOV R1,#LOW IBUF ;STORE POINTER
|
MOV R1,#LOW IBUF ;STORE POINTER
|
;
|
;
|
; Now process the line back into IBUF
|
; Now process the line back into IBUF
|
;
|
;
|
PPL: CLR ARGF ;FIRST PASS DESIGNATOR
|
PPL: CLR ARGF ;FIRST PASS DESIGNATOR
|
MOV DPTR,#TOKTAB ;POINT DPTR AT LOOK UP TABLE
|
MOV DPTR,#TOKTAB ;POINT DPTR AT LOOK UP TABLE
|
;
|
;
|
PPL1: MOV R5B0,R0 ;SAVE THE READ POINTER
|
PPL1: MOV R5B0,R0 ;SAVE THE READ POINTER
|
CLR A ;ZERO A FOR LOOKUP
|
CLR A ;ZERO A FOR LOOKUP
|
MOVC A,@A+DPTR ;GET THE TOKEN
|
MOVC A,@A+DPTR ;GET THE TOKEN
|
MOV R7,A ;SAVE TOKEN IN CASE OF MATCH
|
MOV R7,A ;SAVE TOKEN IN CASE OF MATCH
|
;
|
;
|
PPL2: MOVX A,@R0 ;GET THE USER CHARACTER
|
PPL2: MOVX A,@R0 ;GET THE USER CHARACTER
|
MOV R3,A ;SAVE FOR REM
|
MOV R3,A ;SAVE FOR REM
|
CJNE A,#'a',PPL21
|
CJNE A,#'a',PPL21
|
PPL21: JC PPX ;CONVERT LOWER TO UPPER CASE
|
PPL21: JC PPX ;CONVERT LOWER TO UPPER CASE
|
CJNE A,#('z'+1),PPL22
|
CJNE A,#('z'+1),PPL22
|
PPL22: JNC PPX
|
PPL22: JNC PPX
|
CLR ACC.5
|
CLR ACC.5
|
;
|
;
|
PPX: MOV R2,A
|
PPX: MOV R2,A
|
MOVX @R0,A ;SAVE UPPER CASE
|
MOVX @R0,A ;SAVE UPPER CASE
|
INC DPTR ;BUMP THE LOOKUP POINTER
|
INC DPTR ;BUMP THE LOOKUP POINTER
|
CLR A
|
CLR A
|
MOVC A,@A+DPTR
|
MOVC A,@A+DPTR
|
CJNE A,R2B0,PPL3 ;LEAVE IF NOT THE SAME
|
CJNE A,R2B0,PPL3 ;LEAVE IF NOT THE SAME
|
INC R0 ;BUMP THE USER POINTER
|
INC R0 ;BUMP THE USER POINTER
|
SJMP PPL2 ;CONTINUE TO LOOP
|
SJMP PPL2 ;CONTINUE TO LOOP
|
;
|
;
|
PPL3: JB ACC.7,PPL6 ;JUMP IF FOUND MATCH
|
PPL3: JB ACC.7,PPL6 ;JUMP IF FOUND MATCH
|
JZ PPL6 ;USER MATCH
|
JZ PPL6 ;USER MATCH
|
;
|
;
|
;
|
;
|
; Scan to the next TOKTAB entry
|
; Scan to the next TOKTAB entry
|
;
|
;
|
PPL4: INC DPTR ;ADVANCE THE POINTER
|
PPL4: INC DPTR ;ADVANCE THE POINTER
|
CLR A ;ZERO A FOR LOOKUP
|
CLR A ;ZERO A FOR LOOKUP
|
MOVC A,@A+DPTR ;LOAD A WITH TABLE
|
MOVC A,@A+DPTR ;LOAD A WITH TABLE
|
JB ACC.7,PPL41 ;KEEP SCANNING IF NOT A RESERVED WORD
|
JB ACC.7,PPL41 ;KEEP SCANNING IF NOT A RESERVED WORD
|
JNZ PPL4
|
JNZ PPL4
|
INC DPTR
|
INC DPTR
|
;
|
;
|
; See if at the end of TOKTAB
|
; See if at the end of TOKTAB
|
;
|
;
|
PPL41: MOV R0,R5B0 ;RESTORE THE POINTER
|
PPL41: MOV R0,R5B0 ;RESTORE THE POINTER
|
CJNE A,#0FFH,PPL1 ;SEE IF END OF TABLE
|
CJNE A,#0FFH,PPL1 ;SEE IF END OF TABLE
|
;
|
;
|
; Character not in TOKTAB, so see what it is
|
; Character not in TOKTAB, so see what it is
|
;
|
;
|
CJNE R2,#' ',PPLX ;SEE IF A SPACE
|
CJNE R2,#' ',PPLX ;SEE IF A SPACE
|
INC R0 ;BUMP USER POINTER
|
INC R0 ;BUMP USER POINTER
|
SJMP PPL ;TRY AGAIN
|
SJMP PPL ;TRY AGAIN
|
;
|
;
|
PPLX: JNB XBIT,PPLY ;EXTERNAL TRAP
|
PPLX: JNB XBIT,PPLY ;EXTERNAL TRAP
|
JB ARGF,PPLY
|
JB ARGF,PPLY
|
SETB ARGF ;SAYS THAT THE USER HAS TABLE
|
SETB ARGF ;SAYS THAT THE USER HAS TABLE
|
LCALL 2078H ;SET UP POINTER
|
LCALL 2078H ;SET UP POINTER
|
AJMP PPL1
|
AJMP PPL1
|
;
|
;
|
PPLY: ACALL PPL7 ;SAVE CHARACTER, EXIT IF A CR
|
PPLY: ACALL PPL7 ;SAVE CHARACTER, EXIT IF A CR
|
CJNE A,#'"',PPL ;SEE IF QUOTED STRING, START AGAIN IF NOT
|
CJNE A,#'"',PPL ;SEE IF QUOTED STRING, START AGAIN IF NOT
|
;
|
;
|
; Just copy a quoted string
|
; Just copy a quoted string
|
;
|
;
|
PPLY1: ACALL PPL7 ;SAVE THE CHARACTER, TEST FOR CR
|
PPLY1: ACALL PPL7 ;SAVE THE CHARACTER, TEST FOR CR
|
CJNE A,#'"',PPLY1 ;IS THERE AN ENDQUOTE, IF NOT LOOP
|
CJNE A,#'"',PPLY1 ;IS THERE AN ENDQUOTE, IF NOT LOOP
|
SJMP PPL ;DO IT AGAIN IF ENDQUOTE
|
SJMP PPL ;DO IT AGAIN IF ENDQUOTE
|
;
|
;
|
PPL6: MOV A,R7 ;GET THE TOKEN
|
PPL6: MOV A,R7 ;GET THE TOKEN
|
ACALL PPL91 ;SAVE THE TOKEN
|
ACALL PPL91 ;SAVE THE TOKEN
|
CJNE A,#T_REM,PPL ;SEE IF A REM TOKEN
|
CJNE A,#T_REM,PPL ;SEE IF A REM TOKEN
|
MOV A,R3
|
MOV A,R3
|
ACALL PPL71 ;WASTE THE REM STATEMENT
|
ACALL PPL71 ;WASTE THE REM STATEMENT
|
PPL61: ACALL PPL7 ;LOOP UNTIL A CR
|
PPL61: ACALL PPL7 ;LOOP UNTIL A CR
|
SJMP PPL61
|
SJMP PPL61
|
;
|
;
|
PPL7: MOVX A,@R0 ;GET THE CHARACTER
|
PPL7: MOVX A,@R0 ;GET THE CHARACTER
|
PPL71: CJNE A,#CR,PPL9 ;FINISH IF A CR
|
PPL71: CJNE A,#CR,PPL9 ;FINISH IF A CR
|
POP R0B0 ;WASTE THE CALLING STACK
|
POP R0B0 ;WASTE THE CALLING STACK
|
POP R0B0
|
POP R0B0
|
MOVX @R1,A ;SAVE CR IN MEMORY
|
MOVX @R1,A ;SAVE CR IN MEMORY
|
INC R1 ;SAVE A TERMINATOR
|
INC R1 ;SAVE A TERMINATOR
|
MOV A,#EOF
|
MOV A,#EOF
|
MOVX @R1,A
|
MOVX @R1,A
|
MOV A,R1 ;SUBTRACT FOR LENGTH
|
MOV A,R1 ;SUBTRACT FOR LENGTH
|
SUBB A,#4
|
SUBB A,#4
|
MOV TEMP3,A ;SAVE LENGTH
|
MOV TEMP3,A ;SAVE LENGTH
|
MOV R1,#LOW IBCNT ;POINT AT BUFFER COUNT
|
MOV R1,#LOW IBCNT ;POINT AT BUFFER COUNT
|
;
|
;
|
PPL9: INC R0
|
PPL9: INC R0
|
PPL91: MOVX @R1,A ;SAVE THE CHARACTER
|
PPL91: MOVX @R1,A ;SAVE THE CHARACTER
|
INC R1 ;BUMP THE POINTERS
|
INC R1 ;BUMP THE POINTERS
|
RET ;EXIT TO CALLING ROUTINE
|
RET ;EXIT TO CALLING ROUTINE
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;DEC76 - DECREMENT THE REGISTER PAIR R7:R6
|
;DEC76 - DECREMENT THE REGISTER PAIR R7:R6
|
;
|
;
|
;ACC = ZERO IF R7:R6 = ZERO ; ELSE ACC DOES NOT
|
;ACC = ZERO IF R7:R6 = ZERO ; ELSE ACC DOES NOT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
DEC76: DEC R6 ;BUMP R6
|
DEC76: DEC R6 ;BUMP R6
|
CJNE R6,#0FFH,DEC77 ;SEE IF RAPPED AROUND
|
CJNE R6,#0FFH,DEC77 ;SEE IF RAPPED AROUND
|
DEC R7
|
DEC R7
|
DEC77: MOV A,R7 ;SEE IF ZERO
|
DEC77: MOV A,R7 ;SEE IF ZERO
|
ORL A,R6
|
ORL A,R6
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; MTOP - Get or Put the top of assigned memory
|
; MTOP - Get or Put the top of assigned memory
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PMTOP: MOV DPTR,#MEMTOP
|
PMTOP: MOV DPTR,#MEMTOP
|
PMTOP1: CALL L20DPI
|
PMTOP1: CALL L20DPI
|
AJMP TWO_EY ;PUT R2:R0 ON THE STACK
|
AJMP TWO_EY ;PUT R2:R0 ON THE STACK
|
;
|
;
|
$EJECT
|
$EJECT
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
; AXTAL - Crystal value calculations
|
; AXTAL - Crystal value calculations
|
;
|
;
|
;*************************************************************
|
;*************************************************************
|
;
|
;
|
AXTAL0: MOV DPTR,#XTALV ;CRYSTAL VALUE
|
AXTAL0: MOV DPTR,#XTALV ;CRYSTAL VALUE
|
ACALL PUSHC
|
ACALL PUSHC
|
;
|
;
|
AXTAL1: ACALL CSTAKA2 ;COPY CRYSTAL VALUE TWICE
|
AXTAL1: ACALL CSTAKA2 ;COPY CRYSTAL VALUE TWICE
|
ACALL CSTAKA
|
ACALL CSTAKA
|
MOV DPTR,#PTIME ;PROM TIMER
|
MOV DPTR,#PTIME ;PROM TIMER
|
ACALL AXTAL2
|
ACALL AXTAL2
|
MOV DPTR,#PROGS
|
MOV DPTR,#PROGS
|
ACALL S31L
|
ACALL S31L
|
MOV DPTR,#IPTIME ;IPROM TIMER
|
MOV DPTR,#IPTIME ;IPROM TIMER
|
ACALL AXTAL2
|
ACALL AXTAL2
|
MOV DPTR,#IPROGS
|
MOV DPTR,#IPROGS
|
ACALL S31L
|
ACALL S31L
|
MOV DPTR,#TTIME ;CLOCK CALCULATION
|
MOV DPTR,#TTIME ;CLOCK CALCULATION
|
ACALL AXTAL3
|
ACALL AXTAL3
|
MOV A,R1
|
MOV A,R1
|
CPL A
|
CPL A
|
INC A
|
INC A
|
MOV SAVE_T,A
|
MOV SAVE_T,A
|
MOV R3,#HIGH CXTAL
|
MOV R3,#HIGH CXTAL
|
MOV R1,#LOW CXTAL
|
MOV R1,#LOW CXTAL
|
JMP POPAS
|
JMP POPAS
|
;
|
;
|
AXTAL2: ACALL AXTAL3
|
AXTAL2: ACALL AXTAL3
|
;
|
;
|
CBIAS: ;Bias the crystal calculations
|
CBIAS: ;Bias the crystal calculations
|
;
|
;
|
MOV A,R1 ;GET THE LOW COUNT
|
MOV A,R1 ;GET THE LOW COUNT
|
CPL A ;FLIP IT FOR TIMER LOAD
|
CPL A ;FLIP IT FOR TIMER LOAD
|
ADD A,#15 ;BIAS FOR CALL AND LOAD TIMES
|
ADD A,#15 ;BIAS FOR CALL AND LOAD TIMES
|
MOV R1,A ;RESTORE IT
|
MOV R1,A ;RESTORE IT
|
MOV A,R3 ;GET THE HIGH COUNT
|
MOV A,R3 ;GET THE HIGH COUNT
|
CPL A ;FLIP IT
|
CPL A ;FLIP IT
|
ADDC A,#00H ;ADD THE CARRY
|
ADDC A,#00H ;ADD THE CARRY
|
MOV R3,A ;RESTORE IT
|
MOV R3,A ;RESTORE IT
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;$INCLUDE(:F2:BAS52.PWM)
|
;$INCLUDE(:F2:BAS52.PWM)
|
;BEGINNING
|
;BEGINNING
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
STONE: ; Toggle the I/O port
|
STONE: ; Toggle the I/O port
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
CALL THREE ;GET THE NUMBERS
|
CALL THREE ;GET THE NUMBERS
|
ACALL CBIAS ;BIAS R3:R1 FOR COUNT LOOP
|
ACALL CBIAS ;BIAS R3:R1 FOR COUNT LOOP
|
;
|
;
|
STONE1: CLR T_BIT ;TOGGLE THE BIT
|
STONE1: CLR T_BIT ;TOGGLE THE BIT
|
CLR TR1 ;STOP THE TIMER
|
CLR TR1 ;STOP THE TIMER
|
MOV TH1,R3 ;LOAD THE TIMER
|
MOV TH1,R3 ;LOAD THE TIMER
|
MOV TL1,R1
|
MOV TL1,R1
|
CLR TF1 ;CLEAR THE OVERFLOW FLAG
|
CLR TF1 ;CLEAR THE OVERFLOW FLAG
|
SETB TR1 ;TURN IT ON
|
SETB TR1 ;TURN IT ON
|
ACALL DEC76
|
ACALL DEC76
|
JNB TF1,$ ;WAIT
|
JNB TF1,$ ;WAIT
|
ACALL ALPAR
|
ACALL ALPAR
|
SETB T_BIT ;BACK TO A ONE
|
SETB T_BIT ;BACK TO A ONE
|
CALL TIMER_LOAD1 ;LOAD THE HIGH VALUE
|
CALL TIMER_LOAD1 ;LOAD THE HIGH VALUE
|
JNB TF1,$ ;WAIT
|
JNB TF1,$ ;WAIT
|
JNZ STONE1 ;LOOP
|
JNZ STONE1 ;LOOP
|
RET
|
RET
|
;
|
;
|
|
|
;END
|
;END
|
;$INCLUDE(:F2:BAS52.PWM)
|
;$INCLUDE(:F2:BAS52.PWM)
|
$EJECT
|
$EJECT
|
;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
|
;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
|
;
|
;
|
LNTAB: ; Natural log lookup table
|
LNTAB: ; Natural log lookup table
|
;
|
;
|
;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
|
;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN
|
;
|
;
|
DB 80H
|
DB 80H
|
DB 00H
|
DB 00H
|
DB 71H
|
DB 71H
|
DB 37H
|
DB 37H
|
DB 13H
|
DB 13H
|
DB 19H
|
DB 19H
|
;
|
;
|
DB 7FH
|
DB 7FH
|
DB 00H
|
DB 00H
|
DB 76H
|
DB 76H
|
DB 64H
|
DB 64H
|
DB 37H
|
DB 37H
|
DB 94H
|
DB 94H
|
;
|
;
|
DB 80H
|
DB 80H
|
DB 00H
|
DB 00H
|
DB 07H
|
DB 07H
|
DB 22H
|
DB 22H
|
DB 75H
|
DB 75H
|
DB 17H
|
DB 17H
|
;
|
;
|
DB 80H
|
DB 80H
|
DB 00H
|
DB 00H
|
DB 52H
|
DB 52H
|
DB 35H
|
DB 35H
|
DB 93H
|
DB 93H
|
DB 28H
|
DB 28H
|
;
|
;
|
DB 80H
|
DB 80H
|
DB 00H
|
DB 00H
|
DB 71H
|
DB 71H
|
DB 91H
|
DB 91H
|
DB 85H
|
DB 85H
|
DB 86H
|
DB 86H
|
;
|
;
|
DB 0FFH
|
DB 0FFH
|
;
|
;
|
DB 81H
|
DB 81H
|
DB 00H
|
DB 00H
|
DB 51H
|
DB 51H
|
DB 58H
|
DB 58H
|
DB 02H
|
DB 02H
|
DB 23H
|
DB 23H
|
;
|
;
|
$EJECT
|
$EJECT
|
;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
|
;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
|
;
|
;
|
SINTAB: ; Sin lookup table
|
SINTAB: ; Sin lookup table
|
;
|
;
|
;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
|
;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN
|
;
|
;
|
DB 128-9
|
DB 128-9
|
DB 00H
|
DB 00H
|
DB 44H
|
DB 44H
|
DB 90H
|
DB 90H
|
DB 05H
|
DB 05H
|
DB 16H
|
DB 16H
|
;
|
;
|
DB 128-7
|
DB 128-7
|
DB 01H
|
DB 01H
|
DB 08H
|
DB 08H
|
DB 21H
|
DB 21H
|
DB 05H
|
DB 05H
|
DB 25H
|
DB 25H
|
;
|
;
|
DB 128-5
|
DB 128-5
|
DB 00H
|
DB 00H
|
DB 19H
|
DB 19H
|
DB 73H
|
DB 73H
|
DB 55H
|
DB 55H
|
DB 27H
|
DB 27H
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
DB 128-3
|
DB 128-3
|
DB 01H
|
DB 01H
|
DB 70H
|
DB 70H
|
DB 12H
|
DB 12H
|
DB 84H
|
DB 84H
|
DB 19H
|
DB 19H
|
;
|
;
|
DB 128-2
|
DB 128-2
|
DB 00H
|
DB 00H
|
DB 33H
|
DB 33H
|
DB 33H
|
DB 33H
|
DB 33H
|
DB 33H
|
DB 83H
|
DB 83H
|
;
|
;
|
DB 128
|
DB 128
|
DB 01H
|
DB 01H
|
DB 67H
|
DB 67H
|
DB 66H
|
DB 66H
|
DB 66H
|
DB 66H
|
DB 16H
|
DB 16H
|
;
|
;
|
FPONE: DB 128+1
|
FPONE: DB 128+1
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 10H
|
DB 10H
|
;
|
;
|
DB 0FFH ;END OF TABLE
|
DB 0FFH ;END OF TABLE
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
SBAUD: CALL AXTAL ;PUT CRYSTAL ON THE STACK
|
SBAUD: CALL AXTAL ;PUT CRYSTAL ON THE STACK
|
CALL EXPRB ;PUT THE NUMBER AFTER BAUD ON STACK
|
CALL EXPRB ;PUT THE NUMBER AFTER BAUD ON STACK
|
MOV A,#12
|
MOV A,#12
|
ACALL TWO_R2 ;TOS = 12
|
ACALL TWO_R2 ;TOS = 12
|
ACALL AMUL ;TOS = 12*BAUD
|
ACALL AMUL ;TOS = 12*BAUD
|
ACALL ADIV ;TOS = XTAL/(12*BAUD)
|
ACALL ADIV ;TOS = XTAL/(12*BAUD)
|
ACALL IFIX
|
ACALL IFIX
|
ACALL CBIAS
|
ACALL CBIAS
|
MOV DPTR,#SPV
|
MOV DPTR,#SPV
|
;
|
;
|
S31L: JMP S31DP
|
S31L: JMP S31DP
|
;
|
;
|
AFREE: CALL PMTOP ;PUT MTOP ON STACK
|
AFREE: CALL PMTOP ;PUT MTOP ON STACK
|
CALL G4 ;GET END ADDRESS
|
CALL G4 ;GET END ADDRESS
|
MOV R0,DPL
|
MOV R0,DPL
|
MOV R2,DPH
|
MOV R2,DPH
|
ACALL TWO_EY
|
ACALL TWO_EY
|
;
|
;
|
ASUB: LCALL FP_BASE1 ;DO FP SUB
|
ASUB: LCALL FP_BASE1 ;DO FP SUB
|
AJMP FPTST
|
AJMP FPTST
|
;
|
;
|
ALEN: CALL CCAL ;CALCULATE THE LEN OF THE SELECTED PROGRAM
|
ALEN: CALL CCAL ;CALCULATE THE LEN OF THE SELECTED PROGRAM
|
MOV R2,R7B0 ;SAVE THE HIGH BYTE
|
MOV R2,R7B0 ;SAVE THE HIGH BYTE
|
MOV A,R6 ;SAVE THE LOW BYTE
|
MOV A,R6 ;SAVE THE LOW BYTE
|
AJMP TWO_EX ;PUT IT ON THE STACK
|
AJMP TWO_EX ;PUT IT ON THE STACK
|
;
|
;
|
ATIME: MOV C,EA ;SAVE INTERRUTS
|
ATIME: MOV C,EA ;SAVE INTERRUTS
|
CLR EA
|
CLR EA
|
PUSH MILLIV ;SAVE MILLI VALUE
|
PUSH MILLIV ;SAVE MILLI VALUE
|
MOV R2,TVH ;GET THE TIMER
|
MOV R2,TVH ;GET THE TIMER
|
MOV A,TVL
|
MOV A,TVL
|
MOV EA,C ;SAVE INTERRUPTS
|
MOV EA,C ;SAVE INTERRUPTS
|
ACALL TWO_EX ;PUT TIMER ON THE STACK
|
ACALL TWO_EX ;PUT TIMER ON THE STACK
|
POP ACC ;GET MILLI
|
POP ACC ;GET MILLI
|
ACALL TWO_R2 ;PUT MILLI ON STACK
|
ACALL TWO_R2 ;PUT MILLI ON STACK
|
MOV A,#200
|
MOV A,#200
|
ACALL TWO_R2 ;DIVIDE MILLI BY 200
|
ACALL TWO_R2 ;DIVIDE MILLI BY 200
|
ACALL ADIV
|
ACALL ADIV
|
;
|
;
|
AADD: LCALL FP_BASE ;DO FP ADDITION
|
AADD: LCALL FP_BASE ;DO FP ADDITION
|
AJMP FPTST ;CHECK FOR ERRORS
|
AJMP FPTST ;CHECK FOR ERRORS
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; Here are some error messages that were moved
|
; Here are some error messages that were moved
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
;
|
;
|
E1X: DB 'BAD SYNTAX"'
|
E1X: DB 'BAD SYNTAX"'
|
E2X: DB 128+10
|
E2X: DB 128+10
|
DB 'DIVIDE BY ZERO"'
|
DB 'DIVIDE BY ZERO"'
|
;
|
;
|
E6X: DB 'ARRAY SIZE"'
|
E6X: DB 'ARRAY SIZE"'
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
T_BUF: ; TXA gets IBUF
|
T_BUF: ; TXA gets IBUF
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
MOV TXAH,#HIGH IBUF
|
MOV TXAH,#HIGH IBUF
|
MOV TXAL,#LOW IBUF
|
MOV TXAL,#LOW IBUF
|
RET
|
RET
|
;
|
;
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CXFER: ; Transfer a program from rom to ram
|
CXFER: ; Transfer a program from rom to ram
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CALL CCAL ;GET EVERYTHING SET UP
|
CALL CCAL ;GET EVERYTHING SET UP
|
MOV R2,#HIGH PSTART
|
MOV R2,#HIGH PSTART
|
MOV R0,#LOW PSTART
|
MOV R0,#LOW PSTART
|
ACALL LMOV ;DO THE TRANSFER
|
ACALL LMOV ;DO THE TRANSFER
|
CALL RCLEAR ;CLEAR THE MEMORY
|
CALL RCLEAR ;CLEAR THE MEMORY
|
;
|
;
|
; Fall thru to CRAM
|
; Fall thru to CRAM
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CRAM: ; The command action routine - RAM - Run out of ram
|
CRAM: ; The command action routine - RAM - Run out of ram
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
|
CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
|
MOV BOFAH,#HIGH PSTART
|
MOV BOFAH,#HIGH PSTART
|
MOV BOFAL,#LOW PSTART
|
MOV BOFAL,#LOW PSTART
|
;
|
;
|
; Fall thru to Command Processor
|
; Fall thru to Command Processor
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CMND1: ; The entry point for the command processor
|
CMND1: ; The entry point for the command processor
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LCALL SPRINT1 ;WASTE AT AND HEX
|
LCALL SPRINT1 ;WASTE AT AND HEX
|
CLR XBIT ;TO RESET IF NEEDED
|
CLR XBIT ;TO RESET IF NEEDED
|
CLR A
|
CLR A
|
MOV DPTR,#2002H ;CHECK FOR EXTERNAL TRAP PACKAGE
|
MOV DPTR,#2002H ;CHECK FOR EXTERNAL TRAP PACKAGE
|
MOVC A,@A+DPTR
|
MOVC A,@A+DPTR
|
CJNE A,#5AH,CMND11
|
CJNE A,#5AH,CMND11
|
LCALL 2048H ;IF PRESENT JUMP TO LOCATION 200BH
|
LCALL 2048H ;IF PRESENT JUMP TO LOCATION 200BH
|
CMND11: MOV DPTR,#RDYS ;PRINT THE READY MESSAGE
|
CMND11: MOV DPTR,#RDYS ;PRINT THE READY MESSAGE
|
CALL CRP ;DO A CR, THEN, PRINT FROM THE ROM
|
CALL CRP ;DO A CR, THEN, PRINT FROM THE ROM
|
;
|
;
|
CMNDR: SETB DIRF ;SET THE DIRECT INPUT BIT
|
CMNDR: SETB DIRF ;SET THE DIRECT INPUT BIT
|
MOV SP,SPSAV ;LOAD THE STACK
|
MOV SP,SPSAV ;LOAD THE STACK
|
ACALL CL7 ;DO A CRLF
|
ACALL CL7 ;DO A CRLF
|
;
|
;
|
CMNX: CLR GTRD ;CLEAR BREAK
|
CMNX: CLR GTRD ;CLEAR BREAK
|
MOV DPTR,#5EH ;DO RUN TRAP
|
MOV DPTR,#5EH ;DO RUN TRAP
|
MOVX A,@DPTR
|
MOVX A,@DPTR
|
XRL A,#52
|
XRL A,#52
|
JNZ CMNX1
|
JNZ CMNX1
|
LJMP CRUN
|
LJMP CRUN
|
CMNX1: MOV R5,#'>' ;OUTPUT A PROMPT
|
CMNX1: MOV R5,#'>' ;OUTPUT A PROMPT
|
LCALL TEROT
|
LCALL TEROT
|
CALL INLINE ;INPUT A LINE INTO IBUF
|
CALL INLINE ;INPUT A LINE INTO IBUF
|
CALL PP ;PRE-PROCESS THE LINE
|
CALL PP ;PRE-PROCESS THE LINE
|
JB F0,CMND3 ;NO LINE NUMBER
|
JB F0,CMND3 ;NO LINE NUMBER
|
CALL LINE ;PROCESS THE LINE
|
CALL LINE ;PROCESS THE LINE
|
LCALL LCLR
|
LCALL LCLR
|
JB LINEB,CMNX ;DON'T CLEAR MEMORY IF NO NEED
|
JB LINEB,CMNX ;DON'T CLEAR MEMORY IF NO NEED
|
SETB LINEB
|
SETB LINEB
|
LCALL RCLEAR ;CLEAR THE MEMORY
|
LCALL RCLEAR ;CLEAR THE MEMORY
|
SJMP CMNX ;LOOP BACK
|
SJMP CMNX ;LOOP BACK
|
;
|
;
|
CMND3: CALL T_BUF ;SET UP THE TEXT POINTER
|
CMND3: CALL T_BUF ;SET UP THE TEXT POINTER
|
CALL DELTST ;GET THE CHARACTER
|
CALL DELTST ;GET THE CHARACTER
|
JZ CMNDR ;IF CR, EXIT
|
JZ CMNDR ;IF CR, EXIT
|
MOV DPTR,#CMNDD ;POINT AT THE COMMAND LOOKUP
|
MOV DPTR,#CMNDD ;POINT AT THE COMMAND LOOKUP
|
CJNE A,#T_CMND,CMND31;PROCESS STATEMENT IF NOT A COMMAND
|
CJNE A,#T_CMND,CMND31;PROCESS STATEMENT IF NOT A COMMAND
|
CMND31: JC CMND5
|
CMND31: JC CMND5
|
CALL GCI1 ;BUMP TXA
|
CALL GCI1 ;BUMP TXA
|
ANL A,#0FH ;STRIP MSB'S FOR LOOKUP
|
ANL A,#0FH ;STRIP MSB'S FOR LOOKUP
|
LCALL ISTA1 ;PROCESS COMMAND
|
LCALL ISTA1 ;PROCESS COMMAND
|
SJMP CMNDR
|
SJMP CMNDR
|
;
|
;
|
CMND5: LJMP ILOOP ;CHECK FOR A POSSIBLE BREAK
|
CMND5: LJMP ILOOP ;CHECK FOR A POSSIBLE BREAK
|
;
|
;
|
;
|
;
|
;
|
;
|
;CONSTANTS
|
;CONSTANTS
|
;
|
;
|
XTALV: DB 128+8 ; DEFAULT CRYSTAL VALUE
|
XTALV: DB 128+8 ; DEFAULT CRYSTAL VALUE
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 92H
|
DB 92H
|
DB 05H
|
DB 05H
|
DB 11H
|
DB 11H
|
;
|
;
|
EXP11: DB 85H
|
EXP11: DB 85H
|
DB 00H
|
DB 00H
|
DB 42H
|
DB 42H
|
DB 41H
|
DB 41H
|
DB 87H
|
DB 87H
|
DB 59H
|
DB 59H
|
;
|
;
|
EXP1: DB 128+1 ; EXP(1)
|
EXP1: DB 128+1 ; EXP(1)
|
DB 00H
|
DB 00H
|
DB 18H
|
DB 18H
|
DB 28H
|
DB 28H
|
DB 18H
|
DB 18H
|
DB 27H
|
DB 27H
|
;
|
;
|
IPTIME: DB 128-4 ;FPROG TIMING
|
IPTIME: DB 128-4 ;FPROG TIMING
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 00H
|
DB 75H
|
DB 75H
|
DB 83H
|
DB 83H
|
;
|
;
|
PIE: DB 128+1 ;PI
|
PIE: DB 128+1 ;PI
|
DB 00H
|
DB 00H
|
DB 26H
|
DB 26H
|
DB 59H
|
DB 59H
|
DB 41H
|
DB 41H
|
DB 31H ; 3.1415926
|
DB 31H ; 3.1415926
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The error messages, some have been moved
|
; The error messages, some have been moved
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
E7X: DB 128+30
|
E7X: DB 128+30
|
DB 'ARITH. UNDERFLOW"'
|
DB 'ARITH. UNDERFLOW"'
|
;
|
;
|
E5X: DB 'MEMORY ALLOCATION"'
|
E5X: DB 'MEMORY ALLOCATION"'
|
;
|
;
|
E3X: DB 128+40
|
E3X: DB 128+40
|
DB 'BAD ARGUMENT"'
|
DB 'BAD ARGUMENT"'
|
;
|
;
|
EXI: DB 'I-STACK"'
|
EXI: DB 'I-STACK"'
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; The command action routine - CONTINUE
|
; The command action routine - CONTINUE
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CCONT: MOV DPTR,#E15X
|
CCONT: MOV DPTR,#E15X
|
JNB CONB,ERROR ;ERROR IF CONTINUE IS NOT SET
|
JNB CONB,ERROR ;ERROR IF CONTINUE IS NOT SET
|
;
|
;
|
CC1: ;used for input statement entry
|
CC1: ;used for input statement entry
|
;
|
;
|
MOV TXAH,INTXAH ;RESTORE TXA
|
MOV TXAH,INTXAH ;RESTORE TXA
|
MOV TXAL,INTXAL
|
MOV TXAL,INTXAL
|
JMP CILOOP ;EXECUTE
|
JMP CILOOP ;EXECUTE
|
;
|
;
|
DTEMP: MOV DPH,TEMP5 ;RESTORE DPTR
|
DTEMP: MOV DPH,TEMP5 ;RESTORE DPTR
|
MOV DPL,TEMP4
|
MOV DPL,TEMP4
|
RET
|
RET
|
;
|
;
|
TEMPD: MOV TEMP5,DPH
|
TEMPD: MOV TEMP5,DPH
|
MOV TEMP4,DPL
|
MOV TEMP4,DPL
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
I_DL: ; IDLE
|
I_DL: ; IDLE
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
JB DIRF,E1XX ;SYNTAX ERROR IN DIRECT INPUT
|
JB DIRF,E1XX ;SYNTAX ERROR IN DIRECT INPUT
|
CLR DACK ;ACK IDLE
|
CLR DACK ;ACK IDLE
|
;
|
;
|
U_ID1: ORL PCON,#01H
|
U_ID1: ORL PCON,#01H
|
; DB 01000011B ;ORL DIRECT OP CODE
|
; DB 01000011B ;ORL DIRECT OP CODE
|
; DB 87H ;PCON ADDRESS
|
; DB 87H ;PCON ADDRESS
|
; DB 01H ;SET IDLE BIT
|
; DB 01H ;SET IDLE BIT
|
JB INTPEN,I_RET ;EXIT IF EXTERNAL INTERRUPT
|
JB INTPEN,I_RET ;EXIT IF EXTERNAL INTERRUPT
|
JBC U_IDL,I_RET ;EXIT IF USER WANTS TO
|
JBC U_IDL,I_RET ;EXIT IF USER WANTS TO
|
JNB OTS,U_ID1 ;LOOP IF TIMER NOT ENABLED
|
JNB OTS,U_ID1 ;LOOP IF TIMER NOT ENABLED
|
LCALL T_CMP ;CHECK THE TIMER
|
LCALL T_CMP ;CHECK THE TIMER
|
JC U_ID1 ;LOOP IF TIME NOT BIG ENOUGH
|
JC U_ID1 ;LOOP IF TIME NOT BIG ENOUGH
|
;
|
;
|
I_RET: SETB DACK ;RESTORE EXECUTION
|
I_RET: SETB DACK ;RESTORE EXECUTION
|
RET ;EXIT IF IT IS
|
RET ;EXIT IF IT IS
|
;
|
;
|
;
|
;
|
;
|
;
|
ER0: INC DPTR ;BUMP TO TEXT
|
ER0: INC DPTR ;BUMP TO TEXT
|
JB DIRF,ERROR0 ;CAN'T GET OUT OF DIRECT MODE
|
JB DIRF,ERROR0 ;CAN'T GET OUT OF DIRECT MODE
|
JNB ON_ERR,ERROR0 ;IF ON ERROR ISN'T SET, GO BACK
|
JNB ON_ERR,ERROR0 ;IF ON ERROR ISN'T SET, GO BACK
|
MOV DPTR,#ERRLOC ;SAVE THE ERROR CODE
|
MOV DPTR,#ERRLOC ;SAVE THE ERROR CODE
|
CALL RC2 ;SAVE ERROR AND SET UP THE STACKS
|
CALL RC2 ;SAVE ERROR AND SET UP THE STACKS
|
INC DPTR ;POINT AT ERRNUM
|
INC DPTR ;POINT AT ERRNUM
|
JMP ERL4 ;LOAD ERR NUM AND EXIT
|
JMP ERL4 ;LOAD ERR NUM AND EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
; Syntax error
|
; Syntax error
|
;
|
;
|
E1XX: MOV C,DIRF ;SEE IF IN DIRECT MODE
|
E1XX: MOV C,DIRF ;SEE IF IN DIRECT MODE
|
E1XX1: MOV DPTR,#E1X ;ERROR MESSAGE
|
E1XX1: MOV DPTR,#E1X ;ERROR MESSAGE
|
SJMP ERROR1 ;TRAP ON SET DIRF
|
SJMP ERROR1 ;TRAP ON SET DIRF
|
;
|
;
|
E1XX2: MOV DPTR,#EXI ;STACK ERROR
|
E1XX2: MOV DPTR,#EXI ;STACK ERROR
|
;
|
;
|
; Falls through
|
; Falls through
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
;ERROR PROCESSOR - PRINT OUT THE ERROR TYPE, CHECK TO SEE IF IN
|
;ERROR PROCESSOR - PRINT OUT THE ERROR TYPE, CHECK TO SEE IF IN
|
; RUN OR COMMAND MODE, FIND AND PRINT OUT THE
|
; RUN OR COMMAND MODE, FIND AND PRINT OUT THE
|
; LINE NUMBER IF IN RUN MODE
|
; LINE NUMBER IF IN RUN MODE
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ERROR: CLR C ;RESET STACK
|
ERROR: CLR C ;RESET STACK
|
ERROR1: MOV SP,SPSAV ;RESET THE STACK
|
ERROR1: MOV SP,SPSAV ;RESET THE STACK
|
LCALL SPRINT1 ;CLEAR LINE AND AT MODE
|
LCALL SPRINT1 ;CLEAR LINE AND AT MODE
|
CLR A ;SET UP TO GET ERROR CODE
|
CLR A ;SET UP TO GET ERROR CODE
|
MOVC A,@A+DPTR
|
MOVC A,@A+DPTR
|
JBC ACC.7,ER0 ;PROCESS ERROR
|
JBC ACC.7,ER0 ;PROCESS ERROR
|
;
|
;
|
ERROR0: ACALL TEMPD ;SAVE THE DATA POINTER
|
ERROR0: ACALL TEMPD ;SAVE THE DATA POINTER
|
JC ERROR01 ;NO RESET IF CARRY IS SET
|
JC ERROR01 ;NO RESET IF CARRY IS SET
|
LCALL RC1 ;RESET THE STACKS
|
LCALL RC1 ;RESET THE STACKS
|
ERROR01:CALL CRLF2 ;DO TWO CARRIAGE RET - LINE FEED
|
ERROR01:CALL CRLF2 ;DO TWO CARRIAGE RET - LINE FEED
|
MOV DPTR,#ERS ;OUTPUT ERROR MESSAGE
|
MOV DPTR,#ERS ;OUTPUT ERROR MESSAGE
|
CALL ROM_P
|
CALL ROM_P
|
CALL DTEMP ;GET THE ERROR MESSAGE BACK
|
CALL DTEMP ;GET THE ERROR MESSAGE BACK
|
;
|
;
|
ERRS: CALL ROM_P ;PRINT ERROR TYPE
|
ERRS: CALL ROM_P ;PRINT ERROR TYPE
|
JNB DIRF,ER1 ;DO NOT PRINT IN LINE IF DIRF=1
|
JNB DIRF,ER1 ;DO NOT PRINT IN LINE IF DIRF=1
|
;
|
;
|
SERR1: CLR STOPBIT ;PRINT STOP THEN EXIT, FOR LIST
|
SERR1: CLR STOPBIT ;PRINT STOP THEN EXIT, FOR LIST
|
JMP CMND1
|
JMP CMND1
|
;
|
;
|
ER1: MOV DPTR,#INS ;OUTPUT IN LINE
|
ER1: MOV DPTR,#INS ;OUTPUT IN LINE
|
CALL ROM_P
|
CALL ROM_P
|
;
|
;
|
;NOW, FIND THE LINE NUMBER
|
;NOW, FIND THE LINE NUMBER
|
;
|
;
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
;
|
;
|
CALL DP_B ;GET THE FIRST ADDRESS OF THE PROGRAM
|
CALL DP_B ;GET THE FIRST ADDRESS OF THE PROGRAM
|
CLR A ;FOR INITIALIZATION
|
CLR A ;FOR INITIALIZATION
|
;
|
;
|
ER2: ACALL TEMPD ;SAVE THE DPTR
|
ER2: ACALL TEMPD ;SAVE THE DPTR
|
CALL ADDPTR ;ADD ACC TO DPTR
|
CALL ADDPTR ;ADD ACC TO DPTR
|
ACALL ER4 ;R3:R1 = TXA-DPTR
|
ACALL ER4 ;R3:R1 = TXA-DPTR
|
JC ER3 ;EXIT IF DPTR>TXA
|
JC ER3 ;EXIT IF DPTR>TXA
|
JZ ER3 ;EXIT IF DPTR=TXA
|
JZ ER3 ;EXIT IF DPTR=TXA
|
MOVX A,@DPTR ;GET LENGTH
|
MOVX A,@DPTR ;GET LENGTH
|
CJNE A,#EOF,ER2 ;SEE IF AT THE END
|
CJNE A,#EOF,ER2 ;SEE IF AT THE END
|
;
|
;
|
ER3: ACALL DTEMP ;PUT THE LINE IN THE DPTR
|
ER3: ACALL DTEMP ;PUT THE LINE IN THE DPTR
|
ACALL ER4 ;R3:R1 = TXA - BEGINNING OF LINE
|
ACALL ER4 ;R3:R1 = TXA - BEGINNING OF LINE
|
MOV A,R1 ;GET LENGTH
|
MOV A,R1 ;GET LENGTH
|
ADD A,#10 ;ADD 10 TO LENGTH, DPTR STILL HAS ADR
|
ADD A,#10 ;ADD 10 TO LENGTH, DPTR STILL HAS ADR
|
MOV MT1,A ;SAVE THE COUNT
|
MOV MT1,A ;SAVE THE COUNT
|
INC DPTR ;POINT AT LINE NUMBER HIGH BYTE
|
INC DPTR ;POINT AT LINE NUMBER HIGH BYTE
|
CALL PMTOP1 ;LOAD R2:R0, PUT IT ON THE STACK
|
CALL PMTOP1 ;LOAD R2:R0, PUT IT ON THE STACK
|
ACALL FP_BASE7 ;OUTPUT IT
|
ACALL FP_BASE7 ;OUTPUT IT
|
JB STOPBIT,SERR1 ;EXIT IF STOP BIT SET
|
JB STOPBIT,SERR1 ;EXIT IF STOP BIT SET
|
CALL CRLF2 ;DO SOME CRLF'S
|
CALL CRLF2 ;DO SOME CRLF'S
|
CALL DTEMP
|
CALL DTEMP
|
CALL UPPL ;UNPROCESS THE LINE
|
CALL UPPL ;UNPROCESS THE LINE
|
CALL CL6 ;PRINT IT
|
CALL CL6 ;PRINT IT
|
ER31: MOV R5,#'-' ;OUTPUT DASHES, THEN AN X
|
ER31: MOV R5,#'-' ;OUTPUT DASHES, THEN AN X
|
ACALL T_L ;PRINT AN X IF ERROR CHARACTER FOUND
|
ACALL T_L ;PRINT AN X IF ERROR CHARACTER FOUND
|
DJNZ MT1,ER31 ;LOOP UNTIL DONE
|
DJNZ MT1,ER31 ;LOOP UNTIL DONE
|
MOV R5,#'X'
|
MOV R5,#'X'
|
ACALL T_L
|
ACALL T_L
|
AJMP SERR1
|
AJMP SERR1
|
;
|
;
|
ER4: MOV R3,TXAH ;GET TEXT POINTER AND PERFORM SUBTRACTION
|
ER4: MOV R3,TXAH ;GET TEXT POINTER AND PERFORM SUBTRACTION
|
MOV R1,TXAL
|
MOV R1,TXAL
|
JMP DUBSUB
|
JMP DUBSUB
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; Interrupt driven timer
|
; Interrupt driven timer
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
I_DR: MOV TH0,SAVE_T ;LOAD THE TIMER
|
I_DR: MOV TH0,SAVE_T ;LOAD THE TIMER
|
XCH A,MILLIV ;SAVE A, GET MILLI COUNTER
|
XCH A,MILLIV ;SAVE A, GET MILLI COUNTER
|
INC A ;BUMP COUNTER
|
INC A ;BUMP COUNTER
|
CJNE A,#200,TR ;CHECK OUT TIMER VALUE
|
CJNE A,#200,TR ;CHECK OUT TIMER VALUE
|
CLR A ;FORCE ACC TO BE ZERO
|
CLR A ;FORCE ACC TO BE ZERO
|
INC TVL ;INCREMENT LOW TIMER
|
INC TVL ;INCREMENT LOW TIMER
|
CJNE A,TVL,TR ;CHECK LOW VALUE
|
CJNE A,TVL,TR ;CHECK LOW VALUE
|
INC TVH ;BUMP TIMER HIGH
|
INC TVH ;BUMP TIMER HIGH
|
;
|
;
|
TR: XCH A,MILLIV
|
TR: XCH A,MILLIV
|
POP PSW
|
POP PSW
|
RETI
|
RETI
|
;
|
;
|
$EJECT
|
$EJECT
|
;$INCLUDE(:F2:BAS52.CLK)
|
;$INCLUDE(:F2:BAS52.CLK)
|
;BEGINNING
|
;BEGINNING
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; The statement action routine - CLOCK
|
; The statement action routine - CLOCK
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
SCLOCK: ACALL OTST ;GET CHARACTER AFTER CLOCK TOKEN
|
SCLOCK: ACALL OTST ;GET CHARACTER AFTER CLOCK TOKEN
|
CLR ET0
|
CLR ET0
|
CLR C_BIT
|
CLR C_BIT
|
JNC SC_R ;EXIT IF A ZERO
|
JNC SC_R ;EXIT IF A ZERO
|
ANL TMOD,#0F0H ;SET UP THE MODE
|
ANL TMOD,#0F0H ;SET UP THE MODE
|
SETB C_BIT ;USER INTERRUPTS
|
SETB C_BIT ;USER INTERRUPTS
|
ORL IE,#82H ;ENABLE ET0 AND EA
|
ORL IE,#82H ;ENABLE ET0 AND EA
|
SETB TR0 ;TURN ON THE TIMER
|
SETB TR0 ;TURN ON THE TIMER
|
;
|
;
|
SC_R: RET
|
SC_R: RET
|
;
|
;
|
|
|
;END
|
;END
|
;$INCLUDE(:F2:BAS52.CLK)
|
;$INCLUDE(:F2:BAS52.CLK)
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SUI: ; Statement USER IN action routine
|
SUI: ; Statement USER IN action routine
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL OTST
|
ACALL OTST
|
MOV CIUB,C ;SET OR CLEAR CIUB
|
MOV CIUB,C ;SET OR CLEAR CIUB
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
SUO: ; Statement USER OUT action routine
|
SUO: ; Statement USER OUT action routine
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL OTST
|
ACALL OTST
|
MOV COUB,C
|
MOV COUB,C
|
RET
|
RET
|
;
|
;
|
OTST: ; Check for a one
|
OTST: ; Check for a one
|
;
|
;
|
LCALL GCI ;GET THE CHARACTER, CLEARS CARRY
|
LCALL GCI ;GET THE CHARACTER, CLEARS CARRY
|
SUBB A,#'1' ;SEE IF A ONE
|
SUBB A,#'1' ;SEE IF A ONE
|
CPL C ;SETS CARRY IF ONE, CLEARS IT IF ZERO
|
CPL C ;SETS CARRY IF ONE, CLEARS IT IF ZERO
|
OTST1: RET
|
OTST1: RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; IBLK - EXECUTE USER SUPPLIED TOKEN
|
; IBLK - EXECUTE USER SUPPLIED TOKEN
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
IBLK: JB PSW.4,OTST1 ;EXIT IF REGISTER BANK <> 0
|
IBLK: JB PSW.4,OTST1 ;EXIT IF REGISTER BANK <> 0
|
JB PSW.3,OTST1
|
JB PSW.3,OTST1
|
JBC ACC.7,IBLK1 ;SEE IF BIT SEVEN IS SET
|
JBC ACC.7,IBLK1 ;SEE IF BIT SEVEN IS SET
|
MOV DPTR,#USENT ;USER ENTRY LOCATION
|
MOV DPTR,#USENT ;USER ENTRY LOCATION
|
LJMP ISTA1
|
LJMP ISTA1
|
;
|
;
|
IBLK1: JB ACC.0,FP_BASE6 ;FLOATING POINT INPUT
|
IBLK1: JB ACC.0,FP_BASE6 ;FLOATING POINT INPUT
|
JZ T_L ;DO OUTPUT ON 80H
|
JZ T_L ;DO OUTPUT ON 80H
|
MOV DPTR,#FP_BASE-2
|
MOV DPTR,#FP_BASE-2
|
JMP @A+DPTR
|
JMP @A+DPTR
|
;
|
;
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; GET_NUM - GET A NUMBER, EITHER HEX OR FLOAT
|
; GET_NUM - GET A NUMBER, EITHER HEX OR FLOAT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
GET_NUM:ACALL FP_BASE5 ;SCAN FOR HEX
|
GET_NUM:ACALL FP_BASE5 ;SCAN FOR HEX
|
JNC FP_BASE6 ;DO FP INPUT
|
JNC FP_BASE6 ;DO FP INPUT
|
;
|
;
|
ACALL FP_BASE9 ;ASCII STRING TO R2:R0
|
ACALL FP_BASE9 ;ASCII STRING TO R2:R0
|
JNZ H_RET
|
JNZ H_RET
|
PUSH DPH ;SAVE THE DATA_POINTER
|
PUSH DPH ;SAVE THE DATA_POINTER
|
PUSH DPL
|
PUSH DPL
|
ACALL FP_BASE12 ;PUT R2:R0 ON THE STACK
|
ACALL FP_BASE12 ;PUT R2:R0 ON THE STACK
|
POP DPL ;RESTORE THE DATA_POINTER
|
POP DPL ;RESTORE THE DATA_POINTER
|
POP DPH
|
POP DPH
|
CLR A ;NO ERRORS
|
CLR A ;NO ERRORS
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
|
|
; START OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
; START OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
TIB1:MOV ACC,TL2
|
TIB1:MOV ACC,TL2
|
JB ACC.3,TIB1
|
JB ACC.3,TIB1
|
CALL DEC3211
|
CALL DEC3211
|
TIB2: MOV ACC,TL2
|
TIB2: MOV ACC,TL2
|
JNB ACC.3,TIB2
|
JNB ACC.3,TIB2
|
JNB RXD,TIB1 ;16x12 CLOCKS, LOOP UNTIL DONE
|
JNB RXD,TIB1 ;16x12 CLOCKS, LOOP UNTIL DONE
|
JB RXD,$ ;WAIT FOR STOP CHARACTER TO END
|
JB RXD,$ ;WAIT FOR STOP CHARACTER TO END
|
RET
|
RET
|
|
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; WB - THE EGO MESSAGE
|
; WB - THE EGO MESSAGE
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
WB:
|
WB:
|
; DB 'W'+80H,'R'+80H
|
; DB 'W'+80H,'R'+80H
|
; DB 'I'+80H,'T'+80H,'T','E'+80H,'N'+80H
|
; DB 'I'+80H,'T'+80H,'T','E'+80H,'N'+80H
|
; DB ' ','B'+80H,'Y'+80H,' '
|
; DB ' ','B'+80H,'Y'+80H,' '
|
; DB 'J'+80H,'O'+80H,'H'+80H,'N'+80H,' '+80H
|
; DB 'J'+80H,'O'+80H,'H'+80H,'N'+80H,' '+80H
|
; DB 'K','A'+80H,'T'+80H,'A'+80H,'U'+80H
|
; DB 'K','A'+80H,'T'+80H,'A'+80H,'U'+80H
|
; DB 'S','K'+80H,'Y'+80H
|
; DB 'S','K'+80H,'Y'+80H
|
|
|
; END OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
; END OF BAUD RATE MODIFICATIONS BY DANIEL WALLNER
|
|
|
DB ', I','N'+80H,'T'+80H,'E'+80H,'L'+80H
|
DB ', I','N'+80H,'T'+80H,'E'+80H,'L'+80H
|
DB ' '+80H,'C'+80H,'O'+80H,'R'+80H,'P'+80H
|
DB ' '+80H,'C'+80H,'O'+80H,'R'+80H,'P'+80H
|
DB '. 1','9'+80H,'85'
|
DB '. 1','9'+80H,'85'
|
H_RET: RET
|
H_RET: RET
|
;
|
;
|
$EJECT
|
$EJECT
|
ORG 1990H
|
ORG 1990H
|
;
|
;
|
OUTPUT:
|
OUTPUT:
|
T_L: LJMP TEROT
|
T_L: LJMP TEROT
|
;
|
;
|
ORG 1F78H
|
ORG 1F78H
|
;
|
;
|
CKS_I: JB CKS_B,CS_I
|
CKS_I: JB CKS_B,CS_I
|
LJMP 401BH
|
LJMP 401BH
|
;
|
;
|
CS_I: LJMP 2088H
|
CS_I: LJMP 2088H
|
;
|
;
|
E14X: DB 'NO DATA"'
|
E14X: DB 'NO DATA"'
|
;
|
;
|
E11X: DB 128+20
|
E11X: DB 128+20
|
DB 'ARITH. OVERFLOW"'
|
DB 'ARITH. OVERFLOW"'
|
;
|
;
|
E16X: DB 'PROGRAMMING"'
|
E16X: DB 'PROGRAMMING"'
|
;
|
;
|
E15X: DB 'CAN'
|
E15X: DB 'CAN'
|
DB 27H
|
DB 27H
|
DB 'T CONTINUE"'
|
DB 'T CONTINUE"'
|
;
|
;
|
E10X: DB 'INVALID LINE NUMBER"'
|
E10X: DB 'INVALID LINE NUMBER"'
|
;
|
;
|
NOROM: DB 'PROM MODE"'
|
NOROM: DB 'PROM MODE"'
|
;
|
;
|
S_N: DB '*MCS-51(tm) BASIC V1.1*"'
|
S_N: DB '*MCS-51(tm) BASIC V1.1*"'
|
;
|
;
|
ORG 1FF8H
|
ORG 1FF8H
|
;
|
;
|
ERS: DB 'ERROR: "'
|
ERS: DB 'ERROR: "'
|
;
|
;
|
$EJECT
|
$EJECT
|
|
|
|
|
;************************************************************
|
;************************************************************
|
;
|
;
|
; This is a complete BCD floating point package for the 8051 micro-
|
; This is a complete BCD floating point package for the 8051 micro-
|
; controller. It provides 8 digits of accuracy with exponents that
|
; controller. It provides 8 digits of accuracy with exponents that
|
; range from +127 to -127. The mantissa is in packed BCD, while the
|
; range from +127 to -127. The mantissa is in packed BCD, while the
|
; exponent is expressed in pseudo-twos complement. A ZERO exponent
|
; exponent is expressed in pseudo-twos complement. A ZERO exponent
|
; is used to express the number ZERO. An exponent value of 80H or
|
; is used to express the number ZERO. An exponent value of 80H or
|
; greater than means the exponent is positive, i.e. 80H = E 0,
|
; greater than means the exponent is positive, i.e. 80H = E 0,
|
; 81H = E+1, 82H = E+2 and so on. If the exponent is 7FH or less,
|
; 81H = E+1, 82H = E+2 and so on. If the exponent is 7FH or less,
|
; the exponent is negative, 7FH = E-1, 7EH = E-2, and so on.
|
; the exponent is negative, 7FH = E-1, 7EH = E-2, and so on.
|
; ALL NUMBERS ARE ASSUMED TO BE NORMALIZED and all results are
|
; ALL NUMBERS ARE ASSUMED TO BE NORMALIZED and all results are
|
; normalized after calculation. A normalized mantissa is >=.10 and
|
; normalized after calculation. A normalized mantissa is >=.10 and
|
; <=.99999999.
|
; <=.99999999.
|
;
|
;
|
; The numbers in memory assumed to be stored as follows:
|
; The numbers in memory assumed to be stored as follows:
|
;
|
;
|
; EXPONENT OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE
|
; EXPONENT OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE
|
; SIGN OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-1
|
; SIGN OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-1
|
; DIGIT 78 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-2
|
; DIGIT 78 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-2
|
; DIGIT 56 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-3
|
; DIGIT 56 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-3
|
; DIGIT 34 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-4
|
; DIGIT 34 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-4
|
; DIGIT 12 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-5
|
; DIGIT 12 OF ARGUMENT 2 = VALUE OF ARG_STACK+FP_NUMBER_SIZE-5
|
;
|
;
|
; EXPONENT OF ARGUMENT 1 = VALUE OF ARG_STACK
|
; EXPONENT OF ARGUMENT 1 = VALUE OF ARG_STACK
|
; SIGN OF ARGUMENT 1 = VALUE OF ARG_STACK-1
|
; SIGN OF ARGUMENT 1 = VALUE OF ARG_STACK-1
|
; DIGIT 78 OF ARGUMENT 1 = VALUE OF ARG_STACK-2
|
; DIGIT 78 OF ARGUMENT 1 = VALUE OF ARG_STACK-2
|
; DIGIT 56 OF ARGUMENT 1 = VALUE OF ARG_STACK-3
|
; DIGIT 56 OF ARGUMENT 1 = VALUE OF ARG_STACK-3
|
; DIGIT 34 OF ARGUMENT 1 = VALUE OF ARG_STACK-4
|
; DIGIT 34 OF ARGUMENT 1 = VALUE OF ARG_STACK-4
|
; DIGIT 12 OF ARGUMENT 1 = VALUE OF ARG_STACK-5
|
; DIGIT 12 OF ARGUMENT 1 = VALUE OF ARG_STACK-5
|
;
|
;
|
; The operations are performed thusly:
|
; The operations are performed thusly:
|
;
|
;
|
; ARG_STACK+FP_NUMBER_SIZE = ARG_STACK+FP_NUMBER_SIZE # ARG_STACK
|
; ARG_STACK+FP_NUMBER_SIZE = ARG_STACK+FP_NUMBER_SIZE # ARG_STACK
|
;
|
;
|
; Which is ARGUMENT 2 = ARGUMENT 2 # ARGUMENT 1
|
; Which is ARGUMENT 2 = ARGUMENT 2 # ARGUMENT 1
|
;
|
;
|
; Where # can be ADD, SUBTRACT, MULTIPLY OR DIVIDE.
|
; Where # can be ADD, SUBTRACT, MULTIPLY OR DIVIDE.
|
;
|
;
|
; Note that the stack gets popped after an operation.
|
; Note that the stack gets popped after an operation.
|
;
|
;
|
; The FP_COMP instruction POPS the ARG_STACK TWICE and returns status.
|
; The FP_COMP instruction POPS the ARG_STACK TWICE and returns status.
|
;
|
;
|
;**********************************************************************
|
;**********************************************************************
|
;
|
;
|
$EJECT
|
$EJECT
|
;**********************************************************************
|
;**********************************************************************
|
;
|
;
|
; STATUS ON RETURN - After performing an operation (+, -, *, /)
|
; STATUS ON RETURN - After performing an operation (+, -, *, /)
|
; the accumulator contains the following status
|
; the accumulator contains the following status
|
;
|
;
|
; ACCUMULATOR - BIT 0 - FLOATING POINT UNDERFLOW OCCURED
|
; ACCUMULATOR - BIT 0 - FLOATING POINT UNDERFLOW OCCURED
|
;
|
;
|
; - BIT 1 - FLOATING POINT OVERFLOW OCCURED
|
; - BIT 1 - FLOATING POINT OVERFLOW OCCURED
|
;
|
;
|
; - BIT 2 - RESULT WAS ZER0
|
; - BIT 2 - RESULT WAS ZER0
|
;
|
;
|
; - BIT 3 - DIVIDE BY ZERO ATTEMPTED
|
; - BIT 3 - DIVIDE BY ZERO ATTEMPTED
|
;
|
;
|
; - BIT 4 - NOT USED, 0 RETURNED
|
; - BIT 4 - NOT USED, 0 RETURNED
|
;
|
;
|
; - BIT 5 - NOT USED, 0 RETURNED
|
; - BIT 5 - NOT USED, 0 RETURNED
|
;
|
;
|
; - BIT 6 - NOT USED, 0 RETURNED
|
; - BIT 6 - NOT USED, 0 RETURNED
|
;
|
;
|
; - BIT 7 - NOT USED, 0 RETURNED
|
; - BIT 7 - NOT USED, 0 RETURNED
|
;
|
;
|
; NOTE: When underflow occures, a ZERO result is returned.
|
; NOTE: When underflow occures, a ZERO result is returned.
|
; When overflow or divide by zero occures, a result of
|
; When overflow or divide by zero occures, a result of
|
; .99999999 E+127 is returned and it is up to the user
|
; .99999999 E+127 is returned and it is up to the user
|
; to handle these conditions as needed in the program.
|
; to handle these conditions as needed in the program.
|
;
|
;
|
; NOTE: The Compare instruction returns F0 = 0 if ARG 1 = ARG 2
|
; NOTE: The Compare instruction returns F0 = 0 if ARG 1 = ARG 2
|
; and returns a CARRY FLAG = 1 if ARG 1 is > ARG 2
|
; and returns a CARRY FLAG = 1 if ARG 1 is > ARG 2
|
;
|
;
|
;***********************************************************************
|
;***********************************************************************
|
;
|
;
|
$EJECT
|
$EJECT
|
;***********************************************************************
|
;***********************************************************************
|
;
|
;
|
; The following values MUST be provided by the user
|
; The following values MUST be provided by the user
|
;
|
;
|
;***********************************************************************
|
;***********************************************************************
|
;
|
;
|
ARG_STACK EQU 9 ;ARGUMENT STACK POINTER
|
ARG_STACK EQU 9 ;ARGUMENT STACK POINTER
|
ARG_STACK_PAGE EQU 1
|
ARG_STACK_PAGE EQU 1
|
;OUTPUT EQU 1990H ;CALL LOCATION TO OUTPUT A CHARACTER
|
;OUTPUT EQU 1990H ;CALL LOCATION TO OUTPUT A CHARACTER
|
CONVERT EQU 58H ;LOCATION TO CONVERT NUMBERS
|
CONVERT EQU 58H ;LOCATION TO CONVERT NUMBERS
|
INTGRC BIT 25 ;BIT SET IF INTGER ERROR
|
INTGRC BIT 25 ;BIT SET IF INTGER ERROR
|
;
|
;
|
;***********************************************************************
|
;***********************************************************************
|
;
|
;
|
; The following equates are used internally
|
; The following equates are used internally
|
;
|
;
|
;***********************************************************************
|
;***********************************************************************
|
;
|
;
|
FP_NUMBER_SIZE EQU 6
|
FP_NUMBER_SIZE EQU 6
|
UNDERFLOW EQU 0
|
UNDERFLOW EQU 0
|
OVERFLOW EQU 1
|
OVERFLOW EQU 1
|
ZERO EQU 2
|
ZERO EQU 2
|
ZERO_DIVIDE EQU 3
|
ZERO_DIVIDE EQU 3
|
;
|
;
|
;***********************************************************************
|
;***********************************************************************
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; The following internal locations are used by the math pack
|
; The following internal locations are used by the math pack
|
; ordering is important and the FP_DIGITS must be bit
|
; ordering is important and the FP_DIGITS must be bit
|
; addressable
|
; addressable
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
FP_STATUS EQU 28H ;NOT USED
|
FP_STATUS EQU 28H ;NOT USED
|
FP_TEMP EQU FP_STATUS+1 ;NOT USED
|
FP_TEMP EQU FP_STATUS+1 ;NOT USED
|
FP_CARRY EQU FP_STATUS+2 ;USED FOR BITS
|
FP_CARRY EQU FP_STATUS+2 ;USED FOR BITS
|
ADD_IN BIT 35 ;DCMPXZ IN BASIC BACKAGE
|
ADD_IN BIT 35 ;DCMPXZ IN BASIC BACKAGE
|
XSIGN BIT FP_CARRY.0
|
XSIGN BIT FP_CARRY.0
|
FOUND_RADIX BIT FP_CARRY.1
|
FOUND_RADIX BIT FP_CARRY.1
|
FIRST_RADIX BIT FP_CARRY.2
|
FIRST_RADIX BIT FP_CARRY.2
|
DONE_LOAD BIT FP_CARRY.3
|
DONE_LOAD BIT FP_CARRY.3
|
FP_DIG12 EQU FP_CARRY+1
|
FP_DIG12 EQU FP_CARRY+1
|
FP_DIG34 EQU FP_CARRY+2
|
FP_DIG34 EQU FP_CARRY+2
|
FP_DIG56 EQU FP_CARRY+3
|
FP_DIG56 EQU FP_CARRY+3
|
FP_DIG78 EQU FP_CARRY+4
|
FP_DIG78 EQU FP_CARRY+4
|
FP_SIGN EQU FP_CARRY+5
|
FP_SIGN EQU FP_CARRY+5
|
MSIGN BIT FP_SIGN.0
|
MSIGN BIT FP_SIGN.0
|
FP_EXP EQU FP_CARRY+6
|
FP_EXP EQU FP_CARRY+6
|
FP_NIB1 EQU FP_DIG12
|
FP_NIB1 EQU FP_DIG12
|
FP_NIB2 EQU FP_NIB1+1
|
FP_NIB2 EQU FP_NIB1+1
|
FP_NIB3 EQU FP_NIB1+2
|
FP_NIB3 EQU FP_NIB1+2
|
FP_NIB4 EQU FP_NIB1+3
|
FP_NIB4 EQU FP_NIB1+3
|
FP_NIB5 EQU FP_NIB1+4
|
FP_NIB5 EQU FP_NIB1+4
|
FP_NIB6 EQU FP_NIB1+5
|
FP_NIB6 EQU FP_NIB1+5
|
FP_NIB7 EQU FP_NIB1+6
|
FP_NIB7 EQU FP_NIB1+6
|
FP_NIB8 EQU FP_NIB1+7
|
FP_NIB8 EQU FP_NIB1+7
|
FP_ACCX EQU FP_NIB1+8
|
FP_ACCX EQU FP_NIB1+8
|
FP_ACCC EQU FP_NIB1+9
|
FP_ACCC EQU FP_NIB1+9
|
FP_ACC1 EQU FP_NIB1+10
|
FP_ACC1 EQU FP_NIB1+10
|
FP_ACC2 EQU FP_NIB1+11
|
FP_ACC2 EQU FP_NIB1+11
|
FP_ACC3 EQU FP_NIB1+12
|
FP_ACC3 EQU FP_NIB1+12
|
FP_ACC4 EQU FP_NIB1+13
|
FP_ACC4 EQU FP_NIB1+13
|
FP_ACC5 EQU FP_NIB1+14
|
FP_ACC5 EQU FP_NIB1+14
|
FP_ACC6 EQU FP_NIB1+15
|
FP_ACC6 EQU FP_NIB1+15
|
FP_ACC7 EQU FP_NIB1+16
|
FP_ACC7 EQU FP_NIB1+16
|
FP_ACC8 EQU FP_NIB1+17
|
FP_ACC8 EQU FP_NIB1+17
|
FP_ACCS EQU FP_NIB1+18
|
FP_ACCS EQU FP_NIB1+18
|
;
|
;
|
$EJECT
|
$EJECT
|
ORG 1993H
|
ORG 1993H
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
; The floating point entry points and jump table
|
; The floating point entry points and jump table
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
FP_BASE: AJMP FLOATING_ADD
|
FP_BASE: AJMP FLOATING_ADD
|
FP_BASE1: AJMP FLOATING_SUB
|
FP_BASE1: AJMP FLOATING_SUB
|
FP_BASE2: AJMP FLOATING_COMP
|
FP_BASE2: AJMP FLOATING_COMP
|
FP_BASE3: AJMP FLOATING_MUL
|
FP_BASE3: AJMP FLOATING_MUL
|
FP_BASE4: AJMP FLOATING_DIV
|
FP_BASE4: AJMP FLOATING_DIV
|
FP_BASE5: AJMP HEXSCAN
|
FP_BASE5: AJMP HEXSCAN
|
FP_BASE6: AJMP FLOATING_POINT_INPUT
|
FP_BASE6: AJMP FLOATING_POINT_INPUT
|
FP_BASE7: AJMP FLOATING_POINT_OUTPUT
|
FP_BASE7: AJMP FLOATING_POINT_OUTPUT
|
FP_BASE8: AJMP CONVERT_BINARY_TO_ASCII_STRING
|
FP_BASE8: AJMP CONVERT_BINARY_TO_ASCII_STRING
|
FP_BASE9: AJMP CONVERT_ASCII_STRING_TO_BINARY
|
FP_BASE9: AJMP CONVERT_ASCII_STRING_TO_BINARY
|
FP_BASE10: AJMP MULNUM10
|
FP_BASE10: AJMP MULNUM10
|
FP_BASE11: AJMP HEXOUT
|
FP_BASE11: AJMP HEXOUT
|
FP_BASE12: AJMP PUSHR2R0
|
FP_BASE12: AJMP PUSHR2R0
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
FLOATING_SUB:
|
FLOATING_SUB:
|
;
|
;
|
MOV P2,#ARG_STACK_PAGE
|
MOV P2,#ARG_STACK_PAGE
|
MOV R0,ARG_STACK
|
MOV R0,ARG_STACK
|
DEC R0 ;POINT TO SIGN
|
DEC R0 ;POINT TO SIGN
|
MOVX A,@R0 ;READ SIGN
|
MOVX A,@R0 ;READ SIGN
|
CPL ACC.0
|
CPL ACC.0
|
MOVX @R0,A
|
MOVX @R0,A
|
;
|
;
|
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
;
|
;
|
FLOATING_ADD:
|
FLOATING_ADD:
|
;
|
;
|
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
;
|
;
|
;
|
;
|
ACALL MDES1 ;R7=TOS EXP, R6=TOS-1 EXP, R4=TOS SIGN
|
ACALL MDES1 ;R7=TOS EXP, R6=TOS-1 EXP, R4=TOS SIGN
|
;R3=TOS-1 SIGN, OPERATION IS R1 # R0
|
;R3=TOS-1 SIGN, OPERATION IS R1 # R0
|
;
|
;
|
MOV A,R7 ;GET TOS EXPONENT
|
MOV A,R7 ;GET TOS EXPONENT
|
JZ POP_AND_EXIT ;IF TOS=0 THEN POP AND EXIT
|
JZ POP_AND_EXIT ;IF TOS=0 THEN POP AND EXIT
|
CJNE R6,#0,LOAD1 ;CLEAR CARRY EXIT IF ZERO
|
CJNE R6,#0,LOAD1 ;CLEAR CARRY EXIT IF ZERO
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
SWAP_AND_EXIT: ; Swap external args and return
|
SWAP_AND_EXIT: ; Swap external args and return
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ACALL LOAD_POINTERS
|
ACALL LOAD_POINTERS
|
MOV R7,#FP_NUMBER_SIZE
|
MOV R7,#FP_NUMBER_SIZE
|
;
|
;
|
SE1: MOVX A,@R0 ;SWAP THE ARGUMENTS
|
SE1: MOVX A,@R0 ;SWAP THE ARGUMENTS
|
MOVX @R1,A
|
MOVX @R1,A
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
DJNZ R7,SE1
|
DJNZ R7,SE1
|
;
|
;
|
POP_AND_EXIT:
|
POP_AND_EXIT:
|
;
|
;
|
MOV A,ARG_STACK ;POP THE STACK
|
MOV A,ARG_STACK ;POP THE STACK
|
ADD A,#FP_NUMBER_SIZE
|
ADD A,#FP_NUMBER_SIZE
|
MOV ARG_STACK,A
|
MOV ARG_STACK,A
|
CLR A
|
CLR A
|
RET
|
RET
|
;
|
;
|
;
|
;
|
LOAD1: SUBB A,R6 ;A = ARG 1 EXP - ARG 2 EXP
|
LOAD1: SUBB A,R6 ;A = ARG 1 EXP - ARG 2 EXP
|
MOV FP_EXP,R7 ;SAVE EXPONENT AND SIGN
|
MOV FP_EXP,R7 ;SAVE EXPONENT AND SIGN
|
MOV FP_SIGN,R4
|
MOV FP_SIGN,R4
|
JNC LOAD2 ;ARG1 EXPONENT IS LARGER OR SAME
|
JNC LOAD2 ;ARG1 EXPONENT IS LARGER OR SAME
|
MOV FP_EXP,R6
|
MOV FP_EXP,R6
|
MOV FP_SIGN,R3
|
MOV FP_SIGN,R3
|
CPL A
|
CPL A
|
INC A ;COMPENSATE FOR EXP DELTA
|
INC A ;COMPENSATE FOR EXP DELTA
|
XCH A,R0 ;FORCE R0 TO POINT AT THE LARGEST
|
XCH A,R0 ;FORCE R0 TO POINT AT THE LARGEST
|
XCH A,R1 ;EXPONENT
|
XCH A,R1 ;EXPONENT
|
XCH A,R0
|
XCH A,R0
|
;
|
;
|
LOAD2: MOV R7,A ;SAVE THE EXPONENT DELTA IN R7
|
LOAD2: MOV R7,A ;SAVE THE EXPONENT DELTA IN R7
|
CLR ADD_IN
|
CLR ADD_IN
|
CJNE R5,#0,LOAD21
|
CJNE R5,#0,LOAD21
|
SETB ADD_IN
|
SETB ADD_IN
|
;
|
;
|
$EJECT
|
$EJECT
|
; Load the R1 mantissa
|
; Load the R1 mantissa
|
;
|
;
|
LOAD21: ACALL LOADR1_MANTISSA ;LOAD THE SMALLEST NUMBER
|
LOAD21: ACALL LOADR1_MANTISSA ;LOAD THE SMALLEST NUMBER
|
;
|
;
|
; Now align the number to the delta exponent
|
; Now align the number to the delta exponent
|
; R4 points to the string of the last digits lost
|
; R4 points to the string of the last digits lost
|
;
|
;
|
CJNE R7,#DIGIT+DIGIT+3,LOAD22
|
CJNE R7,#DIGIT+DIGIT+3,LOAD22
|
LOAD22: JC LOAD23
|
LOAD22: JC LOAD23
|
MOV R7,#DIGIT+DIGIT+2
|
MOV R7,#DIGIT+DIGIT+2
|
;
|
;
|
LOAD23: MOV FP_CARRY,#00 ;CLEAR THE CARRY
|
LOAD23: MOV FP_CARRY,#00 ;CLEAR THE CARRY
|
ACALL RIGHT ;SHIFT THE NUMBER
|
ACALL RIGHT ;SHIFT THE NUMBER
|
;
|
;
|
; Set up for addition and subtraction
|
; Set up for addition and subtraction
|
;
|
;
|
MOV R7,#DIGIT ;LOOP COUNT
|
MOV R7,#DIGIT ;LOOP COUNT
|
MOV R1,#FP_DIG78
|
MOV R1,#FP_DIG78
|
MOV A,#9EH
|
MOV A,#9EH
|
CLR C
|
CLR C
|
SUBB A,R4
|
SUBB A,R4
|
DA A
|
DA A
|
XCH A,R4
|
XCH A,R4
|
JNZ LOAD24
|
JNZ LOAD24
|
MOV R4,A
|
MOV R4,A
|
LOAD24: CJNE A,#50H,LOAD25 ;TEST FOR SUBTRACTION
|
LOAD24: CJNE A,#50H,LOAD25 ;TEST FOR SUBTRACTION
|
LOAD25: JNB ADD_IN,SUBLP ;DO SUBTRACTION IF NO ADD_IN
|
LOAD25: JNB ADD_IN,SUBLP ;DO SUBTRACTION IF NO ADD_IN
|
CPL C ;FLIP CARRY FOR ADDITION
|
CPL C ;FLIP CARRY FOR ADDITION
|
ACALL ADDLP ;DO ADDITION
|
ACALL ADDLP ;DO ADDITION
|
;
|
;
|
JNC ADD_R
|
JNC ADD_R
|
INC FP_CARRY
|
INC FP_CARRY
|
MOV R7,#1
|
MOV R7,#1
|
ACALL RIGHT
|
ACALL RIGHT
|
ACALL INC_FP_EXP ;SHIFT AND BUMP EXPONENT
|
ACALL INC_FP_EXP ;SHIFT AND BUMP EXPONENT
|
;
|
;
|
ADD_R: AJMP STORE_ALIGN_TEST_AND_EXIT
|
ADD_R: AJMP STORE_ALIGN_TEST_AND_EXIT
|
;
|
;
|
ADDLP: MOVX A,@R0
|
ADDLP: MOVX A,@R0
|
ADDC A,@R1
|
ADDC A,@R1
|
DA A
|
DA A
|
MOV @R1,A
|
MOV @R1,A
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
DJNZ R7,ADDLP ;LOOP UNTIL DONE
|
DJNZ R7,ADDLP ;LOOP UNTIL DONE
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
SUBLP: MOVX A,@R0 ;NOW DO SUBTRACTION
|
SUBLP: MOVX A,@R0 ;NOW DO SUBTRACTION
|
MOV R6,A
|
MOV R6,A
|
CLR A
|
CLR A
|
ADDC A,#99H
|
ADDC A,#99H
|
SUBB A,@R1
|
SUBB A,@R1
|
ADD A,R6
|
ADD A,R6
|
DA A
|
DA A
|
MOV @R1,A
|
MOV @R1,A
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
DJNZ R7,SUBLP
|
DJNZ R7,SUBLP
|
JC FSUB6
|
JC FSUB6
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
; Need to complement the result and sign because the floating
|
; Need to complement the result and sign because the floating
|
; point accumulator mantissa was larger than the external
|
; point accumulator mantissa was larger than the external
|
; memory and their signs were equal.
|
; memory and their signs were equal.
|
;
|
;
|
CPL FP_SIGN.0
|
CPL FP_SIGN.0
|
MOV R1,#FP_DIG78
|
MOV R1,#FP_DIG78
|
MOV R7,#DIGIT ;LOOP COUNT
|
MOV R7,#DIGIT ;LOOP COUNT
|
;
|
;
|
FSUB5: MOV A,#9AH
|
FSUB5: MOV A,#9AH
|
SUBB A,@R1
|
SUBB A,@R1
|
ADD A,#0
|
ADD A,#0
|
DA A
|
DA A
|
MOV @R1,A
|
MOV @R1,A
|
DEC R1
|
DEC R1
|
CPL C
|
CPL C
|
DJNZ R7,FSUB5 ;LOOP
|
DJNZ R7,FSUB5 ;LOOP
|
;
|
;
|
; Now see how many zeros their are
|
; Now see how many zeros their are
|
;
|
;
|
FSUB6: MOV R0,#FP_DIG12
|
FSUB6: MOV R0,#FP_DIG12
|
MOV R7,#0
|
MOV R7,#0
|
;
|
;
|
FSUB7: MOV A,@R0
|
FSUB7: MOV A,@R0
|
JNZ FSUB8
|
JNZ FSUB8
|
INC R7
|
INC R7
|
INC R7
|
INC R7
|
INC R0
|
INC R0
|
CJNE R0,#FP_SIGN,FSUB7
|
CJNE R0,#FP_SIGN,FSUB7
|
AJMP ZERO_AND_EXIT
|
AJMP ZERO_AND_EXIT
|
;
|
;
|
FSUB8: CJNE A,#10H,FSUB81
|
FSUB8: CJNE A,#10H,FSUB81
|
FSUB81: JNC FSUB9
|
FSUB81: JNC FSUB9
|
INC R7
|
INC R7
|
;
|
;
|
; Now R7 has the number of leading zeros in the FP ACC
|
; Now R7 has the number of leading zeros in the FP ACC
|
;
|
;
|
FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
|
FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
|
CLR C
|
CLR C
|
SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
|
SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
|
JZ FSUB10
|
JZ FSUB10
|
JC FSUB10
|
JC FSUB10
|
;
|
;
|
MOV FP_EXP,A ;SAVE THE NEW EXPONENT
|
MOV FP_EXP,A ;SAVE THE NEW EXPONENT
|
;
|
;
|
ACALL LEFT1 ;SHIFT THE FP ACC
|
ACALL LEFT1 ;SHIFT THE FP ACC
|
MOV FP_CARRY,#0
|
MOV FP_CARRY,#0
|
AJMP STORE_ALIGN_TEST_AND_EXIT
|
AJMP STORE_ALIGN_TEST_AND_EXIT
|
;
|
;
|
FSUB10: AJMP UNDERFLOW_AND_EXIT
|
FSUB10: AJMP UNDERFLOW_AND_EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
FLOATING_COMP: ; Compare two floating point numbers
|
FLOATING_COMP: ; Compare two floating point numbers
|
; used for relational operations and is faster
|
; used for relational operations and is faster
|
; than subtraction. ON RETURN, The carry is set
|
; than subtraction. ON RETURN, The carry is set
|
; if ARG1 is > ARG2, else carry is not set
|
; if ARG1 is > ARG2, else carry is not set
|
; if ARG1 = ARG2, F0 gets set
|
; if ARG1 = ARG2, F0 gets set
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL MDES1 ;SET UP THE REGISTERS
|
ACALL MDES1 ;SET UP THE REGISTERS
|
MOV A,ARG_STACK
|
MOV A,ARG_STACK
|
ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
|
ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
|
MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
|
MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
|
MOV A,R6 ;CHECK OUT EXPONENTS
|
MOV A,R6 ;CHECK OUT EXPONENTS
|
CLR F0
|
CLR F0
|
SUBB A,R7
|
SUBB A,R7
|
JZ EXPONENTS_EQUAL
|
JZ EXPONENTS_EQUAL
|
JC ARG1_EXP_IS_LARGER
|
JC ARG1_EXP_IS_LARGER
|
;
|
;
|
; Now the ARG2 EXPONENT is > ARG1 EXPONENT
|
; Now the ARG2 EXPONENT is > ARG1 EXPONENT
|
;
|
;
|
SIGNS_DIFFERENT:
|
SIGNS_DIFFERENT:
|
;
|
;
|
MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
|
MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
|
SJMP ARG1_EXP_IS_LARGER1
|
SJMP ARG1_EXP_IS_LARGER1
|
;
|
;
|
ARG1_EXP_IS_LARGER:
|
ARG1_EXP_IS_LARGER:
|
;
|
;
|
MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
|
MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
|
ARG1_EXP_IS_LARGER1:
|
ARG1_EXP_IS_LARGER1:
|
JZ ARG1_EXP_IS_LARGER2
|
JZ ARG1_EXP_IS_LARGER2
|
CPL C
|
CPL C
|
ARG1_EXP_IS_LARGER2:
|
ARG1_EXP_IS_LARGER2:
|
RET
|
RET
|
;
|
;
|
EXPONENTS_EQUAL:
|
EXPONENTS_EQUAL:
|
;
|
;
|
; First, test the sign, then the mantissa
|
; First, test the sign, then the mantissa
|
;
|
;
|
CJNE R5,#0,SIGNS_DIFFERENT
|
CJNE R5,#0,SIGNS_DIFFERENT
|
;
|
;
|
BOTH_PLUS:
|
BOTH_PLUS:
|
;
|
;
|
MOV R7,#DIGIT ;POINT AT MS DIGIT
|
MOV R7,#DIGIT ;POINT AT MS DIGIT
|
DEC R0
|
DEC R0
|
DEC R0
|
DEC R0
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
DEC R1
|
DEC R1
|
DEC R1
|
DEC R1
|
;
|
;
|
; Now do the compare
|
; Now do the compare
|
;
|
;
|
CLOOP: MOVX A,@R0
|
CLOOP: MOVX A,@R0
|
MOV R6,A
|
MOV R6,A
|
MOVX A,@R1
|
MOVX A,@R1
|
SUBB A,R6
|
SUBB A,R6
|
JNZ ARG1_EXP_IS_LARGER
|
JNZ ARG1_EXP_IS_LARGER
|
INC R0
|
INC R0
|
INC R1
|
INC R1
|
DJNZ R7,CLOOP
|
DJNZ R7,CLOOP
|
;
|
;
|
; If here, the numbers are the same, the carry is cleared
|
; If here, the numbers are the same, the carry is cleared
|
;
|
;
|
SETB F0
|
SETB F0
|
RET ;EXIT WITH EQUAL
|
RET ;EXIT WITH EQUAL
|
;
|
;
|
$EJECT
|
$EJECT
|
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
;
|
;
|
FLOATING_MUL: ; Floating point multiply
|
FLOATING_MUL: ; Floating point multiply
|
;
|
;
|
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
;
|
;
|
ACALL MUL_DIV_EXP_AND_SIGN
|
ACALL MUL_DIV_EXP_AND_SIGN
|
;
|
;
|
; check for zero exponents
|
; check for zero exponents
|
;
|
;
|
CJNE R6,#00,FMUL1 ;ARG 2 EXP ZERO?
|
CJNE R6,#00,FMUL1 ;ARG 2 EXP ZERO?
|
FMUL0: AJMP ZERO_AND_EXIT
|
FMUL0: AJMP ZERO_AND_EXIT
|
;
|
;
|
; calculate the exponent
|
; calculate the exponent
|
;
|
;
|
FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
|
FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
|
;
|
;
|
MOV A,R7
|
MOV A,R7
|
JZ FMUL0
|
JZ FMUL0
|
ADD A,R6 ;ADD THE EXPONENTS
|
ADD A,R6 ;ADD THE EXPONENTS
|
JB ACC.7,FMUL_OVER
|
JB ACC.7,FMUL_OVER
|
JBC CY,FMUL2 ;SEE IF CARRY IS SET
|
JBC CY,FMUL2 ;SEE IF CARRY IS SET
|
;
|
;
|
AJMP UNDERFLOW_AND_EXIT
|
AJMP UNDERFLOW_AND_EXIT
|
;
|
;
|
FMUL_OVER:
|
FMUL_OVER:
|
;
|
;
|
JNC FMUL2 ;OK IF SET
|
JNC FMUL2 ;OK IF SET
|
;
|
;
|
FOV: AJMP OVERFLOW_AND_EXIT
|
FOV: AJMP OVERFLOW_AND_EXIT
|
;
|
;
|
FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
|
FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
|
MOV R6,A ;SAVE IT FOR LATER
|
MOV R6,A ;SAVE IT FOR LATER
|
;
|
;
|
; Unpack and load R0
|
; Unpack and load R0
|
;
|
;
|
ACALL UNPACK_R0
|
ACALL UNPACK_R0
|
;
|
;
|
; Now set up for loop multiply
|
; Now set up for loop multiply
|
;
|
;
|
MOV R3,#DIGIT
|
MOV R3,#DIGIT
|
MOV R4,R1B0
|
MOV R4,R1B0
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
; Now, do the multiply and accumulate the product
|
; Now, do the multiply and accumulate the product
|
;
|
;
|
FMUL3: MOV R1B0,R4
|
FMUL3: MOV R1B0,R4
|
MOVX A,@R1
|
MOVX A,@R1
|
MOV R2,A
|
MOV R2,A
|
ACALL MUL_NIBBLE
|
ACALL MUL_NIBBLE
|
;
|
;
|
MOV A,R2
|
MOV A,R2
|
SWAP A
|
SWAP A
|
ACALL MUL_NIBBLE
|
ACALL MUL_NIBBLE
|
DEC R4
|
DEC R4
|
DJNZ R3,FMUL3
|
DJNZ R3,FMUL3
|
;
|
;
|
; Now, pack and restore the sign
|
; Now, pack and restore the sign
|
;
|
;
|
MOV FP_EXP,R6
|
MOV FP_EXP,R6
|
MOV FP_SIGN,R5
|
MOV FP_SIGN,R5
|
AJMP PACK ;FINISH IT OFF
|
AJMP PACK ;FINISH IT OFF
|
;
|
;
|
$EJECT
|
$EJECT
|
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
;
|
;
|
FLOATING_DIV:
|
FLOATING_DIV:
|
;
|
;
|
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
|
;
|
;
|
ACALL MDES1
|
ACALL MDES1
|
;
|
;
|
; Check the exponents
|
; Check the exponents
|
;
|
;
|
MOV FP_SIGN,R5 ;SAVE THE SIGN
|
MOV FP_SIGN,R5 ;SAVE THE SIGN
|
CJNE R7,#0,DIV0 ;CLEARS THE CARRY
|
CJNE R7,#0,DIV0 ;CLEARS THE CARRY
|
ACALL OVERFLOW_AND_EXIT
|
ACALL OVERFLOW_AND_EXIT
|
CLR A
|
CLR A
|
SETB ACC.ZERO_DIVIDE
|
SETB ACC.ZERO_DIVIDE
|
RET
|
RET
|
;
|
;
|
DIV0: MOV A,R6 ;GET EXPONENT
|
DIV0: MOV A,R6 ;GET EXPONENT
|
JZ FMUL0 ;EXIT IF ZERO
|
JZ FMUL0 ;EXIT IF ZERO
|
SUBB A,R7 ;DELTA EXPONENT
|
SUBB A,R7 ;DELTA EXPONENT
|
JB ACC.7,D_UNDER
|
JB ACC.7,D_UNDER
|
JNC DIV3
|
JNC DIV3
|
AJMP UNDERFLOW_AND_EXIT
|
AJMP UNDERFLOW_AND_EXIT
|
;
|
;
|
D_UNDER:JNC FOV
|
D_UNDER:JNC FOV
|
;
|
;
|
DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
|
DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
|
MOV FP_EXP,A ;SAVE THE EXPONENT
|
MOV FP_EXP,A ;SAVE THE EXPONENT
|
ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
|
ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
|
;
|
;
|
MOV R2,#FP_ACCC ;SAVE LOCATION
|
MOV R2,#FP_ACCC ;SAVE LOCATION
|
MOV R3,R0B0 ;SAVE POINTER IN R3
|
MOV R3,R0B0 ;SAVE POINTER IN R3
|
MOV FP_CARRY,#0 ;ZERO CARRY BYTE
|
MOV FP_CARRY,#0 ;ZERO CARRY BYTE
|
;
|
;
|
DIV4: MOV R5,#0FFH ;LOOP COUNT
|
DIV4: MOV R5,#0FFH ;LOOP COUNT
|
SETB C
|
SETB C
|
;
|
;
|
DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
|
DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
|
MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
|
MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
|
MOV R7,#DIGIT ;LOOP COUNT
|
MOV R7,#DIGIT ;LOOP COUNT
|
JNC DIV7 ;EXIT IF NO CARRY
|
JNC DIV7 ;EXIT IF NO CARRY
|
;
|
;
|
DIV6: MOVX A,@R0 ;DO ACCUMLATION
|
DIV6: MOVX A,@R0 ;DO ACCUMLATION
|
MOV R6,A
|
MOV R6,A
|
CLR A
|
CLR A
|
ADDC A,#99H
|
ADDC A,#99H
|
SUBB A,R6
|
SUBB A,R6
|
ADD A,@R1
|
ADD A,@R1
|
DA A
|
DA A
|
MOV @R1,A
|
MOV @R1,A
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
DJNZ R7,DIV6 ;LOOP
|
DJNZ R7,DIV6 ;LOOP
|
;
|
;
|
INC R5 ;SUBTRACT COUNTER
|
INC R5 ;SUBTRACT COUNTER
|
JC DIV5 ;KEEP LOOPING IF CARRY
|
JC DIV5 ;KEEP LOOPING IF CARRY
|
MOV A,@R1 ;GET CARRY
|
MOV A,@R1 ;GET CARRY
|
SUBB A,#1 ;CARRY IS CLEARED
|
SUBB A,#1 ;CARRY IS CLEARED
|
MOV @R1,A ;SAVE CARRY DIGIT
|
MOV @R1,A ;SAVE CARRY DIGIT
|
CPL C
|
CPL C
|
SJMP DIV5 ;LOOP
|
SJMP DIV5 ;LOOP
|
;
|
;
|
; Restore the result if carry was found
|
; Restore the result if carry was found
|
;
|
;
|
DIV7: ACALL ADDLP ;ADD NUMBER BACK
|
DIV7: ACALL ADDLP ;ADD NUMBER BACK
|
MOV @R1,#0 ;CLEAR CARRY
|
MOV @R1,#0 ;CLEAR CARRY
|
MOV R0B0,R2 ;GET SAVE COUNTER
|
MOV R0B0,R2 ;GET SAVE COUNTER
|
MOV @R0,5 ;SAVE COUNT BYTE
|
MOV @R0,5 ;SAVE COUNT BYTE
|
;
|
;
|
INC R2 ;ADJUST SAVE COUNTER
|
INC R2 ;ADJUST SAVE COUNTER
|
MOV R7,#1 ;BUMP DIVIDEND
|
MOV R7,#1 ;BUMP DIVIDEND
|
ACALL LEFT
|
ACALL LEFT
|
CJNE R2,#FP_ACC8+2,DIV4
|
CJNE R2,#FP_ACC8+2,DIV4
|
;
|
;
|
DJNZ FP_EXP,DIV8
|
DJNZ FP_EXP,DIV8
|
AJMP UNDERFLOW_AND_EXIT
|
AJMP UNDERFLOW_AND_EXIT
|
;
|
;
|
DIV8: MOV FP_CARRY,#0
|
DIV8: MOV FP_CARRY,#0
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PACK: ; Pack the mantissa
|
PACK: ; Pack the mantissa
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; First, set up the pointers
|
; First, set up the pointers
|
;
|
;
|
MOV R0,#FP_ACCC
|
MOV R0,#FP_ACCC
|
MOV A,@R0 ;GET FP_ACCC
|
MOV A,@R0 ;GET FP_ACCC
|
MOV R6,A ;SAVE FOR ZERO COUNT
|
MOV R6,A ;SAVE FOR ZERO COUNT
|
JZ PACK0 ;JUMP OVER IF ZERO
|
JZ PACK0 ;JUMP OVER IF ZERO
|
ACALL INC_FP_EXP ;BUMP THE EXPONENT
|
ACALL INC_FP_EXP ;BUMP THE EXPONENT
|
DEC R0
|
DEC R0
|
;
|
;
|
PACK0: INC R0 ;POINT AT FP_ACC1
|
PACK0: INC R0 ;POINT AT FP_ACC1
|
;
|
;
|
PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
|
PACK1: MOV A,#8 ;ADJUST NIBBLE POINTER
|
MOV R1,A
|
MOV R1,A
|
ADD A,R0
|
ADD A,R0
|
MOV R0,A
|
MOV R0,A
|
CJNE @R0,#5,PACK11 ;SEE IF ADJUSTING NEEDED
|
CJNE @R0,#5,PACK11 ;SEE IF ADJUSTING NEEDED
|
PACK11: JC PACK31
|
PACK11: JC PACK31
|
;
|
;
|
PACK2: SETB C
|
PACK2: SETB C
|
CLR A
|
CLR A
|
DEC R0
|
DEC R0
|
ADDC A,@R0
|
ADDC A,@R0
|
DA A
|
DA A
|
XCHD A,@R0 ;SAVE THE VALUE
|
XCHD A,@R0 ;SAVE THE VALUE
|
JNB ACC.4,PACK3
|
JNB ACC.4,PACK3
|
DJNZ R1,PACK2
|
DJNZ R1,PACK2
|
;
|
;
|
DEC R0
|
DEC R0
|
MOV @R0,#1
|
MOV @R0,#1
|
ACALL INC_FP_EXP
|
ACALL INC_FP_EXP
|
SJMP PACK4
|
SJMP PACK4
|
;
|
;
|
PACK3: DEC R1
|
PACK3: DEC R1
|
PACK31: MOV A,R1
|
PACK31: MOV A,R1
|
CLR C
|
CLR C
|
XCH A,R0
|
XCH A,R0
|
SUBB A,R0
|
SUBB A,R0
|
MOV R0,A
|
MOV R0,A
|
;
|
;
|
PACK4: MOV R1,#FP_DIG12
|
PACK4: MOV R1,#FP_DIG12
|
;
|
;
|
; Now, pack
|
; Now, pack
|
;
|
;
|
PLOOP: MOV A,@R0
|
PLOOP: MOV A,@R0
|
SWAP A ;FLIP THE DIGITS
|
SWAP A ;FLIP THE DIGITS
|
INC R0
|
INC R0
|
XCHD A,@R0
|
XCHD A,@R0
|
ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
|
ORL 6,A ;ACCUMULATE THE OR'ED DIGITS
|
MOV @R1,A
|
MOV @R1,A
|
INC R0
|
INC R0
|
INC R1
|
INC R1
|
CJNE R1,#FP_SIGN,PLOOP
|
CJNE R1,#FP_SIGN,PLOOP
|
MOV A,R6
|
MOV A,R6
|
JNZ STORE_ALIGN_TEST_AND_EXIT
|
JNZ STORE_ALIGN_TEST_AND_EXIT
|
MOV FP_EXP,#0 ;ZERO EXPONENT
|
MOV FP_EXP,#0 ;ZERO EXPONENT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
|
STORE_ALIGN_TEST_AND_EXIT: ;Save the number align carry and exit
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ACALL LOAD_POINTERS
|
ACALL LOAD_POINTERS
|
MOV ARG_STACK,R1 ;SET UP THE NEW STACK
|
MOV ARG_STACK,R1 ;SET UP THE NEW STACK
|
MOV R0,#FP_EXP
|
MOV R0,#FP_EXP
|
;
|
;
|
; Now load the numbers
|
; Now load the numbers
|
;
|
;
|
STORE2: MOV A,@R0
|
STORE2: MOV A,@R0
|
MOVX @R1,A ;SAVE THE NUMBER
|
MOVX @R1,A ;SAVE THE NUMBER
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
CJNE R0,#FP_CARRY,STORE2
|
CJNE R0,#FP_CARRY,STORE2
|
;
|
;
|
CLR A ;NO ERRORS
|
CLR A ;NO ERRORS
|
;
|
;
|
PRET: RET ;EXIT
|
PRET: RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
INC_FP_EXP:
|
INC_FP_EXP:
|
;
|
;
|
INC FP_EXP
|
INC FP_EXP
|
MOV A,FP_EXP
|
MOV A,FP_EXP
|
JNZ PRET ;EXIT IF NOT ZERO
|
JNZ PRET ;EXIT IF NOT ZERO
|
POP ACC ;WASTE THE CALLING STACK
|
POP ACC ;WASTE THE CALLING STACK
|
POP ACC
|
POP ACC
|
AJMP OVERFLOW_AND_EXIT
|
AJMP OVERFLOW_AND_EXIT
|
;
|
;
|
;***********************************************************************
|
;***********************************************************************
|
;
|
;
|
UNPACK_R0: ; Unpack BCD digits and load into nibble locations
|
UNPACK_R0: ; Unpack BCD digits and load into nibble locations
|
;
|
;
|
;***********************************************************************
|
;***********************************************************************
|
;
|
;
|
PUSH R1B0
|
PUSH R1B0
|
MOV R1,#FP_NIB8
|
MOV R1,#FP_NIB8
|
;
|
;
|
ULOOP: MOVX A,@R0
|
ULOOP: MOVX A,@R0
|
ANL A,#0FH
|
ANL A,#0FH
|
MOV @R1,A ;SAVE THE NIBBLE
|
MOV @R1,A ;SAVE THE NIBBLE
|
MOVX A,@R0
|
MOVX A,@R0
|
SWAP A
|
SWAP A
|
ANL A,#0FH
|
ANL A,#0FH
|
DEC R1
|
DEC R1
|
MOV @R1,A ;SAVE THE NIBBLE AGAIN
|
MOV @R1,A ;SAVE THE NIBBLE AGAIN
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
CJNE R1,#FP_NIB1-1,ULOOP
|
CJNE R1,#FP_NIB1-1,ULOOP
|
;
|
;
|
POP R1B0
|
POP R1B0
|
;
|
;
|
LOAD7: RET
|
LOAD7: RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
|
OVERFLOW_AND_EXIT: ;LOAD 99999999 E+127, SET OV BIT, AND EXIT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
MOV R0,#FP_DIG78
|
MOV R0,#FP_DIG78
|
MOV A,#99H
|
MOV A,#99H
|
;
|
;
|
OVE1: MOV @R0,A
|
OVE1: MOV @R0,A
|
DEC R0
|
DEC R0
|
CJNE R0,#FP_CARRY,OVE1
|
CJNE R0,#FP_CARRY,OVE1
|
;
|
;
|
MOV FP_EXP,#0FFH
|
MOV FP_EXP,#0FFH
|
ACALL STORE_ALIGN_TEST_AND_EXIT
|
ACALL STORE_ALIGN_TEST_AND_EXIT
|
;
|
;
|
SETB ACC.OVERFLOW
|
SETB ACC.OVERFLOW
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
|
UNDERFLOW_AND_EXIT: ;LOAD 0, SET UF BIT, AND EXIT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ACALL ZERO_AND_EXIT
|
ACALL ZERO_AND_EXIT
|
CLR A
|
CLR A
|
SETB ACC.UNDERFLOW
|
SETB ACC.UNDERFLOW
|
RET
|
RET
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
|
ZERO_AND_EXIT: ;LOAD 0, SET ZERO BIT, AND EXIT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
ACALL FP_CLEAR
|
ACALL FP_CLEAR
|
ACALL STORE_ALIGN_TEST_AND_EXIT
|
ACALL STORE_ALIGN_TEST_AND_EXIT
|
SETB ACC.ZERO
|
SETB ACC.ZERO
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
FP_CLEAR:
|
FP_CLEAR:
|
;
|
;
|
; Clear internal storage
|
; Clear internal storage
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
CLR A
|
CLR A
|
MOV R0,#FP_ACC8+1
|
MOV R0,#FP_ACC8+1
|
;
|
;
|
FPC1: MOV @R0,A
|
FPC1: MOV @R0,A
|
DEC R0
|
DEC R0
|
CJNE R0,#FP_TEMP,FPC1
|
CJNE R0,#FP_TEMP,FPC1
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
|
RIGHT: ; Shift ACCUMULATOR RIGHT the number of nibbles in R7
|
; Save the shifted values in R4 if SAVE_ROUND is set
|
; Save the shifted values in R4 if SAVE_ROUND is set
|
;
|
;
|
;**************************************************************
|
;**************************************************************
|
;
|
;
|
MOV R4,#0 ;IN CASE OF NO SHIFT
|
MOV R4,#0 ;IN CASE OF NO SHIFT
|
;
|
;
|
RIGHT1: CLR C
|
RIGHT1: CLR C
|
RIGHT2: MOV A,R7 ;GET THE DIGITS TO SHIFT
|
RIGHT2: MOV A,R7 ;GET THE DIGITS TO SHIFT
|
JZ RIGHTL1 ;EXIT IF ZERO
|
JZ RIGHTL1 ;EXIT IF ZERO
|
SUBB A,#2 ;TWO TO DO?
|
SUBB A,#2 ;TWO TO DO?
|
JNC RIGHT5 ;SHIFT TWO NIBBLES
|
JNC RIGHT5 ;SHIFT TWO NIBBLES
|
;
|
;
|
; Swap one nibble then exit
|
; Swap one nibble then exit
|
;
|
;
|
RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
|
RIGHT3: PUSH R0B0 ;SAVE POINTER REGISTER
|
PUSH R1B0
|
PUSH R1B0
|
;
|
;
|
MOV R1,#FP_DIG78 ;LOAD THE POINTERS
|
MOV R1,#FP_DIG78 ;LOAD THE POINTERS
|
MOV R0,#FP_DIG56
|
MOV R0,#FP_DIG56
|
MOV A,R4 ;GET THE OVERFLOW REGISTER
|
MOV A,R4 ;GET THE OVERFLOW REGISTER
|
XCHD A,@R1 ;GET DIGIT 8
|
XCHD A,@R1 ;GET DIGIT 8
|
SWAP A ;FLIP FOR LOAD
|
SWAP A ;FLIP FOR LOAD
|
MOV R4,A
|
MOV R4,A
|
;
|
;
|
RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
|
RIGHTL: MOV A,@R1 ;GET THE LOW ORDER BYTE
|
XCHD A,@R0 ;SWAP NIBBLES
|
XCHD A,@R0 ;SWAP NIBBLES
|
SWAP A ;FLIP FOR STORE
|
SWAP A ;FLIP FOR STORE
|
MOV @R1,A ;SAVE THE DIGITS
|
MOV @R1,A ;SAVE THE DIGITS
|
DEC R0 ;BUMP THE POINTERS
|
DEC R0 ;BUMP THE POINTERS
|
DEC R1
|
DEC R1
|
CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
|
CJNE R1,#FP_DIG12-1,RIGHTL ;LOOP
|
;
|
;
|
MOV A,@R1 ;ACC = CH8
|
MOV A,@R1 ;ACC = CH8
|
SWAP A ;ACC = 8CH
|
SWAP A ;ACC = 8CH
|
ANL A,#0FH ;ACC = 0CH
|
ANL A,#0FH ;ACC = 0CH
|
MOV @R1,A ;CARRY DONE
|
MOV @R1,A ;CARRY DONE
|
POP R1B0 ;EXIT
|
POP R1B0 ;EXIT
|
POP R0B0 ;RESTORE REGISTER
|
POP R0B0 ;RESTORE REGISTER
|
RIGHTL1:RET
|
RIGHTL1:RET
|
;
|
;
|
RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
|
RIGHT5: MOV R7,A ;SAVE THE NEW SHIFT NUMBER
|
CLR A
|
CLR A
|
XCH A,FP_CARRY ;SWAP THE NIBBLES
|
XCH A,FP_CARRY ;SWAP THE NIBBLES
|
XCH A,FP_DIG12
|
XCH A,FP_DIG12
|
XCH A,FP_DIG34
|
XCH A,FP_DIG34
|
XCH A,FP_DIG56
|
XCH A,FP_DIG56
|
XCH A,FP_DIG78
|
XCH A,FP_DIG78
|
MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
|
MOV R4,A ;SAVE THE LAST DIGIT SHIFTED
|
SJMP RIGHT2
|
SJMP RIGHT2
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
|
LEFT: ; Shift ACCUMULATOR LEFT the number of nibbles in R7
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
MOV R4,#00H ;CLEAR FOR SOME ENTRYS
|
MOV R4,#00H ;CLEAR FOR SOME ENTRYS
|
;
|
;
|
LEFT1: CLR C
|
LEFT1: CLR C
|
LEFT2: MOV A,R7 ;GET SHIFT VALUE
|
LEFT2: MOV A,R7 ;GET SHIFT VALUE
|
JZ LEFTL1 ;EXIT IF ZERO
|
JZ LEFTL1 ;EXIT IF ZERO
|
SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
|
SUBB A,#2 ;SEE HOW MANY BYTES TO SHIFT
|
JNC LEFT5
|
JNC LEFT5
|
;
|
;
|
LEFT3: PUSH R0B0 ;SAVE POINTER
|
LEFT3: PUSH R0B0 ;SAVE POINTER
|
PUSH R1B0
|
PUSH R1B0
|
MOV R0,#FP_CARRY
|
MOV R0,#FP_CARRY
|
MOV R1,#FP_DIG12
|
MOV R1,#FP_DIG12
|
;
|
;
|
MOV A,@R0 ;ACC=CHCL
|
MOV A,@R0 ;ACC=CHCL
|
SWAP A ;ACC = CLCH
|
SWAP A ;ACC = CLCH
|
MOV @R0,A ;ACC = CLCH, @R0 = CLCH
|
MOV @R0,A ;ACC = CLCH, @R0 = CLCH
|
;
|
;
|
LEFTL: MOV A,@R1 ;DIG 12
|
LEFTL: MOV A,@R1 ;DIG 12
|
SWAP A ;DIG 21
|
SWAP A ;DIG 21
|
XCHD A,@R0
|
XCHD A,@R0
|
MOV @R1,A ;SAVE IT
|
MOV @R1,A ;SAVE IT
|
INC R0 ;BUMP POINTERS
|
INC R0 ;BUMP POINTERS
|
INC R1
|
INC R1
|
CJNE R0,#FP_DIG78,LEFTL
|
CJNE R0,#FP_DIG78,LEFTL
|
;
|
;
|
MOV A,R4
|
MOV A,R4
|
SWAP A
|
SWAP A
|
XCHD A,@R0
|
XCHD A,@R0
|
ANL A,#0F0H
|
ANL A,#0F0H
|
MOV R4,A
|
MOV R4,A
|
;
|
;
|
POP R1B0
|
POP R1B0
|
POP R0B0 ;RESTORE
|
POP R0B0 ;RESTORE
|
LEFTL1: RET ;DONE
|
LEFTL1: RET ;DONE
|
;
|
;
|
LEFT5: MOV R7,A ;RESTORE COUNT
|
LEFT5: MOV R7,A ;RESTORE COUNT
|
CLR A
|
CLR A
|
XCH A,R4 ;GET THE RESTORATION BYTE
|
XCH A,R4 ;GET THE RESTORATION BYTE
|
XCH A,FP_DIG78 ;DO THE SWAP
|
XCH A,FP_DIG78 ;DO THE SWAP
|
XCH A,FP_DIG56
|
XCH A,FP_DIG56
|
XCH A,FP_DIG34
|
XCH A,FP_DIG34
|
XCH A,FP_DIG12
|
XCH A,FP_DIG12
|
XCH A,FP_CARRY
|
XCH A,FP_CARRY
|
SJMP LEFT2
|
SJMP LEFT2
|
;
|
;
|
$EJECT
|
$EJECT
|
MUL_NIBBLE:
|
MUL_NIBBLE:
|
;
|
;
|
; Multiply the nibble in R7 by the FP_NIB locations
|
; Multiply the nibble in R7 by the FP_NIB locations
|
; accumulate the product in FP_ACC
|
; accumulate the product in FP_ACC
|
;
|
;
|
; Set up the pointers for multiplication
|
; Set up the pointers for multiplication
|
;
|
;
|
ANL A,#0FH ;STRIP OFF MS NIBBLE
|
ANL A,#0FH ;STRIP OFF MS NIBBLE
|
MOV R7,A
|
MOV R7,A
|
MOV R0,#FP_ACC8
|
MOV R0,#FP_ACC8
|
MOV R1,#FP_NIB8
|
MOV R1,#FP_NIB8
|
CLR A
|
CLR A
|
MOV FP_ACCX,A
|
MOV FP_ACCX,A
|
;
|
;
|
MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
|
MNLOOP: DEC R0 ;BUMP POINTER TO PROPAGATE CARRY
|
ADD A,@R0 ;ATTEMPT TO FORCE CARRY
|
ADD A,@R0 ;ATTEMPT TO FORCE CARRY
|
DA A ;BCD ADJUST
|
DA A ;BCD ADJUST
|
JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
|
JNB ACC.4,MNL0 ;DON'T ADJUST IF NO NEED
|
DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
|
DEC R0 ;PROPAGATE CARRY TO THE NEXT DIGIT
|
INC @R0 ;DO THE ADJUSTING
|
INC @R0 ;DO THE ADJUSTING
|
INC R0 ;RESTORE R0
|
INC R0 ;RESTORE R0
|
;
|
;
|
MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
|
MNL0: XCHD A,@R0 ;RESTORE INITIAL NUMBER
|
MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
|
MOV B,R7 ;GET THE NUBBLE TO MULTIPLY
|
MOV A,@R1 ;GET THE OTHER NIBBLE
|
MOV A,@R1 ;GET THE OTHER NIBBLE
|
MUL AB ;DO THE MULTIPLY
|
MUL AB ;DO THE MULTIPLY
|
MOV B,#10 ;NOW BCD ADJUST
|
MOV B,#10 ;NOW BCD ADJUST
|
DIV AB
|
DIV AB
|
XCH A,B ;GET THE REMAINDER
|
XCH A,B ;GET THE REMAINDER
|
ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
|
ADD A,@R0 ;PROPAGATE THE PARTIAL PRODUCTS
|
DA A ;BCD ADJUST
|
DA A ;BCD ADJUST
|
JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
|
JNB ACC.4,MNL1 ;PROPAGATE PARTIAL PRODUCT CARRY
|
INC B
|
INC B
|
;
|
;
|
MNL1: INC R0
|
MNL1: INC R0
|
XCHD A,@R0 ;SAVE THE NEW PRODUCT
|
XCHD A,@R0 ;SAVE THE NEW PRODUCT
|
DEC R0
|
DEC R0
|
MOV A,B ;GET BACK THE QUOTIENT
|
MOV A,B ;GET BACK THE QUOTIENT
|
DEC R1
|
DEC R1
|
CJNE R1,#FP_NIB1-1,MNLOOP
|
CJNE R1,#FP_NIB1-1,MNLOOP
|
;
|
;
|
ADD A,FP_ACCX ;GET THE OVERFLOW
|
ADD A,FP_ACCX ;GET THE OVERFLOW
|
DA A ;ADJUST
|
DA A ;ADJUST
|
MOV @R0,A ;SAVE IT
|
MOV @R0,A ;SAVE IT
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
|
LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
MOV P2,#ARG_STACK_PAGE
|
MOV P2,#ARG_STACK_PAGE
|
MOV R0,ARG_STACK
|
MOV R0,ARG_STACK
|
MOV A,#FP_NUMBER_SIZE
|
MOV A,#FP_NUMBER_SIZE
|
ADD A,R0
|
ADD A,R0
|
MOV R1,A
|
MOV R1,A
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
MUL_DIV_EXP_AND_SIGN:
|
MUL_DIV_EXP_AND_SIGN:
|
;
|
;
|
; Load the sign into R7, R6. R5 gets the sign for
|
; Load the sign into R7, R6. R5 gets the sign for
|
; multiply and divide.
|
; multiply and divide.
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
|
ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
|
;
|
;
|
MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
|
MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
|
MOVX A,@R0 ;ARG 1 EXP
|
MOVX A,@R0 ;ARG 1 EXP
|
MOV R7,A ;SAVED IN R7
|
MOV R7,A ;SAVED IN R7
|
MOVX A,@R1 ;ARG 2 EXP
|
MOVX A,@R1 ;ARG 2 EXP
|
MOV R6,A ;SAVED IN R6
|
MOV R6,A ;SAVED IN R6
|
DEC R0 ;BUMP POINTERS TO SIGN
|
DEC R0 ;BUMP POINTERS TO SIGN
|
DEC R1
|
DEC R1
|
MOVX A,@R0 ;GET THE SIGN
|
MOVX A,@R0 ;GET THE SIGN
|
MOV R4,A ;SIGN OF ARG1
|
MOV R4,A ;SIGN OF ARG1
|
MOVX A,@R1 ;GET SIGN OF NEXT ARG
|
MOVX A,@R1 ;GET SIGN OF NEXT ARG
|
MOV R3,A ;SIGN OF ARG2
|
MOV R3,A ;SIGN OF ARG2
|
XRL A,R4 ;ACC GETS THE NEW SIGN
|
XRL A,R4 ;ACC GETS THE NEW SIGN
|
MOV R5,A ;R5 GETS THE NEW SIGN
|
MOV R5,A ;R5 GETS THE NEW SIGN
|
;
|
;
|
; Bump the pointers to point at the LS digit
|
; Bump the pointers to point at the LS digit
|
;
|
;
|
DEC R0
|
DEC R0
|
DEC R1
|
DEC R1
|
;
|
;
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
LOADR1_MANTISSA:
|
LOADR1_MANTISSA:
|
;
|
;
|
; Load the mantissa of R0 into FP_Digits
|
; Load the mantissa of R0 into FP_Digits
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PUSH R0B0 ;SAVE REGISTER 1
|
PUSH R0B0 ;SAVE REGISTER 1
|
MOV R0,#FP_DIG78 ;SET UP THE POINTER
|
MOV R0,#FP_DIG78 ;SET UP THE POINTER
|
;
|
;
|
LOADR1: MOVX A,@R1
|
LOADR1: MOVX A,@R1
|
MOV @R0,A
|
MOV @R0,A
|
DEC R1
|
DEC R1
|
DEC R0
|
DEC R0
|
CJNE R0,#FP_CARRY,LOADR1
|
CJNE R0,#FP_CARRY,LOADR1
|
;
|
;
|
POP R0B0
|
POP R0B0
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
HEXSCAN: ; Scan a string to determine if it is a hex number
|
HEXSCAN: ; Scan a string to determine if it is a hex number
|
; set carry if hex, else carry = 0
|
; set carry if hex, else carry = 0
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL GET_DPTR_CHARACTER
|
ACALL GET_DPTR_CHARACTER
|
PUSH DPH
|
PUSH DPH
|
PUSH DPL ;SAVE THE POINTER
|
PUSH DPL ;SAVE THE POINTER
|
;
|
;
|
HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
|
HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
|
ACALL DIGIT_CHECK ;SEE IF A DIGIT
|
ACALL DIGIT_CHECK ;SEE IF A DIGIT
|
JC HS1 ;CONTINUE IF A DIGIT
|
JC HS1 ;CONTINUE IF A DIGIT
|
ACALL HEX_CHECK ;SEE IF HEX
|
ACALL HEX_CHECK ;SEE IF HEX
|
JC HS1
|
JC HS1
|
;
|
;
|
CLR ACC.5 ;NO LOWER CASE
|
CLR ACC.5 ;NO LOWER CASE
|
CJNE A,#'H',HEXDON
|
CJNE A,#'H',HEXDON
|
SETB C
|
SETB C
|
SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
|
SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
|
;
|
;
|
HEXDON: CLR C
|
HEXDON: CLR C
|
;
|
;
|
HEXDO1: POP DPL ;RESTORE POINTER
|
HEXDO1: POP DPL ;RESTORE POINTER
|
POP DPH
|
POP DPH
|
RET
|
RET
|
;
|
;
|
HS1: INC DPTR ;BUMP TO NEXT CHARACTER
|
HS1: INC DPTR ;BUMP TO NEXT CHARACTER
|
SJMP HEXSC1 ;LOOP
|
SJMP HEXSC1 ;LOOP
|
;
|
;
|
HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
|
HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
|
;
|
;
|
CLR ACC.5 ;WASTE LOWER CASE
|
CLR ACC.5 ;WASTE LOWER CASE
|
CJNE A,#'F'+1,HEX_CHECK1 ;SEE IF F OR LESS
|
CJNE A,#'F'+1,HEX_CHECK1 ;SEE IF F OR LESS
|
HEX_CHECK1:
|
HEX_CHECK1:
|
JC HC1
|
JC HC1
|
RET
|
RET
|
;
|
;
|
HC1: CJNE A,#'A',HC11 ;SEE IF A OR GREATER
|
HC1: CJNE A,#'A',HC11 ;SEE IF A OR GREATER
|
HC11: CPL C
|
HC11: CPL C
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
PUSHR2R0:
|
PUSHR2R0:
|
;
|
;
|
MOV R3,#HIGH CONVERT;CONVERSION LOCATION
|
MOV R3,#HIGH CONVERT;CONVERSION LOCATION
|
MOV R1,#LOW CONVERT
|
MOV R1,#LOW CONVERT
|
ACALL CONVERT_BINARY_TO_ASCII_STRING
|
ACALL CONVERT_BINARY_TO_ASCII_STRING
|
MOV A,#0DH ;A CR TO TERMINATE
|
MOV A,#0DH ;A CR TO TERMINATE
|
MOVX @R1,A ;SAVE THE CR
|
MOVX @R1,A ;SAVE THE CR
|
MOV DPTR,#CONVERT
|
MOV DPTR,#CONVERT
|
;
|
;
|
; Falls thru to FLOATING INPUT
|
; Falls thru to FLOATING INPUT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
|
FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
|
; the DPTR
|
; the DPTR
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL FP_CLEAR ;CLEAR EVERYTHING
|
ACALL FP_CLEAR ;CLEAR EVERYTHING
|
ACALL GET_DPTR_CHARACTER
|
ACALL GET_DPTR_CHARACTER
|
ACALL PLUS_MINUS_TEST
|
ACALL PLUS_MINUS_TEST
|
MOV MSIGN,C ;SAVE THE MANTISSA SIGN
|
MOV MSIGN,C ;SAVE THE MANTISSA SIGN
|
;
|
;
|
; Now, set up for input loop
|
; Now, set up for input loop
|
;
|
;
|
MOV R0,#FP_ACCC
|
MOV R0,#FP_ACCC
|
MOV R6,#7FH ;BASE EXPONENT
|
MOV R6,#7FH ;BASE EXPONENT
|
SETB F0 ;SET INITIAL FLAG
|
SETB F0 ;SET INITIAL FLAG
|
;
|
;
|
INLOOP: ACALL GET_DIGIT_CHECK
|
INLOOP: ACALL GET_DIGIT_CHECK
|
JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
|
JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
|
ANL A,#0FH ;STRIP ASCII
|
ANL A,#0FH ;STRIP ASCII
|
ACALL STDIG ;STORE THE DIGITS
|
ACALL STDIG ;STORE THE DIGITS
|
;
|
;
|
INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
|
INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
|
SJMP INLOOP ;LOOP FOR INPUT
|
SJMP INLOOP ;LOOP FOR INPUT
|
;
|
;
|
GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
|
GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
|
JB FOUND_RADIX,INERR
|
JB FOUND_RADIX,INERR
|
SETB FOUND_RADIX
|
SETB FOUND_RADIX
|
CJNE R0,#FP_ACCC,INLPIK
|
CJNE R0,#FP_ACCC,INLPIK
|
SETB FIRST_RADIX ;SET IF FIRST RADIX
|
SETB FIRST_RADIX ;SET IF FIRST RADIX
|
SJMP INLPIK ;GET ADDITIONAL DIGITS
|
SJMP INLPIK ;GET ADDITIONAL DIGITS
|
;
|
;
|
GT1: JB F0,INERR ;ERROR IF NOT CLEARED
|
GT1: JB F0,INERR ;ERROR IF NOT CLEARED
|
CJNE A,#'e',GT11 ;CHECK FOR LOWER CASE
|
CJNE A,#'e',GT11 ;CHECK FOR LOWER CASE
|
SJMP GT12
|
SJMP GT12
|
GT11: CJNE A,#'E',FINISH_UP
|
GT11: CJNE A,#'E',FINISH_UP
|
GT12: ACALL INC_AND_GET_DPTR_CHARACTER
|
GT12: ACALL INC_AND_GET_DPTR_CHARACTER
|
ACALL PLUS_MINUS_TEST
|
ACALL PLUS_MINUS_TEST
|
MOV XSIGN,C ;SAVE SIGN STATUS
|
MOV XSIGN,C ;SAVE SIGN STATUS
|
ACALL GET_DIGIT_CHECK
|
ACALL GET_DIGIT_CHECK
|
JNC INERR
|
JNC INERR
|
;
|
;
|
ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
|
ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
|
MOV R5,A ;SAVE THE CHARACTER IN R5
|
MOV R5,A ;SAVE THE CHARACTER IN R5
|
;
|
;
|
GT2: INC DPTR
|
GT2: INC DPTR
|
ACALL GET_DIGIT_CHECK
|
ACALL GET_DIGIT_CHECK
|
JNC FINISH1
|
JNC FINISH1
|
ANL A,#0FH ;STRIP OFF BIAS
|
ANL A,#0FH ;STRIP OFF BIAS
|
XCH A,R5 ;GET THE LAST DIGIT
|
XCH A,R5 ;GET THE LAST DIGIT
|
MOV B,#10 ;MULTIPLY BY TEN
|
MOV B,#10 ;MULTIPLY BY TEN
|
MUL AB
|
MUL AB
|
ADD A,R5 ;ADD TO ORIGINAL VALUE
|
ADD A,R5 ;ADD TO ORIGINAL VALUE
|
MOV R5,A ;SAVE IN R5
|
MOV R5,A ;SAVE IN R5
|
JNC GT2 ;LOOP IF NO CARRY
|
JNC GT2 ;LOOP IF NO CARRY
|
MOV R5,#0FFH ;FORCE AN ERROR
|
MOV R5,#0FFH ;FORCE AN ERROR
|
;
|
;
|
FINISH1:MOV A,R5 ;GET THE SIGN
|
FINISH1:MOV A,R5 ;GET THE SIGN
|
JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
|
JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
|
CLR C
|
CLR C
|
SUBB A,R6
|
SUBB A,R6
|
CPL A
|
CPL A
|
INC A
|
INC A
|
JC FINISH2
|
JC FINISH2
|
MOV A,#01H
|
MOV A,#01H
|
RET
|
RET
|
;
|
;
|
POSNUM: ADD A,R6 ;ADD TO EXPONENT
|
POSNUM: ADD A,R6 ;ADD TO EXPONENT
|
JNC FINISH2
|
JNC FINISH2
|
;
|
;
|
POSNM1: MOV A,#02H
|
POSNM1: MOV A,#02H
|
RET
|
RET
|
;
|
;
|
FINISH2:XCH A,R6 ;SAVE THE EXPONENT
|
FINISH2:XCH A,R6 ;SAVE THE EXPONENT
|
;
|
;
|
FINISH_UP:
|
FINISH_UP:
|
;
|
;
|
MOV FP_EXP,R6 ;SAVE EXPONENT
|
MOV FP_EXP,R6 ;SAVE EXPONENT
|
CJNE R0,#FP_ACCC,FINISH_UP1
|
CJNE R0,#FP_ACCC,FINISH_UP1
|
ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
|
ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
|
FINISH_UP1:
|
FINISH_UP1:
|
MOV A,ARG_STACK ;GET THE ARG STACK
|
MOV A,ARG_STACK ;GET THE ARG STACK
|
CLR C
|
CLR C
|
SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
|
SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
|
MOV ARG_STACK,A ;ADJUST FOR STORE
|
MOV ARG_STACK,A ;ADJUST FOR STORE
|
AJMP PACK
|
AJMP PACK
|
;
|
;
|
STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
|
STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
|
JNZ STDIG1 ;CONTINUE IF NOT ZERO
|
JNZ STDIG1 ;CONTINUE IF NOT ZERO
|
CJNE R0,#FP_ACCC,STDIG1
|
CJNE R0,#FP_ACCC,STDIG1
|
JNB FIRST_RADIX,RET_X
|
JNB FIRST_RADIX,RET_X
|
;
|
;
|
DECX: DJNZ R6,RET_X
|
DECX: DJNZ R6,RET_X
|
;
|
;
|
INERR: MOV A,#0FFH
|
INERR: MOV A,#0FFH
|
;
|
;
|
RET_X: RET
|
RET_X: RET
|
;
|
;
|
STDIG1: JB DONE_LOAD,FRTEST
|
STDIG1: JB DONE_LOAD,FRTEST
|
CLR FIRST_RADIX
|
CLR FIRST_RADIX
|
;
|
;
|
FRTEST: JB FIRST_RADIX,DECX
|
FRTEST: JB FIRST_RADIX,DECX
|
;
|
;
|
FDTEST: JB FOUND_RADIX,FDT1
|
FDTEST: JB FOUND_RADIX,FDT1
|
INC R6
|
INC R6
|
;
|
;
|
FDT1: JB DONE_LOAD,RET_X
|
FDT1: JB DONE_LOAD,RET_X
|
CJNE R0,#FP_ACC8+1,FDT2
|
CJNE R0,#FP_ACC8+1,FDT2
|
SETB DONE_LOAD
|
SETB DONE_LOAD
|
;
|
;
|
FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
|
FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
|
INC R0 ;BUMP THE POINTER
|
INC R0 ;BUMP THE POINTER
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
; I/O utilities
|
; I/O utilities
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
INC_AND_GET_DPTR_CHARACTER:
|
INC_AND_GET_DPTR_CHARACTER:
|
;
|
;
|
INC DPTR
|
INC DPTR
|
;
|
;
|
GET_DPTR_CHARACTER:
|
GET_DPTR_CHARACTER:
|
;
|
;
|
MOVX A,@DPTR ;GET THE CHARACTER
|
MOVX A,@DPTR ;GET THE CHARACTER
|
CJNE A,#' ',PMT1 ;SEE IF A SPACE
|
CJNE A,#' ',PMT1 ;SEE IF A SPACE
|
;
|
;
|
; Kill spaces
|
; Kill spaces
|
;
|
;
|
SJMP INC_AND_GET_DPTR_CHARACTER
|
SJMP INC_AND_GET_DPTR_CHARACTER
|
;
|
;
|
PLUS_MINUS_TEST:
|
PLUS_MINUS_TEST:
|
;
|
;
|
CJNE A,#0E3H,PMT11 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
|
CJNE A,#0E3H,PMT11 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
|
SJMP PMT3
|
SJMP PMT3
|
PMT11: CJNE A,#'+',PMT12
|
PMT11: CJNE A,#'+',PMT12
|
SJMP PMT3
|
SJMP PMT3
|
PMT12: CJNE A,#0E5H,PMT13 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
|
PMT12: CJNE A,#0E5H,PMT13 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
|
SJMP PMT2
|
SJMP PMT2
|
PMT13: CJNE A,#'-',PMT1
|
PMT13: CJNE A,#'-',PMT1
|
;
|
;
|
PMT2: SETB C
|
PMT2: SETB C
|
;
|
;
|
PMT3: INC DPTR
|
PMT3: INC DPTR
|
;
|
;
|
PMT1: RET
|
PMT1: RET
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
FLOATING_POINT_OUTPUT: ; Output the number, format is in location 23
|
FLOATING_POINT_OUTPUT: ; Output the number, format is in location 23
|
;
|
;
|
; IF FORMAT = 00 - FREE FLOATING
|
; IF FORMAT = 00 - FREE FLOATING
|
; = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
|
; = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
|
; = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
|
; = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
|
; N + X = 8 MAX
|
; N + X = 8 MAX
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
|
ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
|
ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
|
ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
|
MOV A,R7
|
MOV A,R7
|
MOV R6,A ;PUT THE EXPONENT IN R6
|
MOV R6,A ;PUT THE EXPONENT IN R6
|
ACALL UNPACK_R0 ;UNPACK THE NUMBER
|
ACALL UNPACK_R0 ;UNPACK THE NUMBER
|
MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
|
MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
|
MOV A,FORMAT ;GET THE FORMAT
|
MOV A,FORMAT ;GET THE FORMAT
|
MOV R3,A ;SAVE IN CASE OF EXP FORMAT
|
MOV R3,A ;SAVE IN CASE OF EXP FORMAT
|
JZ FREE ;FREE FLOATING?
|
JZ FREE ;FREE FLOATING?
|
CJNE A,#0F0H,FPO1 ;SEE IF EXPONENTIAL
|
CJNE A,#0F0H,FPO1 ;SEE IF EXPONENTIAL
|
FPO1: JNC EXPOUT
|
FPO1: JNC EXPOUT
|
;
|
;
|
; If here, must be integer USING format
|
; If here, must be integer USING format
|
;
|
;
|
MOV A,R6 ;GET THE EXPONENT
|
MOV A,R6 ;GET THE EXPONENT
|
JNZ FPO2
|
JNZ FPO2
|
MOV R6,#80H
|
MOV R6,#80H
|
FPO2: MOV A,R3 ;GET THE FORMAT
|
FPO2: MOV A,R3 ;GET THE FORMAT
|
SWAP A ;SPLIT INTEGER AND FRACTION
|
SWAP A ;SPLIT INTEGER AND FRACTION
|
ANL A,#0FH
|
ANL A,#0FH
|
MOV R2,A ;SAVE INTEGER
|
MOV R2,A ;SAVE INTEGER
|
ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
|
ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
|
XCH A,R2 ;FLIP FOR SUBB
|
XCH A,R2 ;FLIP FOR SUBB
|
CLR C
|
CLR C
|
SUBB A,R2
|
SUBB A,R2
|
MOV R7,A
|
MOV R7,A
|
JNC FPO3
|
JNC FPO3
|
MOV R5,#'?' ;OUTPUT A QUESTION MARK
|
MOV R5,#'?' ;OUTPUT A QUESTION MARK
|
ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
|
ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
|
AJMP FREE
|
AJMP FREE
|
FPO3: CJNE R2,#00,USING0 ;SEE IF ZERO
|
FPO3: CJNE R2,#00,USING0 ;SEE IF ZERO
|
DEC R7
|
DEC R7
|
ACALL SS7
|
ACALL SS7
|
ACALL ZOUT ;OUTPUT A ZERO
|
ACALL ZOUT ;OUTPUT A ZERO
|
SJMP USING1
|
SJMP USING1
|
;
|
;
|
USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
|
USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
|
MOV A,R2 ;OUTPUT DIGITS
|
MOV A,R2 ;OUTPUT DIGITS
|
MOV R7,A
|
MOV R7,A
|
ACALL OUTR0
|
ACALL OUTR0
|
;
|
;
|
USING1: MOV A,R3
|
USING1: MOV A,R3
|
ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
|
ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
|
MOV R2,A ;SAVE IT
|
MOV R2,A ;SAVE IT
|
JZ PMT1 ;EXIT IF ZERO
|
JZ PMT1 ;EXIT IF ZERO
|
ACALL ROUT ;OUTPUT DP
|
ACALL ROUT ;OUTPUT DP
|
ACALL NUM_RT
|
ACALL NUM_RT
|
CJNE A,2,USINGX ;COMPARE A TO R2
|
CJNE A,2,USINGX ;COMPARE A TO R2
|
;
|
;
|
USINGY: MOV A,R2
|
USINGY: MOV A,R2
|
AJMP Z7R7
|
AJMP Z7R7
|
;
|
;
|
USINGX: JNC USINGY
|
USINGX: JNC USINGY
|
;
|
;
|
USING2: XCH A,R2
|
USING2: XCH A,R2
|
CLR C
|
CLR C
|
SUBB A,R2
|
SUBB A,R2
|
XCH A,R2
|
XCH A,R2
|
ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
|
ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
|
MOV A,R2
|
MOV A,R2
|
MOV R7,A
|
MOV R7,A
|
AJMP OUTR0
|
AJMP OUTR0
|
;
|
;
|
; First, force exponential output, if need to
|
; First, force exponential output, if need to
|
;
|
;
|
FREE: MOV A,R6 ;GET THE EXPONENT
|
FREE: MOV A,R6 ;GET THE EXPONENT
|
JNZ FREE1 ;IF ZERO, PRINT IT
|
JNZ FREE1 ;IF ZERO, PRINT IT
|
ACALL SOUT
|
ACALL SOUT
|
AJMP ZOUT
|
AJMP ZOUT
|
;
|
;
|
FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
|
FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
|
MOV A,#80H-DIGIT-DIGIT-1
|
MOV A,#80H-DIGIT-DIGIT-1
|
ADD A,R6
|
ADD A,R6
|
JC EXPOUT
|
JC EXPOUT
|
SUBB A,#0F7H
|
SUBB A,#0F7H
|
JC EXPOUT
|
JC EXPOUT
|
;
|
;
|
; Now, just print the number
|
; Now, just print the number
|
;
|
;
|
ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
|
ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
|
ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
|
ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
|
CJNE A,#8,FREE4
|
CJNE A,#8,FREE4
|
AJMP OUTR0
|
AJMP OUTR0
|
;
|
;
|
FREE4: ACALL OUTR0
|
FREE4: ACALL OUTR0
|
ACALL ZTEST ;TEST FOR TRAILING ZEROS
|
ACALL ZTEST ;TEST FOR TRAILING ZEROS
|
JZ U_RET ;DONE IF ALL TRAILING ZEROS
|
JZ U_RET ;DONE IF ALL TRAILING ZEROS
|
ACALL ROUT ;OUTPUT RADIX
|
ACALL ROUT ;OUTPUT RADIX
|
;
|
;
|
FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
|
FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
|
ACALL OUTR0
|
ACALL OUTR0
|
JNZ U_RET
|
JNZ U_RET
|
ACALL ZTEST
|
ACALL ZTEST
|
JZ U_RET
|
JZ U_RET
|
SJMP FREE2 ;LOOP
|
SJMP FREE2 ;LOOP
|
;
|
;
|
EXPOUT: ACALL SINOUT ;PRINT THE SIGN
|
EXPOUT: ACALL SINOUT ;PRINT THE SIGN
|
MOV R7,#1 ;OUTPUT ONE CHARACTER
|
MOV R7,#1 ;OUTPUT ONE CHARACTER
|
ACALL OUTR0
|
ACALL OUTR0
|
ACALL ROUT ;OUTPUT RADIX
|
ACALL ROUT ;OUTPUT RADIX
|
MOV A,R3 ;GET FORMAT
|
MOV A,R3 ;GET FORMAT
|
ANL A,#0FH ;STRIP INDICATOR
|
ANL A,#0FH ;STRIP INDICATOR
|
JZ EXPOTX
|
JZ EXPOTX
|
;
|
;
|
MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
|
MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
|
DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
|
DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
|
ACALL OUTR0
|
ACALL OUTR0
|
SJMP EXPOT4
|
SJMP EXPOT4
|
;
|
;
|
EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
|
EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
|
;
|
;
|
EXPOT4: ACALL SOUT ;OUTPUT A SPACE
|
EXPOT4: ACALL SOUT ;OUTPUT A SPACE
|
MOV R5,#'E'
|
MOV R5,#'E'
|
ACALL SOUT1 ;OUTPUT AN E
|
ACALL SOUT1 ;OUTPUT AN E
|
MOV A,R6 ;GET THE EXPONENT
|
MOV A,R6 ;GET THE EXPONENT
|
JZ XOUT0 ;EXIT IF ZERO
|
JZ XOUT0 ;EXIT IF ZERO
|
DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
|
DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
|
CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
|
CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
|
;
|
;
|
XOUT0: ACALL SOUT
|
XOUT0: ACALL SOUT
|
CLR A
|
CLR A
|
SJMP XOUT4
|
SJMP XOUT4
|
;
|
;
|
XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
|
XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
|
MOV R5,#'+' ;OUTPUT A PLUS SIGN
|
MOV R5,#'+' ;OUTPUT A PLUS SIGN
|
ACALL SOUT1
|
ACALL SOUT1
|
SJMP XOUT4
|
SJMP XOUT4
|
;
|
;
|
XOUT3: ACALL MOUT
|
XOUT3: ACALL MOUT
|
CPL A ;FLIP BITS
|
CPL A ;FLIP BITS
|
INC A ;BUMP
|
INC A ;BUMP
|
;
|
;
|
XOUT4: CLR ACC.7
|
XOUT4: CLR ACC.7
|
MOV R0,A
|
MOV R0,A
|
MOV R2,#0
|
MOV R2,#0
|
MOV R1,#LOW CONVERT ;CONVERSION LOCATION
|
MOV R1,#LOW CONVERT ;CONVERSION LOCATION
|
MOV R3,#HIGH CONVERT
|
MOV R3,#HIGH CONVERT
|
ACALL CONVERT_BINARY_TO_ASCII_STRING
|
ACALL CONVERT_BINARY_TO_ASCII_STRING
|
MOV R0,#LOW CONVERT ;NOW, OUTPUT EXPONENT
|
MOV R0,#LOW CONVERT ;NOW, OUTPUT EXPONENT
|
;
|
;
|
EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
|
EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
|
MOV R5,A ;OUTPUT IT
|
MOV R5,A ;OUTPUT IT
|
ACALL SOUT1
|
ACALL SOUT1
|
INC R0 ;BUMP THE POINTER
|
INC R0 ;BUMP THE POINTER
|
MOV A,R0 ;GET THE POINTER
|
MOV A,R0 ;GET THE POINTER
|
CJNE A,R1B0,EXPOT5 ;LOOP
|
CJNE A,R1B0,EXPOT5 ;LOOP
|
;
|
;
|
U_RET: RET ;EXIT
|
U_RET: RET ;EXIT
|
;
|
;
|
OUTR0: ; Output the characters pointed to by R0, also bias ascii
|
OUTR0: ; Output the characters pointed to by R0, also bias ascii
|
;
|
;
|
MOV A,R7 ;GET THE COUNTER
|
MOV A,R7 ;GET THE COUNTER
|
JZ OUTR ;EXIT IF DONE
|
JZ OUTR ;EXIT IF DONE
|
MOV A,@R0 ;GET THE NUMBER
|
MOV A,@R0 ;GET THE NUMBER
|
ORL A,#30H ;ASCII BIAS
|
ORL A,#30H ;ASCII BIAS
|
INC R0 ;BUMP POINTER AND COUNTER
|
INC R0 ;BUMP POINTER AND COUNTER
|
DEC R7
|
DEC R7
|
MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
|
MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
|
ACALL SOUT1 ;OUTPUT THE CHARACTER
|
ACALL SOUT1 ;OUTPUT THE CHARACTER
|
CLR A ;JUST FOR TEST
|
CLR A ;JUST FOR TEST
|
CJNE R0,#FP_NIB8+1,OUTR0
|
CJNE R0,#FP_NIB8+1,OUTR0
|
MOV A,#55H ;KNOW WHERE EXIT OCCURED
|
MOV A,#55H ;KNOW WHERE EXIT OCCURED
|
;
|
;
|
OUTR: RET
|
OUTR: RET
|
;
|
;
|
ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
|
ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
|
;
|
;
|
ZT0: MOV A,@R1 ;GET THE VALUE
|
ZT0: MOV A,@R1 ;GET THE VALUE
|
JNZ ZT1
|
JNZ ZT1
|
INC R1 ;BUMP POINTER
|
INC R1 ;BUMP POINTER
|
CJNE R1,#FP_NIB8+1,ZT0
|
CJNE R1,#FP_NIB8+1,ZT0
|
;
|
;
|
ZT1: RET
|
ZT1: RET
|
;
|
;
|
NUM_LT: MOV A,R6 ;GET EXPONENT
|
NUM_LT: MOV A,R6 ;GET EXPONENT
|
CLR C ;GET READY FOR SUBB
|
CLR C ;GET READY FOR SUBB
|
SUBB A,#80H ;SUB EXPONENT BIAS
|
SUBB A,#80H ;SUB EXPONENT BIAS
|
JNC NL1 ;OK IF NO CARRY
|
JNC NL1 ;OK IF NO CARRY
|
CLR A ;NO DIGITS LEFT
|
CLR A ;NO DIGITS LEFT
|
;
|
;
|
NL1: MOV R7,A ;SAVE THE COUNT
|
NL1: MOV R7,A ;SAVE THE COUNT
|
RET
|
RET
|
;
|
;
|
NUM_RT: CLR C ;SUBB AGAIN
|
NUM_RT: CLR C ;SUBB AGAIN
|
MOV A,#80H ;EXPONENT BIAS
|
MOV A,#80H ;EXPONENT BIAS
|
SUBB A,R6 ;GET THE BIASED EXPONENT
|
SUBB A,R6 ;GET THE BIASED EXPONENT
|
JNC NR1
|
JNC NR1
|
CLR A
|
CLR A
|
;
|
;
|
NR1: RET ;EXIT
|
NR1: RET ;EXIT
|
;
|
;
|
SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
|
SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
|
JZ NR1 ;EXIT IF ZERO
|
JZ NR1 ;EXIT IF ZERO
|
ACALL SOUT ;OUTPUT A SPACE
|
ACALL SOUT ;OUTPUT A SPACE
|
DEC R7 ;BUMP COUNTER
|
DEC R7 ;BUMP COUNTER
|
SJMP SPACE7 ;LOOP
|
SJMP SPACE7 ;LOOP
|
;
|
;
|
Z7R7: MOV R7,A
|
Z7R7: MOV R7,A
|
;
|
;
|
ZERO7: MOV A,R7 ;GET COUNTER
|
ZERO7: MOV A,R7 ;GET COUNTER
|
JZ NR1 ;EXIT IF ZERO
|
JZ NR1 ;EXIT IF ZERO
|
ACALL ZOUT ;OUTPUT A ZERO
|
ACALL ZOUT ;OUTPUT A ZERO
|
DEC R7 ;BUMP COUNTER
|
DEC R7 ;BUMP COUNTER
|
SJMP ZERO7 ;LOOP
|
SJMP ZERO7 ;LOOP
|
;
|
;
|
SS7: ACALL SPACE7
|
SS7: ACALL SPACE7
|
;
|
;
|
SINOUT: MOV A,R4 ;GET THE SIGN
|
SINOUT: MOV A,R4 ;GET THE SIGN
|
JZ SOUT ;OUTPUT A SPACE IF ZERO
|
JZ SOUT ;OUTPUT A SPACE IF ZERO
|
;
|
;
|
MOUT: MOV R5,#'-'
|
MOUT: MOV R5,#'-'
|
SJMP SOUT1 ;OUTPUT A MINUS IF NOT
|
SJMP SOUT1 ;OUTPUT A MINUS IF NOT
|
;
|
;
|
ROUT: MOV R5,#'.' ;OUTPUT A RADIX
|
ROUT: MOV R5,#'.' ;OUTPUT A RADIX
|
SJMP SOUT1
|
SJMP SOUT1
|
;
|
;
|
ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
|
ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
|
SJMP SOUT1
|
SJMP SOUT1
|
;
|
;
|
SOUT: MOV R5,#' ' ;OUTPUT A SPACE
|
SOUT: MOV R5,#' ' ;OUTPUT A SPACE
|
;
|
;
|
SOUT1: AJMP OUTPUT
|
SOUT1: AJMP OUTPUT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CONVERT_ASCII_STRING_TO_BINARY:
|
CONVERT_ASCII_STRING_TO_BINARY:
|
;
|
;
|
;DPTR POINTS TO ASCII STRING
|
;DPTR POINTS TO ASCII STRING
|
;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
|
;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
|
CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
|
MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
|
MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
|
ACALL GET_DIGIT_CHECK
|
ACALL GET_DIGIT_CHECK
|
CPL C ;FLIP FOR EXIT
|
CPL C ;FLIP FOR EXIT
|
JC RCASB
|
JC RCASB
|
MOV R3,#00H ;ZERO R3:R1 FOR LOOP
|
MOV R3,#00H ;ZERO R3:R1 FOR LOOP
|
MOV R1,#00H
|
MOV R1,#00H
|
SJMP CASB5
|
SJMP CASB5
|
;
|
;
|
CASB2: INC DPTR
|
CASB2: INC DPTR
|
MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
|
MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
|
MOV R2B0,R3 ;IN R2:R0
|
MOV R2B0,R3 ;IN R2:R0
|
ACALL GET_DIGIT_CHECK
|
ACALL GET_DIGIT_CHECK
|
JC CASB5
|
JC CASB5
|
JNB ADD_IN,RCASB ;CONVERSION COMPLETE
|
JNB ADD_IN,RCASB ;CONVERSION COMPLETE
|
ACALL HEX_CHECK ;SEE IF HEX NUMBER
|
ACALL HEX_CHECK ;SEE IF HEX NUMBER
|
JC CASB4 ;PROCEED IF GOOD
|
JC CASB4 ;PROCEED IF GOOD
|
INC DPTR ;BUMP PAST H
|
INC DPTR ;BUMP PAST H
|
SJMP RCASB
|
SJMP RCASB
|
;
|
;
|
CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
|
CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
|
;
|
;
|
CASB5: MOV B,#10
|
CASB5: MOV B,#10
|
JNB ADD_IN,CASB6
|
JNB ADD_IN,CASB6
|
MOV B,#16 ;HEX MODE
|
MOV B,#16 ;HEX MODE
|
;
|
;
|
CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
|
CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
|
JNC CASB2 ;LOOP IF NO CARRY
|
JNC CASB2 ;LOOP IF NO CARRY
|
;
|
;
|
RCASB: CLR A ;RESET ACC
|
RCASB: CLR A ;RESET ACC
|
MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
|
MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
|
RET ;EXIT
|
RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;
|
;
|
MULNUM10:MOV B,#10
|
MULNUM10:MOV B,#10
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
MULNUM: ; Take the next digit in the acc (masked to 0FH)
|
MULNUM: ; Take the next digit in the acc (masked to 0FH)
|
; accumulate in R3:R1
|
; accumulate in R3:R1
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
PUSH ACC ;SAVE ACC
|
PUSH ACC ;SAVE ACC
|
PUSH B ;SAVE MULTIPLIER
|
PUSH B ;SAVE MULTIPLIER
|
MOV A,R1 ;PUT LOW ORDER BITS IN ACC
|
MOV A,R1 ;PUT LOW ORDER BITS IN ACC
|
MUL AB ;DO THE MULTIPLY
|
MUL AB ;DO THE MULTIPLY
|
MOV R1,A ;PUT THE RESULT BACK
|
MOV R1,A ;PUT THE RESULT BACK
|
MOV A,R3 ;GET THE HIGH ORDER BYTE
|
MOV A,R3 ;GET THE HIGH ORDER BYTE
|
MOV R3,B ;SAVE THE OVERFLOW
|
MOV R3,B ;SAVE THE OVERFLOW
|
POP B ;GET THE MULTIPLIER
|
POP B ;GET THE MULTIPLIER
|
MUL AB ;DO IT
|
MUL AB ;DO IT
|
MOV C,OV ;SAVE OVERFLOW IN F0
|
MOV C,OV ;SAVE OVERFLOW IN F0
|
MOV F0,C
|
MOV F0,C
|
ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
|
ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
|
MOV R3,A ;PUT IT BACK
|
MOV R3,A ;PUT IT BACK
|
POP ACC ;GET THE ORIGINAL ACC BACK
|
POP ACC ;GET THE ORIGINAL ACC BACK
|
ORL C,F0 ;OR CARRY AND OVERFLOW
|
ORL C,F0 ;OR CARRY AND OVERFLOW
|
JC MULX ;NO GOOD IF THE CARRY IS SET
|
JC MULX ;NO GOOD IF THE CARRY IS SET
|
;
|
;
|
MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
|
MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
|
ADD A,R1 ;NOW ADD THE ACC
|
ADD A,R1 ;NOW ADD THE ACC
|
MOV R1,A ;PUT IT BACK
|
MOV R1,A ;PUT IT BACK
|
CLR A ;PROPAGATE THE CARRY
|
CLR A ;PROPAGATE THE CARRY
|
ADDC A,R3
|
ADDC A,R3
|
MOV R3,A ;PUT IT BACK
|
MOV R3,A ;PUT IT BACK
|
;
|
;
|
MULX: RET ;EXIT WITH OR WITHOUT CARRY
|
MULX: RET ;EXIT WITH OR WITHOUT CARRY
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CONVERT_BINARY_TO_ASCII_STRING:
|
CONVERT_BINARY_TO_ASCII_STRING:
|
;
|
;
|
;R3:R1 contains the address of the string
|
;R3:R1 contains the address of the string
|
;R2:R0 contains the value to convert
|
;R2:R0 contains the value to convert
|
;DPTR, R7, R6, and ACC gets clobbered
|
;DPTR, R7, R6, and ACC gets clobbered
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
CLR A ;NO LEADING ZEROS
|
CLR A ;NO LEADING ZEROS
|
MOV DPTR,#10000 ;SUBTRACT 10000
|
MOV DPTR,#10000 ;SUBTRACT 10000
|
ACALL RSUB ;DO THE SUBTRACTION
|
ACALL RSUB ;DO THE SUBTRACTION
|
MOV DPTR,#1000 ;NOW 1000
|
MOV DPTR,#1000 ;NOW 1000
|
ACALL RSUB
|
ACALL RSUB
|
MOV DPTR,#100 ;NOW 100
|
MOV DPTR,#100 ;NOW 100
|
ACALL RSUB
|
ACALL RSUB
|
MOV DPTR,#10 ;NOW 10
|
MOV DPTR,#10 ;NOW 10
|
ACALL RSUB
|
ACALL RSUB
|
MOV DPTR,#1 ;NOW 1
|
MOV DPTR,#1 ;NOW 1
|
ACALL RSUB
|
ACALL RSUB
|
JZ RSUB2 ;JUMP OVER RET
|
JZ RSUB2 ;JUMP OVER RET
|
;
|
;
|
RSUB_R: RET
|
RSUB_R: RET
|
;
|
;
|
RSUB: MOV R6,#-1 ;SET UP THE COUNTER
|
RSUB: MOV R6,#-1 ;SET UP THE COUNTER
|
;
|
;
|
RSUB1: INC R6 ;BUMP THE COUNTER
|
RSUB1: INC R6 ;BUMP THE COUNTER
|
XCH A,R2 ;DO A FAST COMPARE
|
XCH A,R2 ;DO A FAST COMPARE
|
CJNE A,DPH,RSUB11
|
CJNE A,DPH,RSUB11
|
RSUB11: XCH A,R2
|
RSUB11: XCH A,R2
|
JC FAST_DONE
|
JC FAST_DONE
|
XCH A,R0 ;GET LOW BYTE
|
XCH A,R0 ;GET LOW BYTE
|
SUBB A,DPL ;SUBTRACT, CARRY IS CLEARED
|
SUBB A,DPL ;SUBTRACT, CARRY IS CLEARED
|
XCH A,R0 ;PUT IT BACK
|
XCH A,R0 ;PUT IT BACK
|
XCH A,R2 ;GET THE HIGH BYTE
|
XCH A,R2 ;GET THE HIGH BYTE
|
SUBB A,DPH ;ADD THE HIGH BYTE
|
SUBB A,DPH ;ADD THE HIGH BYTE
|
XCH A,R2 ;PUT IT BACK
|
XCH A,R2 ;PUT IT BACK
|
JNC RSUB1 ;LOOP UNTIL CARRY
|
JNC RSUB1 ;LOOP UNTIL CARRY
|
;
|
;
|
XCH A,R0
|
XCH A,R0
|
ADD A,DPL ;RESTORE R2:R0
|
ADD A,DPL ;RESTORE R2:R0
|
XCH A,R0
|
XCH A,R0
|
XCH A,R2
|
XCH A,R2
|
ADDC A,DPH
|
ADDC A,DPH
|
XCH A,R2
|
XCH A,R2
|
;
|
;
|
FAST_DONE:
|
FAST_DONE:
|
;
|
;
|
ORL A,R6 ;OR THE COUNT VALUE
|
ORL A,R6 ;OR THE COUNT VALUE
|
JZ RSUB_R ;RETURN IF ZERO
|
JZ RSUB_R ;RETURN IF ZERO
|
;
|
;
|
RSUB2: MOV A,#'0' ;GET THE ASCII BIAS
|
RSUB2: MOV A,#'0' ;GET THE ASCII BIAS
|
ADD A,R6 ;ADD THE COUNT
|
ADD A,R6 ;ADD THE COUNT
|
;
|
;
|
RSUB4: MOV P2,R3 ;SET UP P2
|
RSUB4: MOV P2,R3 ;SET UP P2
|
MOVX @R1,A ;PLACE THE VALUE IN MEMORY
|
MOVX @R1,A ;PLACE THE VALUE IN MEMORY
|
INC R1
|
INC R1
|
CJNE R1,#00H,RSUB3 ;SEE IF RAPPED AROUND
|
CJNE R1,#00H,RSUB3 ;SEE IF RAPPED AROUND
|
INC R3 ;BUMP HIGH BYTE
|
INC R3 ;BUMP HIGH BYTE
|
;
|
;
|
RSUB3: RET ;EXIT
|
RSUB3: RET ;EXIT
|
;
|
;
|
$EJECT
|
$EJECT
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
HEXOUT: ; Output the hex number in R3:R1, supress leading zeros, if set
|
HEXOUT: ; Output the hex number in R3:R1, supress leading zeros, if set
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
ACALL SOUT ;OUTPUT A SPACE
|
ACALL SOUT ;OUTPUT A SPACE
|
MOV C,ZSURP ;GET ZERO SUPPRESSION BIT
|
MOV C,ZSURP ;GET ZERO SUPPRESSION BIT
|
MOV ADD_IN,C
|
MOV ADD_IN,C
|
MOV A,R3 ;GET HIGH NIBBLE AND PRINT IT
|
MOV A,R3 ;GET HIGH NIBBLE AND PRINT IT
|
ACALL HOUTHI
|
ACALL HOUTHI
|
MOV A,R3
|
MOV A,R3
|
ACALL HOUTLO
|
ACALL HOUTLO
|
;
|
;
|
HEX2X: CLR ADD_IN ;DON'T SUPPRESS ZEROS
|
HEX2X: CLR ADD_IN ;DON'T SUPPRESS ZEROS
|
MOV A,R1 ;GET LOW NIBBLE AND PRINT IT
|
MOV A,R1 ;GET LOW NIBBLE AND PRINT IT
|
ACALL HOUTHI
|
ACALL HOUTHI
|
MOV A,R1
|
MOV A,R1
|
ACALL HOUTLO
|
ACALL HOUTLO
|
MOV R5,#'H' ;OUTPUT H TO INDICATE HEX MODE
|
MOV R5,#'H' ;OUTPUT H TO INDICATE HEX MODE
|
;
|
;
|
SOUT_1: AJMP SOUT1
|
SOUT_1: AJMP SOUT1
|
;
|
;
|
HOUT1: CLR ADD_IN ;PRINTED SOMETHING, SO CLEAR ADD_IN
|
HOUT1: CLR ADD_IN ;PRINTED SOMETHING, SO CLEAR ADD_IN
|
ADD A,#90H ;CONVERT TO ASCII
|
ADD A,#90H ;CONVERT TO ASCII
|
DA A
|
DA A
|
ADDC A,#40H
|
ADDC A,#40H
|
DA A ;GOT IT HERE
|
DA A ;GOT IT HERE
|
MOV R5,A ;OUTPUT THE BYTE
|
MOV R5,A ;OUTPUT THE BYTE
|
SJMP SOUT_1
|
SJMP SOUT_1
|
;
|
;
|
HOUTHI: SWAP A ;SWAP TO OUTPUT HIGH NIBBLE
|
HOUTHI: SWAP A ;SWAP TO OUTPUT HIGH NIBBLE
|
;
|
;
|
HOUTLO: ANL A,#0FH ;STRIP
|
HOUTLO: ANL A,#0FH ;STRIP
|
JNZ HOUT1 ;PRINT IF NOT ZERO
|
JNZ HOUT1 ;PRINT IF NOT ZERO
|
JNB ADD_IN,HOUT1 ;OUTPUT A ZERO IF NOT SUPRESSED
|
JNB ADD_IN,HOUT1 ;OUTPUT A ZERO IF NOT SUPRESSED
|
RET
|
RET
|
;
|
;
|
$EJECT
|
$EJECT
|
ORG 1FEBH ;FOR LINK COMPATABILITY
|
ORG 1FEBH ;FOR LINK COMPATABILITY
|
;
|
;
|
;
|
;
|
GET_DIGIT_CHECK: ; Get a character, then check for digit
|
GET_DIGIT_CHECK: ; Get a character, then check for digit
|
;
|
;
|
ACALL GET_DPTR_CHARACTER
|
ACALL GET_DPTR_CHARACTER
|
;
|
;
|
DIGIT_CHECK: ;CHECK FOR A VALID ASCII DIGIT, SET CARRY IF FOUND
|
DIGIT_CHECK: ;CHECK FOR A VALID ASCII DIGIT, SET CARRY IF FOUND
|
;
|
;
|
CJNE A,#'9'+1,DC10 ;SEE IF ASCII 9 OR LESS
|
CJNE A,#'9'+1,DC10 ;SEE IF ASCII 9 OR LESS
|
DC10: JC DC1
|
DC10: JC DC1
|
RET
|
RET
|
;
|
;
|
DC1: CJNE A,#'0',DC11 ;SEE IF ASCII 0 OR GREATER
|
DC1: CJNE A,#'0',DC11 ;SEE IF ASCII 0 OR GREATER
|
DC11: CPL C
|
DC11: CPL C
|
RET
|
RET
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
XSEG ;External Ram
|
XSEG ;External Ram
|
;
|
;
|
;***************************************************************
|
;***************************************************************
|
;
|
;
|
DS 4
|
DS 4
|
IBCNT: DS 1 ;LENGTH OF A LINE
|
IBCNT: DS 1 ;LENGTH OF A LINE
|
IBLN: DS 2 ;THE LINE NUMBER
|
IBLN: DS 2 ;THE LINE NUMBER
|
IBUF: DS LINLEN ;THE INPUT BUFFER
|
IBUF: DS LINLEN ;THE INPUT BUFFER
|
CONVT: DS 15 ;CONVERSION LOCATION FOR FPIN
|
CONVT: DS 15 ;CONVERSION LOCATION FOR FPIN
|
;
|
;
|
ORG 100H
|
ORG 100H
|
;
|
;
|
GTB: DS 1 ;GET LOCATION
|
GTB: DS 1 ;GET LOCATION
|
ERRLOC: DS 1 ;ERROR TYPE
|
ERRLOC: DS 1 ;ERROR TYPE
|
ERRNUM: DS 2 ;WHERE TO GO ON AN ERROR
|
ERRNUM: DS 2 ;WHERE TO GO ON AN ERROR
|
VARTOP: DS 2 ;TOP OF VARIABLE STORAGE
|
VARTOP: DS 2 ;TOP OF VARIABLE STORAGE
|
ST_ALL: DS 2 ;STORAGE ALLOCATION
|
ST_ALL: DS 2 ;STORAGE ALLOCATION
|
MT_ALL: DS 2 ;MATRIX ALLOCATION
|
MT_ALL: DS 2 ;MATRIX ALLOCATION
|
MEMTOP: DS 2 ;TOP OF MEMORY
|
MEMTOP: DS 2 ;TOP OF MEMORY
|
RCELL: DS 2 ;RANDOM NUMBER CELL
|
RCELL: DS 2 ;RANDOM NUMBER CELL
|
DS FPSIZ-1
|
DS FPSIZ-1
|
CXTAL: DS 1 ;CRYSTAL
|
CXTAL: DS 1 ;CRYSTAL
|
DS FPSIZ-1
|
DS FPSIZ-1
|
FPT1: DS 1 ;FLOATINP POINT TEMP 1
|
FPT1: DS 1 ;FLOATINP POINT TEMP 1
|
DS FPSIZ-1
|
DS FPSIZ-1
|
FPT2: DS 1 ;FLOATING POINT TEMP 2
|
FPT2: DS 1 ;FLOATING POINT TEMP 2
|
INTLOC: DS 2 ;LOCATION TO GO TO ON INTERRUPT
|
INTLOC: DS 2 ;LOCATION TO GO TO ON INTERRUPT
|
STR_AL: DS 2 ;STRING ALLOCATION
|
STR_AL: DS 2 ;STRING ALLOCATION
|
SPV: DS 2 ;SERIAL PORT BAUD RATE
|
SPV: DS 2 ;SERIAL PORT BAUD RATE
|
TIV: DS 2 ;TIMER INTERRUPT NUM AND LOC
|
TIV: DS 2 ;TIMER INTERRUPT NUM AND LOC
|
PROGS: DS 2 ;PROGRAM A PROM TIME OUT
|
PROGS: DS 2 ;PROGRAM A PROM TIME OUT
|
IPROGS: DS 2 ;INTELLIGENT PROM PROGRAMMER TIMEOUT
|
IPROGS: DS 2 ;INTELLIGENT PROM PROGRAMMER TIMEOUT
|
TM_TOP: DS 1
|
TM_TOP: DS 1
|
|
|
END
|
END
|
|
|
|
|
|
|