00001 *************************
00002 *
00003 * OUTER.ASM
00004 * MDJ 10-31-91 REVISION
00005 *
00006 * CF83 OUTER INTERPRETER
00007 *
00008 *************************
00009 *
00010 * MUST ALTER  ON
00011 * ==========  ==
00012 * START       ZOUTER
00013 * OUTERL      ZENDB
00014 * OUTERL      ZERCHC
00015 * OUTERL      ZUMBRC
00016 * OUTERL      ZOKENX
00017 * OUTERL      ZOMPLX
00018 * OUTERL      ZPNUMX
00019 * CF83COR3    ZENDB
00020 * CF83COR3    ZOKENX
00021 * CF83COR4    ZENDB
00022 * CF83COR4    ZERCHC
00023 * CF83COR4    ZTCNT
00024 * CF83COR5    ZERCHC
00025 *
00026 *************************
00027 *
00028 COLON   EQU     $07
00029 DPDP    EQU     $1B
00030 BLKL    EQU     $2B
00031 STATEL  EQU     $2D
00032 MODE    EQU     $2E
00033 DPLV1   EQU     $49
00034 TOINL   EQU     $01D1
00035 TIB     EQU     $01DA
00036 ETIB    EQU     $02DB
00037 CONTXT  EQU     $098B
00038 KBDIN   EQU     $4240
00039 ATONCV  EQU     $44A9
00040 TYPEF   EQU     $465F
00041 ZOKX    EQU     $55F1
00042 ZITERT  EQU     $5328
00043 NOTVAL  EQU     $515E
00044 ST2CVK  EQU     $5170
00045 ZPNUMX  EQU     $51A9
00046         ORG     $596D
00047 *
00048 *************************
00049 *
00050 * ZOUTER IS THE OUTER
00051 * INTERPRETER MAIN LOOP
00052 *
00053 *************************
00054 *
00055 ZOUTER  FDB     *+2
00056 OUTER1  FDB     COLON
00057 OUTER2  FDB     INLINE
00058 OUTER3  FDB     ZOKLIN
 
 
 
 
 
 
 
 
00059 OUTER4  FDB     TOKCHK
00060         FDB     ZERCHC
00061         FDB     FNDCHK
00062         FDB     ZUMBRC
00063         FDB     VALCHK
00064         FDB     ZQMC
00065 *
00066 *************************
00067 *
00068 * INLINE IMPLEMENTS THE
00069 * TERMINAL INPUT SUBMODE
00070 *
00071 *************************
00072 *
00073 INLINE  FDB     *+2
00074         JSR     KBDIN   GO TO SACORE'S INPUT ROUTINE
00075         LDX     ,Y++
00076         JMP     [,X++]
00077 *
00078 *************************
00079 *
00080 * TOKLIN POINTS TO A
00081 * TOKEN AT THE TERMINAL
00082 *
00083 *************************
00084 *
00085 ZOKLIN  FDB     *+2
00086         PSHS    A,B,X
00087         LDD     #ETIB   LOAD END OF TIB MARKER
00088         STD     ZENDB   SET END OF BUFFER
00089         LDD     TOINL   LOAD CHARACTER OFFSET POINTER
00090         ADDD    #TIB    ADD START OF BUFFER
00091         PSHU    A,B
00092         JSR     ZOKENX  GO MOVE TOKEN
00093         PULU    X       GET FLAG FROM U-STACK
00094         PULU    A,B     GET CHARACTER POINTER FROM U-STACK
00095         CMPX    #0      FALSE FLAG? (NOT END?)
00096         BEQ     TOKENB  GO IF YES (NOT END!)
00097         LDD     #TIB    RESET POINTER TO START OF TIB
00098 TOKENB  SUBD    #TIB    SUBTRACT START OF BUFFER
00099         STD     TOINL   STORE CHARACTER OFFSET POINTER
00100         PSHU    X       REPUSH FLAG TO U-STACK
00101         PULS    A,B,X
00102         LDX     ,Y++
00103         JMP     [,X++]
00104 *
00105 *************************
00106 *
00107 * TOKCHK CHECKS IF AT END
00108 * OF TERMINAL INPUT 
00109 * BUFFER
00110 *
00111 *************************
00112 *
00113 TOKCHK  FDB     *+2
00114         PSHS    X
00115         PULU    X       GET TOKEN FLAG
00116         CMPX    #0      NOT END OF BUFFER?
 
 
 
 
 
 
 
 
00117         BEQ     TOKCK1  GO IF YES (NOT END!)
00118         PULS    X       BRANCH TO "NSTCHK"
00119         LDX     #OKC
00120         JMP     [,X++]
00121 TOKCK1  LDX     [CONTXT] GET LOCATION OF FIRST WORD IN
00122 *                         SEARCH LIST
00123         PSHU    X       PUSH IT TO U-STACK
00124         PULS    X       CONTINUE TO "SERCHC"
00125         LDX     ,Y++
00126         JMP     [,X++]
00127 *
00128 *************************
00129 *
00130 * ZERCHC SEARCHES THE
00131 * DICTIONARY LOOKING FOR
00132 * A KEYWORD HEADER THAT
00133 * MATCHES THE TOKEN
00134 *
00135 * IF A WORD MATCH, PUSHES
00136 * THE CFA OF THE TOKEN TO
00137 * THE U-STACK AND THEN
00138 * PUSHES A FALSE FLAG TO
00139 * THE U-STACK
00140 *
00141 * IF NO WORD MATCH, JUST
00142 * PUSHES A TRUE FLAG TO
00143 * THE U-STACK
00144 *
00145 *************************
00146 *
00147 ZERCHC  FDB     *+2
00148         PSHS    A,B,X,Y
00149 SERCH1  PULU    X       GET CURRENT NFA FROM STACK
00150         PSHU    X       RE-PUSH IT
00151         LDB     ,X      GET CHARACTER COUNT
00152         TFR     B,A     A = CHARACTER COUNT
00153         ANDA    #127    CLEAR HIGH BIT
00154         LDY     DPDP    LOAD DICTIONARY POINTER
00155         CMPA    ,Y      COMPARE CHARACTER COUNTS
00156         BNE     SERCH3  GO IF NO MATCH
00157         INCA
00158         BRA     SERCHA  GO BUMP POINTERS
00159 SERCH2  CMPA    #0      LAST CHARACTER CHKD? (WORD MATCH?)
00160         BEQ     SERCH4  GO IF YES
00161         CMPB    ,Y      COMPARE CHARACTERS
00162         BEQ     SERCHA  GO IF MATCH
00163         CMPB    #65     LESS THAN "A"?
00164         BLO     SERCH3  GO IF YES
00165         CMPB    #90     GREATER THAN "Z"?
00166         BHI     SERCH3  GO IF YES
00167         ADDB    #32     CONVERT CASE
00168         CMPB    ,Y      RECOMPARE
00169         BEQ     SERCHA  GO IF MATCH
00170 SERCH3  PULU    X       NO MATCH - GET NFA AGAIN
00171         LDB     ,X      RELOAD CHARACTER COUNT
00172         ANDB    #127    CLEAR HIGH BIT
00173         ABX
00174         LEAX    1,X     POINT TO LFA
 
 
 
 
 
 
 
 
00175         LDY     ,X      LOAD LINK
00176         CMPY    #0      LINK = 0? (NO WORD MATCH?)
00177         BEQ     SERCH5  GO IF YES (NO MATCH)
00178         PSHU    Y       SAVE LINK TO STACK
00179         BRA     SERCH1  GO COMPARE NEXT WORD
00180 SERCHA  LEAY    1,Y     BUMP CHARACTER POINTER
00181         LEAX    1,X     BUMP DICTIONARY POINTER
00182         DECA            DECREMENT CHARACTER COUNT
00183         LDB     ,X      GET NEXT CHARACTER
00184         CMPB    #97
00185         BLO     SERCH2
00186         CMPB    #122
00187         BHI     SERCH2
00188         SUBB    #32
00189         BRA     SERCH2
00190 SERCH4  PULU    X       WORD MATCH - GET NFA AGAIN
00191         LDB     ,X      RELOAD CHARACTER COUNT
00192         CMPB    #128    IS HIGH BIT SET?
00193         BLO     SERCHB  GO IF NO
00194         LDA     #1      SET IMMEDIATE MODE
00195         STA     MODE
00196         ANDB    #127    CLEAR HIGH BIT
00197 SERCHB  ABX
00198         LEAX    5,X     POINT TO CFA
00199         PSHU    X       CFA TO STACK
00200         LDX     #0      FALSE FLAG
00201         BRA     SERCH6
00202 SERCH5  LDX     #$FFFF  NO WORD MATCH - TRUE FLAG
00203 SERCH6  PSHU    X       FLAG TO STACK
00204         PULS    A,B,X,Y
00205         LDX     ,Y++
00206         JMP     [,X++]
00207 *
00208 *************************
00209 *
00210 * FNDCHK CHECKS WHETHER
00211 * TOKEN WAS FOUND IN THE
00212 * DICTIONARY
00213 *
00214 *************************
00215 *
00216 FNDCHK  FDB     *+2
00217         PSHS    X
00218         PULU    X       GET SEARCH FLAG
00219         CMPX    #0      WORD MATCHED?
00220         BNE     FNDCK1  GO IF NOT MATCHED
00221         PULS    X
00222         LDX     #STACHK
00223         JMP     [,X++]
00224 FNDCK1  PULS    X
00225         LDX     ,Y++
00226         JMP     [,X++]
00227 *
00228 *************************
00229 *
00230 * ZUMBRC IS THE NUMBER
00231 * CHECKER
00232 *
 
 
 
 
 
 
 
 
00233 * IF THE TOKEN IS NEITHER
00234 * A CARRIAGE RETURN NOR A
00235 * KEYWORD, THIS ROUTINE
00236 * ATTEMPTS TO CONVERT THE
00237 * TOKEN TO A BINARY
00238 * NUMBER USING THE
00239 * CURRENT SYSTEM NUMBER
00240 * BASE (BASEL)
00241 *
00242 * IF A SUCCESSFUL
00243 * CONVERSION OCCURS, ONE
00244 * OF TWO EVENTS CAN
00245 * RESULT: IF THE COMPILE
00246 * MODE IS IN EFFECT, A
00247 * LITERAL HANDLER
00248 * FOLLOWED BY THE NUMBER
00249 * WILL BE ADDED TO THE
00250 * KEYWORD THREADED LIST
00251 * BEING COMPILED.  IF THE
00252 * EXECUTION MODE IS IN
00253 * EFFECT, THE NUMBER IS
00254 * PUSHED TO THE STACK
00255 *
00256 * IF THE TOKEN IS NOT A
00257 * VALID NUMBER, A FALSE
00258 * FLAG ($0000) IS PUSHED
00259 * TO THE U-STACK
00260 *
00261 * IF THE TOKEN IS A VALID
00262 * 16-BIT NUMBER, A TRUE
00263 * FLAG ($FFFF) IS PUSHED
00264 * TO THE U-STACK ON TOP
00265 * OF THE 16-BIT NUMBER
00266 *
00267 * IF THE TOKEN IS A VALID
00268 * 32-BIT NUMBER, A
00269 * MODIFIED TRUE FLAG
00270 * ($00FF) IS PUSHED TO
00271 * THE U-STACK ON TOP OF
00272 * THE 32-BIT NUMBER
00273 *
00274 *************************
00275 *
00276 ZUMBRC  FDB     *+2
00277         PSHS    A,B,X,Y
00278         CLRA
00279         LDB     [DPDP]  LOAD CHARACTER COUNT
00280         TFR     D,X     MOVE COUNT TO X
00281         LDY     DPDP    LOAD TOKEN ADDRESS
00282         LEAY    1,Y     BUMP IT PAST COUNT
00283         JSR     ATONCF  GO CONVERT
00284         PULS    A,B,X,Y
00285         LDX     ,Y++
00286         JMP     [,X++]
00287 ATONCF  PSHS    A,B,X,Y SAVE ADDRESS, COUNT, AND D
00288         PSHU    X       SAVE COUNT AGAIN
00289 NBRC1   CMPX    #0      DONE?
00290         BEQ     NBRC4   GO IF YES
 
 
 
 
 
 
 
 
00291         LDA     ,Y+     GET CHARACTER & BUMP POINTER
00292         CMPA    #46     IS IT A DECIMAL POINT
00293         BNE     NBRC2   GO IF NO
00294         LEAY    -1,Y    MOVE POINTER BACK TO CHARACTER
00295         LDA     #37     PERCENT SIGN
00296         STA     ,Y      REPLACE CHARACTER
00297         BRA     NBRC3   EXIT
00298 NBRC2   LEAX    -1,X    DECREMENT CHARACTER COUNTER
00299         BRA     NBRC1   RETURN FOR NEXT CHARACTER
00300 NBRC3   LEAX    -1,X    DECREMENT CHARACTER COUNTER
00301         STX     NBRC6   SAVE IT
00302         PULU    A,B     GET ORIGINAL COUNT TO D
00303         SUBD    NBRC6   SUBTRACT CURRENT COUNT
00304         STB     DPLV1   SAVE DECIMAL POINT LOCATION
00305         BRA     NBRC5   EXIT
00306 NBRC4   PULU    X       CLEAN U-STACK
00307 NBRC5   PULS    A,B,X,Y RESTORE ADDRESS, COUNT, AND D
00308         JSR     ATONCV  GO DO NUMBER CONVERSION IN SACORE
00309         RTS
00310 NBRC6   RMB     2
00311 *
00312 *************************
00313 *
00314 * VALCHK CHECKS WHETHER
00315 * NUMBER WAS VALIDLY
00316 * CONVERTED
00317 *
00318 *************************
00319 *
00320 VALCHK  FDB     *+2
00321         PSHS    A,B,X,Y
00322         PULU    X       GET NUMBER FLAG
00323         PSHU    X       RE-PUSH IT TO STACK
00324         CMPX    #0      VALID NUMBER?
00325         BNE     VALCK1  GO IF YES
00326         JSR     NOTVAL  LOW MEMORY ROUTINE
00327         PULS    A,B,X,Y
00328         LDX     ,Y++
00329         JMP     [,X++]
00330 VALCK1  PULS    A,B,X,Y
00331         LDX     #ST2CHK
00332         JMP     [,X++]
00333         NOP
00334         NOP
00335         NOP
00336         NOP
00337         NOP
00338         NOP
00339         NOP
00340         NOP
00341         NOP
00342         NOP
00343 *
00344 *
00345 *************************
00346 *
00347 * ZQMC PROCESSES THE 
00348 * QUESTION MARK CODING
 
 
 
 
 
 
 
 
00349 *
00350 * IF THE TOKEN WAS NOT A
00351 * CARRIAGE RETURN, AN
00352 * EXISTING KEYWORD, OR A
00353 * VALID NUMBER, THE TOKEN
00354 * IS ECHO DISPLAYED TO
00355 * SCREEN FOLLOWED BY "?",
00356 * THE SYSTEM IS RESET,
00357 * AND CONTROL IS RETURNED
00358 * TO THE TERMINAL
00359 *
00360 *************************
00361 *
00362 ZQMC    FDB     *+2
00363         PSHS    X,Y
00364         LDX     $8A     DIRECT LOAD ZERO
00365         STX     BLKL    RESET SYSTEM PARAMETERS
00366         STX     STATEL  STATEL AND MODE
00367         CLR     TOINL
00368         CLR     TOINL+1
00369         LDX     MSL2
00370         LDY     #MS2
00371         JSR     TYPEF   GO TYPE " ?" MESSAGE TO SCREEN
00372         LDU     #$0600  CLEAR U-STACK
00373         PULS    X,Y
00374         LDS     #$0800  CLEAR RETURN STACK
00375         LDY     #OUTER2 RESET INNER INTERPRETER
00376         LDX     #OUTER1
00377         JMP     [,X++]
00378 MSL2    FDB     2
00379 MS2     FCC     ' ?'
00380 ZENDB   RMB     2
00381 *
00382 *************************
00383 *
00384 * ZOKENX MOVES THE TOKEN
00385 * TO THE DICTIONARY
00386 *
00387 *************************
00388 *
00389 ZOKENX  PSHS    A,B,X,Y
00390         CLR     ZTCNT   CLEAR TOKEN COUNT
00391         PULU    Y       GET BUFFER POINTER
00392         LDX     DPDP    LOAD DICTIONARY POINTER
00393         LEAX    1,X     MAKE ROOM FOR CHARACTER COUNT
00394 TOKEN1  LDA     ,Y+     FIND FIRST NON-SPACE CHARACTER
00395         CMPY    ZENDB   END OF BUFFER?
00396         BEQ     TOKEN3  GO IF YES
00397         CMPA    #32     IS IT A SPACE?
00398         BEQ     TOKEN1  GO IF YES
00399         LEAY    -1,Y    RESET FOR FIRST NON-SPACE CHAR.
00400 TOKEN2  LDA     ,Y+     LOAD CHARACTER
00401         CMPY    ZENDB   END OF BUFFER?
00402         BEQ     TOKEN3  GO IF YES
00403         CMPA    #32     IS IT TERMINATING SPACE?
00404         BEQ     TOKEN3  GO IF YES
00405         STA     ,X+     STORE TO DICTIONARY
00406         INC     ZTCNT   INCREMENT CHARACTER COUNT
 
 
 
 
 
 
 
 
00407         LDB     ZTCNT
00408         CMPB    #127    IS IT MAXIMUM COUNT?
00409         BEQ     TOKEN3  GO IF YES
00410         BRA     TOKEN2  GO FOR NEXT CHARACTER
00411 TOKEN3  PSHU    Y       PUSH BUFFER POINTER
00412         LDA     ZTCNT   LOAD TOKEN COUNT
00413         CMPA    #0      IS IT ZERO?
00414         BEQ     TOKEN4  GO IF YES
00415         LDX     DPDP    RELOAD DICTIONARY POINTER
00416         STA     ,X      STORE TOKEN COUNT
00417         LDX     #0      FALSE FLAG
00418         BRA     TOKEN5
00419 TOKEN4  LDX     #$FFFF  TRUE FLAG
00420 TOKEN5  PSHU    X       PUSH FLAG TO U-STACK
00421         PULS    A,B,X,Y
00422         RTS
00423 ZTCNT   RMB     1
00424 *
00425 *************************
00426 *
00427 * OKC TYPES THE "ok"
00428 * MESSAGE TO THE SCREEN 
00429 * WHEN THE INPUT STREAM
00430 * IS EXHAUSTED
00431 *
00432 *************************
00433 *
00434 OKC     FDB     *+2
00435         JSR     ZOKX    GO TYPE " ok" MESSAGE TO SCREEN
00436         LDS     #$0800  RESET RETURN STACK
00437         LDY     #OUTER2 ADJUST INNER INTERPRETER
00438         LDX     #OUTER1
00439         JMP     [,X++]
00440 *
00441 *************************
00442 *
00443 * STACHK CHECKS THE
00444 * SYSTEM STATE
00445 *
00446 *************************
00447 *
00448 STACHK  FDB     *+2
00449         PSHS    A
00450         LDA     STATEL  LOAD STATE
00451         CMPA    #0      IS IT ZERO?
00452         BEQ     STACK1  GO IF YES
00453         LDX     #MODCHK
00454         BRA     STACK2
00455 STACK1  LDX     #EXECUT
00456 STACK2  PULS    A
00457         JMP     [,X++]
00458 *
00459 *************************
00460 *
00461 * EXECUT EXECUTES THE
00462 * VALID KEYWORD
00463 *
00464 *************************
 
 
 
 
 
 
 
 
00465 *
00466 EXECUT  FDB     *+2
00467         CLR     MODE    SET MODE = NOT IMMEDIATE
00468         LDY     #OUTER3
00469         PULU    X       GET KEYWORD CFA
00470         JMP     [,X++]  GO DO IT!
00471 *
00472 *************************
00473 *
00474 * MODCHK CHECKS THE 
00475 * SYSTEM MODE
00476 *
00477 *************************
00478 *
00479 MODCHK  FDB     *+2
00480         PSHS    A
00481         LDA     MODE    GET MODE
00482         CMPA    #0      IS IT ZERO?
00483         BEQ     MODCK1  GO IF YES
00484         LDX     #EXECUT
00485         BRA     MODCK2
00486 MODCK1  LDX     #COMPLC
00487 MODCK2  PULS    A
00488         JMP     [,X++]
00489 *
00490 *************************
00491 *
00492 * COMPLC COMPILES THE
00493 * VALID KEYWORD'S CFA
00494 * TO THE DICTIONARY
00495 *
00496 *************************
00497 *
00498 COMPLC  FDB     *+2
00499         BSR     ZOMPLX
00500         LDY     #OUTER4
00501         LDX     #ZOKLIN
00502         JMP     [,X++]
00503 ZOMPLX  PSHS    A,B,X
00504         PULU    A,B     GET CFA
00505         LDX     DPDP    GET DICTIONARY POINTER
00506         STD     ,X++    COMPILE CFA & BUMP POINTER
00507         STX     DPDP    STORE UPDATED POINTER
00508         PULS    A,B,X
00509         RTS
00510 *
00511 *************************
00512 *
00513 * ST2CHK CHECKS THE
00514 * SYSTEM STATE
00515 *
00516 *************************
00517 *
00518 ST2CHK  FDB     *+2
00519         JMP     ST2CVK  LOW MEMORY ROUTINE
00520         NOP
00521         NOP
00522         NOP
 
 
 
 
 
 
 
 
00523         NOP
00524         NOP
00525         NOP
00526         NOP
00527         NOP
00528         NOP
00529         NOP
00530         NOP
00531         NOP
00532         NOP
00533         NOP
00534         NOP
00535         NOP
00536         NOP
00537         NOP
00538         NOP
00539         NOP
00540         NOP
00541 *
00542 *************************
00543 *
00544 * CPNUMC COMPILES THE
00545 * VALID NUMBER TO THE
00546 * DICTIONARY
00547 *
00548 *************************
00549 *
00550 ZPNUMC  FDB     *+2
00551         JSR     ZPNUMX  LOW MEMORY ROUTINE
00552         LDY     #OUTER4
00553         LDX     #ZOKLIN
00554         JMP     [,X++]
00555 ZZEND   NOP
00556         END
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
