Files
MultiComp_MiSTer/ROMS/6809/basic.lst
Fred VanEijk f219ef5c22 - work on basic/interpreter option for for Z80/CPM
- add warm/cold reset option for the 6809
- add tools and docs to build 6809 interpreter
- revert the basMon files
2024-12-05 21:22:14 -05:00

4819 lines
398 KiB
Plaintext
Raw Permalink Blame History

0001
0002 ffd0 UART EQU $FFD0
0003 ffd1 RECEV EQU UART+1
0004 ffd1 TRANS EQU UART+1
0005 ffd0 USTAT EQU UART
0006 ffd0 UCTRL EQU UART
0007
0008 0008 BS EQU 8 BACKSPACE
0009 000d CR EQU $D ENTER KEY
0010 001b ESC EQU $1B ESCAPE CODE
0011 0020 SPACE EQU $20 SPACE (BLANK)
0012 003a STKBUF EQU 58 STACK BUFFER ROOM
0013 00fa LBUFMX EQU 250 MAX NUMBER OF CHARS IN A BASIC LINE
0014 00fa MAXLIN EQU $FA MAXIMUM MS BYTE OF LINE NUMBER
0015 * PSEUDO OPS
0016 0021 SKP1 EQU $21 OP CODE OF BRN <20> SKIP ONE BYTE
0017 008c SKP2 EQU $8C OP CODE OF CMPX # - SKIP TWO BYTES
0018 0086 SKP1LD EQU $86 OP CODE OF LDA # - SKIP THE NEXT BYTE
0019 * AND LOAD THE VALUE OF THAT BYTE INTO ACCA <20> THIS
0020 * IS USUALLY USED TO LOAD ACCA WITH A NON ZERO VALUE
0021 0095 RTS_LOW EQU $95
0022 0000 ORG 0
0023 0000 ENDFLG RMB 1 STOP/END FLAG: POSITIVE=STOP, NEG=END
0024 0001 CHARAC RMB 1 TERMINATOR FLAG 1
0025 0002 ENDCHR RMB 1 TERMINATOR FLAG 2
0026 0003 TMPLOC RMB 1 SCRATCH VARIABLE
0027 0004 IFCTR RMB 1 IF COUNTER - HOW MANY IF STATEMENTS IN A LINE
0028 0005 DIMFLG RMB 1 *DV* ARRAY FLAG 0=EVALUATE, 1=DIMENSIONING
0029 0006 VALTYP RMB 1 *DV* *PV TYPE FLAG: 0=NUMERIC, $FF=STRING
0030 0007 GARBFL RMB 1 *TV STRING SPACE HOUSEKEEPING FLAG
0031 0008 ARYDIS RMB 1 DISABLE ARRAY SEARCH: 00=ALLOW SEARCH
0032 0009 INPFLG RMB 1 *TV INPUT FLAG: READ=0, INPUT<>0
0033 000a RELFLG RMB 1 *TV RELATIONAL OPERATOR FLAG
0034 000b TEMPPT RMB 2 *PV TEMPORARY STRING STACK POINTER
0035 000d LASTPT RMB 2 *PV ADDR OF LAST USED STRING STACK ADDRESS
0036 000f TEMPTR RMB 2 TEMPORARY POINTER
0037 0011 TMPTR1 RMB 2 TEMPORARY DESCRIPTOR STORAGE (STACK SEARCH)
0038 0013 FPA2 RMB 4 FLOATING POINT ACCUMULATOR #2 MANTISSA
0039 0017 BOTSTK RMB 2 BOTTOM OF STACK AT LAST CHECK
0040 0019 TXTTAB RMB 2 *PV BEGINNING OF BASIC PROGRAM
0041 001b VARTAB RMB 2 *PV START OF VARIABLES
0042 001d ARYTAB RMB 2 *PV START OF ARRAYS
0043 001f ARYEND RMB 2 *PV END OF ARRAYS (+1)
0044 0021 FRETOP RMB 2 *PV START OF STRING STORAGE (TOP OF FREE RAM)
0045 0023 STRTAB RMB 2 *PV START OF STRING VARIABLES
0046 0025 FRESPC RMB 2 UTILITY STRING POINTER
0047 0027 MEMSIZ RMB 2 *PV TOP OF STRING SPACE
0048 0029 OLDTXT RMB 2 SAVED LINE NUMBER DURING A "STOP"
0049 002b BINVAL RMB 2 BINARY VALUE OF A CONVERTED LINE NUMBER
0050 002d OLDPTR RMB 2 SAVED INPUT PTR DURING A "STOP"
0051 002f TINPTR RMB 2 TEMPORARY INPUT POINTER STORAGE
0052 0031 DATTXT RMB 2 *PV 'DATA' STATEMENT LINE NUMBER POINTER
0053 0033 DATPTR RMB 2 *PV 'DATA' STATEMENT ADDRESS POINTER
0054 0035 DATTMP RMB 2 DATA POINTER FOR 'INPUT' & 'READ'
0055 0037 VARNAM RMB 2 *TV TEMP STORAGE FOR A VARIABLE NAME
0056 0039 VARPTR RMB 2 *TV POINTER TO A VARIABLE DESCRIPTOR
0057 003b VARDES RMB 2 TEMP POINTER TO A VARIABLE DESCRIPTOR
0058 003d RELPTR RMB 2 POINTER TO RELATIONAL OPERATOR PROCESSING ROUTINE
0059 003f TRELFL RMB 1 TEMPORARY RELATIONAL OPERATOR FLAG BYTE
0060 * FLOATING POINT ACCUMULATORS #3,4 & 5 ARE MOSTLY
0061 * USED AS SCRATCH PAD VARIABLES.
0062 ** FLOATING POINT ACCUMULATOR #3 :PACKED: ($40-$44)
0063 0040 V40 RMB 1
0064 0041 V41 RMB 1
0065 0042 V42 RMB 1
0066 0043 V43 RMB 1
0067 0044 V44 RMB 1
0068 ** FLOATING POINT ACCUMULATOR #4 :PACKED: ($45-$49)
0069 0045 V45 RMB 1
0070 0046 V46 RMB 1
0071 0047 V47 RMB 1
0072 0048 V48 RMB 2
0073 ** FLOATING POINT ACCUMULATOR #5 :PACKED: ($4A<34>$4E)
0074 004a V4A RMB 1
0075 004b V4B RMB 2
0076 004d V4D RMB 2
0077 ** FLOATING POINT ACCUMULATOR #0
0078 004f FP0EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #0 EXPONENT
0079 0050 FPA0 RMB 4 *PV FLOATING POINT ACCUMULATOR #0 MANTISSA
0080 0054 FP0SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #0 SIGN
0081 0055 COEFCT RMB 1 POLYNOMIAL COEFFICIENT COUNTER
0082 0056 STRDES RMB 5 TEMPORARY STRING DESCRIPTOR
0083 005b FPCARY RMB 1 FLOATING POINT CARRY BYTE
0084 ** FLOATING POINT ACCUMULATOR #1
0085 005c FP1EXP RMB 1 *PV FLOATING POINT ACCUMULATOR #1 EXPONENT
0086 005d FPA1 RMB 4 *PV FLOATING POINT ACCUMULATOR #1 MANTISSA
0087 0061 FP1SGN RMB 1 *PV FLOATING POINT ACCUMULATOR #1 SIGN
0088 0062 RESSGN RMB 1 SIGN OF RESULT OF FLOATING POINT OPERATION
0089 0063 FPSBYT RMB 1 FLOATING POINT SUB BYTE (FIFTH BYTE)
0090 0064 COEFPT RMB 2 POLYNOMIAL COEFFICIENT POINTER
0091 0066 LSTTXT RMB 2 CURRENT LINE POINTER DURING LIST
0092 0068 CURLIN RMB 2 *PV CURRENT LINE # OF BASIC PROGRAM, $FFFF = DIRECT
0093 006a DEVCFW RMB 1 *TV TAB FIELD WIDTH
0094 006b DEVLCF RMB 1 *TV TAB ZONE
0095 006c DEVPOS RMB 1 *TV PRINT POSITION
0096 006d DEVWID RMB 1 *TV PRINT WIDTH
0097 006e RSTFLG RMB 1 *PV WARM START FLAG: $55=WARM, OTHER=COLD
0098 006f RSTVEC RMB 2 *PV WARM START VECTOR - JUMP ADDRESS FOR WARM START
0099 0071 TOPRAM RMB 2 *PV TOP OF RAM
0100 0073 IKEYIM RMB 1 *TV INKEY$ RAM IMAGE
0101 0074 ZERO RMB 2 *PV DUMMY - THESE TWO BYTES ARE ALWAYS ZERO
0102 * THE FOLLOWING BYTES ARE MOVED DOWN FROM ROM
0103 0076 LPTCFW RMB 1 16
0104 0077 LPTLCF RMB 1 112
0105 0078 LPTWID RMB 1 132
0106 0079 LPTPOS RMB 1 0
0107 007a EXECJP RMB 2 LB4AA
0108
0109 * THIS ROUTINE PICKS UP THE NEXT INPUT CHARACTER FROM
0110 * BASIC. THE ADDRESS OF THE NEXT BASIC BYTE TO BE
0111 * INTERPRETED IS STORED AT CHARAD.
0112 007c 0c 84 GETNCH INC <CHARAD+1 *PV INCREMENT LS BYTE OF INPUT POINTER
0113 007e 26 02 BNE GETCCH *PV BRANCH IF NOT ZERO (NO CARRY)
0114 0080 0c 83 INC <CHARAD *PV INCREMENT MS BYTE OF INPUT POINTER
0115 0082 b6 GETCCH FCB $B6 *PV OP CODE OF LDA EXTENDED
0116 0083 CHARAD RMB 2 *PV THESE 2 BYTES CONTAIN ADDRESS OF THE CURRENT
0117 * * CHARACTER WHICH THE BASIC INTERPRETER IS
0118 * * PROCESSING
0119 0085 7e e2 02 JMP BROMHK JUMP BACK INTO THE BASIC RUM
0120
0121 0088 VAB RMB 1 = LOW ORDER FOUR BYTES OF THE PRODUCT
0122 0089 VAC RMB 1 = OF A FLOATING POINT MULTIPLICATION
0123 008a VAD RMB 1 = THESE BYTES ARE USE AS RANDOM DATA
0124 008b VAE RMB 1 = BY THE RND STATEMENT
0125
0126 * EXTENDED BASIC VARIABLES
0127 008c TRCFLG RMB 1 *PV TRACE FLAG 0=OFF ELSE=ON
0128 008d USRADR RMB 2 *PV ADDRESS OF THE START OF USR VECTORS
0129
0130 * EXTENDED BASIC SCRATCH PAD VARIABLES
0131 008f VCF RMB 2
0132 0091 VD1 RMB 2
0133 0093 VD3 RMB 2
0134 0095 VD5 RMB 2
0135 0097 VD7 RMB 1
0136 0098 VD8 RMB 1
0137 0099 VD9 RMB 1
0138 009a VDA RMB 1
0139 009b SW3VEC RMB 3
0140 009e SW2VEC RMB 3
0141 00a1 SWIVEC RMB 3
0142 00a4 NMIVEC RMB 3
0143 00a7 IRQVEC RMB 3
0144 00aa FRQVEC RMB 3
0145 00ad USRJMP RMB 3 JUMP ADDRESS FOR BASIC'S USR FUNCTION
0146 00b0 RVSEED RMB 1 * FLOATING POINT RANDOM NUMBER SEED EXPONENT
0147 00b1 RMB 4 * MANTISSA: INITIALLY SET TO $804FC75259
0148
0149 **** USR FUNCTION VECTOR ADDRESSES (EX BASIC ONLY)
0150 00b5 USR0 RMB 2 USR 0 VECTOR
0151 00b7 RMB 2 USR 1
0152 00b9 RMB 2 USR 2
0153 00bb RMB 2 USR 3
0154 00bd RMB 2 USR 4
0155 00bf RMB 2 USR 5
0156 00c1 RMB 2 USR 6
0157 00c3 RMB 2 USR 7
0158 00c5 RMB 2 USR 8
0159 00c7 RMB 2 USR 9
0160
0161 00c9 STRSTK RMB 8*5 STRING DESCRIPTOR STACK
0162 00f1 LINHDR RMB 2 LINE INPUT BUFFER HEADER
0163 00f3 LINBUF RMB LBUFMX+1 BASIC LINE INPUT BUFFER
0164 01ee STRBUF RMB 41 STRING BUFFER
0165
0166 0217 PROGST RMB 1 START OF PROGRAM SPACE
0167 * INTERRUPT VECTORS
0168 fff2 ORG $FFF2
0169 fff2 SWI3 RMB 2
0170 fff4 SWI2 RMB 2
0171 fff6 FIRQ RMB 2
0172 fff8 IRQ RMB 2
0173 fffa SWI RMB 2
0174 fffc NMI RMB 2
0175 fffe RESETV RMB 2
0176
0177
0178
0179 e000 ORG $E000
0180
0181 * CONSOLE IN
0182 e000 8d 03 LA171 BSR KEYIN GET A CHARACTER FROM CONSOLE IN
0183 e002 27 fc BEQ LA171 LOOP IF NO KEY DOWN
0184 e004 39 RTS
0185
0186 *
0187 * THIS ROUTINE GETS A KEYSTROKE FROM THE KEYBOARD IF A KEY
0188 * IS DOWN. IT RETURNS ZERO TRUE IF THERE WAS NO KEY DOWN.
0189 *
0190 *
0191 LA1C1
0192 e005 b6 ff d0 KEYIN LDA USTAT
0193 e008 85 01 BITA #1
0194 e00a 27 06 BEQ NOCHAR
0195 e00c b6 ff d1 LDA RECEV
0196 e00f 84 7f ANDA #$7F
0197 e011 39 RTS
0198 e012 4f NOCHAR CLRA
0199 e013 39 RTS
0200
0201
0202
0203 * CONSOLE OUT
0204 e014 8d 26 PUTCHR BSR WAITACIA
0205 e016 34 02 PSHS A
0206 e018 81 0d CMPA #CR IS IT CARRIAGE RETURN?
0207 e01a 27 0d BEQ NEWLINE YES
0208 e01c b7 ff d1 STA TRANS
0209 e01f 0c 79 INC LPTPOS INCREMENT CHARACTER COUNTER
0210 e021 96 79 LDA LPTPOS CHECK FOR END OF LINE PRINTER LINE
0211 e023 91 78 CMPA LPTWID AT END OF LINE PRINTER LINE?
0212 e025 25 12 BLO PUTEND NO
0213 e027 20 10 BRA PUTEND Skip newline if not CR
0214 e029 0f 79 NEWLINE CLR LPTPOS
0215 e02b 8d 0f BSR WAITACIA
0216 e02d 86 0d LDA #13 Send CR
0217 e02f b7 ff d1 STA TRANS
0218 e032 8d 08 BSR WAITACIA
0219 e034 86 0a LDA #10 Send LF after CR
0220 e036 b7 ff d1 STA TRANS
0221 e039 35 02 PUTEND PULS A
0222 e03b 39 RTS
0223
0224 e03c 34 02 WAITACIA PSHS A
0225 e03e b6 ff d0 WRWAIT LDA USTAT
0226 e041 85 02 BITA #2
0227 e043 27 f9 BEQ WRWAIT
0228 e045 35 02 PULS A
0229 e047 39 RTS
0230
0231 * ALLOW CHOICE OF COLD OR WARM START
0232 e048 10 ce 01 ee RESVEC LDS #LINBUF+LBUFMX+1 SET STACK TO TOP OF LINE INPUT BUFFER
0233 e04c 86 0c LDA #$0C Load FF (Form Feed) character to clear screen
0234 e04e bd e0 14 JSR PUTCHR Send it to clear the screen
0235 e051 8e e1 57 LDX #PROMPT POINT TO PROMPT MESSAGE
0236 e054 a6 80 PRLOOP LDA ,X+ GET NEXT CHARACTER FROM PROMPT
0237 e056 27 05 BEQ KCHECK EXIT IF NULL TERMINATOR
0238 e058 bd e0 14 JSR PUTCHR PRINT CHARACTER
0239 e05b 20 f7 BRA PRLOOP CONTINUE PRINTING
0240 e05d b6 ff d0 KCHECK LDA USTAT CHECK UART STATUS
0241 e060 85 01 BITA #1 TEST INPUT READY BIT
0242 e062 27 f9 BEQ KCHECK LOOP UNTIL KEY PRESSED
0243 e064 b6 ff d1 LDA RECEV GET CHARACTER FROM UART
0244 e067 84 7f ANDA #$7F MASK TO 7 BITS
0245 e069 81 43 CMPA #'C CHECK FOR COLD START REQUEST
0246 e06b 27 14 BEQ BACDST DO COLD START IF REQUESTED
0247 e06d 81 57 CMPA #'W CHECK FOR WARM START REQUEST
0248 e06f 27 06 BEQ DOWARM DO WARM START IF REQUESTED
0249 e071 96 6e LDA RSTFLG DEFAULT TO FLAG CHECK IF NO VALID KEY
0250 e073 81 55 CMPA #$55 IS IT A WARM START?
0251 e075 26 0a BNE BACDST NO - DO A COLD START
0252 e077 9e 6f DOWARM LDX RSTVEC WARM START VECTOR
0253 e079 a6 84 LDA ,X GET FIRST BYTE OF WARM START ADDR
0254 e07b 81 12 CMPA #$12 IS IT NOP?
0255 e07d 26 02 BNE BACDST NO - DO A COLD START
0256 e07f 6e 84 JMP ,X YES, GO THERE
0257
0258 * COLD START ENTRY
0259
0260 e081 8e 02 18 BACDST LDX #PROGST+1 POINT X TO CLEAR 1ST 1K OF RAM
0261 e084 6f 83 LA077 CLR ,--X MOVE POINTER DOWN TWO-CLEAR BYTE
0262 e086 30 01 LEAX 1,X ADVANCE POINTER ONE
0263 e088 26 fa BNE LA077 KEEP GOING IF NOT AT BOTTOM OF PAGE 0
0264 e08a 8e 02 17 LDX #PROGST SET TO START OF PROGRAM SPACE
0265 e08d 6f 80 CLR ,X+ CLEAR 1ST BYTE OF BASIC PROGRAM
0266 e08f 9f 19 STX TXTTAB BEGINNING OF BASIC PROGRAM
0267 e091 a6 02 LA084 LDA 2,X LOOK FOR END OF MEMORY
0268 e093 43 COMA * COMPLEMENT IT AND PUT IT BACK
0269 e094 a7 02 STA 2,X * INTO SYSTEM MEMORY
0270 e096 a1 02 CMPA 2,X IS IT RAM?
0271 e098 26 06 BNE LA093 BRANCH IF NOT (ROM, BAD RAM OR NO RAM)
0272 e09a 30 01 LEAX 1,X MOVE POINTER UP ONE
0273 e09c 63 01 COM 1,X RE-COMPLEMENT TO RESTORE BYTE
0274 e09e 20 f1 BRA LA084 KEEP LOOKING FOR END OF RAM
0275 e0a0 9f 71 LA093 STX TOPRAM SAVE ABSOLUTE TOP OF RAM
0276 e0a2 9f 27 STX MEMSIZ SAVE TOP OF STRING SPACE
0277 e0a4 9f 23 STX STRTAB SAVE START OF STRING VARIABLES
0278 e0a6 30 89 ff 38 LEAX -200,X CLEAR 200 - DEFAULT STRING SPACE TO 200 BYTES
0279 e0aa 9f 21 STX FRETOP SAVE START OF STRING SPACE
0280 e0ac 1f 14 TFR X,S PUT STACK THERE
0281 e0ae 8e e0 f5 LDX #LA10D POINT X TO ROM SOURCE DATA
0282 e0b1 ce 00 76 LDU #LPTCFW POINT U TO RAM DESTINATION
0283 e0b4 c6 12 LDB #18 MOVE 18 BYTES
0284 e0b6 bd e1 f1 JSR LA59A MOVE 18 BYTES FROM ROM TO RAM
0285 e0b9 ce 00 a7 LDU #IRQVEC POINT U TO NEXT RAM DESTINATION
0286 e0bc c6 04 LDB #4 MOVE 4 MORE BYTES
0287 e0be bd e1 f1 JSR LA59A MOVE 4 BYTES FROM ROM TO RAM
0288 e0c1 86 39 LDA #$39
0289 e0c3 97 f0 STA LINHDR-1 PUT RTS IN LINHDR-1
0290 e0c5 bd e4 fd JSR LAD19 G0 DO A <20>NEW<45>
0291 * EXTENDED BASIC INITIALISATION
0292 e0c8 8e 00 b5 LDX #USR0 INITIALIZE ADDRESS OF START OF
0293 e0cb 9f 8d STX USRADR USR JUMP TABLE
0294 * INITIALIZE THE USR CALLS TO <20>FC ERROR<4F>
0295 e0cd ce ec 11 LDU #LB44A ADDRESS OF <20>FC ERROR<4F> ROUTINE
0296 e0d0 c6 0a LDB #10 10 USR CALLS IN EX BASIC
0297 e0d2 ef 81 L8031 STU ,X++ STORE <20>FC<46> ERROR AT USR ADDRESSES
0298 e0d4 5a DECB FINISHED ALL 10?
0299 e0d5 26 fb BNE L8031 NO
0300
0301 * INITIALISE ACIA
0302 e0d7 86 95 LDA #RTS_LOW DIV16 CLOCK -> 7372800 / 4 / 16 = 115200
0303 e0d9 b7 ff d0 STA UCTRL
0304 e0dc 8e e1 2a LDX #LA147-1 POINT X TO COLOR BASIC COPYRIGHT MESSAGE
0305 e0df bd f1 25 JSR LB99C PRINT <20>COLOR BASIC<49>
0306 e0e2 8e e0 ed LDX #BAWMST WARM START ADDRESS
0307 e0e5 9f 6f STX RSTVEC SAVE IT
0308 e0e7 86 55 LDA #$55 WARM START FLAG
0309 e0e9 97 6e STA RSTFLG SAVE IT
0310 e0eb 20 04 BRA LA0F3 GO TO BASIC<49>S MAIN LOOP
0311 e0ed 12 BAWMST NOP NOP REQ<45>D FOR WARM START
0312 e0ee bd e5 17 JSR LAD33 DO PART OF A NEW
0313 e0f1 7e e4 65 LA0F3 JMP LAC73 GO TO MAIN LOOP OF BASIC
0314 *
0315 * FIRQ SERVICE ROUTINE
0316 BFRQSV
0317 e0f4 3b RTI
0318 *
0319 * THESE BYTES ARE MOVED TO ADDRESSES $76 - $85 THE DIRECT PAGE
0320 e0f5 10 LA10D FCB 16 TAB FIELD WIDTH
0321 e0f6 40 FCB 64 LAST TAB ZONE
0322 e0f7 ff FCB 255 PRINTER WIDTH
0323 e0f8 00 FCB 0 LINE PRINTER POSITION
0324 e0f9 ec 11 FDB LB44A ARGUMENT OF EXEC COMMAND - SET TO <20>FC<46> ERROR
0325 * LINE INPUT ROUTINE
0326 e0fb 0c 84 INC CHARAD+1
0327 e0fd 26 02 BNE LA123
0328 e0ff 0c 83 INC CHARAD
0329 e101 b6 00 00 LA123 LDA >0000
0330 e104 7e e2 02 JMP BROMHK
0331 *
0332 * THESE BYTES ARE MOVED TO ADDRESSES $A7-$B1
0333 e107 7e e2 01 JMP BIRQSV IRQ SERVICE
0334 e10a 7e e0 f4 JMP BFRQSV FIRQ SERVICE
0335 e10d 7e ec 11 JMP LB44A USR ADDRESS FOR 8K BASIC (INITIALIZED TO <20>FC<46> ERROR)
0336 e110 80 FCB $80 *RANDOM SEED
0337 e111 4f c7 FDB $4FC7 *RANDON SEED OF MANTISSA
0338 e113 52 59 FDB $5259 *.811635157
0339 * BASIC COMMAND INTERPRETATION TABLE ROM IMAGE
0340 e115 32 COMVEC FCB 50 50 BASIC COMMANDS
0341 e116 e2 60 FDB LAA66 POINTS TO RESERVED WORDS
0342 e118 e3 6d FDB LAB67 POINTS TO JUMP TABLE FOR COMMANDS
0343 e11a 1d FCB 29 29 BASIC SECONDARY COMMANDS
0344 e11b e3 00 FDB LAB1A POINTS TO SECONDARY FUNCTION RESERVED WORDS
0345 e11d e2 11 FDB LAA29 POINTS TO SECONDARY FUNCTION JUMP TABLE
0346 e11f 00 00 FDB 0 NO MORE TABLES (RES WORDS=0)
0347 e121 00 00 FDB 0 NO MORE TABLES
0348 e123 00 00 FDB 0 NO MORE TABLES
0349 e125 00 00 FDB 0 NO MORE TABLES
0350 e127 00 00 FDB 0 NO MORE TABLES
0351 e129 00 00 FDB 0 NO MORE TABLES (SECONDARY FNS =0)
0352
0353 * COPYRIGHT MESSAGES
0354 e12b 36 38 30 39 20 45 LA147 FCC "6809 EXTENDED BASIC"
58 54 45 4e 44 45
44 20 42 41 53 49
43
0355 e13e 0d FCB CR
0356 e13f 28 43 29 20 31 39 FCC "(C) 1982 BY MICROSOFT"
38 32 20 42 59 20
4d 49 43 52 4f 53
4f 46 54
0357 e154 0d 0d LA156 FCB CR,CR
0358 e156 00 LA165 FCB $00
0359
0360 e157 43 4f 4c 44 20 4f PROMPT FCC "COLD OR WARM START (C/W)? "
52 20 57 41 52 4d
20 53 54 41 52 54
20 28 43 2f 57 29
3f 20
0361 e171 0d FCB CR
0362 e172 00 FCB $00
0363
0364 e173 34 16 LA35F PSHS X,B,A SAVE REGISTERS
0365 e175 9e 76 LDX LPTCFW TAB FIELD WIDTH AND TAB ZONE
0366 e177 dc 78 LDD LPTWID PRINTER WIDTH AND POSITION
0367 e179 9f 6a LA37C STX DEVCFW SAVE TAB FIELD WIDTH AND ZONE
0368 e17b d7 6c STB DEVPOS SAVE PRINT POSITION
0369 e17d 97 6d STA DEVWID SAVE PRINT WIDTH
0370 e17f 35 96 PULS A,B,X,PC RESTORE REGISTERS
0371
0372 * THIS IS THE ROUTINE THAT GETS AN INPUT LINE FOR BASIC
0373 * EXIT WITH BREAK KEY: CARRY = 1
0374 * EXIT WITH ENTER KEY: CARRY = 0
0375 LA38D
0376 e181 0f 73 LA390 CLR IKEYIM RESET BREAK CHECK KEY TEMP KEY STORAGE
0377 e183 8e 00 f4 LDX #LINBUF+1 INPUT LINE BUFFER
0378 e186 c6 01 LDB #1 ACCB CHAR COUNTER: SET TO 1 TO ALLOW A
0379 * BACKSPACE AS FIRST CHARACTER
0380 e188 bd e0 00 LA39A JSR LA171 GO GET A CHARACTER FROM CONSOLE IN
0381 e18b 81 08 CMPA #BS BACKSPACE
0382 e18d 26 07 BNE LA3B4 NO
0383 e18f 5a DECB YES - DECREMENT CHAR COUNTER
0384 e190 27 ef BEQ LA390 BRANCH IF BACK AT START OF LINE AGAIN
0385 e192 30 1f LEAX -1,X DECREMENT BUFFER POINTER
0386 e194 20 34 BRA LA3E8 ECHO CHAR TO SCREEN
0387 e196 81 15 LA3B4 CMPA #$15 SHIFT RIGHT ARROW?
0388 e198 26 0a BNE LA3C2 NO
0389 * YES, RESET BUFFER TO BEGINNING AND ERASE CURRENT LINE
0390 e19a 5a LA3B8 DECB DEC CHAR CTR
0391 e19b 27 e4 BEQ LA390 GO BACK TO START IF CHAR CTR = 0
0392 e19d 86 08 LDA #BS BACKSPACE?
0393 e19f bd e0 14 JSR PUTCHR SEND TO CONSOLE OUT (SCREEN)
0394 e1a2 20 f6 BRA LA3B8 KEEP GOING
0395 e1a4 81 03 LA3C2 CMPA #3 BREAK KEY?
0396 e1a6 1a 01 ORCC #1 SET CARRY FLAG
0397 e1a8 27 05 BEQ LA3CD BRANCH IF BREAK KEY DOWN
0398 e1aa 81 0d LA3C8 CMPA #CR ENTER KEY?
0399 e1ac 26 0d BNE LA3D9 NO
0400 e1ae 4f LA3CC CLRA CLEAR CARRY FLAG IF ENTER KEY - END LINE ENTRY
0401 e1af 34 01 LA3CD PSHS CC SAVE CARRY FLAG
0402 e1b1 bd f0 e5 JSR LB958 SEND CR TO SCREEN
0403 e1b4 6f 84 CLR ,X MAKE LAST BYTE IN INPUT BUFFER = 0
0404 e1b6 8e 00 f3 LDX #LINBUF RESET INPUT BUFFER POINTER
0405 e1b9 35 81 PULS CC,PC RESTORE CARRY FLAG
0406
0407 * INSERT A CHARACTER INTO THE BASIC LINE INPUT BUFFER
0408 e1bb 81 20 LA3D9 CMPA #$20 IS IT CONTROL CHAR?
0409 e1bd 25 c9 BLO LA39A BRANCH IF CONTROL CHARACTER
0410 e1bf 81 7b CMPA #'z+1 *
0411 e1c1 24 c5 BCC LA39A * IGNORE IF > LOWER CASE Z
0412 e1c3 c1 fa CMPB #LBUFMX HAVE 250 OR MORE CHARACTERS BEEN ENTERED?
0413 e1c5 24 c1 BCC LA39A YES, IGNORE ANY MORE
0414 e1c7 a7 80 STA ,X+ PUT IT IN INPUT BUFFER
0415 e1c9 5c INCB INCREMENT CHARACTER COUNTER
0416 e1ca bd e0 14 LA3E8 JSR PUTCHR ECHO IT TO SCREEN
0417 e1cd 20 b9 BRA LA39A GO SET SOME MORE
0418
0419
0420 * EXEC
0421 e1cf 27 05 EXEC BEQ LA545 BRANCH IF NO ARGUMENT
0422 e1d1 bd ef 04 JSR LB73D EVALUATE ARGUMENT - ARGUMENT RETURNED IN X
0423 e1d4 9f 7a STX EXECJP STORE X TO EXEC JUMP ADDRESS
0424 e1d6 6e 9f 00 7a LA545 JMP [EXECJP] GO DO IT
0425
0426 * BREAK CHECK
0427 e1da 7e e5 e6 LA549 JMP LADEB GO DO BREAK KEY CHECK
0428
0429 * INKEY$
0430 e1dd 96 73 INKEY LDA IKEYIM WAS A KEY DOWN IN THE BREAK CHECK?
0431 e1df 26 03 BNE LA56B YES
0432 e1e1 bd e0 05 JSR KEYIN GO GET A KEY
0433 e1e4 0f 73 LA56B CLR IKEYIM CLEAR INKEY RAM IMAGE
0434 e1e6 97 53 STA FPA0+3 STORE THE KEY IN FPA0
0435 e1e8 10 26 0c 6a LBNE LB68F CONVERT FPA0+3 TO A STRING
0436 e1ec 97 56 STA STRDES SET LENGTH OF STRING = 0 IF NO KEY DOWN
0437 e1ee 7e ee 62 JMP LB69B PUT A NULL STRING ONTO THE STRING STACK
0438
0439 * MOVE ACCB BYTES FROM (X) TO (U)
0440 e1f1 a6 80 LA59A LDA ,X+ GET BYTE FROM X
0441 e1f3 a7 c0 STA ,U+ STORE IT AT U
0442 e1f5 5a DECB MOVED ALL BYTES?
0443 e1f6 26 f9 BNE LA59A NO
0444 e1f8 39 LA5A1 RTS
0445
0446 e1f9 39 LA5C4 RTS
0447
0448 ** THIS ROUTINE WILL SCAN OFF THE FILE NAME FROM A BASIC LINE
0449 ** AND RETURN A SYNTAX ERROR IF THERE ARE ANY CHARACTERS
0450 ** FOLLOWING THE END OF THE NAME
0451 e1fa 9d 82 LA5C7 JSR GETCCH GET CURRENT INPUT CHAR FROM BASIC LINE
0452 e1fc 27 fb LA5C9 BEQ LA5C4 RETURN IF END OF LINE
0453 e1fe 7e ea 43 JMP LB277 SYNTAX ERROR IF ANY MORE CHARACTERS
0454 * IRQ SERVICE
0455 BIRQSV
0456 e201 3b LA9C5 RTI RETURN FROM INTERRUPT
0457
0458 * SET CARRY IF NUMERIC - RETURN WITH
0459 * ZERO FLAG SET IF ACCA = 0 OR 3A(:) - END
0460 * OF BASIC LINE OR SUB LINE
0461 e202 81 3a BROMHK CMPA #'9+1 IS THIS CHARACTER >=(ASCII 9)+1?
0462 e204 24 0a BHS LAA28 BRANCH IF > 9; Z SET IF = COLON
0463 e206 81 20 CMPA #SPACE SPACE?
0464 e208 26 02 BNE LAA24 NO - SET CARRY IF NUMERIC
0465 e20a 0e 7c JMP GETNCH IF SPACE, GET NECT CHAR (IGNORE SPACES)
0466 e20c 80 30 LAA24 SUBA #'0 * SET CARRY IF
0467 e20e 80 d0 SUBA #-'0 * CHARACTER > ASCII 0
0468 e210 39 LAA28 RTS
0469
0470 * DISPATCH TABLE FOR SECONDARY FUNCTIONS
0471 * TOKENS ARE PRECEEDED BY $FF
0472 * FIRST SET ALWAYS HAS ONE PARAMETER
0473 FUNC_TAB
0474 e211 f4 03 LAA29 FDB SGN SGN
0475 e213 f4 77 FDB INT INT
0476 e215 f4 1c FDB ABS ABS
0477 e217 00 ad FDB USRJMP USR
0478 0083 TOK_USR EQU *-FUNC_TAB/2+$7F
0479 ff83 TOK_FF_USR EQU *-FUNC_TAB/2+$FF7F
0480 e219 f6 a8 FDB RND RND
0481 e21b f6 fd FDB SIN SIN
0482 e21d ef 17 FDB PEEK PEEK
0483 e21f ee 48 FDB LEN LEN
0484 e221 ec c4 FDB STR STR$
0485 e223 ee dd FDB VAL VAL
0486 e225 ee 67 FDB ASC ASC
0487 e227 ee 53 FDB CHR CHR$
0488 e229 f7 ad FDB ATN ATN
0489 e22b f7 75 FDB COS COS
0490 e22d f7 7e FDB TAN TAN
0491 e22f f8 ef FDB EXP EXP
0492 e231 f9 21 FDB FIX FIX
0493 e233 f8 43 FDB LOG LOG
0494 e235 fa a9 FDB POS POS
0495 e237 f8 7d FDB SQR SQR
0496 e239 ff 7b FDB HEXDOL HEX$
0497 * LEFT, RIGHT AND MID ARE TREATED SEPARATELY
0498 e23b ee 72 FDB LEFT LEFT$
0499 0095 TOK_LEFT EQU *-FUNC_TAB/2+$7F
0500 e23d ee 8f FDB RIGHT RIGHT$
0501 e23f ee 96 FDB MID MID$
0502 0097 TOK_MID EQU *-FUNC_TAB/2+$7F
0503 * REMAINING FUNCTIONS
0504 e241 e1 dd FDB INKEY INKEY$
0505 0098 TOK_INKEY EQU *-FUNC_TAB/2+$7F
0506 e243 ec b5 FDB MEM MEM
0507 e245 fa b1 FDB VARPT VARPTR
0508 e247 fb 71 FDB INSTR INSTR
0509 e249 fb 41 FDB STRING STRING$
0510 001d NUM_SEC_FNS EQU *-FUNC_TAB/2
0511
0512 * THIS TABLE CONTAINS PRECEDENCES AND DISPATCH ADDRESSES FOR ARITHMETIC
0513 * AND LOGICAL OPERATORS - THE NEGATION OPERATORS DO NOT ACT ON TWO OPERANDS
0514 * S0 THEY ARE NOT LISTED IN THIS TABLE. THEY ARE TREATED SEPARATELY IN THE
0515 * EXPRESSION EVALUATION ROUTINE. THEY ARE:
0516 * UNARY NEGATION (-), PRECEDENCE &7D AND LOGICAL NEGATION (NOT), PRECEDENCE $5A
0517 * THE RELATIONAL OPERATORS < > = ARE ALSO NOT LISTED, PRECEDENCE $64.
0518 * A PRECEDENCE VALUE OF ZERO INDICATES END OF EXPRESSION OR PARENTHESES
0519 *
0520 e24b 79 LAA51 FCB $79
0521 e24c f1 4e FDB LB9C5 +
0522 e24e 79 FCB $79
0523 e24f f1 45 FDB LB9BC -
0524 e251 7b FCB $7B
0525 e252 f2 55 FDB LBACC *
0526 e254 7b FCB $7B
0527 e255 f3 1a FDB LBB91 /
0528 e257 7f FCB $7F
0529 e258 f8 86 FDB L8489 EXPONENTIATION
0530 e25a 50 FCB $50
0531 e25b ea 9c FDB LB2D5 AND
0532 e25d 46 FCB $46
0533 e25e ea 9b FDB LB2D4 OR
0534
0535 * THIS IS THE RESERVED WORD TABLE
0536 * FIRST PART OF THE TABLE CONTAINS EXECUTABLE COMMANDS
0537 e260 46 4f LAA66 FCC "FO" 80
0538 e262 d2 FCB $80+'R'
0539 e263 47 FCC "G" 81
0540 e264 cf FCB $80+'O'
0541 0081 TOK_GO EQU $81
0542 e265 52 45 FCC "RE" 82
0543 e267 cd FCB $80+'M'
0544 e268 a7 FCB ''+$80 83
0545 e269 45 4c 53 FCC "ELS" 84
0546 e26c c5 FCB $80+'E'
0547 e26d 49 FCC "I" 85
0548 e26e c6 FCB $80+'F'
0549 e26f 44 41 54 FCC "DAT" 86
0550 e272 c1 FCB $80+'A'
0551 e273 50 52 49 4e FCC "PRIN" 87
0552 e277 d4 FCB $80+'T'
0553 e278 4f FCC "O" 88
0554 e279 ce FCB $80+'N'
0555 e27a 49 4e 50 55 FCC "INPU" 89
0556 e27e d4 FCB $80+'T'
0557 e27f 45 4e FCC "EN" 8A
0558 e281 c4 FCB $80+'D'
0559 e282 4e 45 58 FCC "NEX" 8B
0560 e285 d4 FCB $80+'T'
0561 e286 44 49 FCC "DI" 8C
0562 e288 cd FCB $80+'M'
0563 e289 52 45 41 FCC "REA" 8D
0564 e28c c4 FCB $80+'D'
0565 e28d 52 55 FCC "RU" 8E
0566 e28f ce FCB $80+'N'
0567 e290 52 45 53 54 4f 52 FCC "RESTOR" 8F
0568 e296 c5 FCB $80+'E'
0569 e297 52 45 54 55 52 FCC "RETUR" 90
0570 e29c ce FCB $80+'N'
0571 e29d 53 54 4f FCC "STO" 91
0572 e2a0 d0 FCB $80+'P'
0573 e2a1 50 4f 4b FCC "POK" 92
0574 e2a4 c5 FCB $80+'E'
0575 e2a5 43 4f 4e FCC "CON" 93
0576 e2a8 d4 FCB $80+'T'
0577 e2a9 4c 49 53 FCC "LIS" 94
0578 e2ac d4 FCB $80+'T'
0579 e2ad 43 4c 45 41 FCC "CLEA" 95
0580 e2b1 d2 FCB $80+'R'
0581 e2b2 4e 45 FCC "NE" 96
0582 e2b4 d7 FCB $80+'W'
0583 e2b5 45 58 45 FCC "EXE" 97
0584 e2b8 c3 FCB $80+'C'
0585 e2b9 54 52 4f FCC "TRO" 98
0586 e2bc ce FCB $80+'N'
0587 e2bd 54 52 4f 46 FCC "TROF" 99
0588 e2c1 c6 FCB $80+'F'
0589 e2c2 44 45 FCC "DE" 9A
0590 e2c4 cc FCB $80+'L'
0591 e2c5 44 45 FCC "DE" 9B
0592 e2c7 c6 FCB $80+'F'
0593 e2c8 4c 49 4e FCC "LIN" 9C
0594 e2cb c5 FCB $80+'E'
0595 e2cc 52 45 4e 55 FCC "RENU" 9D
0596 e2d0 cd FCB $80+'M'
0597 e2d1 45 44 49 FCC "EDI" 9E
0598 e2d4 d4 FCB $80+'T'
0599 * END OF EXECUTABLE COMMANDS. THE REMAINDER OF THE TABLE ARE NON-EXECUTABLE TOKENS
0600 e2d5 54 41 42 FCC "TAB" 9F
0601 e2d8 a8 FCB $80+'('
0602 009f TOK_TAB EQU $9F
0603 e2d9 54 FCC "T" A0
0604 e2da cf FCB $80+'O'
0605 00a0 TOK_TO EQU $A0
0606 e2db 53 55 FCC "SU" A1
0607 e2dd c2 FCB $80+'B'
0608 00a1 TOK_SUB EQU $A1
0609 e2de 54 48 45 FCC "THE" A2
0610 e2e1 ce FCB $80+'N'
0611 00a2 TOK_THEN EQU $A2
0612 e2e2 4e 4f FCC "NO" A3
0613 e2e4 d4 FCB $80+'T'
0614 00a3 TOK_NOT EQU $A3
0615 e2e5 53 54 45 FCC "STE" A4
0616 e2e8 d0 FCB $80+'P'
0617 00a4 TOK_STEP EQU $A4
0618 e2e9 4f 46 FCC "OF" A5
0619 e2eb c6 FCB $80+'F'
0620 e2ec ab FCB '++$80 A6
0621 00a6 TOK_PLUS EQU $A6
0622 e2ed ad FCB '-+$80 A7
0623 00a7 TOK_MINUS EQU $A7
0624 e2ee aa FCB '*+$80 A8
0625 e2ef af FCB '/+$80 A9
0626 e2f0 de FCB '^+$80 AA
0627 e2f1 41 4e FCC "AN" AB
0628 e2f3 c4 FCB $80+'D'
0629 e2f4 4f FCC "O" AC
0630 e2f5 d2 FCB $80+'R'
0631 e2f6 be FCB '>+$80 AD
0632 00ad TOK_GREATER EQU $AD
0633 e2f7 bd FCB '=+$80 AE
0634 00ae TOK_EQUALS EQU $AE
0635 e2f8 bc FCB '<+$80 AF
0636 e2f9 46 FCC "F" B0
0637 e2fa ce FCB $80+'N'
0638 00b0 TOK_FN EQU $B0
0639 e2fb 55 53 49 4e FCC "USIN" B1
0640 e2ff c7 FCB $80+'G'
0641 *
0642
0643 * FIRST SET ALWAYS HAS ONE PARAMETER
0644 e300 53 47 LAB1A FCC "SG" 80
0645 e302 ce FCB $80+'N'
0646 e303 49 4e FCC "IN" 81
0647 e305 d4 FCB $80+'T'
0648 e306 41 42 FCC "AB" 82
0649 e308 d3 FCB $80+'S'
0650 e309 55 53 FCC "US" 83
0651 e30b d2 FCB $80+'R'
0652 e30c 52 4e FCC "RN" 84
0653 e30e c4 FCB $80+'D'
0654 e30f 53 49 FCC "SI" 85
0655 e311 ce FCB $80+'N'
0656 e312 50 45 45 FCC "PEE" 86
0657 e315 cb FCB $80+'K'
0658 e316 4c 45 FCC "LE" 87
0659 e318 ce FCB $80+'N'
0660 e319 53 54 52 FCC "STR" 88
0661 e31c a4 FCB $80+'$'
0662 e31d 56 41 FCC "VA" 89
0663 e31f cc FCB $80+'L'
0664 e320 41 53 FCC "AS" 8A
0665 e322 c3 FCB $80+'C'
0666 e323 43 48 52 FCC "CHR" 8B
0667 e326 a4 FCB $80+'$'
0668 e327 41 54 FCC "AT" 8C
0669 e329 ce FCB $80+'N'
0670 e32a 43 4f FCC "CO" 8D
0671 e32c d3 FCB $80+'S'
0672 e32d 54 41 FCC "TA" 8E
0673 e32f ce FCB $80+'N'
0674 e330 45 58 FCC "EX" 8F
0675 e332 d0 FCB $80+'P'
0676 e333 46 49 FCC "FI" 90
0677 e335 d8 FCB $80+'X'
0678 e336 4c 4f FCC "LO" 91
0679 e338 c7 FCB $80+'G'
0680 e339 50 4f FCC "PO" 92
0681 e33b d3 FCB $80+'S'
0682 e33c 53 51 FCC "SQ" 93
0683 e33e d2 FCB $80+'R'
0684 e33f 48 45 58 FCC "HEX" 94
0685 e342 a4 FCB $80+'$'
0686 * LEFT, RIGHT AND MID ARE TREATED SEPARATELY
0687 e343 4c 45 46 54 FCC "LEFT" 95
0688 e347 a4 FCB $80+'$'
0689 e348 52 49 47 48 54 FCC "RIGHT" 96
0690 e34d a4 FCB $80+'$'
0691 e34e 4d 49 44 FCC "MID" 97
0692 e351 a4 FCB $80+'$'
0693 * REMAINING FUNCTIONS
0694 e352 49 4e 4b 45 59 FCC "INKEY" 98
0695 e357 a4 FCB $80+'$'
0696 e358 4d 45 FCC "ME" 99
0697 e35a cd FCB $80+'M'
0698 e35b 56 41 52 50 54 FCC "VARPT" 9A
0699 e360 d2 FCB $80+'R'
0700 e361 49 4e 53 54 FCC "INST" 9B
0701 e365 d2 FCB $80+'R'
0702 e366 53 54 52 49 4e 47 FCC "STRING" 9C
0703 e36c a4 FCB $80+'$'
0704
0705 *
0706 * DISPATCH TABLE FOR COMMANDS TOKEN #
0707 CMD_TAB
0708 e36d e5 2b LAB67 FDB FOR 80
0709 e36f e6 76 FDB GO 81
0710 e371 e6 d3 FDB REM 82
0711 0082 TOK_REM EQU *-CMD_TAB/2+$7F
0712 e373 e6 d3 FDB REM 83 (')
0713 0083 TOK_SNGL_Q EQU *-CMD_TAB/2+$7F
0714 e375 e6 d3 FDB REM 84 (ELSE)
0715 0084 TOK_ELSE EQU *-CMD_TAB/2+$7F
0716 e377 e7 04 FDB IF 85
0717 0085 TOK_IF EQU *-CMD_TAB/2+$7F
0718 e379 e6 d0 FDB DATA 86
0719 0086 TOK_DATA EQU *-CMD_TAB/2+$7F
0720 e37b f0 ad FDB PRINT 87
0721 0087 TOK_PRINT EQU *-CMD_TAB/2+$7F
0722 e37d e7 32 FDB ON 88
0723 e37f e7 df FDB INPUT 89
0724 0089 TOK_INPUT EQU *-CMD_TAB/2+$7F
0725 e381 e5 fd FDB END 8A
0726 e383 e8 c4 FDB NEXT 8B
0727 e385 eb 15 FDB DIM 8C
0728 e387 e8 19 FDB READ 8D
0729 e389 e6 6b FDB RUN 8E
0730 e38b e5 df FDB RESTOR 8F
0731 e38d e6 b0 FDB RETURN 90
0732 e38f e6 01 FDB STOP 91
0733 e391 ef 1e FDB POKE 92
0734 e393 e6 26 FDB CONT 93
0735 e395 ef 25 FDB LIST 94
0736 e397 e6 37 FDB CLEAR 95
0737 e399 e4 fb FDB NEW 96
0738 e39b e1 cf FDB EXEC 97
0739 e39d fa a4 FDB TRON 98
0740 e39f fa a5 FDB TROFF 99
0741 e3a1 fd 20 FDB DEL 9A
0742 e3a3 fc 64 FDB DEF 9B
0743 e3a5 ff bf FDB LINE 9C
0744 e3a7 fd aa FDB RENUM 9D
0745 e3a9 f9 30 FDB EDIT 9E
0746 009e TOK_HIGH_EXEC EQU *-CMD_TAB/2+$7F
0747
0748 * ERROR MESSAGES AND THEIR NUMBERS AS USED INTERNALLY
0749 e3ab 4e 46 LABAF FCC "NF" 0 NEXT WITHOUT FOR
0750 e3ad 53 4e FCC "SN" 1 SYNTAX ERROR
0751 e3af 52 47 FCC "RG" 2 RETURN WITHOUT GOSUB
0752 e3b1 4f 44 FCC "OD" 3 OUT OF DATA
0753 e3b3 46 43 FCC "FC" 4 ILLEGAL FUNCTION CALL
0754 e3b5 4f 56 FCC "OV" 5 OVERFLOW
0755 e3b7 4f 4d FCC "OM" 6 OUT OF MEMORY
0756 e3b9 55 4c FCC "UL" 7 UNDEFINED LINE NUMBER
0757 e3bb 42 53 FCC "BS" 8 BAD SUBSCRIPT
0758 e3bd 44 44 FCC "DD" 9 REDIMENSIONED ARRAY
0759 e3bf 2f 30 FCC "/0" 10 DIVISION BY ZERO
0760 e3c1 49 44 FCC "ID" 11 ILLEGAL DIRECT STATEMENT
0761 e3c3 54 4d FCC "TM" 12 TYPE MISMATCH
0762 e3c5 4f 53 FCC "OS" 13 OUT OF STRING SPACE
0763 e3c7 4c 53 FCC "LS" 14 STRING TOO LONG
0764 e3c9 53 54 FCC "ST" 15 STRING FORMULA TOO COMPLEX
0765 e3cb 43 4e FCC "CN" 16 CAN'T CONTINUE
0766 e3cd 46 44 FCC "FD" 17 BAD FILE DATA
0767 e3cf 41 4f FCC "AO" 18 FILE ALREADY OPEN
0768 e3d1 44 4e FCC "DN" 19 DEVICE NUMBER ERROR
0769 e3d3 49 4f FCC "IO" 20 I/O ERROR
0770 e3d5 46 4d FCC "FM" 21 BAD FILE MODE
0771 e3d7 4e 4f FCC "NO" 22 FILE NOT OPEN
0772 e3d9 49 45 FCC "IE" 23 INPUT PAST END OF FILE
0773 e3db 44 53 FCC "DS" 24 DIRECT STATEMENT IN FILE
0774 * ADDITIONAL ERROR MESSAGES ADDED BY EXTENDED BASIC
0775 e3dd 55 46 L890B FCC "UF" 25 UNDEFINED FUNCTION (FN) CALL
0776 e3df 4e 45 L890D FCC "NE" 26 FILE NOT FOUND
0777
0778 e3e1 20 45 52 52 4f 52 LABE1 FCC " ERROR"
0779 e3e7 00 FCB $00
0780 e3e8 20 49 4e 20 LABE8 FCC " IN "
0781 e3ec 00 FCB $00
0782 e3ed 0d LABED FCB CR
0783 e3ee 4f 4b LABEE FCC "OK"
0784 e3f0 0d 00 FCB CR,$00
0785 e3f2 0d LABF2 FCB CR
0786 e3f3 42 52 45 41 4b FCC "BREAK"
0787 e3f8 00 FCB $00
0788
0789 * SEARCH THE STACK FOR <20>GOSUB/RETURN<52> OR <20>FOR/NEXT<58> DATA.
0790 * THE <20>FOR/NEXT<58> INDEX VARIABLE DESCRIPTOR ADDRESS BEING
0791 * SOUGHT IS STORED IN VARDES. EACH BLOCK OF FOR/NEXT DATA IS 18
0792 * BYTES WITH A $80 LEADER BYTE AND THE GOSUB/RETURN DATA IS 5 BYTES
0793 * WITH AN $A6 LEADER BYTE. THE FIRST NON "FOR/NEXT" DATA
0794 * IS CONSIDERED <20>GOSUB/RETURN<52>
0795 e3f9 30 64 LABF9 LEAX 4,S POINT X TO 3RD ADDRESS ON STACK - IGNORE THE
0796 * FIRST TWO RETURN ADDRESSES ON THE STACK
0797 e3fb c6 12 LABFB LDB #18 18 BYTES SAVED ON STACK FOR EACH <20>FOR<4F> LOOP
0798 e3fd 9f 0f STX TEMPTR SAVE POINTER
0799 e3ff a6 84 LDA ,X GET 1ST BYTE
0800 e401 80 80 SUBA #$80 * CHECK FOR TYPE OF STACK JUMP FOUND
0801 e403 26 15 BNE LAC1A * BRANCH IF NOT <20>FOR/NEXT<58>
0802 e405 ae 01 LDX 1,X = GET INDEX VARIABLE DESCRIPTOR
0803 e407 9f 11 STX TMPTR1 = POINTER AND SAVE IT IN TMPTR1
0804 e409 9e 3b LDX VARDES GET INDEX VARIABLE BEING SEARCHED FOR
0805 e40b 27 09 BEQ LAC16 BRANCH IF DEFAULT INDEX VARIABLE - USE THE
0806 * FIRST <20>FOR/NEXT<58> DATA FOUND ON STACK
0807 * IF NO INDEX VARIABLE AFTER <20>NEXT<58>
0808 e40d 9c 11 CMPX TMPTR1 DOES THE STACK INDEX MATCH THE ONE
0809 * BEING SEARCHED FOR?
0810 e40f 27 09 BEQ LAC1A YES
0811 e411 9e 0f LDX TEMPTR * RESTORE INITIAL POINTER, ADD
0812 e413 3a ABX * 18 TO IT AND LOOK FOR
0813 e414 20 e5 BRA LABFB * NEXT BLOCK OF DATA
0814 e416 9e 11 LAC16 LDX TMPTR1 = GET 1ST INDEX VARIABLE FOUND AND
0815 e418 9f 3b STX VARDES = SAVE AS <20>NEXT<58> INDEX
0816 e41a 9e 0f LAC1A LDX TEMPTR POINT X TO START OF <20>FOR/NEXT<58> DATA
0817 e41c 4d TSTA SET ZERO FLAG IF <20>FOR/NEXT<58> DATA
0818 e41d 39 RTS
0819 * CHECK FOR MEMORY SPACE FOR NEW TOP OF
0820 * ARRAYS AND MOVE ARRAYS TO NEW LOCATION
0821 e41e 8d 17 LAC1E BSR LAC37 ACCD = NEW BOTTOM OF FREE RAM - IS THERE
0822 * ROOM FOR THE STACK?
0823 * MOVE BYTES FROM V43(X) TO V41(U) UNTIL (X) = V47 AND
0824 * SAVE FINAL VALUE OF U IN V45
0825 e420 de 41 LAC20 LDU V41 POINT U TO DESTINATION ADDRESS (V41)
0826 e422 33 41 LEAU 1,U ADD ONE TO U - COMPENSATE FOR FIRST PSHU
0827 e424 9e 43 LDX V43 POINT X TO SOURCE ADDRESS (V43)
0828 e426 30 01 LEAX 1,X ADD ONE - COMPENSATE FOR FIRST LDA ,X
0829 e428 a6 82 LAC28 LDA ,-X GRAB A BYTE FROM SOURCE
0830 e42a 36 02 PSHU A MOVE IT TO DESTINATION
0831 e42c 9c 47 CMPX V47 DONE?
0832 e42e 26 f8 BNE LAC28 NO - KEEP MOVING BYTES
0833 e430 df 45 STU V45 SAVE FINAL DESTINATION ADDRESS
0834 e432 39 LAC32 RTS
0835 * CHECK TO SEE IF THERE IS ROOM TO STORE 2*ACCB
0836 * BYTES IN FREE RAM - OM ERROR IF NOT
0837 e433 4f LAC33 CLRA * ACCD CONTAINS NUMBER OF EXTRA
0838 e434 58 ASLB * BYTES TO PUT ON STACK
0839 e435 d3 1f ADDD ARYEND END OF PROGRAM AND VARIABLES
0840 e437 c3 00 3a LAC37 ADDD #STKBUF ADD STACK BUFFER - ROOM FOR STACK?
0841 e43a 25 08 BCS LAC44 BRANCH IF GREATER THAN $FFFF
0842 e43c 10 df 17 STS BOTSTK CURRENT NEW BOTTOM OF STACK STACK POINTER
0843 e43f 10 93 17 CMPD BOTSTK ARE WE GOING TO BE BELOW STACK?
0844 e442 25 ee BCS LAC32 YES - NO ERROR
0845 e444 c6 0c LAC44 LDB #6*2 OUT OF MEMORY ERROR
0846
0847 * ERROR SERVICING ROUTINE
0848 e446 bd e5 17 LAC46 JSR LAD33 RESET STACK, STRING STACK, CONTINUE POINTER
0849 e449 bd f0 e9 JSR LB95C SEND A CR TO SCREEN
0850 e44c bd f1 38 JSR LB9AF SEND A <20>?<3F> TO SCREEN
0851 e44f 8e e3 ab LDX #LABAF POINT TO ERROR TABLE
0852 e452 3a LAC60 ABX ADD MESSAGE NUMBER OFFSET
0853 e453 8d 31 BSR LACA0 * GET TWO CHARACTERS FROM X AND
0854 e455 8d 2f BSR LACA0 * SEND TO CONSOLE OUT (SCREEN)
0855 e457 8e e3 e0 LDX #LABE1-1 POINT TO "ERROR" MESSAGE
0856 e45a bd f1 25 LAC68 JSR LB99C PRINT MESSAGE POINTED TO BY X
0857 e45d 96 68 LDA CURLIN GET CURRENT LINE NUMBER (CURL IN)
0858 e45f 4c INCA TEST FOR DIRECT MODE
0859 e460 27 03 BEQ LAC73 BRANCH IF DIRECT MODE
0860 e462 bd f5 4e JSR LBDC5 PRINT <20>IN ****<2A>
0861
0862 * THIS IS THE MAIN LOOP OF BASIC WHEN IN DIRECT MODE
0863 e465 bd f0 e9 LAC73 JSR LB95C MOVE CURSOR TO START OF LINE
0864 e468 8e e3 ed LDX #LABED POINT X TO <20>OK<4F>, CR MESSAGE
0865 e46b bd f1 25 JSR LB99C PRINT <20>OK<4F>, CR
0866 e46e bd e1 81 LAC7C JSR LA390 GO GET AN INPUT LINE
0867 e471 ce ff ff LDU #$FFFF THE LINE NUMBER FOR DIRECT MODE IS $FFFF
0868 e474 df 68 STU CURLIN SAVE IT IN CURLIN
0869 e476 25 f6 BCS LAC7C BRANCH IF LINE INPUT TERMINATED BY BREAK
0870 e478 9f 83 STX CHARAD SAVE (X) AS CURRENT INPUT POINTER - THIS WILL
0871 * ENABLE THE <20>LIVE KEYBOARD<52> (DIRECT) MODE. THE
0872 * LINE JUST ENTERED WILL BE INTERPRETED
0873 e47a 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC
0874 e47c 27 f0 BEQ LAC7C NO LINE INPUT - GET ANOTHER LINE
0875 e47e 25 0b BCS LACA5 BRANCH IF NUMER1C - THERE WAS A LINE NUMBER BEFORE
0876 * THE STATEMENT ENTERED, SO THIS STATEMENT
0877 * WILL BE MERGED INTO THE BASIC PROGRAM
0878 e480 bd ef da JSR LB821 GO CRUNCH LINE
0879 e483 7e e5 b4 JMP LADC0 GO EXECUTE THE STATEMENT (LIVE KEYBOARD)
0880 *
0881 e486 a6 80 LACA0 LDA ,X+ GET A CHARACTER
0882 e488 7e f1 3a JMP LB9B1 SEND TO CONSOLE OUT
0883 * TAKE A LINE FROM THE LINE INPUT BUFFER
0884 * AND INSERT IT INTO THE BASIC PROGRAM
0885 e48b bd e7 57 LACA5 JSR LAF67 CONVERT LINE NUMBER TO BINARY
0886 e48e 9e 2b LACA8 LDX BINVAL GET CONVERTED LINE NUMBER
0887 e490 9f f1 STX LINHDR STORE IT IN LINE INPUT HEADER
0888 e492 bd ef da JSR LB821 GO CRUNCH THE LINE
0889 e495 d7 03 STB TMPLOC SAVE LINE LENGTH
0890 e497 8d 4c BSR LAD01 FIND OUT WHERE TO INSERT LINE
0891 e499 25 12 BCS LACC8 BRANCH IF LINE NUMBER DOES NOT ALREADY EXIST
0892 e49b dc 47 LDD V47 GET ABSOLUTE ADDRESS OF LINE NUMBER
0893 e49d a3 84 SUBD ,X SUBTRACT ADDRESS OF NEXT LINE NUMBER
0894 e49f d3 1b ADDD VARTAB * ADD TO CURRENT END OF PROGRAM - THIS WILL REMOVE
0895 e4a1 dd 1b STD VARTAB * THE LENGTH OF THIS LINE NUMBER FROM THE PROGRAM
0896 e4a3 ee 84 LDU ,X POINT U TO ADDRESS OF NEXT LINE NUMBER
0897 * DELETE OLD LINE FROM BASIC PROGRAM
0898 e4a5 37 02 LACC0 PULU A GET A BYTE FROM WHAT<41>S LEFT OF PROGRAM
0899 e4a7 a7 80 STA ,X+ MOVE IT DOWN
0900 e4a9 9c 1b CMPX VARTAB COMPARE TO END OF BASIC PROGRAM
0901 e4ab 26 f8 BNE LACC0 BRANCH IF NOT AT END
0902 e4ad 96 f3 LACC8 LDA LINBUF * CHECK TO SEE IF THERE IS A LINE IN
0903 e4af 27 1c BEQ LACE9 * THE BUFFER AND BRANCH IF NONE
0904 e4b1 dc 1b LDD VARTAB = SAVE CURRENT END OF
0905 e4b3 dd 43 STD V43 = PROGRAM IN V43
0906 e4b5 db 03 ADDB TMPLOC * ADD LENGTH OF CRUNCHED LINE,
0907 e4b7 89 00 ADCA #0 * PROPOGATE CARRY AND SAVE NEW END
0908 e4b9 dd 41 STD V41 * OF PROGRAM IN V41
0909 e4bb bd e4 1e JSR LAC1E = MAKE SURE THERE<52>S ENOUGH RAM FOR THIS
0910 * = LINE & MAKE A HOLE IN BASIC FOR NEW LINE
0911 e4be ce 00 ef LDU #LINHDR-2 POINT U TO LINE TO BE INSERTED
0912 e4c1 37 02 LACDD PULU A GET A BYTE FROM NEW LINE
0913 e4c3 a7 80 STA ,X+ INSERT IT IN PROGRAM
0914 e4c5 9c 45 CMPX V45 * COMPARE TO ADDRESS OF END OF INSERTED
0915 e4c7 26 f8 BNE LACDD * LINE AND BRANCH IF NOT DONE
0916 e4c9 9e 41 LDX V41 = GET AND SAVE
0917 e4cb 9f 1b STX VARTAB = END OF PROGRAM
0918 e4cd 8d 36 LACE9 BSR LAD21 RESET INPUT POINTER, CLEAR VARIABLES, INITIALIZE
0919 e4cf 8d 02 BSR LACEF ADJUST START OF NEXT LINE ADDRESSES
0920 e4d1 20 9b BRA LAC7C REENTER BASIC<49>S INPUT LOOP
0921 * COMPUTE THE START OF NEXT LINE ADDRESSES FOR THE BASIC PROGRAM
0922 e4d3 9e 19 LACEF LDX TXTTAB POINT X TO START OF PROGRAM
0923 e4d5 ec 84 LACF1 LDD ,X GET ADDRESS OF NEXT LINE
0924 e4d7 27 21 BEQ LAD16 RETURN IF END OF PROGRAM
0925 e4d9 33 04 LEAU 4,X POINT U TO START OF BASIC TEXT IN LINE
0926 e4db a6 c0 LACF7 LDA ,U+ * SKIP THROUGH THE LINE UNTIL A
0927 e4dd 26 fc BNE LACF7 * ZERO (END OF LINE) IS FOUND
0928 e4df ef 84 STU ,X SAVE THE NEW START OF NEXT LINE ADDRESS
0929 e4e1 ae 84 LDX ,X POINT X TO START OF NEXT LINE
0930 e4e3 20 f0 BRA LACF1 KEEP GOING
0931 *
0932 * FIND A LINE NUMBER IN THE BASIC PROGRAM
0933 * RETURN WITH CARRY SET IF NO MATCH FOUND
0934 e4e5 dc 2b LAD01 LDD BINVAL GET THE LINE NUMBER TO FIND
0935 e4e7 9e 19 LDX TXTTAB BEGINNING OF PROGRAM
0936 e4e9 ee 84 LAD05 LDU ,X GET ADDRESS OF NEXT LINE NUMBER
0937 e4eb 27 09 BEQ LAD12 BRANCH IF END OF PROG
0938 e4ed 10 a3 02 CMPD 2,X IS IT A MATCH?
0939 e4f0 23 06 BLS LAD14 CARRY SET IF LOWER; CARRY CLEAR IF MATCH
0940 e4f2 ae 84 LDX ,X X = ADDRESS OF NEXT LINE
0941 e4f4 20 f3 BRA LAD05 KEEP LOOPING FOR LINE NUMBER
0942 e4f6 1a 01 LAD12 ORCC #1 SET CARRY FLAG
0943 e4f8 9f 47 LAD14 STX V47 SAVE MATCH LINE NUMBER OR NUMBER OF LINE JUST AFTER
0944 * WHERE IT SHOULD HAVE BEEN
0945 e4fa 39 LAD16 RTS
0946
0947 * NEW
0948 e4fb 26 fb NEW BNE LAD14 BRANCH IF ARGUMENT GIVEN
0949 e4fd 9e 19 LAD19 LDX TXTTAB GET START OF BASIC
0950 e4ff 6f 80 CLR ,X+ * PUT 2 ZERO BYTES THERE - ERASE
0951 e501 6f 80 CLR ,X+ * THE BASIC PROGRAM
0952 e503 9f 1b STX VARTAB AND THE NEXT ADDRESS IS NOW THE END OF PROGRAM
0953 e505 9e 19 LAD21 LDX TXTTAB GET START OF BASIC
0954 e507 bd e6 ab JSR LAEBB PUT INPUT POINTER ONE BEFORE START OF BASIC
0955 * ERASE ALL VARIABLES
0956 e50a 9e 27 LAD26 LDX MEMSIZ * RESET START OF STRING VARIABLES
0957 e50c 9f 23 STX STRTAB * TO TOP OF STRING SPACE
0958 e50e bd e5 df JSR RESTOR RESET <20>DATA<54> POINTER TO START OF BASIC
0959 e511 9e 1b LDX VARTAB * GET START OF VARIABLES AND USE IT
0960 e513 9f 1d STX ARYTAB * TO RESET START OF ARRAYS
0961 e515 9f 1f STX ARYEND RESET END OF ARRAYS
0962 e517 8e 00 c9 LAD33 LDX #STRSTK * RESET STRING STACK POINTER TO
0963 e51a 9f 0b STX TEMPPT * BOTTOM OF STRING STACK
0964 e51c ae e4 LDX ,S GET RETURN ADDRESS OFF STACK
0965 e51e 10 de 21 LDS FRETOP RESTORE STACK POINTER
0966 e521 6f e2 CLR ,-S PUT A ZERO BYTE ON STACK - TO CLEAR ANY RETURN OF
0967 * FOR/NEXT DATA FROM THE STACK
0968 e523 0f 2d CLR OLDPTR RESET <20>CONT<4E> ADDRESS SO YOU
0969 e525 0f 2e CLR OLDPTR+1 <20>CAN<41>T CONTINUE<55>
0970 e527 0f 08 CLR ARYDIS CLEAR THE ARRAY DISABLE FLAG
0971 e529 6e 84 JMP ,X RETURN TO CALLING ROUTINE - THIS IS NECESSARY
0972 * SINCE THE STACK WAS RESET
0973 *
0974 * FOR
0975 *
0976 * THE FOR COMMAND WILL STORE 18 BYTES ON THE STACK FOR
0977 * EACH FOR-NEXT LOOP WHICH IS BEING PROCESSED. THESE
0978 * BYTES ARE DEFINED AS FOLLOWS: 0- $80 (FOR FLAG);
0979 * 1,2=INDEX VARIABLE DESCRIPTOR POINTER; 3-7=FP VALUE OF STEP;
0980 * 8=STEP DIRECTION: $FF IF NEGATIVE; 0 IF ZERO; 1 IF POSITIVE;
0981 * 9-13=FP VALUE OF <20>TO<54> PARAMETER;
0982 * 14,15=CURRENT LINE NUMBER; 16,17=RAM ADDRESS OF THE END
0983 * OF THE LINE CONTAINING THE <20>FOR<4F> STATEMENT
0984 e52b 86 80 FOR LDA #$80 * SAVE THE DISABLE ARRAY FLAG IN VO8
0985 e52d 97 08 STA ARYDIS * DO NOT ALLOW THE INDEX VARIABLE TO BE AN ARRAY
0986 e52f bd e7 79 JSR LET SET INDEX VARIABLE TO INITIAL VALUE
0987 e532 bd e3 f9 JSR LABF9 SEARCH THE STACK FOR <20>FOR/NEXT<58> DATA
0988 e535 32 62 LEAS 2,S PURGE RETURN ADDRESS OFF OF THE STACK
0989 e537 26 04 BNE LAD59 BRANCH IF INDEX VARIABLE NOT ALREADY BEING USED
0990 e539 9e 0f LDX TEMPTR GET (ADDRESS + 18) OF MATCHED <20>FOR/NEXT<58> DATA
0991 e53b 32 85 LEAS B,X MOVE THE STACK POINTER TO THE BEGINNING OF THE
0992 * MATCHED <20>FOR/NEXT<58> DATA SO THE NEW DATA WILL
0993 * OVERLAY THE OLD DATA. THIS WILL ALSO DESTROY
0994 * ALL OF THE <20>RETURN<52> AND <20>FOR/NEXT<58> DATA BELOW
0995 * THIS POINT ON THE STACK
0996 e53d c6 09 LAD59 LDB #$09 * CHECK FOR ROOM FOR 18 BYTES
0997 e53f bd e4 33 JSR LAC33 * IN FREE RAM
0998 e542 bd e6 d8 JSR LAEE8 GET ADDR OF END OF SUBLINE IN X
0999 e545 dc 68 LDD CURLIN GET CURRENT LINE NUMBER
1000 e547 34 16 PSHS X,B,A SAVE LINE ADDR AND LINE NUMBER ON STACK
1001 e549 c6 a0 LDB #TOK_TO TOKEN FOR <20>TO<54>
1002 e54b bd ea 3b JSR LB26F SYNTAX CHECK FOR <20>TO<54>
1003 e54e bd e9 0f JSR LB143 <20>TM<54> ERROR IF INDEX VARIABLE SET TO STRING
1004 e551 bd e9 0d JSR LB141 EVALUATE EXPRESSION
1005 *
1006 e554 d6 54 LDB FP0SGN GET FPA0 MANTISSA SIGN
1007 e556 ca 7f ORB #$7F FORM A MASK TO SAVE DATA BITS OF HIGH ORDER MANTISSA
1008 e558 d4 50 ANDB FPA0 PUT THE MANTISSA SIGN IN BIT 7 OF HIGH ORDER MANTISSA
1009 e55a d7 50 STB FPA0 SAVE THE PACKED HIGH ORDER MANTISSA
1010 e55c 10 8e e5 63 LDY #LAD7F LOAD FOLLOWING ADDRESS INTO Y AS A RETURN
1011 e560 7e e9 b6 JMP LB1EA ADDRESS - PUSH FPA0 ONTO THE STACK
1012 e563 8e f2 4e LAD7F LDX #LBAC5 POINT X TO FLOATING POINT NUMBER 1.0 (DEFAULT STEP VALUE)
1013 e566 bd f3 9d JSR LBC14 MOVE (X) TO FPA0
1014 e569 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1015 e56b 81 a4 CMPA #TOK_STEP STEP TOKEN
1016 e56d 26 05 BNE LAD90 BRANCH IF NO <20>STEP<45> VALUE
1017 e56f 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC
1018 e571 bd e9 0d JSR LB141 EVALUATE NUMERIC EXPRESSION
1019 e574 bd f3 f6 LAD90 JSR LBC6D CHECK STATUS OF FPA0
1020 e577 bd e9 b2 JSR LB1E6 SAVE STATUS AND FPA0 ON THE STACK
1021 e57a dc 3b LDD VARDES * GET DESCRIPTOR POINTER FOR THE <20>STEP<45>
1022 e57c 34 06 PSHS B,A * VARIABLE AND SAVE IT ON THE STACK
1023 e57e 86 80 LDA #$80 = GET THE <20>FOR<4F> FLAG AND
1024 e580 34 02 PSHS A = SAVE IT ON THE STACK
1025 *
1026 * MAIN COMMAND INTERPRETATION LOOP
1027 e582 1c af LAD9E ANDCC #$AF ENABLE IRQ,FIRQ
1028 e584 8d 60 BSR LADEB CHECK FOR KEYBOARD BREAK
1029 e586 9e 83 LDX CHARAD GET BASIC<49>S INPUT POINTER
1030 e588 9f 2f STX TINPTR SAVE IT
1031 e58a a6 80 LDA ,X+ GET CURRENT INPUT CHAR & MOVE POINTER
1032 e58c 27 07 BEQ LADB4 BRANCH IF END OF LINE
1033 e58e 81 3a CMPA #': CHECK FOR LINE SEPARATOR
1034 e590 27 22 BEQ LADC0 BRANCH IF COLON
1035 e592 7e ea 43 LADB1 JMP LB277 <20>SYNTAX ERROR<4F>-IF NOT LINE SEPARATOR
1036 e595 a6 81 LADB4 LDA ,X++ GET MS BYTE OF ADDRESS OF NEXT BASIC LINE
1037 e597 97 00 STA ENDFLG SAVE IN STOP/END FLAG - CAUSE A STOP IF
1038 * NEXT LINE ADDRESS IS < $8000; CAUSE
1039 * AN END IF ADDRESS > $8000
1040 e599 27 72 BEQ LAE15 BRANCH TO <20>STOP<4F> - END OF PROGRAM
1041 e59b ec 80 LDD ,X+ GET CURRENT LINE NUMBER
1042 e59d dd 68 STD CURLIN SAVE IN CURLIN
1043 e59f 9f 83 STX CHARAD SAVE ADDRESS OF FIRST BYTE OF LINE
1044 * EXTENDED BASIC TRACE
1045 e5a1 96 8c LDA TRCFLG TEST THE TRACE FLAG
1046 e5a3 27 0f BEQ LADC0 BRANCH IF TRACE OFF
1047 e5a5 86 5b LDA #$5B <LEFT HAND MARKER FOR TRON LINE NUMBER
1048 e5a7 bd e0 14 JSR PUTCHR OUTPUT A CHARACTER
1049 e5aa 96 68 LDA CURLIN GET MS BYTE OF LINE NUMBER
1050 e5ac bd f5 55 JSR LBDCC CONVERT ACCD TO DECIMAL AND PRINT ON SCREEN
1051 e5af 86 5d LDA #$5D > RIGHT HAND MARKER FOR TRON LINE NUMBER
1052 e5b1 bd e0 14 JSR PUTCHR OUTPUT A CHARACTER
1053 * END OF EXTENDED BASIC TRACE
1054 e5b4 9d 7c LADC0 JSR GETNCH GET A CHARACTER FROM BASIC
1055 e5b6 8d 02 BSR LADC6 GO PROCESS COMMAND
1056 e5b8 20 c8 BRA LAD9E GO BACK TO MAIN LOOP
1057 e5ba 27 29 LADC6 BEQ LADEA RETURN IF END OF LINE (RTS - was BEQ LAE40)
1058 e5bc 4d TSTA CHECK FOR TOKEN - BIT 7 SET (NEGATIVE)
1059 e5bd 10 2a 01 b8 LBPL LET BRANCH IF NOT A TOKEN - GO DO A <20>LET<45> WHICH
1060 * IS THE <20>DEFAULT<4C> TOKEN FOR MICROSOFT BASIC
1061 e5c1 81 ff CMPA #$FF SECONDARY TOKEN
1062 e5c3 27 0f BEQ SECTOK
1063 e5c5 81 9e CMPA #TOK_HIGH_EXEC SKIPF TOKEN - HIGHEST EXECUTABLE COMMAND IN BASIC
1064 e5c7 22 c9 BHI LADB1 <20>SYNTAX ERROR<4F> IF NON-EXECUTABLE TOKEN
1065 e5c9 be e1 18 LDX COMVEC+3 GET ADDRESS OF BASIC<49>S COMMAND TABLE
1066 e5cc 48 LADD4 ASLA X2 (2 BYTE/JUMP ADDRESS) & DISCARD BIT 7
1067 e5cd 1f 89 TFR A,B SAVE COMMAND OFFSET IN ACCB
1068 e5cf 3a ABX NON X POINTS TO COMMAND JUMP ADDR
1069 e5d0 9d 7c JSR GETNCH GET AN INPUT CHAR
1070 *
1071 * HERE IS WHERE WE BRANCH TO DO A <20>COMMAND<4E>
1072 e5d2 6e 94 JMP [,X] GO DO A COMMAND
1073 SECTOK
1074 * THE ONLY SECONDARY TOKEN THAT CAN ALSO BE AN EXECUTABLE IS
1075 * THE MID$ REPLACEMENT STATEMENT. SO SPECIAL-CASE CHECK DONE HERE
1076 e5d4 9d 7c JSR GETNCH GET AN INPUT CHAR
1077 e5d6 81 97 CMPA #TOK_MID TOKEN FOR "MID$"
1078 e5d8 10 27 14 ed LBEQ L86D6 PROCESS MID$ REPLACEMENT
1079 e5dc 7e ea 43 JMP LB277 SYNTAX ERROR
1080
1081 *
1082 * RESTORE
1083 e5df 9e 19 RESTOR LDX TXTTAB BEGINNING OF PROGRAM ADDRESS
1084 e5e1 30 1f LEAX -1,X MOVE TO ONE BYTE BEFORE PROGRAM
1085 e5e3 9f 33 LADE8 STX DATPTR SAVE NEW DATA POINTER
1086 e5e5 39 LADEA RTS
1087 *
1088 * BREAK CHECK
1089 e5e6 bd e0 05 LADEB JSR LA1C1 GET A KEYSTROKE ENTRY
1090 e5e9 27 0a BEQ LADFA RETURN IF NO INPUT
1091 e5eb 81 03 LADF0 CMPA #3 CONTROL C? (BREAK)
1092 e5ed 27 12 BEQ STOP YES
1093 e5ef 81 13 CMPA #$13 CONTROL S? (PAUSE)
1094 e5f1 27 03 BEQ LADFB YES
1095 e5f3 97 73 STA IKEYIM SAVE KEYSTROKE IN INKEY IMAGE
1096 e5f5 39 LADFA RTS
1097 e5f6 bd e0 05 LADFB JSR KEYIN GET A KEY
1098 e5f9 27 fb BEQ LADFB BRANCH IF NO KEY DOWN
1099 e5fb 20 ee BRA LADF0 CONTINUE - DO A BREAK CHECK
1100 *
1101 * END
1102 e5fd 9d 82 END JSR GETCCH GET CURRENT INPUT CHAR
1103 e5ff 20 02 BRA LAE0B
1104 *
1105 * STOP
1106 e601 1a 01 STOP ORCC #$01 SET CARRY FLAG
1107 e603 26 31 LAE0B BNE LAE40 BRANCH IF ARGUMENT EXISTS
1108 e605 9e 83 LDX CHARAD * SAVE CURRENT POSITION OF
1109 e607 9f 2f STX TINPTR * BASIC<49>S INPUT POINTER
1110 e609 06 00 LAE11 ROR ENDFLG ROTATE CARRY INTO BIT 7 OF STOP/END FLAG
1111 e60b 32 62 LEAS 2,S PURGE RETURN ADDRESS OFF STACK
1112 e60d 9e 68 LAE15 LDX CURLIN GET CURRENT LINE NUMBER
1113 e60f 8c ff ff CMPX #$FFFF DIRECT MODE?
1114 e612 27 06 BEQ LAE22 YES
1115 e614 9f 29 STX OLDTXT SAVE CURRENT LINE NUMBER
1116 e616 9e 2f LDX TINPTR * GET AND SAVE CURRENT POSITION
1117 e618 9f 2d STX OLDPTR * OF BASIC<49>S INPUT POINTER
1118 LAE22
1119 e61a 8e e3 f1 LDX #LABF2-1 POINT TO CR, <20>BREAK<41> MESSAGE
1120 e61d 0d 00 TST ENDFLG CHECK STOP/END FLAG
1121 e61f 10 2a fe 42 LBPL LAC73 BRANCH TO MAIN LOOP OF BASIC IF END
1122 e623 7e e4 5a JMP LAC68 PRINT <20>BREAK AT ####<23> AND GO TO
1123 * BASIC<49>S MAIN LOOP IF <20>STOP<4F>
1124
1125 * CONT
1126 e626 26 0e CONT BNE LAE40 RETURN IF ARGUMENT GIVEN
1127 e628 c6 20 LDB #2*16 <20>CAN<41>T CONTINUE<55> ERROR
1128 e62a 9e 2d LDX OLDPTR GET CONTINUE ADDRESS (INPUT POINTER)
1129 e62c 10 27 fe 16 LBEQ LAC46 <20>CN<43> ERROR IF CONTINUE ADDRESS = 0
1130 e630 9f 83 STX CHARAD RESET BASIC<49>S INPUT POINTER
1131 e632 9e 29 LDX OLDTXT GET LINE NUMBER
1132 e634 9f 68 STX CURLIN RESET CURRENT LINE NUMBER
1133 e636 39 LAE40 RTS
1134 *
1135 * CLEAR
1136 e637 27 2c CLEAR BEQ LAE6F BRANCH IF NO ARGUMENT
1137 e639 bd eb ad JSR LB3E6 EVALUATE ARGUMENT
1138 e63c 34 06 PSHS B,A SAVE AMOUNT OF STRING SPACE ON STACK
1139 e63e 9e 27 LDX MEMSIZ GET CURRENT TOP OF CLEARED SPACE
1140 e640 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1141 e642 27 0c BEQ LAE5A BRANCH IF NO NEW TOP OF CLEARED SPACE
1142 e644 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
1143 e647 bd ef 04 JSR LB73D EVALUATE EXPRESSlON; RETURN VALUE IN X
1144 e64a 30 1f LEAX -1,X X = TOP OF CLEARED SPACE
1145 e64c 9c 71 CMPX TOPRAM COMPARE TO TOP OF RAM
1146 e64e 22 18 BHI LAE72 <20>OM<4F> ERROR IF > TOP OF RAM
1147 e650 1f 10 LAE5A TFR X,D ACCD = TOP OF CLEARED SPACE
1148 e652 a3 e1 SUBD ,S++ SUBTRACT OUT AMOUNT OF CLEARED SPACE
1149 e654 25 12 BCS LAE72 <20>OM<4F> ERROR IF FREE MEM < 0
1150 e656 1f 03 TFR D,U U = BOTTOM OF CLEARED SPACE
1151 e658 83 00 3a SUBD #STKBUF SUBTRACT OUT STACK BUFFER
1152 e65b 25 0b BCS LAE72 <20>OM<4F> ERROR IF FREE MEM < 0
1153 e65d 93 1b SUBD VARTAB SUBTRACT OUT START OF VARIABLES
1154 e65f 25 07 BCS LAE72 <20>OM<4F> ERROR IF FREE MEM < 0
1155 e661 df 21 STU FRETOP SAVE NEW BOTTOM OF CLEARED SPACE
1156 e663 9f 27 STX MEMSIZ SAVE NEW TOP OF CLEARED SPACE
1157 e665 7e e5 0a LAE6F JMP LAD26 ERASE ALL VARIABLES, INITIALIZE POINTERS, ETC
1158 e668 7e e4 44 LAE72 JMP LAC44 <20>OM<4F> ERROR
1159 *
1160 * RUN
1161 e66b 9d 82 RUN JSR GETCCH * GET CURRENT INPUT CHARACTER
1162 e66d 10 27 fe 94 LBEQ LAD21 * IF NO LINE NUMBER
1163 e671 bd e5 0a JSR LAD26 ERASE ALL VARIABLES
1164 e674 20 19 BRA LAE9F <20>GOTO<54> THE RUN ADDRESS
1165 *
1166 * GO
1167 e676 1f 89 GO TFR A,B SAVE INPUT CHARACTER IN ACCB
1168 e678 9d 7c LAE88 JSR GETNCH GET A CHARACTER FROM BASIC
1169 e67a c1 a0 CMPB #TOK_TO <20>TO<54> TOKEN
1170 e67c 27 16 BEQ LAEA4 BRANCH IF GOTO
1171 e67e c1 a1 CMPB #TOK_SUB <20>SUB<55> TOKEN
1172 e680 26 45 BNE LAED7 <20>SYNTAX ERROR<4F> IF NEITHER
1173 e682 c6 03 LDB #3 =ROOM FOR 6
1174 e684 bd e4 33 JSR LAC33 =BYTES ON STACK?
1175 e687 de 83 LDU CHARAD * SAVE CURRENT BASIC INPUT POINTER, LINE
1176 e689 9e 68 LDX CURLIN * NUMBER AND SUB TOKEN ON STACK
1177 e68b 86 a1 LDA #TOK_SUB *
1178 e68d 34 52 PSHS U,X,A *
1179 e68f 8d 03 LAE9F BSR LAEA4 GO DO A <20>GOTO<54>
1180 e691 7e e5 82 JMP LAD9E JUMP BACK TO BASIC<49>S MAIN LOOP
1181 * GOTO
1182 e694 9d 82 LAEA4 JSR GETCCH GET CURRENT INPUT CHAR
1183 e696 bd e7 57 JSR LAF67 GET LINE NUMBER TO BINARY IN BINVAL
1184 e699 8d 40 BSR LAEEB ADVANCE BASIC<49>S POINTER TO END OF LINE
1185 e69b 30 01 LEAX $01,X POINT TO START OF NEXT LINE
1186 e69d dc 2b LDD BINVAL GET THE LINE NUMBER TO RUN
1187 e69f 10 93 68 CMPD CURLIN COMPARE TO CURRENT LINE NUMBER
1188 e6a2 22 02 BHI LAEB6 IF REO<45>D LINE NUMBER IS > CURRENT LINE NUMBER,
1189 * DON<4F>T START LOOKING FROM
1190 * START OF PROGRAM
1191 e6a4 9e 19 LDX TXTTAB BEGINNING OF PROGRAM
1192 e6a6 bd e4 e9 LAEB6 JSR LAD05 GO FIND A LINE NUMBER
1193 e6a9 25 17 BCS LAED2 <20>UNDEFINED LINE NUMBER<45>
1194 e6ab 30 1f LAEBB LEAX -1,X MOVE BACK TO JUST BEFORE START OF LINE
1195 e6ad 9f 83 STX CHARAD RESET BASIC<49>S INPUT POINTER
1196 e6af 39 LAEBF RTS
1197 *
1198 * RETURN
1199 e6b0 26 fd RETURN BNE LAEBF EXIT ROUTINE IF ARGUMENT GIVEN
1200 e6b2 86 ff LDA #$FF * PUT AN ILLEGAL VARIABLE NAME IN FIRST BYTE OF
1201 e6b4 97 3b STA VARDES * VARDES WHICH WILL CAUSE <20>FOR/NEXT<58> DATA ON THE
1202 * STACK TO BE IGNORED
1203 e6b6 bd e3 f9 JSR LABF9 CHECK FOR RETURN DATA ON THE STACK
1204 e6b9 1f 14 TFR X,S RESET STACK POINTER - PURGE TWO RETURN ADDRESSES
1205 * FROM THE STACK
1206 e6bb 81 21 CMPA #TOK_SUB-$80 SUB TOKEN - $80
1207 e6bd 27 0b BEQ LAEDA BRANCH IF <20>RETURN<52> FROM SUBROUTINE
1208 e6bf c6 04 LDB #2*2 ERROR #2 <20>RETURN WITHOUT GOSUB<55>
1209 e6c1 8c FCB SKP2 SKIP TWO BYTES
1210 e6c2 c6 0e LAED2 LDB #7*2 ERROR #7 <20>UNDEFINED LINE NUMBER<45>
1211 e6c4 7e e4 46 JMP LAC46 JUMP TO ERROR HANDLER
1212 e6c7 7e ea 43 LAED7 JMP LB277 <20>SYNTAX ERROR<4F>
1213 e6ca 35 52 LAEDA PULS A,X,U * RESTORE VALUES OF CURRENT LINE NUMBER AND
1214 e6cc 9f 68 STX CURLIN * BASIC<49>S INPUT POINTER FOR THIS SUBROUTINE
1215 e6ce df 83 STU CHARAD * AND LOAD ACCA WITH SUB TOKEN ($A6)
1216 *
1217 * DATA
1218 e6d0 8d 06 DATA BSR LAEE8 MOVE INPUT POINTER TO END OF SUBLINE OR LINE
1219 e6d2 8c FCB SKP2 SKIP 2 BYTES
1220
1221 * REM, ELSE
1222 ELSE
1223 e6d3 8d 06 REM BSR LAEEB MOVE INPUT POINTER TO END OF LINE
1224 e6d5 9f 83 STX CHARAD RESET BASIC<49>S INPUT POINTER
1225 e6d7 39 LAEE7 RTS
1226 * ADVANCE INPUT POINTER TO END OF SUBLINE OR LINE
1227 e6d8 c6 3a LAEE8 LDB #': COLON = SUBLINE TERMINATOR CHARACTER
1228 e6da 86 LAEEA FCB SKP1LD SKPILD SKIP ONE BYTE; LDA #$5F
1229 * ADVANCE BASIC<49>S INPUT POINTER TO END OF
1230 * LINE - RETURN ADDRESS OF END OF LINE+1 IN X
1231 e6db 5f LAEEB CLRB 0 = LINE TERMINATOR CHARACTER
1232 e6dc d7 01 STB CHARAC TEMP STORE PRIMARY TERMINATOR CHARACTER
1233 e6de 5f CLRB 0 (END OF LINE) = ALTERNATE TERM. CHAR.
1234 e6df 9e 83 LDX CHARAD LOAD X W/BASIC<49>S INPUT POINTER
1235 e6e1 1f 98 LAEF1 TFR B,A * CHANGE TERMINATOR CHARACTER
1236 e6e3 d6 01 LDB CHARAC * FROM ACCB TO CHARAC - SAVE OLD TERMINATOR
1237 * IN CHARAC
1238 e6e5 97 01 STA CHARAC SWAP PRIMARY AND SECONDARY TERMINATORS
1239 e6e7 a6 84 LAEF7 LDA ,X GET NEXT INPUT CHARACTER
1240 e6e9 27 ec BEQ LAEE7 RETURN IF 0 (END OF LINE)
1241 e6eb 34 04 PSHS B SAVE TERMINATOR ON STACK
1242 e6ed a1 e0 CMPA ,S+ COMPARE TO INPUT CHARACTER
1243 e6ef 27 e6 BEQ LAEE7 RETURN IF EQUAL
1244 e6f1 30 01 LEAX 1,X MOVE POINTER UP ONE
1245 e6f3 81 22 CMPA #'" CHECK FOR DOUBLE QUOTES
1246 e6f5 27 ea BEQ LAEF1 BRANCH IF " - TOGGLE TERMINATOR CHARACTERS
1247 e6f7 4c INCA * CHECK FOR $FF AND BRANCH IF
1248 e6f8 26 02 BNE LAF0C * NOT SECONDARY TOKEN
1249 e6fa 30 01 LEAX 1,X MOVE INPUT POINTER 1 MORE IF SECONDARY
1250 e6fc 81 86 LAF0C CMPA #TOK_IF+1 TOKEN FOR IF?
1251 e6fe 26 e7 BNE LAEF7 NO - GET ANOTHER INPUT CHARACTER
1252 e700 0c 04 INC IFCTR INCREMENT IF COUNTER - KEEP TRACK OF HOW MANY
1253 * <20>IF<49> STATEMENTS ARE NESTED IN ONE LINE
1254 e702 20 e3 BRA LAEF7 GET ANOTHER INPUT CHARACTER
1255
1256 * IF
1257 e704 bd e9 0d IF JSR LB141 EVALUATE NUMERIC EXPRESSION
1258 e707 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1259 e709 81 81 CMPA #TOK_GO TOKEN FOR GO
1260 e70b 27 05 BEQ LAF22 TREAT <20>GO<47> THE SAME AS <20>THEN<45>
1261 e70d c6 a2 LDB #TOK_THEN TOKEN FOR THEN
1262 e70f bd ea 3b JSR LB26F DO A SYNTAX CHECK ON ACCB
1263 e712 96 4f LAF22 LDA FP0EXP CHECK FOR TRUE/FALSE - FALSE IF FPA0 EXPONENT = ZERO
1264 e714 26 13 BNE LAF39 BRANCH IF CONDITION TRUE
1265 e716 0f 04 CLR IFCTR CLEAR FLAG - KEEP TRACK OF WHICH NESTED ELSE STATEMENT
1266 * TO SEARCH FOR IN NESTED <20>IF<49> LOOPS
1267 e718 8d b6 LAF28 BSR DATA MOVE BASIC<49>S POINTER TO END OF SUBLINE
1268 e71a 4d TSTA * CHECK TO SEE IF END OF LINE OR SUBLINE
1269 e71b 27 ba BEQ LAEE7 * AND RETURN IF END OF LINE
1270 e71d 9d 7c JSR GETNCH GET AN INPUT CHARACTER FROM BASIC
1271 e71f 81 84 CMPA #TOK_ELSE TOKEN FOR ELSE
1272 e721 26 f5 BNE LAF28 IGNORE ALL DATA EXCEPT <20>ELSE<53> UNTIL
1273 * END OF LINE (ZERO BYTE)
1274 e723 0a 04 DEC IFCTR CHECK TO SEE IF YOU MUST SEARCH ANOTHER SUBLINE
1275 e725 2a f1 BPL LAF28 BRANCH TO SEARCH ANOTHER SUBLINE FOR <20>ELSE<53>
1276 e727 9d 7c JSR GETNCH GET AN INPUT CHARACTER FROM BASIC
1277 e729 9d 82 LAF39 JSR GETCCH GET CURRENT INPUT CHARACTER
1278 e72b 10 25 ff 65 LBCS LAEA4 BRANCH TO <20>GOTO<54> IF NUMERIC CHARACTER
1279 e72f 7e e5 ba JMP LADC6 RETURN TO MAIN INTERPRETATION LOOP
1280
1281 * ON
1282 e732 bd ee d2 ON JSR LB70B EVALUATE EXPRESSION
1283 e735 c6 81 LDB #TOK_GO TOKEN FOR GO
1284 e737 bd ea 3b JSR LB26F SYNTAX CHECK FOR GO
1285 e73a 34 02 PSHS A SAVE NEW TOKEN (TO,SUB)
1286 e73c 81 a1 CMPA #TOK_SUB TOKEN FOR SUB?
1287 e73e 27 04 BEQ LAF54 YES
1288 e740 81 a0 CMPA #TOK_TO TOKEN FOR TO?
1289 e742 26 83 LAF52 BNE LAED7 <20>SYNTAX<41> ERROR IF NOT <20>SUB<55> OR <20>TO<54>
1290 e744 0a 53 LAF54 DEC FPA0+3 DECREMENT IS BYTE OF MANTISSA OF FPA0 - THIS
1291 * IS THE ARGUMENT OF THE <20>ON<4F> STATEMENT
1292 e746 26 05 BNE LAF5D BRANCH IF NOT AT THE PROPER GOTO OR GOSUB LINE NUMBER
1293 e748 35 04 PULS B GET BACK THE TOKEN FOLLOWING <20>GO<47>
1294 e74a 7e e6 78 JMP LAE88 GO DO A <20>GOTO<54> OR <20>GOSUB<55>
1295 e74d 9d 7c LAF5D JSR GETNCH GET A CHARACTER FROM BASIC
1296 e74f 8d 06 BSR LAF67 CONVERT BASIC LINE NUMBER TO BINARY
1297 e751 81 2c CMPA #', IS CHARACTER FOLLOWING LINE NUMBER A COMMA?
1298 e753 27 ef BEQ LAF54 YES
1299 e755 35 84 PULS B,PC IF NOT, FALL THROUGH TO NEXT COMMAND
1300 e757 9e 74 LAF67 LDX ZERO DEFAULT LINE NUMBER OF ZERO
1301 e759 9f 2b STX BINVAL SAVE IT IN BINVAL
1302 *
1303 * CONVERT LINE NUMBER TO BINARY - RETURN VALUE IN BINVAL
1304 *
1305 e75b 24 61 LAF6B BCC LAFCE RETURN IF NOT NUMERIC CHARACTER
1306 e75d 80 30 SUBA #'0 MASK OFF ASCII
1307 e75f 97 01 STA CHARAC SAVE DIGIT IN VO1
1308 e761 dc 2b LDD BINVAL GET ACCUMULATED LINE NUMBER VALUE
1309 e763 81 18 CMPA #24 LARGEST LINE NUMBER IS $F9FF (63999) -
1310 * (24*256+255)*10+9
1311 e765 22 db BHI LAF52 <20>SYNTAX<41> ERROR IF TOO BIG
1312 * MULT ACCD X 10
1313 e767 58 ASLB *
1314 e768 49 ROLA * TIMES 2
1315 e769 58 ASLB =
1316 e76a 49 ROLA = TIMES 4
1317 e76b d3 2b ADDD BINVAL ADD 1 = TIMES 5
1318 e76d 58 ASLB *
1319 e76e 49 ROLA * TIMES 10
1320 e76f db 01 ADDB CHARAC ADD NEXT DIGIT
1321 e771 89 00 ADCA #0 PROPAGATE CARRY
1322 e773 dd 2b STD BINVAL SAVE NEW ACCUMULATED LINE NUMBER
1323 e775 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC
1324 e777 20 e2 BRA LAF6B LOOP- PROCESS NEXT DIGIT
1325 *
1326 * LET (EXBAS)
1327 * EVALUATE A NON-TOKEN EXPRESSION
1328 * TARGET = REPLACEMENT
1329 e779 bd eb 1e LET JSR LB357 FIND TARGET VARIABLE DESCRIPTOR
1330 e77c 9f 3b STX VARDES SAVE DESCRIPTOR ADDRESS OF 1ST EXPRESSION
1331 e77e c6 ae LDB #TOK_EQUALS TOKEN FOR "="
1332 e780 bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR <20>=<3D>
1333 e783 96 06 LDA VALTYP * GET VARIABLE TYPE AND
1334 e785 34 02 PSHS A * SAVE ON THE STACK
1335 e787 bd e9 22 JSR LB156 EVALUATE EXPRESSION
1336 e78a 35 02 PULS A * REGET VARIABLE TYPE OF 1ST EXPRESSION AND
1337 e78c 46 RORA * SET CARRY IF STRING
1338 e78d bd e9 14 JSR LB148 TYPE CHECK-TM ERROR IF VARIABLE TYPES ON
1339 * BOTH SIDES OF EQUALS SIGN NOT THE SAME
1340 e790 10 27 0c 28 LBEQ LBC33 GO PUT FPA0 INTO VARIABLE DESCRIPTOR IF NUMERIC
1341 * MOVE A STRING WHOSE DESCRIPTOR IS LOCATED AT
1342 * FPA0+2 INTO THE STRING SPACE. TRANSFER THE
1343 * DESCRIPTOR ADDRESS TO THE ADDRESS IN VARDES
1344 * DON<4F>T MOVE THE STRING IF IT IS ALREADY IN THE
1345 * STRING SPACE. REMOVE DESCRIPTOR FROM STRING
1346 * STACK IF IT IS LAST ONE ON THE STACK
1347 e794 9e 52 LAFA4 LDX FPA0+2 POINT X TO DESCRIPTOR OF REPLACEMENT STRING
1348 e796 dc 21 LDD FRETOP LOAD ACCD WITH START OF STRING SPACE
1349 e798 10 a3 02 CMPD 2,X IS THE STRING IN STRING SPACE?
1350 e79b 24 11 BCC LAFBE BRANCH IF IT<49>S NOT IN THE STRING SPACE
1351 e79d 9c 1b CMPX VARTAB COMPARE DESCRIPTOR ADDRESS TO START OF VARIABLES
1352 e79f 25 0d BCS LAFBE BRANCH IF DESCRIPTOR ADDRESS NOT IN VARIABLES
1353 e7a1 e6 84 LAFB1 LDB ,X GET LENGTH OF REPLACEMENT STRING
1354 e7a3 bd ec d4 JSR LB50D RESERVE ACCB BYTES OF STRING SPACE
1355 e7a6 9e 4d LDX V4D GET DESCRIPTOR ADDRESS BACK
1356 e7a8 bd ee 0a JSR LB643 MOVE STRING INTO STRING SPACE
1357 e7ab 8e 00 56 LDX #STRDES POINT X TO TEMP STRING DESCRIPTOR ADDRESS
1358 e7ae 9f 4d LAFBE STX V4D SAVE STRING DESCRIPTOR ADDRESS IN V4D
1359 e7b0 bd ee 3c JSR LB675 REMOVE STRING DESCRIPTOR IF LAST ONE
1360 * ON STRING STACK
1361 e7b3 de 4d LDU V4D POINT U TO REPLACEMENT DESCRIPTOR ADDRESS
1362 e7b5 9e 3b LDX VARDES GET TARGET DESCRIPTOR ADDRESS
1363 e7b7 37 26 PULU A,B,Y GET LENGTH AND START OF REPLACEMENT STRING
1364 e7b9 a7 84 STA ,X * SAVE STRING LENGTH AND START IN
1365 e7bb 10 af 02 STY 2,X * TARGET DESCRIPTOR LOCATION
1366 e7be 39 LAFCE RTS
1367
1368 e7bf 3f 52 45 44 4f LAFCF FCC "?REDO" ?REDO MESSAGE
1369 e7c4 0d 00 FCB CR,$00
1370
1371 LAFD6
1372 e7c6 7e e4 46 LAFDC JMP LAC46 JMP TO ERROR HANDLER
1373 e7c9 96 09 LAFDF LDA INPFLG = GET THE INPUT FLAG AND BRANCH
1374 e7cb 27 07 BEQ LAFEA = IF <20>INPUT<55>
1375 e7cd 9e 31 LDX DATTXT * GET LINE NUMBER WHERE THE ERROR OCCURRED
1376 e7cf 9f 68 STX CURLIN * AND USE IT AS THE CURRENT LINE NUMBER
1377 e7d1 7e ea 43 JMP LB277 <20>SYNTAX ERROR<4F>
1378 e7d4 8e e7 be LAFEA LDX #LAFCF-1 * POINT X TO <20>?REDO<44> AND PRINT
1379 e7d7 bd f1 25 JSR LB99C * IT ON THE SCREEN
1380 e7da 9e 2f LDX TINPTR = GET THE SAVED ABSOLUTE ADDRESS OF
1381 e7dc 9f 83 STX CHARAD = INPUT POINTER AND RESTORE IT
1382 e7de 39 RTS
1383 *
1384 * INPUT
1385 e7df c6 16 INPUT LDB #11*2 <20>ID<49> ERROR
1386 e7e1 9e 68 LDX CURLIN GET CURRENT LINE NUMBER
1387 e7e3 30 01 LEAX 1,X ADD ONE
1388 e7e5 27 df BEQ LAFDC <20>ID<49> ERROR BRANCH IF DIRECT MODE
1389 e7e7 8d 01 BSR LB00F GET SOME INPUT DATA - WAS LB002
1390 e7e9 39 RTS
1391 e7ea 81 22 LB00F CMPA #'" CHECK FOR PROMPT STRING DELIMITER
1392 e7ec 26 0b BNE LB01E BRANCH IF NO PROMPT STRING
1393 e7ee bd ea 10 JSR LB244 PUT PROMPT STRING ON STRING STACK
1394 e7f1 c6 3b LDB #'; *
1395 e7f3 bd ea 3b JSR LB26F * DO A SYNTAX CHECK FOR SEMICOLON
1396 e7f6 bd f1 28 JSR LB99F PRINT MESSAGE TO CONSOLE OUT
1397 e7f9 8e 00 f3 LB01E LDX #LINBUF POINT TO BASIC<49>S LINE BUFFER
1398 e7fc 6f 84 CLR ,X CLEAR 1ST BYTE - FLAG TO INDICATE NO DATA
1399 * IN LINE BUFFER
1400 e7fe 8d 06 BSR LB02F INPUT A STRING TO LINE BUFFER
1401 e800 c6 2c LDB #', * INSERT A COMMA AT THE END
1402 e802 e7 84 STB ,X * OF THE LINE INPUT BUFFER
1403 e804 20 16 BRA LB049
1404 * FILL BASIC<49>S LINE INPUT BUFFER CONSOLE IN
1405 e806 bd f1 38 LB02F JSR LB9AF SEND A "?" TO CONSOLE OUT
1406 e809 bd f1 35 JSR LB9AC SEND A <20>SPACE<43> TO CONSOLE OUT
1407 e80c bd e1 81 LB035 JSR LA390 GO READ IN A BASIC LINE
1408 e80f 24 05 BCC LB03F BRANCH IF ENTER KEY ENDED ENTRY
1409 e811 32 64 LEAS 4,S PURGE TWO RETURN ADDRESSES OFF THE STACK
1410 e813 7e e6 09 JMP LAE11 GO DO A <20>STOP<4F> IF BREAK KEY ENDED LINE ENTRY
1411 e816 c6 2e LB03F LDB #2*23 <20>INPUT PAST END OF FILE<4C> ERROR
1412 e818 39 RTS
1413 *
1414 * READ
1415 e819 9e 33 READ LDX DATPTR GET <20>READ<41> START ADDRESS
1416 e81b 86 FCB SKP1LD SKIP ONE BYTE - LDA #*$4F
1417 e81c 4f LB049 CLRA <20>INPUT<55> ENTRY POINT: INPUT FLAG = 0
1418 e81d 97 09 STA INPFLG SET INPUT FLAG; 0 = INPUT: <> 0 = READ
1419 e81f 9f 35 STX DATTMP SAVE <20>READ<41> START ADDRESS/<2F>INPUT<55> BUFFER START
1420 e821 bd eb 1e LB04E JSR LB357 EVALUATE A VARIABLE
1421 e824 9f 3b STX VARDES SAVE DESCRIPTOR ADDRESS
1422 e826 9e 83 LDX CHARAD * GET BASIC<49>S INPUT POINTER
1423 e828 9f 2b STX BINVAL * AND SAVE IT
1424 e82a 9e 35 LDX DATTMP GET <20>READ<41> ADDRESS START/<2F>INPUT<55> BUFFER POINTER
1425 e82c a6 84 LDA ,X GET A CHARACTER FROM THE BASIC PROGRAM
1426 e82e 26 09 BNE LB069 BRANCH IF NOT END OF LINE
1427 e830 96 09 LDA INPFLG * CHECK INPUT FLAG AND BRANCH
1428 e832 26 51 BNE LB0B9 * IF LOOKING FOR DATA (READ)
1429 * NO DATA IN <20>INPUT<55> LINE BUFFER AND/OR INPUT
1430 * NOT COMING FROM SCREEN
1431 e834 bd f1 38 JSR LB9AF SEND A '?' TO CONSOLE OUT
1432 e837 8d cd BSR LB02F FILL INPUT BUFFER FROM CONSOLE IN
1433 e839 9f 83 LB069 STX CHARAD RESET BASIC<49>S INPUT POINTER
1434 e83b 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC
1435 e83d d6 06 LDB VALTYP * CHECK VARIABLE TYPE AND
1436 e83f 27 23 BEQ LB098 * BRANCH IF NUMERIC
1437 * READ/INPUT A STRING VARIABLE
1438 e841 9e 83 LDX CHARAD LOAD X WITH CURRENT BASIC INPUT POINTER
1439 e843 97 01 STA CHARAC SAVE CURRENT INPUT CHARACTER
1440 e845 81 22 CMPA #'" CHECK FOR STRING DELIMITER
1441 e847 27 0e BEQ LB08B BRANCH IF STRING DELIMITER
1442 e849 30 1f LEAX -1,X BACK UP POINTER
1443 e84b 4f CLRA * ZERO = END OF LINE CHARACTER
1444 e84c 97 01 STA CHARAC * SAVE AS TERMINATOR
1445 e84e bd e1 73 JSR LA35F SET UP PRINT PARAMETERS
1446 e851 86 3a LDA #': END OF SUBLINE CHARACTER
1447 e853 97 01 STA CHARAC SAVE AS TERMINATOR I
1448 e855 86 2c LDA #', COMMA
1449 e857 97 02 LB08B STA ENDCHR SAVE AS TERMINATOR 2
1450 e859 bd ec e5 JSR LB51E STRIP A STRING FROM THE INPUT BUFFER
1451 e85c bd ea 15 JSR LB249 MOVE INPUT POINTER TO END OF STRING
1452 e85f bd e7 94 JSR LAFA4 PUT A STRING INTO THE STRING SPACE IF NECESSARY
1453 e862 20 06 BRA LB09E CHECK FOR ANOTHER DATA ITEM
1454 * SAVE A NUMERIC VALUE IN A READ OR INPUT DATA ITEM
1455 e864 bd f4 9b LB098 JSR LBD12 CONVERT AN ASCII STRING TO FP NUMBER
1456 e867 bd f3 bc JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS IN VARDES -
1457 * INPUT OR READ DATA ITEM
1458 e86a 9d 82 LB09E JSR GETCCH GET CURRENT INPUT CHARACTER
1459 e86c 27 06 BEQ LB0A8 BRANCH IF END OF LINE
1460 e86e 81 2c CMPA #', CHECK FOR A COMMA
1461 e870 10 26 ff 52 LBNE LAFD6 BAD FILE DATA' ERROR OR RETRY
1462 e874 9e 83 LB0A8 LDX CHARAD * GET CURRENT INPUT
1463 e876 9f 35 STX DATTMP * POINTER (USED AS A DATA POINTER) AND SAVE IT
1464 e878 9e 2b LDX BINVAL * RESET INPUT POINTER TO INPUT OR
1465 e87a 9f 83 STX CHARAD * READ STATEMENT
1466 e87c 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC
1467 e87e 27 21 BEQ LB0D5 BRANCH IF END OF LINE - EXIT COMMAND
1468 e880 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
1469 e883 20 9c BRA LB04E GET ANOTHER INPUT OR READ ITEM
1470 * SEARCH FROM ADDRESS IN X FOR
1471 * 1ST OCCURENCE OF THE TOKEN FOR DATA
1472 e885 9f 83 LB0B9 STX CHARAD RESET BASIC<49>S INPUT POINTER
1473 e887 bd e6 d8 JSR LAEE8 SEARCH FOR END OF CURRENT LINE OR SUBLINE
1474 e88a 30 01 LEAX 1,X MOVE X ONE PAST END OF LINE
1475 e88c 4d TSTA CHECK FOR END OF LINE
1476 e88d 26 0a BNE LB0CD BRANCH IF END OF SUBLINE
1477 e88f c6 06 LDB #2*3 <20>OUT OF DATA<54> ERROR
1478 e891 ee 81 LDU ,X++ GET NEXT 2 CHARACTERS
1479 e893 27 41 BEQ LB10A <20>OD<4F> ERROR IF END OF PROGRAM
1480 e895 ec 81 LDD ,X++ GET BASIC LINE NUMBER AND
1481 e897 dd 31 STD DATTXT SAVE IT IN DATTXT
1482 e899 a6 84 LB0CD LDA ,X GET AN INPUT CHARACTER
1483 e89b 81 86 CMPA #TOK_DATA DATA TOKEN?
1484 e89d 26 e6 BNE LB0B9 NO <20> KEEP LOOKING
1485 e89f 20 98 BRA LB069 YES
1486 * EXIT READ AND INPUT COMMANDS
1487 e8a1 9e 35 LB0D5 LDX DATTMP GET DATA POINTER
1488 e8a3 d6 09 LDB INPFLG * CHECK INPUT FLAG
1489 e8a5 10 26 fd 3a LBNE LADE8 * SAVE NEW DATA POINTER IF READ
1490 e8a9 a6 84 LDA ,X = CHECK NEXT CHARACTER IN <20>INPUT<55> BUFFER
1491 e8ab 27 06 BEQ LB0E7 =
1492 e8ad 8e e8 b3 LDX #LB0E8-1 POINT X TO <20>?EXTRA IGNORED<45>
1493 e8b0 7e f1 25 JMP LB99C PRINT THE MESSAGE
1494 e8b3 39 LB0E7 RTS
1495
1496 e8b4 3f 45 58 54 52 41 LB0E8 FCC "?EXTRA IGNORED" ?EXTRA IGNORED MESSAGE
20 49 47 4e 4f 52
45 44
1497
1498
1499 e8c2 0d 00 FCB CR,$00
1500
1501 * NEXT
1502 e8c4 26 04 NEXT BNE LB0FE BRANCH IF ARGUMENT GIVEN
1503 e8c6 9e 74 LDX ZERO X = 0: DEFAULT FOR NO ARGUMENT
1504 e8c8 20 03 BRA LB101
1505 e8ca bd eb 1e LB0FE JSR LB357 EVALUATE AN ALPHA EXPRESSION
1506 e8cd 9f 3b LB101 STX VARDES SAVE VARIABLE DESCRIPTOR POINTER
1507 e8cf bd e3 f9 JSR LABF9 GO SCAN FOR <20>FOR/NEXT<58> DATA ON STACK
1508 e8d2 27 04 BEQ LB10C BRANCH IF DATA FOUND
1509 e8d4 c6 00 LDB #0 <20>NEXT WITHOUT FOR<4F> ERROR (SHOULD BE CLRB)
1510 e8d6 20 47 LB10A BRA LB153 PROCESS ERROR
1511 e8d8 1f 14 LB10C TFR X,S POINT S TO START OF <20>FOR/NEXT<58> DATA
1512 e8da 30 03 LEAX 3,X POINT X TO FP VALUE OF STEP
1513 e8dc bd f3 9d JSR LBC14 COPY A FP NUMBER FROM (X) TO FPA0
1514 e8df a6 68 LDA 8,S GET THE DIRECTION OF STEP
1515 e8e1 97 54 STA FP0SGN SAVE IT AS THE SIGN OF FPA0
1516 e8e3 9e 3b LDX VARDES POINT (X) TO INDEX VARIABLE DESCRIPTOR
1517 e8e5 bd f1 4b JSR LB9C2 ADD (X) TO FPA0 (STEP TO INDEX)
1518 e8e8 bd f3 bc JSR LBC33 PACK FPA0 AND STORE IT IN ADDRESS
1519 * CONTAINED IN VARDES
1520 e8eb 30 69 LEAX 9,S POINT (X) TO TERMINAL VALUE OF INDEX
1521 e8ed bd f4 1f JSR LBC96 COMPARE CURRENT INDEX VALUE TO TERMINAL VALUE OF INDEX
1522 e8f0 e0 68 SUBB 8,S ACCB = 0 IF TERMINAL VALUE=CURRENT VALUE AND STEP=0 OR IF
1523 * STEP IS POSITIVE AND CURRENT VALUE>TERMINAL VALUE OR
1524 * STEP IS NEGATIVE AND CURRENT VALUE<TERMINAL VALUE
1525 e8f2 27 0c BEQ LB134 BRANCH IF <20>FOR/NEXT<58> LOOP DONE
1526 e8f4 ae 6e LDX 14,S * GET LINE NUMBER AND
1527 e8f6 9f 68 STX CURLIN * BASIC POINTER OF
1528 e8f8 ae e8 10 LDX 16,S * STATEMENT FOLLOWING THE
1529 e8fb 9f 83 STX CHARAD * PROPER FOR STATEMENT
1530 e8fd 7e e5 82 LB131 JMP LAD9E JUMP BACK TO COMMAND INTEPR. LOOP
1531 e900 32 e8 12 LB134 LEAS 18,S PULL THE <20>FOR-NEXT<58> DATA OFF THE STACK
1532 e903 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1533 e905 81 2c CMPA #', CHECK FOR ANOTHER ARGUMENT
1534 e907 26 f4 BNE LB131 RETURN IF NONE
1535 e909 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC
1536 e90b 8d bd BSR LB0FE BSR SIMULATES A CALL TO <20>NEXT<58> FROM COMMAND LOOP
1537
1538
1539 e90d 8d 13 LB141 BSR LB156 EVALUATE EXPRESSION AND DO A TYPE CHECK FOR NUMERIC
1540 e90f 1c fe LB143 ANDCC #$FE CLEAR CARRY FLAG
1541 e911 7d LB145 FCB $7D OP CODE OF TST $1A01 - SKIP TWO BYTES (DO
1542 * NOT CHANGE CARRY FLAG)
1543 e912 1a 01 LB146 ORCC #1 SET CARRY
1544
1545 * STRING TYPE MODE CHECK - IF ENTERED AT LB146 THEN VALTYP PLUS IS 'TM' ERROR
1546 * NUMERIC TYPE MODE CHECK - IF ENTERED AT LB143 THEN VALTYP MINUS IS 'TM' ERROR
1547 * IF ENTERED AT LB148, A TYPE CHECK IS DONE ON VALTYP
1548 * IF ENTERED WITH CARRY SET, THEN 'TM' ERROR IF NUMERIC
1549 * IF ENTERED WITH CARRY CLEAR, THEN 'TM' ERROR IF STRING.
1550 e914 0d 06 LB148 TST VALTYP TEST TYPE FLAG; DO NOT CHANGE CARRY
1551 e916 25 03 BCS LB14F BRANCH IF STRING
1552 e918 2a 99 BPL LB0E7 RETURN ON PLUS
1553 e91a 8c FCB SKP2 SKIP 2 BYTES - <20>TM<54> ERROR
1554 e91b 2b 96 LB14F BMI LB0E7 RETURN ON MINUS
1555 e91d c6 18 LDB #12*2 <20>TYPE M1SMATCH<43> ERROR
1556 e91f 7e e4 46 LB153 JMP LAC46 PROCESS ERROR
1557 * EVALUATE EXPRESSION
1558 e922 8d 6e LB156 BSR LB1C6 BACK UP INPUT POINTER
1559 e924 4f LB158 CLRA END OF OPERATION PRECEDENCE FLAG
1560 e925 8c FCB SKP2 SKIP TWO BYTES
1561 e926 34 04 LB15A PSHS B SAVE FLAG (RELATIONAL OPERATOR FLAG)
1562 e928 34 02 PSHS A SAVE FLAG (PRECEDENCE FLAG)
1563 e92a c6 01 LDB #1 *
1564 e92c bd e4 33 JSR LAC33 * SEE IF ROOM IN FREE RAM FOR (B) WORDS
1565 e92f bd e9 ef JSR LB223 GO EVALUATE AN EXPRESSION
1566 e932 0f 3f CLR TRELFL RESET RELATIONAL OPERATOR FLAG
1567 e934 9d 82 LB168 JSR GETCCH GET CURRENT INPUT CHARACTER
1568 * CHECK FOR RELATIONAL OPERATORS
1569 e936 80 ad LB16A SUBA #TOK_GREATER TOKEN FOR >
1570 e938 25 13 BCS LB181 BRANCH IF LESS THAN RELATIONAL OPERATORS
1571 e93a 81 03 CMPA #3 *
1572 e93c 24 0f BCC LB181 * BRANCH IF GREATER THAN RELATIONAL OPERATORS
1573 e93e 81 01 CMPA #1 SET CARRY IF <20>><3E>
1574 e940 49 ROLA CARRY TO BIT 0
1575 e941 98 3f EORA TRELFL * CARRY SET IF
1576 e943 91 3f CMPA TRELFL * TRELFL = ACCA
1577 e945 25 64 BCS LB1DF BRANCH IF SYNTAX ERROR : == << OR >>
1578 e947 97 3f STA TRELFL BIT 0: >, BIT 1 =, BIT 2: <
1579 e949 9d 7c JSR GETNCH GET AN INPUT CHARACTER
1580 e94b 20 e9 BRA LB16A CHECK FOR ANOTHER RELATIONAL OPERATOR
1581 *
1582 e94d d6 3f LB181 LDB TRELFL GET RELATIONAL OPERATOR FLAG
1583 e94f 26 33 BNE LB1B8 BRANCH IF RELATIONAL COMPARISON
1584 e951 10 24 00 6b LBCC LB1F4 BRANCH IF > RELATIONAL OPERATOR
1585 e955 8b 07 ADDA #7 SEVEN ARITHMETIC/LOGICAL OPERATORS
1586 e957 24 67 BCC LB1F4 BRANCH IF NOT ARITHMETIC/LOGICAL OPERATOR
1587 e959 99 06 ADCA VALTYP ADD CARRY, NUMERIC FLAG AND MODIFIED TOKEN NUMBER
1588 e95b 10 27 04 77 LBEQ LB60F BRANCH IF VALTYP = FF, AND ACCA = <20>+<2B> TOKEN -
1589 * CONCATENATE TWO STRINGS
1590 e95f 89 ff ADCA #-1 RESTORE ARITHMETIC/LOGICAL OPERATOR NUMBER
1591 e961 34 02 PSHS A * STORE OPERATOR NUMBER ON STACK; MULTIPLY IT BY 2
1592 e963 48 ASLA * THEN ADD THE STORED STACK DATA = MULTIPLY
1593 e964 ab e0 ADDA ,S+ * X 3; 3 BYTE/TABLE ENTRY
1594 e966 8e e2 4b LDX #LAA51 JUMP TABLE FOR ARITHMETIC & LOGICAL OPERATORS
1595 e969 30 86 LEAX A,X POINT X TO PROPER TABLE
1596 e96b 35 02 LB19F PULS A GET PRECEDENCE FLAG FROM STACK
1597 e96d a1 84 CMPA ,X COMPARE TO CURRENT OPERATOR
1598 e96f 24 55 BCC LB1FA BRANCH IF STACK OPERATOR > CURRENT OPERATOR
1599 e971 8d 9c BSR LB143 <20>TM<54> ERROR IF VARIABLE TYPE = STRING
1600
1601 * OPERATION BEING PROCESSED IS OF HIGHER PRECEDENCE THAN THE PREVIOUS OPERATION.
1602 e973 34 02 LB1A7 PSHS A SAVE PRECEDENCE FLAG
1603 e975 8d 29 BSR LB1D4 PUSH OPERATOR ROUTINE ADDRESS AND FPA0 ONTO STACK
1604 e977 9e 3d LDX RELPTR GET POINTER TO ARITHMETIC/LOGICAL TABLE ENTRY FOR
1605 * LAST CALCULATED OPERATION
1606 e979 35 02 PULS A GET PRECEDENCE FLAG OF PREVIOUS OPERATION
1607 e97b 26 1d BNE LB1CE BRANCH IF NOT END OF OPERATION
1608 e97d 4d TSTA CHECK TYPE OF PRECEDENCE FLAG
1609 e97e 10 27 00 6a LBEQ LB220 BRANCH IF END OF EXPRESSION OR SUB-EXPRESSION
1610 e982 20 4b BRA LB203 EVALUATE AN OPERATION
1611
1612 e984 08 06 LB1B8 ASL VALTYP BIT 7 OF TYPE FLAG TO CARRY
1613 e986 59 ROLB SHIFT RELATIONAL FLAG LEFT - VALTYP TO BIT 0
1614 e987 8d 09 BSR LB1C6 MOVE THE INPUT POINTER BACK ONE
1615 e989 8e e9 97 LDX #LB1CB POINT X TO RELATIONAL COMPARISON JUMP TABLE
1616 e98c d7 3f STB TRELFL SAVE RELATIONAL COMPARISON DATA
1617 e98e 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC
1618 e990 20 d9 BRA LB19F PERFORM OPERATION OR SAVE ON STACK
1619
1620 e992 9e 83 LB1C6 LDX CHARAD * GET BASIC<49>S INPUT POINTER AND
1621 e994 7e e6 ab JMP LAEBB * MOVE IT BACK ONE
1622 * RELATIONAL COMPARISON JUMP TABLE
1623 e997 64 LB1CB FCB $64 RELATIONAL COMPARISON FLAG
1624 e998 ea bb LB1CC FDB LB2F4 JUMP ADDRESS
1625
1626 e99a a1 84 LB1CE CMPA ,X COMPARE PRECEDENCE OF LAST DONE OPERATION TO
1627 * NEXT TO BE DONE OPERATION
1628 e99c 24 31 BCC LB203 EVALUATE OPERATION IF LOWER PRECEDENCE
1629 e99e 20 d3 BRA LB1A7 PUSH OPERATION DATA ON STACK IF HIGHER PRECEDENCE
1630
1631 * PUSH OPERATOR EVALUATION ADDRESS AND FPA0 ONTO STACK AND EVALUATE ANOTHER EXPR
1632 e9a0 ec 01 LB1D4 LDD 1,X GET ADDRESS OF OPERATOR ROUTINE
1633 e9a2 34 06 PSHS B,A SAVE IT ON THE STACK
1634 e9a4 8d 08 BSR LB1E2 PUSH FPA0 ONTO STACK
1635 e9a6 d6 3f LDB TRELFL GET BACK RELATIONAL OPERATOR FLAG
1636 e9a8 16 ff 7b LBRA LB15A EVALUATE ANOTHER EXPRESSION
1637 e9ab 7e ea 43 LB1DF JMP LB277 <20>SYNTAX ERROR<4F>
1638 * PUSH FPA0 ONTO THE STACK. ,S = EXPONENT
1639 * 1-2,S =HIGH ORDER MANTISSA 3-4,S = LOW ORDER MANTISSA
1640 * 5,S = SIGN RETURN WITH PRECEDENCE CODE IN ACCA
1641 e9ae d6 54 LB1E2 LDB FP0SGN GET SIGN OF FPA0 MANTISSA
1642 e9b0 a6 84 LDA ,X GET PRECEDENCE CODE TO ACCA
1643 e9b2 35 20 LB1E6 PULS Y GET RETURN ADDRESS FROM STACK & PUT IT IN Y
1644 e9b4 34 04 PSHS B SAVE ACCB ON STACK
1645 e9b6 d6 4f LB1EA LDB FP0EXP * PUSH FPA0 ONTO THE STACK
1646 e9b8 9e 50 LDX FPA0 *
1647 e9ba de 52 LDU FPA0+2 *
1648 e9bc 34 54 PSHS U,X,B *
1649 e9be 6e a4 JMP ,Y JUMP TO ADDRESS IN Y
1650
1651 * BRANCH HERE IF NON-OPERATOR CHARACTER FOUND - USUALLY <20>)<29> OR END OF LINE
1652 e9c0 9e 74 LB1F4 LDX ZERO POINT X TO DUMMY VALUE (ZERO)
1653 e9c2 a6 e0 LDA ,S+ GET PRECEDENCE FLAG FROM STACK
1654 e9c4 27 26 BEQ LB220 BRANCH IF END OF EXPRESSION
1655 e9c6 81 64 LB1FA CMPA #$64 * CHECK FOR RELATIONAL COMPARISON FLAG
1656 e9c8 27 03 BEQ LB201 * AND BRANCH IF RELATIONAL COMPARISON
1657 e9ca bd e9 0f JSR LB143 <20>TM<54> ERROR IF VARIABLE TYPE = STRING
1658 e9cd 9f 3d LB201 STX RELPTR SAVE POINTER TO OPERATOR ROUTINE
1659 e9cf 35 04 LB203 PULS B GET RELATIONAL OPERATOR FLAG FROM STACK
1660 e9d1 81 5a CMPA #$5A CHECK FOR <20>NOT<4F> OPERATOR
1661 e9d3 27 19 BEQ LB222 RETURN IF <20>NOT<4F> - NO RELATIONAL COMPARISON
1662 e9d5 81 7d CMPA #$7D CHECK FOR NEGATION (UNARY) FLAG
1663 e9d7 27 15 BEQ LB222 RETURN IF NEGATION - NO RELATIONAL COMPARISON
1664
1665 * EVALUATE AN OPERATION. EIGHT BYTES WILL BE STORED ON STACK, FIRST SIX BYTES
1666 * ARE A TEMPORARY FLOATING POINT RESULT THEN THE ADDRESS OF ROUTINE WHICH
1667 * WILL EVALUATE THE OPERATION. THE RTS AT END OF ROUTINE WILL VECTOR
1668 * TO EVALUATING ROUTINE.
1669 e9d9 54 LSRB = ROTATE VALTYP BIT INTO CARRY
1670 e9da d7 0a STB RELFLG = FLAG AND SAVE NEW RELFLG
1671 e9dc 35 52 PULS A,X,U * PULL A FP VALUE OFF OF THE STACK
1672 e9de 97 5c STA FP1EXP * AND SAVE IT IN FPA1
1673 e9e0 9f 5d STX FPA1 *
1674 e9e2 df 5f STU FPA1+2 *
1675 e9e4 35 04 PULS B = GET MANTISSA SIGN AND
1676 e9e6 d7 61 STB FP1SGN = SAVE IT IN FPA1
1677 e9e8 d8 54 EORB FP0SGN EOR IT WITH FPA1 MANTISSA SIGN
1678 e9ea d7 62 STB RESSGN SAVE IT IN RESULT SIGN BYTE
1679 e9ec d6 4f LB220 LDB FP0EXP GET EXPONENT OF FPA0
1680 e9ee 39 LB222 RTS
1681
1682 e9ef bd fc 39 LB223 JSR XVEC15 CALL EXTENDED BASIC ADD-IN
1683 e9f2 0f 06 CLR VALTYP INITIALIZE TYPE FLAG TO NUMERIC
1684 e9f4 9d 7c JSR GETNCH GET AN INPUT CHAR
1685 e9f6 24 03 BCC LB22F BRANCH IF NOT NUMERIC
1686 e9f8 7e f4 9b LB22C JMP LBD12 CONVERT ASCII STRING TO FLOATING POINT -
1687 * RETURN RESULT IN FPA0
1688 * PROCESS A NON NUMERIC FIRST CHARACTER
1689 e9fb bd eb 69 LB22F JSR LB3A2 SET CARRY IF NOT ALPHA
1690 e9fe 24 50 BCC LB284 BRANCH IF ALPHA CHARACTER
1691 ea00 81 2e CMPA #'. IS IT <20>.<2E> (DECIMAL POINT)?
1692 ea02 27 f4 BEQ LB22C CONVERT ASCII STRING TO FLOATING POINT
1693 ea04 81 a7 CMPA #TOK_MINUS MINUS TOKEN
1694 ea06 27 40 BEQ LB27C YES - GO PROCESS THE MINUS OPERATOR
1695 ea08 81 a6 CMPA #TOK_PLUS PLUS TOKEN
1696 ea0a 27 e3 BEQ LB223 YES - GET ANOTHER CHARACTER
1697 ea0c 81 22 CMPA #'" STRING DELIMITER?
1698 ea0e 26 0a BNE LB24E NO
1699 ea10 9e 83 LB244 LDX CHARAD CURRENT BASIC POINTER TO X
1700 ea12 bd ec df JSR LB518 SAVE STRING ON STRING STACK
1701 ea15 9e 64 LB249 LDX COEFPT * GET ADDRESS OF END OF STRING AND
1702 ea17 9f 83 STX CHARAD * PUT BASIC<49>S INPUT POINTER THERE
1703 ea19 39 RTS
1704 ea1a 81 a3 LB24E CMPA #TOK_NOT NOT TOKEN?
1705 ea1c 26 0d BNE LB25F NO
1706 * PROCESS THE NOT OPERATOR
1707 ea1e 86 5a LDA #$5A <20>NOT<4F> PRECEDENCE FLAG
1708 ea20 bd e9 26 JSR LB15A PROCESS OPERATION FOLLOWING <20>NOT<4F>
1709 ea23 bd eb b4 JSR INTCNV CONVERT FPA0 TO INTEGER IN ACCD
1710 ea26 43 COMA * <20>NOT<4F> THE INTEGER
1711 ea27 53 COMB *
1712 ea28 7e ec bb JMP GIVABF CONVERT ACCD TO FLOATING POINT (FPA0)
1713 ea2b 4c LB25F INCA CHECK FOR TOKENS PRECEEDED BY $FF
1714 ea2c 27 2e BEQ LB290 IT WAS PRECEEDED BY $FF
1715 ea2e 8d 06 LB262 BSR LB26A SYNTAX CHECK FOR A <20>(<28>
1716 ea30 bd e9 22 JSR LB156 EVALUATE EXPRESSIONS WITHIN PARENTHESES AT
1717 * HIGHEST PRECEDENCE
1718 ea33 c6 29 LB267 LDB #') SYNTAX CHECK FOR <20>)<29>
1719 ea35 8c FCB SKP2 SKIP 2 BYTES
1720 ea36 c6 28 LB26A LDB #'( SYNTAX CHECK FOR <20>(<28>
1721 ea38 8c FCB SKP2 SKIP 2 BYTES
1722 ea39 c6 2c LB26D LDB #', SYNTAX CHECK FOR COMMA
1723 ea3b e1 9f 00 83 LB26F CMPB [CHARAD] * COMPARE ACCB TO CURRENT INPUT
1724 ea3f 26 02 BNE LB277 * CHARACTER - SYNTAX ERROR IF NO MATCH
1725 ea41 0e 7c JMP GETNCH GET A CHARACTER FROM BASIC
1726 ea43 c6 02 LB277 LDB #2*1 SYNTAX ERROR
1727 ea45 7e e4 46 JMP LAC46 JUMP TO ERROR HANDLER
1728
1729 * PROCESS THE MINUS (UNARY) OPERATOR
1730 ea48 86 7d LB27C LDA #$7D MINUS (UNARY) PRECEDENCE FLAG
1731 ea4a bd e9 26 JSR LB15A PROCESS OPERATION FOLLOWING <20>UNARY<52> NEGATION
1732 ea4d 7e f6 72 JMP LBEE9 CHANGE SIGN OF FPA0 MANTISSA
1733
1734 * EVALUATE ALPHA EXPRESSION
1735 ea50 bd eb 1e LB284 JSR LB357 FIND THE DESCRIPTOR ADDRESS OF A VARIABLE
1736 ea53 9f 52 LB287 STX FPA0+2 SAVE DESCRIPTOR ADDRESS IN FPA0
1737 ea55 96 06 LDA VALTYP TEST VARIABLE TYPE
1738 ea57 26 95 BNE LB222 RETURN IF STRING
1739 ea59 7e f3 9d JMP LBC14 COPY A FP NUMBER FROM (X) TO FPA0
1740
1741 * EVALUATING A SECONDARY TOKEN
1742 ea5c 9d 7c LB290 JSR GETNCH GET AN INPUT CHARACTER (SECONDARY TOKEN)
1743 ea5e 1f 89 TFR A,B SAVE IT IN ACCB
1744 ea60 58 ASLB X2 & BET RID OF BIT 7
1745 ea61 9d 7c JSR GETNCH GET ANOTHER INPUT CHARACTER
1746 ea63 c1 38 CMPB #NUM_SEC_FNS-1*2 29 SECONDARY FUNCTIONS - 1
1747 ea65 23 03 BLS LB29F BRANCH IF COLOR BASIC TOKEN
1748 ea67 7e ea 43 JMP LB277 SYNTAX ERROR
1749 ea6a 34 04 LB29F PSHS B SAVE TOKEN OFFSET ON STACK
1750 ea6c c1 2a CMPB #TOK_LEFT-$80*2 CHECK FOR TOKEN WITH AN ARGUMENT
1751 ea6e 25 1e BCS LB2C7 DO SECONDARIES STRING$ OR LESS
1752 ea70 c1 30 CMPB #TOK_INKEY-$80*2 *
1753 ea72 24 1c BCC LB2C9 * DO SECONDARIES $92 (INKEY$) OR >
1754 ea74 8d c0 BSR LB26A SYNTAX CHECK FOR A <20>(<28>
1755 ea76 a6 e4 LDA ,S GET TOKEN NUMBER
1756 * DO SECONDARIES (LEFT$, RIGHT$, MID$)
1757 ea78 bd e9 22 JSR LB156 EVALUATE FIRST STRING IN ARGUMENT
1758 ea7b 8d bc BSR LB26D SYNTAX CHECK FOR A COMMA
1759 ea7d bd e9 12 JSR LB146 <20>TM<54> ERROR IF NUMERIC VARiABLE
1760 ea80 35 02 PULS A GET TOKEN OFFSET FROM STACK
1761 ea82 de 52 LDU FPA0+2 POINT U TO STRING DESCRIPTOR
1762 ea84 34 42 PSHS U,A SAVE TOKEN OFFSET AND DESCRIPTOR ADDRESS
1763 ea86 bd ee d2 JSR LB70B EVALUATE FIRST NUMERIC ARGUMENT
1764 ea89 35 02 PULS A GET TOKEN OFFSET FROM STACK
1765 ea8b 34 06 PSHS B,A SAVE TOKEN OFFSET AND NUMERIC ARGUMENT
1766 ea8d 8e FCB $8E OP CODE OF LDX# - SKlP 2 BYTES
1767 ea8e 8d 9e LB2C7 BSR LB262 SYNTAX CHECK FOR A <20>(<28>
1768 ea90 35 04 LB2C9 PULS B GET TOKEN OFFSET
1769 ea92 be e1 1d LDX COMVEC+8 GET SECONDARY FUNCTION JUMP TABLE ADDRESS
1770 ea95 3a LB2CE ABX ADD IN COMMAND OFFSET
1771 *
1772 * HERE IS WHERE WE BRANCH TO A SECONDARY FUNCTION
1773 ea96 ad 94 JSR [,X] GO DO AN SECONDARY FUNCTION
1774 ea98 7e e9 0f JMP LB143 <20>TM<54> ERROR IF VARIABLE TYPE = STRING
1775
1776 * LOGICAL OPERATOR <20>OR<4F> JUMPS HERE
1777 ea9b 86 LB2D4 FCB SKP1LD SKIP ONE BYTE - <20>OR<4F> FLAG = $4F
1778
1779 * LOGICAL OPERATOR <20>AND<4E> JUMPS HERE
1780 ea9c 4f LB2D5 CLRA AND FLAG = 0
1781 ea9d 97 03 STA TMPLOC AND/OR FLAG
1782 ea9f bd eb b4 JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD
1783 eaa2 dd 01 STD CHARAC TEMP SAVE ACCD
1784 eaa4 bd f3 d3 JSR LBC4A MOVE FPA1 TO FPA0
1785 eaa7 bd eb b4 JSR INTCNV CONVERT FPA0 INTO AN INTEGER IN ACCD
1786 eaaa 0d 03 TST TMPLOC CHECK AND/OR FLAG
1787 eaac 26 06 BNE LB2ED BRANCH IF OR
1788 eaae 94 01 ANDA CHARAC * <20>AND<4E> ACCD WITH FPA0 INTEGER
1789 eab0 d4 02 ANDB ENDCHR * STORED IN ENDCHR
1790 eab2 20 04 BRA LB2F1 CONVERT TO FP
1791 eab4 9a 01 LB2ED ORA CHARAC * <20>OR<4F> ACCD WITH FPA0 INTEGER
1792 eab6 da 02 ORB ENDCHR * STORED IN CHARAC
1793 eab8 7e ec bb LB2F1 JMP GIVABF CONVERT THE VALUE IN ACCD INTO A FP NUMBER
1794
1795 * RELATIONAL COMPARISON PROCESS HANDLER
1796 eabb bd e9 14 LB2F4 JSR LB148 <20>TM<54> ERROR IF TYPE MISMATCH
1797 eabe 26 10 BNE LB309 BRANCH IF STRING VARIABLE
1798 eac0 96 61 LDA FP1SGN * <20>PACK<43> THE MANTISSA
1799 eac2 8a 7f ORA #$7F * SIGN OF FPA1 INTO
1800 eac4 94 5d ANDA FPA1 * BIT 7 OF THE
1801 eac6 97 5d STA FPA1 * MANTISSA MS BYTE
1802 eac8 8e 00 5c LDX #FP1EXP POINT X TO FPA1
1803 eacb bd f4 1f JSR LBC96 COMPARE FPA0 TO FPA1
1804 eace 20 36 BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON
1805
1806 * RELATIONAL COMPARISON OF STRINGS
1807 ead0 0f 06 LB309 CLR VALTYP SET VARIABLE TYPE TO NUMERIC
1808 ead2 0a 3f DEC TRELFL REMOVE STRING TYPE FLAG (BIT0=1 FOR STRINGS) FROM THE
1809 * DESIRED RELATIONAL COMPARISON DATA
1810 ead4 bd ee 1e JSR LB657 GET LENGTH AND ADDRESS OF STRING WHOSE
1811 * DESCRIPTOR ADDRESS IS IN THE BOTTOM OF FPA0
1812 ead7 d7 56 STB STRDES * SAVE LENGTH AND ADDRESS IN TEMPORARY
1813 ead9 9f 58 STX STRDES+2 * DESCRIPTOR (STRING B)
1814 eadb 9e 5f LDX FPA1+2 = RETURN LENGTH AND ADDRESS OF STRING
1815 eadd bd ee 20 JSR LB659 = WHOSE DESCRIPTOR ADDRESS IS STORED IN FPA1+2
1816 eae0 96 56 LDA STRDES LOAD ACCA WITH LENGTH OF STRING B
1817 eae2 34 04 PSHS B SAVE LENGTH A ON STACK
1818 eae4 a0 e0 SUBA ,S+ SUBTRACT LENGTH A FROM LENGTH B
1819 eae6 27 07 BEQ LB328 BRANCH IF STRINGS OF EQUAL LENGTH
1820 eae8 86 01 LDA #1 TRUE FLAG
1821 eaea 24 03 BCC LB328 TRUE IF LENGTH B > LENGTH A
1822 eaec d6 56 LDB STRDES LOAD ACCB WITH LENGTH B
1823 eaee 40 NEGA SET FLAG = FALSE (1FF)
1824 eaef 97 54 LB328 STA FP0SGN SAVE TRUE/FALSE FLAG
1825 eaf1 de 58 LDU STRDES+2 POINT U TO START OF STRING
1826 eaf3 5c INCB COMPENSATE FOR THE DECB BELOW
1827 * ENTER WITH ACCB CONTAINING LENGTH OF SHORTER STRING
1828 eaf4 5a LB32D DECB DECREMENT SHORTER STRING LENGTH
1829 eaf5 26 04 BNE LB334 BRANCH IF ALL OF STRING NOT COMPARED
1830 eaf7 d6 54 LDB FP0SGN GET TRUE/FALSE FLAB
1831 eaf9 20 0b BRA LB33F CHECK TRUTH OF RELATIONAL COMPARISON
1832 eafb a6 80 LB334 LDA ,X+ GET A BYTE FROM STRING A
1833 eafd a1 c0 CMPA ,U+ COMPARE TO STRING B
1834 eaff 27 f3 BEQ LB32D CHECK ANOTHER CHARACTER IF =
1835 eb01 c6 ff LDB #$FF FALSE FLAG IF STRING A > B
1836 eb03 24 01 BCC LB33F BRANCH IF STRING A > STRING B
1837 eb05 50 NEGB SET FLAG = TRUE
1838
1839 * DETERMINE TRUTH OF COMPARISON - RETURN RESULT IN FPA0
1840 eb06 cb 01 LB33F ADDB #1 CONVERT $FF,0,1 TO 0,1,2
1841 eb08 59 ROLB NOW IT<49>S 1,2,4 FOR > = <
1842 eb09 d4 0a ANDB RELFLG <20>AND<4E> THE ACTUAL COMPARISON WITH THE DESIRED -
1843 COMPARISON
1844 eb0b 27 02 BEQ LB348 BRANCH IF FALSE (NO MATCHING BITS)
1845 eb0d c6 ff LDB #$FF TRUE FLAG
1846 eb0f 7e f4 05 LB348 JMP LBC7C CONVERT ACCB INTO FP NUMBER IN FPA0
1847
1848 * DIM
1849 eb12 bd ea 39 LB34B JSR LB26D SYNTAX CHECK FOR COMMA
1850 eb15 c6 01 DIM LDB #1 DIMENSION FLAG
1851 eb17 8d 08 BSR LB35A SAVE ARRAY SPACE FOR THIS VARIABLE
1852 eb19 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1853 eb1b 26 f5 BNE LB34B KEEP DIMENSIONING IF NOT END OF LINE
1854 eb1d 39 RTS
1855 * EVALUATE A VARIABLE - RETURN X AND
1856 * VARPTR POINTING TO VARIABLE DESCRIPTOR
1857 * EACH VARIABLE REQUIRES 7 BYTES - THE FIRST TWO
1858 * BYTES ARE THE VARIABLE NAME AND THE NEXT 5
1859 * BYTES ARE THE DESCRIPTOR. IF BIT 7 OF THE
1860 * FIRST BYTE OF VARlABLE NAME IS SET, THE
1861 * VARIABLE IS A DEF FN VARIABLE. IF BIT 7 OF
1862 * THE SECOND BYTE OF VARIABLE NAME IS SET, THE
1863 * VARIABLE IS A STRING, OTHERWISE THE VARIABLE
1864 * IS NUMERIC.
1865 * IF THE VARIABLE IS NOT FOUND, A ZERO VARIABLE IS
1866 * INSERTED INTO THE VARIABLE SPACE
1867 eb1e 5f LB357 CLRB DIMENSION FLAG = 0; DO NOT SET UP AN ARRAY
1868 eb1f 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1869 eb21 d7 05 LB35A STB DIMFLG SAVE ARRAY FLAG
1870 * ENTRY POINT FOR DEF FN VARIABLE SEARCH
1871 eb23 97 37 LB35C STA VARNAM SAVE INPUT CHARACTER
1872 eb25 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1873 eb27 8d 40 BSR LB3A2 SET CARRY IF NOT ALPHA
1874 eb29 10 25 ff 16 LBCS LB277 SYNTAX ERROR IF NOT ALPHA
1875 eb2d 5f CLRB DEFAULT 2ND VARIABLE CHARACTER TO ZERO
1876 eb2e d7 06 STB VALTYP SET VARIABLE TYPE TO NUMERIC
1877 eb30 9d 7c JSR GETNCH GET ANOTHER CHARACTER FROM BASIC
1878 eb32 25 04 BCS LB371 BRANCH IF NUMERIC (2ND CHARACTER IN
1879 * VARIABLE MAY BE NUMERIC)
1880 eb34 8d 33 BSR LB3A2 SET CARRY IF NOT ALPHA
1881 eb36 25 0a BCS LB37B BRANCH IF NOT ALPHA
1882 eb38 1f 89 LB371 TFR A,B SAVE 2ND CHARACTER IN ACCB
1883 * READ INPUT CHARACTERS UNTIL A NON ALPHA OR
1884 * NON NUMERIC IS FOUND - IGNORE ALL CHARACTERS
1885 * IN VARIABLE NAME AFTER THE 1ST TWO
1886 eb3a 9d 7c LB373 JSR GETNCH GET AN INPUT CHARACTER
1887 eb3c 25 fc BCS LB373 BRANCH IF NUMERIC
1888 eb3e 8d 29 BSR LB3A2 SET CARRY IF NOT ALPHA
1889 eb40 24 f8 BCC LB373 BRANCH IF ALPHA
1890 eb42 81 24 LB37B CMPA #'$ CHECK FOR A STRING VARIABLE
1891 eb44 26 06 BNE LB385 BRANCH IF IT IS NOT A STRING
1892 eb46 03 06 COM VALTYP SET VARIABLE TYPE TO STRING
1893 eb48 cb 80 ADDB #$80 SET BIT 7 OF 2ND CHARACTER (STRING)
1894 eb4a 9d 7c JSR GETNCH GET AN INPUT CHARACTER
1895 eb4c d7 38 LB385 STB VARNAM+1 SAVE 2ND CHARACTER IN VARNAM+1
1896 eb4e 9a 08 ORA ARYDIS OR IN THE ARRAY DISABLE FLAG - IF = $80,
1897 * DON<4F>T SEARCH FOR VARIABLES IN THE ARRAYS
1898 eb50 80 28 SUBA #'( IS THIS AN ARRAY VARIABLE?
1899 eb52 10 27 00 75 LBEQ LB404 BRANCH IF IT IS
1900 eb56 0f 08 CLR ARYDIS RESET THE ARRAY DISABLE FLAG
1901 eb58 9e 1b LDX VARTAB POINT X TO THE START OF VARIABLES
1902 eb5a dc 37 LDD VARNAM GET VARIABLE IN QUESTION
1903 eb5c 9c 1d LB395 CMPX ARYTAB COMPARE X TO THE END OF VARIABLES
1904 eb5e 27 12 BEQ LB3AB BRANCH IF END OF VARIABLES
1905 eb60 10 a3 81 CMPD ,X++ * COMPARE VARIABLE IN QUESTION TO CURRENT
1906 eb63 27 3e BEQ LB3DC * VARIABLE AND BRANCH IF MATCH
1907 eb65 30 05 LEAX 5,X = MOVE POINTER TO NEXT VARIABLE AND
1908 eb67 20 f3 BRA LB395 = KEEP LOOKING
1909
1910 * SET CARRY IF NOT UPPER CASE ALPHA
1911 eb69 81 41 LB3A2 CMPA #'A * CARRY SET IF < <20>A<EFBFBD>
1912 eb6b 25 04 BCS LB3AA *
1913 eb6d 80 5b SUBA #'Z+1 =
1914 * SUBA #-('Z+1) = CARRY CLEAR IF <= 'Z'
1915 eb6f 80 a5 FCB $80,$A5
1916 eb71 39 LB3AA RTS
1917 * PUT A NEW VARIABLE IN TABLE OF VARIABLES
1918 eb72 8e 00 74 LB3AB LDX #ZERO POINT X TO ZERO LOCATION
1919 eb75 ee e4 LDU ,S GET CURRENT RETURN ADDRESS
1920 eb77 11 83 ea 53 CMPU #LB287 DID WE COME FROM <20>EVALUATE ALPHA EXPR<50>?
1921 eb7b 27 28 BEQ LB3DE YES - RETURN A ZERO VALUE
1922 eb7d dc 1f LDD ARYEND * GET END OF ARRAYS ADDRESS AND
1923 eb7f dd 43 STD V43 * SAVE IT AT V43
1924 eb81 c3 00 07 ADDD #7 = ADD 7 TO END OF ARRAYS (EACH
1925 eb84 dd 41 STD V41 = VARIABLE = 7 BYTES) AND SAVE AT V41
1926 eb86 9e 1d LDX ARYTAB * GET END OF VARIABLES AND SAVE AT V47
1927 eb88 9f 47 STX V47 *
1928 eb8a bd e4 1e JSR LAC1E MAKE A SEVEN BYTE SLOT FOR NEW VARIABLE AT
1929 * TOP OF VARIABLES
1930 eb8d 9e 41 LDX V41 = GET NEW END OF ARRAYS AND SAVE IT
1931 eb8f 9f 1f STX ARYEND =
1932 eb91 9e 45 LDX V45 * GET NEW END OF VARIABLES AND SAVE IT
1933 eb93 9f 1d STX ARYTAB *
1934 eb95 9e 47 LDX V47 GET OLD END OF VARIABLES
1935 eb97 dc 37 LDD VARNAM GET NEW VARIABLE NAME
1936 eb99 ed 81 STD ,X++ SAVE VARIABLE NAME
1937 eb9b 4f CLRA * ZERO OUT THE FP VALUE OF THE NUMERIC
1938 eb9c 5f CLRB * VARIABLE OR THE LENGTH AND ADDRESS
1939 eb9d ed 84 STD ,X * OF A STRING VARIABLE
1940 eb9f ed 02 STD 2,X *
1941 eba1 a7 04 STA 4,X *
1942 eba3 9f 39 LB3DC STX VARPTR STORE ADDRESS OF VARIABLE VALUE
1943 eba5 39 LB3DE RTS
1944 *
1945 eba6 90 80 00 00 00 LB3DF FCB $90,$80,$00,$00,$00 * FLOATING POINT -32768
1946 * SMALLEST SIGNED TWO BYTE INTEGER
1947 *
1948 ebab 9d 7c LB3E4 JSR GETNCH GET AN INPUT CHARACTER FROM BASIC
1949 ebad bd e9 0d LB3E6 JSR LB141 GO EVALUATE NUMERIC EXPRESSION
1950 ebb0 96 54 LB3E9 LDA FP0SGN GET FPA0 MANTISSA SIGN
1951 ebb2 2b 5d BMI LB44A <20>FC<46> ERROR IF NEGATIVE NUMBER
1952
1953
1954 ebb4 bd e9 0f INTCNV JSR LB143 <20>TM<54> ERROR IF STRING VARIABLE
1955 ebb7 96 4f LDA FP0EXP GET FPA0 EXPONENT
1956 ebb9 81 90 CMPA #$90 * COMPARE TO 32768 - LARGEST INTEGER EXPONENT AND
1957 ebbb 25 08 BCS LB3FE * BRANCH IF FPA0 < 32768
1958 ebbd 8e eb a6 LDX #LB3DF POINT X TO FP VALUE OF -32768
1959 ebc0 bd f4 1f JSR LBC96 COMPARE -32768 TO FPA0
1960 ebc3 26 4c BNE LB44A <20>FC<46> ERROR IF NOT =
1961 ebc5 bd f4 51 LB3FE JSR LBCC8 CONVERT FPA0 TO A TWO BYTE INTEGER
1962 ebc8 dc 52 LDD FPA0+2 GET THE INTEGER
1963 ebca 39 RTS
1964 * EVALUATE AN ARRAY VARIABLE
1965 ebcb dc 05 LB404 LDD DIMFLG GET ARRAY FLAG AND VARIABLE TYPE
1966 ebcd 34 06 PSHS B,A SAVE THEM ON STACK
1967 ebcf 12 NOP DEAD SPACE CAUSED BY 1.2 REVISION
1968 ebd0 5f CLRB RESET DIMENSION COUNTER
1969 ebd1 9e 37 LB40A LDX VARNAM GET VARIABLE NAME
1970 ebd3 34 14 PSHS X,B SAVE VARIABLE NAME AND DIMENSION COUNTER
1971 ebd5 8d d4 BSR LB3E4 EVALUATE EXPRESSION (DIMENSlON LENGTH)
1972 ebd7 35 34 PULS B,X,Y PULL OFF VARIABLE NAME, DIMENSlON COUNTER,
1973 * ARRAY FLAG
1974 ebd9 9f 37 STX VARNAM SAVE VARIABLE NAME AND VARIABLE TYPE
1975 ebdb de 52 LDU FPA0+2 GET DIMENSION LENGTH
1976 ebdd 34 60 PSHS U,Y SAVE DIMENSION LENGTH, ARRAY FLAG, VARIABLE TYPE
1977 ebdf 5c INCB INCREASE DIMENSION COUNTER
1978 ebe0 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
1979 ebe2 81 2c CMPA #', CHECK FOR ANOTHER DIMENSION
1980 ebe4 27 eb BEQ LB40A BRANCH IF MORE
1981 ebe6 d7 03 STB TMPLOC SAVE DIMENSION COUNTER
1982 ebe8 bd ea 33 JSR LB267 SYNTAX CHECK FOR A <20>)<29>
1983 ebeb 35 06 PULS A,B * RESTORE VARIABLE TYPE AND ARRAY
1984 ebed dd 05 STD DIMFLG * FLAG - LEAVE DIMENSION LENGTH ON STACK
1985 ebef 9e 1d LDX ARYTAB GET START OF ARRAYS
1986 ebf1 9c 1f LB42A CMPX ARYEND COMPARE TO END OF ARRAYS
1987 ebf3 27 21 BEQ LB44F BRANCH IF NO MATCH FOUND
1988 ebf5 dc 37 LDD VARNAM GET VARIABLE IN QUESTION
1989 ebf7 10 a3 84 CMPD ,X COMPARE TO CURRENT VARIABLE
1990 ebfa 27 06 BEQ LB43B BRANCH IF =
1991 ebfc ec 02 LDD 2,X GET OFFSET TO NEXT ARRAY VARIABLE
1992 ebfe 30 8b LEAX D,X ADD TO CURRENT POINTER
1993 ec00 20 ef BRA LB42A KEEP SEARCHING
1994 ec02 c6 12 LB43B LDB #2*9 <20>REDIMENSIONED ARRAY<41> ERROR
1995 ec04 96 05 LDA DIMFLG * TEST ARRAY FLAG - IF <>0 YOU ARE TRYING
1996 ec06 26 0b BNE LB44C * TO REDIMENSION AN ARRAY
1997 ec08 d6 03 LDB TMPLOC GET NUMBER OF DIMENSIONS IN ARRAY
1998 ec0a e1 04 CMPB 4,X COMPARE TO THIS ARRAYS DIMENSIONS
1999 ec0c 27 59 BEQ LB4A0 BRANCH IF =
2000 ec0e c6 10 LB447 LDB #8*2 <20>BAD SUBSCRIPT<50>
2001 ec10 8c FCB SKP2 SKIP TWO BYTES
2002 ec11 c6 08 LB44A LDB #4*2 <20>ILLEGAL FUNCTION CALL<4C>
2003 ec13 7e e4 46 LB44C JMP LAC46 JUMP TO ERROR SERVICING ROUTINE
2004
2005 * INSERT A NEW ARRAY INTO ARRAY VARIABLES
2006 * EACH SET OF ARRAY VARIABLES IS PRECEEDED BY A DE-
2007 * SCRIPTOR BLOCK COMPOSED OF 5+2*N BYTES WHERE N IS THE
2008 * NUMBER OF DIMENSIONS IN THE ARRAY. THE BLOCK IS DEFINED
2009 * AS FOLLOWS: BYTES 0,1:VARIABLE<4C>S NAME; 2,3:TOTAL LENGTH
2010 * OF ARRAY ITEMS AND DESCRIPTOR BLOCK; 4:NUMBER OF DIMEN-
2011 * ISIONS; 5,6:LENGTH OF DIMENSION 1; 7,8:LENGTH OF DIMEN-
2012 * SION 2;<3B> 4+N,5+N:LENGTH OF DIMENSION N.
2013
2014 ec16 cc 00 05 LB44F LDD #5 * 5 BYTES/ARRAY ENTRY SAVE AT COEFPT
2015 ec19 dd 64 STD COEFPT *
2016 ec1b dc 37 LDD VARNAM = GET NAME OF ARRAY AND SAVE IN
2017 ec1d ed 84 STD ,X = FIRST 2 BYTES OF DESCRIPTOR
2018 ec1f d6 03 LDB TMPLOC GET NUMBER OF DIMENSIONS AND SAVE IN
2019 ec21 e7 04 STB 4,X * 5TH BYTE OF DESCRIPTOR
2020 ec23 bd e4 33 JSR LAC33 CHECK FOR ROOM FOR DESCRIPTOR IN FREE RAM
2021 ec26 9f 41 STX V41 TEMPORARILY SAVE DESCRIPTOR ADDRESS
2022 ec28 c6 0b LB461 LDB #11 * DEFAULT DIMENSION VALUE:X(10)
2023 ec2a 4f CLRA *
2024 ec2b 0d 05 TST DIMFLG = CHECK ARRAY FLAG AND BRANCH IF
2025 ec2d 27 05 BEQ LB46D = NOT DIMENSIONING AN ARRAY
2026 ec2f 35 06 PULS A,B GET DIMENSION LENGTH
2027 ec31 c3 00 01 ADDD #1 ADD ONE (X(0) HAS A LENGTH OF ONE)
2028 ec34 ed 05 LB46D STD 5,X SAVE LENGTH OF ARRAY DIMENSION
2029 ec36 8d 5d BSR LB4CE MULTIPLY ACCUM ARRAY SIZE NUMBER LENGTH
2030 * OF NEW DIMENSION
2031 ec38 dd 64 STD COEFPT TEMP STORE NEW CURRENT ACCUMULATED ARRAY SIZE
2032 ec3a 30 02 LEAX 2,X BUMP POINTER UP TWO
2033 ec3c 0a 03 DEC TMPLOC * DECREMENT DIMENSION COUNTER AND BRANCH IF
2034 ec3e 26 e8 BNE LB461 * NOT DONE WITH ALL DIMENSIONS
2035 ec40 9f 0f STX TEMPTR SAVE ADDRESS OF (END OF ARRAY DESCRIPTOR - 5)
2036 ec42 d3 0f ADDD TEMPTR ADD TOTAL SIZE OF NEW ARRAY
2037 ec44 10 25 f7 fc LBCS LAC44 <20>OM<4F> ERROR IF > $FFFF
2038 ec48 1f 01 TFR D,X SAVE END OF ARRAY IN X
2039 ec4a bd e4 37 JSR LAC37 MAKE SURE THERE IS ENOUGH FREE RAM FOR ARRAY
2040 ec4d 83 00 35 SUBD #STKBUF-5 SUBTRACT OUT THE (STACK BUFFER - 5)
2041 ec50 dd 1f STD ARYEND SAVE NEW END OF ARRAYS
2042 ec52 4f CLRA ZERO = TERMINATOR BYTE
2043 ec53 30 1f LB48C LEAX -1,X * STORE TWO TERMINATOR BYTES AT
2044 ec55 a7 05 STA 5,X * THE END OF THE ARRAY DESCRIPTOR
2045 ec57 9c 0f CMPX TEMPTR *
2046 ec59 26 f8 BNE LB48C *
2047 ec5b 9e 41 LDX V41 GET ADDRESS OF START OF DESCRIPTOR
2048 ec5d 96 1f LDA ARYEND GET MSB OF END OF ARRAYS; LSB ALREADY THERE
2049 ec5f 93 41 SUBD V41 SUBTRACT OUT ADDRESS OF START OF DESCRIPTOR
2050 ec61 ed 02 STD 2,X SAVE LENGTH OF (ARRAY AND DESCRIPTOR)
2051 ec63 96 05 LDA DIMFLG * GET ARRAY FLAG AND BRANCH
2052 ec65 26 2d BNE LB4CD * BACK IF DIMENSIONING
2053 * CALCULATE POINTER TO CORRECT ELEMENT
2054 ec67 e6 04 LB4A0 LDB 4,X GET THE NUMBER OF DIMENSIONS
2055 ec69 d7 03 STB TMPLOC TEMPORARILY SAVE
2056 ec6b 4f CLRA * INITIALIZE POINTER
2057 ec6c 5f CLRB * TO ZERO
2058 ec6d dd 64 LB4A6 STD COEFPT SAVE ACCUMULATED POINTER
2059 ec6f 35 06 PULS A,B * PULL DIMENSION ARGUMENT OFF THE
2060 ec71 dd 52 STD FPA0+2 * STACK AND SAVE IT
2061 ec73 10 a3 05 CMPD 5,X COMPARE TO STORED <20>DIM<49> ARGUMENT
2062 ec76 24 3a BCC LB4EB <20>BS<42> ERROR IF > = "DIM" ARGUMENT
2063 ec78 de 64 LDU COEFPT * GET ACCUMULATED POINTER AND
2064 ec7a 27 04 BEQ LB4B9 * BRANCH IF 1ST DIMENSION
2065 ec7c 8d 17 BSR LB4CE = MULTIPLY ACCUMULATED POINTER AND DIMENSION
2066 ec7e d3 52 ADDD FPA0+2 = LENGTH AND ADD TO CURRENT ARGUMENT
2067 ec80 30 02 LB4B9 LEAX 2,X MOVE POINTER TO NEXT DIMENSION
2068 ec82 0a 03 DEC TMPLOC * DECREMENT DIMENSION COUNTER AND
2069 ec84 26 e7 BNE LB4A6 * BRANCH IF ANY DIMENSIONS LEFT
2070 * MULTIPLY ACCD BY 5 - 5 BYTES/ARRAY VALUE
2071 ec86 ed e3 STD ,--S
2072 ec88 58 ASLB
2073 ec89 49 ROLA TIMES 2
2074 ec8a 58 ASLB
2075 ec8b 49 ROLA TIMES 4
2076 ec8c e3 e1 ADDD ,S++ TIMES 5
2077 ec8e 30 8b LEAX D,X ADD OFFSET TO START OF ARRAY
2078 ec90 30 05 LEAX 5,X ADJUST POINTER FOR SIZE OF DESCRIPTOR
2079 ec92 9f 39 STX VARPTR SAVE POINTER TO ARRAY VALUE
2080 ec94 39 LB4CD RTS
2081 * MULTIPLY 2 BYTE NUMBER IN 5,X BY THE 2 BYTE NUMBER
2082 * IN COEFPT. RETURN RESULT IN ACCD, BS ERROR IF > $FFFF
2083 ec95 86 10 LB4CE LDA #16 16 SHIFTS TO DO A MULTIPLY
2084 ec97 97 45 STA V45 SHIFT COUNTER
2085 ec99 ec 05 LDD 5,X * GET SIZE OF DIMENSION
2086 ec9b dd 17 STD BOTSTK * AND SAVE IT
2087 ec9d 4f CLRA * ZERO
2088 ec9e 5f CLRB * ACCD
2089 ec9f 58 LB4D8 ASLB = SHIFT ACCB LEFT
2090 eca0 49 ROLA = ONE BIT
2091 eca1 25 0f BCS LB4EB BS' ERROR IF CARRY
2092 eca3 08 65 ASL COEFPT+1 * SHIFT MULTIPLICAND LEFT ONE
2093 eca5 09 64 ROL COEFPT * BIT - ADD MULTIPLIER TO ACCUMULATOR
2094 eca7 24 04 BCC LB4E6 * IF CARRY <> 0
2095 eca9 d3 17 ADDD BOTSTK ADD MULTIPLIER TO ACCD
2096 ecab 25 05 BCS LB4EB BS' ERROR IF CARRY (>$FFFF)
2097 ecad 0a 45 LB4E6 DEC V45 * DECREMENT SHIFT COUNTER
2098 ecaf 26 ee BNE LB4D8 * IF NOT DONE
2099 ecb1 39 RTS
2100 ecb2 7e ec 0e LB4EB JMP LB447 BS' ERROR
2101 *
2102 * MEM
2103 * THIS IS NOT A TRUE INDICATOR OF FREE MEMORY BECAUSE
2104 * BASIC REQUIRES A STKBUF SIZE BUFFER FOR THE STACK
2105 * FOR WHICH MEM DOES NOT ALLOW.
2106 *
2107 ecb5 1f 40 MEM TFR S,D PUT STACK POINTER INTO ACCD
2108 ecb7 93 1f SUBD ARYEND SUBTRACT END OF ARRAYS
2109 ecb9 21 FCB SKP1 SKIP ONE BYTE
2110 *CONVERT THE VALUE IN ACCB INTO A FP NUMBER IN FPA0
2111 ecba 4f LB4F3 CLRA CLEAR MS BYTE OF ACCD
2112 * CONVERT THE VALUE IN ACCD INTO A FLOATING POINT NUMBER IN FPA0
2113 ecbb 0f 06 GIVABF CLR VALTYP SET VARIABLE TYPE TO NUMERIC
2114 ecbd dd 50 STD FPA0 SAVE ACCD IN TOP OF FACA
2115 ecbf c6 90 LDB #$90 EXPONENT REQUIRED IF THE TOP TWO BYTES
2116 * OF FPA0 ARE TO BE TREATED AS AN INTEGER IN FPA0
2117 ecc1 7e f4 0b JMP LBC82 CONVERT THE REST OF FPA0 TO AN INTEGER
2118
2119 * STR$
2120 ecc4 bd e9 0f STR JSR LB143 TM' ERROR IF STRING VARIABLE
2121 ecc7 ce 01 f0 LDU #STRBUF+2 *CONVERT FP NUMBER TO ASCII STRING IN
2122 ecca bd f5 65 JSR LBDDC *THE STRING BUFFER
2123 eccd 32 62 LEAS 2,S PURGE THE RETURN ADDRESS FROM THE STACK
2124 eccf 8e 01 ef LDX #STRBUF+1 *POINT X TO STRING BUFFER AND SAVE
2125 ecd2 20 0b BRA LB518 *THE STRING IN THE STRING SPACE
2126 * RESERVE ACCB BYTES OF STRING SPACE. RETURN START
2127 * ADDRESS IN (X) AND FRESPC
2128 ecd4 9f 4d LB50D STX V4D SAVE X IN V4D
2129 ecd6 8d 5c LB50F BSR LB56D RESERVE ACCB BYTES IN STRING SPACE
2130 ecd8 9f 58 LB511 STX STRDES+2 SAVE NEW STRING ADDRESS
2131 ecda d7 56 STB STRDES SAVE LENGTH OF RESERVED BLOCK
2132 ecdc 39 RTS
2133 ecdd 30 1f LB516 LEAX -1,X MOVE POINTER BACK ONE
2134 * SCAN A LINE FROM (X) UNTIL AN END OF LINE FLAG (ZERO) OR
2135 * EITHER OF THE TWO TERMINATORS STORED IN CHARAC OR ENDCHR IS MATCHED.
2136 * THE RESULTING STRING IS STORED IN THE STRING SPACE
2137 * ONLY IF THE START OF THE STRING IS <= STRBUF+2
2138 ecdf 86 22 LB518 LDA #'" * INITIALIZE
2139 ece1 97 01 STA CHARAC * TERMINATORS
2140 ece3 97 02 LB51A STA ENDCHR * TO "
2141 ece5 30 01 LB51E LEAX 1,X MOVE POINTER UP ONE
2142 ece7 9f 62 STX RESSGN TEMPORARILY SAVE START OF STRING
2143 ece9 9f 58 STX STRDES+2 SAVE START OF STRING IN TEMP DESCRIPTOR
2144 eceb c6 ff LDB #-1 INITIALIZE CHARACTER COUNTER TO - 1
2145 eced 5c LB526 INCB INCREMENT CHARACTER COUNTER
2146 ecee a6 80 LDA ,X+ GET CHARACTER
2147 ecf0 27 0c BEQ LB537 BRANCH IF END OF LINE
2148 ecf2 91 01 CMPA CHARAC * CHECK FOR TERMINATORS
2149 ecf4 27 04 BEQ LB533 * IN CHARAC AND ENDCHR
2150 ecf6 91 02 CMPA ENDCHR * DON<4F>T MOVE POINTER BACK
2151 ecf8 26 f3 BNE LB526 * ONE IF TERMINATOR IS "MATCHED"
2152 ecfa 81 22 LB533 CMPA #'" = COMPARE CHARACTER TO STRING DELIMITER
2153 ecfc 27 02 BEQ LB539 = & DON<4F>T MOVE POINTER BACK IF SO
2154 ecfe 30 1f LB537 LEAX -1,X MOVE POINTER BACK ONE
2155 ed00 9f 64 LB539 STX COEFPT SAVE END OF STRING ADDRESS
2156 ed02 d7 56 STB STRDES SAVE STRING LENGTH IN TEMP DESCRIPTOR
2157 ed04 de 62 LDU RESSGN GET INITlAL STRING START
2158 ed06 11 83 01 f0 CMPU #STRBUF+2 COMPARE TO START OF STRING BUFFER
2159 ed0a 22 07 LB543 BHI LB54C BRANCH IF > START OF STRING BUFFER
2160 ed0c 8d c6 BSR LB50D GO RESERVE SPACE FOR THE STRING
2161 ed0e 9e 62 LDX RESSGN POINT X TO THE BEGINNING OF THE STRING
2162 ed10 bd ee 0c JSR LB645 MOVE (B) BYTES FROM (X) TO
2163 * [FRESPC] - MOVE STRING DATA
2164 * PUT DIRECT PAGE STRING DESCRIPTOR BUFFER DATA
2165 * ON THE STRING STACK. SET VARIABLE TYPE TO STRING
2166 ed13 9e 0b LB54C LDX TEMPPT GET NEXT AVAILABLE STRING STACK DESCRIPTOR
2167 ed15 8c 00 f1 CMPX #LINHDR COMPARE TO TOP OF STRING DESCRIPTOR STACK - WAS #CFNBUF
2168 ed18 26 05 BNE LB558 FORMULA O.K.
2169 ed1a c6 1e LDB #15*2 STRING FORMULA TOO COMPLEX' ERROR
2170 ed1c 7e e4 46 LB555 JMP LAC46 JUMP TO ERROR SERVICING ROUTINE
2171 ed1f 96 56 LB558 LDA STRDES * GET LENGTH OF STRING AND SAVE IT
2172 * STA ,X * IN BYTE 0 OF DESCRIPTOR
2173 ed21 a7 00 FCB $A7,$00
2174 ed23 dc 58 LDD STRDES+2 = GET START ADDRESS OF ACTUAL STRING
2175 ed25 ed 02 STD 2,X = AND SAVE IN BYTES 2,3 OF DESCRIPTOR
2176 ed27 86 ff LDA #$FF * VARIABLE TYPE = STRING
2177 ed29 97 06 STA VALTYP * SAVE IN VARIABLE TYPE FLAG
2178 ed2b 9f 0d STX LASTPT = SAVE START OF DESCRIPTOR
2179 ed2d 9f 52 STX FPA0+2 = ADDRESS IN LASTPT AND FPA0
2180 ed2f 30 05 LEAX 5,X 5 BYTES/STRING DESCRIPTOR
2181 ed31 9f 0b STX TEMPPT NEXT AVAILABLE STRING VARIABLE DESCRIPTOR
2182 ed33 39 RTS
2183 * RESERVE ACCB BYTES IN STRING STORAGE SPACE
2184 * RETURN WITH THE STARTING ADDRESS OF THE
2185 * RESERVED STRING SPACE IN (X) AND FRESPC
2186 ed34 0f 07 LB56D CLR GARBFL CLEAR STRING REORGANIZATION FLAG
2187 ed36 4f LB56F CLRA * PUSH THE LENGTH OF THE
2188 ed37 34 06 PSHS B,A * STRING ONTO THE STACK
2189 ed39 dc 23 LDD STRTAB GET START OF STRING VARIABLES
2190 ed3b a3 e0 SUBD ,S+ SUBTRACT STRING LENGTH
2191 ed3d 10 93 21 CMPD FRETOP COMPARE TO START OF STRING STORAGE
2192 ed40 25 0a BCS LB585 IF BELOW START, THEN REORGANIZE
2193 ed42 dd 23 STD STRTAB SAVE NEW START OF STRING VARIABLES
2194 ed44 9e 23 LDX STRTAB GET START OF STRING VARIABLES
2195 ed46 30 01 LEAX 1,X ADD ONE
2196 ed48 9f 25 STX FRESPC SAVE START ADDRESS OF NEWLY RESERVED SPACE
2197 ed4a 35 84 PULS B,PC RESTORE NUMBER OF BYTES RESERVED AND RETURN
2198 ed4c c6 1a LB585 LDB #2*13 OUT OF STRING SPACE' ERROR
2199 ed4e 03 07 COM GARBFL TOGGLE REORGANIZATiON FLAG
2200 ed50 27 ca BEQ LB555 ERROR IF FRESHLY REORGANIZED
2201 ed52 8d 04 BSR LB591 GO REORGANIZE STRING SPACE
2202 ed54 35 04 PULS B GET BACK THE NUMBER OF BYTES TO RESERVE
2203 ed56 20 de BRA LB56F TRY TO RESERVE ACCB BYTES AGAIN
2204 * REORGANIZE THE STRING SPACE
2205 ed58 9e 27 LB591 LDX MEMSIZ GET THE TOP OF STRING SPACE
2206 ed5a 9f 23 LB593 STX STRTAB SAVE TOP OF UNORGANIZED STRING SPACE
2207 ed5c 4f CLRA * ZERO OUT ACCD
2208 ed5d 5f CLRB * AND RESET VARIABLE
2209 ed5e dd 4b STD V4B * POINTER TO 0
2210 ed60 9e 21 LDX FRETOP POINT X TO START OF STRING SPACE
2211 ed62 9f 47 STX V47 SAVE POINTER IN V47
2212 ed64 8e 00 c9 LDX #STRSTK POINT X TO START OF STRING DESCRIPTOR STACK
2213 ed67 9c 0b LB5A0 CMPX TEMPPT COMPARE TO ADDRESS OF NEXT AVAILABLE DESCRIPTOR
2214 ed69 27 04 BEQ LB5A8 BRANCH IF TOP OF STRING STACK
2215 ed6b 8d 32 BSR LB5D8 CHECK FOR STRING IN UNORGANIZED STRING SPACE
2216 ed6d 20 f8 BRA LB5A0 KEEP CHECKING
2217 ed6f 9e 1b LB5A8 LDX VARTAB GET THE END OF BASIC PROGRAM
2218 ed71 9c 1d LB5AA CMPX ARYTAB COMPARE TO END OF VARIABLES
2219 ed73 27 04 BEQ LB5B2 BRANCH IF AT TOP OF VARIABLES
2220 ed75 8d 22 BSR LB5D2 CHECK FOR STRING IN UNORGANIZED STRING SPACE
2221 ed77 20 f8 BRA LB5AA KEEP CHECKING VARIABLES
2222 ed79 9f 41 LB5B2 STX V41 SAVE ADDRESS OF THE END OF VARIABLES
2223 ed7b 9e 41 LB5B4 LDX V41 GET CURRENT ARRAY POINTER
2224 ed7d 9c 1f LB5B6 CMPX ARYEND COMPARE TO THE END OF ARRAYS
2225 ed7f 27 35 BEQ LB5EF BRANCH IF AT END OF ARRAYS
2226 ed81 ec 02 LDD 2,X GET LENGTH OF ARRAY AND DESCRIPTOR
2227 ed83 d3 41 ADDD V41 * ADD TO CURRENT ARRAY POINTER
2228 ed85 dd 41 STD V41 * AND SAVE IT
2229 ed87 a6 01 LDA 1,X GET 1ST CHARACTER OF VARIABLE NAME
2230 ed89 2a f0 BPL LB5B4 BRANCH IF NUMERIC ARRAY
2231 ed8b e6 04 LDB 4,X GET THE NUMBER OF DIMENSIONS IN THIS ARRAY
2232 ed8d 58 ASLB MULTIPLY BY 2
2233 ed8e cb 05 ADDB #5 ADD FIVE BYTES (VARIABLE NAME, ARRAY
2234 * LENGTH, NUMBER DIMENSIONS)
2235 ed90 3a ABX X NOW POINTS TO START OF ARRAY ELEMENTS
2236 ed91 9c 41 LB5CA CMPX V41 AT END OF THIS ARRAY?
2237 ed93 27 e8 BEQ LB5B6 YES - CHECK FOR ANOTHER
2238 ed95 8d 08 BSR LB5D8 CHECK FOR STRING LOCATED IN
2239 * UNORGANIZED STRING SPACE
2240 ed97 20 f8 BRA LB5CA KEEP CHECKING ELEMENTS IN THIS ARRAY
2241 ed99 a6 01 LB5D2 LDA 1,X GET F1RST BYTE OF VARIABLE NAME
2242 ed9b 30 02 LEAX 2,X MOVE POINTER TO DESCRIPTOR
2243 ed9d 2a 14 BPL LB5EC BRANCH IF VARIABLE IS NUMERIC
2244 * SEARCH FOR STRING - ENTER WITH X POINTING TO
2245 * THE STRING DESCRIPTOR. IF STRING IS STORED
2246 * BETWEEN V47 AND STRTAB, SAVE DESCRIPTOR POINTER
2247 * IN V4B AND RESET V47 TO STRING ADDRESS
2248 ed9f e6 84 LB5D8 LDB ,X GET THE LENGTH OF THE STRING
2249 eda1 27 10 BEQ LB5EC BRANCH IF NULL - NO STRING
2250 eda3 ec 02 LDD 2,X GET STARTING ADDRESS OF THE STRING
2251 eda5 10 93 23 CMPD STRTAB COMPARE TO THE START OF STRING VARIABLES
2252 eda8 22 09 BHI LB5EC BRANCH IF THIS STRING IS STORED IN
2253 * THE STRING VARIABLES
2254 edaa 10 93 47 CMPD V47 COMPARE TO START OF STRING SPACE
2255 edad 23 04 BLS LB5EC BRANCH IF NOT STORED IN THE STRING SPACE
2256 edaf 9f 4b STX V4B SAVE VARIABLE POINTER IF STORED IN STRING SPACE
2257 edb1 dd 47 STD V47 SAVE STRING STARTING ADDRESS
2258 edb3 30 05 LB5EC LEAX 5,X MOVE TO NEXT VARIABLE DESCRIPTOR
2259 edb5 39 LB5EE RTS
2260 edb6 9e 4b LB5EF LDX V4B GET ADDRESS OF THE DESCRIPTOR FOR THE
2261 * STRING WHICH IS STORED IN THE HIGHEST RAM ADDRESS IN
2262 * THE UNORGANIZED STRING SPACE
2263 edb8 27 fb BEQ LB5EE BRANCH IF NONE FOUND AND REORGANIZATION DONE
2264 edba 4f CLRA CLEAR MS BYTE OF LENGTH
2265 edbb e6 84 LDB ,X GET LENGTH OF STRING
2266 edbd 5a DECB SUBTRACT ONE
2267 edbe d3 47 ADDD V47 ADD LENGTH OF STRING TO ITS STARTING ADDRESS
2268 edc0 dd 43 STD V43 SAVE AS MOVE STARTING ADDRESS
2269 edc2 9e 23 LDX STRTAB POINT X TO THE START OF ORGANIZED STRING VARIABLES
2270 edc4 9f 41 STX V41 SAVE AS MOVE ENDING ADDRESS
2271 edc6 bd e4 20 JSR LAC20 MOVE STRING FROM CURRENT POSITION TO THE
2272 * TOP OF UNORGANIZED STRING SPACE
2273 edc9 9e 4b LDX V4B POINT X TO STRING DESCRIPTOR
2274 edcb dc 45 LDD V45 * GET NEW STARTING ADDRESS OF STRING AND
2275 edcd ed 02 STD 2,X * SAVE IT IN DESCRIPTOR
2276 edcf 9e 45 LDX V45 GET NEW TOP OF UNORGANIZED STRING SPACE
2277 edd1 30 1f LEAX -1,X MOVE POINTER BACK ONE
2278 edd3 7e ed 5a JMP LB593 JUMP BACK AND REORGANIZE SOME MORE
2279
2280
2281 edd6 dc 52 LB60F LDD FPA0+2 * GET DESCRIPTOR ADDRESS OF STRING A
2282 edd8 34 06 PSHS B,A * AND SAVE IT ON THE STACK
2283 edda bd e9 ef JSR LB223 GET DESCRIPTOR ADDRESS OF STRING B
2284 eddd bd e9 12 JSR LB146 TM' ERROR IF NUMERIC VARIABLE
2285 ede0 35 10 PULS X * POINT X TO STRING A DESCRIPTOR
2286 ede2 9f 62 STX RESSGN * ADDRESS AND SAVE IT IN RESSGN
2287 ede4 e6 84 LDB ,X GET LENGTH OF STRING A
2288 ede6 9e 52 LDX FPA0+2 POINT X TO DESCRIPTOR OF STRING B
2289 ede8 eb 84 ADDB ,X ADD LENGTH OF STRING B TO STR1NG A
2290 edea 24 05 BCC LB62A BRANCH IF LENGTH < 256
2291 edec c6 1c LDB #2*14 STRING TOO LONG' ERROR IF LENGTH > 255
2292 edee 7e e4 46 JMP LAC46 JUMP TO ERROR SERVICING ROUTINE
2293 edf1 bd ec d4 LB62A JSR LB50D RESERVE ROOM IN STRING SPACE FOR NEW STRING
2294 edf4 9e 62 LDX RESSGN GET DESCRIPTOR ADDRESS OF STRING A
2295 edf6 e6 84 LDB ,X GET LENGTH OF STRING A
2296 edf8 8d 10 BSR LB643 MOVE STRING A INTO RESERVED BUFFER IN STRING SPACE
2297 edfa 9e 4d LDX V4D GET DESCRIPTOR ADDRESS OF STRING B
2298 edfc 8d 22 BSR LB659 GET LENGTH AND ADDRESS OF STRING B
2299 edfe 8d 0c BSR LB645 MOVE STRING B INTO REST OF RESERVED BUFFER
2300 ee00 9e 62 LDX RESSGN POINT X TO DESCRIPTOR OF STRING A
2301 ee02 8d 1c BSR LB659 DELETE STRING A IF LAST STRING ON STRING STACK
2302 ee04 bd ed 13 JSR LB54C PUT STRING DESCRIPTOR ON THE STRING STACK
2303 ee07 7e e9 34 JMP LB168 BRANCH BACK TO EXPRESSION EVALUATION
2304
2305 * MOVE (B) BYTES FROM 2,X TO FRESPC
2306 ee0a ae 02 LB643 LDX 2,X POINT X TO SOURCE ADDRESS
2307 ee0c de 25 LB645 LDU FRESPC POINT U TO DESTINATION ADDRESS
2308 ee0e 5c INCB COMPENSATION FOR THE DECB BELOW
2309 ee0f 20 04 BRA LB64E GO MOVE THE BYTES
2310 * MOVE B BYTES FROM (X) TO (U)
2311 ee11 a6 80 LB64A LDA ,X+ * GET A SOURCE BYTE AND MOVE IT
2312 ee13 a7 c0 STA ,U+ * TO THE DESTINATION
2313 ee15 5a LB64E DECB DECREMENT BYTE COUNTER
2314 ee16 26 f9 BNE LB64A BRANCH IF ALL BYTES NOT MOVED
2315 ee18 df 25 STU FRESPC SAVE ENDING ADDRESS IN FRESPC
2316 ee1a 39 RTS
2317 * RETURN LENGTH (ACCB) AND ADDRESS (X) OF
2318 * STRING WHOSE DESCRIPTOR IS IN FPA0+2
2319 * DELETE THE STRING IF IT IS THE LAST ONE
2320 * PUT ON THE STRING STACK. REMOVE STRING FROM STRING
2321 * SPACE IF IT IS AT THE BOTTOM OF STRING VARIABLES.
2322 ee1b bd e9 12 LB654 JSR LB146 TM' ERROR IF VARIABLE TYPE = NUMERIC
2323 ee1e 9e 52 LB657 LDX FPA0+2 GET ADDRESS OF SELECTED STRING DESCRIPTOR
2324 ee20 e6 84 LB659 LDB ,X GET LENGTH OF STRING
2325 ee22 8d 18 BSR LB675 * CHECK TO SEE IF THIS STRING DESCRIPTOR WAS
2326 ee24 26 13 BNE LB672 * THE LAST ONE PUT ON THE STRING STACK AND
2327 * * BRANCH IF NOT
2328 ee26 ae 07 LDX 5+2,X GET START ADDRESS OF STRING JUST REMOVED
2329 ee28 30 1f LEAX -1,X MOVE POINTER DOWN ONE
2330 ee2a 9c 23 CMPX STRTAB COMPARE TO START OF STRING VARIABLES
2331 ee2c 26 08 BNE LB66F BRANCH IF THIS STRING IS NOT AT THE BOTTOM
2332 * OF STRING VARIABLES
2333 ee2e 34 04 PSHS B SAVE LENGTH; ACCA WAS CLEARED
2334 ee30 d3 23 ADDD STRTAB * ADD THE LENGTH OF THE JUST REMOVED STRING
2335 ee32 dd 23 STD STRTAB * TO THE START OF STRING VARIABLES - THIS WILL
2336 * * REMOVE THE STRING FROM THE STRING SPACE
2337 ee34 35 04 PULS B RESTORE LENGTH
2338 ee36 30 01 LB66F LEAX 1,X ADD ONE TO POINTER
2339 ee38 39 RTS
2340 ee39 ae 02 LB672 LDX 2,X *POINT X TO ADDRESS OF STRING NOT
2341 ee3b 39 RTS *ON THE STRING STACK
2342 * REMOVE STRING FROM STRING STACK. ENTER WITH X
2343 * POINTING TO A STRING DESCRIPTOR - DELETE THE
2344 * STRING FROM STACK IF IT IS ON TOP OF THE
2345 * STACK. IF THE STRING IS DELETED, SET THE ZERO FLAG
2346 ee3c 9c 0d LB675 CMPX LASTPT *COMPARE TO LAST USED DESCRIPTOR ADDRESS
2347 ee3e 26 07 BNE LB680 *ON THE STRING STACK, RETURN IF DESCRIPTOR
2348 * *ADDRESS NOT ON THE STRING STACK
2349 ee40 9f 0b STX TEMPPT SAVE LAST USED DESCRIPTOR AS NEXT AVAILABLE
2350 ee42 30 1b LEAX -5,X * MOVE LAST USED DESCRIPTOR BACK 5 BYTES
2351 ee44 9f 0d STX LASTPT * AND SAVE AS THE LAST USED DESCRIPTOR ADDR
2352 ee46 4f CLRA SET ZERO FLAG
2353 ee47 39 LB680 RTS
2354
2355 * LEN
2356 ee48 8d 03 LEN BSR LB686 POINT X TO PROPER STRING AND GET LENGTH
2357 ee4a 7e ec ba LB683 JMP LB4F3 CONVERT ACCB TO FP NUMBER IN FPA0
2358 * POINT X TO STRING ADDRESS LOAD LENGTH INTO
2359 * ACCB. ENTER WITH THE STRING DESCRIPTOR IN
2360 * BOTTOM TWO BYTES OF FPA0
2361 ee4d 8d cc LB686 BSR LB654 GET LENGTH AND ADDRESS OF STRING
2362 ee4f 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC
2363 ee51 5d TSTB SET FLAGS ACCORDING TO LENGTH
2364 ee52 39 RTS
2365
2366 * CHR$
2367 ee53 bd ee d5 CHR JSR LB70E CONVERT FPA0 TO AN INTEGER IN ACCD
2368 ee56 c6 01 LB68F LDB #1 * RESERVE ONE BYTE IN
2369 ee58 bd ed 34 JSR LB56D * THE STRING SPACE
2370 ee5b 96 53 LDA FPA0+3 GET ASCII STRING VALUE
2371 ee5d bd ec d8 JSR LB511 SAVE RESERVED STRING DESCRIPTOR IN TEMP DESCRIPTOR
2372 ee60 a7 84 STA ,X SAVE THE STRING (IT<49>S ONLY ONE BYTE)
2373 ee62 32 62 LB69B LEAS 2,S PURGE THE RETURN ADDRESS OFF OF THE STACK
2374 ee64 7e ed 13 LB69D JMP LB54C PUT TEMP DESCRIPTOR DATA ONTO STRING STACK
2375
2376
2377 ee67 8d 02 ASC BSR LB6A4 PUT 1ST CHARACTER OF STRING INTO ACCB
2378 ee69 20 df BRA LB683 CONVERT ACCB INTO FP NUMBER IN FPA0
2379 ee6b 8d e0 LB6A4 BSR LB686 POINT X TO STRING DESCRIPTOR
2380 ee6d 27 5e BEQ LB706 FC' ERROR IF NULL STRING
2381 ee6f e6 84 LDB ,X GET FIRST BYTE OF STRING
2382 ee71 39 RTS
2383
2384
2385 ee72 8d 48 LEFT BSR LB6F5 GET ARGUMENTS FROM STACK
2386 ee74 4f LB6AD CLRA CLEAR STRING POINTER OFFSET - OFFSET = 0 FOR LEFT$
2387 ee75 e1 84 LB6AE CMPB ,X * COMPARE LENGTH PARAMETER TO LENGTH OF
2388 ee77 23 03 BLS LB6B5 * STRING AND BRANCH IF LENGTH OF STRING
2389 * >= LENGTH PARAMETER
2390 ee79 e6 84 LDB ,X USE LENGTH OF STRING OTHERWISE
2391 ee7b 4f CLRA CLEAR STRING POINTER OFFSET (0 FOR LEFT$)
2392 ee7c 34 06 LB6B5 PSHS B,A PUSH PARAMETERS ONTO STACK
2393 ee7e bd ec d6 JSR LB50F RESERVE ACCB BYTES IN THE STRING SPACE
2394 ee81 9e 4d LDX V4D POINT X TO STRING DESCRIPTOR
2395 ee83 8d 9b BSR LB659 GET ADDRESS OF OLD STRING (X=ADDRESS)
2396 ee85 35 04 PULS B * PULL STRING POINTER OFFSET OFF OF THE STACK
2397 ee87 3a ABX * AND ADD IT TO STRING ADDRESS
2398 ee88 35 04 PULS B PULL LENGTH PARAMETER OFF OF THE STACK
2399 ee8a bd ee 0c JSR LB645 MOVE ACCB BYTES FROM (X) TO [FRESPC]
2400 ee8d 20 d5 BRA LB69D PUT TEMP STRING DESCRIPTOR ONTO THE STRING STACK
2401
2402 * RIGHT$
2403 ee8f 8d 2b RIGHT BSR LB6F5 GET ARGUMENTS FROM STACK
2404 ee91 a0 84 SUBA ,X ACCA=LENGTH PARAMETER - LENGTH OF OLD STRING
2405 ee93 40 NEGA NOW ACCA = LENGTH OF OLD STRING
2406 ee94 20 df BRA LB6AE PUT NEW STRING IN THE STRING SPACE
2407
2408 * MID$
2409 ee96 c6 ff MID LDB #$FF * GET DEFAULT VALUE OF LENGTH AND
2410 ee98 d7 53 STB FPA0+3 * SAVE IT IN FPA0
2411 ee9a 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC
2412 ee9c 81 29 CMPA #') ARGUMENT DELIMITER?
2413 ee9e 27 05 BEQ LB6DE YES - NO LENGTH PARAMETER GIVEN
2414 eea0 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
2415 eea3 8d 2d BSR LB70B EVALUATE NUMERIC EXPRESSION (LENGTH)
2416 eea5 8d 15 LB6DE BSR LB6F5 GET ARGUMENTS FROM STACK
2417 eea7 27 24 BEQ LB706 FC' ERROR IF NULL STRING
2418 eea9 5f CLRB CLEAR LENGTH COUNTER (DEFAULT VALUE)
2419 eeaa 4a DECA *SUOTRACT ONE FROM POSITION PARAMETER (THESE
2420 eeab a1 84 CMPA ,X *ROUTINES EXPECT 1ST POSITION TO BE ZERO, NOT ONE)
2421 * *AND COMPARE IT TO LENGTH OF OLD STRING
2422 eead 24 cd BCC LB6B5 IF POSITION > LENGTH OF OLD STRING, THEN NEW
2423 * STRING WILL BE A NULL STRING
2424 eeaf 1f 89 TFR A,B SAVE ABSOLUTE POSITION PARAMETER IN ACCB
2425 eeb1 e0 84 SUBB ,X ACCB=POSITION-LENGTH OF OLD STRING
2426 eeb3 50 NEGB NOW ACCB=LENGTH OF OLDSTRING-POSITION
2427 eeb4 d1 53 CMPB FPA0+3 *IF THE AMOUNT OF OLD STRING TO THE RIGHT OF
2428 eeb6 23 c4 BLS LB6B5 *POSITION IS <= THE LENGTH PARAMETER, BRANCH AND
2429 * USE ALL OF THE STRING TO THE RIGHT OF THE POSITION
2430 * INSTEAD OF THE LENGTH PARAMETER
2431 eeb8 d6 53 LDB FPA0+3 GET LENGTH OF NEW STRING
2432 eeba 20 c0 BRA LB6B5 PUT NEW STRING IN STRING SPACE
2433 * DO A SYNTAX CHECK FOR ")", THEN PULL THE PREVIOUSLY CALCULATED NUMERIC
2434 * ARGUMENT (ACCD) AND STRING ARGUMENT DESCRIPTOR ADDR OFF OF THE STACK
2435 eebc bd ea 33 LB6F5 JSR LB267 SYNTAX CHECK FOR A ")"
2436 eebf ee e4 LDU ,S LOAD THE RETURN ADDRESS INTO U REGISTER
2437 eec1 ae 65 LDX 5,S * GET ADDRESS OF STRING AND
2438 eec3 9f 4d STX V4D * SAVE IT IN V4D
2439 eec5 a6 64 LDA 4,S = PUT LENGTH OF STRING IN
2440 eec7 e6 64 LDB 4,S = BOTH ACCA AND ACCB
2441 eec9 32 67 LEAS 7,S REMOVE DESCRIPTOR AND RETURN ADDRESS FROM STACK
2442 eecb 1f 35 TFR U,PC JUMP TO ADDRESS IN U REGISTER
2443 eecd 7e ec 11 LB706 JMP LB44A ILLEGAL FUNCTION CALL'
2444 * EVALUATE AN EXPRESSION - RETURN AN INTEGER IN
2445 * ACCB - 'FC' ERROR IF EXPRESSION > 255
2446 eed0 9d 7c LB709 JSR GETNCH GET NEXT BASIC INPUT CHARACTER
2447 eed2 bd e9 0d LB70B JSR LB141 EVALUATE A NUMERIC EXPRESSION
2448 eed5 bd eb b0 LB70E JSR LB3E9 CONVERT FPA0 TO INTEGER IN ACCD
2449 eed8 4d TSTA TEST MS BYTE OF INTEGER
2450 eed9 26 f2 BNE LB706 FC' ERROR IF EXPRESSION > 255
2451 eedb 0e 82 JMP GETCCH GET CURRENT INPUT CHARACTER FROM BASIC
2452
2453 * VAL
2454 eedd bd ee 4d VAL JSR LB686 POINT X TO STRING ADDRESS
2455 eee0 10 27 02 de LBEQ LBA39 IF NULL STRING SET FPA0
2456 eee4 de 83 LDU CHARAD SAVE INPUT POINTER IN REGISTER U
2457 eee6 9f 83 STX CHARAD POINT INPUT POINTER TO ADDRESS OF STRING
2458 eee8 3a ABX MOVE POINTER TO END OF STRING TERMINATOR
2459 eee9 a6 84 LDA ,X GET LAST BYTE OF STRING
2460 eeeb 34 52 PSHS U,X,A SAVE INPUT POINTER, STRING TERMINATOR
2461 * ADDRESS AND CHARACTER
2462 eeed 6f 84 CLR ,X CLEAR STRING TERMINATOR : FOR ASCII - FP CONVERSION
2463 eeef 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC
2464 eef1 bd f4 9b JSR LBD12 CONVERT AN ASCII STRING TO FLOATING POINT
2465 eef4 35 52 PULS A,X,U RESTORE CHARACTERS AND POINTERS
2466 eef6 a7 84 STA ,X REPLACE STRING TERMINATOR
2467 eef8 df 83 STU CHARAD RESTORE INPUT CHARACTER
2468 eefa 39 RTS
2469
2470 eefb 8d 07 LB734 BSR LB73D * EVALUATE AN EXPRESSION, RETURN
2471 eefd 9f 2b STX BINVAL * THE VALUE IN X; STORE IT IN BINVAL
2472 eeff bd ea 39 LB738 JSR LB26D SYNTAX CHECK FOR A COMMA
2473 ef02 20 ce BRA LB70B EVALUATE EXPRESSION IN RANGE 0 <= X < 256
2474 * EVALUATE EXPRESSION : RETURN INTEGER PORTION IN X - 'FC' ERROR IF
2475
2476 ef04 bd e9 0d LB73D JSR LB141 EVALUATE NUMERIC EXPRESSION
2477 ef07 96 54 LB740 LDA FP0SGN GET SIGN OF FPA0 MANTISSA
2478 ef09 2b c2 BMI LB706 ILLEGAL FUNCTION CALL' IF NEGATIVE
2479 ef0b 96 4f LDA FP0EXP GET EXPONENT OF FPA0
2480 ef0d 81 90 CMPA #$90 COMPARE TO LARGEST POSITIVE INTEGER
2481 ef0f 22 bc BHI LB706 ILLEGAL FUNCTION CALL' IF TOO LARGE
2482 ef11 bd f4 51 JSR LBCC8 SHIFT BINARY POINT TO EXTREME RIGHT OF FPA0
2483 ef14 9e 52 LDX FPA0+2 LOAD X WITH LOWER TWO BYTES OF FPA0
2484 ef16 39 RTS
2485
2486 * PEEK
2487 ef17 8d ee PEEK BSR LB740 CONVERT FPA0 TO INTEGER IN REGISTER X
2488 ef19 e6 84 LDB ,X GET THE VALUE BEING 'PEEK'ED
2489 ef1b 7e ec ba JMP LB4F3 CONVERT ACCB INTO A FP NUMBER
2490
2491 * POKE
2492 ef1e 8d db POKE BSR LB734 EVALUATE 2 EXPRESSIONS
2493 ef20 9e 2b LDX BINVAL GET THE ADDRESS TO BE 'POKE'ED
2494 ef22 e7 84 STB ,X STORE THE DATA IN THAT ADDRESS
2495 ef24 39 RTS
2496
2497
2498 * LIST
2499 ef25 34 01 LIST PSHS CC SAVE ZERO FLAG ON STACK
2500 ef27 bd e7 57 JSR LAF67 CONVERT DECIMAL LINE NUMBER TO BINARY
2501 ef2a bd e4 e5 JSR LAD01 * FIND RAM ADDRESS OF THAT LINE NUMBER AND
2502 ef2d 9f 66 STX LSTTXT * SAVE IT IN LSTTXT
2503 ef2f 35 01 PULS CC GET ZERO FLAG FROM STACK
2504 ef31 27 12 BEQ LB784 BRANCH IF END OF LINE
2505 ef33 9d 82 JSR GETCCH GET CURRENT CHARACTER FROM BASIC
2506 ef35 27 13 BEQ LB789 BRANCH IF END OF LINE
2507 ef37 81 a7 CMPA #TOK_MINUS MINUS TOKEN (IS IT A RANGE OF LINE NUMBERS?)
2508 ef39 26 09 BNE LB783 NO - RETURN
2509 ef3b 9d 7c JSR GETNCH GET NEXT CHARACTER FROM BASIC
2510 ef3d 27 06 BEQ LB784 BRANCH IF END OF LINE
2511 ef3f bd e7 57 JSR LAF67 GET ENDING LINE NUMBER
2512 ef42 27 06 BEQ LB789 BRANCH IF LEGAL LINE NUMBER
2513 ef44 39 LB783 RTS
2514 * LIST THE ENTIRE PROGRAM
2515 ef45 ce ff ff LB784 LDU #$FFFF * SET THE DEFAULT ENDING LINE NUMBER
2516 ef48 df 2b STU BINVAL * TO $FFFF
2517 ef4a 32 62 LB789 LEAS 2,S PURGE RETURN ADDRESS FROM THE STACK
2518 ef4c 9e 66 LDX LSTTXT POINT X TO STARTING LINE ADDRESS
2519 ef4e bd f0 e9 LB78D JSR LB95C MOVE CURSOR TO START OF A NEW LINE
2520 ef51 bd e1 da JSR LA549 CHECK FOR A BREAK OR PAUSE
2521 ef54 ec 84 LDD ,X GET ADDRESS OF NEXT BASIC LINE
2522 ef56 26 03 BNE LB79F BRANCH IF NOT END OF PROGRAM
2523 LB797
2524 ef58 7e e4 65 JMP LAC73 RETURN TO BASIC<49>S MAIN INPUT LOOP
2525 ef5b 9f 66 LB79F STX LSTTXT SAVE NEW STARTING LINE ADDRESS
2526 ef5d ec 02 LDD 2,X * GET THE LINE NUMBER OF THIS LINE AND
2527 ef5f 10 93 2b CMPD BINVAL * COMPARE IT TO ENDING LINE NUMBER
2528 ef62 22 f4 BHI LB797 EXIT IF LINE NUMBER > ENDING LINE NUMBER
2529 ef64 bd f5 55 JSR LBDCC PRINT THE NUMBER IN ACCD ON SCREEN IN DECIMAL
2530 ef67 bd f1 35 JSR LB9AC SEND A SPACE TO CONSOLE OUT
2531 ef6a 9e 66 LDX LSTTXT GET RAM ADDRESS OF THIS LINE
2532 ef6c 8d 10 BSR LB7C2 UNCRUNCH A LINE
2533 ef6e ae 9f 00 66 LDX [LSTTXT] POINT X TO START OF NEXT LINE
2534 ef72 ce 00 f4 LDU #LINBUF+1 POINT U TO BUFFER FULL OF UNCRUNCHED LINE
2535 ef75 a6 c0 LB7B9 LDA ,U+ GET A BYTE FROM THE BUFFER
2536 ef77 27 d5 BEQ LB78D BRANCH IF END OF BUFFER
2537 ef79 bd f1 3a JSR LB9B1 SEND CHARACTER TO CONSOLE OUT
2538 ef7c 20 f7 BRA LB7B9 GET ANOTHER CHARACTER
2539
2540 * UNCRUNCH A LINE INTO BASIC<49>S LINE INPUT BUFFER
2541 ef7e 30 04 LB7C2 LEAX 4,X MOVE POINTER PAST ADDRESS OF NEXT LINE AND LINE NUMBER
2542 ef80 10 8e 00 f4 LDY #LINBUF+1 UNCRUNCH LINE INTO LINE INPUT BUFFER
2543 ef84 a6 80 LB7CB LDA ,X+ GET A CHARACTER
2544 ef86 27 51 BEQ LB820 BRANCH IF END OF LINE
2545 ef88 2b 15 BMI LB7E6 BRANCH IF IT<49>S A TOKEN
2546 ef8a 81 3a CMPA #': CHECK FOR END OF SUB LINE
2547 ef8c 26 0d BNE LB7E2 BRNCH IF NOT END OF SUB LINE
2548 ef8e e6 84 LDB ,X GET CHARACTER FOLLOWING COLON
2549 ef90 c1 84 CMPB #TOK_ELSE TOKEN FOR ELSE?
2550 ef92 27 f0 BEQ LB7CB YES - DON<4F>T PUT IT IN BUFFER
2551 ef94 c1 83 CMPB #TOK_SNGL_Q TOKEN FOR REMARK?
2552 ef96 27 ec BEQ LB7CB YES - DON<4F>T PUT IT IN BUFFER
2553 ef98 8c FCB SKP2 SKIP TWO BYTES
2554 ef99 86 21 LB7E0 LDA #'! EXCLAMATION POINT
2555 ef9b 8d 30 LB7E2 BSR LB814 PUT CHARACTER IN BUFFER
2556 ef9d 20 e5 BRA LB7CB GET ANOTHER CHARACTER
2557
2558 ef9f ce e1 0b LB7E6 LDU #COMVEC-10 FIRST DO COMMANDS
2559 efa2 81 ff CMPA #$FF CHECK FOR SECONDARY TOKEN
2560 efa4 26 04 BNE LB7F1 BRANCH IF NON SECONDARY TOKEN
2561 efa6 a6 80 LDA ,X+ GET SECONDARY TOKEN
2562 efa8 33 45 LEAU 5,U BUMP IT UP TO SECONDARY FUNCTIONS
2563 efaa 84 7f LB7F1 ANDA #$7F MASK OFF BIT 7 OF TOKEN
2564 efac 33 4a LB7F3 LEAU 10,U MOVE TO NEXT COMMAND TABLE
2565 efae 6d c4 TST ,U IS THIS TABLE ENABLED?
2566 efb0 27 e7 BEQ LB7E0 NO - ILLEGAL TOKEN
2567 efb2 a0 c4 SUBA ,U SUBTRACT THE NUMBER OF TOKENS FROM THE CURRENT TOKEN NUMBER
2568 efb4 2a f6 BPL LB7F3 BRANCH IF TOKEN NOT IN THIS TABLE
2569 efb6 ab c4 ADDA ,U RESTORE TOKEN NUMBER RELATIVE TO THIS TABLE
2570 efb8 ee 41 LDU 1,U POINT U TO COMMAND DICTIONARY TABLE
2571 efba 4a LB801 DECA DECREMENT TOKEN NUMBER
2572 efbb 2b 06 BMI LB80A BRANCH IF THIS IS THE CORRECT TOKEN
2573 * SKIP THROUGH DICTIONARY TABLE TO START OF NEXT TOKEN
2574 efbd 6d c0 LB804 TST ,U+ GRAB A BYTE
2575 efbf 2a fc BPL LB804 BRANCH IF BIT 7 NOT SET
2576 efc1 20 f7 BRA LB801 GO SEE IF THIS IS THE CORRECT TOKEN
2577 efc3 a6 c4 LB80A LDA ,U GET A CHARACTER FROM DICTIONARY TABLE
2578 efc5 8d 06 BSR LB814 PUT CHARACTER IN BUFFER
2579 efc7 6d c0 TST ,U+ CHECK FOR START OF NEXT TOKEN
2580 efc9 2a f8 BPL LB80A BRANCH IF NOT DONE WITH THIS TOKEN
2581 efcb 20 b7 BRA LB7CB GO GET ANOTHER CHARACTER
2582 efcd 10 8c 01 ed LB814 CMPY #LINBUF+LBUFMX TEST FOR END OF LINE INPUT BUFFER
2583 efd1 24 06 BCC LB820 BRANCH IF AT END OF BUFFER
2584 efd3 84 7f ANDA #$7F MASK OFF BIT 7
2585 efd5 a7 a0 STA ,Y+ * SAVE CHARACTER IN BUFFER AND
2586 efd7 6f a4 CLR ,Y * CLEAR NEXT CHARACTER SLOT IN BUFFER
2587 efd9 39 LB820 RTS
2588 *
2589 * CRUNCH THE LINE THAT THE INPUT POINTER IS
2590 * POINTING TO INTO THE LINE INPUT BUFFER
2591 * RETURN LENGTH OF CRUNCHED LINE IN ACCD
2592 *
2593 efda 9e 83 LB821 LDX CHARAD GET BASIC'S INPUT POINTER ADDRESS
2594 efdc ce 00 f3 LDU #LINBUF POINT X TO LINE INPUT BUFFER
2595 efdf 0f 43 LB829 CLR V43 CLEAR ILLEGAL TOKEN FLAG
2596 efe1 0f 44 CLR V44 CLEAR DATA FLAG
2597 efe3 a6 80 LB82D LDA ,X+ GET INPUT CHAR
2598 efe5 27 21 BEQ LB852 BRANCH IF END OF LINE
2599 efe7 0d 43 TST V43 * CHECK ILLEGAL TOKEN FLAG & BRANCH IF NOT
2600 efe9 27 0f BEQ LB844 * PROCESSING AN ILLEGAL TOKEN
2601 efeb bd eb 69 JSR LB3A2 SET CARRY IF NOT UPPER CASE ALPHA
2602 efee 24 18 BCC LB852 BRANCH IF UPPER CASE ALPHA
2603 eff0 81 30 CMPA #'0 * DON<4F>T CRUNCH ASCII NUMERIC CHARACTERS
2604 eff2 25 04 BLO LB842 * BRANCH IF NOT NUMERIC
2605 eff4 81 39 CMPA #'9 *
2606 eff6 23 10 BLS LB852 * BRANCH IF NUMERIC
2607 * END UP HERE IF NOT UPPER CASE ALPHA OR NUMERIC
2608 eff8 0f 43 LB842 CLR V43 CLEAR ILLEGAL TOKEN FLAG
2609 effa 81 20 LB844 CMPA #SPACE SPACE?
2610 effc 27 0a BEQ LB852 DO NOT REMOVE SPACES
2611 effe 97 42 STA V42 SAVE INPUT CHARACTER AS SCAN DELIMITER
2612 f000 81 22 CMPA #'" CHECK FOR STRING DELIMITER
2613 f002 27 38 BEQ LB886 BRANCH IF STRING
2614 f004 0d 44 TST V44 * CHECK DATA FLAG AND BRANCH IF CLEAR
2615 f006 27 19 BEQ LB86B * DO NOT CRUNCH DATA
2616 f008 a7 c0 LB852 STA ,U+ SAVE CHARACTER IN BUFFER
2617 f00a 27 06 BEQ LB85C BRANCH IF END OF LINE
2618 f00c 81 3a CMPA #': * CHECK FOR END OF SUBLINE
2619 f00e 27 cf BEQ LB829 * AND RESET FLAGS IF END OF SUBLINE
2620 f010 20 d1 LB85A BRA LB82D GO GET ANOTHER CHARACTER
2621 f012 6f c0 LB85C CLR ,U+ * DOUBLE ZERO AT END OF LINE
2622 f014 6f c0 CLR ,U+ *
2623 f016 1f 30 TFR U,D SAVE ADDRESS OF END OF LINE IN ACCD
2624 f018 83 00 f1 SUBD #LINHDR LENGTH OF LINE IN ACCD
2625 f01b 8e 00 f2 LDX #LINBUF-1 * SET THE INPUT POINTER TO ONE BEFORE
2626 f01e 9f 83 STX CHARAD * THE START OF THE CRUNCHED LINE
2627 f020 39 RTS EXIT 'CRUNCH'
2628 f021 81 3f LB86B CMPA #'? CHECK FOR "?" - PRINT ABBREVIATION
2629 f023 26 04 BNE LB873 BRANCH IF NOT PRINT ABBREVIATION
2630 f025 86 87 LDA #TOK_PRINT * GET THE PRINT TOKEN AND SAVE IT
2631 f027 20 df BRA LB852 * IN BUFFER
2632 f029 81 27 LB873 CMPA #'' APOSTROPHE IS SAME AS REM
2633 f02b 26 13 BNE LB88A BRANCH IF NOT REMARK
2634 f02d cc 3a 83 LDD #$3A00+TOK_SNGL_Q COLON, REM TOKEN
2635 f030 ed c1 STD ,U++ SAVE IN BUFFER
2636 f032 0f 42 LB87C CLR V42 SET DELIMITER = 0 (END OF LINE)
2637 f034 a6 80 LB87E LDA ,X+ SCAN TILL WE MATCH [V42]
2638 f036 27 d0 BEQ LB852 BRANCH IF END OF LINE
2639 f038 91 42 CMPA V42 DELIMITER?
2640 f03a 27 cc BEQ LB852 BRANCH OUT IF SO
2641 f03c a7 c0 LB886 STA ,U+ DON<4F>T CRUNCH REMARKS OR STRINGS
2642 f03e 20 f4 BRA LB87E GO GET MORE STRING OR REMARK
2643 f040 81 30 LB88A CMPA #'0 * LESS THAN ASCII ZERO?
2644 f042 25 04 BCS LB892 * BRANCH IF SO
2645 f044 81 3c CMPA #';+1 = CHECK FOR NUMERIC VALUE, COLON OR SEMICOLON
2646 f046 25 c0 BCS LB852 = AND INSERT IN BUFFER IF SO
2647 f048 30 1f LB892 LEAX -1,X MOVE INPUT POINTER BACK ONE
2648 f04a 34 50 PSHS U,X SAVE POINTERS TO INPUT STRING, OUTPUT STRING
2649 f04c 0f 41 CLR V41 TOKEN FLAG 0 = COMMAND, FF = SECONDARY
2650 f04e ce e1 0b LDU #COMVEC-10 POINT U TO COMMAND INTERPRETATION
2651 * TABLE FOR BASIC - 10
2652 f051 0f 42 LB89B CLR V42 INITIALIZE V42 AS TOKEN COUNTER
2653 f053 33 4a LB89D LEAU 10,U MOVE TO NEXT COMMAND INTERPRETATION TABLE
2654 f055 a6 c4 LDA ,U GET NUMBER OF COMMANDS
2655 f057 27 31 BEQ LB8D4 GO DO SECONDARY FUNCTIONS IF NO COMMAND TABLE
2656 f059 10 ae 41 LDY 1,U POINT Y TO COMMAND DICTIONARY TABLE
2657 f05c ae e4 LB8A6 LDX ,S GET POINTER TO INPUT STRING
2658 f05e e6 a0 LB8A8 LDB ,Y+ GET A BYTE FROM DICTIONARY TABLE
2659 f060 e0 80 SUBB ,X+ SUBTRACT INPUT CHARACTER
2660 f062 27 fa BEQ LB8A8 LOOP IF SAME
2661 f064 c1 80 CMPB #$80 LAST CHAR IN RESERVED WORD TABLE HAD
2662 * BIT 7 SET, SO IF WE HAVE $80 HERE
2663 * THEN IT IS A GOOD COMPARE
2664 f066 26 38 BNE LB8EA BRANCH IF NO MATCH - CHECK ANOTHER COMMAND
2665 f068 32 62 LEAS 2,S DELETE OLD INPUT POINTER FROM STACK
2666 f06a 35 40 PULS U GET POINTER TO OUTPUT STRING
2667 f06c da 42 ORB V42 OR IN THE TABLE POSITION TO MAKE THE TOKEN
2668 * - NOTE THAT B ALREADY HAD $80 IN IT -
2669 f06e 96 41 LDA V41 * CHECK TOKEN FLAG AND BRANCH
2670 f070 26 06 BNE LB8C2 * IF SECONDARY
2671 f072 c1 84 CMPB #TOK_ELSE IS IT ELSE TOKEN?
2672 f074 26 06 BNE LB8C6 NO
2673 f076 86 3a LDA #': PUT A COLON (SUBLINE) BEFORE ELSE TOKEN
2674 f078 ed c1 LB8C2 STD ,U++ SECONDARY TOKENS PRECEEDED BY $FF
2675 f07a 20 94 BRA LB85A GO PROCESS MORE INPUT CHARACTERS
2676 f07c e7 c0 LB8C6 STB ,U+ SAVE THIS TOKEN
2677 f07e c1 86 CMPB #TOK_DATA DATA TOKEN?
2678 f080 26 02 BNE LB8CE NO
2679 f082 0c 44 INC V44 SET DATA FLAG
2680 f084 c1 82 LB8CE CMPB #TOK_REM REM TOKEN?
2681 f086 27 aa BEQ LB87C YES
2682 f088 20 86 LB8D2 BRA LB85A GO PROCESS MORE INPUT CHARACTERS
2683 * CHECK FOR A SECONDARY TOKEN
2684 f08a ce e1 10 LB8D4 LDU #COMVEC-5 NOW DO SECONDARY FUNCTIONS
2685 f08d 03 41 COM V41 TOGGLE THE TOKEN FLAG
2686 f08f 26 c0 BNE LB89B BRANCH IF NOW CHECKING SECONDARY COMMANDS
2687
2688 * THIS CODE WILL PROCESS INPUT DATA WHICH CANNOT BE CRUNCHED AND SO
2689 * IS ASSUMED TO BE ILLEGAL DATA OR AN ILLEGAL TOKEN
2690 f091 35 50 PULS X,U RESTORE INPUT AND OUTPUT POINTERS
2691 f093 a6 80 LDA ,X+ * MOVE THE FIRST CHARACTER OF AN
2692 f095 a7 c0 STA ,U+ * ILLEGAL TOKEN
2693 f097 bd eb 69 JSR LB3A2 SET CARRY IF NOT ALPHA
2694 f09a 25 ec BCS LB8D2 BRANCH IF NOT ALPHA
2695 f09c 03 43 COM V43 SET ILLEGAL TOKEN FLAG IF UPPER CASE ALPHA
2696 f09e 20 e8 BRA LB8D2 PROCESS MORE INPUT CHARACTERS
2697 f0a0 0c 42 LB8EA INC V42 INCREMENT TOKEN COUNTER
2698 f0a2 4a DECA DECR COMMAND COUNTER
2699 f0a3 27 ae BEQ LB89D GET ANOTHER COMMAND TABLE IF DONE W/THIS ONE
2700 f0a5 31 3f LEAY -1,Y MOVE POINTER BACK ONE
2701 f0a7 e6 a0 LB8F1 LDB ,Y+ * GET TO NEXT
2702 f0a9 2a fc BPL LB8F1 * RESERVED WORD
2703 f0ab 20 af BRA LB8A6 GO SEE IF THIS WORD IS A MATCH
2704
2705 * PRINT
2706 f0ad 27 36 PRINT BEQ LB958 BRANCH IF NO ARGUMENT
2707 f0af 8d 01 BSR LB8FE CHECK FOR ALL PRINT OPTIONS
2708 f0b1 39 RTS
2709 LB8FE
2710 f0b2 27 3e LB91B BEQ LB965 RETURN IF END OF LINE
2711 f0b4 81 9f LB91D CMPA #TOK_TAB TOKEN FOR TAB( ?
2712 f0b6 27 53 BEQ LB97E YES
2713 f0b8 81 2c CMPA #', COMMA?
2714 f0ba 27 37 BEQ LB966 YES - ADVANCE TO NEXT TAB FIELD
2715 f0bc 81 3b CMPA #'; SEMICOLON?
2716 f0be 27 60 BEQ LB997 YES - DO NOT ADVANCE CURSOR
2717 f0c0 bd e9 22 JSR LB156 EVALUATE EXPRESSION
2718 f0c3 96 06 LDA VALTYP * GET VARIABLE TYPE AND
2719 f0c5 34 02 PSHS A * SAVE IT ON THE STACK
2720 f0c7 26 06 BNE LB938 BRANCH IF STRING VARIABLE
2721 f0c9 bd f5 62 JSR LBDD9 CONVERT FP NUMBER TO AN ASCII STRING
2722 f0cc bd ec dd JSR LB516 PARSE A STRING FROM (X-1) AND PUT
2723 * DESCRIPTOR ON STRING STACK
2724 f0cf 8d 57 LB938 BSR LB99F PRINT STRING POINTED TO BY X
2725 f0d1 35 04 PULS B GET VARIABLE TYPE BACK
2726 f0d3 bd e1 73 JSR LA35F SET UP TAB WIDTH ZONE, ETC
2727 f0d6 5d LB949 TSTB CHECK CURRENT PRINT POSITION
2728 f0d7 26 08 BNE LB954 BRANCH IF NOT AT START OF LINE
2729 f0d9 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
2730 f0db 81 2c CMPA #', COMMA?
2731 f0dd 27 14 BEQ LB966 SKIP TO NEXT TAB FIELD
2732 f0df 8d 54 BSR LB9AC SEND A SPACE TO CONSOLE OUT
2733 f0e1 9d 82 LB954 JSR GETCCH GET CURRENT INPUT CHARACTER
2734 f0e3 26 cf BNE LB91D BRANCH IF NOT END OF LINE
2735 f0e5 86 0d LB958 LDA #CR * SEND A CR TO
2736 f0e7 20 51 BRA LB9B1 * CONSOLE OUT
2737 f0e9 bd e1 73 LB95C JSR LA35F SET UP TAB WIDTH, ZONE ETC
2738 f0ec 27 f7 BEQ LB958 BRANCH IF WIDTH = ZERO
2739 f0ee 96 6c LDA DEVPOS GET PRINT POSITION
2740 f0f0 26 f3 BNE LB958 BRANCH IF NOT AT START OF LINE
2741 f0f2 39 LB965 RTS
2742 * SKIP TO NEXT TAB FIELD
2743 f0f3 bd e1 73 LB966 JSR LA35F SET UP TAB WIDTH, ZONE ETC
2744 f0f6 27 0a BEQ LB975 BRANCH IF LINE WIDTH = 0 (CASSETTE)
2745 f0f8 d6 6c LDB DEVPOS GET CURRENT POSITION
2746 f0fa d1 6b CMPB DEVLCF COMPARE TO LAST TAB ZONE
2747 f0fc 25 06 BCS LB977 BRANCH IF < LAST TAB ZONE
2748 f0fe 8d e5 BSR LB958 SEND A CARRIAGE RETURN TO CONSOLE OUT
2749 f100 20 1e BRA LB997 GET MORE DATA
2750 f102 d6 6c LB975 LDB DEVPOS *
2751 f104 d0 6a LB977 SUBB DEVCFW * SUBTRACT TAB FIELD WIDTH FROM CURRENT
2752 f106 24 fc BCC LB977 * POSITION UNTIL CARRY SET - NEGATING THE
2753 f108 50 NEGB * REMAINDER LEAVES THE NUMBER OF SPACES TO NEXT
2754 * * TAB ZONE IN ACCB
2755 f109 20 10 BRA LB98E GO ADVANCE TO NEXT TAB ZONE
2756
2757 * PRINT TAB(
2758 f10b bd ee d0 LB97E JSR LB709 EVALUATE EXPRESSION - RETURN VALUE IN B
2759 f10e 81 29 CMPA #') * 'SYNTAX' ERROR IF NOT ')'
2760 f110 10 26 f9 2f LBNE LB277 *
2761 f114 bd e1 73 JSR LA35F SET UP TAB WIDTH, ZONE ETC
2762 f117 d0 6c SUBB DEVPOS GET DIFFERENCE OF PRINT POSITION & TAB POSITION
2763 f119 23 05 BLS LB997 BRANCH IF TAB POSITION < CURRENT POSITION
2764 LB98E
2765 f11b 8d 18 LB992 BSR LB9AC SEND A SPACE TO CONSOLE OUT
2766 f11d 5a DECB DECREMENT DIFFERENCE COUNT
2767 f11e 26 fb BNE LB992 BRANCH UNTIL CURRENT POSITION = TAB POSITION
2768 f120 9d 7c LB997 JSR GETNCH GET NEXT CHARACTER FROM BASIC
2769 f122 7e f0 b2 JMP LB91B LOOK FOR MORE PRINT DATA
2770 * COPY A STRING FROM (X) TO CONSOLE OUT
2771 f125 bd ec df LB99C JSR LB518 PARSE A STRING FROM X AND PUT
2772 * DESCRIPTOR ON STRING STACK
2773 f128 bd ee 1e LB99F JSR LB657 GET LENGTH OF STRING AND REMOVE
2774 * DESCRIPTOR FROM STRING STACK
2775 f12b 5c INCB COMPENSATE FOR DECB BELOW
2776 f12c 5a LB9A3 DECB DECREMENT COUNTER
2777 f12d 27 c3 BEQ LB965 EXIT ROUTINE
2778 f12f a6 80 LDA ,X+ GET A CHARACTER FROM X
2779 f131 8d 07 BSR LB9B1 SEND TO CONSOLE OUT
2780 f133 20 f7 BRA LB9A3 KEEP LOOPING
2781 f135 86 20 LB9AC LDA #SPACE SPACE TO CONSOLE OUT
2782 f137 8c FCB SKP2 SKIP NEXT TWO BYTES
2783 f138 86 3f LB9AF LDA #'? QUESTION MARK TO CONSOLE OUT
2784 f13a 7e e0 14 LB9B1 JMP PUTCHR JUMP TO CONSOLE OUT
2785
2786 * FLOATING POINT MATH PACKAGE
2787
2788 * ADD .5 TO FPA0
2789 f13d 8e f6 49 LB9B4 LDX #LBEC0 FLOATING POINT CONSTANT (.5)
2790 f140 20 09 BRA LB9C2 ADD .5 TO FPA0
2791 * SUBTRACT FPA0 FROM FP NUMBER POINTED
2792 * TO BY (X), LEAVE RESULT IN FPA0
2793 f142 bd f2 b8 LB9B9 JSR LBB2F COPY PACKED FP DATA FROM (X) TO FPA1
2794
2795 * ARITHMETIC OPERATION (-) JUMPS HERE - SUBTRACT FPA0 FROM FPA1 (ENTER
2796 * WITH EXPONENT OF FPA0 IN ACCB AND EXPONENT OF FPA1 IN ACCA)
2797 f145 03 54 LB9BC COM FP0SGN CHANGE MANTISSA SIGN OF FPA0
2798 f147 03 62 COM RESSGN REVERSE RESULT SIGN FLAG
2799 f149 20 03 BRA LB9C5 GO ADD FPA1 AND FPA0
2800 * ADD FP NUMBER POINTED TO BY
2801 * (X) TO FPA0 - LEAVE RESULT IN FPA0
2802 f14b bd f2 b8 LB9C2 JSR LBB2F UNPACK PACKED FP DATA FROM (X) TO
2803 * FPA1; RETURN EXPONENT OF FPA1 IN ACCA
2804
2805 * ARITHMETIC OPERATION (+) JUMPS HERE - ADD FPA0 TO
2806
2807 f14e 5d LB9C5 TSTB CHECK EXPONENT OF FPA0
2808 f14f 10 27 02 80 LBEQ LBC4A COPY FPA1 TO FPA0 IF FPA0 =
2809 f153 8e 00 5c LDX #FP1EXP POINT X TO FPA1
2810 f156 1f 89 LB9CD TFR A,B PUT EXPONENT OF FPA1 INTO ACCB
2811 f158 5d TSTB CHECK EXPONENT
2812 f159 27 6c BEQ LBA3E RETURN IF EXPONENT = 0 (ADDING 0 TO FPA0)
2813 f15b d0 4f SUBB FP0EXP SUBTRACT EXPONENT OF FPA0 FROM EXPONENT OF FPA1
2814 f15d 27 69 BEQ LBA3F BRANCH IF EXPONENTS ARE EQUAL
2815 f15f 25 0a BCS LB9E2 BRANCH IF EXPONENT FPA0 > FPA1
2816 f161 97 4f STA FP0EXP REPLACE FPA0 EXPONENT WITH FPA1 EXPONENT
2817 f163 96 61 LDA FP1SGN * REPLACE FPA0 MANTISSA SIGN
2818 f165 97 54 STA FP0SGN * WITH FPA1 MANTISSA SIGN
2819 f167 8e 00 4f LDX #FP0EXP POINT X TO FPA0
2820 f16a 50 NEGB NEGATE DIFFERENCE OF EXPONENTS
2821 f16b c1 f8 LB9E2 CMPB #-8 TEST DIFFERENCE OF EXPONENTS
2822 f16d 2f 59 BLE LBA3F BRANCH IF DIFFERENCE OF EXPONENTS <= 8
2823 f16f 4f CLRA CLEAR OVERFLOW BYTE
2824 f170 64 01 LSR 1,X SHIFT MS BYTE OF MANTISSA; BIT 7 = 0
2825 f172 bd f2 43 JSR LBABA GO SHIFT MANTISSA OF (X) TO THE RIGHT (B) TIMES
2826 f175 d6 62 LB9EC LDB RESSGN GET SIGN FLAG
2827 f177 2a 0b BPL LB9FB BRANCH IF FPA0 AND FPA1 SIGNS ARE THE SAME
2828 f179 63 01 COM 1,X * COMPLEMENT MANTISSA POINTED
2829 f17b 63 02 COM 2,X * TO BY (X) THE
2830 f17d 63 03 COM 3,X * ADCA BELOW WILL
2831 f17f 63 04 COM 4,X * CONVERT THIS OPERATION
2832 f181 43 COMA * INTO A NEG (MANTISSA)
2833 f182 89 00 ADCA #0 ADD ONE TO ACCA - COMA ALWAYS SETS THE CARRY FLAG
2834 * THE PREVIOUS TWO BYTES MAY BE REPLACED BY A NEGA
2835 *
2836 * ADD MANTISSAS OF FPA0 AND FPA1, PUT RESULT IN FPA0
2837 f184 97 63 LB9FB STA FPSBYT SAVE FPA SUB BYTE
2838 f186 96 53 LDA FPA0+3 * ADD LS BYTE
2839 f188 99 60 ADCA FPA1+3 * OF MANTISSA
2840 f18a 97 53 STA FPA0+3 SAVE IN FPA0 LSB
2841 f18c 96 52 LDA FPA0+2 * ADD NEXT BYTE
2842 f18e 99 5f ADCA FPA1+2 * OF MANTISSA
2843 f190 97 52 STA FPA0+2 SAVE IN FPA0
2844 f192 96 51 LDA FPA0+1 * ADD NEXT BYTE
2845 f194 99 5e ADCA FPA1+1 * OF MANTISSA
2846 f196 97 51 STA FPA0+1 SAVE IN FPA0
2847 f198 96 50 LDA FPA0 * ADD MS BYTE
2848 f19a 99 5d ADCA FPA1 * OF MANTISSA
2849 f19c 97 50 STA FPA0 SAVE IN FPA0
2850 f19e 5d TSTB TEST SIGN FLAG
2851 f19f 2a 44 BPL LBA5C BRANCH IF FPA0 & FPA1 SIGNS WERE ALIKE
2852 f1a1 25 02 LBA18 BCS LBA1C BRANCH IF POSITIVE MANTISSA
2853 f1a3 8d 5d BSR LBA79 NEGATE FPA0 MANTISSA
2854
2855 * NORMALIZE FPA0
2856 f1a5 5f LBA1C CLRB CLEAR TEMPORARY EXPONENT ACCUMULATOR
2857 f1a6 96 50 LBA1D LDA FPA0 TEST MSB OF MANTISSA
2858 f1a8 26 2e BNE LBA4F BRANCH IF <> 0
2859 f1aa 96 51 LDA FPA0+1 * IF THE MSB IS
2860 f1ac 97 50 STA FPA0 * 0, THEN SHIFT THE
2861 f1ae 96 52 LDA FPA0+2 * MANTISSA A WHOLE BYTE
2862 f1b0 97 51 STA FPA0+1 * AT A TIME. THIS
2863 f1b2 96 53 LDA FPA0+3 * IS FASTER THAN ONE
2864 f1b4 97 52 STA FPA0+2 * BIT AT A TIME
2865 f1b6 96 63 LDA FPSBYT * BUT USES MORE MEMORY.
2866 f1b8 97 53 STA FPA0+3 * FPSBYT, THE CARRY IN
2867 f1ba 0f 63 CLR FPSBYT * BYTE, REPLACES THE MATISSA LSB.
2868 f1bc cb 08 ADDB #8 SHIFTING ONE BYTE = 8 BIT SHIFTS; ADD 8 TO EXPONENT
2869 f1be c1 28 CMPB #5*8 CHECK FOR 5 SHIFTS
2870 f1c0 2d e4 BLT LBA1D BRANCH IF < 5 SHIFTS, IF > 5, THEN MANTISSA = 0
2871 f1c2 4f LBA39 CLRA A ZERO EXPONENT = 0 FLOATING POINT
2872 f1c3 97 4f LBA3A STA FP0EXP ZERO OUT THE EXPONENT
2873 f1c5 97 54 STA FP0SGN ZERO OUT THE MANTISSA SIGN
2874 f1c7 39 LBA3E RTS
2875 f1c8 8d 6d LBA3F BSR LBAAE SHIFT FPA0 MANTISSA TO RIGHT
2876 f1ca 5f CLRB CLEAR CARRY FLAG
2877 f1cb 20 a8 BRA LB9EC
2878 * SHIFT FPA0 LEFT ONE BIT UNTIL BIT 7
2879 * OF MATISSA MS BYTE = 1
2880 f1cd 5c LBA44 INCB ADD ONE TO EXPONENT ACCUMULATOR
2881 f1ce 08 63 ASL FPSBYT SHIFT SUB BYTE ONE LEFT
2882 f1d0 09 53 ROL FPA0+3 SHIFT LS BYTE
2883 f1d2 09 52 ROL FPA0+2 SHIFT NS BYTE
2884 f1d4 09 51 ROL FPA0+1 SHIFT NS BYTE
2885 f1d6 09 50 ROL FPA0 SHIFT MS BYTE
2886 f1d8 2a f3 LBA4F BPL LBA44 BRANCH IF NOT YET NORMALIZED
2887 f1da 96 4f LDA FP0EXP GET CURRENT EXPONENT
2888 f1dc 34 04 PSHS B SAVE EXPONENT MODIFIER CAUSED BY NORMALIZATION
2889 f1de a0 e0 SUBA ,S+ SUBTRACT ACCUMULATED EXPONENT MODIFIER
2890 f1e0 97 4f STA FP0EXP SAVE AS NEW EXPONENT
2891 f1e2 23 de BLS LBA39 SET FPA0 = 0 IF THE NORMALIZATION CAUSED
2892 * MORE OR EQUAL NUMBER OF LEFT SHIFTS THAN THE
2893 * SIZE OF THE EXPONENT
2894 f1e4 8c FCB SKP2 SKIP 2 BYTES
2895 f1e5 25 08 LBA5C BCS LBA66 BRANCH IF MANTISSA OVERFLOW
2896 f1e7 08 63 ASL FPSBYT SUB BYTE BIT 7 TO CARRY - USE AS ROUND-OFF
2897 * FLAG (TRUNCATE THE REST OF SUB BYTE)
2898 f1e9 86 00 LDA #0 CLRA, BUT DO NOT CHANGE CARRY FLAG
2899 f1eb 97 63 STA FPSBYT CLEAR THE SUB BYTE
2900 f1ed 20 0c BRA LBA72 GO ROUND-OFF RESULT
2901 f1ef 0c 4f LBA66 INC FP0EXP INCREMENT EXPONENT - MULTIPLY BY 2
2902 f1f1 27 28 BEQ LBA92 OVERFLOW ERROR IF CARRY PAST $FF
2903 f1f3 06 50 ROR FPA0 * SHIFT MANTISSA
2904 f1f5 06 51 ROR FPA0+1 * ONE TO
2905 f1f7 06 52 ROR FPA0+2 * THE RIGHT -
2906 f1f9 06 53 ROR FPA0+3 * DIVIDE BY TWO
2907 f1fb 24 04 LBA72 BCC LBA78 BRANCH IF NO ROUND-OFF NEEDED
2908 f1fd 8d 0d BSR LBA83 ADD ONE TO MANTISSA - ROUND OFF
2909 f1ff 27 ee BEQ LBA66 BRANCH iF OVERFLOW - MANTISSA = 0
2910 f201 39 LBA78 RTS
2911 * NEGATE FPA0 MANTISSA
2912 f202 03 54 LBA79 COM FP0SGN TOGGLE SIGN OF MANTISSA
2913 f204 03 50 LBA7B COM FPA0 * COMPLEMENT ALL 4 MANTISSA BYTES
2914 f206 03 51 COM FPA0+1 *
2915 f208 03 52 COM FPA0+2 *
2916 f20a 03 53 COM FPA0+3 *
2917 * ADD ONE TO FPA0 MANTISSA
2918 f20c 9e 52 LBA83 LDX FPA0+2 * GET BOTTOM 2 MANTISSA
2919 f20e 30 01 LEAX 1,X * BYTES, ADD ONE TO
2920 f210 9f 52 STX FPA0+2 * THEM AND SAVE THEM
2921 f212 26 06 BNE LBA91 BRANCH IF NO OVERFLOW
2922 f214 9e 50 LDX FPA0 * IF OVERFLOW ADD ONE
2923 f216 30 01 LEAX 1,X * TO TOP 2 MANTISSA
2924 f218 9f 50 STX FPA0 * BYTES AND SAVE THEM
2925 f21a 39 LBA91 RTS
2926 f21b c6 0a LBA92 LDB #2*5 OV' OVERFLOW ERROR
2927 f21d 7e e4 46 JMP LAC46 PROCESS AN ERROR
2928 f220 8e 00 12 LBA97 LDX #FPA2-1 POINT X TO FPA2
2929 * SHIFT FPA POINTED TO BY (X) TO
2930 * THE RIGHT -(B) TIMES. EXIT WITH
2931 * ACCA CONTAINING DATA SHIFTED OUT
2932 * TO THE RIGHT (SUB BYTE) AND THE DATA
2933 * SHIFTED IN FROM THE LEFT WILL COME FROM FPCARY
2934 f223 a6 04 LBA9A LDA 4,X GET LS BYTE OF MANTISSA (X)
2935 f225 97 63 STA FPSBYT SAVE IN FPA SUB BYTE
2936 f227 a6 03 LDA 3,X * SHIFT THE NEXT THREE BYTES OF THE
2937 f229 a7 04 STA 4,X * MANTISSA RIGHT ONE COMPLETE BYTE.
2938 f22b a6 02 LDA 2,X *
2939 f22d a7 03 STA 3,X *
2940 f22f a6 01 LDA 1,X *
2941 f231 a7 02 STA 2,X *
2942 f233 96 5b LDA FPCARY GET THE CARRY IN BYTE
2943 f235 a7 01 STA 1,X STORE AS THE MS MANTISSA BYTE OF (X)
2944 f237 cb 08 LBAAE ADDB #8 ADD 8 TO DIFFERENCE OF EXPONENTS
2945 f239 2f e8 BLE LBA9A BRANCH IF EXPONENT DIFFERENCE < -8
2946 f23b 96 63 LDA FPSBYT GET FPA SUB BYTE
2947 f23d c0 08 SUBB #8 CAST OUT THE 8 ADDED IN ABOVE
2948 f23f 27 0c BEQ LBAC4 BRANCH IF EXPONENT DIFFERENCE = 0
2949
2950
2951 f241 67 01 LBAB8 ASR 1,X * SHIFT MANTISSA AND SUB BYTE ONE BIT TO THE RIGHT
2952 f243 66 02 LBABA ROR 2,X *
2953 f245 66 03 ROR 3,X *
2954 f247 66 04 ROR 4,X *
2955 f249 46 RORA *
2956 f24a 5c INCB ADD ONE TO EXPONENT DIFFERENCE
2957 f24b 26 f4 BNE LBAB8 BRANCH IF EXPONENTS NOT =
2958 f24d 39 LBAC4 RTS
2959 f24e 81 00 00 00 00 LBAC5 FCB $81,$00,$00,$00,$00 FLOATING POINT CONSTANT 1.0
2960
2961 * ARITHMETIC OPERATION (*) JUMPS HERE - MULTIPLY
2962 * FPA0 BY (X) - RETURN PRODUCT IN FPA0
2963 f253 8d 63 LBACA BSR LBB2F MOVE PACKED FPA FROM (X) TO FPA1
2964 f255 27 60 LBACC BEQ LBB2E BRANCH IF EXPONENT OF FPA0 = 0
2965 f257 8d 78 BSR LBB48 CALCULATE EXPONENT OF PRODUCT
2966 * MULTIPLY FPA0 MANTISSA BY FPA1. NORMALIZE
2967 * HIGH ORDER BYTES OF PRODUCT IN FPA0. THE
2968 * LOW ORDER FOUR BYTES OF THE PRODUCT WILL
2969 * BE STORED IN VAB-VAE.
2970 f259 86 00 LBAD0 LDA #0 * ZERO OUT MANTISSA OF FPA2
2971 f25b 97 13 STA FPA2 *
2972 f25d 97 14 STA FPA2+1 *
2973 f25f 97 15 STA FPA2+2 *
2974 f261 97 16 STA FPA2+3 *
2975 f263 d6 53 LDB FPA0+3 GET LS BYTE OF FPA0
2976 f265 8d 22 BSR LBB00 MULTIPLY BY FPA1
2977 f267 d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 4
2978 f269 d7 8b STB VAE *
2979 f26b d6 52 LDB FPA0+2 GET NUMBER 3 MANTISSA BYTE OF FPA0
2980 f26d 8d 1a BSR LBB00 MULTIPLY BY FPA1
2981 f26f d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 3
2982 f271 d7 8a STB VAD *
2983 f273 d6 51 LDB FPA0+1 GET NUMBER 2 MANTISSA BYTE OF FPA0
2984 f275 8d 12 BSR LBB00 MULTIPLY BY FPA1
2985 f277 d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 2
2986 f279 d7 89 STB VAC *
2987 f27b d6 50 LDB FPA0 GET MS BYTE OF FPA0 MANTISSA
2988 f27d 8d 0c BSR LBB02 MULTIPLY BY FPA1
2989 f27f d6 63 LDB FPSBYT * TEMPORARILY SAVE SUB BYTE 1
2990 f281 d7 88 STB VAB *
2991 f283 bd f3 94 JSR LBC0B COPY MANTISSA FROM FPA2 TO FPA0
2992 f286 7e f1 a5 JMP LBA1C NORMALIZE FPA0
2993 f289 27 95 LBB00 BEQ LBA97 SHIFT FPA2 ONE BYTE TO RIGHT
2994 f28b 43 LBB02 COMA SET CARRY FLAG
2995 * MULTIPLY FPA1 MANTISSA BY ACCB AND
2996 * ADD PRODUCT TO FPA2 MANTISSA
2997 f28c 96 13 LBB03 LDA FPA2 GET FPA2 MS BYTE
2998 f28e 56 RORB ROTATE CARRY FLAG INTO SHIFT COUNTER;
2999 * DATA BIT INTO CARRY
3000 f28f 27 26 BEQ LBB2E BRANCH WHEN 8 SHIFTS DONE
3001 f291 24 16 BCC LBB20 DO NOT ADD FPA1 IF DATA BIT = 0
3002 f293 96 16 LDA FPA2+3 * ADD MANTISSA LS BYTE
3003 f295 9b 60 ADDA FPA1+3 *
3004 f297 97 16 STA FPA2+3 *
3005 f299 96 15 LDA FPA2+2 = ADD MANTISSA NUMBER 3 BYTE
3006 f29b 99 5f ADCA FPA1+2 =
3007 f29d 97 15 STA FPA2+2 =
3008 f29f 96 14 LDA FPA2+1 * ADD MANTISSA NUMBER 2 BYTE
3009 f2a1 99 5e ADCA FPA1+1 *
3010 f2a3 97 14 STA FPA2+1 *
3011 f2a5 96 13 LDA FPA2 = ADD MANTISSA MS BYTE
3012 f2a7 99 5d ADCA FPA1 =
3013 f2a9 46 LBB20 RORA * ROTATE CARRY INTO MS BYTE
3014 f2aa 97 13 STA FPA2 *
3015 f2ac 06 14 ROR FPA2+1 = ROTATE FPA2 ONE BIT TO THE RIGHT
3016 f2ae 06 15 ROR FPA2+2 =
3017 f2b0 06 16 ROR FPA2+3 =
3018 f2b2 06 63 ROR FPSBYT =
3019 f2b4 4f CLRA CLEAR CARRY FLAG
3020 f2b5 20 d5 BRA LBB03 KEEP LOOPING
3021 f2b7 39 LBB2E RTS
3022 * UNPACK A FP NUMBER FROM (X) TO FPA1
3023 f2b8 ec 01 LBB2F LDD 1,X GET TWO MSB BYTES OF MANTISSA FROM
3024 * FPA POINTED TO BY X
3025 f2ba 97 61 STA FP1SGN SAVE PACKED MANTISSA SIGN BYTE
3026 f2bc 8a 80 ORA #$80 FORCE BIT 7 OF MSB MANTISSA = 1
3027 f2be dd 5d STD FPA1 SAVE 2 MSB BYTES IN FPA1
3028 f2c0 d6 61 LDB FP1SGN * GET PACKED MANTISSA SIGN BYTE. EOR W/FPA0
3029 f2c2 d8 54 EORB FP0SGN * SIGN - NEW SIGN POSITION IF BOTH OLD SIGNS ALIKE,
3030 f2c4 d7 62 STB RESSGN * NEG IF BOTH OLD SIGNS DIFF. SAVE ADJUSTED
3031 * * MANTISSA SIGN BYTE
3032 f2c6 ec 03 LDD 3,X = GET 2 LSB BYTES OF MANTISSA
3033 f2c8 dd 5f STD FPA1+2 = AND PUT IN FPA1
3034 f2ca a6 84 LDA ,X * GET EXPONENT FROM (X) AND
3035 f2cc 97 5c STA FP1EXP * PUT IN EXPONENT OF FPA1
3036 f2ce d6 4f LDB FP0EXP GET EXPONENT OF FPA0
3037 f2d0 39 RTS
3038 * CALCULATE EXPONENT FOR PRODUCT OF FPA0 & FPA1
3039 * ENTER WITH EXPONENT OF FPA1 IN ACCA
3040 f2d1 4d LBB48 TSTA TEST EXPONENT OF FPA1
3041 f2d2 27 16 BEQ LBB61 PURGE RETURN ADDRESS & SET FPA0 = 0
3042 f2d4 9b 4f ADDA FP0EXP ADD FPA1 EXPONENT TO FPA0 EXPONENT
3043 f2d6 46 RORA ROTATE CARRY INTO BIT 7; BIT 0 INTO CARRY
3044 f2d7 49 ROLA SET OVERFLOW FLAG
3045 f2d8 28 10 BVC LBB61 BRANCH IF EXPONENT TOO LARGE OR SMALL
3046 f2da 8b 80 ADDA #$80 ADD $80 BIAS TO EXPONENT
3047 f2dc 97 4f STA FP0EXP SAVE NEW EXPONENT
3048 f2de 27 0c BEQ LBB63 SET FPA0
3049 f2e0 96 62 LDA RESSGN GET MANTISSA SIGN
3050 f2e2 97 54 STA FP0SGN SAVE AS MANTISSA SIGN OF FPA0
3051 f2e4 39 RTS
3052 * IF FPA0 = POSITIVE THEN 'OV' ERROR IF FPA0
3053 * = IS NEGATIVE THEN FPA0 = 0
3054 f2e5 96 54 LBB5C LDA FP0SGN GET MANTISSA SIGN OF FPA0
3055 f2e7 43 COMA CHANGE SIGN OF FPA0 MANTISSA
3056 f2e8 20 02 BRA LBB63
3057 f2ea 32 62 LBB61 LEAS 2,S PURGE RETURN ADDRESS FROM STACK
3058 f2ec 10 2a fe d2 LBB63 LBPL LBA39 ZERO FPA0 MANTISSA SIGN & EXPONENT
3059 f2f0 7e f2 1b LBB67 JMP LBA92 OV' OVERFLOW ERROR
3060 * FAST MULTIPLY BY 10 AND LEAVE RESULT IN FPA0
3061 f2f3 bd f3 e8 LBB6A JSR LBC5F TRANSFER FPA0 TO FPA1
3062 f2f6 27 0d BEQ LBB7C BRANCH IF EXPONENT = 0
3063 f2f8 8b 02 ADDA #2 ADD 2 TO EXPONENT (TIMES 4)
3064 f2fa 25 f4 BCS LBB67 OV' ERROR IF EXPONENT > $FF
3065 f2fc 0f 62 CLR RESSGN CLEAR RESULT SIGN BYTE
3066 f2fe bd f1 56 JSR LB9CD ADD FPA1 TO FPA0 (TIMES 5)
3067 f301 0c 4f INC FP0EXP ADD ONE TO EXPONENT (TIMES 10)
3068 f303 27 eb BEQ LBB67 OV' ERROR IF EXPONENT > $FF
3069 f305 39 LBB7C RTS
3070 f306 84 20 00 00 00 LBB7D FCB $84,$20,$00,$00,$00 FLOATING POINT CONSTANT 10
3071 * DIVIDE FPA0 BY 10
3072 f30b bd f3 e8 LBB82 JSR LBC5F MOVE FPA0 TO FPA1
3073 f30e 8e f3 06 LDX #LBB7D POINT TO FLOATING POINT CONSTANT 10
3074 f311 5f CLRB ZERO MANTISSA SIGN BYTE
3075 f312 d7 62 LBB89 STB RESSGN STORE THE QUOTIENT MANTISSA SIGN BYTE
3076 f314 bd f3 9d JSR LBC14 UNPACK AN FP NUMBER FROM (X) INTO FPA0
3077 f317 8c FCB SKP2 SKIP TWO BYTES
3078 * DIVIDE (X) BY FPA0-LEAVE NORMALIZED QUOTIENT IN FPA0
3079 f318 8d 9e LBB8F BSR LBB2F GET FP NUMBER FROM (X) TO FPA1
3080
3081 * ARITHMETIC OPERATION (/) JUMPS HERE. DIVIDE FPA1 BY FPA0 (ENTER WITH
3082 * EXPONENT OF FPA1 IN ACCA AND FLAGS SET BY TSTA)
3083
3084 * DIVIDE FPA1 BY FPA0
3085 f31a 27 73 LBB91 BEQ LBC06 /0' DIVIDE BY ZERO ERROR
3086 f31c 00 4f NEG FP0EXP GET EXPONENT OF RECIPROCAL OF DIVISOR
3087 f31e 8d b1 BSR LBB48 CALCULATE EXPONENT OF QUOTIENT
3088 f320 0c 4f INC FP0EXP INCREMENT EXPONENT
3089 f322 27 cc BEQ LBB67 OV' OVERFLOW ERROR
3090 f324 8e 00 13 LDX #FPA2 POINT X TO MANTISSA OF FPA2 - HOLD
3091 * TEMPORARY QUOTIENT IN FPA2
3092 f327 c6 04 LDB #4 5 BYTE DIVIDE
3093 f329 d7 03 STB TMPLOC SAVE BYTE COUNTER
3094 f32b c6 01 LDB #1 SHIFT COUNTER-AND TEMPORARY QUOTIENT BYTE
3095 * COMPARE FPA0 MANTISSA TO FPA1 MANTISSA -
3096 * SET CARRY FLAG IF FPA1 >= FPA0
3097 f32d 96 50 LBBA4 LDA FPA0 * COMPARE THE TWO MS BYTES
3098 f32f 91 5d CMPA FPA1 * OF FPA0 AND FPA1 AND
3099 f331 26 13 BNE LBBBD * BRANCH IF <>
3100 f333 96 51 LDA FPA0+1 = COMPARE THE NUMBER 2
3101 f335 91 5e CMPA FPA1+1 = BYTES AND
3102 f337 26 0d BNE LBBBD = BRANCH IF <>
3103 f339 96 52 LDA FPA0+2 * COMPARE THE NUMBER 3
3104 f33b 91 5f CMPA FPA1+2 * BYTES AND
3105 f33d 26 07 BNE LBBBD * BRANCH IF <>
3106 f33f 96 53 LDA FPA0+3 = COMPARE THE LS BYTES
3107 f341 91 60 CMPA FPA1+3 = AND BRANCH
3108 f343 26 01 BNE LBBBD = IF <>
3109 f345 43 COMA SET CARRY FLAG IF FPA0 = FPA1
3110 f346 1f a8 LBBBD TFR CC,A SAVE CARRY FLAG STATUS IN ACCA; CARRY
3111 * CLEAR IF FPA0 > FPA1
3112 f348 59 ROLB ROTATE CARRY INTO TEMPORARY QUOTIENT BYTE
3113 f349 24 0a BCC LBBCC CARRY WILL BE SET AFTER 8 SHIFTS
3114 f34b e7 80 STB ,X+ SAVE TEMPORARY QUOTIENT
3115 f34d 0a 03 DEC TMPLOC DECREMENT BYTE COUNTER
3116 f34f 2b 34 BMI LBBFC BRANCH IF DONE
3117 f351 27 2e BEQ LBBF8 BRANCH IF LAST BYTE
3118 f353 c6 01 LDB #1 RESET SHIFT COUNTER AND TEMPORARY QUOTIENT BYTE
3119 f355 1f 8a LBBCC TFR A,CC RESTORE CARRY FLAG AND
3120 f357 25 0e BCS LBBDE BRANCH IF FPA0 =< FPA1
3121 f359 08 60 LBBD0 ASL FPA1+3 * SHIFT FPA1 MANTISSA 1 BIT TO LEFT
3122 f35b 09 5f ROL FPA1+2 *
3123 f35d 09 5e ROL FPA1+1 *
3124 f35f 09 5d ROL FPA1 *
3125 f361 25 e3 BCS LBBBD BRANCH IF CARRY - ADD ONE TO PARTIAL QUOTIENT
3126 f363 2b c8 BMI LBBA4 IF MSB OF HIGH ORDER MANTISSA BYTE IS
3127 * SET, CHECK THE MAGNITUDES OF FPA0, FPA1
3128 f365 20 df BRA LBBBD CARRY IS CLEAR, CHECK ANOTHER BIT
3129 * SUBTRACT FPA0 FROM FPA1 - LEAVE RESULT IN FPA1
3130 f367 96 60 LBBDE LDA FPA1+3 * SUBTRACT THE LS BYTES OF MANTISSA
3131 f369 90 53 SUBA FPA0+3 *
3132 f36b 97 60 STA FPA1+3 *
3133 f36d 96 5f LDA FPA1+2 = THEN THE NEXT BYTE
3134 f36f 92 52 SBCA FPA0+2 =
3135 f371 97 5f STA FPA1+2 =
3136 f373 96 5e LDA FPA1+1 * AND THE NEXT
3137 f375 92 51 SBCA FPA0+1 *
3138 f377 97 5e STA FPA1+1 *
3139 f379 96 5d LDA FPA1 = AND FINALLY, THE MS BYTE OF MANTISSA
3140 f37b 92 50 SBCA FPA0 =
3141 f37d 97 5d STA FPA1 =
3142 f37f 20 d8 BRA LBBD0 GO SHIFT FPA1
3143 f381 c6 40 LBBF8 LDB #$40 USE ONLY TWO BITS OF THE LAST BYTE (FIFTH)
3144 f383 20 d0 BRA LBBCC GO SHIFT THE LAST BYTE
3145 f385 56 LBBFC RORB * SHIFT CARRY (ALWAYS SET HERE) INTO
3146 f386 56 RORB * BIT 5 AND MOVE
3147 f387 56 RORB * BITS 1,0 TO BITS 7,6
3148 f388 d7 63 STB FPSBYT SAVE SUB BYTE
3149 f38a 8d 08 BSR LBC0B MOVE MANTISSA OF FPA2 TO FPA0
3150 f38c 7e f1 a5 JMP LBA1C NORMALIZE FPA0
3151 f38f c6 14 LBC06 LDB #2*10 /0' ERROR
3152 f391 7e e4 46 JMP LAC46 PROCESS THE ERROR
3153 * COPY MANTISSA FROM FPA2 TO FPA0
3154 f394 9e 13 LBC0B LDX FPA2 * MOVE TOP 2 BYTES
3155 f396 9f 50 STX FPA0 *
3156 f398 9e 15 LDX FPA2+2 = MOVE BOTTOM 2 BYTES
3157 f39a 9f 52 STX FPA0+2 =
3158 f39c 39 RTS
3159 * COPY A PACKED FP NUMBER FROM (X) TO FPA0
3160 f39d 34 02 LBC14 PSHS A SAVE ACCA
3161 f39f ec 01 LDD 1,X GET TOP TWO MANTISSA BYTES
3162 f3a1 97 54 STA FP0SGN SAVE MS BYTE OF MANTISSA AS MANTISSA SIGN
3163 f3a3 8a 80 ORA #$80 UNPACK MS BYTE
3164 f3a5 dd 50 STD FPA0 SAVE UNPACKED TOP 2 MANTISSA BYTES
3165 f3a7 0f 63 CLR FPSBYT CLEAR MANTISSA SUB BYTE
3166 f3a9 e6 84 LDB ,X GET EXPONENT TO ACCB
3167 f3ab ae 03 LDX 3,X * MOVE LAST 2
3168 f3ad 9f 52 STX FPA0+2 * MANTISSA BYTES
3169 f3af d7 4f STB FP0EXP SAVE EXPONENT
3170 f3b1 35 82 PULS A,PC RESTORE ACCA AND RETURN
3171
3172 f3b3 8e 00 45 LBC2A LDX #V45 POINT X TO MANTISSA OF FPA4
3173 f3b6 20 06 BRA LBC35 MOVE FPA0 TO FPA4
3174 f3b8 8e 00 40 LBC2F LDX #V40 POINT X TO MANTISSA OF FPA3
3175 f3bb 8c FCB SKP2 SKIP TWO BYTES
3176 f3bc 9e 3b LBC33 LDX VARDES POINT X TO VARIABLE DESCRIPTOR IN VARDES
3177 * PACK FPA0 AND MOVE IT TO ADDRESS IN X
3178 f3be 96 4f LBC35 LDA FP0EXP * COPY EXPONENT
3179 f3c0 a7 84 STA ,X *
3180 f3c2 96 54 LDA FP0SGN GET MANTISSA SIGN BIT
3181 f3c4 8a 7f ORA #$7F MASK THE BOTTOM 7 BITS
3182 f3c6 94 50 ANDA FPA0 AND BIT 7 OF MANTISSA SIGN INTO BIT 7 OF MS BYTE
3183 f3c8 a7 01 STA 1,X SAVE MS BYTE
3184 f3ca 96 51 LDA FPA0+1 * MOVE 2ND MANTISSA BYTE
3185 f3cc a7 02 STA 2,X *
3186 f3ce de 52 LDU FPA0+2 = MOVE BOTTOM 2 MANTISSA BYTES
3187 f3d0 ef 03 STU 3,X =
3188 f3d2 39 RTS
3189 * MOVE FPA1 TO FPA0 RETURN W/MANTISSA SIGN IN ACCA
3190 f3d3 96 61 LBC4A LDA FP1SGN * COPY MANTISSA SIGN FROM
3191 f3d5 97 54 LBC4C STA FP0SGN * FPA1 TO FPA0
3192 f3d7 9e 5c LDX FP1EXP = COPY EXPONENT + MS BYTE FROM
3193 f3d9 9f 4f STX FP0EXP = FPA1 TO FPA0
3194 f3db 0f 63 CLR FPSBYT CLEAR MANTISSA SUB BYTE
3195 f3dd 96 5e LDA FPA1+1 * COPY 2ND MANTISSA BYTE
3196 f3df 97 51 STA FPA0+1 * FROM FPA1 TO FPA0
3197 f3e1 96 54 LDA FP0SGN GET MANTISSA SIGN
3198 f3e3 9e 5f LDX FPA1+2 * COPY 3RD AND 4TH MANTISSA BYTE
3199 f3e5 9f 52 STX FPA0+2 * FROM FPA1 TO FPA0
3200 f3e7 39 RTS
3201 * TRANSFER FPA0 TO FPA1
3202 f3e8 dc 4f LBC5F LDD FP0EXP * TRANSFER EXPONENT & MS BYTE
3203 f3ea dd 5c STD FP1EXP *
3204 f3ec 9e 51 LDX FPA0+1 = TRANSFER MIDDLE TWO BYTES
3205 f3ee 9f 5e STX FPA1+1 =
3206 f3f0 9e 53 LDX FPA0+3 * TRANSFER BOTTOM TWO BYTES
3207 f3f2 9f 60 STX FPA1+3 *
3208 f3f4 4d TSTA SET FLAGS ACCORDING TO EXPONENT
3209 f3f5 39 RTS
3210 * CHECK FPA0; RETURN ACCB = 0 IF FPA0 = 0,
3211 * ACCB = $FF IF FPA0 = NEGATIVE, ACCB = 1 IF FPA0 = POSITIVE
3212 f3f6 d6 4f LBC6D LDB FP0EXP GET EXPONENT
3213 f3f8 27 08 BEQ LBC79 BRANCH IF FPA0 = 0
3214 f3fa d6 54 LBC71 LDB FP0SGN GET SIGN OF MANTISSA
3215 f3fc 59 LBC73 ROLB BIT 7 TO CARRY
3216 f3fd c6 ff LDB #$FF NEGATIVE FLAG
3217 f3ff 25 01 BCS LBC79 BRANCH IF NEGATIVE MANTISSA
3218 f401 50 NEGB ACCB = 1 IF POSITIVE MANTISSA
3219 f402 39 LBC79 RTS
3220
3221 * SGN
3222 f403 8d f1 SGN BSR LBC6D SET ACCB ACCORDING TO SIGN OF FPA0
3223 * CONVERT A SIGNED NUMBER IN ACCB INTO A FLOATING POINT NUMBER
3224 f405 d7 50 LBC7C STB FPA0 SAVE ACCB IN FPA0
3225 f407 0f 51 CLR FPA0+1 CLEAR NUMBER 2 MANTISSA BYTE OF FPA0
3226 f409 c6 88 LDB #$88 EXPONENT REQUIRED IF FPA0 IS TO BE AN INTEGER
3227 f40b 96 50 LBC82 LDA FPA0 GET MS BYTE OF MANTISSA
3228 f40d 80 80 SUBA #$80 SET CARRY IF POSITIVE MANTISSA
3229 f40f d7 4f LBC86 STB FP0EXP SAVE EXPONENT
3230 f411 dc 74 LDD ZERO * ZERO OUT ACCD AND
3231 f413 dd 52 STD FPA0+2 * BOTTOM HALF OF FPA0
3232 f415 97 63 STA FPSBYT CLEAR SUB BYTE
3233 f417 97 54 STA FP0SGN CLEAR SIGN OF FPA0 MANTISSA
3234 f419 7e f1 a1 JMP LBA18 GO NORMALIZE FPA0
3235
3236 * ABS
3237 f41c 0f 54 ABS CLR FP0SGN FORCE MANTISSA SIGN OF FPA0 POSITIVE
3238 f41e 39 RTS
3239 * COMPARE A PACKED FLOATING POINT NUMBER POINTED TO
3240 * BY (X) TO AN UNPACKED FP NUMBER IN FPA0. RETURN
3241 * ZERO FLAG SET AND ACCB = 0, IF EQUAL; ACCB = 1 IF
3242 * FPA0 > (X); ACCB = $FF IF FPA0 < (X)
3243 f41f e6 84 LBC96 LDB ,X CHECK EXPONENT OF (X)
3244 f421 27 d3 BEQ LBC6D BRANCH IF FPA = 0
3245 f423 e6 01 LDB 1,X GET MS BYTE OF MANTISSA OF (X)
3246 f425 d8 54 EORB FP0SGN EOR WITH SIGN OF FPA0
3247 f427 2b d1 BMI LBC71 BRANCH IF SIGNS NOT =
3248 * COMPARE FPA0 WITH FP NUMBER POINTED TO BY (X).
3249 * FPA0 IS NORMALIZED, (X) IS PACKED.
3250 f429 d6 4f LBCA0 LDB FP0EXP * GET EXPONENT OF
3251 f42b e1 84 CMPB ,X * FPA0, COMPARE TO EXPONENT OF
3252 f42d 26 1d BNE LBCC3 * (X) AND BRANCH IF <>.
3253 f42f e6 01 LDB 1,X * GET MS BYTE OF (X), KEEP ONLY
3254 f431 ca 7f ORB #$7F * THE SIGN BIT - 'AND' THE BOTTOM 7
3255 f433 d4 50 ANDB FPA0 * BITS OF FPA0 INTO ACCB
3256 f435 e1 01 CMPB 1,X = COMPARE THE BOTTOM 7 BITS OF THE MANTISSA
3257 f437 26 13 BNE LBCC3 = MS BYTE AND BRANCH IF <>
3258 f439 d6 51 LDB FPA0+1 * COMPARE 2ND BYTE
3259 f43b e1 02 CMPB 2,X * OF MANTISSA,
3260 f43d 26 0d BNE LBCC3 * BRANCH IF <>
3261 f43f d6 52 LDB FPA0+2 = COMPARE 3RD BYTE
3262 f441 e1 03 CMPB 3,X = OF MANTISSA,
3263 f443 26 07 BNE LBCC3 = BRANCH IF <>
3264 f445 d6 53 LDB FPA0+3 * SUBTRACT LS BYTE
3265 f447 e0 04 SUBB 4,X * OF (X) FROM LS BYTE OF
3266 f449 26 01 BNE LBCC3 * FPA0, BRANCH IF <>
3267 f44b 39 RTS RETURN IF FP (X) = FPA0
3268 f44c 56 LBCC3 RORB SHIFT CARRY TO BIT 7; CARRY SET IF FPA0 < (X)
3269 f44d d8 54 EORB FP0SGN TOGGLE SIZE COMPARISON BIT IF FPA0 IS NEGATIVE
3270 f44f 20 ab BRA LBC73 GO SET ACCB ACCORDING TO COMPARISON
3271 * DE-NORMALIZE FPA0 : SHIFT THE MANTISSA UNTIL THE BINARY POINT IS TO THE RIGHT
3272 * OF THE LEAST SIGNIFICANT BYTE OF THE MANTISSA
3273 f451 d6 4f LBCC8 LDB FP0EXP GET EXPONENT OF FPA0
3274 f453 27 3d BEQ LBD09 ZERO MANTISSA IF FPA0 = 0
3275 f455 c0 a0 SUBB #$A0 SUBTRACT $A0 FROM FPA0 EXPONENT T THIS WILL YIELD
3276 * THE NUMBER OF SHIFTS REQUIRED TO DENORMALIZE FPA0. WHEN
3277 * THE EXPONENT OF FPA0 IS = ZERO, THEN THE BINARY POINT
3278 * WILL BE TO THE RIGHT OF THE MANTISSA
3279 f457 96 54 LDA FP0SGN TEST SIGN OF FPA0 MANTISSA
3280 f459 2a 05 BPL LBCD7 BRANCH IF POSITIVE
3281 f45b 03 5b COM FPCARY COMPLEMENT CARRY IN BYTE
3282 f45d bd f2 04 JSR LBA7B NEGATE MANTISSA OF FPA0
3283 f460 8e 00 4f LBCD7 LDX #FP0EXP POINT X TO FPA0
3284 f463 c1 f8 CMPB #-8 EXPONENT DIFFERENCE < -8?
3285 f465 2e 06 BGT LBCE4 YES
3286 f467 bd f2 37 JSR LBAAE SHIFT FPA0 RIGHT UNTIL FPA0 EXPONENT = $A0
3287 f46a 0f 5b CLR FPCARY CLEAR CARRY IN BYTE
3288 f46c 39 RTS
3289 f46d 0f 5b LBCE4 CLR FPCARY CLEAR CARRY IN BYTE
3290 f46f 96 54 LDA FP0SGN * GET SIGN OF FPA0 MANTISSA
3291 f471 49 ROLA * ROTATE IT INTO THE CARRY FLAG
3292 f472 06 50 ROR FPA0 ROTATE CARRY (MANTISSA SIGN) INTO BIT 7
3293 * OF LS BYTE OF MANTISSA
3294 f474 7e f2 43 JMP LBABA DE-NORMALIZE FPA0
3295
3296 * INT
3297 * THE INT STATEMENT WILL "DENORMALIZE" FPA0 - THAT IS IT WILL SHIFT THE BINARY POINT
3298 * TO THE EXTREME RIGHT OF THE MANTISSA TO FORCE ITS EXPONENT TO BE $AO. ONCE
3299 * THIS IS DONE THE MANTISSA OF FPA0 WILL CONTAIN THE FOUR LEAST SIGNIFICANT
3300 * BYTES OF THE INTEGER PORTION OF FPA0. AT THE CONCLUSION OF THE DE-NORMALIZATION
3301 * ONLY THE INTEGER PORTION OF FPA0 WILL REMAIN.
3302 *
3303 f477 d6 4f INT LDB FP0EXP GET EXPONENT OF FPA0
3304 f479 c1 a0 CMPB #$A0 LARGEST POSSIBLE INTEGER EXPONENT
3305 f47b 24 1d BCC LBD11 RETURN IF FPA0 >= 32768
3306 f47d 8d d2 BSR LBCC8 SHIFT THE BINARY POINT ONE TO THE RIGHT OF THE
3307 * LS BYTE OF THE FPA0 MANTISSA
3308 f47f d7 63 STB FPSBYT ACCB = 0: ZERO OUT THE SUB BYTE
3309 f481 96 54 LDA FP0SGN GET MANTISSA SIGN
3310 f483 d7 54 STB FP0SGN FORCE MANTISSA SIGN TO BE POSITIVE
3311 f485 80 80 SUBA #$80 SET CARRY IF MANTISSA
3312 f487 86 a0 LDA #$A0 * GET DENORMALIZED EXPONENT AND
3313 f489 97 4f STA FP0EXP * SAVE IT IN FPA0 EXPONENT
3314 f48b 96 53 LDA FPA0+3 = GET LS BYTE OF FPA0 AND
3315 f48d 97 01 STA CHARAC = SAVE IT IN CHARAC
3316 f48f 7e f1 a1 JMP LBA18 NORMALIZE FPA0
3317
3318 f492 d7 50 LBD09 STB FPA0 * LOAD MANTISSA OF FPA0 WITH CONTENTS OF ACCB
3319 f494 d7 51 STB FPA0+1 *
3320 f496 d7 52 STB FPA0+2 *
3321 f498 d7 53 STB FPA0+3 *
3322 f49a 39 LBD11 RTS *
3323
3324 * CONVERT ASCII STRING TO FLOATING POINT
3325 f49b 9e 74 LBD12 LDX ZERO (X) = 0
3326 f49d 9f 54 STX FP0SGN * ZERO OUT FPA0 & THE SIGN FLAG (COEFCT)
3327 f49f 9f 4f STX FP0EXP *
3328 f4a1 9f 51 STX FPA0+1 *
3329 f4a3 9f 52 STX FPA0+2 *
3330 f4a5 9f 47 STX V47 INITIALIZE EXPONENT & EXPONENT SIGN FLAG TO ZERO
3331 f4a7 9f 45 STX V45 INITIALIZE RIGHT DECIMAL CTR & DECIMAL PT FLAG TO 0
3332 f4a9 25 64 BCS LBD86 IF CARRY SET (NUMERIC CHARACTER), ASSUME ACCA CONTAINS FIRST
3333 * NUMERIC CHAR, SIGN IS POSITIVE AND SKIP THE RAM HOOK
3334 f4ab bd fb d8 JSR XVEC19 CALL EXTENDED BASIC ADD-IN
3335 f4ae 81 2d LBD25 CMPA #'- * CHECK FOR A LEADING MINUS SIGN AND BRANCH
3336 f4b0 26 04 BNE LBD2D * IF NO MINUS SIGN
3337 f4b2 03 55 COM COEFCT TOGGLE SIGN; 0 = +; FF = -
3338 f4b4 20 04 BRA LBD31 INTERPRET THE REST OF THE STRING
3339 f4b6 81 2b LBD2D CMPA #'+ * CHECK FOR LEADING PLUS SlGN AND BRANCH
3340 f4b8 26 04 BNE LBD35 * IF NOT A PLUS SIGN
3341 f4ba 9d 7c LBD31 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC
3342 f4bc 25 51 BCS LBD86 BRANCH IF NUMERIC CHARACTER
3343 f4be 81 2e LBD35 CMPA #'. DECIMAL POlNT?
3344 f4c0 27 28 BEQ LBD61 YES
3345 f4c2 81 45 CMPA #'E "E" SHORTHAND FORM (SCIENTIFIC NOTATION)?
3346 f4c4 26 28 BNE LBD65 NO
3347 * EVALUATE EXPONENT OF EXPONENTIAL FORMAT
3348 f4c6 9d 7c JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC
3349 f4c8 25 64 BCS LBDA5 BRANCH IF NUMERIC
3350 f4ca 81 a7 CMPA #TOK_MINUS MINUS TOKEN?
3351 f4cc 27 0e BEQ LBD53 YES
3352 f4ce 81 2d CMPA #'- ASCII MINUS?
3353 f4d0 27 0a BEQ LBD53 YES
3354 f4d2 81 a6 CMPA #TOK_PLUS PLUS TOKEN?
3355 f4d4 27 08 BEQ LBD55 YES
3356 f4d6 81 2b CMPA #'+ ASCII PLUS?
3357 f4d8 27 04 BEQ LBD55 YES
3358 f4da 20 06 BRA LBD59 BRANCH IF NO SIGN FOUND
3359 f4dc 03 48 LBD53 COM V48 SET EXPONENT SIGN FLAG TO NEGATIVE
3360 * STRIP A DECIMAL NUMBER FROM BASIC LINE, CONVERT IT TO BINARY IN V47
3361 f4de 9d 7c LBD55 JSR GETNCH GET NEXT INPUT CHARACTER FROM BASIC
3362 f4e0 25 4c BCS LBDA5 IF NUMERIC CHARACTER, CONVERT TO BINARY
3363 f4e2 0d 48 LBD59 TST V48 * CHECK EXPONENT SIGN FLAG
3364 f4e4 27 08 BEQ LBD65 * AND BRANCH IF POSITIVE
3365 f4e6 00 47 NEG V47 NEGATE VALUE OF EXPONENT
3366 f4e8 20 04 BRA LBD65
3367 f4ea 03 46 LBD61 COM V46 *TOGGLE DECIMAL PT FLAG AND INTERPRET ANOTHER
3368 f4ec 26 cc BNE LBD31 *CHARACTER IF <> 0 - TERMINATE INTERPRETATION
3369 * IF SECOND DECIMAL POINT
3370 * ADJUST FPA0 FOR THE DECIMAL EXPONENT IN V47
3371 f4ee 96 47 LBD65 LDA V47 * GET EXPONENT, SUBTRACT THE NUMBER OF
3372 f4f0 90 45 SUBA V45 * PLACES TO THE RIGHT OF DECIMAL POINT
3373 f4f2 97 47 STA V47 * AND RESAVE IT.
3374 f4f4 27 12 BEQ LBD7F EXIT ROUTINE IF ADJUSTED EXPONENT = ZERO
3375 f4f6 2a 09 BPL LBD78 BRANCH IF POSITIVE EXPONENT
3376 f4f8 bd f3 0b LBD6F JSR LBB82 DIVIDE FPA0 BY 10
3377 f4fb 0c 47 INC V47 INCREMENT EXPONENT COUNTER (MULTIPLY BY 10)
3378 f4fd 26 f9 BNE LBD6F KEEP MULTIPLYING
3379 f4ff 20 07 BRA LBD7F EXIT ROUTINE
3380 f501 bd f2 f3 LBD78 JSR LBB6A MULTIPLY FPA0 BY 10
3381 f504 0a 47 DEC V47 DECREMENT EXPONENT COUNTER (DIVIDE BY 10)
3382 f506 26 f9 BNE LBD78 KEEP MULTIPLYING
3383 f508 96 55 LBD7F LDA COEFCT GET THE SIGN FLAG
3384 f50a 2a 8e BPL LBD11 RETURN IF POSITIVE
3385 f50c 7e f6 72 JMP LBEE9 TOGGLE MANTISSA SIGN OF FPA0, IF NEGATIVE
3386 *MULTIPLY FPA0 BY TEN AND ADD ACCA TO THE RESULT
3387 f50f d6 45 LBD86 LDB V45 *GET THE RIGHT DECIMAL COUNTER AND SUBTRACT
3388 f511 d0 46 SUBB V46 *THE DECIMAL POINT FLAG FROM IT. IF DECIMAL POINT
3389 f513 d7 45 STB V45 *FLAG=0, NOTHING HAPPENS. IF DECIMAL POINT FLAG IS
3390 * -1, THEN RIGHT DECIMAL COUNTER IS INCREMENTED BY ONE
3391 f515 34 02 PSHS A SAVE NEW DIGIT ON STACK
3392 f517 bd f2 f3 JSR LBB6A MULTIPLY FPA0 BY 10
3393 f51a 35 04 PULS B GET NEW DIGIT BACK
3394 f51c c0 30 SUBB #'0 MASK OFF ASCII
3395 f51e 8d 02 BSR LBD99 ADD ACCB TO FPA0
3396 f520 20 98 BRA LBD31 GET ANOTHER CHARACTER FROM BASIC
3397 f522 bd f3 b8 LBD99 JSR LBC2F PACK FPA0 AND SAVE IT IN FPA3
3398 f525 bd f4 05 JSR LBC7C CONVERT ACCB TO FP NUMBER IN FPA0
3399 f528 8e 00 40 LDX #V40 * ADD FPA0 TO
3400 f52b 7e f1 4b JMP LB9C2 * FPA3
3401
3402
3403 f52e d6 47 LBDA5 LDB V47
3404 f530 58 ASLB TIMES 2
3405 f531 58 ASLB TIMES 4
3406 f532 db 47 ADDB V47 ADD 1 = TIMES 5
3407 f534 58 ASLB TIMES 10
3408 f535 80 30 SUBA #'0 *MASK OFF ASCII FROM ACCA, PUSH
3409 f537 34 04 PSHS B *RESULT ONTO THE STACK AND
3410 f539 ab e0 ADDA ,S+ ADD lT TO ACCB
3411 f53b 97 47 STA V47 SAVE IN V47
3412 f53d 20 9f BRA LBD55 INTERPRET ANOTHER CHARACTER
3413 *
3414 f53f 9b 3e bc 1f fd LBDB6 FCB $9B,$3E,$BC,$1F,$FD * 99999999.9
3415 f544 9e 6e 6b 27 fd LBDBB FCB $9E,$6E,$6B,$27,$FD * 999999999
3416 f549 9e 6e 6b 28 00 LBDC0 FCB $9E,$6E,$6B,$28,$00 * 1E + 09
3417 *
3418 f54e 8e e3 e7 LBDC5 LDX #LABE8-1 POINT X TO " IN " MESSAGE
3419 f551 8d 0c BSR LBDD6 COPY A STRING FROM (X) TO CONSOLE OUT
3420 f553 dc 68 LDD CURLIN GET CURRENT BASIC LINE NUMBER TO ACCD
3421 * CONVERT VALUE IN ACCD INTO A DECIMAL NUMBER
3422 * AND PRINT IT TO CONSOLE OUT
3423 f555 dd 50 LBDCC STD FPA0 SAVE ACCD IN TOP HALF OF FPA0
3424 f557 c6 90 LDB #$90 REQ<45>D EXPONENT IF TOP HALF OF ACCD = INTEGER
3425 f559 43 COMA SET CARRY FLAG - FORCE POSITIVE MANTISSA
3426 f55a bd f4 0f JSR LBC86 ZERO BOTTOM HALF AND SIGN OF FPA0, THEN
3427 * SAVE EXPONENT AND NORMALIZE IT
3428 f55d 8d 03 BSR LBDD9 CONVERT FP NUMBER TO ASCII STRING
3429 f55f 7e f1 25 LBDD6 JMP LB99C COPY A STRING FROM (X) TO CONSOLE OUT
3430
3431 * CONVERT FP NUMBER TO ASCII STRING
3432 f562 ce 01 f1 LBDD9 LDU #STRBUF+3 POINT U TO BUFFER WHICH WILL NOT CAUSE
3433 * THE STRING TO BE STORED IN STRING SPACE
3434 f565 86 20 LBDDC LDA #SPACE SPACE = DEFAULT SIGN FOR POSITIVE #
3435 f567 d6 54 LDB FP0SGN GET SIGN OF FPA0
3436 f569 2a 02 BPL LBDE4 BRANCH IF POSITIVE
3437 f56b 86 2d LDA #'- ASCII MINUS SIGN
3438 f56d a7 c0 LBDE4 STA ,U+ STORE SIGN OF NUMBER
3439 f56f df 64 STU COEFPT SAVE BUFFER POINTER
3440 f571 97 54 STA FP0SGN SAVE SIGN (IN ASCII)
3441 f573 86 30 LDA #'0 ASCII ZERO IF EXPONENT = 0
3442 f575 d6 4f LDB FP0EXP GET FPA0 EXPONENT
3443 f577 10 27 00 c6 LBEQ LBEB8 BRANCH IF FPA0 = 0
3444 f57b 4f CLRA BASE 10 EXPONENT=0 FOR FP NUMBER > 1
3445 f57c c1 80 CMPB #$80 CHECK EXPONENT
3446 f57e 22 08 BHI LBDFF BRANCH IF FP NUMBER > 1
3447 * IF FPA0 < 1.0, MULTIPLY IT BY 1E+09 TO SPEED UP THE CONVERSION PROCESS
3448 f580 8e f5 49 LDX #LBDC0 POINT X TO FP 1E+09
3449 f583 bd f2 53 JSR LBACA MULTIPLY FPA0 BY (X)
3450 f586 86 f7 LDA #-9 BASE 10 EXPONENT = -9
3451 f588 97 45 LBDFF STA V45 BASE 10 EXPONENT
3452 * PSEUDO - NORMALIZE THE FP NUMBER TO A VALUE IN THE RANGE
3453 * OF 999,999,999 RO 99,999,999.9 - THIS IS THE LARGEST
3454 * NUMBER RANGE IN WHICH ALL OF THE DIGITS ARE
3455 * SIGNIFICANT WHICH CAN BE DISPLAYED WITHOUT USING
3456 * SCIENTIFIC NOTATION
3457 f58a 8e f5 44 LBE01 LDX #LBDBB POINT X TO FP 999,999,999
3458 f58d bd f4 29 JSR LBCA0 COMPARE FPA0 TO 999,999,999
3459 f590 2e 0f BGT LBE18 BRANCH IF > 999,999,999
3460 f592 8e f5 3f LBE09 LDX #LBDB6 POINT X TO FP 99,999,999.9
3461 f595 bd f4 29 JSR LBCA0 COMPARE FPA0 TO 99,999,999.9
3462 f598 2e 0e BGT LBE1F BRANCH IF > 99,999,999.9 (IN RANGE)
3463 f59a bd f2 f3 JSR LBB6A MULTIPLY FPA0 BY 10
3464 f59d 0a 45 DEC V45 SUBTRACT ONE FROM DECIMAL OFFSET
3465 f59f 20 f1 BRA LBE09 PSEUDO - NORMALIZE SOME MORE
3466 f5a1 bd f3 0b LBE18 JSR LBB82 DIVIDE FPA0 BY 10
3467 f5a4 0c 45 INC V45 ADD ONE TO BASE 10 EXPONENT
3468 f5a6 20 e2 BRA LBE01 PSEUDO - NORMALIZE SOME MORE
3469 f5a8 bd f1 3d LBE1F JSR LB9B4 ADD .5 TO FPA0 (ROUND OFF)
3470 f5ab bd f4 51 JSR LBCC8 CONVERT FPA0 TO AN INTEGER
3471 f5ae c6 01 LDB #1 DEFAULT DECIMAL POINT FLAG (FORCE IMMED DECIMAL PT)
3472 f5b0 96 45 LDA V45 * GET BASE 10 EXPONENT AND ADD TEN TO IT
3473 f5b2 8b 0a ADDA #9+1 * (NUMBER <20>NORMALIZED<45> TO 9 PLACES & DECIMAL PT)
3474 f5b4 2b 09 BMI LBE36 BRANCH IF NUMBER < 1.0
3475 f5b6 81 0b CMPA #9+2 NINE PLACES MAY BE DISPLAYED WITHOUT
3476 * USING SCIENTIFIC NOTATION
3477 f5b8 24 05 BCC LBE36 BRANCH IF SCIENTIFIC NOTATION REQUIRED
3478 f5ba 4a DECA * SUBTRACT 1 FROM MODIFIED BASE 10 EXPONENT CTR
3479 f5bb 1f 89 TFR A,B * AND SAVE IT IN ACCB (DECiMAL POINT FLAG)
3480 f5bd 86 02 LDA #2 FORCE EXPONENT = 0 - DON'T USE SCIENTIFIC NOTATION
3481 f5bf 4a LBE36 DECA * SUBTRACT TWO (WITHOUT AFFECTING CARRY)
3482 f5c0 4a DECA * FROM BASE 10 EXPONENT
3483 f5c1 97 47 STA V47 SAVE EXPONENT - ZERO EXPONENT = DO NOT DISPLAY
3484 * IN SCIENTIFIC NOTATION
3485 f5c3 d7 45 STB V45 DECIMAL POINT FLAG - NUMBER OF PLACES TO
3486 * LEFT OF DECIMAL POINT
3487 f5c5 2e 0d BGT LBE4B BRANCH IF >= 1
3488 f5c7 de 64 LDU COEFPT POINT U TO THE STRING BUFFER
3489 f5c9 86 2e LDA #'. * STORE A PERIOD
3490 f5cb a7 c0 STA ,U+ * IN THE BUFFER
3491 f5cd 5d TSTB CHECK DECIMAL POINT FLAG
3492 f5ce 27 04 BEQ LBE4B BRANCH IF NOTHING TO LEFT OF DECIMAL POINT
3493 f5d0 86 30 LDA #'0 * STORE A ZERO
3494 f5d2 a7 c0 STA ,U+ * IN THE BUFFER
3495
3496 * CONVERT FPA0 INTO A STRING OF ASCII DIGITS
3497 f5d4 8e f6 4e LBE4B LDX #LBEC5 POINT X TO FP POWER OF 10 MANTISSA
3498 f5d7 c6 80 LDB #0+$80 INITIALIZE DIGIT COUNTER TO 0+$80
3499 * BIT 7 SET IS USED TO INDICATE THAT THE POWER OF 10 MANTISSA
3500 * IS NEGATIVE. WHEN YOU 'ADD' A NEGATIVE MANTISSA, IT IS
3501 * THE SAME AS SUBTRACTING A POSITIVE ONE AND BIT 7 OF ACCB IS HOW
3502 * THE ROUTINE KNOWS THAT A 'SUBTRACTION' IS OCCURING.
3503 f5d9 96 53 LBE50 LDA FPA0+3 * ADD MANTISSA LS
3504 f5db ab 03 ADDA 3,X * BYTE OF FPA0
3505 f5dd 97 53 STA FPA0+3 * AND (X)
3506 f5df 96 52 LDA FPA0+2 = ADD MANTISSA
3507 f5e1 a9 02 ADCA 2,X = NUMBER 3 BYTE OF
3508 f5e3 97 52 STA FPA0+2 = FPA0 AND (X)
3509 f5e5 96 51 LDA FPA0+1 * ADD MANTISSA
3510 f5e7 a9 01 ADCA 1,X * NUMBER 2 BYTE OF
3511 f5e9 97 51 STA FPA0+1 * FPA0 AND (X)
3512 f5eb 96 50 LDA FPA0 = ADD MANTISSA
3513 f5ed a9 84 ADCA ,X = MS BYTE OF
3514 f5ef 97 50 STA FPA0 = FPA0 AND (X)
3515 f5f1 5c INCB ADD ONE TO DIGIT COUNTER
3516 f5f2 56 RORB ROTATE CARRY INTO BIT 7
3517 f5f3 59 ROLB *SET OVERFLOW FLAG AND BRANCH IF CARRY = 1 AND
3518 f5f4 28 e3 BVC LBE50 *POSITIVE MANTISSA OR CARRY = 0 AND NEG MANTISSA
3519 f5f6 24 03 BCC LBE72 BRANCH IF NEGATIVE MANTISSA
3520 f5f8 c0 0b SUBB #10+1 * TAKE THE 9<>S COMPLEMENT IF
3521 f5fa 50 NEGB * ADDING MANTISSA
3522 f5fb cb 2f LBE72 ADDB #'0-1 ADD ASCII OFFSET TO DIGIT
3523 f5fd 30 04 LEAX 4,X MOVE TO NEXT POWER OF 10 MANTISSA
3524 f5ff 1f 98 TFR B,A SAVE DIGIT IN ACCA
3525 f601 84 7f ANDA #$7F MASK OFF BIT 7 (ADD/SUBTRACT FLAG)
3526 f603 a7 c0 STA ,U+ STORE DIGIT IN STRING BUFFER
3527 f605 0a 45 DEC V45 DECREMENT DECIMAL POINT FLAG
3528 f607 26 04 BNE LBE84 BRANCH IF NOT TIME FOR DECIMAL POINT
3529 f609 86 2e LDA #'. * STORE DECIMAL POINT IN
3530 f60b a7 c0 STA ,U+ * STRING BUFFER
3531 f60d 53 LBE84 COMB TOGGLE BIT 7 (ADD/SUBTRACT FLAG)
3532 f60e c4 80 ANDB #$80 MASK OFF ALL BUT ADD/SUBTRACT FLAG
3533 f610 8c f6 72 CMPX #LBEC5+36 COMPARE X TO END OF MANTISSA TABLE
3534 f613 26 c4 BNE LBE50 BRANCH IF NOT AT END OF TABLE
3535 * BLANK TRAILING ZEROS AND STORE EXPONENT IF ANY
3536 f615 a6 c2 LBE8C LDA ,-U GET THE LAST CHARACTER; MOVE POINTER BACK
3537 f617 81 30 CMPA #'0 WAS IT A ZERO?
3538 f619 27 fa BEQ LBE8C IGNORE TRAILING ZEROS IF SO
3539 f61b 81 2e CMPA #'. CHECK FOR DECIMAL POINT
3540 f61d 26 02 BNE LBE98 BRANCH IF NOT DECIMAL POINT
3541 f61f 33 5f LEAU -1,U STEP OVER THE DECIMAL POINT
3542 f621 86 2b LBE98 LDA #'+ ASCII PLUS SIGN
3543 f623 d6 47 LDB V47 GET SCIENTIFIC NOTATION EXPONENT
3544 f625 27 1c BEQ LBEBA BRANCH IF NOT SCIENTIFIC NOTATION
3545 f627 2a 03 BPL LBEA3 BRANCH IF POSITIVE EXPONENT
3546 f629 86 2d LDA #'- ASCII MINUS SIGN
3547 f62b 50 NEGB NEGATE EXPONENT IF NEGATIVE
3548 f62c a7 42 LBEA3 STA 2,U STORE EXPONENT SIGN IN STRING
3549 f62e 86 45 LDA #'E * GET ASCII <20>E<EFBFBD> (SCIENTIFIC NOTATION
3550 f630 a7 41 STA 1,U * FLAG) AND SAVE IT IN THE STRING
3551 f632 86 2f LDA #'0-1 INITIALIZE ACCA TO ASCII ZERO
3552
3553
3554 f634 4c LBEAB INCA ADD ONE TO 10<31>S DIGIT OF EXPONENT
3555 f635 c0 0a SUBB #10 SUBTRACT 10 FROM ACCB
3556 f637 24 fb BCC LBEAB ADD 1 TO 10<31>S DIGIT IF NO CARRY
3557 f639 cb 3a ADDB #'9+1 CONVERT UNITS DIGIT TO ASCII
3558 f63b ed 43 STD 3,U SAVE EXPONENT IN STRING
3559 f63d 6f 45 CLR 5,U CLEAR LAST BYTE (TERMINATOR)
3560 f63f 20 04 BRA LBEBC GO RESET POINTER
3561 f641 a7 c4 LBEB8 STA ,U STORE LAST CHARACTER
3562 f643 6f 41 LBEBA CLR 1,U CLEAR LAST BYTE (TERMINATOR - REQUIRED BY
3563 * PRINT SUBROUTINES)
3564 f645 8e 01 f1 LBEBC LDX #STRBUF+3 RESET POINTER TO START OF BUFFER
3565 f648 39 RTS
3566 *
3567 f649 80 00 00 00 00 LBEC0 FCB $80,$00,$00,$00,$00 FLOATING POINT .5
3568 *
3569 *** TABLE OF UNNORMALIZED POWERS OF 10
3570 f64e fa 0a 1f 00 LBEC5 FCB $FA,$0A,$1F,$00 -100000000
3571 f652 00 98 96 80 LBEC9 FCB $00,$98,$96,$80 10000000
3572 f656 ff f0 bd c0 LBECD FCB $FF,$F0,$BD,$C0 -1000000
3573 f65a 00 01 86 a0 LBED1 FCB $00,$01,$86,$A0 100000
3574 f65e ff ff d8 f0 LBED5 FCB $FF,$FF,$D8,$F0 -10000
3575 f662 00 00 03 e8 LBED9 FCB $00,$00,$03,$E8 1000
3576 f666 ff ff ff 9c LBEDD FCB $FF,$FF,$FF,$9C -100
3577 f66a 00 00 00 0a LBEE1 FCB $00,$00,$00,$0A 10
3578 f66e ff ff ff ff LBEE5 FCB $FF,$FF,$FF,$FF -1
3579 *
3580 *
3581 f672 96 4f LBEE9 LDA FP0EXP GET EXPONENT OF FPA0
3582 f674 27 02 BEQ LBEEF BRANCH IF FPA0 = 0
3583 f676 03 54 COM FP0SGN TOGGLE MANTISSA SIGN OF FPA0
3584 f678 39 LBEEF RTS
3585 * EXPAND A POLYNOMIAL OF THE FORM
3586 * AQ+BQ**3+CQ**5+DQ**7.... WHERE Q = FPA0
3587 * AND THE X REGISTER POINTS TO A TABLE OF
3588 * COEFFICIENTS A,B,C,D....
3589 f679 9f 64 LBEF0 STX COEFPT SAVE COEFFICIENT TABLE POINTER
3590 f67b bd f3 b8 JSR LBC2F MOVE FPA0 TO FPA3
3591 f67e 8d 05 BSR LBEFC MULTIPLY FPA3 BY FPA0
3592 f680 8d 08 BSR LBF01 EXPAND POLYNOMIAL
3593 f682 8e 00 40 LDX #V40 POINT X TO FPA3
3594 f685 7e f2 53 LBEFC JMP LBACA MULTIPLY (X) BY FPA0
3595
3596 * CALCULATE THE VALUE OF AN EXPANDED POLYNOMIAL
3597 * EXPRESSION. ENTER WITH (X) POINTING TO A TABLE
3598 * OF COEFFICIENTS, THE FIRST BYTE OF WHICH IS THE
3599 * NUMBER OF (COEFFICIENTS-1) FOLLOWED BY THAT NUMBER
3600 * OF PACKED FLOATING POINT NUMBERS. THE
3601 * POLYNOMIAL IS EVALUATED AS FOLLOWS: VALUE =
3602 * (((FPA0*Y0+Y1)*FPA0+Y2)*FPA0<41>YN)
3603 f688 9f 64 LBEFF STX COEFPT SAVE COEFFICIENT TABLE POINTER
3604 f68a bd f3 b3 LBF01 JSR LBC2A MOVE FPA0 TO FPA4
3605 f68d 9e 64 LDX COEFPT GET THE COEFFICIENT POINTER
3606 f68f e6 80 LDB ,X+ GET THE TOP OF COEFFICIENT TABLE TO
3607 f691 d7 55 STB COEFCT * USE AND STORE IT IN TEMPORARY COUNTER
3608 f693 9f 64 STX COEFPT SAVE NEW COEFFICIENT POINTER
3609 f695 8d ee LBF0C BSR LBEFC MULTIPLY (X) BY FPA0
3610 f697 9e 64 LDX COEFPT *GET COEFFICIENT POINTER
3611 f699 30 05 LEAX 5,X *MOVE TO NEXT FP NUMBER
3612 f69b 9f 64 STX COEFPT *SAVE NEW COEFFICIENT POINTER
3613 f69d bd f1 4b JSR LB9C2 ADD (X) AND FPA0
3614 f6a0 8e 00 45 LDX #V45 POINT (X) TO FPA4
3615 f6a3 0a 55 DEC COEFCT DECREMENT TEMP COUNTER
3616 f6a5 26 ee BNE LBF0C BRANCH IF MORE COEFFICIENTS LEFT
3617 f6a7 39 RTS
3618
3619 * RND
3620 f6a8 bd f3 f6 RND JSR LBC6D TEST FPA0
3621 f6ab 2b 1f BMI LBF45 BRANCH IF FPA0 = NEGATIVE
3622 f6ad 27 15 BEQ LBF3B BRANCH IF FPA0 = 0
3623 f6af 8d 10 BSR LBF38 CONVERT FPA0 TO AN INTEGER
3624 f6b1 bd f3 b8 JSR LBC2F PACK FPA0 TO FPA3
3625 f6b4 8d 0e BSR LBF3B GET A RANDOM NUMBER: FPA0 < 1.0
3626 f6b6 8e 00 40 LDX #V40 POINT (X) TO FPA3
3627 f6b9 8d ca BSR LBEFC MULTIPLY (X) BY FPA0
3628 f6bb 8e f2 4e LDX #LBAC5 POINT (X) TO FP VALUE OF 1.0
3629 f6be bd f1 4b JSR LB9C2 ADD 1.0 TO FPA0
3630 f6c1 7e f4 77 LBF38 JMP INT CONVERT FPA0 TO AN INTEGER
3631 * CALCULATE A RANDOM NUMBER IN THE RANGE 0.0 < X <= 1.0
3632 f6c4 9e b1 LBF3B LDX RVSEED+1 * MOVE VARIABLE
3633 f6c6 9f 50 STX FPA0 * RANDOM NUMBER
3634 f6c8 9e b3 LDX RVSEED+3 * SEED TO
3635 f6ca 9f 52 STX FPA0+2 * FPA0
3636 f6cc be f6 f9 LBF45 LDX RSEED = MOVE FIXED
3637 f6cf 9f 5d STX FPA1 = RANDOM NUMBER
3638 f6d1 be f6 fb LDX RSEED+2 = SEED TO
3639 f6d4 9f 5f STX FPA1+2 = MANTISSA OF FPA0
3640 f6d6 bd f2 59 JSR LBAD0 MULTIPLY FPA0 X FPA1
3641 f6d9 dc 8a LDD VAD GET THE TWO LOWEST ORDER PRODUCT BYTES
3642 f6db c3 65 8b ADDD #$658B ADD A CONSTANT
3643 f6de dd b3 STD RVSEED+3 SAVE NEW LOW ORDER VARIABLE RANDOM # SEED
3644 f6e0 dd 52 STD FPA0+2 SAVE NEW LOW ORDER BYTES OF FPA0 MANTISSA
3645 f6e2 dc 88 LDD VAB GET 2 MORE LOW ORDER PRODUCT BYTES
3646 f6e4 c9 b0 ADCB #$B0 ADD A CONSTANT
3647 f6e6 89 05 ADCA #5 ADD A CONSTANT
3648 f6e8 dd b1 STD RVSEED+1 SAVE NEW HIGH ORDER VARIABLE RANDOM # SEED
3649 f6ea dd 50 STD FPA0 SAVE NEW HIGH ORDER FPA0 MANTISSA
3650 f6ec 0f 54 CLR FP0SGN FORCE FPA0 MANTISSA = POSITIVE
3651 f6ee 86 80 LDA #$80 * SET FPA0 BIASED EXPONENT
3652 f6f0 97 4f STA FP0EXP * TO 0 1 < FPA0 < 0
3653 f6f2 96 15 LDA FPA2+2 GET A BYTE FROM FPA2 (MORE RANDOMNESS)
3654 f6f4 97 63 STA FPSBYT SAVE AS SUB BYTE
3655 f6f6 7e f1 a5 JMP LBA1C NORMALIZE FPA0
3656 *
3657 f6f9 40 e6 RSEED FDB $40E6 *CONSTANT RANDOM NUMBER GENERATOR SEED
3658 f6fb 4d ab FDB $4DAB *
3659
3660 * SIN
3661 * THE SIN FUNCTION REQUIRES AN ARGUMENT IN RADIANS AND WILL REPEAT ITSELF EVERY
3662 * 2*PI RADIANS. THE ARGUMENT IS DIVIDED BY 2*PI AND ONLY THE FRACTIONAL PART IS
3663 * RETAINED. SINCE THE ARGUMENT WAS DIVIDED BY 2*P1, THE COEFFICIENTS MUST BE
3664 * MULTIPLIED BY THE APPROPRIATE POWER OF 2*PI.
3665
3666 * SIN IS EVALUATED USING THE TRIGONOMETRIC IDENTITIES BELOW:
3667 * SIN(X)=SIN(PI-X) & -SIN(PI/2-X)=SIN((3*PI)/2+X)
3668 f6fd bd f3 e8 SIN JSR LBC5F COPY FPA0 TO FPA1
3669 f700 8e f7 42 LDX #LBFBD POINT (X) TO 2*PI
3670 f703 d6 61 LDB FP1SGN *GET MANTISSA SIGN OF FPA1
3671 f705 bd f3 12 JSR LBB89 *AND DIVIDE FPA0 BY 2*PI
3672 f708 bd f3 e8 JSR LBC5F COPY FPA0 TO FPA1
3673 f70b 8d b4 BSR LBF38 CONVERT FPA0 TO AN INTEGER
3674 f70d 0f 62 CLR RESSGN SET RESULT SIGN = POSITIVE
3675 f70f 96 5c LDA FP1EXP *GET EXPONENT OF FPA1
3676 f711 d6 4f LDB FP0EXP *GET EXPONENT OF FPA0
3677 f713 bd f1 45 JSR LB9BC *SUBTRACT FPA0 FROM FPA1
3678 * NOW FPA0 CONTAINS ONLY THE FRACTIONAL PART OF ARGUMENT/2*PI
3679 f716 8e f7 47 LDX #LBFC2 POINT X TO FP (.25)
3680 f719 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM .25 (PI/2)
3681 f71c 96 54 LDA FP0SGN GET MANTISSA SIGN OF FPA0
3682 f71e 34 02 PSHS A SAVE IT ON STACK
3683 f720 2a 09 BPL LBFA6 BRANCH IF MANTISSA POSITIVE
3684 f722 bd f1 3d JSR LB9B4 ADD .5 (PI) TO FPA0
3685 f725 96 54 LDA FP0SGN GET SIGN OF FPA0
3686 f727 2b 05 BMI LBFA9 BRANCH IF NEGATIVE
3687 f729 03 0a COM RELFLG COM IF +(3*PI)/2 >= ARGUMENT >+ PI/2 (QUADRANT FLAG)
3688 f72b bd f6 72 LBFA6 JSR LBEE9 TOGGLE MANTISSA SIGN OF FPA0
3689 f72e 8e f7 47 LBFA9 LDX #LBFC2 POINT X TO FP (.25)
3690 f731 bd f1 4b JSR LB9C2 ADD .25 (PI/2) TO FPA0
3691 f734 35 02 PULS A GET OLD MANTISSA SIGN
3692 f736 4d TSTA * BRANCH IF OLD
3693 f737 2a 03 BPL LBFB7 * SIGN WAS POSITIVE
3694 f739 bd f6 72 JSR LBEE9 TOGGLE MANTISSA SIGN
3695 f73c 8e f7 4c LBFB7 LDX #LBFC7 POINT X TO TABLE OF COEFFICIENTS
3696 f73f 7e f6 79 JMP LBEF0 GO CALCULATE POLYNOMIAL VALUE
3697
3698 f742 83 49 0f da a2 LBFBD FCB $83,$49,$0F,$DA,$A2 6.28318531 (2*PI)
3699 f747 7f 00 00 00 00 LBFC2 FCB $7F,$00,$00,$00,$00 .25
3700
3701
3702 f74c 05 LBFC7 FCB 6-1 SIX COEFFICIENTS
3703 f74d 84 e6 1a 2d 1b LBFC8 FCB $84,$E6,$1A,$2D,$1B * -((2*PI)**11)/11!
3704 f752 86 28 07 fb f8 LBFCD FCB $86,$28,$07,$FB,$F8 * ((2*PI)**9)/9!
3705 f757 87 99 68 89 01 LBFD2 FCB $87,$99,$68,$89,$01 * -((2*PI)**7)/7!
3706 f75c 87 23 35 df e1 LBFD7 FCB $87,$23,$35,$DF,$E1 * ((2*PI)**5)/5!
3707 f761 86 a5 5d e7 28 LBFDC FCB $86,$A5,$5D,$E7,$28 * -((2*PI)**3)/3!
3708 f766 83 49 0f da a2 LBFE1 FCB $83,$49,$0F,$DA,$A2 *
3709
3710 f76b a1 54 46 8f 13 FCB $A1,$54,$46,$8F,$13 UNUSED GARBAGE BYTES
3711 f770 8f 52 43 89 cd FCB $8F,$52,$43,$89,$CD UNUSED GARBAGE BYTES
3712 * EXTENDED BASIC
3713
3714 * COS
3715 * THE VALUE OF COS(X) IS DETERMINED BY THE TRIG IDENTITY COS(X)=SIN((PI/2)+X)
3716 f775 8e f7 a8 COS LDX #L83AB POINT X TO FP CONSTANT (P1/2)
3717 f778 bd f1 4b JSR LB9C2 ADD FPA0 TO (X)
3718 f77b 7e f6 fd L837E JMP SIN JUMP TO SIN ROUTINE
3719
3720 * TAN
3721 * THE VALUE OF TAN(X) IS DETERMINED BY THE TRIG IDENTITY TAN(X)=SIN(X)/COS(X)
3722 f77e bd f3 b8 TAN JSR LBC2F PACK FPA0 AND MOVE IT TO FPA3
3723 f781 0f 0a CLR RELFLG RESET QUADRANT FLAG
3724 f783 8d f6 BSR L837E CALCULATE SIN OF ARGUMENT
3725 f785 8e 00 4a LDX #V4A POINT X TO FPA5
3726 f788 bd f3 be JSR LBC35 PACK FPA0 AND MOVE IT TO FPA5
3727 f78b 8e 00 40 LDX #V40 POINT X TO FPA3
3728 f78e bd f3 9d JSR LBC14 MOVE FPA3 TO FPA0
3729 f791 0f 54 CLR FP0SGN FORCE FPA0 MANTISSA TO BE POSITIVE
3730 f793 96 0a LDA RELFLG GET THE QUADRANT FLAG - COS NEGATIVE IN QUADS 2,3
3731 f795 8d 0c BSR L83A6 CALCULATE VALUE OF COS(FPA0)
3732 f797 0d 4f TST FP0EXP CHECK EXPONENT OF FPA0
3733 f799 10 27 fa 7e LBEQ LBA92 <20>OV<4F> ERROR IF COS(X)=0
3734 f79d 8e 00 4a LDX #V4A POINT X TO FPA5
3735 f7a0 7e f3 18 L83A3 JMP LBB8F DIVIDE (X) BY FPA0 - SIN(X)/COS(X)
3736 f7a3 34 02 L83A6 PSHS A SAVE SIGN FLAG ON STACK
3737 f7a5 7e f7 2b JMP LBFA6 EXPAND POLYNOMIAL
3738
3739 f7a8 81 49 0f da a2 L83AB FCB $81,$49,$0F,$DA,$A2 1.57079633 (PI/2)
3740
3741 * ATN
3742 * A 12 TERM TAYLOR SERIES IS USED TO EVALUATE THE
3743 * ARCTAN EXPRESSION. TWO DIFFERENT FORMULI ARE USED
3744 * TO EVALUATE THE EXPRESSION DEPENDING UPON
3745 * WHETHER OR NOT THE ARGUMENT SQUARED IS > OR < 1.0
3746
3747 * IF X**2<1 THEN ATN=X-(X**3)/3+(X**5)/5-(X**7)/7. . .
3748 * IF X**2>=1 THEN ATN=PI/2-(1/X-1/((X**3)*3)+(1/((X**5)*5)-. . .)
3749
3750 f7ad 96 54 ATN LDA FP0SGN * GET THE SIGN OF THE MANTISSA AND
3751 f7af 34 02 PSHS A * SAVE IT ON THE STACK
3752 f7b1 2a 02 BPL L83B8 BRANCH IF POSITIVE MANTISSA
3753 f7b3 8d 24 BSR L83DC CHANGE SIGN OF FPA0
3754 f7b5 96 4f L83B8 LDA FP0EXP * GET EXPONENT OF FPA0 AND
3755 f7b7 34 02 PSHS A * SAVE IT ON THE STACK
3756 f7b9 81 81 CMPA #$81 IS FPAO < 1.0?
3757 f7bb 25 05 BLO L83C5 YES
3758 f7bd 8e f2 4e LDX #LBAC5 POINT X TO FP CONSTANT 1.0
3759 f7c0 8d de BSR L83A3 GET RECIPROCAL OF FPA0
3760 f7c2 8e f7 dd L83C5 LDX #L83E0 POINT (X) TO TAYLOR SERIES COEFFICIENTS
3761 f7c5 bd f6 79 JSR LBEF0 EXPAND POLYNOMIAL
3762 f7c8 35 02 PULS A GET EXPONENT OF ARGUMENT
3763 f7ca 81 81 CMPA #$81 WAS ARGUMENT < 1.0?
3764 f7cc 25 06 BLO L83D7 YES
3765 f7ce 8e f7 a8 LDX #L83AB POINT (X) TO FP NUMBER (PI/2)
3766 f7d1 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM (PI/2)
3767 f7d4 35 02 L83D7 PULS A * GET SIGN OF INITIAL ARGUMENT MANTISSA
3768 f7d6 4d TSTA * AND SET FLAGS ACCORDING TO IT
3769 f7d7 2a 03 BPL L83DF RETURN IF ARGUMENT WAS POSITIVE
3770 f7d9 7e f6 72 L83DC JMP LBEE9 CHANGE MANTISSA SIGN OF FPA0
3771 f7dc 39 L83DF RTS
3772 *
3773 * TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR ARCTANGENT
3774 f7dd 0b L83E0 FCB $0B TWELVE COEFFICIENTS
3775 f7de 76 b3 83 bd d3 L83E1 FCB $76,$B3,$83,$BD,$D3 -6.84793912E-04 1/23
3776 f7e3 79 1e f4 a6 f5 L83E6 FCB $79,$1E,$F4,$A6,$F5 +4.85094216E-03 1/21
3777 f7e8 7b 83 fc b0 10 L83EB FCB $7B,$83,$FC,$B0,$10 -0.0161117018
3778 f7ed 7c 0c 1f 67 ca L83F0 FCB $7C,$0C,$1F,$67,$CA 0.0342096381
3779 f7f2 7c de 53 cb c1 L83F5 FCB $7C,$DE,$53,$CB,$C1 -0.0542791328
3780 f7f7 7d 14 64 70 4c L83FA FCB $7D,$14,$64,$70,$4C 0.0724571965
3781 f7fc 7d b7 ea 51 7a L83FF FCB $7D,$B7,$EA,$51,$7A -0.0898023954
3782 f801 7d 63 30 88 7e L8404 FCB $7D,$63,$30,$88,$7E 0.110932413
3783 f806 7e 92 44 99 3a L8409 FCB $7E,$92,$44,$99,$3A -0.142839808
3784 f80b 7e 4c cc 91 c7 L840E FCB $7E,$4C,$CC,$91,$C7 0.199999121
3785 f810 7f aa aa aa 13 L8413 FCB $7F,$AA,$AA,$AA,$13 -0.333333316
3786 f815 81 00 00 00 00 L8418 FCB $81,$00,$00,$00,$00 1
3787 *
3788 *** TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR LN(X)
3789 *
3790 f81a 03 L841D FCB 3 FOUR COEFFICIENTS
3791 f81b 7f 5e 56 cb 79 L841E FCB $7F,$5E,$56,$CB,$79 0.434255942
3792 f820 80 13 9b 0b 64 L8423 FCB $80,$13,$9B,$0B,$64 0.576584541
3793 f825 80 76 38 93 16 L8428 FCB $80,$76,$38,$93,$16 0.961800759
3794 f82a 82 38 aa 3b 20 L842D FCB $82,$38,$AA,$3B,$20 2.88539007
3795
3796 f82f 80 35 04 f3 34 L8432 FCB $80,$35,$04,$F3,$34 1/SQR(2)
3797
3798 f834 81 35 04 f3 34 L8437 FCB $81,$35,$04,$F3,$34 SQR(2)
3799
3800 f839 80 80 00 00 00 L843C FCB $80,$80,$00,$00,$00 -0.5
3801
3802 f83e 80 31 72 17 f8 L8441 FCB $80,$31,$72,$17,$F8 LN(2)
3803 *
3804 * LOG - NATURAL LOGARITHM (LN)
3805
3806 * THE NATURAL OR NAPERIAN LOGARITHM IS CALCULATED USING
3807 * MATHEMATICAL IDENTITIES. FPA0 IS OF THE FORM FPA0=A*(2**B) (SCIENTIFIC
3808 * NOTATION). THEREFORE, THE LOG ROUTINE DETERMINES THE VALUE OF
3809 * LN(A*(2**B)). A SERIES OF MATHEMATICAL IDENTITIES WILL EXPAND THIS
3810 * TERM: LN(A*(2**B))=(-1/2+(1/LN(2))*(LN(A*SQR(2)))+B)*LN(2). ALL OF
3811 * THE TERMS OF THE LATTER EXPRESSION ARE CONSTANTS EXCEPT FOR THE
3812 * LN(A*SQR(2)) TERM WHICH IS EVALUATED USING THE TAYLOR SERIES EXPANSION
3813 f843 bd f3 f6 LOG JSR LBC6D CHECK STATUS OF FPA0
3814 f846 10 2f f3 c7 LBLE LB44A <20>FC<46> ERROR IF NEGATIVE OR ZERO
3815 f84a 8e f8 2f LDX #L8432 POINT (X) TO FP NUMBER (1/SQR(2))
3816 f84d 96 4f LDA FP0EXP *GET EXPONENT OF ARGUMENT
3817 f84f 80 80 SUBA #$80 *SUBTRACT OFF THE BIAS AND
3818 f851 34 02 PSHS A *SAVE IT ON THE STACK
3819 f853 86 80 LDA #$80
3820 f855 97 4f STA FP0EXP
3821 f857 bd f1 4b JSR LB9C2 ADD FPA0 TO (X)
3822 f85a 8e f8 34 LDX #L8437 POINT X TO SQR(2)
3823 f85d bd f3 18 JSR LBB8F DIVIDE SQR(2) BY FPA0
3824 f860 8e f2 4e LDX #LBAC5 POINT X TO FP VALUE OF 1.00
3825 f863 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM (X)
3826 * NOW FPA0 = (1-SQR(2)*X)/(1+SQR(2)*X) WHERE X IS ARGUMENT
3827 f866 8e f8 1a LDX #L841D POINT X TO TABLE OF COEFFICIENTS
3828 f869 bd f6 79 JSR LBEF0 EXPAND POLYNOMIAL
3829 f86c 8e f8 39 LDX #L843C POINT X TO FP VALUE OF (-.5)
3830 f86f bd f1 4b JSR LB9C2 ADD FPA0 TO X
3831 f872 35 04 PULS B GET EXPONENT OF ARGUMENT BACK (WITHOUT BIAS)
3832 f874 bd f5 22 JSR LBD99 ADD ACCB TO FPA0
3833 f877 8e f8 3e LDX #L8441 POINT X TO LN(2)
3834 f87a 7e f2 53 JMP LBACA MULTIPLY FPA0 * LN(2)
3835
3836 * SQR
3837 f87d bd f3 e8 SQR JSR LBC5F MOVE FPA0 TO FPA1
3838 f880 8e f6 49 LDX #LBEC0 POINT (X) TO FP NUMBER (.5)
3839 f883 bd f3 9d JSR LBC14 COPY A PACKED NUMBER FROM (X) TO FPA0
3840
3841 * ARITHMETIC OPERATOR FOR EXPONENTIATION JUMPS
3842 * HERE. THE FORMULA USED TO EVALUATE EXPONENTIATION
3843 * IS A**X=E**(X LN A) = E**(FPA0*LN(FPA1)), E=2.7182818
3844 f886 27 67 L8489 BEQ EXP DO A NATURAL EXPONENTIATION IF EXPONENT = 0
3845 f888 4d TSTA *CHECK VALUE BEING EXPONENTIATED
3846 f889 26 03 BNE L8491 *AND BRANCH IF IT IS <> 0
3847 f88b 7e f1 c3 JMP LBA3A FPA0=0 IF RAISING ZERO TO A POWER
3848 f88e 8e 00 4a L8491 LDX #V4A * PACK FPA0 AND SAVE
3849 f891 bd f3 be JSR LBC35 * IT IN FPA5 (ARGUMENT<4E>S EXPONENT)
3850 f894 5f CLRB ACCB=DEFAULT RESULT SIGN FLAG; 0=POSITIVE
3851 f895 96 61 LDA FP1SGN *CHECK THE SIGN OF ARGUMENT
3852 f897 2a 10 BPL L84AC *BRANCH IF POSITIVE
3853 f899 bd f4 77 JSR INT CONVERT EXPONENT INTO AN INTEGER
3854 f89c 8e 00 4a LDX #V4A POINT X TO FPA5 (ORIGINAL EXPONENT)
3855 f89f 96 61 LDA FP1SGN GET MANTISSA SIGN OF FPA1 (ARGUMENT)
3856 f8a1 bd f4 29 JSR LBCA0 *COMPARE FPA0 TO (X) AND
3857 f8a4 26 03 BNE L84AC *BRANCH IF NOT EQUAL
3858 f8a6 43 COMA TOGGLE FPA1 MANTISSA SIGN - FORCE POSITIVE
3859 f8a7 d6 01 LDB CHARAC GET LS BYTE OF INTEGER VALUE OF EXPONENT (RESULT SIGN FLAG)
3860 f8a9 bd f3 d5 L84AC JSR LBC4C COPY FPA1 TO FPA0; ACCA = MANTISSA SIGN
3861 f8ac 34 04 PSHS B PUT RESULT SIGN FLAG ON THE STACK
3862 f8ae bd f8 43 JSR LOG
3863 f8b1 8e 00 4a LDX #V4A POINT (X) TO FPA5
3864 f8b4 bd f2 53 JSR LBACA MULTIPLY FPA0 BY FPA5
3865 f8b7 8d 36 BSR EXP CALCULATE E**(FPA0)
3866 f8b9 35 02 PULS A * GET RESULT SIGN FLAG FROM THE STACK
3867 f8bb 46 RORA * AND BRANCH IF NEGATIVE
3868 f8bc 10 25 fd b2 LBCS LBEE9 CHANGE SIGN OF FPA0 MANTISSA
3869 f8c0 39 RTS
3870
3871 * CORRECTION FACTOR FOR EXPONENTIAL FUNCTION
3872 f8c1 81 38 aa 3b 29 L84C4 FCB $81,$38,$AA,$3B,$29 1.44269504 ( CF )
3873 *
3874 * TCHEBYSHEV MODIFIED TAYLOR SERIES COEFFICIENTS FOR E**X
3875 *
3876 f8c6 07 L84C9 FCB 7 EIGHT COEFFICIENTS
3877 f8c7 71 34 58 3e 56 L84CA FCB $71,$34,$58,$3E,$56 2.14987637E-05: 1/(7!*(CF**7))
3878 f8cc 74 16 7e b3 1b L84CF FCB $74,$16,$7E,$B3,$1B 1.4352314E-04 : 1/(6!*(CF**6))
3879 f8d1 77 2f ee e3 85 L84D4 FCB $77,$2F,$EE,$E3,$85 1.34226348E-03: 1/(5!*(CF**5))
3880 f8d6 7a 1d 84 1c 2a L84D9 FCB $7A,$1D,$84,$1C,$2A 9.61401701E-03: 1/(4!*(CF**4))
3881 f8db 7c 63 59 58 0a L84DE FCB $7C,$63,$59,$58,$0A 0.0555051269
3882 f8e0 7e 75 fd e7 c6 L84E3 FCB $7E,$75,$FD,$E7,$C6 0.240226385
3883 f8e5 80 31 72 18 10 L84E8 FCB $80,$31,$72,$18,$10 0.693147186
3884 f8ea 81 00 00 00 00 L84ED FCB $81,$00,$00,$00,$00 1
3885 *
3886 * EXP ( E**X)
3887 * THE EXPONENTIAL FUNCTION IS EVALUATED BY FIRST MULTIPLYING THE
3888 * ARGUMENT BY A CORRECTION FACTOR (CF). AFTER THIS IS DONE, AN
3889 * ARGUMENT >= 127 WILL YIELD A ZERO RESULT (NO UNDERFLOW) FOR A
3890 * NEGATIVE ARGUMENT OR AN 'OV' (OVERFLOW) ERROR FOR A POSITIVE
3891 * ARGUMENT. THE POLYNOMIAL COEFFICIENTS ARE MODIFIED TO REFLECT
3892 * THE CF MULTIPLICATION AT THE START OF THE EVALUATION PROCESS.
3893
3894 f8ef 8e f8 c1 EXP LDX #L84C4 POINT X TO THE CORRECTION FACTOR
3895 f8f2 bd f2 53 JSR LBACA MULTIPLY FPA0 BY (X)
3896 f8f5 bd f3 b8 JSR LBC2F PACK FPA0 AND STORE IT IN FPA3
3897 f8f8 96 4f LDA FP0EXP *GET EXPONENT OF FPA0 AND
3898 f8fa 81 88 CMPA #$88 *COMPARE TO THE MAXIMUM VALUE
3899 f8fc 25 03 BLO L8504 BRANCH IF FPA0 < 128
3900 f8fe 7e f2 e5 L8501 JMP LBB5C SET FPA0 = 0 OR <20>OV<4F> ERROR
3901 f901 bd f4 77 L8504 JSR INT CONVERT FPA0 TO INTEGER
3902 f904 96 01 LDA CHARAC GET LS BYTE OF INTEGER
3903 f906 8b 81 ADDA #$81 * WAS THE ARGUMENT =127, IF SO
3904 f908 27 f4 BEQ L8501 * THEN <20>OV<4F> ERROR; THIS WILL ALSO ADD THE $80 BIAS
3905 * * REQUIRED WHEN THE NEW EXPONENT IS CALCULATED BELOW
3906 f90a 4a DECA DECREMENT ONE FROM THE EXPONENT, BECAUSE $81, NOT $80 WAS USED ABOVE
3907 f90b 34 02 PSHS A SAVE EXPONENT OF INTEGER PORTION ON STACK
3908 f90d 8e 00 40 LDX #V40 POINT (X) TO FPA3
3909 f910 bd f1 42 JSR LB9B9 SUBTRACT FPA0 FROM (X) - GET FRACTIONAL PART OF ARGUMENT
3910 f913 8e f8 c6 LDX #L84C9 POINT X TO COEFFICIENTS
3911 f916 bd f6 88 JSR LBEFF EVALUATE POLYNOMIAL FOR FRACTIONAL PART
3912 f919 0f 62 CLR RESSGN FORCE THE MANTISSA TO BE POSITIVE
3913 f91b 35 02 PULS A GET INTEGER EXPONENT FROM STACK
3914 f91d bd f2 d1 JSR LBB48 * CALCULATE EXPONENT OF NEW FPA0 BY ADDING THE EXPONENTS OF THE
3915 * * INTEGER AND FRACTIONAL PARTS
3916 f920 39 RTS
3917
3918 * FIX
3919 f921 bd f3 f6 FIX JSR LBC6D CHECK STATUS OF FPA0
3920 f924 2b 03 BMI L852C BRANCH IF FPA0 = NEGATIVE
3921 f926 7e f4 77 L8529 JMP INT CONVERT FPA0 TO INTEGER
3922 f929 03 54 L852C COM FP0SGN TOGGLE SIGN OF FPA0 MANTISSA
3923 f92b 8d f9 BSR L8529 CONVERT FPA0 TO INTEGER
3924 f92d 7e f6 72 JMP LBEE9 TOGGLE SIGN OF FPA0
3925
3926 * EDIT
3927 f930 bd fd 5e EDIT JSR L89AE GET LINE NUMBER FROM BASIC
3928 f933 32 62 LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK
3929 f935 86 01 L8538 LDA #$01 <20>LIST<53> FLAG
3930 f937 97 98 STA VD8 SET FLAG TO LIST LINE
3931 f939 bd e4 e5 JSR LAD01 GO FIND THE LINE NUMBER IN PROGRAM
3932 f93c 10 25 ed 82 LBCS LAED2 ERROR #7 <20>UNDEFINED LINE #'
3933 f940 bd ef 7e JSR LB7C2 GO UNCRUNCH LINE INTO BUFFER AT LINBUF+1
3934 f943 1f 20 TFR Y,D PUT ABSOLUTE ADDRESS OF END OF LINE TO ACCD
3935 f945 83 00 f5 SUBD #LINBUF+2 SUBTRACT OUT THE START OF LINE
3936 f948 d7 97 STB VD7 SAVE LENGTH OF LINE
3937 f94a dc 2b L854D LDD BINVAL GET THE HEX VALUE OF LINE NUMBER
3938 f94c bd f5 55 JSR LBDCC LIST THE LINE NUMBER ON THE SCREEN
3939 f94f bd f1 35 JSR LB9AC PRINT A SPACE
3940 f952 8e 00 f4 LDX #LINBUF+1 POINT X TO BUFFER
3941 f955 d6 98 LDB VD8 * CHECK TO SEE IF LINE IS TO BE
3942 f957 26 25 BNE L8581 * LISTED TO SCREEN - BRANCH IF IT IS
3943 f959 5f L855C CLRB RESET DIGIT ACCUMULATOR - DEFAULT VALUE
3944 f95a bd fa 84 L855D JSR L8687 GET KEY STROKE
3945 f95d bd ff b6 JSR L90AA SET CARRY IF NOT NUMERIC
3946 f960 25 0b BLO L8570 BRANCH IF NOT NUMERIC
3947 f962 80 30 SUBA #'0' MASK OFF ASCII
3948 f964 34 02 PSHS A SAVE IT ON STACK
3949 f966 86 0a LDA #10 NUMBER BEING CONVERTED IS BASE 10
3950 f968 3d MUL MULTIPLY ACCUMULATED VALUE BY BASE (10)
3951 f969 eb e0 ADDB ,S+ ADD DIGIT TO ACCUMULATED VALUE
3952 f96b 20 ed BRA L855D CHECK FOR ANOTHER DIGIT
3953 f96d c0 01 L8570 SUBB #$01 * REPEAT PARAMETER IN ACCB; IF IT
3954 f96f c9 01 ADCB #$01 *IS 0, THEN MAKE IT <20>1<EFBFBD>
3955 f971 81 41 CMPA #'A' ABORT?
3956 f973 26 05 BNE L857D NO
3957 f975 bd f0 e5 JSR LB958 PRINT CARRIAGE RETURN TO SCREEN
3958 f978 20 bb BRA L8538 RESTART EDIT PROCESS - CANCEL ALL CHANGES
3959 f97a 81 4c L857D CMPA #'L' LIST?
3960 f97c 26 0b BNE L858C NO
3961 f97e 8d 31 L8581 BSR L85B4 LIST THE LINE
3962 f980 0f 98 CLR VD8 RESET THE LIST FLAG TO <20>NO LIST<53>
3963 f982 bd f0 e5 JSR LB958 PRINT CARRIAGE RETURN
3964 f985 20 c3 BRA L854D GO INTERPRET ANOTHER EDIT COMMAND
3965 f987 32 62 L858A LEAS $02,S PURGE RETURN ADDRESS OFF OF THE STACK
3966 f989 81 0d L858C CMPA #CR ENTER KEY?
3967 f98b 26 0d BNE L859D NO
3968 f98d 8d 22 BSR L85B4 ECHO THE LINE TO THE SCREEN
3969 f98f bd f0 e5 L8592 JSR LB958 PRINT CARRIAGE RETURN
3970 f992 8e 00 f4 LDX #LINBUF+1 * RESET BASIC<49>S INPUT POINTER
3971 f995 9f 83 STX CHARAD * TO THE LINE INPUT BUFFER
3972 f997 7e e4 8e JMP LACA8 GO PUT LINE BACK IN PROGRAM
3973 f99a 81 45 L859D CMPA #'E' EXIT?
3974 f99c 27 f1 BEQ L8592 YES - SAME AS ENTER EXCEPT NO ECHO
3975 f99e 81 51 CMPA #'Q' QUIT?
3976 f9a0 26 06 BNE L85AB NO
3977 f9a2 bd f0 e5 JSR LB958 PRINT CARRIAGE RETURN TO SCREEN
3978 f9a5 7e e4 65 JMP LAC73 GO TO COMMAND LEVEL - MAKE NO CHANGES
3979 f9a8 8d 02 L85AB BSR L85AF INTERPRET THE REMAINING COMMANDS AS SUBROUTINES
3980 f9aa 20 ad BRA L855C GO INTERPRET ANOTHER EDIT COMMAND
3981 f9ac 81 20 L85AF CMPA #SPACE SPACE BAR?
3982 f9ae 26 10 BNE L85C3 NO
3983 f9b0 8c L85B3 FCB SKP2 SKIP TWO BYTES
3984 * DISPLAY THE NEXT ACCB BYTES OF THE LINE IN THE BUFFER TO THE SCREEN
3985 *
3986 f9b1 c6 f9 L85B4 LDB #LBUFMX-1 250 BYTES MAX IN BUFFER
3987 f9b3 a6 84 L85B6 LDA ,X GET A CHARACTER FROM BUFFER
3988 f9b5 27 08 BEQ L85C2 EXIT IF IT<49>S A 0
3989 f9b7 bd e0 14 JSR PUTCHR SEND CHAR TO CONSOLE OUT
3990 f9ba 30 01 LEAX $01,X MOVE POINTER UP ONE
3991 f9bc 5a DECB DECREMENT CHARACTER COUNTER
3992 f9bd 26 f4 BNE L85B6 LOOP IF NOT DONE
3993 f9bf 39 L85C2 RTS
3994 f9c0 81 44 L85C3 CMPA #'D' DELETE?
3995 f9c2 26 48 BNE L860F NO
3996 f9c4 6d 84 L85C7 TST ,X * CHECK FOR END OF LINE
3997 f9c6 27 f7 BEQ L85C2 * AND BRANCH IF SO
3998 f9c8 8d 04 BSR L85D1 REMOVE A CHARACTER
3999 f9ca 5a DECB DECREMENT REPEAT PARAMETER
4000 f9cb 26 f7 BNE L85C7 BRANCH IF NOT DONE
4001 f9cd 39 RTS
4002 * REMOVE ONE CHARACTER FROM BUFFER
4003 f9ce 0a 97 L85D1 DEC VD7 DECREMENT LENGTH OF BUFFER
4004 f9d0 31 1f LEAY $-01,X POINT Y TO ONE BEFORE CURRENT BUFFER POINTER
4005 f9d2 31 21 L85D5 LEAY $01,Y INCREMENT TEMPORARY BUFFER POINTER
4006 f9d4 a6 21 LDA $01,Y GET NEXT CHARACTER
4007 f9d6 a7 a4 STA ,Y PUT IT IN CURRENT POSITION
4008 f9d8 26 f8 BNE L85D5 BRANCH IF NOT END OF LINE
4009 f9da 39 RTS
4010 f9db 81 49 L85DE CMPA #'I' INSERT?
4011 f9dd 27 13 BEQ L85F5 YES
4012 f9df 81 58 CMPA #'X' EXTEND?
4013 f9e1 27 0d BEQ L85F3 YES
4014 f9e3 81 48 CMPA #'H' HACK?
4015 f9e5 26 5c BNE L8646 NO
4016 f9e7 6f 84 CLR ,X TURN CURRENT BUFFER POINTER INTO END OF LINE FLAG
4017 f9e9 1f 10 TFR X,D PUT CURRENT BUFFER POINTER IN ACCD
4018 f9eb 83 00 f5 SUBD #LINBUF+2 SUBTRACT INITIAL POINTER POSITION
4019 f9ee d7 97 STB VD7 SAVE NEW BUFFER LENGTH
4020 f9f0 8d bf L85F3 BSR L85B4 DISPLAY THE LINE ON THE SCREEN
4021 f9f2 bd fa 84 L85F5 JSR L8687 GET A KEYSTROKE
4022 f9f5 81 0d CMPA #CR ENTER KEY?
4023 f9f7 27 8e BEQ L858A YES - INTERPRET ANOTHER COMMAND - PRINT LINE
4024 f9f9 81 1b CMPA #ESC ESCAPE?
4025 f9fb 27 25 BEQ L8625 YES - RETURN TO COMMAND LEVEL - DON<4F>T PRINT LINE
4026 f9fd 81 08 CMPA #BS BACK SPACE?
4027 f9ff 26 22 BNE L8626 NO
4028 fa01 8c 00 f4 CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER
4029 fa04 27 ec BEQ L85F5 DO NOT ALLOW BS IF AT START
4030 fa06 8d 45 BSR L8650 MOVE POINTER BACK ONE, BS TO SCREEN
4031 fa08 8d c4 BSR L85D1 REMOVE ONE CHARACTER FROM BUFFER
4032 fa0a 20 e6 BRA L85F5 GET INSERT SUB COMMAND
4033 fa0c 81 43 L860F CMPA #'C' CHANGE?
4034 fa0e 26 cb BNE L85DE NO
4035 fa10 6d 84 L8613 TST ,X CHECK CURRENT BUFFER CHARACTER
4036 fa12 27 0e BEQ L8625 BRANCH IF END OF LINE
4037 fa14 bd fa 84 JSR L8687 GET A KEYSTROKE
4038 fa17 25 02 BLO L861E BRANCH IF LEGITIMATE KEY
4039 fa19 20 f5 BRA L8613 TRY AGAIN IF ILLEGAL KEY
4040 fa1b a7 80 L861E STA ,X+ INSERT NEW CHARACTER INTO BUFFER
4041 fa1d 8d 37 BSR L8659 SEND NEW CHARACTER TO SCREEN
4042 fa1f 5a DECB DECREMENT REPEAT PARAMETER
4043 fa20 26 ee BNE L8613 BRANCH IF NOT DONE
4044 fa22 39 L8625 RTS
4045 fa23 d6 97 L8626 LDB VD7 GET LENGTH OF LINE
4046 fa25 c1 f9 CMPB #LBUFMX-1 COMPARE TO MAXIMUM LENGTH
4047 fa27 26 02 BNE L862E BRANCH IF NOT AT MAXIMUM
4048 fa29 20 c7 BRA L85F5 IGNORE INPUT IF LINE AT MAXIMUM LENGTH
4049 fa2b 34 10 L862E PSHS X SAVE CURRENT BUFFER POINTER
4050 fa2d 6d 80 L8630 TST ,X+ * SCAN THE LINE UNTIL END OF
4051 fa2f 26 fc BNE L8630 * LINE (0) IS FOUND
4052 fa31 e6 82 L8634 LDB ,-X DECR TEMP LINE POINTER AND GET A CHARACTER
4053 fa33 e7 01 STB $01,X PUT CHARACTER BACK DOWN ONE SPOT
4054 fa35 ac e4 CMPX ,S HAVE WE REACHED STARTING POINT?
4055 fa37 26 f8 BNE L8634 NO - KEEP GOING
4056 fa39 32 62 LEAS $02,S PURGE BUFFER POINTER FROM STACK
4057 fa3b a7 80 STA ,X+ INSERT NEW CHARACTER INTO THE LINE
4058 fa3d 8d 17 BSR L8659 SEND A CHARACTER TO CONSOLE OUT
4059 fa3f 0c 97 INC VD7 ADD ONE TO BUFFER LENGTH
4060 fa41 20 af BRA L85F5 GET INSERT SUB COMMAND
4061 fa43 81 08 L8646 CMPA #BS BACKSPACE?
4062 fa45 26 12 BNE L865C NO
4063 fa47 8d 04 L864A BSR L8650 MOVE POINTER BACK 1, SEND BS TO SCREEN
4064 fa49 5a DECB DECREMENT REPEAT PARAMETER
4065 fa4a 26 fb BNE L864A LOOP UNTIL DONE
4066 fa4c 39 RTS
4067 fa4d 8c 00 f4 L8650 CMPX #LINBUF+1 COMPARE POINTER TO START OF BUFFER
4068 fa50 27 d0 BEQ L8625 DO NOT ALLOW BS IF AT START
4069 fa52 30 1f LEAX $-01,X MOVE POINTER BACK ONE
4070 fa54 86 08 LDA #BS BACK SPACE
4071 fa56 7e e0 14 L8659 JMP PUTCHR SEND TO CONSOLE OUT
4072 fa59 81 4b L865C CMPA #'K' KILL?
4073 fa5b 27 05 BEQ L8665 YES
4074 fa5d 80 53 SUBA #'S' SEARCH?
4075 fa5f 27 01 BEQ L8665 YES
4076 fa61 39 RTS
4077 fa62 34 02 L8665 PSHS A SAVE KILL/SEARCH FLAG ON STACK
4078 fa64 8d 1e BSR L8687 * GET A KEYSTROKE (TARGET CHARACTER)
4079 fa66 34 02 PSHS A * AND SAVE IT ON STACK
4080 fa68 a6 84 L866B LDA ,X GET CURRENT BUFFER CHARACTER
4081 fa6a 27 16 BEQ L8685 AND RETURN IF END OF LINE
4082 fa6c 6d 61 TST $01,S CHECK KILL/SEARCH FLAG
4083 fa6e 26 06 BNE L8679 BRANCH IF KILL
4084 fa70 8d e4 BSR L8659 SEND A CHARACTER TO CONSOLE OUT
4085 fa72 30 01 LEAX $01,X INCREMENT BUFFER POINTER
4086 fa74 20 03 BRA L867C CHECK NEXT INPUT CHARACTER
4087 fa76 bd f9 ce L8679 JSR L85D1 REMOVE ONE CHARACTER FROM BUFFER
4088 fa79 a6 84 L867C LDA ,X GET CURRENT INPUT CHARACTER
4089 fa7b a1 e4 CMPA ,S COMPARE TO TARGET CHARACTER
4090 fa7d 26 e9 BNE L866B BRANCH IF NO MATCH
4091 fa7f 5a DECB DECREMENT REPEAT PARAMETER
4092 fa80 26 e6 BNE L866B BRANCH IF NOT DONE
4093 fa82 35 a0 L8685 PULS Y,PC THE Y PULL WILL CLEAN UP THE STACK FOR THE 2 PSHS A
4094 *
4095 * GET A KEYSTRKE
4096 fa84 bd e0 00 L8687 JSR LA171 CALL CONSOLE IN : DEV NBR=SCREEN
4097 fa87 81 7f CMPA #$7F GRAPHIC CHARACTER?
4098 fa89 24 f9 BCC L8687 YES - GET ANOTHER CHAR
4099 fa8b 81 5f CMPA #$5F SHIFT UP ARROW (QUIT INSERT)
4100 fa8d 26 02 BNE L8694 NO
4101 fa8f 86 1b LDA #ESC REPLACE W/ESCAPE CODE
4102 fa91 81 0d L8694 CMPA #CR ENTER KEY
4103 fa93 27 0e BEQ L86A6 YES
4104 fa95 81 1b CMPA #ESC ESCAPE?
4105 fa97 27 0a BEQ L86A6 YES
4106 fa99 81 08 CMPA #BS BACKSPACE?
4107 fa9b 27 06 BEQ L86A6 YES
4108 fa9d 81 20 CMPA #SPACE SPACE
4109 fa9f 25 e3 BLO L8687 GET ANOTHER CHAR IF CONTROL CHAR
4110 faa1 1a 01 ORCC #$01 SET CARRY
4111 faa3 39 L86A6 RTS
4112
4113 * TRON
4114 faa4 86 TRON FCB SKP1LD SKIP ONE BYTE AND LDA #$4F
4115
4116 * TROFF
4117 faa5 4f TROFF CLRA TROFF FLAG
4118 faa6 97 8c STA TRCFLG TRON/TROFF FLAG:0=TROFF, <> 0=TRON
4119 faa8 39 RTS
4120
4121 * POS
4122
4123 faa9 86 00 POS LDA #0 GET DEVICE NUMBER
4124 faab d6 79 LDB LPTPOS GET PRINT POSITION
4125 faad 1d LA5E8 SEX CONVERT ACCB TO 2 DIGIT SIGNED INTEGER
4126 faae 7e ec bb JMP GIVABF CONVERT ACCD TO FLOATING POINT
4127
4128
4129 * VARPTR
4130 fab1 bd ea 36 VARPT JSR LB26A SYNTAX CHECK FOR <20>(<28>
4131 fab4 dc 1f LDD ARYEND GET ADDR OF END OF ARRAYS
4132 fab6 34 06 PSHS B,A SAVE IT ON STACK
4133 fab8 bd eb 1e JSR LB357 GET VARIABLE DESCRIPTOR
4134 fabb bd ea 33 JSR LB267 SYNTAX CHECK FOR <20>)<29>
4135 fabe 35 06 PULS A,B GET END OF ARRAYS ADDR BACK
4136 fac0 1e 10 EXG X,D SWAP END OF ARRAYS AND VARIABLE DESCRIPTOR
4137 fac2 9c 1f CMPX ARYEND COMPARE TO NEW END OF ARRAYS
4138 fac4 26 51 BNE L8724 <20>FC<46> ERROR IF VARIABLE WAS NOT DEFINED PRIOR TO CALLING VARPTR
4139 fac6 7e ec bb JMP GIVABF CONVERT VARIABLE DESCRIPTOR INTO A FP NUMBER
4140
4141 * MID$(OLDSTRING,POSITION,LENGTH)=REPLACEMENT
4142 fac9 9d 7c L86D6 JSR GETNCH GET INPUT CHAR FROM BASIC
4143 facb bd ea 36 JSR LB26A SYNTAX CHECK FOR <20>(<28>
4144 face bd eb 1e JSR LB357 * GET VARIABLE DESCRIPTOR ADDRESS AND
4145 fad1 34 10 PSHS X * SAVE IT ON THE STACK
4146 fad3 ec 02 LDD $02,X POINT ACCD TO START OF OLDSTRING
4147 fad5 10 93 21 CMPD FRETOP COMPARE TO START OF CLEARED SPACE
4148 fad8 23 04 BLS L86EB BRANCH IF <=
4149 fada 93 27 SUBD MEMSIZ SUBTRACT OUT TOP OF CLEARED SPACE
4150 fadc 23 12 BLS L86FD BRANCH IF STRING IN STRING SPACE
4151 fade e6 84 L86EB LDB ,X GET LENGTH OF OLDSTRING
4152 fae0 bd ed 34 JSR LB56D RESERVE ACCB BYTES IN STRING SPACE
4153 fae3 34 10 PSHS X SAVE RESERVED SPACE STRING ADDRESS ON STACK
4154 fae5 ae 62 LDX $02,S POINT X TO OLDSTRING DESCRIPTOR
4155 fae7 bd ee 0a JSR LB643 MOVE OLDSTRING INTO STRING SPACE
4156 faea 35 50 PULS X,U * GET OLDSTRING DESCRIPTOR ADDRESS AND RESERVED STRING
4157 faec af 42 STX $02,U * ADDRESS AND SAVE RESERVED ADDRESS AS OLDSTRING ADDRESS
4158 faee 34 40 PSHS U SAVE OLDSTRING DESCRIPTOR ADDRESS
4159 faf0 bd ee ff L86FD JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION
4160 faf3 34 04 PSHS B SAVE POSITION PARAMETER ON STACK
4161 faf5 5d TSTB * CHECK POSITION PARAMETER AND BRANCH
4162 faf6 27 1f BEQ L8724 * IF START OF STRING
4163 faf8 c6 ff LDB #$FF DEFAULT REPLACEMENT LENGTH = $FF
4164 fafa 81 29 CMPA #')' * CHECK FOR END OF MID$ STATEMENT AND
4165 fafc 27 03 BEQ L870E * BRANCH IF AT END OF STATEMENT
4166 fafe bd ee ff JSR LB738 SYNTAX CHECK FOR COMMA AND EVALUATE LENGTH EXPRESSION
4167 fb01 34 04 L870E PSHS B SAVE LENGTH PARAMETER ON STACK
4168 fb03 bd ea 33 JSR LB267 SYNTAX CHECK FOR <20>)<29>
4169 fb06 c6 ae LDB #TOK_EQUALS TOKEN FOR =
4170 fb08 bd ea 3b JSR LB26F SYNTAX CHECK FOR <20>=<3D>
4171 fb0b 8d 2e BSR L8748 EVALUATE REPLACEMENT STRING
4172 fb0d 1f 13 TFR X,U SAVE REPLACEMENT STRING ADDRESS IN U
4173 fb0f ae 62 LDX $02,S POINT X TO OLOSTRING DESCRIPTOR ADDRESS
4174 fb11 a6 84 LDA ,X GET LENGTH OF OLDSTRING
4175 fb13 a0 61 SUBA $01,S SUBTRACT POSITION PARAMETER
4176 fb15 24 03 BCC L8727 INSERT REPLACEMENT STRING INTO OLDSTRING
4177 fb17 7e ec 11 L8724 JMP LB44A <20>FC<46> ERROR IF POSITION > LENGTH OF OLDSTRING
4178 fb1a 4c L8727 INCA * NOW ACCA = NUMBER OF CHARACTERS TO THE RIGHT
4179 * * (INCLUSIVE) OF THE POSITION PARAMETER
4180 fb1b a1 e4 CMPA ,S
4181 fb1d 24 02 BCC L872E BRANCH IF NEW STRING WILL FIT IN OLDSTRING
4182 fb1f a7 e4 STA ,S IF NOT, USE AS MUCH OF LENGTH PARAMETER AS WILL FIT
4183 fb21 a6 61 L872E LDA $01,S GET POSITION PARAMETER
4184 fb23 1e 89 EXG A,B ACCA=LENGTH OF REPL STRING, ACCB=POSITION PARAMETER
4185 fb25 ae 02 LDX $02,X POINT X TO OLDSTRING ADDRESS
4186 fb27 5a DECB * BASIC<49>S POSITION PARAMETER STARTS AT 1; THIS ROUTINE
4187 * * WANTS IT TO START AT ZERO
4188 fb28 3a ABX POINT X TO POSITION IN OLDSTRING WHERE THE REPLACEMENT WILL GO
4189 fb29 4d TSTA * IF THE LENGTH OF THE REPLACEMENT STRING IS ZERO
4190 fb2a 27 0d BEQ L8746 * THEN RETURN
4191 fb2c a1 e4 CMPA ,S
4192 fb2e 23 02 BLS L873F ADJUSTED LENGTH PARAMETER, THEN BRANCH
4193 fb30 a6 e4 LDA ,S OTHERWISE USE AS MUCH ROOM AS IS AVAILABLE
4194 fb32 1f 89 L873F TFR A,B SAVE NUMBER OF BYTES TO MOVE IN ACCB
4195 fb34 1e 31 EXG U,X SWAP SOURCE AND DESTINATION POINTERS
4196 fb36 bd e1 f1 JSR LA59A MOVE (B) BYTES FROM (X) TO (U)
4197 fb39 35 96 L8746 PULS A,B,X,PC
4198 fb3b bd e9 22 L8748 JSR LB156 EVALUATE EXPRESSION
4199 fb3e 7e ee 1b JMP LB654 *<2A>TM<54> ERROR IF NUMERIC; RETURN WITH X POINTING
4200 * *TO STRING, ACCB = LENGTH
4201
4202 * STRING
4203 fb41 bd ea 36 STRING JSR LB26A SYNTAX CHECK FOR <20>(<28>
4204 fb44 bd ee d2 JSR LB70B EVALUATE EXPRESSION; ERROR IF > 255
4205 fb47 34 04 PSHS B SAVE LENGTH OF STRING
4206 fb49 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
4207 fb4c bd e9 22 JSR LB156 EVALUATE EXPRESSION
4208 fb4f bd ea 33 JSR LB267 SYNTAX CHECK FOR <20>)<29>
4209 fb52 96 06 LDA VALTYP GET VARIABLE TYPE
4210 fb54 26 05 BNE L8768 BRANCH IF STRING
4211 fb56 bd ee d5 JSR LB70E CONVERT FPA0 INTO AN INTEGER IN ACCB
4212 fb59 20 03 BRA L876B SAVE THE STRING IN STRING SPACE
4213 fb5b bd ee 6b L8768 JSR LB6A4 GET FIRST BYTE OF STRING
4214 fb5e 34 04 L876B PSHS B SAVE FIRST BYTE OF EXPRESSION
4215 fb60 e6 61 LDB $01,S GET LENGTH OF STRING
4216 fb62 bd ec d6 JSR LB50F RESERVE ACCB BYTES IN STRING SPACE
4217 fb65 35 06 PULS A,B GET LENGTH OF STRING AND CHARACTER
4218 fb67 27 05 BEQ L877B BRANCH IF NULL STRING
4219 fb69 a7 80 L8776 STA ,X+ SAVE A CHARACTER IN STRING SPACE
4220 fb6b 5a DECB DECREMENT LENGTH
4221 fb6c 26 fb BNE L8776 BRANCH IF NOT DONE
4222 fb6e 7e ee 62 L877B JMP LB69B PUT STRING DESCRIPTOR ONTO STRING STACK
4223
4224 * INSTR
4225 fb71 bd ea 36 INSTR JSR LB26A SYNTAX CHECK FOR <20>(<28>
4226 fb74 bd e9 22 JSR LB156 EVALUATE EXPRESSION
4227 fb77 c6 01 LDB #$01 DEFAULT POSITION = 1 (SEARCH START)
4228 fb79 34 04 PSHS B SAVE START
4229 fb7b 96 06 LDA VALTYP GET VARIABLE TYPE
4230 fb7d 26 10 BNE L879C BRANCH IF STRING
4231 fb7f bd ee d5 JSR LB70E CONVERT FPA0 TO INTEGER IN ACCB
4232 fb82 e7 e4 STB ,S SAVE START SEARCH VALUE
4233 fb84 27 91 BEQ L8724 BRANCH IF START SEARCH AT ZERO
4234 fb86 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
4235 fb89 bd e9 22 JSR LB156 EVALUATE EXPRESSION - SEARCH STRING
4236 fb8c bd e9 12 JSR LB146 <20>TM<54> ERROR IF NUMERIC
4237 fb8f 9e 52 L879C LDX FPA0+2 SEARCH STRING DESCRIPTOR ADDRESS
4238 fb91 34 10 PSHS X SAVE ON THE STACK
4239 fb93 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
4240 fb96 bd fb 3b JSR L8748 EVALUATE TARGET STRING EXPRESSION
4241 fb99 34 14 PSHS X,B SAVE ADDRESS AND LENGTH ON STACK
4242 fb9b bd ea 33 JSR LB267 SYNTAX CHECK FOR ')'
4243 fb9e ae 63 LDX $03,S * LOAD X WITH SEARCH STRING DESCRIPTOR ADDRESS
4244 fba0 bd ee 20 JSR LB659 * AND GET THE LENGTH ANDADDRESS OF SEARCH STRING
4245 fba3 34 04 PSHS B SAVE LENGTH ON STACK
4246 *
4247 * AT THIS POINT THE STACK HAS THE FOLLOWING INFORMATION
4248 * ON IT: 0,S-SEARCH LENGTH; 1,S-TARGET LENGTH; 2 3,S-TARGET
4249 * ADDRESS; 4 5,S-SEARCH DESCRIPTOR ADDRESS; 6,S-SEARCH POSITION
4250 fba5 e1 66 CMPB $06,S COMPARE LENGTH OF SEARCH STRING TO START
4251 fba7 25 23 BLO L87D9 POSITION; RETURN 0 IF LENGTH < START
4252 fba9 a6 61 LDA $01,S GET LENGTH OF TARGET STRING
4253 fbab 27 1c BEQ L87D6 BRANCH IF TARGET STRING = NULL
4254 fbad e6 66 LDB $06,S GET START POSITION
4255 fbaf 5a DECB MOVE BACK ONE
4256 fbb0 3a ABX POINT X TO POSITION IN SEARCH STRING WHERE SEARCHING WILL START
4257 fbb1 31 84 L87BE LEAY ,X POINT Y TO SEARCH POSITION
4258 fbb3 ee 62 LDU $02,S POINT U TO START OF TARGET
4259 fbb5 e6 61 LDB $01,S LOAD ACCB WITH LENGTH OF TARGET
4260 fbb7 a6 e4 LDA ,S LOAD ACCA WITH LENGTH OF SEARCH
4261 fbb9 a0 66 SUBA $06,S SUBTRACT SEARCH POSITION FROM SEARCH LENGTH
4262 fbbb 4c INCA ADD ONE
4263 fbbc a1 61 CMPA $01,S COMPARE TO TARGET LENGTH
4264 fbbe 25 0c BLO L87D9 RETURN 0 IF TARGET LENGTH > WHAT<41>S LEFT OF SEARCH STRING
4265 fbc0 a6 80 L87CD LDA ,X+ GET A CHARACTER FROM SEARCH STRING
4266 fbc2 a1 c0 CMPA ,U+ COMPARE IT TO TARGET STRING
4267 fbc4 26 0c BNE L87DF BRANCH IF NO MATCH
4268 fbc6 5a DECB DECREMENT TARGET LENGTH
4269 fbc7 26 f7 BNE L87CD CHECK ANOTHER CHARACTER
4270 fbc9 e6 66 L87D6 LDB $06,S GET MATCH POSITION
4271 fbcb 21 L87D8 FCB SKP1 SKIP NEXT BYTE
4272 fbcc 5f L87D9 CLRB MATCH ADDRESS = 0
4273 fbcd 32 67 LEAS $07,S CLEAN UP THE STACK
4274 fbcf 7e ec ba JMP LB4F3 CONVERT ACCB TO FP NUMBER
4275 fbd2 6c 66 L87DF INC $06,S INCREMENT SEARCH POSITION
4276 fbd4 30 21 LEAX $01,Y MOVE X TO NEXT SEARCH POSITION
4277 fbd6 20 d9 BRA L87BE KEEP LOOKING FOR A MATCH
4278
4279 * EXTENDED BASIC RVEC19 HOOK CODE
4280 fbd8 81 26 XVEC19 CMPA #'&' *
4281 fbda 26 5c BNE L8845 * RETURN IF NOT HEX OR OCTAL VARIABLE
4282 fbdc 32 62 LEAS $02,S PURGE RETURN ADDRESS FROM STACK
4283 * PROCESS A VARIABLE PRECEEDED BY A <20>&<26> (&H,&O)
4284 fbde 0f 52 L87EB CLR FPA0+2 * CLEAR BOTTOM TWO
4285 fbe0 0f 53 CLR FPA0+3 * BYTES OF FPA0
4286 fbe2 8e 00 52 LDX #FPA0+2 BYTES 2,3 OF FPA0 = (TEMPORARY ACCUMULATOR)
4287 fbe5 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC
4288 fbe7 81 4f CMPA #'O'
4289 fbe9 27 12 BEQ L880A YES
4290 fbeb 81 48 CMPA #'H'
4291 fbed 27 23 BEQ L881F YES
4292 fbef 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
4293 fbf1 20 0c BRA L880C DEFAULT TO OCTAL (&O)
4294 fbf3 81 38 L8800 CMPA #'8'
4295 fbf5 10 22 ee 4a LBHI LB277
4296 fbf9 c6 03 LDB #$03 BASE 8 MULTIPLIER
4297 fbfb 8d 2a BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR
4298 * EVALUATE AN &O VARIABLE
4299 fbfd 9d 7c L880A JSR GETNCH GET A CHARACTER FROM BASIC
4300 fbff 25 f2 L880C BLO L8800 BRANCH IF NUMERIC
4301 fc01 0f 50 L880E CLR FPA0 * CLEAR 2 HIGH ORDER
4302 fc03 0f 51 CLR FPA0+1 * BYTES OF FPA0
4303 fc05 0f 06 CLR VALTYP SET VARXABLE TYPE TO NUMERIC
4304 fc07 0f 63 CLR FPSBYT ZERO OUT SUB BYTE OF FPA0
4305 fc09 0f 54 CLR FP0SGN ZERO OUT MANTISSA SIGN OF FPA0
4306 fc0b c6 a0 LDB #$A0 * SET EXPONENT OF FPA0
4307 fc0d d7 4f STB FP0EXP *
4308 fc0f 7e f1 a5 JMP LBA1C GO NORMALIZE FPA0
4309 * EVALUATE AN &H VARIABLE
4310 fc12 9d 7c L881F JSR GETNCH GET A CHARACTER FROM BASIC
4311 fc14 25 0b BLO L882E BRANCH IF NUMERIC
4312 fc16 bd eb 69 JSR LB3A2 SET CARRY IF NOT ALPHA
4313 fc19 25 e6 BLO L880E BRANCH IF NOT ALPHA OR NUMERIC
4314 fc1b 81 47 CMPA #'G' CHECK FOR LETTERS A-F
4315 fc1d 24 e2 BCC L880E BRANCH IF >= G (ILLEGAL HEX LETTER)
4316 fc1f 80 07 SUBA #7 SUBTRACT ASCII DIFFERENCE BETWEEN A AND 9
4317 fc21 c6 04 L882E LDB #$04 BASE 16 DIGIT MULTIPLIER = 2**4
4318 fc23 8d 02 BSR L8834 ADD DIGIT TO TEMPORARY ACCUMULATOR
4319 fc25 20 eb BRA L881F KEEP EVALUATING VARIABLE
4320 fc27 68 01 L8834 ASL $01,X * MULTIPLY TEMPORARY
4321 fc29 69 84 ROL ,X * ACCUMULATOR BY TWO
4322 fc2b 10 25 f5 ec LBCS LBA92 <20>OV' OVERFLOW ERROR
4323 fc2f 5a DECB DECREMENT SHIFT COUNTER
4324 fc30 26 f5 BNE L8834 MULTIPLY TEMPORARY ACCUMULATOR AGAIN
4325 fc32 80 30 SUBA #'0' MASK OFF ASCII
4326 fc34 ab 01 ADDA $01,X * ADD DIGIT TO TEMPORARY
4327 fc36 a7 01 STA $01,X * ACCUMULATOR AND SAVE IT
4328 fc38 39 L8845 RTS
4329
4330 fc39 35 40 XVEC15 PULS U PULL RETURN ADDRESS AND SAVE IN U REGISTER
4331 fc3b 0f 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC
4332 fc3d 9e 83 LDX CHARAD CURRENT INPUT POINTER TO X
4333 fc3f 9d 7c JSR GETNCH GET CHARACTER FROM BASIC
4334 fc41 81 26 CMPA #'&' HEX AND OCTAL VARIABLES ARE PRECEEDED BY &
4335 fc43 27 99 BEQ L87EB PROCESS A <20>&<26> VARIABLE
4336 fc45 81 b0 CMPA #TOK_FN TOKEN FOR FN
4337 fc47 27 5e BEQ L88B4 PROCESS FN CALL
4338 fc49 81 ff CMPA #$FF CHECK FOR SECONDARY TOKEN
4339 fc4b 26 08 BNE L8862 NOT SECONDARY
4340 fc4d 9d 7c JSR GETNCH GET CHARACTER FROM BASIC
4341 fc4f 81 83 CMPA #TOK_USR TOKEN FOR USR
4342 fc51 10 27 00 ab LBEQ L892C PROCESS USR CALL
4343 fc55 9f 83 L8862 STX CHARAD RESTORE BASIC<49>S INPUT POINTER
4344 fc57 6e c4 JMP ,U RETURN TO CALLING ROUTINE
4345 fc59 9e 68 L8866 LDX CURLIN GET CURRENT LINE NUMBER
4346 fc5b 30 01 LEAX $01,X IN DIRECT MODE?
4347 fc5d 26 d9 BNE L8845 RETURN IF NOT IN DIRECT MODE
4348 fc5f c6 16 LDB #2*11 <20>ILLEGAL DIRECT STATEMENT<4E> ERROR
4349 fc61 7e e4 46 L886E JMP LAC46 PROCESS ERROR
4350
4351 fc64 ae 9f 00 83 DEF LDX [CHARAD] GET TWO INPUT CHARS
4352 fc68 8c ff 83 CMPX #TOK_FF_USR TOKEN FOR USR
4353 fc6b 10 27 00 74 LBEQ L890F BRANCH IF DEF USR
4354 fc6f 8d 23 BSR L88A1 GET DESCRIPTOR ADDRESS FOR FN VARIABLE NAME
4355 fc71 8d e6 BSR L8866 DON<4F>T ALLOW DEF FN IF IN DIRECT MODE
4356 fc73 bd ea 36 JSR LB26A SYNTAX CHECK FOR <20>(<28>
4357 fc76 c6 80 LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE
4358 fc78 d7 08 STB ARYDIS * AND SAVE IT IN THE ARRAY DISABLE FLAG
4359 fc7a bd eb 1e JSR LB357 GET VARIABLE DESCRIPTOR
4360 fc7d 8d 25 BSR L88B1 <20>TM<54> ERROR IF STRING
4361 fc7f bd ea 33 JSR LB267 SYNTAX CHECK FOR <20>)<29>
4362 fc82 c6 ae LDB #TOK_EQUALS TOKEN FOR <20>=<3D>
4363 fc84 bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR =
4364 fc87 9e 4b LDX V4B GET THE ADDRESS OF THE FN NAME DESCRIPTOR
4365 fc89 dc 83 LDD CHARAD * GET THE CURRENT INPUT POINTER ADDRESS AND
4366 fc8b ed 84 STD ,X * SAVE IT IN FIRST 2 BYTES OF THE DESCRIPTOR
4367 fc8d dc 39 LDD VARPTR = GET THE DESCRIPTOR ADDRESS OF THE ARGUMENT
4368 fc8f ed 02 STD $02,X = VARIABLE AND SAVE IT IN THE DESCRIPTOR OF THE FN NAME
4369 fc91 7e e6 d0 JMP DATA MOVE INPUT POINTER TO END OF LINE OR SUBLINE
4370 fc94 c6 b0 L88A1 LDB #TOK_FN TOKEN FOR FN
4371 fc96 bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR FN
4372 fc99 c6 80 LDB #$80 * GET THE FLAG TO INDICATE ARRAY VARIABLE SEARCH DISABLE FLAG
4373 fc9b d7 08 STB ARYDIS * AND SAVE IT IN ARRAY VARIABLE FLAG
4374 fc9d 8a 80 ORA #$80 SET BIT 7 OF CURRENT INPUT CHARACTER TO INDICATE AN FN VARIABLE
4375 fc9f bd eb 23 JSR LB35C * GET THE DESCRIPTOR ADDRESS OF THIS
4376 fca2 9f 4b STX V4B * VARIABLE AND SAVE IT IN V4B
4377 fca4 7e e9 0f L88B1 JMP LB143 <20>TM<54> ERROR IF STRING VARIABLE
4378 * EVALUATE AN FN CALL
4379 fca7 8d eb L88B4 BSR L88A1 * GET THE DESCRIPTOR OF THE FN NAME
4380 fca9 34 10 PSHS X * VARIABLE AND SAVE IT ON THE STACK
4381 fcab bd ea 2e JSR LB262 SYNTAX CHECK FOR <20>(<28> & EVALUATE EXPR
4382 fcae 8d f4 BSR L88B1 <20>TM<54> ERROR IF STRING VARIABLE
4383 fcb0 35 40 PULS U POINT U TO FN NAME DESCRIPTOR
4384 fcb2 c6 32 LDB #2*25 <20>UNDEFINED FUNCTION CALL<4C> ERROR
4385 fcb4 ae 42 LDX $02,U POINT X TO ARGUMENT VARIABLE DESCRIPTOR
4386 fcb6 27 a9 BEQ L886E BRANCH TO ERROR HANDLER
4387 fcb8 10 9e 83 LDY CHARAD SAVE CURRENT INPUT POINTER IN Y
4388 fcbb ee c4 LDU ,U * POINT U TO START OF FN FORMULA AND
4389 fcbd df 83 STU CHARAD * SAVE IT IN INPUT POINTER
4390 fcbf a6 04 LDA $04,X = GET FP VALUE OF
4391 fcc1 34 02 PSHS A = ARGUMENT VARIABLE, CURRENT INPUT
4392 fcc3 ec 84 LDD ,X = POINTER, AND ADDRESS OF START
4393 fcc5 ee 02 LDU $02,X = OF FN FORMULA AND SAVE
4394 fcc7 34 76 PSHS U,Y,X,B,A = THEM ON THE STACK
4395 fcc9 bd f3 be JSR LBC35 PACK FPA0 AND SAVE IT IN (X)
4396 fccc bd e9 0d L88D9 JSR LB141 EVALUATE FN EXPRESSION
4397 fccf 35 76 PULS A,B,X,Y,U RESTORE REGISTERS
4398 fcd1 ed 84 STD ,X * GET THE FP
4399 fcd3 ef 02 STU $02,X * VALUE OF THE ARGUMENT
4400 fcd5 35 02 PULS A * VARIABLE OFF OF THE
4401 fcd7 a7 04 STA $04,X * STACK AND RE-SAVE IT
4402 fcd9 9d 82 JSR GETCCH GET FINAL CHARACTER OF THE FN FORMULA
4403 fcdb 10 26 ed 64 LBNE LB277 <20>SYNTAX<41> ERROR IF NOT END OF LINE
4404 fcdf 10 9f 83 STY CHARAD RESTORE INPUT POINTER
4405 fce2 39 L88EF RTS
4406
4407
4408
4409 * DEF USR
4410 fce3 9d 7c L890F JSR GETNCH SKIP PAST SECOND BYTE OF DEF USR TOKEN
4411 fce5 8d 09 BSR L891C GET FN NUMBER
4412 fce7 34 10 PSHS X SAVE FN EXEC ADDRESS STORAGE LOC
4413 fce9 8d 2d BSR L8944 CALCULATE EXEC ADDRESS
4414 fceb 35 40 PULS U GET FN EXEC ADDRESS STORAGE LOC
4415 fced af c4 STX ,U SAVE EXEC ADDRESS
4416 fcef 39 RTS
4417 fcf0 5f L891C CLRB DEFAULT TO USR0 IF NO ARGUMENT
4418 fcf1 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC
4419 fcf3 24 06 BCC L8927 BRANCH IF NOT NUMERIC
4420 fcf5 80 30 SUBA #'0' MASK OFF ASCII
4421 fcf7 1f 89 TFR A,B SAVE USR NUMBER IN ACCB
4422 fcf9 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC
4423 fcfb 9e 8d L8927 LDX USRADR GET ADDRESS OF STORAGE LOCs FOR USR ADDRESS
4424 fcfd 58 ASLB X2 - 2 BYTES/USR ADDRESS
4425 fcfe 3a ABX ADD OFFSET TO START ADDRESS OF STORAGE LOCs
4426 fcff 39 RTS
4427 * PROCESS A USR CALL
4428 fd00 8d ee L892C BSR L891C GET STORAGE LOC OF EXEC ADDRESS FOR USR N
4429 fd02 ae 84 LDX ,X * GET EXEC ADDRESS AND
4430 fd04 34 10 PSHS X * PUSH IT ONTO STACK
4431 fd06 bd ea 2e JSR LB262 SYNTAX CHECK FOR <20>(<28> & EVALUATE EXPR
4432 fd09 8e 00 4f LDX #FP0EXP POINT X TO FPA0
4433 fd0c 96 06 LDA VALTYP GET VARIABLE TYPE
4434 fd0e 27 07 BEQ L8943 BRANCH IF NUMERIC, STRING IF <> 0
4435 fd10 bd ee 1e JSR LB657 GET LENGTH & ADDRESS OF STRING VARIABLE
4436 fd13 9e 52 LDX FPA0+2 GET POINTER TO STRING DESCRIPTOR
4437 fd15 96 06 LDA VALTYP GET VARIABLE TYPE
4438 fd17 39 L8943 RTS JUMP TO USR ROUTINE (PSHS X ABOVE)
4439 fd18 c6 ae L8944 LDB #TOK_EQUALS TOKEN FOR <20>=<3D>
4440 fd1a bd ea 3b JSR LB26F DO A SYNTAX CHECK FOR =
4441 fd1d 7e ef 04 JMP LB73D EVALUATE EXPRESSION, RETURN VALUE IN X
4442
4443
4444
4445 * DEL
4446 fd20 10 27 ee ed DEL LBEQ LB44A FC<46> ERROR IF NO ARGUMENT
4447 fd24 bd e7 57 JSR LAF67 CONVERT A DECIMAL BASiC NUMBER TO BINARY
4448 fd27 bd e4 e5 JSR LAD01 FIND RAM ADDRESS OF START OF A BASIC LINE
4449 fd2a 9f 93 STX VD3 SAVE RAM ADDRESS OF STARTING LINE NUMBER
4450 fd2c 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
4451 fd2e 27 10 BEQ L8990 BRANCH IF END OF LINE
4452 fd30 81 a7 CMPA #TOK_MINUS TOKEN FOR <20>-'
4453 fd32 26 3b BNE L89BF TERMINATE COMMAND IF LINE NUMBER NOT FOLLOWED BY <20>-<2D>
4454 fd34 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC
4455 fd36 27 04 BEQ L898C IF END OF LINE, USE DEFAULT ENDING LINE NUMBER
4456 fd38 8d 24 BSR L89AE * CONVERT ENDING LINE NUMBER TO BINARY
4457 fd3a 20 04 BRA L8990 * AND SAVE IT IN BINVAL
4458 fd3c 86 ff L898C LDA #$FF = USE $FFXX AS DEFAULT ENDING
4459 fd3e 97 2b STA BINVAL = LINE NUMBER - SAVE IT IN BINVAL
4460 fd40 de 93 L8990 LDU VD3 POINT U TO STARTING LINE NUMBER ADDRESS
4461 fd42 8c L8992 FCB SKP2 SKIP TWO BYTES
4462 fd43 ee c4 L8993 LDU ,U POINT U TO START OF NEXT LINE
4463 fd45 ec c4 LDD ,U CHECK FOR END OF PROGRAM
4464 fd47 27 06 BEQ L899F BRANCH IF END OF PROGRAM
4465 fd49 ec 42 LDD $02,U LOAD ACCD WITH THIS LINE<4E>S NUMBER
4466 fd4b 93 2b SUBD BINVAL SUBTRACT ENDING LINE NUMBER ADDRESS
4467 fd4d 23 f4 BLS L8993 BRANCH IF = < ENDING LINE NUMBER
4468 fd4f 9e 93 L899F LDX VD3 GET STARTING LINE NUMBER
4469 fd51 8d 15 BSR L89B8 MOVE (U) TO (X) UNTIL END OF PROGRAM
4470 fd53 bd e5 05 JSR LAD21 RESET BASIC<49>S INPUT POINTER AND ERASE VARIABLES
4471 fd56 9e 93 LDX VD3 GET STARTING LINE NUMBER ADDRESS
4472 fd58 bd e4 d5 JSR LACF1 RECOMPUTE START OF NEXT LINE ADDRESSES
4473 fd5b 7e e4 65 JMP LAC73 JUMP TO BASIC<49>S MAIN COMMAND LOOP
4474 fd5e bd e7 57 L89AE JSR LAF67 GO GET LINE NUMBER CONVERTED TO BINARY
4475 fd61 7e e1 fa JMP LA5C7 MAKE SURE THERE<52>S NO MORE ON THIS LINE
4476 fd64 a6 c0 L89B4 LDA ,U+ GET A BYTE FROM (U)
4477 fd66 a7 80 STA ,X+ MOVE THE BYTE TO (X)
4478 fd68 11 93 1b L89B8 CMPU VARTAB COMPARE TO END OF BASIC
4479 fd6b 26 f7 BNE L89B4 BRANCH IF NOT AT END
4480 fd6d 9f 1b STX VARTAB SAVE (X) AS NEW END OF BASIC
4481 fd6f 39 L89BF RTS
4482
4483
4484 fd70 bd fc 59 L89C0 JSR L8866 <20>BS<42> ERROR IF IN DIRECT MODE
4485 fd73 9d 7c JSR GETNCH GET A CHAR FROM BASIC
4486 fd75 81 22 L89D2 CMPA #'"' CHECK FOR PROMPT STRING
4487 fd77 26 0b BNE L89E1 BRANCH IF NO PROMPT STRING
4488 fd79 bd ea 10 JSR LB244 STRIP OFF PROMPT STRING & PUT IT ON STRING STACK
4489 fd7c c6 3b LDB #';' *
4490 fd7e bd ea 3b JSR LB26F * DO A SYNTAX CHECK FOR;
4491 fd81 bd f1 28 JSR LB99F REMOVE PROMPT STRING FROM STRING STACK & SEND TO CONSOLE OUT
4492 fd84 32 7e L89E1 LEAS $-02,S RESERVE TWO STORAGE SLOTS ON STACK
4493 fd86 bd e8 0c JSR LB035 INPUT A LINE FROM CURRENT INPUT DEVICE
4494 fd89 32 62 LEAS $02,S CLEAN UP THE STACK
4495 fd8b bd eb 1e JSR LB357 SEARCH FOR A VARIABLE
4496 fd8e 9f 3b STX VARDES SAVE POINTER TO VARIABLE DESCRIPTOR
4497 fd90 bd e9 12 JSR LB146 <20>TM<54> ERROR IF VARIABLE TYPE = NUMERIC
4498 fd93 8e 00 f3 LDX #LINBUF POINT X TO THE STRING BUFFER WHERE THE INPUT STRING WAS STORED
4499 fd96 4f CLRA TERMINATOR CHARACTER 0 (END OF LINE)
4500 fd97 bd ec e3 JSR LB51A PARSE THE INPUT STRING AND STORE IT IN THE STRING SPACE
4501 fd9a 7e e7 94 JMP LAFA4 REMOVE DESCRIPTOR FROM STRING STACK
4502 fd9d bd e7 57 L89FC JSR LAF67 STRIP A DECIMAL NUMBER FROM BASIC INPUT LINE
4503 fda0 9e 2b LDX BINVAL GET BINARY VALUE
4504 fda2 39 RTS
4505 fda3 9e 91 L8A02 LDX VD1 GET CURRENT OLD NUMBER BEING RENUMBERED
4506 fda5 9f 2b L8A04 STX BINVAL SAVE THE LINE NUMBER BEING SEARCHED FOR
4507 fda7 7e e4 e5 JMP LAD01 GO FIND THE LINE NUMBER IN BASIC PROGRAM
4508
4509 * RENUM
4510 fdaa bd e5 0a RENUM JSR LAD26 ERASE VARIABLES
4511 fdad cc 00 0a LDD #10 DEFAULT LINE NUMBER INTERVAL
4512 fdb0 dd 95 STD VD5 SAVE DEFAULT RENUMBER START LINE NUMBER
4513 fdb2 dd 8f STD VCF SAVE DEFAULT INTERVAL
4514 fdb4 5f CLRB NOW ACCD = 0
4515 fdb5 dd 91 STD VD1 DEFAULT LINE NUMBER OF WHERE TO START RENUMBERING
4516 fdb7 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
4517 fdb9 24 06 BCC L8A20 BRANCH IF NOT NUMERIC
4518 fdbb 8d e0 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY
4519 fdbd 9f 95 STX VD5 SAVE LINE NUMBER WHERE RENUMBERING STARTS
4520 fdbf 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
4521 fdc1 27 1b L8A20 BEQ L8A3D BRANCH IF END OF LINE
4522 fdc3 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
4523 fdc6 24 06 BCC L8A2D BRANCH IF NEXT CHARACTER NOT NUMERIC
4524 fdc8 8d d3 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY
4525 fdca 9f 91 STX VD1 SAVE NEW RENUMBER LINE
4526 fdcc 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
4527 fdce 27 0e L8A2D BEQ L8A3D BRANCH IF END OF LINE
4528 fdd0 bd ea 39 JSR LB26D SYNTAX CHECK FOR COMMA
4529 fdd3 24 06 BCC L8A3A BRANCH IF NEXT CHARACTER NOT NUMERIC
4530 fdd5 8d c6 BSR L89FC CONVERT DECIMAL NUMBER IN BASIC PROGRAM TO BINARY
4531 fdd7 9f 8f STX VCF SAVE NEW INTERVAL
4532 fdd9 27 49 BEQ L8A83 <20>FC' ERROR
4533 fddb bd e1 fa L8A3A JSR LA5C7 CHECK FOR MORE CHARACTERS ON LINE - <20>SYNTAX<41> ERROR IF ANY
4534 fdde 8d c3 L8A3D BSR L8A02 GO GET ADDRESS OF OLD NUMBER BEING RENUMBERED
4535 fde0 9f 93 STX VD3 SAVE ADDRESS
4536 fde2 9e 95 LDX VD5 GET NEXT RENUMBERED LINE NUMBER TO USE
4537 fde4 8d bf BSR L8A04 FIND THE LINE NUMBER IN THE BASIC PROGRAM
4538 fde6 9c 93 CMPX VD3 COMPARE TO ADDRESS OF OLD LINE NUMBER
4539 fde8 25 3a BLO L8A83 <20>FC<46> ERROR IF NEW ADDRESS < OLD ADDRESS
4540 fdea 8d 1c BSR L8A67 MAKE SURE RENUMBERED LINE NUMBERS WILL BE IN RANGE
4541 fdec bd fe 7e JSR L8ADD CONVERT ASCII LINE NUMBERS TO <20>EXPANDED<45> BINARY
4542 fdef bd e4 d3 JSR LACEF RECALCULATE NEXT LINE RAM ADDRESSES
4543 fdf2 8d af BSR L8A02 GET RAM ADDRESS OF FIRST LINE TO BE RENUMBERED
4544 fdf4 9f 93 STX VD3 SAVE IT
4545 fdf6 8d 3a BSR L8A91 MAKE SURE LINE NUMBERS EXIST
4546 fdf8 8d 0f BSR L8A68 INSERT NEW LINE NUMBERS IN LINE HEADERS
4547 fdfa 8d 36 BSR L8A91 INSERT NEW LINE NUMBERS IN PROGRAM STATEMENTS
4548 fdfc bd ff 19 JSR L8B7B CONVERT PACKED BINARY LINE NUMBERS TO ASCII
4549 fdff bd e5 0a JSR LAD26 ERASE VARIABLES
4550 fe02 bd e4 d3 JSR LACEF RECALCULATE NEXT LINE RAM ADDRESS
4551 fe05 7e e4 65 JMP LAC73 GO BACK TO BASIC<49>S MAIN LOOP
4552 fe08 86 L8A67 FCB SKP1LD SKIP ONE BYTE - LDA #$4F
4553 fe09 4f L8A68 CLRA NEW LINE NUMBER FLAG - 0; INSERT NEW LINE NUMBERS
4554 fe0a 97 98 STA VD8 SAVE NEW LINE NUMBER FLAG; 0 = INSERT NEW NUMBERS
4555 fe0c 9e 93 LDX VD3 GET ADDRESS OF OLD LINE NUMBER BEING RENUMBERED
4556 fe0e dc 95 LDD VD5 GET THE CURRENT RENUMBERED LINE NUMBER
4557 fe10 8d 15 BSR L8A86 RETURN IF END OF PROGRAM
4558 fe12 0d 98 L8A71 TST VD8 CHECK NEW LINE NUMBER FLAG
4559 fe14 26 02 BNE L8A77 BRANCH IF NOT INSERTING NEW LINE NUMBERS
4560 fe16 ed 02 STD $02,X STORE THE NEW LINE NUMBER IN THE BASIC PROGRAM
4561 fe18 ae 84 L8A77 LDX ,X POINT X TO THE NEXT LINE IN BASIC
4562 fe1a 8d 0b BSR L8A86 RETURN IF END OF PROGRAM
4563 fe1c d3 8f ADDD VCF ADD INTERVAL TO CURRENT RENUMBERED LINE NUMBER
4564 fe1e 25 04 BLO L8A83 <20>FC<46> ERROR IF LINE NUMBER > $FFFF
4565 fe20 81 fa CMPA #MAXLIN LARGEST LINE NUMBER = $F9FF
4566 fe22 25 ee BLO L8A71 BRANCH IF LEGAL LINE NUMBER
4567 fe24 7e ec 11 L8A83 JMP LB44A <20>FC<46> ERROR IF LINE NUMBER MS BYTE > $F9
4568 * TEST THE TWO BYTES POINTED TO BY (X).
4569 * NORMAL RETURN IF <> 0. IF = 0 (END OF
4570 * PROGRAM) RETURN IS PULLED OFF STACK AND
4571 * YOU RETURN TO PREVIOUS SUBROUTINE CALL.
4572 fe27 34 06 L8A86 PSHS B,A SAVE ACCD
4573 fe29 ec 84 LDD ,X TEST THE 2 BYTES POINTED TO BY X
4574 fe2b 35 06 PULS A,B RESTORE ACCD
4575 fe2d 26 02 BNE L8A90 BRANCH IF NOT END OF PROGRAM
4576 fe2f 32 62 LEAS $02,S PURGE RETURN ADDRESS FROM STACK
4577 fe31 39 L8A90 RTS
4578 fe32 9e 19 L8A91 LDX TXTTAB GET START OF BASIC PROGRAM
4579 fe34 30 1f LEAX $-01,X MOVE POINTER BACK ONE
4580 fe36 30 01 L8A95 LEAX $01,X MOVE POINTER UP ONE
4581 fe38 8d ed BSR L8A86 RETURN IF END OF PROGRAM
4582 fe3a 30 03 L8A99 LEAX $03,X SKIP OVER NEXT LINE ADDRESS AND LINE NUMBER
4583 fe3c 30 01 L8A9B LEAX $01,X MOVE POINTER TO NEXT CHARACTER
4584 fe3e a6 84 LDA ,X CHECK CURRENT CHARACTER
4585 fe40 27 f4 BEQ L8A95 BRANCH IF END OF LINE
4586 fe42 9f 0f STX TEMPTR SAVE CURRENT POINTER
4587 fe44 4a DECA =
4588 fe45 27 0c BEQ L8AB2 =BRANCH IF START OF PACKED NUMERIC LINE
4589 fe47 4a DECA *
4590 fe48 27 2a BEQ L8AD3 *BRANCH IF LINE NUMBER EXISTS
4591 fe4a 4a DECA =
4592 fe4b 26 ef BNE L8A9B =MOVE TO NEXT CHARACTER IF > 3
4593 fe4d 86 03 L8AAC LDA #$03 * SET 1ST BYTE = 3 TO INDICATE LINE
4594 fe4f a7 80 STA ,X+ * NUMBER DOESN<53>T CURRENTLY EXIST
4595 fe51 20 e7 BRA L8A99 GO GET ANOTHER CHARACTER
4596 fe53 ec 01 L8AB2 LDD $01,X GET MS BYTE OF LINE NUMBER
4597 fe55 6a 02 DEC $02,X DECREMENT ZERO CHECK BYTE
4598 fe57 27 01 BEQ L8AB9 BRANCH IF MS BYTE <> 0
4599 fe59 4f CLRA CLEAR MS BYTE
4600 fe5a e6 03 L8AB9 LDB $03,X GET LS BYTE OF LINE NUMBER
4601 fe5c 6a 04 DEC $04,X DECREMENT ZERO CHECK FLAG
4602 fe5e 27 01 BEQ L8AC0 BRANCH IF IS BYTE <> 0
4603 fe60 5f CLRB CLEAR LS BYTE
4604 fe61 ed 01 L8AC0 STD $01,X SAVE BINARY LINE NUMBER
4605 fe63 dd 2b STD BINVAL SAVE TRIAL LINE NUMBER
4606 fe65 bd e4 e5 JSR LAD01 FIND RAM ADDRESS OF A BASIC LINE NUMBER
4607 fe68 9e 0f L8AC7 LDX TEMPTR GET BACK POINTER TO START OF PACKED LINE NUMBER
4608 fe6a 25 e1 BLO L8AAC BRANCH IF NO LINE NUMBER MATCH FOUND
4609 fe6c dc 47 LDD V47 GET START ADDRESS OF LINE NUMBER
4610 fe6e 6c 80 INC ,X+ * SET 1ST BYTE = 2, TO INDICATE LINE NUMBER EXISTS IF CHECKING FOR
4611 * * EXISTENCE OF LINE NUMBER, SET IT = 1 IF INSERTING LINE NUMBERS
4612
4613 fe70 ed 84 STD ,X SAVE RAM ADDRESS OF CORRECT LINE NUMBER
4614 fe72 20 c6 BRA L8A99 GO GET ANOTHER CHARACTER
4615 fe74 6f 84 L8AD3 CLR ,X CLEAR CARRY FLAG AND 1ST BYTE
4616 fe76 ae 01 LDX $01,X POINT X TO RAM ADDRESS OF CORRECT LINE NUMBER
4617 fe78 ae 02 LDX $02,X PUT CORRECT LINE NUMBER INTO (X)
4618 fe7a 9f 47 STX V47 SAVE IT TEMPORARILY
4619 fe7c 20 ea BRA L8AC7 GO INSERT IT INTO BASIC LINE
4620 fe7e 9e 19 L8ADD LDX TXTTAB GET BEGINNING OF BASIC PROGRAM
4621 fe80 20 04 BRA L8AE5
4622 fe82 9e 83 L8AE1 LDX CHARAD *GET CURRENT INPUT POINTER
4623 fe84 30 01 LEAX $01,X *AND BUMP IT ONE
4624 fe86 8d 9f L8AE5 BSR L8A86 RETURN IF END OF PROGRAM
4625 fe88 30 02 LEAX $02,X SKIP PAST NEXT LINE ADDRESS
4626 fe8a 30 01 L8AE9 LEAX $01,X ADVANCE POINTER BY ONE
4627 fe8c 9f 83 L8AEB STX CHARAD SAVE NEW BASIC INPUT POINTER
4628 fe8e 9d 7c L8AED JSR GETNCH GET NEXT CHARACTER FROM BASIC
4629 fe90 4d L8AEF TSTA CHECK THE CHARACTER
4630 fe91 27 ef BEQ L8AE1 BRANCH IF END OF LINE
4631 fe93 2a f9 BPL L8AED BRANCH IF NOT A TOKEN
4632 fe95 9e 83 LDX CHARAD GET CURRENT INPUT POINTER
4633 fe97 81 ff CMPA #$FF IS THIS A SECONDARY TOKEN?
4634 fe99 27 ef BEQ L8AE9 YES - IGNORE IT
4635 fe9b 81 a2 CMPA #TOK_THEN TOKEN FOR THEN?
4636 fe9d 27 12 BEQ L8B13 YES
4637 fe9f 81 84 CMPA #TOK_ELSE TOKEN FOR ELSE?
4638 fea1 27 0e BEQ L8B13 YES
4639 fea3 81 81 CMPA #TOK_GO TOKEN FOR GO?
4640 fea5 26 e7 BNE L8AED NO
4641 fea7 9d 7c JSR GETNCH GET A CHARACTER FROM BASIC
4642 fea9 81 a0 CMPA #TOK_TO TOKEN FOR TO?
4643 feab 27 04 BEQ L8B13 YES
4644 fead 81 a1 CMPA #TOK_SUB TOKEN FOR SUB?
4645 feaf 26 db BNE L8AEB NO
4646 feb1 9d 7c L8B13 JSR GETNCH GET A CHARACTER FROM BASIC
4647 feb3 25 04 BLO L8B1B BRANCH IF NUMERIC
4648 feb5 9d 82 L8B17 JSR GETCCH GET CURRENT BASIC INPUT CHARRACTER
4649 feb7 20 d7 BRA L8AEF KEEP CHECKING THE LINE
4650 feb9 9e 83 L8B1B LDX CHARAD GET CURRENT INPUT ADDRESS
4651 febb 34 10 PSHS X SAVE IT ON THE STACK
4652 febd bd e7 57 JSR LAF67 CONVERT DECIMAL BASIC NUMBER TO BINARY
4653 fec0 9e 83 LDX CHARAD GET CURRENT INPUT POINTER
4654 fec2 a6 82 L8B24 LDA ,-X GET PREVIOUS INPUT CHARACTER
4655 fec4 bd ff b6 JSR L90AA CLEAR CARRY IF NUMERIC INPUT VALUE
4656 fec7 25 f9 BLO L8B24 BRANCH IF NON-NUMERIC
4657 fec9 30 01 LEAX $01,X MOVE POINTER UP ONE
4658 fecb 1f 10 TFR X,D NOW ACCD POINTS TO ONE PAST END OF LINE NUMBER
4659 fecd e0 61 SUBB $01,S SUBTRACT PRE-NUMERIC POINTER LS BYTE
4660 fecf c0 05 SUBB #$05 MAKE SURE THERE ARE AT LEAST 5 CHARACTERS IN THE NUMERIC LINE
4661 *
4662 fed1 27 20 BEQ L8B55 BRANCH IF EXACTLY 5
4663 fed3 25 0a BLO L8B41 BRANCH IF < 5
4664 fed5 33 84 LEAU ,X TRANSFER X TO U
4665 fed7 50 NEGB NEGATE B
4666 fed8 30 85 LEAX B,X MOVE X BACK B BYTES
4667 feda bd fd 68 JSR L89B8 *MOVE BYTES FROM (U) TO (X) UNTIL
4668 * *U = END OF BASIC; (I) = NEW END OF BASIC
4669 fedd 20 14 BRA L8B55
4670 * FORCE FIVE BYTES OF SPACE FOR THE LINE NUMBER
4671 fedf 9f 47 L8B41 STX V47 SAVE END OF NUMERIC VALUE
4672 fee1 9e 1b LDX VARTAB GET END OF BASIC PROGRAM
4673 fee3 9f 43 STX V43 SAVE IT
4674 fee5 50 NEGB NEGATE B
4675 fee6 30 85 LEAX B,X ADD IT TO END OF NUMERIC POiNTER
4676 fee8 9f 41 STX V41 SAVE POINTER
4677 feea 9f 1b STX VARTAB STORE END OF BASIC PROGRAM
4678 feec bd e4 1e JSR LAC1E ACCD = TOP OF ARRAYS - CHECK FOR ENOUGH ROOM
4679 feef 9e 45 LDX V45 * GET AND SAVE THE
4680 fef1 9f 83 STX CHARAD * NEW CURRENT INPUT POINTER
4681 fef3 35 10 L8B55 PULS X RESTORE POINTER TO START OF NUMERIC VALUE
4682 fef5 86 01 LDA #$01 NEW LINE NUMBER FLAG
4683 fef7 a7 84 STA ,X * SAVE NEW LINE FLAG
4684 fef9 a7 02 STA $02,X *
4685 fefb a7 04 STA $04,X *
4686 fefd d6 2b LDB BINVAL GET MS BYTE OF BINARY LINE NUMBER
4687 feff 26 04 BNE L8B67 BRANCH IF IT IS NOT ZERO
4688 ff01 c6 01 LDB #$01 SAVE A 1 IF BYTE IS 0; OTHERWISE, BASIC WILL
4689 * THINK IT IS THE END OF A LINE
4690 ff03 6c 02 INC $02,X IF 2,X = 2, THEN PREVIOUS BYTE WAS A ZERO
4691 ff05 e7 01 L8B67 STB $01,X SAVE MS BYTE OF BINARY LINE NUMBER
4692 ff07 d6 2c LDB BINVAL+1 GET IS BYTE OF BINARY LINE NUMBER
4693 ff09 26 04 BNE L8B71 BRANCH IF NOT A ZERO BYTE
4694 ff0b c6 01 LDB #$01 SAVE A 1 IF BYTE IS A 0
4695 ff0d 6c 04 INC $04,X IF 4,X = 2, THEN PREVIOUS BYTE WAS A 0
4696 ff0f e7 03 L8B71 STB $03,X SAVE LS BYTE OF BINARY LINE NUMBER
4697 ff11 9d 82 JSR GETCCH GET CURRENT INPUT CHARACTER
4698 ff13 81 2c CMPA #',' IS IT A COMMA?
4699 ff15 27 9a BEQ L8B13 YES - PROCESS ANOTHER NUMERIC VALUE
4700 ff17 20 9c BRA L8B17 NO - GO GET AND PROCESS AN INPUT CHARACTER
4701 ff19 9e 19 L8B7B LDX TXTTAB POINT X TO START OF BASIC PROGRAM
4702 ff1b 30 1f LEAX $-01,X MOVE POINTER BACK ONE
4703 ff1d 30 01 L8B7F LEAX $01,X MOVE POINTER UP ONE
4704 ff1f ec 02 LDD $02,X GET ADDRESS OF NEXT LINE
4705 ff21 dd 68 STD CURLIN SAVE IT IN CURLIN
4706 ff23 bd fe 27 JSR L8A86 RETURN IF END OF PROGRAM
4707 ff26 30 03 LEAX $03,X SKIP OVER ADDRESS OF NEXT LINE AND 1ST BYTE OF LINE NUMBER
4708 ff28 30 01 L8B8A LEAX $01,X MOVE POINTER UP ONE
4709 ff2a a6 84 L8B8C LDA ,X GET CURRENT CHARACTER
4710 ff2c 27 ef BEQ L8B7F BRANCH IF END OF LINE
4711 ff2e 4a DECA INPUT CHARACTER = 1? - VALID LINE NUMBER
4712 ff2f 27 1b BEQ L8BAE YES
4713 ff31 80 02 SUBA #$02 INPUT CHARACTER 3? - UL LINE NUMBER
4714 ff33 26 f3 BNE L8B8A NO
4715 ff35 34 10 PSHS X SAVE CURRENT POSITION OF INPUT POINTER
4716 ff37 8e ff 76 LDX #L8BD9-1 POINT X TO <20>UL<55> MESSAGE
4717 ff3a bd f1 25 JSR LB99C PRINT STRING TO THE SCREEN
4718 ff3d ae e4 LDX ,S GET INPUT POINTER
4719 ff3f ec 01 LDD $01,X GET THE UNDEFINED LINE NUMBER
4720 ff41 bd f5 55 JSR LBDCC CONVERT NUMBER IN ACCD TO DECIMAL AND DISPLAY IT
4721 ff44 bd f5 4e JSR LBDC5 PRINT <20>IN XXXX<58> XXXX = CURRENT LINE NUMBER
4722 ff47 bd f0 e5 JSR LB958 SEND A CR TO CONSOLE OUT
4723 ff4a 35 10 PULS X GET INPUT POINTER BACK
4724 ff4c 34 10 L8BAE PSHS X SAVE CURRENT POSITION OF INPUT POINTER
4725 ff4e ec 01 LDD $01,X LOAD ACCD WITH BINARY VALUE OF LINE NUMBER
4726 ff50 dd 52 STD FPA0+2 SAVE IN BOTTOM 2 BYTES OF FPA0
4727 ff52 bd fc 01 JSR L880E ADJUST REST OF FPA0 AS AN INTEGER
4728 ff55 bd f5 62 JSR LBDD9 CONVERT FPA0 TO ASCII, STORE IN LINE NUMBER
4729 ff58 35 40 PULS U LOAD U WITH PREVIOUS ADDRESS OF INPUT POINTER
4730 ff5a c6 05 LDB #$05 EACH EXPANDED LINE NUMBER USES 5 BYTES
4731 ff5c 30 01 L8BBE LEAX $01,X MOVE POINTER FORWARD ONE
4732 ff5e a6 84 LDA ,X GET AN ASCII BYTE
4733 ff60 27 05 BEQ L8BC9 BRANCH IF END OF NUMBER
4734 ff62 5a DECB DECREMENT BYTE COUNTER
4735 ff63 a7 c0 STA ,U+ STORE ASCII NUMBER IN BASIC LINE
4736 ff65 20 f5 BRA L8BBE CHECK FOR ANOTHER DIGIT
4737 ff67 30 c4 L8BC9 LEAX ,U TRANSFER NEW LINE POINTER TO (X)
4738 ff69 5d TSTB DOES THE NEW LINE NUMBER REQUIRE 5 BYTES?
4739 ff6a 27 be BEQ L8B8C YES - GO GET ANOTHER INPUT CHARACTER
4740 ff6c 31 c4 LEAY ,U SAVE NEW LINE POINTER IN Y
4741 ff6e 33 c5 LEAU B,U POINT U TO END OF 5 BYTE PACKED LINE NUMBER BLOCK
4742 ff70 bd fd 68 JSR L89B8 MOVE BYTES FROM (U) TO (X) UNTIL END OF PROGRAM
4743 ff73 30 a4 LEAX ,Y LOAD (X) WITH NEW LINE POINTER
4744 ff75 20 b3 BRA L8B8C GO GET ANOTHER INPUT CHARACTER
4745
4746 ff77 55 4c 20 L8BD9 FCC "UL " UNKNOWN LINE NUMBER MESSAGE
4747 ff7a 00 FCB 0
4748
4749
4750 ff7b bd ef 07 HEXDOL JSR LB740 CONVERT FPA0 INTO A POSITIVE 2 BYTE INTEGER
4751 ff7e 8e 01 f0 LDX #STRBUF+2 POINT TO TEMPORARY BUFFER
4752 ff81 c6 04 LDB #$04 CONVERT 4 NIBBLES
4753 ff83 34 04 L8BE5 PSHS B SAVE NIBBLE COUNTER
4754 ff85 5f CLRB CLEAR CARRY FLAG
4755 ff86 86 04 LDA #$04 4 SHIFTS
4756 ff88 08 53 L8BEA ASL FPA0+3 * SHIFT BOTTOM TWO BYTES OF
4757 ff8a 09 52 ROL FPA0+2 * FPA0 LEFT ONE BIT (X2)
4758 ff8c 59 ROLB IF OVERFLOW, ACCB <> 0
4759 ff8d 4a DECA * DECREMENT SHIFT COUNTER AND
4760 ff8e 26 f8 BNE L8BEA * BRANCH IF NOT DONE
4761 ff90 5d TSTB CHECK FOR OVERFLOW
4762 ff91 26 0a BNE L8BFF BRANCH IF OVERFLOW
4763 ff93 a6 e4 LDA ,S * GET NIBBLE COUNTER,
4764 ff95 4a DECA * DECREMENT IT AND
4765 ff96 27 05 BEQ L8BFF * BRANCH IF DONE
4766 ff98 8c 01 f0 CMPX #STRBUF+2 DO NOT DO A CONVERSION UNTIL A NON-ZERO
4767 ff9b 27 0c BEQ L8C0B BYTE IS FOUND - LEADING ZERO SUPPRESSION
4768 ff9d cb 30 L8BFF ADDB #'0' ADD IN ASCII ZERO
4769 ff9f c1 39 CMPB #'9' COMPARE TO ASCII 9
4770 ffa1 23 02 BLS L8C07 BRANCH IF < 9
4771 ffa3 cb 07 ADDB #7 ADD ASCII OFFSET IF HEX LETTER
4772 ffa5 e7 80 L8C07 STB ,X+ STORE HEX VALUE AND ADVANCE POINTER
4773 ffa7 6f 84 CLR ,X CLEAR NEXT BYTE - END OF STRING FLAG
4774 ffa9 35 04 L8C0B PULS B * GET NIBBLE COUNTER,
4775 ffab 5a DECB * DECREMENT IT AND
4776 ffac 26 d5 BNE L8BE5 * BRANCH IF NOT DONE
4777 ffae 32 62 LEAS $02,S PURGE RETURN ADDRESS OFF OF STACK
4778 ffb0 8e 01 ef LDX #STRBUF+1 RESET POINTER
4779 ffb3 7e ec df JMP LB518 SAVE STRING ON STRING STACK
4780
4781
4782 * CLEAR CARRY IF NUMERIC
4783 ffb6 81 30 L90AA CMPA #'0' ASCII ZERO
4784 ffb8 25 04 BLO L90B2 RETURN IF ACCA < ASCII 0
4785 ffba 80 3a SUBA #$3A * #'9'+1
4786 ffbc 80 c6 SUBA #$C6 * #-('9'+1) CARRY CLEAR IF NUMERIC
4787 ffbe 39 L90B2 RTS
4788
4789
4790 * LINE
4791 ffbf 81 89 LINE CMPA #TOK_INPUT <20>INPUT<55> TOKEN
4792 ffc1 10 27 fd ab LBEQ L89C0 GO DO <20>LINE INPUT<55> COMMAND
4793 ffc5 7e ea 43 JMP LB277 <20>SYNTAX ERROR<4F> IF NOT "LINE INPUT"
4794
4795
4796 * END OF EXTENDED BASIC
4797 * INTERRUPT VECTORS
4798 fff0 ORG $FFF0
4799 fff0 00 00 LBFF0 FDB $0000 RESERVED
4800 fff2 00 9b LBFF2 FDB SW3VEC SWI3
4801 fff4 00 9e LBFF4 FDB SW2VEC SWI2
4802 fff6 00 aa LBFF6 FDB FRQVEC FIRQ
4803 fff8 00 a7 LBFF8 FDB IRQVEC IRQ
4804 fffa 00 a1 LBFFA FDB SWIVEC SWI
4805 fffc 00 a4 LBFFC FDB NMIVEC NMI
4806 fffe e0 48 LBFFE FDB RESVEC RESET