On November, 6th, 2016, Kevin Savetz uploaded scans of the source code for Atari PILOT to archive.org. They were provided to him by the author, Harry Stewart, and here’s a reasonably accurate transcription.
                  ;
                  ; PILOT PROGRAM EQUATE FILE
                  ;
                  ; EDIT #99 -- 07-JUN-83
                  ;
      = 0000      DEBUG   = 0             ; INCLUDE DEBUG CODE IF 1, DON'T IF 0.
      = 0000      LITPEN  = 0             ; INCLUDE LIGHTPEN CODE IF 1, DON'T IF 0.
      = 0000      LOGGRP  = 0             ; INCLUDE LOGICAL OPERATORS IF 1, DON'T IF 0.
      = 0000      DOS     = 0             ; INCLUDE 'DOS' COMMAND IF 1, DON'T IF 0.
      = 0000      FALSE   = 0
                  ; COLLEEN SYSTEM I/O
      = E456      CIO     = $E456
      = E400      IOVBAS  = $E400         ; COLLEEN VECTOR BASE ADDRESS.
      = E406      EPUTC   = $E406         ; "E:" PUT CHARACTER.
      = E414      SGETC   = $E414         ; "S:" GET CHARACTER.
      = E416      SPUTC   = $E416         ; "S:" PUT CHARACTER.
      = E41A      SSPEC   = $E41A         ; "S:" SPECIAL.
      = E424      KGETC   = $E424         ; "E:" GET CHARACTER.
      = 0010      IOCBSZ  = 16            ; # OF BYTES PER IOCB.
      = 0000      IOCB0   = $00           ; CONSOLE INPUT/OUTPUT.
      = 0010      IOCB1   = IOCB0+IOCBSZ  ; (UNUSED).
      = 0020      IOCB2   = IOCB1+IOCBSZ  ; GRAPHICS INPUT & OUTPUT.
      = 0030      IOCB3   = IOCB2+IOCBSZ  ; LOAD & SAVE I/O.
      = 0040      IOCB4   = IOCB3+IOCBSZ  ; IN: & OUT: USE IOCB4 THRU IOCB7.
      = 0070      IOCB7   = 3*IOCBSZ+IOCB4
      = 0340      ICHID   = $0340         ; IOCB HANDLER I.D.
      = 0341      ICDNO   = ICHID+1       ; DEVICE #.
      = 0342      ICCOM   = ICDNO+1       ; COMMAND BYTE.
      = 0343      ICSTA   = ICCOM+1       ; STATUS BYTE.
      = 0344      ICBAL   = ICSTA+1       ; BUFFER ADDRESS (LO).
      = 0345      ICBAH   = ICBAL+1       ; BUFFER ADDRESS (HI).
      = 0346      ICRLL   = ICBAH+1       ; RECORD LENGTH (LO).
      = 0347      ICRLH   = ICRLL+1       ; RECORD LENGTH (HI).
      = 0348      ICBLL   = ICRLH+1       ; BUFFER LENGTH (LO).
      = 0349      ICBLH   = ICBLL+1       ; BUFFER LENGTH (HI).
      = 034A      ICAUX1  = ICBLH+1       ; AUX1.
      = 034B      ICAUX2  = ICAUX1+1      ; AUX2.
      = 0022      ICCOMZ  = $0022         ; ZERO PAGE IOCB COMMAND BYTE.
      = 0003      OPEN    = $03           ; OPEN COMMAND.
      = 000C      CLOSE   = $0C           ; CLOSE COMMAND.
      = 0007      GETC    = $07           ; GET CHARACTER COMMAND.
      = 000B      PUTC    = $0B           ; PUT CHARACTER COMMAND.
      = 0005      GETR    = $05           ; GET RECORD COMMAND.
      = 0009      PUTR    = $09           ; PUT RECORD COMMAND.
      = 0004      OREAD   = $04           ; OPEN DIRECTION.
      = 0008      OWRIT   = $08           ; OPEN DIRECTION.
      = 0010      SPLIT   = $10           ; SPLIT SCREEN
      = 0020      NOCLR   = $20           ; INHIBIT SCREEN CLEAR OPTION.
      = 000D      CR      = $0D           ; INTERNAL <CR> CODE
      = 001C      CUP     = $1C           ; CURSOR UP.
      = 001D      CDOWN   = $1D           ; CURSOR DOWN.
      = 001E      CLEFT   = $1E           ; CURSOR LEFT.
      = 001F      CRIGHT  = $1F           ; CURSOR RIGHT.
      = 009B      EOL     = $9B           ; ATASCII END OF LINE.
      = 007D      CLEAR   = $7D           ; MONITOR CLEAR SCREEN.
      = 00FD      BELL    = $FD           ; BELL CODE.
      = 005C      BSLASH  = $5C           ; BACKSL SLASH
      = 007C      VBAR    = $7C           ; VERTICAL BAR
      = 005B      SBRACK  = $5B           ; SQUARE BRACKET
      = 0027      SQUOTE  = $27           ; SINGLE QUOTE
      = 007F      TAB     = $7F           ; TAB.
                  ; O.S. ROM VECTORS
      = E462      XITVBV  = $E462         ; EXIT VBLANK VECTOR.
      = E45C      SETVBV  = $E45C         ; SET VECTOR ROUTINE.
                  ; O.S. DATA BASE
      = 0244      COLDST  = $0244         ; SYSTEM COLDSTART FLAG.
      = 000C      DOSINI  = $000C
      = 006A      RAMTOP  = $006A         ; TOP OF SCREEN ADDRESS (MSB).
      = 004F      COLRSH  = $004F         ; ATTRACT HUE SHIFT.
      = 004E      DRKMSK  = $004E         ; ATTRACT LUM LIMIT.
      = 02E7      MEMLO   = $02E7         ; LOWEST AVAILABLE RAM [WORD].
      = 02E5      MEMHI   = $02E5         ; HIGHEST AVAILABLE PAM [WORD].
      = 000E      APPMHI  = $000E         ; APPLICATION MEM HI [WORD].
      = 0011      BREAK   = $0011         ; BREAK KEY FLAG.
      = 02FC      CH      = $02FC         ; KEYBOARD MATRIX CODE INPUT.
      = 02F0      CRSINH  = $02F0         ; CURSOR INHIBIT FLAG.
      = 02FE      DSPFLG  = $02FE         ; CONTROL BYTE DISPLAY FLAG.
      = 0230      SDLSTL  = $0230         ; DISPLAY LIST ADDRESS.
      = 0232      SSKCTL  = $0232
      = 0012      RTCLOK  = $0012         ; 60 HZ CLOCK.
      = 0052      LMARGN  = $0052         ; SCREEN LEFT MARGIN.
      = 0053      RMARGN  = $0053         ; SCREEN RIGHT MARGIN.
      = 0055      COLCRS  = $0055         ; SCREEN COLUMN [WORD)
      = 0054      ROWCRS  = $0054         ; SCREEN ROW [BYTE)
      = 0057      DINDEX  = $0057         ; S: SCREEN MODE.
      = 0058      SAVMSC  = $0058         ; SCREEN START ADDR.
      = 02BF      BOTSCR  = $02BF         ; TEXT SCREEN SIZE.
      = 0008      WARMST  = $0008         ; WARMSTART FLAG (0 IF POWERUP).
      = 000A      DOSVEC  = $000A         ; DOS START VECTOR.
      = 026E      FINE    = $026E         ; SCROLL SELECT.
      = 026F      GPRIOR  = $026F         ; PLAYER/PLAYFIELD PRIORITY.
      = 022F      DMACT   = $022F         ; DMA CONTROL BYTE.
      = 02C0      PCOLR0  = $02C0         ; PLAYER/MISSILE COLOR.
      = 02C4      COLOR0  = $02C4         ; COLOR REGISTER 0 VALUE.
      = 0270      PADDL0  = $0270         ; PADDLE CONTROLLER 0.
      = 0278      STICK0  = $0278         ; JOYSTICK 0.
      = 027C      PTRIG0  = $027C         ; PADDLE TRIGGER 0.
      = 0284      STRIG0  = $0284         ; JOYSTICK TRIGGER 0.
      = 0234      LPENH   = $0234         ; LIGHTPEN HORIZONTAL POSITION.
      = 0235      LPENV   = $0235         ; LIGHTPEN VERTICAL POSITION.
      = 0291      TXTCOL  = $0291         ; SPLIT SCREEN TEXT COLUMN.
      = 0290      TXTROW  = $0290         ; SPLIT SCREEN TEXT ROW.
      = 02B6      INVFLG  = $02B6         ; INVERSE VIDEO FLAG FOR KEYBOARD.
      = 0200      VDSLST  = $0200         ; DISPLAY LIST INTERPRUPT.
      = 0220      CDTMV5  = $0220         ; SYSTEM TIMER VALUE.
      = 0224      VVBLKD  = $0224         ; DEFERRED VBLANK ROUTINE.
      = 02FF      SSFLAG  = $02FF         ; START/STOP FLAG.
                  ; PILOT ERROR CODES
      = 0080      NS      = $80           ; "NOT A SYNTAX ERROR" FLAG.
      = 0001      RDYTXT  = 1             ; READY.
      = 0081      EOPERR  = 1+NS          ; END OF PROGRAM STORAGE REACHED DURING RUN.
      = 0081      AUTOXT  = 1+NS          ; EXIT AUTO-INPUT MODE.
      = 0002      CNDERR  = 2             ; CONDITION FIELD ERROR (':' EXPECTED).
      = 0002      NSTERR  = 2             ; GRAPHICS SUB-COMMAND NESTING ERROR.
      = 0081      ENDERR  = 1+NS          ; USE STACK EMPTY ON END COMMAND.
      = 0002      JNKERR  = 2             ; JUNK AT END OF STATEMENT.
      = 0086      IOERR   = 6+NS          ; I/O ERROR.
      = 0002      IVCERR  = 2             ; INVALID COMMAND.
      = 0002      ATMERR  = 2             ; INVALID ATOM SYNTAX.
      = 0002      IMPERR  = 2             ; IMPROPER COMMAND PARAMETER.
      = 0089      INSERR  = 9+NS          ; INSUFFICIENT STORAGE FOR OPERATION.
      = 0087      ABTERR  = 7+NS          ; OPERATOR ABORT.
      = 000A      UNDERR  = 10            ; UNDEFINED LABEL OPERAND.
      = 008B      USOERR  = 11+NS         ; USE STACK OVERFLOW.
      = 0002      EXPERR  = 2             ; EXPRESSION ERROR.
      = 008C      INTERR  = 12+NS         ; INTERNAL BUG ERROR.
      = 008D      LNOERR  = 13+NS         ; LINE # OUT OF RANGE.
                  ;         14              IS RESERVED.
      = 000F      OLLERR  = 15            ; OVERLENGTH INPUT LINE.
                  ;         16-21           ARE RESERVED.
      = 0096      FILERR  = 22+NS         ; TOO MANY IN/OUTS.
      = 0017      SIGNON  = 23            ; POWEP-UP SIGN-ON MESSAGE.
      = 0018      TRCMES  = 24            ; TRACE PREAMBLE.
      = 0008      ASTMES  = 8             ; ASTERISKS.
      = 0083      NRCERR  = 3+NS          ; NOT CORRECT COMMAND MODE.
      = 0084      DIVERR  = 4+NS          ; DIVIDE BY ZERO.
      = 0085      SCNERR  = 5+NS          ; SCREEN MODE CONFLICT.
      = 0099      CNTERR  = 25+NS         ; CAN'T CONTINUE.
      = 009A      STPMES  = 26+NS         ; STOP.
      = 009B      RENERR  = 27+NS         ; CAN'T RENUMBER
      = 009C      OVLPER  = 28+NS         ; OVERLAPPING RANGE.
      = 009D      TOMES   = 29+NS         ; " TO ".
      = 009E      NCHGMS  = 30+NS         ; PROGRAM IS UNCHANGED.
      = 009F      DELMES  = 31+NS         ; "YOU ARE ABOUT TO DELETE ".
      = 00A0      DL2MES  = DELMES+1      ; LINES.<CR>ARE YOU SURE?".
      = 0021      SPTERR  = 33            ; NO SPLIT SCREEN.
      = 0022      MODERR  = 34            ; INVALID GRAPHICS MODE.
      = 00A4      FSOFER  = 36+NS         ; FLOOD STACK OVERFLOW.
      = 0025      NMCERR  = 37            ; NO MORE COLORS.
      = 0026      DCAERR  = 38            ; DOUBLE COLOR ASSIGN.
                  ; ATOM IDENTIFIER CODES (PRODUCED BY 'ATOM')
      = 0001      NULL    = 1             ; NULL ATOM.
      = 0002      NUM     = 2             ; NUMERIC CONSTANT.
      = 0004      NVAR    = 4             ; NUMERIC VARIABLE OR POINTER TO WORD.
      = 0008      SVAR    = 8             ; STRING VARIABLE.
      = 0010      USVAR   = 16            ; UNDEFINED STRING VARIABLE.
      = 0020      TEXT    = 32            ; TEXT.
      = 0040      OPR     = 64            ; OPERATOR.
      = 0080      BPTR    = 128           ; POINTER TO BYTE.
                  ; GRAPHICS OPERATORS
      = 0011      FILL    = $11
      = 0012      FILLTO  = $12
      = 0009      DRAW    = $09
      = 000A      DRAWTO  = $0A
      = 0005      GO      = $05
      = 0006      GOTO    = $06
                  ; EDGE DETECT STATUS BITS
      = 0008      ELEFT   = 8             ; LEFT EDGE.
      = 0004      ERIGHT  = 4             ; RIGHT EDGE.
      = 0002      EBOTOM  = 2             ; BOTTOM EDGE.
      = 0001      ETOP    = 1             ; TOP EDGE.
                  ; PILOT CONFIGURATION PARAMETERS.
      = 0030      USTKSZ  = 48            ; 24 LEVELS IN USE STACK.
      = 0002      ELEVEL  = 2             ; # OF EXPRESSION STACK () LEVELS.
      = 000E      ESTKSZ  = 4*ELEVEL+6    ; EXPRESSION STACK SIZE.
      = 00FE      ACCLNG  = 254           ; ACCEPT BUFFER LENGTH.
      = 00FE      TEXLNG  = 254           ; TEXT EXPRESSION BUFFER LENGTH.
      = 007A      LINLNG  = 122           ; COMMAND/ACCEPT INPUT LINE LENGTH.
      = 270F      MAXLN   = 9999          ; MAXIMUM PROGRAM LINE NUMBER.
      = 0004      AUREGS  = 4             ; 4 AUDIO REGISTERS.
      = 0007      SCNMOD  = 7             ; 4 COLOR, 160 * 96.
      = 000F      DNSIZE  = 15            ; DEVICE/FILENAME MAXIMUM LENGTH.
      = 0028      TCOL    = 40            ; TEXT SCREEN # OF COLUMNS.
      = 0018      TROW    = 24            ; TEXT SCREEN # OF ROWS.
      = 000A      INBFSZ  = 10            ; MAXIMUM SUBCOMMAND LENGTH.
                  ; HARDWARE EQUATES
      = D200      AUDF1   = $D200         ; AUDIO #1 FREQUENCY DIVIDER.
      = D201      AUDC1   = AUDF1+1       ; AUDIO #1 TYPE/VOLUME.
      = D20F      SKCTL   = $D20F         ; SERIAL PORT CONTROL.
      = D20F      SKSTAT  = $D20F         ; SERIAL PORT STATUS.
      = D208      AUDCTL  = $D208         ; AUDIO CONTROL REGISTER.
      = D302      PACTL   = $D302         ; PIA CASSETTE CONTROL.
      = 0034      CASSON  = $34           ; CASSETTE ON.
      = 003C      CASSOF  = $3C           ; CASSETTE OFF.
      = D20A      PKYRND  = $D20A         ; POKEY RANDOM NUMBER.
      = D01F      CONSOL  = $D01F         ; START/SELECT/OPTION KEY READ.
      = D400      DMACTL  = $D400         ; DMA CONTROL REG.
      = D407      PMBASE  = $D407         ; PLAYER/MISSILE BASE ADDRESS REGISTER.
      = D010      GRAFP3  = $D010         ; PLAYER 3 DATA.
      = D01D      GRACTL  = $D01D         ; GRAPHICS CONTROL REG.
      = D00B      SIZEP3  = $D00B         ; PLAYER 3 SIZE.
      = D000      HPOS0   = $D000         ; PLAYER POSITIONS.
      = D017      COLPF1  = $D017         ; PLAYFIELD 1 COLOR.
      = D018      COLPF2  = $D018         ; PLAYFIELD 2 COLOR.
      = D40A      WSYNC   = $D40A         ; WAIT FOR SYNC.
      = D40E      NMIEN   = $D40E         ; NMI ENABLE.
                  ; COLOR EQUATES
      = 0042      CRED    = $42
      = 0084      CBLUE   = $84
      = 001A      CYELLO  = $1A
      = 0001      CBLACK  = $01
                  ; MISCELLANEOUS
      = 0080      PCUP    = 128           ; PEN = 'UP'.
      = 0040      PCDN    = 64            ; PEN = 'DOWN'.
      = 0000      LSMLL   = 0             ; LETTERS = 'SMALL'.
      = 0001      LMED    = 1             ; LETTERS = 'MEDIUM'.
      = 0002      LLRG    = 2             ; LETTERS = 'LARGE'.
      = 0001      EWRAP   = 1             ; EDGE = 'WRAP'.
      = 0002      EHALT   = 2             ; EDGE = 'HALT'.
      = 0004      EBNC    = 4             ; EDGE = 'BOUNCE'.
      = 0008      EFREE   = 8             ; EDGE = 'FREE'.
                  ; ALGORITHMS REQUIRE KOFF=0, KON=1.
      = 0000      KOFF    = 0             ; 'OFF'.
      = 0001      KON     = 1             ; 'ON'.
      = FFFF      EONMLS  = $FFFF         ; END OF 'NMSBUF' LIST.
      = 00DF      UC      = $DF           ; LOWER -> UPPER CASE.
      = 0020      LC      = $20           ; UPPER -> LOWER CASE.
      = 00FF      UP      = $FF           ; FLOOD DIRECTIONS.
      = 0001      DOWN    = 1
      = 0001      STRTKY  = 1             ; CONSOLE KEY DEFS.
      = 0002      SELKEY  = 2
      = 0004      OPTKEY  = 4
      = 0007      ANYKEY  = STRTKY+SELKEY+OPTKEY
      = 0001      TXSL    = 1             ; SCREEN MODE = TEXT, SMALL LETTERS.
      = 0002      TXML    = 2             ; SCREEN MODE = TEXT, MEDIUM OR LARGE LETTERS.
      = 0004      GRSS    = 4             ; SCREEN MODE = GRAPHICS, SPLIT.
      = 0008      GRFS    = 8             ; SCREEN MODE = GRAPHICS, FULL.
                  ; 'NAME' TYPES.
      = 0080      ATRSTR  = $80           ; 'STRING' VARIABLE.
      = 0040      ATRNUM  = $40           ; 'NUMERIC' VARIABLE.
      = 0020      ATRIO   = $20           ; 'I/O' DEVICE.
      = 0000      ATRLIN  = 0             ; STATEMENT 'LINE'.
                  ; RESERVED COMMAND 'TOKENS' AND 'USRTAB' SIZE.
      = 00FE      TKNCNT  = $FE           ; COMMAND CONTINUATION.
      = 00FF      TKNNUL  = $FF           ; NULL COMMAND.
                  ; ROBOT TURTLE DRIVER COMMANDS.
      = 0000      RBOFF   = 0             ; 'ROBOT OFF'.
      = 0020      RBON    = $20           ; 'ROBOT ON'.
      = 0001      RBEYES  = 1             ; 'EYES'.
      = 0002      RBPEN   = 2             ; 'RPEN'.
      = 0003      RBHORN  = 3             ; 'HORN'.
      = 0080      RBFWD   = $80           ; 'GO +'.
      = 0081      RBBACK  = $81           ; 'GO -'.
      = 0040      RBLEFT  = $40           ; 'TURN +'.
      = 0041      RBRGHT  = $41           ; 'TURN -'.
                  ; LOAD TYPES.
      = 0001      KLOAD   = 1
      = 0002      KMERGE  = 2
      = 0003      KAPPND  = 3
                  ;
                  ; PILOT DATA BASE.
                  ;
0000  = 0080              ORG     $0080
      = 0080      DTAB    = *            ; BASE ADDRESS FOR DXXXI UTILITIES & OTHERS.
0080  = 0004      INLN    DS 4           ; INPUT LINE POINTER.
0084  = 0002      NXTLN   DS 2           ; NEXT LINE POINTER (RUN MODE).
0086  = 0001      ACOLR2  DS 1           ; AUTO-NUMBER COLOR REGISTER 2.
0087  = 0001      ACOLR1  DS 1           ; AUTO-NUMBER COLOR REGISTER 1.
0088  = 0004      ACLN    DS 4           ; ACCEPT LINE POINTER.
008C  = 0004      TELN    DS 4           ; TEXT EXPRESSION RESULT POINTEP.
0090              TABADR
0090  = 0002      TBLBAS  DS 2           ; COMMAND TABLE POINTER.
0092  = 0001      EXEC    DS 1           ; 0 = SYNTAX CHECK, ELSE EXECUTE (FOR X-ROUTINES).
0093  = 000E      EXPSTK  DS ESTKSZ      ; EXPRESSION STACK.
00A1  = 0006      TEMP    DS 6           ; TEMPORARY STORAGE FOR BOTTOM LEVEL ROUTINES.
00A7  = 0004      TEMP2   DS 4           ; MORE TEMPORARY STORAGE.
00AB  = 0003      XTEMP   DS 3           ; TEMPORARY STORAGE FOR X-ROUTINES.
00AE  = 0002      S1L     DS 2           ; DYNAMIC STORAGE AREA LIMITS.
00B0  = 0002      S1H     DS 2
00B2  = 0002      S2L     DS 2
00B4  = 0002      S2H     DS 2
00B6  = 0002      POINT   DS 2           ; 'ATOM' RETURN PARAMETER & 'PSF' WORK POINTER.
00B8  = 0002      NUMBER  DS 2           ; 'ATOM' RETURN PARAMETER & 'PSTOP' ERROR # SAVE.
00BA  = 0004      LP      DS 4           ; STRING PACKAGE LIST POINTER.
00BE  = 0004      NP      DS 4           ;                NAME POINTER.
00C2  = 0004      DP      DS 4           ;                DATA POINTER.
00C6  = 0004      MP      DS 4           ;                PATTERN MATCH POINTER.
00CA  = 0004      SP      DS 4           ;                SOURCE POINTER (BOTTOM LEVEL).
00CE  = 0004      PP      DS 4           ;                PATTERN POINTER (BOTTOM LEVEL).
00D2  = 0002      MEMA    DS 2           ; MEMORY MANAGEMENT ADDRESS PARAMETER.
00D4  = 0002      MEMB    DS 2           ;                   BYTE COUNT PARAMETER.
00D6  = 0002      MSP     DS 2           ;                   SOURCE POINTER.
00D8  = 0002      MDP     DS 2           ;                   DESTINATION POINTER.
00DA  = 0002      MBC     DS 2           ;                   WORKING BYTE COUNT.
00DC  = 0002      LINENO  DS 2           ; STATEMENT LINE # (MUST BE IN ZERO PAGE).
00DE  = 0002      LS      DS 2           ; 'XLIST' START LINE #, 'XGRAPH' ITERATION COUNT & 'SCNDEV '.
00E0  = 0002      LEND    DS 2           ; 'XLIST' END LINE 'GMOVE' REGISTER SAVE & 'SCNDEV'.
00E2              MFDEL                  ; MATCH FIELD DELIMITER (',' OR '|'.
00E2  = 0002      ACC     DS 2           ; WORKING NUMERIC ACCUMULATOR.
00E4  = 0002      IOSTAT  DS 2           ; COLLEEN I/O ERROR STATUS [WORD].
00E6  = 0003      GXNEW   DS 3           ; GRAPHICS NEXT POSITION (LSB,MSB,FRACTION).
00E9  = 0003      GYNEW   DS 3           ;
00EC  = 0003      GX      DS 3           ; GRAPHICS X POSITION (LSB,MSB,FRACTION).
00EF  = 0003      GY      DS 3           ; GRAPHICS Y POSITION (LSB,MSB,FRACTION).
00F2  = 0002      THETA   DS 2           ; POLAR ANGLE.
00F4  = 0002      FSTACK  DS 2           ; FLOOD STACK POINTER, & 'SETCLR' TEMP.
00F6  = 0002      ADRESS  DS 2           ; FLOOD SCREEN POINTER 'SSAVE', 'SLOAD' & 'NEWDRW' TEMP.
00F8  = 0002      TRADDR  DS 2           ; TURTLE REP. ADDRESS FOR VBLANK PROCESS.
00FA  = 0002      ALINE   DS 2           ; AUTO-INPUT & RENUMBER LINE NUMBER & TEMP.
00FC  = 0002      AINC    DS 2           ; AUTO-INPUT & RENUMBER LINE INCREMENT.
00FE  = 0001      MATCHF  DS 1           ; MATCH RESULT (0 = FALSE, ELSE MATCH FIELD #).
00FF  = 0001      RUN     DS 1           ; 0 = IMMEDIATE MODE, ELSE RUN MODE.
                  ; REDEFINES OF VARIABLES FOR GRAPHICS USE
      = 00BE      GX1     = NP            ; END    X [3 BYTES].
      = 00C1      GY1     = GX1+3         ; END    Y [3 BYTES].
      = 00C4      GX2     = GY1+3         ; START  X [3 BYTES].
      = 00C7      GY2     = GX2+3         ; START  Y [3 BYTES].
      = 00CA      DELX    = GY2+3         ; DELTA  X [2 BYTES].
      = 00CC      DELY    = DELX+2        ;        Y [2 BYTES].
      = 00CE      GACC    = DELY+2        ; WORKING ACCUMULATOR [4 BYTES].
      = 00D2      GTEMP   = GACC+4        ;         TEMP [4 BYTES).
      = 00D6      GTEMP2  = GTEMP+4       ;         TEMP [4 BYTES].
      = 0093      DELTAR  = EXPSTK        ; DRAW DELTA Y[2].
      = 0095      DELTAC  = DELTAR+2      ; DRAW DELTA X[2].
      = 0097      ROWINC  = DELTAC+2      ; FILL Y INC. [1].
      = 0098      ROWAC   = ROWINC+1      ; DRAW Y ACC. [2].
      = 009A      COLAC   = ROWAC+2       ; DRAW X ACC. [2].
      = 009C      COUNTR  = COLAC+2       ; DRAW COUNTER [2].
      = 009E      ENDPT   = COUNTR+2      ; DRAW E [2].
                  ; REDEFINES OF 'EXPSTK' FOR EDIT COMMANDS.
      = 0093      BLOW    = EXPSTK        ; LOW BRACKET ADDRESS.
      = 0095      BHIGH   = EXPSTK+2      ; HIGH.
      = 0097      BNUM    = EXPSTK+4      ; # OF LINES IN RANGE.
      = 0099      RTMP    = EXPSTK+6      ; RENUMBER TEMP.
      = 009B      R2TMP   = EXPSTK+8      ; ".
0100  = 0500              ORG     $0500
0500  0000        USRTAB  DW 0            ; USER EXTENDABLE COMMAND TABLE.
                                          ; (MSBYTE = 0 IF UNUSED).
0502  0000        RBVECT  DW 0            ; ADDRESS OF ROBOT TURTLE DRIVER.
                                          ; (MSBYTE = 0 IF UNUSED).
0504  = 0002      IOEDIS  DS 2            ; I/O ERROR STOP DISABLE.
                                          ; EXTRA BYTE TO PROTECT AGAINST WORD POKE.
0506  = 0001      EXECF   DS 1           ; CONDITION RESULT (0 = NO EXECUTE, ELSE EXECUTE).
0507  = 0003      XJUMP   DS 3            ; FIRST BYTE = JMP COMMAND (X-ROUTINES).
050A  = 0003      GJUMP   DS 3            ; FIRST BYTE = JMP COMMAND (G-ROUTINES).
050D  = 0003      SJUMP   DS 3            ; FIRST BYTE = JMP COMMAND ('SOP').
0510  = 0001      CTABAT  DS 1           ; 'ATTMBYTE' BYTE FROM 'CMATCH'.
0511  = 0001      DIGIT   DS 1
0512  = 0001      SAVYR   DS 1           ; 'MLOOP' SAVE Y REGISTER.
0513  = 0001      PEN     DS 1           ; GRAPHICS PEN SELECT.
0514  = 0001      GRFLAG  DS 1           ; GRAPHICS MODE FLAG (0=NOT GRAPHICS, ELSE GRAPHICS).
0515  = 0008      AUDIOR  DS AUREGS+AUREGS ; AUDIO VARIABLE POINTERS.
051D  = 0001      AUX1    DS 1           ; I/O AUX1 OVERRIDE BYTE.
051E  = 0001      AUX2    DS 1           ; I/O AUX2 OVERRIDE BYTE.
051F  = 0001              DS 1           ; 'OPNBUF'-1 USED BY 'SCNDEV'.
0520  = 0010      OPNBUF  DS DNSIZE+1    ; DEVICE NAME BUFFER FOR OPEN.
0530  = 0002      CDEST   DS 2           ; 'CHOT' DESTINATION IDENTIFIER & SAVE BYTE.
0532  = 0001      LOADFG  DS 1           ; 0 IF NOT LOADING, ELSE LOADING.
0533  = 0002      MATCHX  DS 2           ; 'XMATCH' FIELD INDEX VALUES.
0535  = 0001      TRACE   DS 1           ; RUN-TIME TRACE FLAG (TRACE IF <> 0).
0536  = 0001      AUTOIN  DS 1           ; AUTO-INPUT FLAG (ACTIVE IF <> 0).
0537  = 0001      GSMODE  DS 1           ; GRAPHICS SCREEN MODE.
0538  = 000A      INLNBF  DS INBFSZ      ; TEMP STORAGE FOR SOURCE TO MATCH.
0542  = 0001      NAMLNG  DS 1           ; 'SAVIT' & 'RESIT'.
0543  = 0001      NOCONT  DS 1                    ; 0 IF CONTINUE O.K.
0544  = 0001      CONKEY  DS 1                    ; 1=START, 2=SELECT, 4=OPTION.
0545  = 0001      SGLSTP  DS 1                    ; SINGLE STEP IF .NE. 0.
0546  = 0001      AXFLAG  DS 1                    ; 1 IF ACCEPT LITERAL.
0547  = 0001      AKFLAG  DS 1                    ; 1 IF ACCEPT KEY.
0548  = 0001      XXXX    DS 1                    ; 'SCNDEV' & 'PSTOP' USE.
0549  = 0004      GNUMB   DS 4                    ; GRAPHICS WORKING STORAGE & "XACCPT' TEMPORARY.
054D  = 0001      USTKP   DS 1                    ; USE STACK POINTER (0 - N*2).
054E  = 0001      ESTKP   DS 1                    ; EXPRESSION STACK POINTER.
054F  = 0001      TRTLON  DS 1                    ; DIVISIBLE TURTLE OFF, ELSE ON.
0550  = 0001      TRTSNS  DS 1                    ; VISIBLE TURTLE SENSOR STATE.
0551  = 0001      LETTRSZ DS 1                    ; TEXT LETTER SIZE: 0,1 OR 2.
0552  = 0001      SPLTSC  DS 1                    ; 0=FULL GRAPHICS, $10 = SPLIT SCREEN.
      = 000A      NMBFSZ  =  5*2                  ; 'MNYNMS' BUFFER SIZE.
0553  = 000A      NMSBF   DS NMBFSZ
055D  = 0001      SPEED   DS 1                    ; SPEED CONTROL.
055E  = 0001      EDGRUL  DS 1                    ; TURTLE EDGE RULE.
055F  = 0001      TRYPOS  DS 1                    ; VISIBLE TURTLE Y POSITION.
0560  = 0001      ORIENT  DS 1                    ; VISIBLE TURTLE ORIENTATION.
0561  = 0002      XC      DS 2                    ; SCREEN CENTER X.
0563  = 0002      YC      DS 2                    ; SCREEN CENTER Y.
0565  = 0001      CSTATE  DS 1                    ; CONSOLE KEY READ STATE.
0566  = 0001      ATRTYP  DS 1                    ; 'NAME' ATTRIBUTE FOR 'IFIND'.
0567  = 0001      DMPTYP  DS 1                    ; ATTRIBUTE FOR DUMP CODE.
0568  = 0001      TKNTYP  DS 1                    ; TOKENIZED COMMAND
0569  = 0001      LSTKN   DS 1                    ; TOKEN FROM PREVIOUS STATEMENT FOR ': CONTINUATION'.
056A  = 0001      TKNOFF  DS 1                    ; OFFSET PAST COMMAND.
056B  = 0030      USESTK  DS USTKSZ               ; USE STACK.
059B  = 0001      FCOLOR  DS 1                    ; 'FLOOD' COLOR
059C  = 0001      FLDCLR  DS 1                    ; FIELD COLOR TO BE FLOODED.
059D  = 0001      MSKTMP  DS 1                    ; TEMP MASKED DATA.
059E  = 0001      ROWFLG  DS 1                    ; ROW FLAG.
059F  = 0001      COLFLG  DS 1                    ; COLUMN FLAG.
05A0  = 0001      SAVROW  DS 1                    ; SAVED STARTING ROW.
05A1  = 0002      SAVCOL  DS 2                    ; SAVED STARTING COLUMN.
05A3  = 0002      LFTCOL  DS 2                    ; LEFT COLUMN VALUE.
05A5  = 0002      NEWLC   DS 2                    ; NEW LEFT COLUMN.
05A7  = 0002      RGTCOL  DS 2                    ; RIGHT COLUMN VALUE.
05A9  = 0002      NEWRC   DS 2                    ; RIGHT COLUMN.
05AB  = 0001      MAXROW  DS 1                    ; MAXIMUM ROW VALUE.
05AC  = 0002      MAXCOL  DS 2                    ; MAXIMUM COLUMN VALUE.
05AE  = 0002      MLTTMP  DS 2                    ; MULTIPLY TEMP.
05B0  = 0001      SHFAMT  DS 1                    ; SHIFT AMOUNT.
05B1  = 0001      DMASK   DS 1
05B2  = 0001      FINEFG  DS 1                    ; 0 = COARSE SCROLL, -1 = FINE.
05B3  = 0002      CETEMP  DS 2                    ; 'COMPRS'/'EXPAND' TEMPORARY.
05B5  = 0001      LFCOL   DS 1                    ; T: LEFT MOST COLUMN.
05B6  = 0001      RGCOL   DS 1                    ; T: RIGHT MOST COLUMN.
05B7  = 0001      PENNUM  DS 1                    ; PEN NUMBER.
05B8  = 0001      PENCOL  DS 1                    ; PEN COLOR.
05B9  = 0001      NCOLRS  DS 1                    ; NUMBER OF COLORS ALLOWED.
05BA  = 0001      NXTCLR  DS 1                    ; NEXT AVAILA8LE COLOR SLOT.
05BB              PNCLRS                          ; PEN COLORS.
05BB  = 0001      BAKCLR  DS 1                    ; BACKGROUND COLOR.
05BC  = 0008              DS 8                    ; FOREGROUND COLORS.
05C4  = 0001      TRTCOL  DS 1                    ; TURTLE COLOR.
05C5  = 0001      RBTON   DS 1                    ; 0=ROBOT TURTLE OFF, ELSE ON.
05C6  = 0001      RBTSNS  DS 1                    ; ROBOT SENSOR STATE.
05C7  = 0001      RBTCMD  DS 1                    ; INTERNAL ROBOT COMMAND.
05C8  = 0002      RBTPRM  DS 2                    ; INTERNAL ROBOT PARAMETER.
05CA  = 0001      INDENT  DS 1                    ; AUTO INDENT.
05CB  = 0001      SCTEMP  DS 1                    ; 'SETCLR' TEMP.
05CC  = 0001      PRTEMP  DS 1                    ; 'PRCLNM' TEMP.
05CD  = 0002      WALLS   DS 2                    ; WALL SELECTION DATA.
05CF  = 0002      GCOL    DS 2                    ; TURTLE COLUMN POSITION.
05D1  = 0001      GROW    DS 1                    ; TURTLE ROW POSITION.
05D2  = 0002      GANGLE  DS 2                    ; TURTLE THETA.
05D4  = 0001      GROPR   DS 1                    ; GRAPHICS OPERATION TYPE.
05D5  = 0001      HITWLL  DS 1                    ; 0 = NO WALL HIT, ELSE WALL HIT.
05D6  = 0001      HITEDG  DS 1                    ; 0 = NO EDGE HIT, ELSE EDGE HIT.
05D7  = 0001      HALTFG  DS 1                    ; NON-ZERO = HALT AT EDGE.
05D8  = 0001      GRTEMP  DS 1                    ; 'GREAD' TEMP.
05D9  = 0001      TUFLAG  DS 1                    ; TURTLE PARAMETER UPDATE INTERLOCK.
05DA  = 0001      LITMAT  DS 1                    ; NON-ZERO = LITERAL MATCH.
05DB  = 0001      NOPLOT  DS 1                    ; NON-ZERO = DON'T PUT POINT.
05DC  = 0002      DSISAV  DS 2                    ; VALUE OF ORIGINAL 'DOSINI'.
05DE  = 0002      DSVSAV  DS 2                    ; VALUE OF ORIGINAL 'DOSVEC.
05E0  = 0001      DMASAV  DS 1                    ; 'DMACT' SAVE VALUE FOB TV ON/OFF.
      = 011F      SPARES  = $700-*                ; *** THIS HAD BETTER BE POSITIVE ***
05E1  = BC00              ORG $BC00
BC00  = 00FF      TEXBUF  DS TEXLNG+1    ; TEXT EXPRESSION BUFFER.
BCFF  = 0001              DS 1           ; ONE EXTRA LEADING BLANK FOR AUTO-IN.
BD00  = 007B      COMBUF  DS LINLNG+1    ; COMMAND INPUT BUFFER.
BD7B  = 0100      ACCBUF  DS 256         ; ACCEPT BUFFER.
BE7B  = 0101      NAMBUF  DS 257         ; STRING NAME BUFFER.
                  ;
                  ; NOTE: THE USE OF THE TERM '(BRA)' IN A COMMENT INDICATES THAT THE
                  ; PARTICULAR BRANCH INSTRUCTIONS USED WILL ALWAYS BRANCH IN THE
                  ; PARTICULAR CIRCUMSTANCES, THE BRANCH IS SUPPOSED TO BE A TWO BYTE
                  ; JUMP.
                  ;
                  ; POWER-UP ROUTINE AND INITIALIZATION
BF7C  = 7700              ORG $7700
7700              PILLOW                          ; PILOT LOW ADDRESS
7700              TPBUFF                          ;
      = 770C      TVBUFF  = TPBUFF+12             ; VISIBLE REGION.
      = 7705      TRBUFF  = TVBUFF-7              ; INCLUDES UNDERFLOW.
7700  = 7800              ORG TPBUFF+256          ; TURTLE REP. BUFFER.
      = 0000              IF      DOS
   -                      LDA     #0              ; CLEAR COLDSTART FLAG (SEE 'XDOS').
   -                      STA     COLDST
   -                      JMP     MLE             ; RETURN FROM DOS.
                          ENDIF
7800                      PROC
7800  A508        PILINI  LDA     WARMST          ; WARM START?
7802  D015 ^7819          BNE     :PI020          ; YES.
7804  A50C                LDA     DOSINI          ; SAVE ORIGINAL 'DOSINI'.
7806  8DDC05              STA     DSISAV
7809  A50D                LDA     DOSINI+1
780B  8DDD05              STA     DSISAV+1
780E  A900                LDA     # LOW PILINI    ; PLUG IN NEW 'DOSINI'.
7810  850C                STA     DOSINI
7812  A978                LDA     # HIGH PILINI
7814  850D                STA     DOSINI+1
      = 0000              IF      DOS
   -                      LDA     DOSVEC          ; SAVE ORIGINAL 'DOSVEC'.
   -                      STA     DSVSAV
   -                      LDA     DOSVEC+1
   -                      STA     DSVSAV+1
                          ENDIF
7816  4C1C78              JMP     :PI030
7819  202578      :PI020  JSR     GODOS           ; PERFORM DOS INIT.
781C  A9C3        :PI030  LDA     # LOW MLE       ; CHANGE 'DOSVEC' FOR PILOT ENTRY.
781E  850A                STA     DOSVEC
7820  A978                LDA     # HIGH MLE
7822  850B                STA     DOSVEC+1
7824  60                  RTS
7825  6CDC05      GODOS   JMP     (DSISAV)        ; 2ND HALF OF JSR (DSISAV).
7828                      PROC
7828  A906        INIT    LDA     #EPUTC-IOVBAS   ; ESTABLISH 'CHOT' DESTINATION AS 'E:'
782A  8D3005              STA     CDEST
782D  A508                LDA     WARMST          ; WARM START?
782F  D037 ^7868          BNE     :INI15          ; YES?
7831  A280                LDX     #$80            ; CLEAR UPPER HALF OF PAGE ZERO.
7833  A900                LDA     #0
7835  9500        :INI10  STA     0,X
7837  E8                  INX
7838  D0FB ^7835          BNE     :INI10          ; CONTINUE TILL PAGE WRAP POINT.
783A  A94C                LDA     #$4C            ; PUT JMP OP-CODE IN JUMP VECTORS.
783C  8D0705              STA     XJUMP+0
783F  8D0A05              STA     GJUMP+0
7842  8D0D05              STA     SJUMP+0
7845  A916                LDA     #$16            ; AUTO-NUMBER SCREEN = DARK YELLOW
7847  8586                STA     ACOLR2
7849  A900                LDA     #$00            ; AUTO-NUMBER LETTERS = BLACK.
784B  8587                STA     ACOLR1
      = 0000              IF      FALSE
   -                      LDA     # LOW PRGEND    ; SET 'MEMLO' AFTER END OF PROGRAM.
   -                      STA     MEMLO
   -                      LDA     # HIGH PRGEND
   -                      STA     MEMLO+1
                          ENDIF
784D  ADE702              LDA     MEMLO           ; ESTABLISH MEMORY LIMITS FOR ALLOCATION.
7850  85AE                STA     S1L             ; ... & PROGRAM STORAGE AREA.
7852  ADE802              LDA     MEMLO+1
7855  85AF                STA     S1L+1
7857  20C087              JSR     CLRPRG
785A  ADE502              LDA     MEMHI           ; ALSO FOR STRING STORAGE AREA.
785D  85B4                STA     S2H
785F  85B2                STA     S2L
7861  ADE602              LDA     MEMHI+1
7864  85B5                STA     S2H+1
7866  85B3                STA     S2L+1
7868  A2B4        :INI15  LDX     # HIGH PILVBL   ; INTERCEPT VBLANKS.
786A  A091                LDY     # LOW PILVBL
786C  A907                LDA     #7              ; VVBLKD.
786E  205CE4              JSR     SETVBV
7871  A900                LDA     #0              ; ZERO ...
7873  8D3205              STA     LOADFG          ; ... LOAD FLAG ...
7876  8D3505              STA     TRACE           ; ... TRACE FLAG ...
7879  8D3605              STA     AUTOIN          ; ... AUTO-INPUT FLAG ...
787C  8D1D05              STA     AUX1            ; ... I/O AUX1 ...
787F  8D1E05              STA     AUX2            ; ... I/O AUX2 ...
7882  85FE                STA     MATCHF          ; ... & MATCH RESULT.
7884  8D1005              STA     CTABAT          ; ... LAST COMMAND ATTRIBUTES.
7887  8DC505              STA     RBTON           ; ... ROBOT TURTLE.
788A  8D5D05              STA     SPEED           ; FULL SPEED.
788D  8DB205              STA     FINEFG          ; COARSE SCROLLING.
7890  8DE005              STA     DMASAV
7893  A97B                LDA     # LOW ACCBUF    ; SET ACCEPT BUFFER POINTER.
7895  8588                STA     ACLN
7897  A9BD                LDA     # HIGH ACCBUF
7899  8589                STA     ACLN+1
789B  20729F              JSR     NULACC          ; SET ACCEPT BUFFER TO NULL.
789E  A900                LDA     # LOW TEXBUF    ; SETUP TEXT EXPRESSION BUFFER POINTER.
78A0  858C                STA     TELN
78A2  A9BC                LDA     # HIGH TEXBUF
78A4  858D                STA     TELN+1
78A6  A920                LDA     #' '            ; LEADING BLANK FOR AUTO-IN.
78A8  8DFFBC              STA     COMBUF-1
78AB  20E1A5              JSR     TRTINI          ; INITIALIZE VISIBLE TURTLE STUFF.
78AE  2050B3              JSR     PBINIT          ; ... ROBOT TURTLE ('OFF' IN 'MLE').
78B1  209E98              JSR     REMDEV          ; REMOVE DEVICE ASSIGNMENTS FROM STRING LIST.
78B4  20F494              JSR     TXOPEN          ; OPEN E: & RECAPTURE GRAPHICS REGION IF NECESSARY.
78B7  A508                LDA     WARMST          ; WARMSTART?
78B9  D005 ^78C0          BNE     :INI30          ; YES.
78BB  A917                LDA     #SIGNON         ; GENERATE SIGN-ON MESSAGE.
78BD  20FFB4              JSR     MESSOT
78C0  4C2CB5      :INI30  JMP     RDYMES          ; GENERATE "READY" MESSAGE & RETURN.
78C3                      PROC
                  ;
                  ; MAIN LOOP FOR PILOT INTERPRETER.
                  ;
                  ;
                  ; POWER-UP ANO RESET ENTRY.
                  ;
78C3  A2FF        MLE     LDX     #$FF            ; INITIALIZE STACK POINTER.
78C5  9A                  TXS
78C6  A970                LDA     # HIGH $7000    ; NEW TOP OF MEMORY.
78C8  856A                STA     RAMTOP
78CA  A900                LDA     #0              ; CLEAR ESSENTIALS FOR EOPEN CALL.
78CC  8D1D05              STA     AUX1
78CF  8D1E05              STA     AUX2
78D2  8D1405              STA     GRFLAG
78D5  8D5105              STA     LETTRSZ
78D8  8DB205              STA     FINEFG
78DB  208E96              JSR     EOPEN           ; MOVE SCREEN DOWN.
78DE  8E4305              STX     NOCONT          ; NO CONTINUATION.
78E1  202878              JSR     INIT            ; INITIALIZE REST OF ENVIRONMENT
                  ; *** EXTERNAL ENTRY POINT ***
78E4  A93C        MLRES   LDA     #CASSOF         ; CASSETTE MOTOR OFF
78E6  8D02D3              STA     PACTL
78E9  20B49F              JSR     AUDCLR          ; CLEAR AUDIO REGISTERS
78EC  A900        MLRES2  LDA     #0              ; RESET ...
78EE  85FF                STA     RUN             ; ... RUN FLAG ...
78F0  8D4505              STA     SGLSTP          ; ... SINGLE STEP ...
78F3  8DFE02              STA     DSPFLG          ; ... DISPLAY FLAG ...
78F6  8DB602              STA     INVFLG          ; ... INVERT VIDEO FLAG ...
78F9  8D0405              STA     IOEDIS          ; ... & ERROR STOP DISABLE FLAG.
78FC  A9E1                LDA     # LOW XTYPE     ; MAKE ':' COMMAND = 'T:'.
78FE  8D0805              STA     XJUMP+1
7901  A983                LDA     # HIGH XTYPE
7903  8D0905              STA     XJUMP+2
7906  8D0605              STA     EXECF           ; CONDITION FLAG = TRUE.
                  ; *** EXTERNAL ENTRY POINT ***
7909  A900        MLLOAD  LDA     # LOW COMBUF    ; RE-ESTABLISH CONSOLE BUFFER INPUT.
790B  8580                STA     INLN
790D  A9BD                LDA     # HIGH COMBUF
790F  8581                STA     INLN+1
7911  20007B      MLOOP   JSR     GETCOM          ; GET A COMMAND INPUT.
7914  D07A ^7990          BNE     :ML090          ; ERROR (SKIP BRANCH).
                  ; NOTE: THE Y REGISTER IS ASSUMED TO CONTAIN THE INDEX TO 'INLN'
                  ;       THROUGHOUT THIS ROUTINE.  ALL CALLED ROUTINES WILL BE
                  ;       RESPONSIBLE POR MAINTAINING ITS INTEGRITY.
7916  AD3205              LDA     LOADFG          ; LOADING?
7919  D00C ^7927          BNE     :ML020          ; YES.
791B  A5FF                LDA     RUN             ; RUN MODE?
791D  D03B ^795A          BNE     :ML070          ; YES.
791F  AD3605              LDA     AUTOIN          ; AUTO-INPUT MODE?
7922  F003 ^7927          BEQ     :ML020          ; NO.
7924  4C9D79              JMP     :ML100          ; YES.
7927  AD4405      :ML020  LDA     CONKEY
792A  2901                AND     #STRTKY         ; START KEY?
792C  F017 ^7945          BEQ     :ML030          ; NO.
792E  AD4405              LDA     CONKEY          ; RESET THE KEY FLAG.
7931  29FE                AND     #$FF-STRTKY
7933  8D4405              STA     CONKEY
7936  AD4305              LDA     NOCONT          ; CAN WE CONTINUE?
7939  F003 ^793E          BEQ     :ML025          ; YES.
793B  201185              JSR     XRN010          ; NO -- START AT BEGINNING.
793E  CE4505      :ML025  DEC     SGLSTP          ; YES -- SET FLAG.
7941  C6FF                DEC     RUN             ; SET TO RUN MODE.
7943  D0CC ^7911          BNE     MLOOP           ; (BRA).
7945  20D39E      :ML030  JSR     SCNLBL          ; SCAN OVER LABEL IF PRESENT
7948  F007 ^7951          BEQ     :ML040          ; YES -- SAW A VALID LABEL.
794A  B180                LDA     (INLN),Y        ; CHECK FOR LINE NUMBER.
794C  20839E              JSR     CNUMBR          ; NUMBERED LINE?
794F  905E ^79AF          BCC     :ML110          ; YES -- EDIT MODE.
                  ; UN-NUMBERED LINE -- IMMEDIATE EXECUTION
7951  A240        :ML040  LDX     #CTIMM          ; SETUP FOR IMMEDIATE MODE COMMANDS.
7953  20AB7B              JSR     SYCMND          ; IMMEDIATE MODE -- SYNTAX CHECK CODE.
7956  D038 ^7990          BNE     :ML090          ; ERROR -- DON'T EXECUTE THE COMMAND
7958  F033 ^798D          BEQ     :ML085          ; (BRA).
                  ; LINE FROM STORAGE -- 'RUN' MODE
795A  AD4405      :ML070  LDA     CONKEY          ; CONSOLE KEY PRESSED?
795D  2904                AND     #OPTKEY         ; OPTION KEY?
795F  F010 ^7971          BEQ     :ML080          ; NO.
7961  AD3505              LDA     TRACE           ; YES -- TOGGLE THE TRACE.
7964  4901                EOR     #KON
7966  8D3505              STA     TRACE
7969  AD4405              LDA     CONKEY          ; RESET THE KEY FLAG.
796C  29FB                AND     #$FF-OPTKEY
796E  8D4405              STA     CONKEY
7971  AD3505      :ML080  LDA     TRACE           ; TRACE EXECUTION?
7974  0D4505              ORA     SGLSTP
7977  F014 ^798D          BEQ     :ML085          ; NO.
7979  20BB96              JSR     TSTMOD          ; CHECK SCREEN MODE.
797C  2905                AND     #TXSL+GRSS      ; TEXT OUPUT O.K.?
797E  D003 ^7983          BNE     :ML082          ; YES.
7980  20F494              JSR     TXOPEN          ; NO -- OPEN TEXT SCREEN.
7983  A918        :ML082  LDA     #TRCMES         ; PRINT TRACE LINE HEADER.
7985  20FFB4              JSR     MESSOT
7988  A000                LDY     #INLN-DTAB      ; PRINT SOURCE STATEMENT.
798A  20229F              JSR     PSF
                  ; COMMON CODE 'IMMEDIATE' AND 'RUN'
798D  20E27B      :ML085  JSR     EXCMND          ; EXECUTE THE COMMAND.
7990  D06E ^7A00  :ML090  BNE     :ML155          ; RUN-TIME ERROR (SKIP BRANCH POINT).
7992  AD4505              LDA     SGLSTP          ; SINGLE STEP?
7995  F003 ^799A          BEQ     :ML095          ; NO.
7997  4CEC78              JMP     MLRES2          ; YES -- RETURN TO IMMEDIATE MODE.
799A  4C1179      :ML095  JMP     MLOOP           ; GET NEXT COMMAND.
                  ; AUTO-INPUT MODE -- SUPPLY THE LINE NUMBER AND ONE EXTRA LEADING BLANK.
799D  A5FA        :ML100  LDA     ALINE           ; SUPPLY THE LINE NUMBER.
799F  85B8                STA     NUMBER
79A1  A5FB                LDA     ALINE+1
79A3  85B9                STA     NUMBER+1
79A5  A200                LDX     #INLN-DTAB
79A7  20129D              JSR     DDCRI           ; ONE EXTRA LEADING BLANK.
79AA  E683                INC     INLN+3
79AC  4CB279              JMP     :ML112
                  ; NUMBERED LINE INPUT -- EDIT MODE.
79AF  206E81      :ML110  JSR     ATOM            ; CONVERT LINE NUMBER TO BINARY IN 'NUMBER'.
79B2  8482        :ML112  STY     INLN+2          ; SAVE INPUT LINE POINTER.
79B4  A238                LDX     #NUMBER-DTAB
79B6  AD3205              LDA     LOADFG          ; SUPPLY LINE NUMBER IF 'APPEND'.
79B9  C903                CMP     #KAPPND
79BB  D005 ^79C2          BNE     :ML120
79BD  A07A                LDY     #ALINE-DTAB
79BF  20459A              JSR     DMOVI
79C2  206B94      :ML120  JSR     CHKLN           ; CHECK LINE # FOR RANGE.
79C5  B05F ^7A26          BCS     :ML200          ; OUT OF RANGE.
79C7  A900                LDA     #0              ; CLEAR USE STACK ON INSERT/DELETE.
79C9  8D4D05              STA     USTKP
79CC  A9FF                LDA     #$FF            ; ALTER PROGRAM -- NO CONTINUATION.
79CE  8D4305              STA     NOCONT
79D1  A5B9                LDA     NUMBER+1        ; SAVE LINE NUMBER ...
79D3  85DC                STA     LINENO          ; ... IN INVERTED FORM (STRING NAME).
79D5  A5B8                LDA     NUMBER
79D7  85DD                STA     LINENO+1
79D9  A482                LDY     INLN+2          ; RESTORE INPUT LINE INDEX.
79DB  20D39E              JSR     SCNLBL          ; SKIP OVER LABEL IF PRESENT.
79DE  F019 ^79F9          BEQ     :ML150          ; LABEL FOUND.
79E0  B180                LDA     (INLN),Y        ; CHECK FOR NULL STATEMENT.
79E2  C99B                CMP     #EOL
79E4  D013 ^79F9          BNE     :ML150          ; NON-NULL -- STATEMENT IS TO BE ENTERED.
79E6  AD3605              LDA     AUTOIN          ; AUTO-INPUT MODE?
79E9  F008 ^79F3          BEQ     :ML140          ; NO.
79EB  20167A              JSR     LVAUTO          ; LEAVE AUTO-INPUT MODE.
79EE  A981                LDA     #AUTOXT         ; GENERATE MESSAGE AS WE LEAVE.
79F0  4CC57A              JMP     :ML985
79F3  20E77A      :ML140  JSR     LDELET          ; YES -- DELETE NUMBERED LINE.
79F6  4C1179      :ML145  JMP     MLOOP
79F9  A482        :ML150  LDY     INLN+2          ; RESTORE INPUT LINE POINTER.
79FB  A220                LDX     #CTRUN          ; SETUP FOR RUN MODE COMMANDS.
79FD  20AB7B              JSR     SYCMND          ; SYNTAX CHECK THE STATEMENT.
7A00  D038 ^7A3A  :ML155  BNE     :ML900          ; SYNTAX ERROR (SKIP BRANCH POINT).
7A02  20CE7A              JSR     LINSRT          ; INSERT THE NEW LINE (COMMAND 'TOKENIZED').
7A05  D01F ^7A26          BNE     :ML200          ; NO ROOM FOR NEW LINE.
7A07  A27A                LDX     #ALINE-DTAB     ; INCREMENT AUTO-INPUT LINE #.
7A09  A07C                LDY     #AINC-DTAB      ; (EVEN IF NOT IN AUTO-INPUT MODE).
7A0B  20329C              JSR     DADDI
7A0E  AD3605              LDA     AUTOIN          ; AUTO-INPUT MODE?
7A11  F0E3 ^79F6          BEQ     :ML145          ; NO -- GET NEXT COMMAND.
7A13  4C0979              JMP     MLLOAD          ; YES -- ADJUST 'INLN' FOR 'LEADING BLANK'.
7A16  A200        LVAUTO  LDX     #0              ; RESET AUTO-INPUT MODE.
7A18  8E3605              STX     AUTOIN
7A1B  A284                LDX     #CBLUE          ; RESTORE NORMAL SCREEN COLOR.
7A1D  8EC602              STX     COLOR0+2
7A20  A21A                LDX     #CYELLO
7A22  8EC502              STX     COLOR0+1
7A25  60                  RTS
                  ; NO ROOM FOR LINE OR LINE # OUT OF RANGE.
7A26  48          :ML200  PHA                     ; SAVE ERROR CODE.
7A27  AD3205              LDA     LOADFG          ; LOAD IN PROGRESS?
7A2A  F00A ^7A36          BEQ     :ML210          ; NO.
7A2C  A900                LDA     #0              ; ABORT LOAD.
7A2E  8D3205              STA     LOADFG
7A31  A230                LDX     #IOCB3          ; CLOSE FILE.
7A33  203F97              JSR     DCLOSE
7A36  68          :ML210  PLA                     ; RESTORE ERROR CODE.
7A37  20167A              JSR     LVAUTO          ; LEAVE AUTO-INPUT MODE & FALL INTO 'PSTOP'.
                  ; SYNTAX/RUN-TIME ERROR PROCESSOR
                  ; *** EXTERNAL ENTRY POINT ***
                  ;       A = ERROR CODE
                  ;       Y = INDEX TO ERROR IN STATEMENT.
7A3A              :ML900
7A3A  A2FF        PSTOP   LDX     #$FF            ; RE-INIT STACK POINTER.
7A3C  9A                  TXS
7A3D  8EFE02              STX     DSPFLG          ; SET DISPLAY FLAG.
7A40  8C1205              STY     SAVYR           ; SAVE INDEX TO ERROR.
7A43  85B8                STA     NUMBER          ; SAVE ERROR NUMBER.
7A45  20BB96              JSR     TSTMOD          ; CHECK SCREEN MODE.
7A48  2905                AND     #TXSL+GRSS      ; TEXT OUTPUT O.K.?
7A4A  D003 ^7A4F          BNE     :ML920          ; YES.
7A4C  20F494              JSR     TXOPEN          ; NO -- OPEN TEXT SCREEN.
7A4F  A906        :ML920  LDA     #EPUTC-IOVBAS   ; RE-ESTABLISH 'E:' AS 'CHOT' OUTPUT.
7A51  8D3005              STA     CDEST
7A54  20989F              JSR     NEWLIN
7A57  A5FF                LDA     RUN             ; IF IMMEDIATE ...
7A59  0583                ORA     INLN+3          ; ... & EMPTY INPUT LINE ...
7A5B  F06E ^7ACB          BEQ     :ML990          ; ... THEN IGNORE ERROR (BREAK).
7A5D  A5B8                LDA     NUMBER
7A5F  C981                CMP     #EOPERR         ; SEE IF ERROR IS END OF PROGRAM.
7A61  F062 ^7AC5          BEQ     :ML985          ; YES -- NO STATEMENT TO PRINT.
7A63  A8                  TAY                     ; (SET CC).
7A64  3012 ^7A78          BMI     :ML947          ; YES -- NO HIGHLIGHTED CHARACTER.
7A66  AC1205              LDY     SAVYR           ; HIGHLIGHT THE ERROR CHARACTER.
7A69  B180                LDA     (INLN),Y
7A6B  8D4805              STA     XXXX            ; SAVE FOR LATER RESTORATION.
7A6E  C99B                CMP     #EOL
7A70  D002 ^7A74          BNE     :ML945
7A72  A920                LDA     #' '             ; REPLACE EOL WITH BLANK.
7A74  4980        :ML945  EOR     #$80            ; INVERT COLOR.
7A76  9180                STA     (INLN),Y
7A78  A5FF        :ML947  LDA     RUN             ; SEE IF RUN OR IMMEDIATE MODE.
7A7A  F008 ^7A84          BEQ     :ML950          ; IMMEDIATE.
7A7C  A000                LDY     #INLN-DTAB
7A7E  20229F              JSR     PSF             ; RUN -- PRINT STORAGE FORMAT.
7A81  4C8D7A              JMP     :ML960
7A84              :ML950
7A84  A900                LDA     #0              ; *** OR DON'T USE 'INLN'+2 AS TEMP STORE ***
7A86  8582                STA     INLN+2
7A88  A200                LDX     #INLN-DTAB      ; IMMEDIATE -- PRINT INPUT LINE.
7A8A  209797              JSR     PRTSTG
7A8D  A5B8        :ML960  LDA     NUMBER          ; WAS THERE A HIGHLIGHTED CHARACTER?
7A8F  300F ^7AA0          BMI     :ML963          ; NO.
7A91  AC1205              LDY     SAVYR           ; RESTORE ORIGINAL CHARACTER.
7A94  AD4805              LDA     XXXX
7A97  9180                STA     (INLN),Y
7A99  C99B                CMP     #EOL            ; WAS IT THE EOL?
7A9B  D003 ^7AA0          BNE     :ML963          ; NO.
7A9D  208294              JSR     CHOT            ; YES -- DO IT NOW.
7AA0  A908        :ML963  LDA     #ASTMES         ; PREFIX MESSAGE WITH '***'.
7AA2  20FFB4              JSR     MESSOT
7AA5  A5B8                LDA     NUMBER
7AA7  C986                CMP     #IOERR          ; I/O ERROR?
7AA9  D00A ^7AB5          BNE     :ML981          ; NO.
7AAB  A4E4                LDY     IOSTAT          ; YES -- BREAK?
7AAD  C080                CPY     #128
7AAF  D004 ^7AB5          BNE     :ML981          ; NO.
7AB1  A987                LDA     #ABTERR         ; YES -- CHANGE ERROR CODE.
7AB3  85B8                STA     NUMBER
7AB5  20FFB4      :ML981  JSR     MESSOT          ; GENERATE ERROR MESSAGE.
7AB8  A5B8                LDA     NUMBER
7ABA  C986                CMP     #IOERR          ; I/O ERROR?
7ABC  D005 ^7AC3          BNE     :ML982          ; NO.
7ABE  A264                LDX     #IOSTAT-DTAB    ; YES -- PRINT ERROR STATUS.
7AC0  20149E              JSR     DECASC
7AC3  A908        :ML982  LDA     #ASTMES         ; APPEND '***' TO END OF MESSAGE.
                  ; *** EXTERNAL ENTRY POINT FROM 'MLOOP' ***
7AC5  20FFB4      :ML985  JSR     MESSOT
7AC8  20989F              JSR     NEWLIN
7ACB  4CE478      :ML990  JMP     MLRES           ; GET NEXT COMMAND.
                  ; LINE INSERT AND DELETE ROUTINES
7ACE                      PROC
                  ;
                  ; LINSRT -- INSERT NUMBERED LINE TO STATEMENT LIST
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'LINENO' = LINE # (BINARY)
                  ;       'INLN' POINTS TO STATEMENT TO INSERT
                  ;       'TKNTYP' = TOKEN
                  ;       'TKNOFF' = OFFSET PAST COMMAND IN SOURCE STATEMENT.
                  ;
                  ;       JSR     LINSRT
                  ;       BNE     NO ROOM IN MEMORY OR OTHER PROBLEM
                  ;
7ACE  20ED7A      LINSRT  JSR     NUMNAM          ; SETUP 'LINENO' AS STRING NAME.
7AD1  A242                LDX     #DP-DTAB        ; SETUP STRING AT A POINTER.
7AD3  A000                LDY     #INLN-DTAB
7AD5  203B9A              JSR     PMOVE
7AD8  38                  SEC                     ; OFFSET PAST COMMAND =
7AD9  AD6A05              LDA     TKNOFF          ; ... 'TKNOFF'.
7ADC  E582                SBC     INLN+2          ; ... - 'INLN+2'.
7ADE  18                  CLC
7ADF  6906                ADC     #6              ; ... + 6.
7AE1  8D6A05              STA     TKNOFF
7AE4  4C0599              JMP     SINSRT          ; INSERT LINE & RETURN WITH CC SET.
7AE7                      PROC
                  ;
                  ; LDELET -- NUMBERED LINE DELETE FROM STATEMENT LIST
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'LINENO' = LINE * (BINARY)
                  ;
                  ;       JSR     LDELET
                  ;       BNE     LINE NOT FOUND OR OTHER PROBLEM
                  ;
7AE7  20ED7A      LDELET  JSR     NUMNAM          ; SETUP 'LINENO' AS STRING NAME.
7AEA  4CEC98              JMP     SDELET          ; DELETE LINE & RETURN WITH CC SET.
7AED                      PROC
                  ;
                  ; NUMNAM -- SETUP 'LINENO' AS STRING NAME & SETUP ACCESS TO STATEMENT LIST.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     NUMNAM
                  ;
                  ;       'ATRTYP' SET FOR LINE #
                  ;
7AED  A9DC        NUMNAM  LDA     # LOW LINENO
7AEF  85BE                STA     NP
7AF1  A900                LDA     # HIGH LINENO
7AF3  85BF                STA     NP+1
7AF5  A900                LDA     #0
7AF7  85C0                STA     NP+2
7AF9  A902                LDA     #2
7AFB  85C1                STA     NP+3
7AFD  4C9F9E              JMP     STMLST          ; SETUP TO ACCESS STATEMENT LIST & RETURN.
7B00                      PROC
                  ;
                  ; GETCOM -- GET A COMMAND LINE FOR THE MAIN LOOP
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'LOADFG' = 0 IF NOT LOADING FROM DEVICE, ELSE LOADING.
                  ;       'RUN' = 0 IF IMMEDIATE MODE, ELSE RUN MODE.
                  ;       'NXTLN' POINTS TO NEXT RUN MODE LINE.
                  ;
                  ;       JSR     GETCOM
                  ;       BNE     ERROR (A = ERROR NUMBER)
                  ;
                  ;       'INLN' POINTS TO NEW COMMAND LINE.
                  ;       Y = INDEX TO START OF STATEMENT.
                  ;       'NXTLN' POINTS TO NEXT RUN MODE LINE.
                  ;
                  ;       IF 'RUN', THEN
                  ;
                  ;       'TKNTYP' = TOKENIZED COMMAND
                  ;       'TKNOFF' = OFFSET PAST COMMAND IN STATEMENT STORAGE.
                  ;
7B00  AD3205      GETCOM  LDA     LOADFG          ; LOADING FROM DEVICE?
7B03  D041 ^7B46          BNE     :GC200          ; YES.
7B05  A5FF                LDA     RUN             ; RUN MODE?
7B07  F031 ^7B3A          BEQ     :GC100          ; NO -- IMMEDIATE.
7B09  207E9F      :GC010  JSR     ABRTCK          ; YES -- CHECK FOR OPERATOR ABORT.
7B0C  A200                LDX     #INLN-DTAB      ; GET NEXT STATEMENT ADDRESS.
7B0E  A004                LDY     #NXTLN-DTAB
7B10  20459A              JSR     DMOVI
7B13  A000                LDY     #0              ; GET & SAVE LINE END INDEX.
7B15  B180                LDA     (INLN),Y
7B17  8583                STA     INLN+3
7B19  A030                LDY     #S1H-DTAB       ; END OF PROGRAM?
7B1B  20159C              JSR     DCMPI
7B1E  D006 ^7B26          BNE     :GC020          ; NO -- KEEP TRUCKIN'.
7B20  A981                LDA     #EOPERR         ; RETURN WITH INDICATOR.
7B22  8D4305              STA     NOCONT          ; NO CONTINUATION.
7B25  60                  RTS
7B26              :GC020
                  ; *S*   LDX     #INLN-DTAB
7B26  20869A              JSR     SATTR           ; 'ATTRIBUTE'
7B29  8D6805              STA     TKNTYP          ; AS ADVERTISED.
7B2C  C8                  INY
7B2D  B1A1                LDA     (TEMP),Y
7B2F  8D6A05              STA     TKNOFF          ; AS ADVERTISED.
7B32  A204                LDX     #NXTLN-DTAB     ; POINT TO NEXT LINE.
7B34  20AA9A              JSR     SNXTI
7B37  A900                LDA     #0              ; SET CC FOR RETURN.
7B39  60                  RTS
                  ; GET A LINE FROM THE CONSOLE.
7B3A              :GC100
7B3A  A900                LDA     #0              ; CLEAR LINE LENGTH FOR "BREAK".
7B3C  8583                STA     INLN+3
7B3E  A200                LDX     #INLN-DTAB      ; GET AN INPUT LINE FROM CONSOLE.
7B40  20B194              JSR     GETLIN
7B43  A000                LDY     #0              ; SET INDEX TO START OF STATEMENT (CC TOO).
7B45  60                  RTS
                  ; GET DATA FROM DEVICE ASSIGNED TO IOCB 3.
7B46  86A1        :GC200  STX     TEMP            ; SAVE REGISTERS.
7B48  A580        :GC205  LDA     INLN            ; SETUP BUFFER ADDRESS.
7B4A  8D7403              STA     IOCB3+ICBAL
7B4D  A581                LDA     INLN+1
7B4F  8D7503              STA     IOCB3+ICBAH
7B52  A905                LDA     #GETR           ; GET RECORD COMMAND.
7B54  8D7203              STA     IOCB3+ICCOM
7B57  A979                LDA     # LOW LINLNG-1  ; SETUP MAXIMUM LINE LENGTH.
7B59  8D7803              STA     IOCB3+ICBLL
7B5C  A9FF                LDA     # HIGH LINLNG-1
7B5E  8D7903              STA     IOCB3+ICBLH
7B61  A230                LDX     #IOCB3          ; GET RECORD.
7B63  2056E4              JSR     CIO
7B66  AD7803              LDA     IOCB3+ICBLL     ; PUT START/END INDICES IN POINTER.
7B69  8583                STA     INLN+3
7B6B  A900                LDA     #0
7B6D  8582                STA     INLN+2
7B6F  C000                CPY     #0              ; ERROR?
7B71  1029 ^7B9C          BPL     :GC250          ; NO.
7B73  A900                LDA     #0              ; THAT OR END-OF-FILE.
7B75  8D3205              STA     LOADFG          ; STOP LOADING IN EITHER CASE.
7B78  C088                CPY     #$88            ; END OF FILE?
7B7A  D01D ^7B99          BNE     :GC220          ; NO.
7B7C  203F97              JSR     DCLOSE          ; YES -- CLOSE DEVICE.
7B7F  A5FF                LDA     RUN             ; IS THE USER PROGRAM RUNNING?
7B81  F010 ^7B93          BEQ     :GC210          ; NO -- IMMEDIATE LOAD OR LOAO ERROR.
7B83  A900                LDA     #0              ; CONTINUE O.K.
7B85  8D4305              STA     NOCONT
7B88  A5AE                LDA     S1L             ; SETUP TO RUN PROGRAM LOADED.
7B8A  8584                STA     NXTLN
7B8C  A5AF                LDA     S1L+1
7B8E  8585                STA     NXTLN+1
7B90  4C097B              JMP     :GC010          ; (TOO FAR FOR 'RELATIVE').
7B93  202CB5      :GC210  JSR     RDYMES          ; GENERATE "READY" MESSAGE.
7B96  4CE478              JMP     MLRES           ; GRACEFUL TERMINATION OF LOAD.
7B99  4C2897      :GC220  JMP     DOP005          ; ABORT LOAD OPERATION.
7B9C  A000        :GC250  LDY     #0              ; ACCEPT ONLY NUMBERED LINES.
7B9E  20139F              JSR     SLB
7BA1  20839E              JSR     CNUMBR
7BA4  B0A2 ^7B48          BCS     :GC205          ; NOT NUMBERED--IGNORE.
7BA6  A6A1                LDX     TEMP            ; RESTORE REGISTER.
7BA8  A000                LDY     #0              ; SETUP INDEX TO START OF STATEMENT (=0).
7BAA  60                  RTS                     ; RETURN WITH CC SET.
7BAB                      PROC
                  ;
                  ; SYCMND -- SYNTAX CHECK THE COMMAND
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = VALID CCMNAND MODE.
                  ;       'INLN' POINTS TO THE STATEMENT
                  ;       Y = INDEX TO START OP STATEMENT
                  ;
                  ;       JSR     SYCMND
                  ;       BNE     SYNTAX ERROR (A = ERROR CODE)
                  ;
                  ;       'TKNTYP' = TOKENIZED COMMAND.
                  ;          0/#USROFF-1               = COMMAND IS IN 'CDTAB'
                  ;          #USROFF/#USROFF+#USRMAX-1 = COMMAND IS IN 'USRTAB'
                  ;                         'TKNCNT'   = RESERVED FOR ': CONTINUATION'
                  ;                         'TKNNUL'   = RESERVED FOR 'NULL' COMMAND
                  ;       'TKNOFF' = OFFSET PAST COMMAND FROM BEGINNING OF STATEMENT.
                  ;
7BAB  20D39E      SYCMND  JSR     SCNLBL          ; SCAN PAST LABEL IF PRESENT.
7BAE  20139F              JSR     SLB
7BB1  C93A                CMP     #':'            ; COMMAND CONTINUATION?
7BB3  F01D ^7BD2          BEQ     :SC010          ; YES.
7BB5  20F99E              JSR     CHKTRM          ; 'NULL' COMMAND?
7BB8  F01D ^7BD7          BEQ     :SC020          ; YES.
7BBA  A900                LDA     #0              ; RESET EXECUTE FLAG.
7BBC  8592                STA     EXEC
7BBE  20567C              JSR     CMATCH          ; FIND COMMAND.
7BC1  F006 ^7BC9          BEQ     :SC005          ; VALID.
7BC3  C902                CMP     #IVCERR         ; IF NOT IN TABLE, ASSUME 'GR:'.
7BC5  D01A ^7BE1          BNE     :SC099          ; ERROR.
7BC7  A23A                LDX     #CDG-CDTAB      ; CASE: 10 360(HOME;DRAW 10;TURN 1).
7BC9  8E6805      :SC005  STX     TKNTYP          ; TOKENIZE COMMAND.
7BCC  8C6A05              STY     TKNOFF          ; OFFSET PAST COMMAND.
7BCF  4C087C              JMP     EXC100
7BD2  C8          :SC010  INY                     ; MOVE PAST
7BD3  A9FE                LDA     #TKNCNT         ; COMMAND CONTINUATION.
7BD5  D002 ^7BD9          BNE     :SC050          ; (BRA).
7BD7  A9FF        :SC020  LDA     #TKNNUL         ; NULL COMMAND.
7BD9  8D6805      :SC050  STA     TKNTYP
7BDC  8C6A05              STY     TKNOFF
7BDF  A900                LDA     #0              ; SET CC FOR EXIT.
7BE1  60          :SC099  RTS
7BE2                      PROC
                  ;
                  ; EXCMND -- EXECUTE THE COMMAND
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'TKNTYP' = TOKENIZED COMMAND.
                  ;       'TKNOFF' = OFFSET PAST COMMAND.
                  ;
                  ;       JSR     EXCMND
                  ;       BNE     SYNTAX OR RUN-TIME ERROR (A = ERROR CODE).
                  ;
7BE2  AC6A05      EXCMND  LDY     TKNOFF          ; OFFSET PAST COMMAND.
7BE5  A9FF                LDA     #$FF            ; SET EXECUTE FLAG.
7BE7  8592                STA     EXEC
7BE9  AE6805              LDX     TKNTYP          ; TRAP FOR 'RESERVED' TOKENS.
7BEC  E0FE                CPX     #TKNCNT
7BEE  9018 ^7C08          BCC     EXC100          ; NOT 'RESERVED'.
7BF0  D013 ^7C05          BNE     :EC020          ; 'NULL' COMMAND.
                  ; COMMAND CONTINUATION
7BF2  AE6905              LDX     LSTKN           ; USE TOKEN FROM 'LAST' COMMAND.
7BF5  8E6805              STX     TKNTYP
7BF8  E008                CPX     #CLNCNT         ; NO -- CHECK 'CDTAB' SEGMENT.
                                                  ; ('USRTAB' NOT ALLOWED).
7BFA  9004 ^7C00          BCC     :EC010          ; O.K.
7BFC  88                  DEY                     ; POINT TO '!'.
7BFD  A902                LDA     #IVCERR         ; INVALID CONTINUATION.
7BFF  60                  RTS
                  ; COMMAND CONTINUATION IS VALID.
7C00  AD0605      :EC010  LDA     EXECF           ; USE PRIOR 'EXECF'.
7C03  D03F ^7C44          BNE     :EC500          ; EXECUTE COMMAND USING PRIOR 'XJUMP'.
                  ; EXIT FOR 'NULL' COMMAND.
7C05  A900        :EC020  LDA     #0              ; SET CC FOR EXIT.
7C07  60                  RTS
                  ; *** ENTRY FROM 'SYCMND' ***
7C08  200E81      EXC100  JSR     COND            ; PROCESS CONDITION IF PRESENT.
7C0B  A592                LDA     EXEC            ; EXECUTE MODE?
7C0D  F005 ^7C14          BEQ     :EC300          ; NO -- SYNTAX SCAN ONLY.
7C0F  AD0605              LDA     EXECF           ; EXECUTE COMMAND?
7C12  F041 ^7C55          BEQ     :EC900          ; NO -- NORMAL EXIT.
7C14  84AB        :EC300  STY     XTEMP           ; SAVE Y.
7C16  AC6805              LDY     TKNTYP          ; 'USRTAB' OR 'CDTAB'?
7C19  8C6905              STY     LSTKN           ; SAVE TOKEN IN CASE NEXT COMMAND USES
                                                  ; ':-CONTINUATION'.
7C1C  C06C                CPY     #USROFF
7C1E  900F ^7C2F          BCC     :EC400          ; 'CDTAB'.
7C20  98                  TYA                     ; 'NORMALIZE' RELATIVE TO 'USRTAB'.
7C21  38                  SEC
7C22  E96C                SBC     #USROFF
7C24  A8                  TAY
7C25  AD0005              LDA     USRTAB
7C28  85A1                STA     TEMP
7C2A  AD0105              LDA     USRTAB+1
7C2D  D006 ^7C35          BNE     :EC410          ; (BRA).
7C2F  A93E        :EC400  LDA     # LOW CDTAB
7C31  85A1                STA     TEMP
7C33  A980                LDA     # HIGH CDTAB
7C35  85A2        :EC410  STA     TEMP+1
7C37  B1A1                LDA     (TEMP),Y        ; MOVE ADDRESS TO JUMP INSTRUCTION.
7C39  8D0805              STA     XJUMP+1
7C3C  C8                  INY
7C3D  B1A1                LDA     (TEMP),Y
7C3F  8D0905              STA     XJUMP+2
7C42  A4AB                LDY     XTEMP           ; RESTORE INDEX.
7C44  A592        :EC500  LDA     EXEC            ; SET CC FOR X-ROUTINES.
7C46  200705              JSR     XJUMP           ; YES -- EXECUTE (OR SCAN).
7C49  D00A ^7C55          BNE     :EC900          ; ERROR -- RETURN WITH CC SET.
7C4B  20139F              JSR     SLB             ; SKIP ANY BLANKS.
7C4E  20F99E              JSR     CHKTRM          ; STATEMENT TERMINATOR?
7C51  F002 ^7C55          BEQ     :EC900          ; YES -- O.K.
7C53  A902                LDA     #JNKERR         ; JUNK -- ERROR.
7C55  60          :EC900  RTS                     ; RETURN WITH CC SET.
7C56                      PROC
                  ;
                  ; CMATCH -- COMMAND MATCH ROUTINE
                  ;
                  ; ORDER OF SEARCHING:
                  ;
                  ;       1. THE USER EXTENDABLE COMMAND TABLE
                  ;       2. THE GRAPHICS SUBCOMMANDS
                  ;       3. THE INTERNAL COMMAND TABLE
                  ;
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'USRTAB' = ADDRESS OF USER EXTENDABLE COMMAND TABLE (0=NONE).
                  ;                  (OFFSETS ARE RELATIVE TO 'USRTAB').
                  ;        X = IMMEDIATE AND/OR RUN COMMAND' VALID
                  ;        'INLN' POINTS TO SOURCE STATEMENT.
                  ;        Y = INDEX TO START OF COMMAND NAME.
                  ;
                  ;        JSR     CMATCH
                  ;        BNE     NO MATCH IN TABLE (A = ERROR CODE, Y UNCHANGED)
                  ;
                  ;        X = VALUE OF 'CTAB' DATA BYTE FOR ENTRY ('TOKENIZED' COMMAND).
                  ;        X < 'USROFF' (OFFSET IN 'CDTAB').
                  ;        X >= 'USROFF' ('USROFF' + OFFSET IN 'USRTAB').
                  ;        Y = INDEX TO START OF FIELD AFTER COMMAND NAME.
                  ;        'CTABAT' = ATTRIBUTE BITS OF COMMAND.
                  ;
                  ; NOTE: NAME MATCH MUST BE EXACT FOR THE REST OF THE
                  ;       STATEMENT TO BE PROCESSED CORRECTLY. FOR EXAMPLE:
                  ;               "TYPEN:" WILL BE SCANNED AS TY<JUNK>:, NOT
                  ;                                           T<JUNK>N:.
                  ;
7C56  8E1005      CMATCH  STX     CTABAT          ; SAVE VALID COMMAND TYPES.
7C59  84AB                STY     XTEMP           ; SAVE Y REG.
7C5B  AD0005              LDA     USRTAB          ; SELECT 'USRTAB' IF ADDR>255.
7C5E  8590                STA     TABADR
7C60  AD0105              LDA     USRTAB+1
7C63  F018 ^7C7D          BEQ     :CMA10          ; NO USER EXTENDED COMMAND TABLE.
7C65  8591                STA     TABADR+1
7C67  20BD7C              JSR     CMACOM          ; SEARCH 'USRTAB'
7C6A  D011 ^7C7D          BNE     :CMA10          ; NOT IN 'USRTAB'
7C6C  E092                CPX     #USRMAX         ; IS 'USRTAB' TOO LARGE?
7C6E  B00D ^7C7D          BCS     :CMA10          ; YES -- PRETEND COMMAND WAS NOT THERE.
7C70  98                  TYA                     ; CHECK 'ATTRIBUTE'
7C71  2C1005              BIT     CTABAT
7C74  F031 ^7CA7          BEQ     :CMA90          ; WRONG COMMAND TYPE.
                  ; COMMAND IS IN 'USRTAB'
7C76  8A                  TXA                     ; SET 'TOKEN' FOR 'USRTAB'
7C77  18                  CLC
7C78  696C                ADC     #USROFF         ; SET OFFSET TO IDENTIFY TOKEN IN 'USRTAB'.
7C7A  AA                  TAX
7C7B  D023 ^7CA0          BNE     :CMA50          ; (BRA).
                  ; SEARCH GRAPHICS SUBCOMMANDS
7C7D  A4AB        :CMA10  LDY     XTEMP           ; RESTORE INDEX.
7C7F  A204                LDX     #GTABX
7C81  20AB7C              JSR     SBCMAT          ; GRAPHICS SUBCOMMAND?
7C84  D007 ^7C8D          BNE     :CMA20          ; NO.
7C86  A4AB                LDY     XTEMP           ; RESTORE INDEX FOR SYNTAX CHECK.
7C88  A23A                LDX     #CDG-CDTAB      ; TOKENIZE AS 'GR:'.
7C8A  A900                LDA     #0              ; SET CC FOR EXIT.
7C8C  60                  RTS
                  ; SEARCH INTERNAL COMMAND TABLE
7C8D  A901        :CMA20  LDA     # LOW CTAB
7C8F  8590                STA     TABADR
7C91  A97D                LDA     # HIGH CTAB
7C93  8591                STA     TABADR+1
7C95  20BD7C              JSR     CMACOM          ; SEARCH 'CTAB'
7C98  D01E ^7CB8          BNE     :CMA99          ; NOT IN 'CTAB' -- INVALID.
7C9A  98                  TYA
7C9B  2C1005              BIT     CTABAT
7C9E  F007 ^7CA7          BEQ     :CMA90          ; WRONG COMMAND TYPE.
                  ; COMMAND IS IN 'CTAB'
7CA0  8C1005      :CMA50  STY     CTABAT          ; STORE 'ATTRIBUTE'.
7CA3  A900                LDA     #0              ; SET CC FOR EXIT.
7CA5  F011 ^7CB8          BEQ     :CMA99          ; (BRA).
7CA7  A983        :CMA90  LDA     #NRCERR         ; WRONG COMMAND TYPE.
7CA9  D00D ^7CB8          BNE     :CMA99          ; (BRA).
                  ;
                  ; SBCMAT -- SUBCOMMAND MATCH ROUTINE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = INDEX TO THE SUBCOMMAND TABLE FROM 'SBCTAB'
                  ;       'JNLN' POINTS TO SOURCE STATEMENT.
                  ;       Y = INDEX TO START OF SUBCOMMAND NAME.
                  ;
                  ;       JSR SBCMAT
                  ;       BNE NO MATCH IN TABLE (A = ERROR CODE, Y UNCHANGED)
                  ;
                  ;       X = VALUE OF 'SBCTAB' DATA BYTE FOR ENTRY ('OFFSET' OR 'VALUE')
                  ;       Y = INDEX TO START OF FIELD AFTER COMMAND NAME.
                  ;
7CAB  BD207E      SBCMAT  LDA     SBCTAB,X        ; SELECT SUBCOMMAND TABLE.
7CAE  8590                STA     TABADR
7CB0  BD217E              LDA     SBCTAB+1,X
7CB3  8591                STA     TABADR+1
7CB5  20BD7C              JSR     CMACOM          ; COMMON CODE.
                  ; *** OPTIONAL ENTRY FROM 'CMATCH' ***
7CB8              :CMA99
7CB8  08                  PHP                     ; SAVE CC.
7CB9  A4A1                LDY     TEMP            ; RESTORE INDEX IN 'INLN'.
7CBB  28                  PLP                     ; RESTORE CC FOR CALLER.
7CBC  60                  RTS
7CBD                      PROC
                  ;
                  ; CMACOM -- COMMON CODE FOR 'CMATCH' AND 'SBCMAT'
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'TABADR' = BASE ADDRESS OF MATCH TABLE.
                  ;       'INLN' POINTS TO SOURCE STATEMENT.
                  ;       Y = CURRENT INDEX IN 'INLN'
                  ;
                  ;       JSR CMACOM
                  ;       BNE NO MATCH IN TABLE (A = ERROR CODE)
                  ;
                  ;       X = 'OFFSET' BYTE
                  ;       Y = 'ATTRIBUTE' BYTE
                  ;       TEMP = INDEX TO START OF FIELD AFTER COMMAND NAME.
                  ;
                  ;
                  ; ALAS THE INDIRECT INDEXING OF THE 6502.
                  ;       MOVE '(INLN),Y' THROUGH '(INLN),Y + INBFSZ-1 TO
                  ;       A FIXED BUFFER, 'INLNBF', SO THAT 'X' CAN INDEX 'INLN'
                  ;       WHILE 'Y' INDEXES THE TABLE.
                  ;
                  ;       CONVERT LC -> UC IN 'INLNBF'.
7CBD  20139F      CMACOM  JSR     SLB             ; SKIP LOADING BLANKS
7CC0  84A1                STY     TEMP            ; SAVE INDEX IN 'INLN'
7CC2  20F79B              JSR     MVINLN          ; MOVE 'PART' OF 'INLN'
7CC5  A0FF                LDY     #$FF            ; SEARCH FROM THE BEGINNING OF '(TABADR)'
                                                  ; (PRE-DECREMENT).
7CC7  A2FF                LDX     #$FF            ; START AT TWO BEGINNING OF THE SOURCE.
                                                  ; (PRE-DECREMENT).
7CC9  C8          :CMA05  INY                     ; NEXT TABLE CHARACTER.
7CCA  E8                  INX                     ; NEXT SOURCE CHARACTER.
7CCB  B190                LDA     (TBLBAS),Y      ; SEE IF END OF NAME IN TABLE.
7CCD  3022 ^7CF1  :CMA10  BMI     :CMA70          ; YES -- MATCH FOUND.
7CCF  DD3805              CMP     INLNBF,X        ; MATCH NEXT SOUPCE CHAR?
7CD2  F0F5 ^7CC9          BEQ     :CMA05          ; YES -- CONTINUE COMPARISON.
7CD4  C8          :CMA20  INY                     ; SCAN TO END OF NANE ENTRY.
7CD5  B190                LDA     (TBLBAS),Y
7CD7  10FB ^7CD4          BPL     :CMA20
7CD9  C8                  INY                     ; SCAN PAST 'ATTRIBUTE' BYTE.
7CDA  C8                  INY                     ; SCAN PAST 'OFFSET' BYTE.
7CDB  C0F2                CPY     #$FF-INBFSZ-3   ; WILL INDEX WRAP?
7CDD  9008 ^7CE7          BCC     :CMA30          ; NO.
7CDF  98                  TYA                     ; YES -- ADJUST BASE POINTER.
7CE0  A210                LDX     #TBLBAS-DTAB
7CE2  20089D              JSR     DADDP
7CE5  A000                LDY     #0              ; ... AND RESET INDEX.
7CE7  A200        :CMA30  LDX     #0              ; RESTORE SOURCE INDEX.
7CE9  B190                LDA     (TBLBAS),Y      ; CHECK FOR END OF TABLE.
7CEB  D0E0 ^7CCD          BNE     :CMA10          ; NO -- KEEP CHECKING.
7CED  A902                LDA     #IVCERR         ; TABLE END -- INVALID COMMAND.
7CEF  D00F ^7D00          BNE     :CMA90          ; (BRA).
7CF1  48          :CMA70  PHA                     ; VALUE OF 'ATTRIBUTE' BYTE.
7CF2  8A                  TXA                     ; OFFSET IN 'INLNBF'.
7CF3  18                  CLC
7CF4  65A1                ADC     TEMP            ; + INITIAL OFFSET IN 'INLN'.
7CF6  85A1                STA     TEMP            ; INDEX TO START OF FIELD AFTER NAME.
7CF8  C8                  INY
7CF9  B190                LDA     (TBLBAS),Y      ; 'OFFSET' BYTE.
7CFB  AA                  TAX
7CFC  68                  PLA                     ; VALUE OF 'ATTRIBUTE' BYTE.
7CFD  A8                  TAY
7CFE  A900                LDA     #0              ; SET CC FOR EXIT.
7D00  60          :CMA90  RTS
7D01                      PROC
                  ;
                  ; 'USRTAB' -- USFR EXTENDABLE COMMAND TABLE
                  ;
                  ; SAVE STRUCTURE AS 'CTAB'
                  ;
                  ; THE EQUIVALENT 'CDTAB' IS APPENDED TO 'USRTAB' SO THAT
                  ; THE OFFSETS ARE ACTUALLY FROM THE BEGINNING OF 'USRTAB'.
                  ;
                  ; THE TOTAL LENGTH CF 'USRTAB' MAY NOT EXCEED 'USRMAX'.
                  ;
                  ; COMMAND TABLE
                  ;
                  ; CONSISTS OF N ENTRIES, EACH OF THE FOLLOWING FORMAT:
                  ;
                  ;       DB "<COMMAND NAME> ".
                  ;           $80+ [IMMEDIATE]+[RUN]+[: REQUIRED].
                  ;           INDEX TO COMMAND DATA TABLE.
                  ;
                  ; THE TABLE IS ENDED BY "<NAME>" = 0.
                  ; ORDER OF ENTRIES IS ONLY RESTRICTED BY FIRST FOUND - FIRST MATCHED, NOT BEST FIT.
                  ;
      = 0080      SB      = $80                   ; SIGN BIT.
      = 0040      CTIMM   = $40                   ; IMMEDIATE COMMAND.
      = 0020      CTRUN   = $20                   ; RUN COMMAND.
      = 0010      CTCLN   = $10                   ; : REQUIRED.
      = 0060      CTBOTH  = CTIMM+CTRUN           ; IMMEDIATE OR RUN COMMAND.
      = 0060      CTNORM  = CTBOTH+CTCLN-CTCLN    ; IMMEDIATE OR RUN COMMAND, : REQUIRED.
      = 7D01      CTAB    = *                     ; INTERNAL COMMAND TABLE BASE ADDRESS.
7D01  44454C4159          DB   'DELAY',SB+CTNORM,:CDSPD-CDTAB ; DELAY.
7D08  4C495354C0          DB   'LIST',SB+CTIMM,:CDLST-CDTAB  ; LIST STORED PROGRAM.
7D0E  44454CC00A          DB   'DEL',SB+CTIMM,:CDDEL-CDTAB   ; DELETE RANGE OF LINES.
7D13  52554EC00E          DB   'RUN',SB+CTIMM,:CDRUN-CDTAB   ; RUN STORED PROGRAM.
      = 0000              IF   DOS
   -                      DB   'DOS',SB+CTIMM,:CDDOS-CDTAB   ; GO TO DOS UTILITY.
                          ENDIF
7D18  53415645C0          DB   'SAVE',SB+CTIMM,:CDSAV-CDTAB  ; SAVE STORED PROGRAM.
7D1E  4E4557C048          DB   'NEW',SB+CTIMM,:CDNEW-CDTAB   ; CLEAR PROGRAM & VARS.
7D23  4155544FC0          DB   'AUTO',SB+CTIMM,:CDAUT-CDTAB  ; AUTO-INPUT.
7D29  52454EC01A          DB   'REN',SB+CTIMM,:CDREN-CDTAB   ; RENUMBER PROGRAM.
7D2E  434F4E54C0          DB   'CONT',SB+CTIMM,:CDCON-CDTAB  ; CONTINUE.
7D34  5053C01C            DB   'PS',SB+CTIMM,:CDCOL-CDTAB    ; TURTLE PEN STATUS.
7D38  4553C01E            DB   'ES',SB+CTIMM,:CDENS-CDTAB    ; TURTLE ENVIRONMENT STATUS.
7D3C  434F4C4F52          DB   'COLORS',SB+CTIMM,:CDPAL-CDTAB ; PALETTE OF COLORS.
7D44  444952C022          DB   'DIR',SB+CTIMM,:CDDIR-CDTAB   ; DISK DIRECTORY.
7D49  48454C50C0          DB   'HELP',SB+CTIMM,:CDCOM-CDTAB  ; COMMAND LIST.
7D4F  44554D50E0          DB   'DUMP',SB+CTBOTH,:CDDMP-CDTAB ; DUMP.
7D55  4C4F4144E0          DB   'LOAD',SB+CTBOTH,:CDLOD-CDTAB ; LOAD.
7D5B  4D45524745          DB   'MERGE',SB+CTIMM,:CDMRG-CDTAB ; MERGE.
7D62  415050454E          DB   'APPEND',SB+CTIMM,:CDAPP-CDTAB ; APPEND.
7D6A  5452414345          DB   'TRACE',SB+CTBOTH,:CDTRC-CDTAB ; TRACE.
7D71  564E4557E0          DB   'VNEW',SB+CTBOTH,:CDNWV-CDTAB  ; VNEW.
7D77  5456E04C            DB   'TV',SB+CTBOTH,:CDTV-CDTAB     ; TV.
7D7B  43414C4CE0          DB   'CALL',SB+CTNORM,:CDCAL-CDTAB  ; CALL.
7D81  54415045E0          DB   'TAPE',SB+CTNORM,:CDCSS-CDTAB  ; CASSETTE ON/OFF.
7D87  5453594E43          DB   'TSYNC',SB+CTNORM,:CDSNC-CDTAB ; CASSETTE SYNC.
7D8E  52454144E0          DB   'READ',SB+CTNORM,:CDIN-CDTAB   ; READ RECORD.
7D94  5752495445          DB   'WRITE',SB+CTNORM,:CDOUT-CDTAB ; WRITE RECORD.
7D9B  434C4F5345          DB   'CLOSE',SB+CTNORM,:CDDON-CDTAB ; CLOSE FILE.
7DA2  54E000              DB   'T',SB+CTNORM,:CDT-CDTAB      ; TYPE.
7DA5  4C45545445          DB   'LETTERS',SB+CTRUN,:CDLTR-CDTAB ; LETTERS
7DAE  414BE064            DB   'AK',SB+CTNORM,:CDAK-CDTAB    ; ACCEPT KEYSTROKE.
7DB2  4158E062            DB   'AX',SB+CTNORM,:CDAX-CDTAB    ; ACCEPT LITERAL.
7DB6  41E02E              DB   'A',SB+CTNORM,:CDA-CDTAB      ; ACCEPT.
7DB9  43E030              DB   'C',SB+CTNORM,:CDC-CDTAB      ; COMPUTE.
7DBC  55E032              DB   'U',SB+CTNORM,:CDU-CDTAB      ; USE.
7DBF  45E034              DB   'E',SB+CTNORM,:CDE-CDTAB      ; END.
7DC2  4A4DE036            DB   'JM',SB+CTNORM,:CDJM-CDTAB    ; JUMP ON MATCH.
7DC6  4AE038              DB   'J',SB+CTNORM,:CDJ-CDTAB      ; JUMP.
7DC9  4752E03A            DB   'GR',SB+CTNORM,CDG-CDTAB      ; GRAPHICS.
7DCD  4D5358E03C          DB   'MSX',SB+CTNORM,:CDMSX-CDTAB
7DD2  4D53E03E            DB   'MS',SB+CTNORM,:CDMS-CDTAB    ; MATCH (PRODUCING)
7DD6  4D58E040            DB   'MX',SB+CTNORM,:CDMX-CDTAB
7DDA  4DE042              DB   'M',SB+CTNORM,:CDM-CDTAB      ; MATCH.
7DDD  534FE044            DB   'SO',SB+CTNORM,:CDS-CDTAB     ; SOUNDS.
7DE1  52E006              DB   'R',SB+CTNORM,:CDR-CDTAB      ; REMARK.
7DE4  5041E046            DB   'PA',SB+CTNORM,:CDW-CDTAB     ; PAUSE.
7DE8  59E002              DB   'Y',SB+CTNORM,:CDY-CDTAB      ; TYPE IF YES.
7DEB  4EE004              DB   'N',SB+CTNORM,:CDN-CDTAB      ; TYPE IF NO.
7DEE  504F53E054          DB   'POS',SB+CTNORM,:CDPOS-CDTAB  ; POSITION.
7DF3  53544F50A0          DB   'STOP',SB+CTRUN,:CDSTP-CDTAB  ; STOP.
7DF9  5345545045          DB   'SETPEN',SB+CTNORM,:CDSTC-CDTAB ; SET COLOR.
7E01  5345544C45          DB   'SETLET',SB+CTNORM,:CDSTL-CDTAB    ; SET LETTERS
7E09  5343524F4C          DB   'SCROLL',SB+CTBOTH,:CDSCR-CDTAB ; SCROLL SELECT.
7E11  5353415645          DB   'SSAVE',SB+CTNORM,:CDSSA-CDTAB  ; SCREEN SAVE.
7E18  534C4F4144          DB   'SLOAD',SB+CTNORM,:CDSLO-CDTAB  ; SCREEN LOAD.
7E1F  00                  DB   0                               ; END OF TABLE.
                  ;
                  ; SUBCOMMAND TABLES
                  ;
                  ; THERE CAN BE UP TO 128 SUBCOMMAND TABLES.
                  ; THE STRUCTURE OF EACH IS IDENTICAL TO THE COMMAND TABLE EXCEPT:
                  ;       THE 'OFFSET' BYTE CAN REPRESENT A 'VALUE', WITH THE
                  ;       CALLER DECIDING WHICH.
                  ;
                  ; THE CALLER SELECTS WHICH SUBCOMMAND TABLE BY SETTING ON INDEX
                  ; TO THE TABLE ADDRESS FROM 'SBCTAB'.
                  ;
      = 7E20      SBCTAB  = *                     ; BASE ADDRESS OF SUBCOMMAND TABLE ADDRESSES
      = 0000      OPTABX  = *-SBCTAB              ; NUMERICAL/RELATONAL OPERATIONS (BINARY).
7E20  347E                DW OPTAB
      = 0002      UNTABX  = *-SBCTAB              ; UNARY OPERATORS.
7E22  677E                DW UNTAB
      = 0004      GTABX   = *-SBCTAB              ; GRAPHICS SUBCOMMAND TABLE.
7E24  767E                DW GTAB
      = 0006      PCTABX  = *-SBCTAB              ; PEN COLOR TABLE.
7E26  707F                DW PCTAB
      = 0008      UPDWNX  = *-SBCTAB              ; UP/DOWN TABLE.
7E28  E17F                DW UPDTAB
      = 000A      ONOFFX  = *-SBCTAB              ; ON/OFF COMMAND TABLE.
7E2A  EC7F                DW ONFTAB
      = 000C      LTTABX  = *-SBCTAB              ; LETTERS COMMAND TABLE.
7E2C  F67F                DW LTRTAB
      = 000E      EDTABX  = *-SBCTAB              ; EDGE COMMAND TABLE.
7E2E  0D80                DW EDGTAB
      = 0010      SCTABX  = *-SBCTAB              ; SCROLL OPTION TABLE.
7E30  2880                DW SCRLTB
      = 0012      WLTABX  = *-SBCTAB              ; WALL OPTION TABLE.
7E32  3780                DW WALLTB
      = 7E34      OPTAB = *                       ; NUMERIC/RELATIONAL OPERATORS (BINARY).
7E34  2B8000              DB   '+',SB,:CDPLS-SBDTAB
7E37  2D8002              DB   '-',SB,:CDSUB-SBDTAB
7E3A  2F8004              DB   '/',SB,:CDDIV-SBDTAB
7E3D  2A8006              DB   '*',SB,:CDMUL-SBDTAB
7E40  3C3E8008            DB   '<>',SB,:CDNE-SBDTAB
7E44  3E3D800A            DB   '>=',SB,:CDGE-SBDTAB
7E48  3C3D800C            DB   '<=',SB,:CDLE-SBDTAB
7E4C  3D800E              DB   '=',SB,:CDEQ-SBDTAB
7E4F  3E8012              DB   '>',SB,:CDGT-SBDTAB
7E52  3C8010              DB   '<',SB,:CDLT-SBDTAB
7E55  5C8014              DB   BSLASH,SB,:CDMOD-SBDTAB
7E58  414E448016          DB   'AND',SB,:CDAND-SBDTAB
7E5D  4F528018            DB   'OR',SB,:CDOR-SBDTAB
7E61  584F52801A          DB   'XOR',SB,:CDXOR-SBDTAB
      = 0000              IF   LOGGRP
   -                      DB   'LAND',SB,:CDLAN-SBDTAB
   -                      DB   'LOR',SB,:CDLOR-SBDTAB
                          ENDIF
7E66  00                  DB   0                  ; END OF TABLE.
      = 7E67      UNTAB   = *                     ; UNARY OPERATORS
7E67  2D801C              DB   '-',SB,:CDUMI-SBDTAB
7E6A  4E4F54801E          DB   'NOT',SB,:CDNOT-SBDTAB
7E6F  4C4E4F5480          DB   'LNOT',SB,:CDLNO-SBDTAB
7E75  00                  DB   0                  ; END OF TABLE.
      = 7E76      GTAB = *                        ; GRAPHIC SUB-COMMAND TABLE.
7E76  4452415754          DB   'DRAWTO',SB,:CDDRT-SBDTAB
7E7E  4452415780          DB   'DRAW',SB,:CDDRW-SBDTAB
7E84  5455524E54          DB   'TURNTO',SB,:CDTNT-SBDTAB
7E8C  5455524E80          DB   'TURN',SB,:CDTRN-SBDTAB
7E92  474F544F80          DB   'GOTO',SB,:CDGOT-SBDTAB
7E98  46494C4C54          DB   'FILLTO',SB,:CDFIT-SBDTAB
7EA0  46494C4C80          DB   'FILL',SB,:CDFIL-SBDTAB
7EA6  474F802C            DB   'GO',SB,:CDGO-SBDTAB
7EAA  4348414E47          DB   'CHANGE',SB,:CDCHG-SBDTAB
7EB2  50454E8032          DB   'PEN',SB,:CDPEN-SBDTAB
7EB7  434C454152          DB   'CLEARPENS',SB,:CDCLP-SBDTAB
7EC2  434C454152          DB   'CLEAR',SB,:CDCLR-SBDTAB
7EC9  5155495480          DB   'QUIT',SB,:CDEXI-SBDTAB
7ECF  46554C4C80          DB   'FULL',SB,:CDFUL-SBDTAB
7ED5  53504C4954          DB   'SPLIT',SB,:CDSPT-SBDTAB
7EDC  57414C4C80          DB   'WALL',SB,:CDWAL-SBDTAB
7EE2  4544474580          DB   'EDGE',SB,:CDEDG-SBDTAB
7EE8  484F4D4580          DB   'HOME',SB,:CDHOM-SBDTAB
7EEE  4E4F525448          DB   'NORTH',SB,:CDNRT-SBDTAB
7EF5  545552544C          DB   'TURTLE',SB,:CDTRT-SBDTAB
7EFD  5348414445          DB   'SHADE',SB,:CDSHD-SBDTAB
7F04  4D4F444580          DB   'MODE',SB,:CDMDE-SBDTAB
7F0A  4241434B47          DB   'BACKGROUND',SB,:CDBCK-SBDTAB
7F16  5345544880          DB   'SETH',SB,:CDTNT-SBDTAB
7F1C  5345544247          DB   'SETBG',SB,:CDBCK-SBDTAB
7F23  434C45414E          DB   'CLEAN',SB,:CDCLR-SBDTAB
7F2A  46448024            DB   'FD',SB,:CDDRW-SBDTAB
7F2E  424B8050            DB   'BK',SB,:CDBK-SBDTAB
7F32  52548028            DB   'RT',SB,:CDTRN-SBDTAB
7F36  4C548052            DB   'LT',SB,:CDLTU-SBDTAB
7F3A  534554504F          DB   'SETPOS',SB,:CDDRT-SBDTAB
7F42  5245504541          DB   'REPEAT',SB,:CDRPT-SBDTAB
7F4A  524F424F54          DB   'ROBOT',SB,:CDRBT-SBDTAB
7F51  4559455380          DB   'EYES',SB,:CDEYS-SBDTAB
7F57  5250454E80          DB   'RPEN',SB,:CDRPN-SBDTAB
7F5D  484F524E80          DB   'HORN',SB,:CDHRN-SBDTAB
7F63  5044805A            DB   'PD',SB,:CDPD-SBDTAB
7F67  50558058            DB   'PU',SB,:CDPU-SBDTAB
7F6B  50458056            DB   'PE',SB,:CDPE-SBDTAB
7F6F  00                  DB   0                  ; END OF TABLE.
      = 7F70      PCTAB = *                       ; PEN COLOR TABLE.
7F70  5245448042          DB   'RED',SB,CRED
7F75  59454C4C4F          DB   'YELLOW',SB,CYELLO
7F7D  475245454E          DB   'GREEN',SB,$C6
7F84  424C554580          DB   'BLUE',SB,CBLUE
7F8A  424C41434B          DB   'BLACK',SB,CBLACK
7F91  5748495445          DB   'WHITE',SB,$0E
7F98  4F52414E47          DB   'ORANGE',SB,$F4
7FA0  505552504C          DB   'PURPLE',SB,$52
7FA8  4752415980          DB   'GRAY',SB,$04
7FAE  53494C5645          DB   'SILVER',SB,$06
7FB6  474F4C4480          DB   'GOLD',SB,$28
7FBC  50494E4B80          DB   'PINK',SB,$46
7FC2  4C4156454E          DB   'LAVENDER',SB,$64
7FCC  42524F574E          DB   'BROWN',SB,$E0
7FD3  4245494745          DB   'BEIGE',SB,$FE
7FDA  4552415345          DB   'ERASE',SB,0
      = 7FE1      UPDTAB = *                      ; UP/DOWN TABLE.
7FE1  55508080    PCTUP   DB   'UP',SB,PCUP
7FE5  444F574E80  PCTDN   DB   'DOWN',SB,PCDN
7FEB  00                  DB   0                  ; END OF TABLE.
      = 7FEC      ONFTAB = *                      ; ON/OFF COMMAND TABLE.
7FEC  4F4E8001            DB   'ON',SB,KON
7FF0  4F46468000          DB   'OFF',SB,KOFF
7FF5  00                  DB   0                  ; END OF TABLE.
      = 7FF6      LTRTAB  = *                     ; LETTERS COMMAND TABLE.
7FF6  534D414C4C          DB   'SMALL',SB,LSMLL
7FFD  4D45444955          DB   'MEDIUM',SB,LMED
8005  4C41524745          DB   'LARGE',SB,LLRG
800C  00                  DB   0                  ; END OF TABLE.
      = 800D      EDGTAB  = *                     ; EDGE COMMAND TABLE.
800D  5752415080          DB   'WRAP',SB,EWRAP
8013  48414C5480          DB   'HALT',SB,EHALT
8019  424F554E43          DB   'BOUNCE',SB,EBNC
8021  4652454580          DB   'FREE',SB,EFREE
8027  00                  DB   0                  ; END OF TABLE.
      = 8028      SCRLTB  = *                     ; SCROLL OPTION COMMAND.
8028  434F415253          DB   'COARSE',SB,0
8030  46494E4580          DB   'FINE',SB,$FF
8036  00                  DB   0
      = 8037      WALLTB  = *                     ; WALL OPTION
8037  4E4F4E4580          DB   'NONE',SB,0
803D  00                  DB   0                  ; END OF TABLE.
                  ;
                  ; COMMAND DATA TABLE
                  ;
                  ; CONSISTS OF N WORDS, THE INDICES TO THIS TABLE ARE
                  ; CONTAINED IN 'CTAB'. THE TOTAL NUMBER OF BYTES IN THE TABLE MAY NOT
                  ; EXCEED 128.
                  ;
                  ; NOTE:  THIS OFFSET IS USED TO 'TOKENIZE' THE COMMAND.
                  ;        THE 'MSB' FLAGS THAT THE COMMAND IS IN 'USRTAB',
                  ;        THE USER EXTENDABLE COMMAND TABLE.
                  ;        ($FE AND $FF ARE RESERVED.)
                  ;
                  ; 'CDTAB' IS SEGMENTED FOR ': CONTINUATION' IN RUN MODE.
                  ; ENTRIES BEFORE 'CLNCNT' ALLOW ': CONTINUATION'?
                  ; OTHER ENTRIES DO NOT.
                  ;
      = 803E      CDTAB = *         ; COMMAND DATA TABLE BASE ADDRESS.
                  ; ': CONTINUATION' IS VALID IN RUN MODE.
803E  E183        :CDT    DW   XTYPE
8040  6684        :CDY    DW   XTYPE2
8042  6E84        :CDN    DW   XTYPE3
8044  7484        :CDR    DW   XREM
                  ; ': CONTINUATION' IS NOT VALID IN RUN MODE.
      = 0008      CLNCNT  =    *-CDTAB
8046  A790        :CDLST  DW   XLIST
8048  6F91        :CDDEL  DW   XDELET
804A  A688        :CDDMP  DW   XDUMP
804C  F284        :CDRUN  DW   XRUN
      = 0000              IF   DOS
   -              :CDDOS  DW   XDOS
                          ENDIF
804E  FC8F        :CDLOD  DW   XLOAD
8050  2B90        :CDMRG  DW   XMERGE
8052  3890        :CDAPP  DW   XAPPND
8054  CB8F        :CDSAV  DW   XSAVE
8056  1391        :CDAUT  DW   XAUTO
8058  FF91        :CDREN  DW   XREN
805A  1F8A        :CDCOL  DW   XCOLRS
805C  A48A        :CDENS  DW   XENVIR
805E  098A        :CDPAL  DW   XPALET
8060  C38E        :CDDIR  DW   XDIR
8062  068F        :CDCOM  DW   XCOMM
8064  D387        :CDCAL  DW   XCALL
8066  BA8F        :CDTRC  DW   XTRACE
8068  868F        :CDCSS  DW   XCASS
806A  9C8F        :CDSNC  DW   XCSYNC
806C  4385        :CDA    DW   XACCPT
806E  4B8B        :CDC    DW   XCMPUT
8070  E987        :CDU    DW   XUSE
8072  C284        :CDE    DW   XEND
8074  7888        :CDJM   DW   XJMPM
8076  0F88        :CDJ    DW   XJMP
8078  178C        CDG     DW   XGRAPH
807A  2C87        :CDMSX  DW   XMATSX
807C  3287        :CDMS   DW   XMWSP
807E  7086        :CDMX   DW   XMATX
8080  6C86        :CDM    DW   XMATCH
8082  CA8C        :CDS    DW   XSOUND
8084  548F        :CDW    DW   XWAIT
8086  B987        :CDNEW  DW   XNEW
8088  A087        :CDNWV  DW   XNEWV
808A  218B        :CDTV   DW   XTV
808C  6A8D        :CDIN   DW   XIN
808E  C48D        :CDOUT  DW   XOUT
8090  F78D        :CDDON  DW   XDONE
8092  7A84        :CDPOS  DW   XPOS
8094  31A4        :CDSTC  DW   XSETP
8096  26A4        :CDSTL  DW   XSETL
8098  4A90        :CDLTR  DW   XLETTR
809A  778F        :CDSPD  DW   XSPEED
809C  3485        :CDCON  DW   XCONT
809E  ED84        :CDSTP  DW   XSTOP
80A0  5786        :CDAX   DW   XACCX
80A2  6486        :CDAK   DW   XACCK
80A4  7F90        :CDSCR  DW   XSCROLL
80A6  088E        :CDSSA  DW   XSSAV
80A8  5E8E        :CDSLO  DW   XSLOD
      = 006C      TABLEN  SET *-CDTAB
      = 006C      USROFF  EQU TABLEN              ; USER TOKENS START AT THIS NUMBER.
      = 0092      USRMAX  EQU TKNCNT-USROFF       ; USER TABLE OFFSET MAY NOT EXCEED USRMAX.
                  ; SUBCOMMAND DATA TABLE
                  ;
                  ; CORRESPONDING DATA TABLE
                  ;
      = 80AA      SBDTAB  = *
80AA  329C        :CDPLS  DW   DADDI
80AC  429C        :CDSUB  DW   DSUBI
80AE  879C        :CDDIV  DW   DDIVI
80B0  549C        :CDMUL  DW   DMULI
80B2  259D        :CDNE   DW   DNETI
80B4  3C9D        :CDGE   DW   DGETI
80B6  439D        :CDLE   DW   DLETI
80B8  1E9D        :CDEQ   DW   DEQTI
80BA  359D        :CDLT   DW   DLTTI
80BC  2C9D        :CDGT   DW   DGTTI
80BE  E59C        :CDMOD  DW   DMODI
80C0  689D        :CDAND  DW   DANDI
80C2  779D        :CDOR   DW   DORI
80C4  869D        :CDXOR  DW   DXORI
      = 0000              IF   LOGGRP
   -              :CDLAN  DW   DLANDI
   -              :CDLOR  DW   DLORI
                          ENDIF
80C6  F19C        :CDUMI  DW   DNEGI
80C8  959D        :CDNOT  DW   DNOTI
80CA  579D        :CDLNO  DW   DLNOTI
80CC  B5A1        :CDDRT  DW   GDRWTO
80CE  0FA2        :CDDRW  DW   GDRW
80D0  E9A1        :CDTNT  DW   GTRNTO
80D2  57A2        :CDTRN  DW   GTRN
80D4  B9A1        :CDGOT  DW   GGOTO
80D6  13A2        :CDGO   DW   GGO
80D8  B1A1        :CDFIT  DW   GFILTO
80DA  0BA2        :CDFIL  DW   GFIL
80DC  75A2        :CDPEN  DW   GPEN
80DE  E2A2        :CDCHG  DW   GCHNGE
80E0  ADA3        :CDCLP  DW   GCLRPN
80E2  A0A3        :CDCLR  DW   GCLEAR
80E4  91A3        :CDEXI  DW   GEXIT
80E6  79A1        :CDFUL  DW   GFULL
80E8  98A1        :CDSPT  DW   GSPLIT
80EA  53A3        :CDWAL  DW   GWALL
80EC  DBA3        :CDEDG  DW   GEDGE
80EE  B7A3        :CDHOM  DW   GHOME
80F0  CDA3        :CDNRT  DW   GNORTH
80F2  FBA3        :CDTRT  DW   GTURTL
80F4  1AA3        :CDSHD  DW   GSHADE
80F6  3DA1        :CDMDE  DW   GMODE
80F8  C6A2        :CDBCK  DW   GBACK
80FA  FBA1        :CDBK   DW   GBK
80FC  4CA2        :CDLTU  DW   GLT
80FE  B98C        :CDRPT  DW   GREPT
8100  BDA2        :CDPE   DW   GPE
8102  ABA2        :CDPU   DW   GPU
8104  B4A2        :CDPD   DW   GPD
8106  5DB3        :CDRBT  DW   RONOFF
8108  89B3        :CDEYS  DW   REYES
810A  9AB3        :CDRPN  DW   RPEN
810C  B3B3        :CDHRN  DW   RHORN
      = 0064      TABLEN  SET    *-SBDTAB         ; THIS MUST NOT EXCEED 0100 HEX.
                          ASSERT TABLEN<$100
810E                      PROC
                  ;
                  ; COND -- CONDITIONAL EXECUTION PROCESSOR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'INLN' POINTS TO STATEMENT TO BE PROCESSED
                  ;       Y = INDEX TO START OF CONDITION.
                  ;       'MATCHF' = 0 (FALSE) OR $FF (TRUE) , RESULT OF PRIOR 'M' COMMAND
                  ;
                  ;       JSR     COND
                  ;
                  ;       Y = INDEX TO ':' IN STATEMENT + 1.
                  ;       'EXECF' = 0 IF STATEMENT IS NOT TO BE EXECUTED.
                  ;
                  ; NOTE: GOES TO 'PSTOP' ON ERROR.
                  ;
                  ; NOTE: 'LOOK AHEAD' CODE FOR GRAPHICS SUBCOMMANDS BEGINNING
                  ;       WITH 'Y' OR 'N'
                  ;
810E  A9FF        COND    LDA     #$FF            ; PRESET EXECUTE FLAG.
8110  8D0605              STA     EXECF
8113  20139F              JSR     SLB             ; GET FIRST CHAR OF CONDITION FIELD.
                  ; VALID CHARACTERS ARE Y,N,(,:
8116  0920                ORA     #LC             ; FORCE LOWER CASE.
8118  C979                CMP     #'Y'+$20        ; CHECK FOR 'Y' OR 'N' FIRST.
811A  D005 ^8121          BNE     :CN010
811C  A5FE                LDA     MATCHF          ; 'Y' -- IF 'MATCHF' IS TRUE, RESULT IS TRUE.
811E  4C3581              JMP     :CN015
8121  C96E        :CN010  CMP     #'N'+$20
8123  D017 ^813C          BNE     :CN030          ; NOT 'Y' OR 'N'.
                  ; SPECIAL CASE '(IMPLIED GR:) NORTH'
8125  C8                  INY
8126  B180                LDA     (INLN),Y
8128  88                  DEY                     ; POINT INDEX TO 'N'.
8129  0920                ORA     #LC             ; FORCE LOWER CASE.
812B  C96F                CMP     #'O'+$20        ; LOWER CASE 'O'?
812D  F02D ^815C          BEQ     :CN070          ; YES -- TRY 'NORTH'.
812F  A5FE                LDA     MATCHF          ; 'N' -- IF 'MATCHF' IS FALSE, RESULT IS TRUE.
8131  F005 ^8138          BEQ     :CN017
8133  A900                LDA     #0
8135  8D0605      :CN015  STA     EXECF
8138  C8          :CN017  INY
8139  20139F              JSR     SLB             ; GET NEXT NON-BLANK CHARACTER.
813C  B180        :CN030  LDA     (INLN),Y
813E  C928                CMP     #'('             ; SEE IF ARITHMETIC EXPRESSION.
8140  D015 ^8157          BNE     :CN050          ; NO -- ALL DONE.
8142  200FA0              JSR     EXPP            ; EVALUATE EXPRESSION IN PARENS.
8145  A594                LDA     EXPSTK+1        ; SEE IF RESULT > ZERO.
8147  3006 ^814F          BMI     :CN032          ; NO -- NEGATIVE.
8149  D009 ^8154          BNE     :CN040          ; YES -- POSITIVE & NON-ZERO.
814B  A593                LDA     EXPSTK          ; NOT SURE -- TEST LSB.
814D  D005 ^8154          BNE     :CN040          ; POSITIVE & NON-ZERO.
814F  A900        :CN032  LDA     #0              ; NO -- CONDITION FALSE.
8151  8D0605              STA     EXECF
8154  20139F      :CN040  JSR     SLB             ; GET NEXT NON-BLANK CHARACTER.
8157  C93A        :CN050  CMP     #':'             ; COLON?
8159  D002 ^815D          BNE     :CN080          ; NO.
815B  C8                  INY                     ; SKIP OVER ':'.
815C  60          :CN070  RTS
                  ; ':-REQUIRED' ATTRIBUTE ONLY AVAILABLE DURING SYNTAX CHECK.
815D  A592        :CN080  LDA     EXEC            ; CHECK ': REQUIRED'?
815F  D0FB ^815C          BNE     :CN070          ; NO.
8161  A910                LDA     #CTCLN          ; ':' REQUIRED FOR THIS COMMAND?
8163  2C1005              BIT     CTABAT
8166  F0F4 ^815C          BEQ     :CN070          ; NO.
8168  88                  DEY
8169  A902                LDA     #CNDERR         ; YES -- ERROR.
816B  4C3A7A              JMP     PSTOP
816E                      PROC
                  ;
                  ; ATOM -- FIND, IDENTIFY & EVALUATE THE NEXT ATOM IN THE STATEMENT LINE.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'INLN' POINTS TO THE STATEMENT LINE.
                  ;       Y = INDEX TO END OF PRIOR ATOM + 1.
                  ;
                  ;       JSR     ATOM
                  ;       BNE     SYNTAX ERROR
                  ;
                  ;       A = ATOM IDENTIFIER CODE
                  ;       Y = INDEX TO END OF ATOM 1 (OR BEGINNING OF ATOM FOR TEXT TYPE).
                  ;       'NUMBER' = VALUE OF NUMERIC CONSTANT OR NUMERIC VARIABLE IF 'EXEC'.
                  ;       'POINT' = ADDRESS OF NUMERIC VARIABLE OR OPERATOR ROUTINE IF 'EXEC'.
                  ;       'NP' POINTS TO STRING VARIABLE NAME.
                  ;       'DP' POINTS TO STRING VARIABLE VALUE (IF DEFINED).
                  ;
816E  20139F      ATOM    JSR     SLB             ; SKIP LEADING BLANKS, IF PRESENT.
                  ; *** INTERNAL RE-ENTRY POINT ***
8171  20F99E      ATOM2   JSR     CHKTRM          ; NULL ATOM (STATEMENT TERMINATOR)?
8174  F038 ^81AE          BEQ     :AT100          ; YES.
8176  C923                CMP     #'#'            ; NUMERIC VARIABLE?
8178  F039 ^81B3          BEQ     :AT200          ; YES.
817A  C940                CMP     #'@'            ; POINTER?
817C  D003 ^8181          BNE     :AT002          ; NO.
817E  4C1382              JMP     :AT250          ; YES.
8181  C924        :AT002  CMP     #'$'            ; STRING VARIABLE?
8183  D003 ^8188          BNE     :AT003          ; NO.
8185  4C5182              JMP     :AT300          ; YES.
8188  C925        :AT003  CMP     #'%'            ; JOYSTICK/PADDLE/LIGHTPEN?
818A  D003 ^818F          BNE     :AT005          ; NO.
818C  4CC782              JMP     :AT700          ; YES.
818F  20839E      :AT005  JSR     CNUMBR          ; NUMERIC LITERAL?
8192  B003 ^8197          BCS     :AT010          ; NO
8194  4C9F82              JMP     :AT400          ; YES.
8197  A200        :AT010  LDX     #OPTABX         ; SPECIAL OPERATOR?
8199  20AB7C              JSR     SBCMAT
819C  D003 ^81A1          BNE     :AT020          ; NO.
819E  4CAC82              JMP     :AT600          ; YES.
81A1  B180        :AT020  LDA     (INLN),Y        ; RESTORE CHAR.
81A3  20919E              JSR     CLETTR          ; CONTEXT DEPENDENT TEXT?
81A6  B003 ^81AB          BCS     :AT099          ; NO.
81A8  4CA882              JMP     :AT500          ; YES.
81AB  A902        :AT099  LDA     #ATMERR         ; NONE OF THE ABOVE -- ERROR.
81AD  60                  RTS                     ; RETURN WITH CC SET.
                  ; NULL ATOM -- <EOL>
81AE  A901        :AT100  LDA     #NULL
81B0  4CA983              JMP     ATMRET
                  ; NUMERIC VARIABLE -- #<ANY NUMBER OF ALPHANUM>.
81B3  C8          :AT200  INY
81B4  B180                LDA     (INLN),Y        ; CHECK CHARACTER AFTER '#'.
81B6  20B69E              JSR     CKEOA
81B9  F0F0 ^81AB          BEQ     :AT099
81BB  A580                LDA     INLN            ; SET NAME POINTER TO NAME.
81BD  85BE                STA     NP
81BF  A581                LDA     INLN+1
81C1  85BF                STA     NP+1
81C3  84C0                STY     NP+2
81C5  20CB9E              JSR     SCEOA           ; SCAN TO END OF ATOM.
                  ; SKIP NUMBERIC VARIABLE LOCKUP IF NOT (EXEC).
81C8  A592                LDA     EXEC
81CA  F043 ^820F          BEQ     :AT220
81CC  84C1                STY     NP+3            ; SAVE LINE INDEX
                  ; ENTRY TO 'FIND' A "JUST - DEFINED" VARIABLE.
81CE  20AD9E      :AT205  JSR     SETSVL          ; SET LIST POINTER TO VARIABLES.
81D1  A940                LDA     #ATRNUM         ; 'NUMERIC' ATTRIBUTE.
81D3  8D6605              STA     ATRTYP
81D6  20CE98              JSR     SFIND           ; FIND VARIABLF IF DEFINED.
81D9  F01B ^81F6          BEQ     :AT210          ; DEFINED.
81DB  A900                LDA     #0              ; DATA = 00.
81DD  85B8                STA     NUMBER
81DF  85B9                STA     NUMBER+1
81E1  85C4                STA     DP+2
                  ; *S*   LDA     # HIGH NUMBER
81E3  85C3                STA     DP+1
81E5  A9B8                LDA     # LOW NUMBER
81E7  85C2                STA     DP
81E9  A902                LDA     #2
81EB  85C5                STA     DP+3
81ED  200599              JSR     SINSRT          ; INSEPT NUMERIC (VALUE = 0).
81F0  D0B9 ^81AB          BNE     :AT099          ; ERROR -- NO ROOM.
81F2  A4C1                LDY     NP+3            ; SEARCH AGAIN -- FIND IT.
81F4  D0D8 ^81CE          BNE     :AT205          ; (BRA).
81F6  A236        :AT210  LDX     #POINT-DTAB     ; ADDRESS OF VALUE ...
81F8  A042                LDY     #DP-DTAB
81FA  20459A              JSR     DMOVI
81FD  A5C4                LDA     DP+2
81FF  20049D              JSR     DADDS           ; ... IN 'POINT'.
8202  A000                LDY     #0              ; VALUE IN 'NUMBER'.
8204  B1B6                LDA     (POINT),Y
8206  85B8                STA     NUMBER
8208  C8                  INY
8209  B1B6                LDA     (POINT),Y
820B  85B9                STA     NUMBER+1
820D  A4C1                LDY     NP+3            ; RESTORE LINE INDEX.
820F  A904        :AT220  LDA     #NVAR
8211  D072 ^8285          BNE     :AT340          ; (BRA) TO 'ATMRET'.
                  ; POINTER (INDIRECT REFERENCE) -- @[B]<NUMERIC QUANTITY>
8213  C8          :AT250  INY                     ; EXAMINE CHARACTER AFTER '@'.
8214  B180                LDA     (INLN),Y
8216  0920                ORA     #LC             ; FORCE LOWER CASE.
8218  C962                CMP     #'B'+$20        ; POINTER TO BYTE?
821A  08                  PHP                     ; SAVE ANSWER.
821B  D001 ^821E          BNE     :AT255          ; NO -- POINTER TO WORD.
821D  C8                  INY                     ; YES -- SKIP OVER 'B'.
821E  B180        :AT255  LDA     (INLN),Y        ; GET CHARACTER FOR RECURSIVE CALL.
8220  207181              JSR     ATOM2           ; SEE WHAT FOLLOWS *** RECURSIVE CALL ***.
8223  D028 ^824D          BNE     :AT290          ; ERROR.
8225  2906                AND     #NVAR+NUM       ; MUST BE NUMERIC.
8227  F024 ^824D          BEQ     :AT290          ; ERROR.
8229  A5B8                LDA     NUMBER          ; RESULT IS ADDRESS OF DATA.
822B  85B6                STA     POINT
822D  A5B9                LDA     NUMBER+1
822F  85B7                STA     POINT+1
8231  84A1                STY     TEMP            ; SAVE LINE INDEX.
8233  A000                LDY     #0              ; GET DATA VALUE NOW.
8235  B1B6                LDA     (POINT),Y
8237  85B8                STA     NUMBER
8239  28                  PLP                     ; POINTER TO BYTE?
823A  D006 ^8242          BNE     :AT260          ; NO -- POINTER TO WORD.
823C  84B9                STY     NUMBER+1        ; YES MSB = 0.
823E  A980                LDA     #BPTR           ; TYPE = POINTER TO BYTE.
8240  D007 ^8249          BNE     :AT270          ; (BRA).
8242  C8          :AT260  INY
8243  B1B6                LDA     (POINT),Y       ; GET MSB OF DATA WORD.
8245  85B9                STA     NUMBER+1
8247  A904                LDA     #NVAR           ; TYPE = POINTER TO WORD.
8249  A4A1        :AT270  LDY     TEMP            ; RESTORE LINE INDEX.
824B  D038 ^8285          BNE     :AT340          ; (BRA) SKIP TO NORMAL RETURN.
824D  28          :AT290  PLP                     ; CLEANUP STACK BEFORE RETURN.
824E  4CAB81      :AT299  JMP     :AT099          ; ERROR RETURN (EXTENDED BRANCH)
                  ; STRING VARIABLE -- $<ANY NUMBER OF ALPHANUM>
8251  C8          :AT300  INY                     ; EXAMINE CHARACTER AFTER 'S'.
8252  B180                LDA     (INLN),Y
8254  C924                CMP     #'$'             ; STRING INDIRECTION?
8256  F030 ^8288          BEQ     :AT350          ; YES.
8258  20B69E              JSR     CKEOA           ; NO -- STRING NAME ERROR?
825B  F0F1 ^824E          BEQ     :AT299          ; YES.
825D  A580                LDA     INLN            ; NO -- SET NAME POINTER TO NAME
825F  85BE                STA     NP
8261  A581                LDA     INLN+1
8263  85BF                STA     NP+1
8265  84C0                STY     NP+2
8267  20CB9E              JSR     SCEOA           ; SCAN TO END OF ATOM.
826A  84C1                STY     NP+3            ; SAVE END INDEX.
826C  98          :AT320  TYA                     ; SAVE LINE INDEX.
826D  48                  PHA
826E  20AD9E              JSR     SETSVL          ; SET LIST POINTER TO STRING VARIABLES.
8271  A980                LDA     #ATRSTR         ; 'STRING' ATTRIBUTE.
8273  8D6605              STA     ATRTYP
8276  20CE98              JSR     SFIND           ; FIND VARIABLE IF DEFINED.
8279  D006 ^8281          BNE     :AT330          ; UNDEFINED.
827B  68                  PLA                     ; RESTORE LINE INDEX.
827C  A8                  TAY
827D  A908                LDA     #SVAR           ; DEFINED STRING VARIABLE.
827F  D004 ^8285          BNE     :AT340          ; (BRA) TO 'ATMRET'.
8281  68          :AT330  PLA                     ; RESTORE LINE INDEX.
8282  A8                  TAY
8283  A910                LDA     #USVAR          ; UNDEFINED STRING VARIABLE.
8285  4CA983      :AT340  JMP     ATMRET          ; *** SKIP BRANCH POINT ***
8288  205182      :AT350  JSR     :AT300          ; INDIRECTION -- GET NAME *** RECURSIVE CALL ***.
828B  D011 ^829E          BNE     :AT360          ; ERROR.
828D  C910                CMP     #USVAR          ; UNDEFINED STRING?
828F  F0F4 ^8285          BEQ     :AT340          ; YES -- ALL DONE.
8291  84A1                STY     TEMP            ; DEFINED -- USE DATA AS NAME FOR TARGET
8293  A23E                LDX     #NP-DTAB
8295  A042                LDY     #DP-DTAB
8297  203B9A              JSR     PMOVE
829A  A4A1                LDY     TEMP
829C  D0CE ^826C          BNE     :AT320          ; (BRA) NOW GET STRING.
829E  60          :AT360  RTS
                  ; NUMERIC LITERAL -- <DIGIT><ANY NUMBER OF DIGITS>
829F  A200        :AT400  LDX     #INLN-DTAB      ; POINT TO POINTER.
82A1  20BB9D              JSR     ASCDEC          ; CONVERT TO BINARY, RESULT TO 'NUMBER'.
82A4  A902                LDA     #NUM
82A6  D0DD ^8285          BNE     :AT340          ; (BRA) TO 'ATMRET'.
                  ; TEXT -- <LETTER><ANY NUMBER OF CHARACTERS>
82A8  A920        :AT500  LDA     #TEXT
82AA  D0D9 ^8285          BNE     :AT340          ; (BRA) TO 'ATMRET'
                  ; OPERATOR -- <OPERATOR>
82AC  BDAA80      :AT600  LDA     SBDTAB,X        ; GET OPERATE ROUTINE ADDRESS.
82AF  85B6                STA     POINT
82B1  BDAB80              LDA     SBDTAB+1,X
82B4  85B7                STA     POINT+1
82B6  A940                LDA     #OPR
82B8  D0CB ^8285          BNE     :AT340          ; (BRA) TO 'ATMRET'.
                  ; EVALUATE EXPRESSION -- %(<NEXP>)
82BA  200FA0      :AT620  JSR     EXPP            ; EVALUATE NEXP IN PARENS.
82BD  A593                LDA     EXPSTK          ; PASS BACK RESULT.
82BF  A694                LDX     EXPSTK+1
82C1  4C6283              JMP     :AT781
                  ; CONTROLLERS -- %<P!J!T><NUMBER> OR %<X!Y!Z!A!H!V!L!M!F> OR %<S!SR!ST>
82C4  4CAB81      :AT720  JMP     :AT099          ; ERROR.
82C7  C8          :AT700  INY                     ; SKIP OVER '%'.
82C8  B180                LDA     (INLN),Y        ; GET NEXT CHARACTER.
82CA  C928                CMP     #'('            ; EVAL?
82CC  F0EC ^82BA          BEQ     :AT620          ; YES.
82CE  0920                ORA     #LC             ; FORCE LOWER CASE.
82D0  C970                CMP     #'P'+$20        ; PADDLE CONTROLLER?
82D2  F035 ^8309          BEQ     :AT730          ; YES.
82D4  C96E                CMP     #'N'+$20        ; PEN NUMBER?
82D6  D003 ^82DB          BNE     :AT703          ; NO.
82D8  4CDA83              JMP     :AT960          ; YES.
82DB  C96B        :AT703  CMP     #'K'+$20        ; KEY PRESS READ?
82DD  F03B ^831A          BEQ     :AT735          ; YES.
82DF  C966                CMP     #'F'+$20        ; FREE MEMORY?
82E1  F045 ^8328          BEQ     :AT740          ; YES.
82E3  C96A                CMP     #'J'+$20        ; JOYSTICK?
82E5  F05A ^8341          BEQ     :AT760          ; YES.
82E7  C974                CMP     #'T'+$20        ; TRIGGER?
82E9  F066 ^8351          BEQ     :AT770          ; YES.
82EB  C973                CMP     #'S'+$20        ; TURTLE SENSORS?
82ED  D003 ^82F2          BNE     :AT705          ; NO.
82EF  4CAE83              JMP     :AT950          ; YES.
82F2  C978        :AT705  CMP     #'X'+$20        ; GRAPHICS X?
82F4  F074 ^836A          BEQ     :AT782          ; YES.
82F6  C979                CMP     #'Y'+$20        ; GRAPHICS Y?
82F8  F074 ^836E          BEQ     :AT784          ; YES.
82FA  C97A                CMP     #'Z'+$20        ; GRAPHICS PIXEL VALUE.
82FC  F07B ^8379          BEQ     :AT788          ; YES.
82FE  C961                CMP     #'A'+$20        ; GRAPHICS THETA ANGLE?
8300  F070 ^8372          BEQ     :AT786          ; YES.
      = 0000              IF      LITPEN
   -                      CMP     #'H'+$20        ; LIGHTPEN HORIZONTAL?
   -                      BEQ     :AT790          ; YES.
   -                      CMP     #'V'+$20        ; LIGHTPEN VERTICAL?
   -                      BEQ     :AT795          ; YES.
   -                      CMP     #'L'+$20        ; LIGHTPEN TRIGGER?
   -                      BEQ     :AT796          ; YES.
                          ENDIF
8302  C96D                CMP     #'M'+$20        ; MATCH RESULT?
8304  D0BE ^82C4          BNE     :AT720          ; NO.
8306  4C8083              JMP     :AT798          ; YES.
                  ; READ PADDLE CONTROLLER
8309  208583      :AT730  JSR     :AT800          ; GET VALUE THAT FOLLOWS 'R'.
830C  D036 ^8344          BNE     :AT761          ; ERROR.
830E  2907                AND     #$07            ; PADDLE # MODULO 8.
8310  AA                  TAX
8311  38                  SEC                     ; (CLEAR BORROW).
8312  A9E4                LDA     #228            ; RESULT = 228 - VALUE READ.
8314  FD7002              SBC     PADDL0,X
8317  4C6083              JMP     :AT780
831A  C8          :AT735  INY                     ; SKIP OVER 'K'.
831B  ADFC02              LDA     CH              ; KEYCODE READY?
831E  38                  SEC
831F  E9FF                SBC     #$FF
8321  F002 ^8325          BEQ     :AT737          ; NO.
8323  A901                LDA     #1              ; YES.
8325  4C6083      :AT737  JMP     :AT780
                  ; CALCULATE FREE MEMORY
8328  C8          :AT740  INY                     ; SKIP OVER 'F'.
8329  38                  SEC
832A  A5B2                LDA     S2L             ; 'NUMBER' = 'S2L' - 'S1H' + 1.
832C  E5B0                SBC     S1H
832E  85B8                STA     NUMBER
8330  A5B3                LDA     S2L+1
8332  E5B1                SBC     S1H+1
8334  85B9                STA     NUMBER+1
8336  E6B8                INC     NUMBER
8338  D002 ^833C          BNE     :AT745
833A  E6B9                INC     NUMBER+1
833C  A902        :AT745  LDA     #NUM            ; TYPE = NUMBER.
833E  4CA983              JMP     ATMRET
                  ; READ JOYSTICK
8341  208583      :AT760  JSR     :AT800          ; GET VALUE THAT FOLLOWS 'J'.
8344  D04D ^8393  :AT761  BNE     :AT890          ; ERROR *** SKIP BRANCH POINT ***
8346  2903                AND     #$03            ; JOYSTICK # MODULO 4.
8348  AA                  TAX
8349  BD7802              LDA     STICK0,X        ; GET JOYSTICK DATA FROM DATA BASE.
834C  490F                EOR     #$0F            ; INVERT DATA READ.
834E  4C6083              JMP     :AT780
                  ; READ TRIGGER
8351  208583      :AT770  JSR     :AT800          ; GET VALUE THAT FOLLOWS 'T'.
8354  D03D ^8393          BNE     :AT890          ; ERROR.
8356  290F                AND     #$0F            ; TRIGGER # MODULO 16.
8358  AA                  TAX
8359  BD7C02              LDA     PTRIG0,X        ; RESULT = SINGLE BIT.
835C  49FF                EOR     #$FF
835E  2901                AND     #$01
                  ; *** ENTRY FOR TURTLE SENSORS ***.
8360  A200        :AT780  LDX     #0              ; M.S.B. = 0.
8362  85B8        :AT781  STA     NUMBER          ; STORE RESULT.
8364  86B9                STX     NUMBER+1
8366  A902                LDA     #NUM            ; NUMERIC RESULT.
8368  D03F ^83A9          BNE     ATMRET          ; (BRA).
                  ; GRAPHICS PARAMETERS
836A  A26C        :AT782  LDX     #GX-DTAB        ; GRAPHICS X COORDINATE.
836C  B029 ^8397          BCS     :AT900          ; (BRA).
836E  A26F        :AT784  LDX     #GY-DTAB        ; GRAPHICS Y COORDINATE.
8370  B025 ^8397          BCS     :AT900          ; (BRA).
8372  A5F2        :AT786  LDA     THETA           ; GRAPHICS THETA ANGLE.
8374  A6F3                LDX     THETA+1
8376  C8                  INY
8377  D0E9 ^8362          BNE     :AT781          ; (BRA).
8379  C8          :AT788  INY
837A  205EAC              JSR     GREAD           ; READ GRAPHICS DATA.
837D  4C6083              JMP     :AT780
      = 0000              IF      LITPEN
                  ; READ LIGHTPEN
   -              :AT790  LDA     LPENH           ; LIGHTPEN HORIZONTAL VALUE.
   -                      BCS     :AT797          ; (BRA).
   -              :AT795  LDA     LPENV           ; LIGHTPEN VERTICAL VALUE.
   -                      BCS     :AT797          ; (BRA).
   -              :AT796  LDA     STICK0          ; GET LIGHTPEN TRIGGER.
   -                      EOR     #$01            ; INVERT BIT OF INTEREST.
   -                      AND     #$01
   -              :AT797  LDX     EXEC            ; EXECUTE MODE?
   -                      BEQ     :AT79B          ; NO.
   -                      LDX     #$0A            ; BACKGROUND = LIGHT GPAY.
   -                      STX     COLOR0+4
   -              :AT79B  INY
   -                      BNE     :AT780          ; (BRA).
                          ENDIF
                  ; READ MATCH FLAG
8380  A5FE        :AT798  LDA     MATCHF          ; MATCH RESULT FLAG.
8382  C8                  INY
8383  D0DB ^8360          BNE     :AT780          ; (BRA).
                  ; SUBROUTINE TO PROCESS NUMBER FOLLOWING %P, %J & %T.
8385  C8          :AT800  INY                     ; SKIP OVER 'P' OR 'J' OR 'T'.
8386  206E81              JSR     ATOM            ; *** RECURSIVE CALL ***.
8389  D009 ^8394          BNE     :AT895          ; ERROR.
838B  2906                AND     #NVAR+NUM       ; NUMERIC RESULT?
838D  F005 ^8394          BEQ     :AT895          ; NO -- ERROR.
838F  A5B8                LDA     NUMBER          ; YES.
8391  C5B8                CMP     NUMBER          ; SET CC FOR NORMAL EXIT.
8393  60          :AT890  RTS                     ; RETURN WITH CC SET.
8394  A902        :AT895  LDA     #ATMERR         ; INVALID # AFTER LETTER.
8396  60                  RTS                     ; RETURN WITH CC SET.
                  ; SUBROUTINE TO ROUND & STORE THE GRAPHICS COORDINATES
8397  C8          :AT900  INY
8398  B582                LDA     DTAB+2,X        ; GET FRACTIONAL PORTION.
839A  2A                  ROL     A               ; MSB OF FRACTION TO CARRY BIT.
839B  B580                LDA     DTAB+0,X        ; ROUND LSB.
839D  6900                ADC     #0
839F  85B8                STA     NUMBER
83A1  B581                LDA     DTAB+1,X        ; CARRY TO MSB.
83A3  6900                ADC     #0
83A5  85B9                STA     NUMBER+1
83A7  A902                LDA     #NUM            ; NUMERIC RESULT.
83A9  85A1        ATMRET  STA     TEMP            ; SET CC FOR EXIT.
83AB  C5A1                CMP     TEMP
83AD  60                  RTS
                  ; TURTLE SENSORS
                  ;
                  ; %S  = ROBOT IF ON, ELSE VISIBLE TURTLE.
                  ; %SR = ROBOT.
                  ; %ST = VISIBLE TURTLE.
83AE  C8          :AT950  INY                     ; SKIP OVER 'S'.
83AF  B180                LDA     (INLN),Y        ; GET NEXT CHARACTER.
83B1  C8                  INY                     ; SKIP OVER NEXT CHARACTER.
83B2  0920                ORA     #LC             ; FORCE LOWER CASE.
83B4  C972                CMP     #'R'+$20        ; %SR?
83B6  F00A ^83C2          BEQ     :AT952          ; YES.
83B8  C974                CMP     #'T'+$20        ; %ST?
83BA  F011 ^83CD          BEQ     :AT954          ; YES.
83BC  88                  DEY                     ; %S.
83BD  ADC505              LDA     RBTON           ; ROBOT OR VISIBLE?
83C0  F00B ^83CD          BEQ     :AT954          ; VISIBLE.
83C2  ADC505      :AT952  LDA     RBTON           ; SENSORS = 0 IF ROBOT OFF.
83C5  F099 ^8360          BEQ     :AT780          ; OFF.
83C7  200DB4              JSR     RRDSNS          ; ROBOT.
83CA  4C6083              JMP     :AT780
83CD  A592        :AT954  LDA     EXEC            ; EXECUTE MODE?
83CF  F006 ^83D7          BEQ     :AT956          ; NO.
83D1  2098AC              JSR     VTSENS
83D4  AD5005              LDA     TRTSNS          ; VISIBLE.
83D7  4C6083      :AT956  JMP     :AT780
                  ; %N = TURTLE PEN NUMBER
83DA  C8          :AT960  INY                     ; SKIP OVER 'N'.
83DB  AD1305              LDA     PEN             ; GET PEN #.
83DE  4C6083              JMP     :AT780
83E1                      PROC
                  ;
                  ; XTYPE -- TYPE COMMAND PROCESSOR
                  ;
83E1  20A7A0      XTYPE   JSR     TEXP            ; PROCESS TEXT EXPRESSION.
83E4  A592                LDA     EXEC            ; EXECUTE MODE?
83E6  F07D ^8465          BEQ     :XT090          ; NO.
83E8  20BB96              JSR     TSTMOD          ; CHECK SCREEN MODE.
83EB  C908                CMP     #GRFS           ; FULL SCREEN GRAPHICS.
83ED  D003 ^83F2          BNE     :XT005          ; NO.
83EF  A983                LDA     #NRCERR         ; YES -- ERROR.
83F1  60                  RTS
83F2  A68F        :XT005  LDX     TELN+3          ; CHECK FOR NULL TEXT.
83F4  F00C ^8402          BEQ     :XT010          ; NULL.
83F6  BDFFBB              LDA     TEXBUF-1,X      ; NON-NULL -- CHECK FINAL CHARACTER.
83F9  C95C                CMP     #BSLASH         ; IS IT EOL SUPPRESS?
83FB  D005 ^8402          BNE     :XT010          ; NO.
83FD  C68F                DEC     TELN+3          ; YES -- SUPPRESS ALSO.
83FF  4C0984              JMP     :XT020
8402  A99B        :XT010  LDA     #EOL            ; INSERT EOL.
8404  9D00BC              STA     TEXBUF,X
8407  E68F                INC     TELN+3
                  ; TYPE WITH WORD SPLIT AVOIDANCE.
8409  84AC        :XT020  STY     XTEMP+1         ; SAVE STATEMENT INDEX.
840B  A48E                LDY     TELN+2          ; STARTING INDEX.
840D  C48F                CPY     TELN+3
840F  F050 ^8461          BEQ     :XT080          ; NULL OUTPUT -- ALL DONE.
8411  84AB        :XT022  STY     XTEMP           ; SAVE INDEX.
8413  A655                LDX     COLCRS          ; GET CURRENT CURSOR POSITION.
8415  AD1405              LDA     GRFLAG          ; DIFFERENT CURSOR IF SPLIT SCREEN.
8418  F003 ^841D          BEQ     :XT025
841A  AE9102              LDX     TXTCOL          ; SPLIT SCREEN -- USE OTHER CURSOR.
841D  86AD        :XT025  STX     XTEMP+2         ; SAVE STARTING COLUMN #.
841F  CA                  DEX                     ; PRE-CONDITION THE INDEX.
8420  B18C        :XT030  LDA     (TELN),Y        ; FIND LENGTH OF NEXT WORD.
8422  E8                  INX
8423  C8                  INY
8424  C48F                CPY     TELN+3
8426  F004 ^842C          BEQ     :XT035          ; END OF TEXT.
8428  C920                CMP     #' '            ; SPACE?
842A  D0F4 ^8420          BNE     :XT030          ; NO -- KEEP SCANNING.
842C  A4AB        :XT035  LDY     XTEMP           ; END OF WORD -- CHECK FOR WORD SPLIT.
842E  ECB605              CPX     RGCOL           ; DOES IT WRAP SCREEN?
8431  F00C ^843F          BEQ     :XT040          ; NO -- OUTPUT IT.
8433  900A ^843F          BCC     :XT040          ; NO -- OUTPUT IT.
8435  A5AD                LDA     XTEMP+2         ; YES -- IS THIS THE 1ST WORD OF LINE?
8437  CDB505              CMP     LFCOL
843A  F003 ^843F          BEQ     :XT040          ; YES -- FORGET ABOUT NEW LINE.
843C  20989F              JSR     NEWLIN          ; NO -- START A NEW LINE.
843F  B18C        :XT040  LDA     (TELN),Y        ; OUTPUT THE WORD JUST SCANNED.
8441  C920                CMP     #' '            ; SPACE?
8443  D007 ^844C          BNE     :XT050          ; NO.
8445  ECB605              CPX     RGCOL           ; YES -- IS IT THE LAST POSITION?
8448  D002 ^844C          BNE     :XT050          ; NO.
844A  A99B                LDA     #EOL            ; YES -- CHANGE TO EOL.
844C  208294      :XT050  JSR     CHOT            ; OUTPUT CHAR.
844F  2048AA              JSR     SPDDEL          ; DELAY IF SPECIFIED.
8452  C8                  INY
8453  C48F                CPY     TELN+3          ; END OF TEXT?
8455  F00A ^8461          BEQ     :XT080          ; YES.
8457  88                  DEY
8458  B18C                LDA     (TELN),Y        ; SPACE?
845A  C8                  INY
845B  C920                CMP     #' '             ; SPACE?
845D  D0E0 ^843F          BNE     :XT040          ; NO -- NOT END OF WORD.
845F  F0B0 ^8411          BEQ     :XT022          ; YES -- NOW DO NEXT WORD (BRA).
8461  A4AC        :XT080  LDY     XTEMP+1         ; RESTORE STATEMENT INDEX.
8463  A900                LDA     #0              ; SET CC FOR EXIT.
8465  60          :XT090  RTS                     ; RETURN WITH CC SET.
                  ; 'Y' COMMAND PROCESSOR
8466  F00F ^8477  XTYPE2  BEQ     :XT500          ; SYNTAX SCAN ONLY.
8468  A5FE                LDA     MATCHF          ; Y COMMAND (SAME AS 'TY').
846A  D00B ^8477          BNE     :XT500
846C  F006 ^8474          BEQ     :XT400
                  ; 'N' COMMAND PROCESSOR
846E  F007 ^8477  XTYPE3  BEQ     :XT500          ; SYNTAX SCAN ONLY.
8470  A5FE                LDA     MATCHF          ; N COMMAND (SAME AS 'TN').
8472  F003 ^8477          BEQ     :XT500          ; SKIP BRANCH TO 'XTYPE'.
8474              XREM                            ; REMARK COMMAND PROCESSOR TOO.
8474  4C1B9F      :XT400  JMP     SCNEOL          ; SCAN TO END OF LINE & RETURN WITH CC SET.
8477  4CE183      :XT500  JMP     XTYPE
847A                      PROC
                  ;
                  ; XPOS -- POSITION COMMAND PROCESSOR
                  ;
847A  20D49F      XPOS    JSR     EXP             ; COLUMN NUMBER.
847D  A592                LDA     EXEC            ; EXECUTE MODE?
847F  F019 ^849A          BEQ     :XP020          ; NO.
8481  20BB96              JSR     TSTMOD          ; CHECK SCREEN MODE.
8484  C908                CMP     #GRFS           ; FULL GRAPHICS?
8486  F034 ^84BC          BEQ     :XP080          ; YES -- IGNORE COMMAND.
8488  A594                LDA     EXPSTK+1        ; RANGE CHECK THE COLUMN #.
848A  D033 ^84BF          BNE     :XP900          ; TOO LARGE.
848C  A593                LDA     EXPSTK+0        ; PAST RIGHT MARGIN?
848E  CDB605              CMP     RGCOL
8491  F002 ^8495          BEQ     :XP010
8493  B02A ^84BF          BCS     :XP900          ; YES -- TOO LARGE.
8495  8555        :XP010  STA     COLCRS          ; O.K. -- STORE IT.
8497  8D9102              STA     TXTCOL          ; SPLIT SCREEN TOO.
849A  20079F      :XP020  JSR     SKPSEP          ; SKIP SEPARATOR.
849D  20D49F              JSR     EXP             ; ROW NUMBER.
84A0  A592                LDA     EXEC            ; EXECUTE MODE?
84A2  F01A ^84BE          BEQ     :XP090          ; NO.
84A4  AD3505              LDA     TRACE           ; TRACE EXECUTION?
84A7  0D4505              ORA     SGLSTP
84AA  D010 ^84BC          BNE     :XP080          ; YES -- IGNORE THIS COMMAND.
84AC  A594                LDA     EXPSTK+1        ; RANGE CHECK THE ROW 4.
84AE  D00F ^84BF          BNE     :XP900          ; TOO LARGE.
84B0  A593                LDA     EXPSTK+0
84B2  CDBF02              CMP     BOTSCR
84B5  B008 ^84BF          BCS     :XP900          ; TOO LARGE.
84B7  8554                STA     ROWCRS          ; O.K. -- STORE IT.
84B9  8D9002              STA     TXTROW          ; SPLIT SCREEN TOO.
84BC  A900        :XP080  LDA     #0              ; SET CC FOR NORMAL EXIT.
84BE  60          :XP090  RTS                     ; RETURN WITH CC SET.
84BF  A902        :XP900  LDA     #IMPERR         ; COLUMN/ROW OUT OF RANGE.
84C1  60                  RTS                     ; RETURN WITH CC SET.
84C2                      PROC
                  ;
                  ; XEND -- END STATEMENT PROCESSOR
                  ;
84C2  F016 ^84DA  XEND    BEQ     :XE090          ; SYNTAX SCAN ONLY.
84C4  AE4D05              LDX     USTKP           ; USE STACK POINTER.
84C7  F014 ^84DD          BEQ     :XE095          ; STACK EMPTY.
84C9  86FF                STX     RUN             ; SET RUN MODE EVEN IF ALREADY SET.
84CB  CA                  DEX                     ; GET NEXT LINE ADDRESS FROM STACK.
84CC  CA                  DEX
84CD  8E4D05              STX     USTKP
84D0  BD6B05              LDA     USESTK,X
84D3  8584                STA     NXTLN
84D5  BD6C05              LDA     USESTK+1,X
84D8  8585                STA     NXTLN+1
84DA  A900        :XE090  LDA     #0              ; O.K. -- SET CC FOR EXIT.
84DC  60                  RTS
84DD  208198      :XE095  JSR     CLOSEM          ; CLOSE ALL OPEN FILES.
84E0  84AB                STY     XTEMP
84E2  209E98              JSR     REMDEV
84E5  A4AB                LDY     XTEMP
84E7  A981                LDA     #ENDERR         ; STOP CONDITION.
84E9  8D4305              STA     NOCONT          ; NO CONTINUE AFTER END.
84EC  60                  RTS
84ED                      PROC
                  ;
                  ; XSTOP -- STOP COMMAND PROCESSOR
                  ;
84ED  F002 ^84F1  XSTOP   BEQ     :XS090          ; SYNTAX SCAN ONLY.
84EF  A99A                LDA     #STPMES         ; GENERATE STOP MESSAGE.
84F1  60          :XS090  RTS
      = 0000              IF      DOS
   -                      PROC
                  ;
                  ; XDOS -- DOS COMMAND PROCESSOR
                  ;
   -              XDOS    BEQ     :XD090          ; SYNTAX SCAN ONLY.
   -                      STA     COLDST          ; SETUP FOR COLDSTART ON RESET.
   -                      JSR     TXOPEN          ; OPEN TEXT SCREEN.
   -                      JMP     (DSVSAV)        ; YES.
   -              :XD090  RTS
                          ENDIF
84F2                      PROC
                  ;
                  ; XRUN -- RUN COMMAND PROCESSOR
                  ;
84F2  20139F      XRUN    JSR     SLB             ; 'RUN <EOL>'?
84F5  20F99E              JSR     CHKTRM
84F8  F011 ^850B          BEQ     :XR005          ; YES.
                  ; ASSUME 'RUN <FILE>' - SHARP 'LOAD' CODE.
84FA  201090              JSR     XLO100          ; OPEN DEVICE.
84FD  D034 ^8533          BNE     :XR090          ; ERROR.
84FF  A592                LDA     EXEC            ; EXECUTE MODE?
8501  F005 ^8508          BEQ     :XR003          ; NO.
8503  85FF                STA     RUN             ; YES -- SET RUN MODE.
8505  201485              JSR     :XR020          ; INITIALIZE ENVIRONMENT.
8508  4C0190      :XR003  JMP     XLO005          ; NOW LET LOAD DO THE SETUP.
850B  A592        :XR005  LDA     EXEC            ; EXECUTE MODE?
850D  F024 ^8533          BEQ     :XR090          ; NO.
850F  85FF                STA     RUN             ; YES -- ENTER RUN MODE.
                  ; *** EXTERNAL ENTRY POINT FROM 'MLOOP' ***
8511  20A087      XRN010  JSR     XNEWV           ; CLEAR ALL VARIABLES.
8514  A5AE        :XR020  LDA     S1L             ; SETUP THE NEXT LINE POINTER.
8516  8584                STA     NXTLN
8518  A5AF                LDA     S1L+1
851A  8585                STA     NXTLN+1
851C  20A0A3              JSR     GCLEAR          ; CLEAR SCREEN.
851F  2060AF              JSR     GPINIT          ; INITIALIZE GRAPHICS PARAMETERS
8522  84AB                STY     XTEMP
8524  20729F              JSR     NULACC          ; SET ACCEPT BUFFER TO NULL.
8527  A4AB                LDY     XTEMP
8529  A900                LDA     #0              ; MAKE MATCH FLAG FALSE ...
852B  8D4D05              STA     USTKP           ; ... USE STACK INDEX ...
852E  85FE                STA     MATCHF          ; ... & SET CC ALSO.
8530  8D4305              STA     NOCONT          ; CONTINUE O.K.
8533  60          :XR090  RTS
8534                      PROC
                  ;
                  ; XCONT -- CONTINUE COMMAND PROCESSOR
                  ;
8534  F009 ^853F  XCONT   BEQ     :XC090          ; SYNTAX SCAN ONLY.
8536  AE4305              LDX     NOCONT          ; CONTINUE O.K.?
8539  D005 ^8540          BNE     :XC100          ; NO -- INFORM OPERATOR.
853B  85FF                STA     RUN             ; YES -- ENTER RUN MODE.
853D  A900                LDA     #0              ; SET CC FOR NORMAL RETURN.
853F  60          :XC090  RTS
8540  A999        :XC100  LDA     #CNTERR         ; CONTINUE ERROR.
8542  60                  RTS
8543                      PROC
                  ;
                  ; XACCPT -- ACCEPT COMMAND PROCESSOR
                  ;
8543  A900        XACCPT  LDA     #0              ; STANDARD ACCFPT.
8545  8D4705              STA     AKFLAG
8548  8D4605              STA     AXFLAG
                  ; *** EXTERNAL ENTRY POINT FROM 'XACCX' AND 'XACCK' ***
854B  20009F      :XA001  JSR     CHKEQS          ; '='?
854E  D006 ^8556          BNE     :XA003          ; NO OR NOT YET.
8550  A901                LDA     #NULL           ; SETUP FOR NULL TARGET.
8552  85AB                STA     XTEMP
8554  D051 ^85A7          BNE     :XA022          ; (BRA).
8556  206E81      :XA003  JSR     ATOM            ; CHECK FOR VARIABLE.
8559  D008 ^8563          BNE     :XA009          ; ERROR.
855B  85AB                STA     XTEMP           ; SAVE ATOM TYPE.
855D  299D                AND     #SVAR+USVAR+NVAR+NULL+BPTR
855F  D003 ^8564          BNE     :XA020          ; VALID ATOM TYPE.
8561  A902                LDA     #IMPERR         ; NONE OF THE ABOVE -- ERROR.
8563  60          :XA009  RTS                     ; RETURN WITH CC SET.
8564  20BB8B      :XA020  JSR     SAVIT           ; YES -- SAVE NAME IF STRING TARGET.
8567  20009F      :XA20D  JSR     CHKEQS          ; CHECK FOR ASSIGNMENT OPTION.
856A  F03B ^85A7          BEQ     :XA022          ; YES.
856C  A592                LDA     EXEC            ; EXECUTE MODE?
856E  F0F3 ^8563          BEQ     :XA009          ; NO.
8570  84AC                STY     XTEMP+1         ; SAVE STATEMENT INDFX.
8572  AD4705              LDA     AKFLAG          ; ACCEPT KEY?
8575  D017 ^858E          BNE     :XA021          ; YES.
8577  20BB96              JSR     TSTMOD          ; CHECK SCREEN MODE.
857A  2905                AND     #TXSL+GRSS      ; TEXT INPUT O.K.?
857C  D003 ^8581          BNE     :XA20G          ; YES.
857E  A983                LDA     #NRCERR         ; NO -- ERROR.
8580  60                  RTS
8581  A20C        :XA20G  LDX     #TELN-DTAB      ; GET A LINE TO THE TEXP BUFFER.
8583  20B194              JSR     GETLIN
8586  C68F                DEC     TELN+3          ; REMOVE EOL.
8588  2028A1              JSR     TRAILB          ; PROCESS UNDERSCORE IF PRESENT.
858B  4CC785              JMP     :XA024
858E  A900        :XA021  LDA     #0
8590  A8                  TAY
8591  858A                STA     ACLN+2
8593  858E                STA     TELN+2
8595  A920                LDA     #' '            ; LEADING BLANK.
8597  9188                STA     (ACLN),Y
8599  207497              JSR     KIN             ; GET KEY.
859C  918C                STA     (TELN),Y
859E  C8                  INY
859F  848F                STY     TELN+3
85A1  9188                STA     (ACLN),Y
85A3  C8                  INY
85A4  4C1686              JMP     :XA030
85A7  C8          :XA022  INY                     ; YES -- SKIP OVER '='.
85A8  A5B6                LDA     POINT           ; SAVE 'POINT'.
85AA  8D4905              STA     GNUMB
85AD  A5B7                LDA     POINT+1
85AF  8D4A05              STA     GNUMB+1
85B2  20A7A0              JSR     TEXP            ; EVALUATE TEXT EXPRESSION.
85B5  A592                LDA     EXEC            ; EXECUTE MODE?
85B7  F0AA ^8563          BEQ     :XA009          ; NO.
85B9  84AC                STY     XTEMP+1         ; YES -- RESTORE 'NP'.
85BB  A4AC                LDY     XTEMP+1
85BD  AD4905              LDA     GNUMB           ; RESTORE 'POINT'.
85C0  85B6                STA     POINT
85C2  AD4A05              LDA     GNUMB+1
85C5  85B7                STA     POINT+1
                  ; *** EXTERNAL ENTRY POINT FROM 'XIN' ***
                  ;       EXPECTS: STATEMENT INDEX IN 'XTEMP+1'.
                  ;                TARGET ATOM TYPE IN 'XTEMP'.
                  ;                'POINT' OR 'NP' SETUP PER 'ATOM' CALL.
                  ;                'AXFLAG' SET PROPERLY.
                  ;                'SAVIT' CALLED IF STRING TARGET.
                  ;                STRING DATA IN 'TEXP'.
85C7              XAC024
85C7  20FF8B      :XA024  JSR     RESIT           ; YES -- RESTORE NAME IF STRING TARGET.
85CA  A58E                LDA     TELN+2          ; MOVE START INDEX.
85CC  858A                STA     ACLN+2
85CE  AA                  TAX
85CF  A8                  TAY
85D0  AD4605              LDA     AXFLAG          ; ACCEPT LITERAL?
85D3  F012 ^85E7          BEQ     :XA24T          ; NO.
85D5  E48F        :XA24D  CPX     TELN+3          ; DONE?
85D7  F042 ^861B          BEQ     :XA031          ; YES.
85D9  BD00BC              LDA     TEXBUF,X        ; NO -- GET NEXT CHAR.
85DC  E8                  INX
85DD  C0FE                CPY     #ACCLNG         ; ACCEPT BUFFER FULL?
85DF  F03A ^861B          BEQ     :XA031          ; YES.
85E1  9188                STA     (ACLN),Y
85E3  C8                  INY
85E4  4CD585              JMP     :XA24D
85E7  A920        :XA24T  LDA     #' '             ; INSERT LEADING BLANK.
85E9  D016 ^8601          BNE     :XA027          ; (BRA).
85EB  E48F        :XA025  CPX     TELN+3          ; DONE?
85ED  F027 ^8616          BEQ     :XA030          ; YES.
85EF  BD00BC              LDA     TEXBUF,X        ; NO -- GET NEXT CHAR.
85F2  E8                  INX
85F3  C0FD        :XA026  CPY     #ACCLNG-1
85F5  F01F ^8616          BEQ     :XA030          ; ACCEPT BUFFER FULL.
                  ; CHARACTER CONVERSION HERE.
85F7  C961                CMP     #'A'+$20         ; LOWER CASE ALPHA?
85F9  9006 ^8601          BCC     :XA027          ; NO
85FB  C97B                CMP     #'Z'+1+$20
85FD  B002 ^8601          BCS     :XA027          ; NO.
85FF  4920                EOR     #$20            ; YES -- CONVERT TO UPPER CASE.
8601  9188        :XA027  STA     (ACLN),Y
8603  C8                  INY
8604  C920                CMP     #' '             ; BLANK?
8606  D0E3 ^85EB          BNE     :XA025          ; NO.
8608  E48F        :XA028  CPX     TELN+3          ; YES -- SKIP MULTIPLES.
860A  F00F ^861B          BEQ     :XA031          ; END OF TEXT.
860C  BD00BC              LDA     TEXBUF,X        ; GET NEXT CHARACTER.
860F  E8                  INX
8610  C920                CMP     #' '             ; BLANK?
8612  D0DF ^85F3          BNE     :XA026          ; NO -- STORE IT.
8614  F0F2 ^8608          BEQ     :XA028          ; YES -- IGNORE IT (BRA).
8616  A920        :XA030  LDA     #' '             ; ADD TRAILING BLANK.
8618  9188                STA     (ACLN),Y
861A  C8                  INY
861B  848B        :XA031  STY     ACLN+3          ; END INDEX.
861D  A5AB                LDA     XTEMP           ; CHECK PARAMETER TYPE AGAIN.
861F  C901                CMP     #NULL
8621  F02F ^8652          BEQ     :XA190          ; NONE -- ALL DONE.
8623  2984                AND     #NVAR+BPTR
8625  D003 ^862A          BNE     :XA100          ; NUMERIC VARIABLE.
8627  4CA78B              JMP     XCM300          ; STRING VARIABLE -- GO TO COMMON CODE & RET.
862A  A0FF        :XA100  LDY     #-1             ; CONVERT NUMBER TO BINARY REPRESENTATION.
862C  C8          :XA110  INY                     ; SCAN TO NUMBER OR EOL.
862D  B18C                LDA     (TELN),Y        ; GET A CHAR.
862F  C99B                CMP     #EOL            ; END OF LINE?
8631  F009 ^863C          BEQ     :XA120          ; YES -- DONE.
8633  C92D                CMP     #'-'             ; NO -- MINUS SIGN?
8635  F005 ^863C          BEQ     :XA120          ; YES -- DONE.
8637  20839E              JSR     CNUMBR          ; NO -- NUMERIC DIGIT?
863A  B0F0 ^862C          BCS     :XA110          ; NO -- KEEP SCANNING.
863C  A20C        :XA120  LDX     #TELN-DTAB      ; NOW CONVERT NUMBER WE FOUND.
863E  20BB9D              JSR     ASCDEC
8641  A000                LDY     #0              ; MOVE VALUE TO VARIABLE.
8643  A5B8                LDA     NUMBER
8645  91B6                STA     (POINT),Y
8647  A5AB                LDA     XTEMP           ; SEE IF POINTER TO BYTE.
8649  C980                CMP     #BPTR
864B  F005 ^8652          BEQ     :XA190          ; YES -- ALL DONE.
864D  C8                  INY
864E  A5B9                LDA     NUMBER+1
8650  91B6                STA     (POINT),Y
8652  A4AC        :XA190  LDY     XTEMP+1         ; RESTORE LINE POINTER.
8654  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
8656  60                  RTS                     ; RETURN WITH CC SET.
                  ;
                  ; XACCX -- ACCEPT LITERAL COMMAND PROCESSOR.
                  ;
8657  A901        XACCX   LDA     #1
8659  8D4605              STA     AXFLAG
865C  A900                LDA     #0
865E  8D4705              STA     AKFLAG
8661  4C4B85              JMP     :XA001
                  ;
                  ; XACCK -- ACCEPT PROM KEYBOARD (SINGLE CHARACTER).
                  ;
8664  A901        XACCK   LDA     #1
8666  8D4705              STA     AKFLAG
8669  4C4B85              JMP     :XA001
866C                      PROC
                  ;
                  ; XMATCH -- PATCH COMMAND PROCESSOR
                  ;
866C  A900        XMATCH  LDA     #0              ; FORCE UPPER CASE ALPHA.
866E  F002 ^8672          BEQ     :XM005
8670  A901        XMATX   LDA     #1              ; LITERAL MATCH.
8672  8DDA05      :XM005  STA     LITMAT
8675  B180                LDA     (INLN),Y        ; GET FIRST MATCH FIELD BYTE.
8677  C99B                CMP     #EOL
8679  D003 ^867E          BNE     :XM010
867B  A902                LDA     #IMPERR         ; NULL MATCH FIELD IS ERROR.
867D  60          :XM009  RTS                     ; RETURN WITH CC SET.
867E  20A7A0      :XM010  JSR     TEXP            ; EVALUATE TEXT EXPRESSION OPERAND.
8681  A592                LDA     EXEC            ; EXECUTE MODE?
8683  F0F8 ^867D          BEQ     :XM009          ; NO -- DONE.
8685  A900                LDA     #0              ; RESET MATCH FIELD NUMBER AND FLAG.
8687  85FE                STA     MATCHF
8689  A92C                LDA     #','            ; IS DEFAULT MATCH FIELD DELIMITER.
868B  85E2                STA     MFDEL
868D  84AC                STY     XTEMP+1         ; SAVE INPUT INDEX.
868F  A58E                LDA     TELN+2          ; CHECK FOR NULL RESULT.
8691  C58F                CMP     TELN+3
8693  D003 ^8698          BNE     :XM011
8695  4C2387              JMP     :XM400          ; NULL PATTERN -- NO MATCH.
8698  ADDA05      :XM011  LDA     LITMAT          ; LITERAL MATCH?
869B  D012 ^86AF          BNE     :XM020          ; YES.
869D  A48E                LDY     TELN+2          ; NO -- FORCE UPPER CASE ALPHA.
869F  B18C        :XM012  LDA     (TELN),Y        ; GET CHAR.
86A1  20919E              JSR     CLETTR          ; IS IT A LETTER?
86A4  B004 ^86AA          BCS     :XM015          ; NO.
86A6  29DF                AND     #UC             ; YESS -- FORCE UPPER CASE.
86A8  918C                STA     (TELN),Y
86AA  C8          :XM015  INY                     ; NEXT CHAR.
86AB  C48F                CPY     TELN+3          ; DONE?
86AD  D0F0 ^869F          BNE     :XM012          ; NO.
                  ; THROUGHOUT THE MAIN LOOP THE X REGISTER WILL = ACCEPT START INDEX.
86AF  A68A        :XM020  LDX     ACLN+2          ; ACCEPT BUFFER START INDEX.
86B1  A48E                LDY     TELN+2          ; SETUP MATCH PATTERN START INDEX.
86B3  B18C                LDA     (TELN),Y        ; CHECK FOR ALTERNATE FIELD DELIMITER.
86B5  C97C                CMP     #VBAR
86B7  D005 ^86BE          BNE     :XM050          ; NO ALTERNATE SPECIFIED
86B9  85E2                STA     MFDEL           ; SET ALTERNATE.
86BB  C8                  INY                     ; SKIP OVER VERTICAL BAR.
86BC  D00C ^86CA          BNE     :XM060          ; (BRA).
86BE  B18C        :XM050  LDA     (TELN),Y        ; GET 1ST CHAR OF OPERAND.
86C0  C91F                CMP     #CRIGHT         ; RIGHT ARROW?
86C2  D00C ^86D0          BNE     :XM100          ; NO.
86C4  E8                  INX                     ; YES -- SKIP FIRST CHAR IK ACCEPT BUFFER.
86C5  C8                  INY                     ; SKIP OVER RIGHT ARROW TOO.
86C6  E48B                CPX     ACLN+3          ; NULL ACCEPT BUFFER?
86C8  F059 ^8723          BEQ     :XM400          ; YES -- NO MATCH.
86CA  C48F        :XM060  CPY     TELN+3          ; NULL OPERAND?
86CC  F055 ^8723          BEQ     :XM400          ; YES.
86CE  D0EE ^86BE          BNE     :XM050          ; NO (BRA).
86D0  84AB        :XM100  STY     XTEMP           ; MATCH DATA INDEX (INNER LOOP).
86D2  84A2                STY     TEMP+1          ; MATCH DATA INDEX (OUTER LOOP).
86D4  86A1                STX     TEMP
86D6  868A                STX     ACLN+2
86D8  E6FE                INC     MATCHF          ; INCREMENT MATCH FIELD NUMBER.
86DA  A4AB        :XM120  LDY     XTEMP           ; SEE IF ALL OF PATTERN HAS HATCHED.
86DC  E6AB                INC     XTEMP
86DE  C48F                CPY     TELN+3
86E0  F037 ^8719          BEQ     :XM300          ; YES.
86E2  B18C                LDA     (TELN),Y        ; NOT SURE.
86E4  C5E2                CMP     MFDEL
86E6  F031 ^8719          BEQ     :XM300          ; YES.
86E8  A48A                LDY     ACLN+2          ; NO -- MORE DATA TO MATCH?
86EA  E68A                INC     ACLN+2
86EC  C48B                CPY     ACLN+3
86EE  F004 ^86F4          BEQ     :XM140          ; NO -- AT END OF BUFFER.
86F0  D188                CMP     (ACLN),Y        ; YES -- COMPARE DATA TO PATTERN.
86F2  F0E6 ^86DA          BEQ     :XM120          ; SO FAR SO GOOD.
86F4  A5A2        :XM140  LDA     TEMP+1          ; RESET MATCH PATTERN INDEX.
86F6  85AB                STA     XTEMP
86F8  E6A1                INC     TEMP            ; INCREMENT #ACCBUF' INDEX.
86FA  A5A1                LDA     TEMP
86FC  858A                STA     ACLN+2
86FE  C58B                CMP     ACLN+3
8700  D0D8 ^86DA          BNE     :XM120
8702  A4A2                LDY     TEMP+1          ; INCREMENT 'TEXBUP' INDEX TO NEXT FIELD.
8704  B18C        :XM160  LDA     (TELN),Y
8706  C48F                CPY     TELN+3          ; END OF MATCH PATTERN DATA?
8708  F009 ^8713          BEQ     :XM200          ; YES -- NO MATCH.
870A  C8                  INY
870B  C5E2                CMP     MFDEL
870D  D0F5 ^8704          BNE     :XM160          ; KEEP SCANNING.
870F  C48F                CPY     TELN+3          ; END OF MATCH STATEMENT?
8711  D0BD ^86D0          BNE     :XM100          ; NO.
8713  A900        :XM200  LDA     #0              ; NO MATCH -- RESET FLAG.
8715  85FE                STA     MATCHF
8717  F00A ^8723          BEQ     :XM400          ; (BRA).
8719  A5A1        :XM300  LDA     TEMP            ; SAVE START & END INDICES TO MATCH FIELD ...
871B  8D3305              STA     MATCHX          ; ... FOR 'XMWSP'.
871E  A58A                LDA     ACLN+2
8720  8D3405              STA     MATCHX+1
8723  A4AC        :XM400  LDY     XTEMP+1         ; RESTORE INPUT LINE INDEX.
8725  A900                LDA     #0              ; CLEAR LINE INDEX.
8727  858A                STA     ACLN+2
8729  4C1B9F              JMP     SCNEOL          ; SCAN TO END OF INPUT LINE & RETURN.
872C                      PROC
                  ;
                  ; XMWSP -- MATCH WITH STRING PRODUCTION COMMAND PROCESSOR
                  ;
872C  207086      XMATSX  JSR     XMATX
872F  4C3587              JMP     :XM005
8732  206C86      XMWSP   JSR     XMATCH          ; FIRST DO ALL OF MATCH COMMAND.
8735  D035 ^876C  :XM005  BNE     :XM090          ; SYNTAX ERROR.
8737  A592                LDA     EXEC            ; EXECUTE MODE?
8739  F031 ^876C          BEQ     :XM090          ; NO -- DONE (SYNTAX SAME AS NATCH).
873B  A5FE                LDA     MATCHF          ; WAS MATCH SUCCESSFUL?
873D  F02D ^876C          BEQ     :XM090          ; NO -- ALL DONE.
873F  84AB                STY     XTEMP
8741  A980                LDA     #ATRSTR         ; 'STRING' ATTRIBUTE.
8743  8D6605              STA     ATRTYP
8746  8A                  TXA                     ; NOW SET SLEFT = DATA FROM ACCEPT START ...
8747  AC3305              LDY     MATCHX          ; ... TO START OF MATCH - 1.
874A  A200                LDX     #LFTSTG-STAB
874C  206D87              JSR     MAKSTG
874F  D017 ^8768          BNE     :XM080          ; ERROR.
8751  AD3305              LDA     MATCHX          ; THEN SET SMATCH = DATA FROM MATCH.
8754  AC3405              LDY     MATCHX+1
8757  A205                LDX     #MATSTG-STAB
8759  206D87              JSR     MAKSTG
875C  D00A ^8768          BNE     :XM080          ; ERROR.
875E  AD3405              LDA     MATCHX+1        ; THEN $RIGHT = DATA FROM MATCH +1 ...
8761  A48B                LDY     ACLN+3          ; ... TO END.
8763  A20B                LDX     #RITSTG-STAB
8765  206D87              JSR     MAKSTG
8768  08          :XM080  PHP                     ; SAVE CC.
8769  A4AB                LDY     XTEMP           ; RESTORE INDEX.
876B  28                  PLP
876C  60          :XM090  RTS                     ; RETURN WITH CC SET.
876D  85C4        MAKSTG  STA     DP+2            ; DEFINE DATA PORTION.
876F  84C5                STY     DP+3
8771  A588                LDA     ACLN
8773  85C2                STA     DP
8775  A589                LDA     ACLN+1
8777  85C3                STA     DP+1
8779  BD8F87              LDA     STAB,X          ; DEFINE NAME PORTION.
877C  85C1                STA     NP+3
877E  E8                  INX
877F  86C0                STX     NP+2
8781  A98F                LDA     # LOW STAB
8783  85BE                STA     NP
8785  A987                LDA     # HIGH STAB
8787  85BF                STA     NP+1
8789  20AD9E              JSR     SETSVL          ; NAMED STRING VARIABLE LIST.
878C  4C0599              JMP     SINSRT          ; INSERT STRING & RETURN WITH CC SET.
      = 878F      STAB = *                          ; MATCH STRING NAME TABLE.
878F  054C454654  LFTSTG  DB   LSEND,'LEFT'
      = 0005      LSEND = *-STAB
8794  0B4D415443  MATSTG  DB   MSEND,'MATCH'
      = 000B      MSEND = *-STAB
879A  1152494748  RITSTG  DB   RSEND,'RIGHT'
      = 0011      RSEND = *-STAB
87A0                      PROC
                  ;
                  ; XNEWV -- NEW VARIABLES COMMAND PROCESSOR
                  ;
87A0  A592        XNEWV   LDA     EXEC            ; EXECUTE MODE?
87A2  F012 ^87B6          BEQ     :XN090          ; SYNTAX SCAN ONLY.
87A4  A5B4                LDA     S2H             ; CLEAR MOD VARIABLES.
87A6  85B2                STA     S2L
87A8  A5B5                LDA     S2H+1
87AA  85B3                STA     S2L+1
87AC  208198              JSR     CLOSEM          ; CLOSE IOCBS 3 THROUGH 7.
87AF  A5FF                LDA     RUN             ; RUN MODE?
87B1  D003 ^87B6          BNE     :XN090          ; YES -- DON'T PRINT 'READY'.
87B3  202CB5              JSR     RDYMES          ; NO -- PRINT 'READY'.
87B6              XNE090
87B6  A900        :XN090  LDA     #0              ; SET CC FOR EXIT.
87B8  60                  RTS                     ; RETURN WITH CC SET.
87B9                      PROC
                  ;
                  ; XNEW -- NEW PROGRAM PROCESSOR
                  ;
87B9  F0FB ^87B6  XNEW    BEQ     XNE090          ; SYNTAX SCAN ONLY.
87BB  20C087              JSR     CLRPRG          ; CLEAR THE PROGRAM STORAGE AREA.
87BE  F0E0 ^87A0          BEQ     XNEWV           ; (BRA) NOW CLEAR THE VARIABLES ALSO
87C0  A5AE        CLRPRG  LDA     S1L             ; YES -- CLEAR PROGRAM STORAGE AREA.
87C2  85B0                STA     S1H
87C4  A5AF                LDA     S1L+1
87C6  85B1                STA     S1H+1
87C8  A9FF                LDA     #$FF            ; NO CONTINUATION.
87CA  8D4305              STA     NOCONT
87CD  A900                LDA     #0
87CF  8D4D05              STA     USTKP           ; CLEAR USE STACK.
87D2  60                  RTS                     ; RETURN WITH CC AND A = ZERO.
87D3                      PROC
                  ;
                  ; XCALL -- CALL MEMORY LOCATION PROCESSOR
                  ;
87D3  20D49F      XCALL   JSR     EXP             ; ADDRESS SHOULD FOLLOW.
87D6  A592                LDA     EXEC            ; EXECUTE MODE?
87D8  F00B ^87E5          BEQ     :XC090          ; NO.
87DA  98                  TYA                     ; SAVE THE LINE INDEX FOR THE USER.
87DB  48                  PHA
87DC  20E687              JSR     :XC100          ; "OFF WE GO, INTO THE WILD BLUE YONDER".
87DF  68                  PLA                     ; UNBELIEVEABLE, THE USER RETURNED.
87E0  A8                  TAY                     ; RESTORE THE LINE INDEX.
87E1  58                  CLI                     ; JUST IN CASE!
87E2  D8                  CLD                     ; DITTO.
87E3  A900                LDA     #0              ; SET CC FOR EXIT.
87E5  60          :XC090  RTS                     ; RETURN WITH CC SET.
87E6  6C9300      :XC100  JMP     (EXPSTK)        ; TOO LATE TO CHANGE YOUR MIND.
87E9                      PROC
                  ;
                  ; XUSE -- USE COMMAND PROCESSOR
                  ;
87E9  F024 ^880F  XUSE    BEQ     XJMP            ; LET 'XJMP' PERFORM SYNTAX CHECK.
87EB  A5FF                LDA     RUN             ; IF IMMEDIATE -- DON'T PUT ANYTHING IN STACK
87ED  F01B ^880A          BEQ     :XU100
87EF  AE4D05              LDX     USTKP           ; USE STACK POINTER.
87F2  E030                CPX     #USTKSZ
87F4  F011 ^8807          BEQ     :XU090          ; STACK FULL.
87F6  A584                LDA     NXTLN           ; NEXT LINE ADDRESS TO USE STACK.
87F8  9D6B05              STA     USESTK,X
87FB  A585                LDA     NXTLN+1
87FD  9D6C05              STA     USESTK+1,X
8800  E8                  INX
8801  E8                  INX
8802  8E4D05              STX     USTKP
8805  D00D ^8814          BNE     XJP005          ; REST OF COMMAND IS JUST LIKE 'J:' (BRA).
8807  A98B        :XU090  LDA     #USOERR         ; STACK OVERFLOW ERROR.
8809  60                  RTS
880A  8D4D05      :XU100  STA     USTKP           ; CLEAR USE STACK.
880D  F005 ^8814          BEQ     XJP005          ; (BRA).
880F                      PROC
                  ;
                  ; XJMP -- JUMP COMMAND PROCESSOR
                  ;
880F  D003 ^8814  XJMP    BNE     XJP005          ; EXECUTE MODE.
8811  4CD39E              JMP     SCNLBL          ; SCAN OVER LABEL & RETURN.
                  ; *** EXTERNAL ENTRY POINT (FROM 'XJMPM' & 'XUSE') ***
8814  20139F      XJP005  JSR     SLB
8817  C8                  INY                     ; SKIP OVER '*'.
8818  84C4                STY     DP+2            ; SETUP 'DP' TO POINT TO JUMP LABEL.
881A  20CB9E              JSR     SCEOA           ; SCAN TO END OF LABEL.
881D  84C5                STY     DP+3
881F  A580                LDA     INLN
8821  85C2                STA     DP
8823  A581                LDA     INLN+1
8825  85C3                STA     DP+1
8827  209F9E              JSR     STMLST          ; SETUP TO SCAN STATEMENT LIST.
882A  84AB                STY     XTEMP           ; SAVE INPUT LINE POINTER.
882C  A23A        :XJ030  LDX     #LP-DTAB        ; CHECK FOR END OF STATEMENT LIST.
882E  20139A              JSR     SEND
8831  F040 ^8873          BEQ     :XJ200          ; END OF LIST -- LABEL NOT FOUND.
8833  A006                LDY     #6              ; CHECK FOR PRESENCE OF LABEL.
8835  B1BA        :XJ032  LDA     (LP),Y
8837  C920                CMP     #' '            ; BLANK?
8839  D003 ^883E          BNE     :XJ034          ; NO.
883B  C8                  INY                     ; SKIP LEADING BLANKS.
883C  D0F7 ^8835          BNE     :XJ032          ; (BRA).
883E  C92A        :XJ034  CMP     #'*'
8840  D029 ^886B          BNE     :XJ060          ; NO -- TRY NEXT STATEMENT.
8842  C8                  INY
8843  84C8                STY     MP+2            ; YES -- SETUP 'MR' TO POINT TO STATEMENT LABEL.
8845  B1BA        :XJ040  LDA     (LP),Y          ; SCAN TO END OF LABEL.
8847  C8                  INY
8848  20B69E              JSR     CKEOA           ; END OF ATOM (LABEL)?
884B  D0F8 ^8845          BNE     :XJ040          ; NO.
884D  88                  DEY
884E  84C9                STY     MP+3
8850  A5BA                LDA     LP              ; SETUP POINTERS FOR ...
8852  85C6                STA     MP              ; 'SCOMP' CALL ...
8854  8584                STA     NXTLN           ; ... & STATEMENT TO EXECUTE.
8856  A5BB                LDA     LP+1
8858  85C7                STA     MP+1
885A  8585                STA     NXTLN+1
885C  205599              JSR     SCOMP           ; COMPARE LABELS.
885F  D00A ^886B          BNE     :XJ060          ; NO MATCH.
8861  A4AB                LDY     XTEMP           ; RESTORE INPUT LINE POINTER.
8863  84FF                STY     RUN             ; SET RUN MODE EVEN IF ALREADY SET
8865  A900                LDA     #0
8867  8D4305              STA     NOCONT
886A  60                  RTS                     ; RETURN WITH CC SET.
886B  A23A        :XJ060  LDX     #LP-DTAB        ; GET POINTER TO NEXT STATEMENT.
886D  20AA9A              JSR     SNXTI
8870  4C2C88              JMP     :XJ030
8873  A4C4        :XJ200  LDY     DP+2            ; RESTORE LINE INDEX.
8875  A90A                LDA     #UNDERR         ; UNDEFINED LABEL.
8877  60                  RTS                     ; RETURN WITH CC SET.
8878                      PROC
                  ;
                  ; XJMPM -- JUMP ON MATCH RESULT COMMAND PROCESSOR
                  ;
8878  D00C ^8886  XJMPM   BNE     :XJ030          ; EXECUTE MODE.
887A  20D39E              JSR     SCNLBL          ; SCAN OVER FIRST LABEL.
887D  D026 ^88A5          BNE     :XJ090          ; NOT EVEN ONE LABEL -- ERROR.
887F  20D39E      :XJ010  JSR     SCNLBL          ; SCAN OVER REMAINING LABELS.
8882  F0FB ^887F          BEQ     :XJ010
8884  D01D ^88A3          BNE     :XJ050          ; NORMAL RETURN.
8886  A5FE        :XJ030  LDA     MATCHF          ; WAS PREVIOUS MATCH SUCCESSFUL?
8888  F011 ^889B          BEQ     :XJ043          ; NO -- NO JUMP.
888A  AA                  TAX                     ; YES -- USE FIELD U AS LOOP COUNT.
888B  CA          :XJ040  DEX
888C  D010 ^889E          BNE     :XJ045          ; NOT THERE YET.
888E  20079F              JSR     SKPSEP          ; PRE-VALIDATE NEXT LABEL.
8891  20F99E              JSR     CHKTRM          ; END OF STATEMENT?
8894  F00F ^88A5          BEQ     :XJ090          ; YES -- O.K.
8896  201488              JSR     XJP005          ; LET 'XJMP' DO THE DIRTY WORK.
8899  D00A ^88A5          BNE     :XJ090          ; ERROR.
889B  4C1B9F      :XJ043  JMP     SCNEOL          ; SCAN TO END OF STATEMENT & RETURN
889E  20D39E      :XJ045  JSR     SCNLBL          ; SCAN OVER LABEL.
88A1  F0E8 ^888B          BEQ     :XJ040          ; THERE WAS ONE THERE.
88A3  A900        :XJ050  LDA     #0              ; TOO FEW LABELS IS O.K.
88A5  60          :XJ090  RTS                     ; RETURN WITH CC SET.
88A6                      PROC
                  ;
                  ; XDUMP -- STRING & NUMERIC VARIABLE DUMP COMMAND PROCESSOR
                  ;
88A6  20139F      XDUMP   JSR     SLB             ; SKIP LEADING BLANKS.
88A9  20F99E              JSR     CHKTRM          ; STATEMENT TERMINATOR?
88AC  F00C ^88BA          BEQ     :XD020          ; YES.
88AE  C923                CMP     #'#'
88B0  F007 ^88B9          BEQ     :XD010          ; NUMERIC VARIABLES ONLY.
88B2  C924                CMP     #'$'
88B4  F003 ^88B9          BEQ     :XD010          ; STRING VARIABLES ONLY.
88B6  A902                LDA     #IMPERR         ; IMPROPER OPERAND.
88B8  60          :XD009  RTS                     ; RETURN WITH CC SET.
88B9  C8          :XD010  INY
88BA  85AB        :XD020  STA     XTEMP           ; SAVE OPERAND
88BC  A592                LDA     EXEC
88BE  F0F8 ^88B8          BEQ     :XD009          ; SYNTAX SCAN.
88C0  84AC                STY     XTEMP+1         ; YES -- SAVE INPUT LINE INDEX.
88C2  A97D                LDA     #CLEAR          ; CLEAR SCREEN.
88C4  208294              JSR     CHOT
88C7  CEFE02              DEC     DSPFLG          ; SET DISPLAY CONTROL CHARS FLAG.
                  ; DUMP ALL OF THE STRING VARIABLES
88CA  A5AB                LDA     XTEMP           ; CHECK OPERAND.
88CC  C923                CMP     #'#'            ; NUMERIC ONLY?
88CE  F013 ^88E3          BEQ     :XD050          ; YES.
88D0  A910                LDA     #16             ; PRODUCE STRING VARIABLE HEADER.
88D2  20FFB4              JSR     MESSOT
88D5  A980                LDA     #ATRSTR         ; STRINGS.
88D7  8D6705              STA     DMPTYP
88DA  208689              JSR     DMPVAR
                  ; DUMP ALL OF THE NUMERIC VARIABLES.
88DD  A5AB                LDA     XTEMP           ; CHECK OPERAND.
88DF  C924                CMP     #'$'            ; STRING ONLY.
88E1  F00D ^88F0          BEQ     :XD060          ; YES.
88E3  A911        :XD050  LDA     #17             ; NUMERIC VARIABLE HEADER.
88E5  20FFB4              JSR     MESSOT
88E8  A940                LDA     #ATRNUM         ; NUMERIC.
88EA  8D6705              STA     DMPTYP
88ED  208689              JSR     DMPVAR
                  ; DUMP THE I/O'S.
88F0  A5AB        :XD060  LDA     XTEMP           ; CHECK OPERATOR.
88F2  A4AC                LDY     XTEMP+1         ; RESTORE INDEX.
88F4  20F99E              JSR     CHKTRM          ; TERMINATOR?
88F7  D07D ^8976          BNE     :XD090          ; NO -- '$' OR '#'.
88F9  A923                LDA     #35             ; I/O HEADER.
88FB  20FFB4              JSR     MESSOT
88FE  A920                LDA     #ATRIO          ; I/O'S
8900  8D6705              STA     DMPTYP
8903  208689              JSR     DMPVAR
                  ; DUMP THE CONTENT OF THE STACK.
8906  A912                LDA     #18             ; PRODUCE USE STACK HEADER.
8908  20FFB4              JSR     MESSOT
890B  AE4D05              LDX     USTKP           ; STACK EMPTY?
890E  F01D ^892D          BEQ     :XD088          ; YES.
8910  20A29F      :XD087  JSR     SPACE           ; NO -- PRINT LINE #(S).
8913  BD6905              LDA     USESTK-2,X      ; GET POINTER TO STORED LINE
8916  85B6                STA     POINT
8918  BD6A05              LDA     USESTK-1,X
891B  85B7                STA     POINT+1
891D  208C9F              JSR     GTLNNO          ; EXTRACT LINE NUMBER.
8920  86AD                STX     XTEMP+2
8922  A25C                LDX     #LINENO-DTAB    ; PRINT LINE NUMBER.
8924  20149E              JSR     DECASC
8927  A6AD                LDX     XTEMP+2
8929  CA                  DEX
892A  CA                  DEX
892B  D0E3 ^8910          BNE     :XD087          ; MORE TO PRINT.
                  ; DUMP THE GRAPHICS PARAMETERS
892D  A913        :XD088  LDA     #19             ; PRODUCE GRAPHICS HEADER.
892F  20FFB4              JSR     MESSOT
8932  A958                LDA     #'X'            ; X=FLOOR(<VALUE>).
8934  208294              JSR     CHOT
8937  208189              JSR     PRTEQS          ; '='.
893A  A26C                LDX     #GX-DTAB
893C  20149E              JSR     DECASC
893F  209D9F              JSR     SPACES
8942  A959                LDA     #'Y'            ; Y=FLOOR(<VALUE>).
8944  208294              JSR     CHOT
8947  208189              JSR     PRTEQS          ; '='.
894A  A26F                LDX     #GY-DTAB
894C  20149E              JSR     DECASC
894F  209D9F              JSR     SPACES
8952  A914                LDA     #20             ; THETA=<VALUE>.
8954  20FFB4              JSR     MESSOT
8957  A272                LDX     #THETA-DTAB
8959  20149E              JSR     DECASC
                  ; REPORT ON FREE MEMORY
895C  A915                LDA     #21             ; FREE MEMORY = <VALUE>.
895E  20FFB4              JSR     MESSOT
8961  A032                LDY     #S2L-DTAB       ; <VALUE> = #'S2L' - 'S1H' + 1.
8963  20A29D              JSR     DLOADA
8966  A030                LDY     #S1H-DTAB
8968  20B19D              JSR     DSUBA
896B  A901                LDA     #1
896D  20049D              JSR     DADDS
8970  20149E              JSR     DECASC          ; PRINT RESULT.
8973  20989F              JSR     NEWLIN
8976  20989F      :XD090  JSR     NEWLIN          ; BLANK LINE AFTER DUMP.
8979  EEFE02              INC     DSPFLG          ; RESET DISPLAY CONTROL CHARS FLAG.
897C  A4AC                LDY     XTEMP+1         ; DONE -- RESTORE INPUT LINE INDEX.
897E  A900                LDA     #0              ; SET CC FOR EXIT.
8980  60                  RTS                     ; RETURN WITH CC SET.
8981  A93D        PRTEQS  LDA     #'='            ; PRINT '=' ...
8983  4C8294              JMP     CHOT            ; ... & RETURN.
8986                      PROC
                  ;
                  ; DMPVAR -- COMMON CODE FOR 'XDUMP'.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       DMPTYP = ATTRIBUTE TYPE
                  ;
                  ;       JSR DMPVAR
                  ;
8986  20AD9E      DMPVAR  JSR     SETSVL          ; POINT TO VARIABLE LIST.
8989  A23A        :DM010  LDX     #LP-DTAB
898B  20139A              JSR     SEND            ; END OF STRING STORAGE?
898E  F060 ^89F0          BEQ     :DM090          ; YES -- DONE.
                  ; *S*   LDX     #LP-DTAB
8990  20869A              JSR     SATTR           ; CORRECT TYPE?
8993  CD6705              CMP     DMPTYP
8996  D050 ^89E8          BNE     :DM080          ; NO.
8998  A238                LDX     #NUMBER-DTAB    ; MOVE POINTER TO 'NUMBER'.
899A  A03A                LDY     #LP-DTAB
899C  20459A              JSR     DMOVI
899F  A924                LDA     #'$'
89A1  2C6705              BIT     DMPTYP
89A4  3004 ^89AA          BMI     :DM020          ; STRING
89A6  A923                LDA     #'#'
89A8  5003 ^89AD          BVC     :DM030          ; I/O.
89AA  208294      :DM020  JSR     CHOT            ; PREFIX NAME FOR STRING, NUMERIC.
89AD  A002        :DM030  LDY     #2
89AF  20F189              JSR     PRTSFD          ; PRINT NAME.
89B2  208189              JSR     PRTEQS          ; SEPARATE NAME AND DATA WITH '='
89B5  2C6705              BIT     DMPTYP
89B8  301E ^89D8          BMI     :DM040          ; STRING.
89BA  C8                  INY                     ; NUMERIC OR I/O.
89BB  B1B8                LDA     (NUMBER),Y
89BD  5006 ^89C5          BVC     :DM032          ; I/O.
89BF  AA                  TAX                     ; NUMERIC.
89C0  C8                  INY
89C1  B1B8                LDA     (NUMBER),Y
89C3  7007 ^89CC          BVS     :DM035          ; (BRA).
89C5  4A          :DM032  LSR     A               ; IOCB = # * 16.
89C6  4A                  LSR     A
89C7  4A                  LSR     A
89C8  4A                  LSR     A
89C9  AA                  TAX
89CA  A900                LDA     #0              ; MSB = 0.
89CC  85B9        :DM035  STA     NUMBER+1        ; MSB.
89CE  86B8                STX     NUMBER          ; LSB.
89D0  A238                LDX     #NUMBER-DTAB
89D2  20149E              JSR     DECASC          ; PRINT VALUE.
89D5  4CE589              JMP     :DM050
89D8  A927        :DM040  LDA     #SQUOTE         ; DELIMIT STRING DATA WITH '.
89DA  208294              JSR     CHOT
89DD  20F189              JSR     PRTSFD          ; PRINT STRING DATA.
89E0  A927                LDA     #SQUOTE         ; CLOSING DELIMITER.
89E2  208294              JSR     CHOT
89E5  20989F      :DM050  JSR     NEWLIN
89E8  A23A        :DM080  LDX     #LP-DTAB        ; INCREMENT TO NEXT VARIABLE.
89EA  20AA9A              JSR     SNXTI
89ED  4C8989              JMP     :DM010
89F0  60          :DM090  RTS
89F1                      PROC
89F1  B1B8        PRTSFD  LDA     (NUMBER),Y      ; GET NAME/DATA LENGTH.
89F3  AA                  TAX
89F4  F012 ^8A08          BEQ     :PF090          ; DONE.
89F6  C8          :PF010  INY
89F7  D002 ^89FB          BNE     :PF020
89F9  E6B9                INC     NUMBER+1        ; INDEX WRAPAROUND -- BUMP POINTER.
89FB  B1B8        :PF020  LDA     (NUMBER),Y      ; GET CHARACTER.
89FD  208294              JSR     CHOT
8A00  CA                  DEX                     ; DONE?
8A01  D0F3 ^89F6          BNE     :PF010          ; NO.
8A03  C8                  INY
8A04  D002 ^8A08          BNE     :PF090          ; YES.
8A06  E6B9                INC     NUMBER+1        ; INDEX WRAPAROUND -- BUMP POINTER
8A08  60          :PF090  RTS
8A09                      PROC
                  ;
                  ; XPALET -- COLORS COMMAND PROCESSOR
                  ;
8A09  F013 ^8A1E  XPALET  BEQ     :XP090          ; SYNTAX SCAN ONLY.
8A0B  A200                LDX     #0              ; SETUP TO SCAN COLOR NAME TABLE.
8A0D  204FA5      :XP010  JSR     PRNTCL          ; PRINT COLOR NAME FROM TABLE.
8A10  209D9F              JSR     SPACES
8A13  E8                  INX                     ; SKIP OVER 'SB' ...
8A14  E8                  INX                     ; ... & COLOR VALUF.
8A15  E071                CPX     #PCTUP-PCTAB    ; END OF TABLE?
8A17  D0F4 ^8A0D          BNE     :XP010          ; NO -- CONTINUE.
8A19  20989F              JSR     NEWLIN
8A1C  A900                LDA     #0
8A1E  60          :XP090  RTS                     ; YES -- RETURN WITH CC SET.
                  ;
                  ; XCOLRS -- PS COMMAND PROCESSOR
                  ;
8A1F  F0FD ^8A1E  XCOLRS  BEQ     :XP090          ; SYNTAX SCAN ONLY.
8A21  20BB96              JSR     TSTMOD          ; GRAPHICS SPLIT SCREEN?
8A24  C904                CMP     #GRSS
8A26  D079 ^8AA1          BNE     :XC092          ; NO -- ERROR.
8A28  84AB                STY     XTEMP           ; SAVE Y REG.
8A2A  A927                LDA     #39             ; 'PENS: '.
8A2C  20FFB4              JSR     MESSOT
8A2F  A201                LDX     #1              ; SETUP TO EXAMINE COLOR ASSIGNS.
8A31  ECB905      :XC005  CPX     NCOLRS          ; END OF TABLE?
8A34  F002 ^8A38          BEQ     :XC010          ; NO.
8A36  B017 ^8A4F          BCS     :XC025          ; YES -- ALL DONE WITH PENS.
8A38  8A          :XC010  TXA                     ; GET PEN NUMBER.
8A39  4930                EOR     #'0'            ; CONVERT TO ASCII.
8A3B  208294              JSR     CHOT
8A3E  208189              JSR     PRTEQS          ; '='
8A41  ECBA05              CPX     NXTCLR          ; PEN ASSIGNED?
8A44  B003 ^8A49          BCS     :XC020          ; NO.
8A46  201AA5              JSR     PRCLNM          ; YES -- PRINT COLOR NAME.
8A49  209D9F      :XC020  JSR     SPACES
8A4C  E8                  INX                     ; NEXT PEN.
8A4D  D0E2 ^8A31          BNE     :XC005          ; (BRA).
8A4F  20989F      :XC025  JSR     NEWLIN
8A52  A928                LDA     #40             ; 'BACKGROUND: '.
8A54  20FFB4              JSR     MESSOT
8A57  A200                LDX     #0              ; BACKGROUND SLOT NUMBER.
8A59  201AA5              JSR     PRCLNM          ; PRINT COLOR NAME.
8A5C  A97F                LDA     #TAB
8A5E  208294              JSR     CHOT
8A61  A92A                LDA     #42             ; 'MODE: '
8A63  20FFB4              JSR     MESSOT
8A66  AD3705              LDA     GSMODE
8A69  85A9                STA     TEMP2+2
8A6B  A900                LDA     #0
8A6D  85AA                STA     TEMP2+3
8A6F  A229                LDX     #TEMP2+2-DTAB
8A71  20149E              JSR     DECASC          ; PRINT NODE NUMBER.
8A74  20989F              JSR     NEWLIN
8A77  A929                LDA     #41             ; 'TURTLE PEN: '.
8A79  20FFB4              JSR     MESSOT
8A7C  AD1305              LDA     PEN
8A7F  1004 ^8A85          BPL     :XC030          ; PEN DOWN.
8A81  A271                LDX     #PCTUP-PCTAB    ; 'UP'.
8A83  D002 ^8A87          BNE     :XC040          ; (BRA).
8A85  A275        :XC030  LDX     #PCTDN-PCTAB    ; 'DOWN'.
8A87  204FA5      :XC040  JSR     PRNTCL          ; PRINT 'UP' OR 'DOWN'.
8A8A  A92F                LDA     #'/'            ; '/'
8A8C  208294              JSR     CHOT
8A8F  AD1305              LDA     PEN             ; NOW PRINT PEN NUNBER.
8A92  290F                AND     #$0F
8A94  4930                EOR     #'0'            ; CONVERT TO ASCII.
8A96  208294              JSR     CHOT
8A99  20989F              JSR     NEWLIN
8A9C  A4AB                LDY     XTEMP
8A9E  A900                LDA     #0              ; SET CC FOR EXIT.
8AA0  60          :XC090  RTS
8AA1  A983        :XC092  LDA     #NRCERR         ; COMMAND ONLY VALID IN GRSS
8AA3  60                  RTS
8AA4                      PROC
                  ; XENVIR -- ES COMMAND, TURTLE ENVIRONMENT STATUS
8AA4  F077 ^8B1D  XENVIR  BEQ     :XE090          ; SYNTAX SCAN ONLY.
8AA6  20BB96              JSR     TSTMOD          ; GRAPHICS SPLIT SCREEN?
8AA9  C904                CMP     #GRSS
8AAB  D071 ^8B1E          BNE     :XE092          ; NO -- ERROR.
8AAD  84AB                STY     XTEMP           ; SAVE Y REGISTER.
8AAF  A92B                LDA     #43             ; 'EDGE:'.
8AB1  20FFB4              JSR     MESSOT
8AB4  A200                LDX     #0
8AB6  86AC        :XE010  STX     XTEMP+1
8AB8  BD0D80      :XE020  LDA     EDGTAB,X        ; SCAN TO NAME DELIMITER.
8ABB  E8                  INX
8ABC  C980                CMP     #SB
8ABE  D0F8 ^8AB8          BNE     :XE020
8AC0  BD0D80              LDA     EDGTAB,X        ; SEE IF THIS IS THE RULE IN EFFECT.
8AC3  E8                  INX
8AC4  CD5E05              CMP     EDGRUL
8AC7  D0ED ^8AB6          BNE     :XE010          ; NO -- SCAN TO NEXT NAME.
8AC9  A6AC                LDX     XTEMP+1         ; YES -- BACKUP TO NAME TEXT.
8ACB  BD0D80      :XE030  LDA     EDGTAB,X        ; GET A CHARACTER.
8ACE  3006 ^8AD6          BMI     :XE040          ; DELIMITER.
8AD0  208294              JSR     CHOT            ; OUTPUT CHAR.
8AD3  E8                  INX
8AD4  D0F5 ^8ACB          BNE     :XE030          ; (BRA).
8AD6  A97F        :XE040  LDA     #TAB
8AD8  208294              JSR     CHOT
8ADB  A92C                LDA     #44             ; 'SPEED: '.
8ADD  20FFB4              JSR     MESSOT
8AE0  AD5D05              LDA     SPEED
8AE3  85A7                STA     TEMP2
8AE5  A900                LDA     #0
8AE7  85A8                STA     TEMP2+1
8AE9  A227                LDX     #TEMP2-DTAB
8AEB  20149E              JSR     DECASC
8AEE  20989F              JSR     NEWLIN
8AF1  A92D                LDA     #45             ; 'WALLS: '.
8AF3  20FFB4              JSR     MESSOT
8AF6  18                  CLC
8AF7  A001                LDY     #1
8AF9  6ECE05      :XE050  ROR     WALLS+1
8AFC  6ECD05              ROR     WALLS
8AFF  900F ^8B10          BCC     :XE060          ; NOT A WALL SELECT.
8B01  84A7                STY     TEMP2           ; A WALL SELECT, PRINT POSITION #.
8B03  A900                LDA     #0
8B05  85A8                STA     TEMP2+1
8B07  A227                LDX     #TEMP2-DTAB
8B09  20149E              JSR     DECASC
8B0C  20A29F              JSR     SPACE
8B0F  38                  SEC
8B10  C8          :XE060  INY
8B11  98                  TYA
8B12  4912                EOR     #17+1           ; COMPARE WITHOUT ALTERING THE CARRY.
8B14  D0E3 ^8AF9          BNE     :XE050
8B16  20989F              JSR     NEWLIN
8B19  A4AB                LDY     XTEMP
8B1B  A900                LDA     #0
8B1D  60          :XE090  RTS
8B1E  A983        :XE092  LDA     #NRCERR         ; COMMAND VALID ONLY IN GRSS.
8B20  60                  RTS
8B21                      PROC
8B21  A20A        XTV     LDX     #ONOFFX         ; CHECK FOR 'ON' OR 'OFF'.
8B23  20AB7C              JSR     SBCMAT
8B26  D014 ^8B3C          BNE     :XT090          ; ERROR.
8B28  A592                LDA     EXEC            ; EXECUTE MODE?
8B2A  F010 ^8B3C          BEQ     :XT090          ; NO.
8B2C  8A                  TXA                     ; ON OR OFF?
8B2D  F00E ^8B3D          BEQ     :XT100          ; OFF.
8B2F  ADE005              LDA     DMASAV          ; ON -- TV OFF NOW?
8B32  F008 ^8B3C          BEQ     :XT090          ; NO.
8B34  8D2F02              STA     DMACT           ; YES -- RESTORE PRIOR STATE
8B37  A900                LDA     #0
8B39  8DE005              STA     DMASAV
8B3C  60          :XT090  RTS
8B3D  AD2F02      :XT100  LDA     DMACT           ; OFF -- IS TV ON NOW?
8B40  F0FA ^8B3C          BEQ     :XT090          ; NO.
8B42  8DE005              STA     DMASAV          ; YES -- SAVE STATE.
8B45  A900                LDA     #0              ; DMA OFF.
8B47  8D2F02              STA     DMACT
8B4A  60                  RTS
8B4B                      PROC
                  ;
                  ; COMPUTE COMMAND PROCESSOR
                  ;
8B4B  206E81      XCMPUT  JSR     ATOM            ; CHECK FOR TARGET VARIABLE.
8B4E  D06A ^8BBA          BNE     :XC900          ; INVALID ATOM.
8B50  C904                CMP     #NVAR
8B52  F00B ^8B5F          BEQ     :XC100          ; NUMERIC ASSIGNMENT.
8B54  C980                CMP     #BPTR           ; BYTE POINTER?
8B56  F007 ^8B5F          BEQ     :XC100          ; YES -- SAME AS NUMERIC VARIABLE.
8B58  2918                AND     #SVAR+USVAR     ; STRING ASSIGNMENT?
8B5A  D036 ^8B92          BNE     :XC200          ; YES.
8B5C  A902        :XC092  LDA     #IMPERR         ; NO -- ERROR.
8B5E  60                  RTS
                  ; ARITHMETIC ASSIGNMENT
8B5F  85AB        :XC100  STA     XTEMP           ; SAVE TARGET TYPE.
8B61  20009F              JSR     CHKEQS          ; CHECK FOR ASSIGNMENT OPERATOR NEXT.
8B64  D0F6 ^8B5C          BNE     :XC092          ; ASSIGNMENT SYNTAX ERROR.
8B66  A5B6                LDA     POINT           ; SAVE TARGET ADDRESS.
8B68  48                  PHA
8B69  A5B7                LDA     POINT+1
8B6B  48                  PHA
8B6C  C8                  INY                     ; PREPARE TO EVALUATE EXPRESSION.
8B6D  20D49F              JSR     EXP             ; EVALUATE EXPRESSION.
8B70  68                  PLA                     ; RESTORE TARGET ADDRESS.
8B71  85B7                STA     POINT+1
8B73  68                  PLA
8B74  85B6                STA     POINT
8B76  A592                LDA     EXEC            ; EXECUTE MODE?
8B78  F040 ^8BBA          BEQ     :XC900          ; NO.
8B7A  84AC                STY     XTEMP+1         ; SAVE LINE INDEX.
8B7C  A000                LDY     #0              ; STORE RESULT TO TARGET.
8B7E  A593                LDA     EXPSTK
8B80  91B6                STA     (POINT),Y
8B82  A5AB                LDA     XTEMP           ; SEE IF TARGET IS POINTER TO BYTE.
8B84  C980                CMP     #BPTR
8B86  F005 ^8B8D          BEQ     :XC120          ; YES -- ALL DONE.
8B88  C8                  INY
8B89  A594                LDA     EXPSTK+1
8B8B  91B6                STA     (POINT),Y
8B8D  A4AC        :XC120  LDY     XTEMP+1         ; RESTORE LINE INDEX.
8B8F  A900                LDA     #0              ; COMPUTE WAS A SUCCESS.
8B91  60                  RTS
                  ; STRING ASSIGNMENT
8B92  20009F      :XC200  JSR     CHKEQS          ; ASSIGNMENT OPERATOR?
8B95  D0C5 ^8B5C          BNE     :XC092          ; NO -- ERROR.
8B97  20C18B              JSR     SAVIT2          ; SAVE 'NP' TO 'MP' TEMPORARILY
8B9A  C8                  INY                     ; SKIP OVER '='.
8B9B  20A7A0              JSR     TEXP            ; EVALUATE TEXT EXPRESSION.
8B9E  A592                LDA     EXEC            ; EXECUTE MODE?
8BA0  F018 ^8BBA          BEQ     :XC900          ; NO -- DON'T DO ASSIGNMENT.
8BA2  84AC                STY     XTEMP+1
8BA4  20058C              JSR     RESIT2          ; RESTORE 'NP' FROM 'MP'.
                  ; *** EXTERNAL ENTRY POINT FROM 'XACCPT' ***
8BA7  A242        XCM300  LDX     #DP-DTAB        ; MOVE 'TELN' TO 'DP'.
8BA9  A00C                LDY     #TELN-DTAB
8BAB  203B9A              JSR     PMOVE
8BAE  A980                LDA     #ATRSTR         ; 'STRING' ATTRIBUTE.
8BB0  8D6605              STA     ATRTYP
8BB3  200599              JSR     SINSRT          ; INSERT STRING.
8BB6  08                  PHP
8BB7  A4AC                LDY     XTEMP+1
8BB9  28                  PLP
8BBA  60          :XC900  RTS                     ; RETURN WITH CC SET.
8BBB                      PROC
8BBB  A5AB        SAVIT   LDA     XTEMP           ; STRING TARGET?
8BBD  2918                AND     #SVAR+USVAR
8BBF  F036 ^8BF7          BEQ     :SV090          ; NO.
8BC1  A592        SAVIT2  LDA     EXEC            ; EXECUTE MODE?
8BC3  F032 ^8BF7          BEQ     :SV090          ; NO.
8BC5  98                  TYA                     ; SAVE Y REGISTER.
8BC6  48                  PHA
8BC7  A97B                LDA     # LOW NAMBUF    ; NAME SAVE AREA.
8BC9  85C6                STA     MP
8BCB  A9BE                LDA     # HIGH NAMBUF
8BCD  85C7                STA     MP+1
8BCF  A002                LDY     #2              ; TARGET STRING START INDEX.
8BD1  8C4205              STY     NAMLNG
8BD4  A4C0                LDY     NP+2            ; SOURCE STRING START INDEX.
8BD6  C4C1                CPY     NP+3            ; NULL SOURCE?
8BD8  F01E ^8BF8          BEQ     :SV100          ; YES -- ERROR.
8BDA  C4C1        :SV010  CPY     NP+3            ; END OF STRING?
8BDC  F017 ^8BF5          BEQ     :SV080          ; YES.
8BDE  B1BE                LDA     (NP),Y          ; NO -- GET A CHAR.
8BE0  C8                  INY
8BE1  84A1                STY     TEMP
8BE3  20B69E              JSR     CKEOA           ; END OF ATOM (STRING NAME)?
8BE6  F010 ^8BF8          BEQ     :SV100          ; YES -- ERROR.
8BE8  AC4205              LDY     NAMLNG          ; STORE A CHAR.
8BEB  91C6                STA     (MP),Y
8BED  C8                  INY
8BEE  8C4205              STY     NAMLNG
8BF1  A4A1                LDY     TEMP
8BF3  D0E5 ^8BDA          BNE     :SV010          ; TRY AGAIN (BRA).
8BF5  68          :SV080  PLA                     ; RESTORE Y REGISTER.
8BF6  A8                  TAY
8BF7  60          :SV090  RTS
8BF8  68          :SV100  PLA                     ; RESTORE Y REGISTER.
8BF9  A8                  TAY
8BFA  A982                LDA     #ATMERR+NS      ; INVALID STRING NAME.
8BFC  4C3A7A      :SV190  JMP     PSTOP           ; ABORT COMMAND.
8BFF                      PROC
8BFF  A5AB        RESIT   LDA     XTEMP           ; STRING TARGET?
8C01  2918                AND     #SVAR+USVAR
8C03  F011 ^8C16          BEQ     :RS090          ; NO.
8C05  A97B        RESIT2  LDA     # LOW NAMBUF
8C07  85BE                STA     NP
8C09  A9BE                LDA     # HIGH NAMBUF
8C0B  85BF                STA     NP+1
8C0D  A902                LDA     #2
8C0F  85C0                STA     NP+2
8C11  AD4205              LDA     NAMLNG
8C14  85C1                STA     NP+3
8C16  60          :RS090  RTS
8C17                      PROC
                  ;
                  ; XGRAPH -- GRAPHICS COMMAND PROCESSOR
                  ;
8C17  A592        XGRAPH  LDA     EXEC            ; EXECUTE MODE?
8C19  F00F ^8C2A          BEQ     :XG020          ; NO.
8C1B  AD1405              LDA     GRFLAG          ; YES -- GRAPHICS SCREEN OPEN?
8C1E  D00A ^8C2A          BNE     :XG020          ; YES.
8C20  2060AF              JSR     GPINIT          ; INITIALIZE GRAPHICS PARAMETERS.
8C23  84AB                STY     XTEMP
8C25  201095              JSR     GSOPEN          ; OPEN GRAPHICS SCREEN.
8C28  A4AB                LDY     XTEMP
8C2A  20398C      :XG020  JSR     GCOMND          ; PROCESS ONE GRAPHICS SUB-COMMAND.
8C2D  20139F              JSR     SLB             ; SEE IF MULTIPLES.
8C30  C8                  INY
8C31  C93B                CMP     #';'
8C33  F0E2 ^8C17          BEQ     XGRAPH          ; YES.
8C35  88                  DEY                     ; NO -- ALL DONE.
8C36  A900                LDA     #0              ; CLEAR CC FOR NORMAL EXIT.
8C38  60                  RTS                     ; RETURN WITH CC SET.
8C39                      PROC
                  ; 'GCOMND' PROCESS ONE GRAPHICS SUB-COMMAND OR NESTED GROUP.
8C39  20139F      GCOMND  JSR     SLB             ; SKIP LEADING BLANKS.
8C3C  C928                CMP     #'('             ; CHECK FOR GROUPING WITH '(' & ')'
8C3E  F022 ^8C62          BEQ     :GC100
8C40  206E81              JSR     ATOM            ; CHECK ATOM TYPE.
8C43  D01A ^8C5F          BNE     :GC090          ; ATOM ERROR.
8C45  2986                AND     #NUM+NVAR+BPTR  ; IF NUMERIC, THEN TREAT AS ITERATION COUNT.
8C47  D02A ^8C73          BNE     :GC200          ; YEP.
8C49  A204                LDX     #GTABX          ; NO -- ASSUME ITS A SUB-COMMAND.
8C4B  20AB7C              JSR     SBCMAT
8C4E  D00F ^8C5F          BNE     :GC090          ; NO -- ERROR.
8C50  BDAA80              LDA     SBDTAB,X        ; SETUP ADDRESS OF G-ROUTINE.
8C53  8D0B05              STA     GJUMP+1
8C56  BDAB80              LDA     SBDTAB+1,X
8C59  8D0C05              STA     GJUMP+2
8C5C  4C0A05              JMP     GJUMP           ; GO TO G-ROUTINE & RETURN.
8C5F  4C3A7A      :GC090  JMP     PSTOP           ; FATAL ERROR -- STOP EXECUTION.
                  ; THIS SECTION HANDLES NESTED GROUPS.
8C62  C8          :GC100  INY                     ; SKIP OVER '('.
8C63  20178C              JSR     XGRAPH          ; PROCESS ONE SUB-COMMAND OR NESTED GROUP.
8C66  20139F              JSR     SLB
8C69  C8                  INY
8C6A  C929                CMP     #')'            ; MATCHING PAREN?
8C6C  F04A ^8CB8          BEQ     :GC390          ; YES -- O.K.
8C6E  88                  DEY                     ; NO -- ERROR.
8C6F  A902                LDA     #NSTERR
8C71  D0EC ^8C5F          BNE     :GC090          ; (BRA).
                  ; THIS SECTION HANDLES ITERATIONS
                  ;
                  ; *** EXTERNAL ENTRY POINT ***
                  ;
8C73              GITER
8C73  A592        :GC200  LDA     EXEC            ; EXECUTE MODE?
8C75  F034 ^8CAB          BEQ     :GC300          ; NO -- SYNTAX SCAN ONLY.
8C77  A5B8                LDA     NUMBER          ; SEE IF ZERO ITERATIONS.
8C79  05B9                ORA     NUMBER+1
8C7B  F02E ^8CAB          BEQ     :GC300          ; YES -- SCAN OVER ITERATION BODY.
8C7D  A5DE                LDA     LS              ; NO -- SAVE COUNTER ('LS') ...
8C7F  48                  PHA
8C80  A5DF                LDA     LS+1
8C82  48                  PHA
8C83  98                  TYA                     ; ... & LINE INDEX.
8C84  48                  PHA
8C85  A5B8                LDA     NUMBER          ; GET LOOP COUNT TO 'LS'.
8C87  85DE                STA     LS
8C89  A5B9                LDA     NUMBER+1
8C8B  85DF                STA     LS+1
8C8D  20398C      :GC220  JSR     GCOMND          ; PROCESS ONE COMMAND.
8C90  A25E                LDX     #LS-DTAB        ; DECREMENT ITERATION COUNT.
8C92  20129D              JSR     DDCRI
8C95  A5DE                LDA     LS              ; CHECK FOR RESULT = 0.
8C97  05DF                ORA     LS+1
8C99  F008 ^8CA3          BEQ     :GC240          ; DONE.
8C9B  207E9F              JSR     ABRTCK          ; CHECK FOR OPERATOR ABORT.
8C9E  68                  PLA                     ; NOT DONE -- RESTORE SCAN INDEX.
8C9F  48                  PHA
8CA0  A8                  TAY
8CA1  D0EA ^8C8D          BNE     :GC220          ; (BRA) EXECUTE BODY AGAIN.
8CA3  68          :GC240  PLA                     ; THROW AWAY STARTING INDEX.
8CA4  68                  PLA                     ; RESTORE 'LS'.
8CA5  85DF                STA     LS+1
8CA7  68                  PLA
8CA8  85DE                STA     LS
8CAA  60                  RTS
                  ; THIS SECTION SYNTAX SCANS THE BODY OF AN ITERATION.
8CAB  A592        :GC300  LDA     EXEC            ; SAVE CURRENT VALUE.
8CAD  48                  PHA
8CAE  A900                LDA     #0              ; SETUP FOR SCAN ONLY
8CB0  8592                STA     EXEC
8CB2  20398C              JSR     GCOMND          ; *** RECURSIVE CALL **
8CB5  68                  PLA                     ; RESTORE MODE.
8CB6  8592                STA     EXEC
8CB8  60          :GC390  RTS                     ; PETURN WITH CC SET.
8CB9                      PROC
                  ;
                  ; GREPT -- 'REPEAT' GRAPHICS SUBCOMMAND
                  ;
8CB9  206E81      GREPT   JSR     ATOM            ; REPEAT COUNT MUST FOLLOW.
8CBC  D009 ^8CC7          BNE     :GR090          ; ERROR.
8CBE  2986                AND     #NUM+NVAR+BPTR  ; NUMERIC DATA?
8CC0  F003 ^8CC5          BEQ     :GR088          ; NO -- ERROR.
8CC2  4C738C              JMP     GITER           ; YES -- PROCESS REPEAT LOGIC.
8CC5  A902        :GR088  LDA     #IMPERR
8CC7  4C3A7A      :GR090  JMP     PSTOP
8CCA                      PROC
                  ;
                  ; XSOUND -- SOUND COMMAND PROCESSOR
                  ;
8CCA  A208        XSOUND  LDX     #AUREGS*2       ; SETUP INDEX TO A OF REGS.
8CCC  20079F      :XS010  JSR     SKPSEP          ; SKIP SEPARATORS & GET CHAR.
8CCF  20F99E              JSR     CHKTRM          ; TERMINATOR?
8CD2  F052 ^8D26          BEQ     :XS080          ; YES -- ALL DONE.
8CD4  C928                CMP     #'('            ; LEFT PAREN?
8CD6  F04B ^8D23          BEQ     :XS050          ; YES -- START OF NOTE LIST.
8CD8  C929                CMP     #')'            ; RIGHT PAREN?
8CDA  F04A ^8D26          BEQ     :XS080          ; YES -- END OF NOTE LIST.
8CDC  C93D                CMP     #'='            ; EQUAL SIGN?
8CDE  F022 ^8D02          BEQ     :XS020          ; YES -- NO CHANGE FOR VOICE.
8CE0  C92B                CMP     #'+'            ; PLUS SIGN?
8CE2  F021 ^8D05          BEQ     :XS030          ; YES -- INCREMENT NOTE.
8CE4  C92D                CMP     #'-'            ; MINUS SIGN.
8CE6  F02C ^8D14          BEQ     :XS040          ; YES -- DECREMENT NOTE.
8CE8  20578D              JSR     GTNOTE          ; GET NUMERIC VALUE.
8CEB  D064 ^8D51          BNE     :XS090          ; ERROR.
8CED  A5B8                LDA     NUMBER          ; NOTE := NUM.
8CEF  85AB        :XS015  STA     XTEMP           ; SAVE NOTE #
8CF1  A592                LDA     EXEC            ; EXECUTE MODE?
8CF3  F007 ^8CFC          BEQ     :XS017          ; NO.
8CF5  A5AB                LDA     XTEMP           ; YES.
8CF7  0980                ORA     #$80            ; SET BIT FOR NOT A POINTER.
8CF9  9D1405              STA     AUDIOR-1,X
8CFC  CA          :XS017  DEX                     ; MORE OPERANDS ALLOWED?
8CFD  CA                  DEX
8CFE  D0CC ^8CCC          BNE     :XS010          ; YES.
8D00  F024 ^8D26          BEQ     :XS080          ; NO -- SEE IF DURATION (BRA).
8D02  C8          :XS020  INY
8D03  D0F7 ^8CFC          BNE     :XS017          ; (BRA).
8D05  C8          :XS030  INY
8D06  20578D              JSR     GTNOTE          ; GET INCREMENT VALUE.
8D09  D046 ^8D51          BNE     :XS090          ; ERROR.
8D0B  BD1405              LDA     AUDIOR-1,X      ; NOTE :=NOTE + NUM.
8D0E  18                  CLC
8D0F  65B8                ADC     NUMBER
8D11  4CEF8C              JMP     :XS015
8D14  C8          :XS040  INY
8D15  20578D              JSR     GTNOTE          ; GET DECREMENT VALUE.
8D18  D037 ^8D51          BNE     :XS090          ; ERROR.
8D1A  BD1405              LDA     AUDIOR-1,X      ; NOTE := NOTE - NUM.
8D1D  38                  SEC
8D1E  E5B8                SBC     NUMBER
8D20  4CEF8C              JMP     :XS015
8D23  C8          :XS050  INY                     ; SKIP OVER LEFT RAREN.
8D24  D0A6 ^8CCC          BNE     :XS010          ; (BRA).
8D26  A592        :XS080  LDA     EXEC            ; EXECUTE MODE?
8D28  F01A ^8D44          BEQ     :XS084          ; NO.
8D2A  E000                CPX     #0
8D2C  F00F ^8D3D          BEQ     :XS083
8D2E  A900        :XS082  LDA     #0              ; CLEAR UNSPECIFIED VOICES.
8D30  9D1405              STA     AUDIOR-1,X
8D33  9DFED1              STA     AUDF1-2,X       ; CLEAR SOUND REGISTERS.
8D36  9DFFD1              STA     AUDC1-2,X
8D39  CA                  DEX
8D3A  CA                  DEX
8D3B  D0F1 ^8D2E          BNE     :XS082
8D3D  84AB        :XS083  STY     XTEMP
8D3F  204FB4              JSR     TONES
8D42  A4AB                LDY     XTEMP
8D44  B180        :XS084  LDA     (INLN),Y        ; DURATION FOLLOWING?
8D46  C929                CMP     #')'
8D48  D004 ^8D4E          BNE     :XS088          ; NO.
8D4A  C8                  INY                     ; YES -- SKIP OVER LEFT PAREN.
8D4B  4C548F              JMP     XWAIT           ; PROCESS DURATION AS A PAUSE.
8D4E  A900        :XS088  LDA     #0              ; RETURN WITH CC SET.
8D50  60                  RTS
8D51  20B49F      :XS090  JSR     AUDCLR          ; CLEAR ALL SOUND REGS.
8D54  A902        XIN080  LDA     #IMPERR
8D56  60          XIN090  RTS                     ; RETURN WITH CC SET.
8D57                      PROC
8D57  86AB        GTNOTE  STX     XTEMP           ; SAVE X REGISTER.
8D59  206E81              JSR     ATOM            ; GET OPERAND.
8D5C  D008 ^8D66          BNE     :GN090          ; ERROR.
8D5E  2986                AND     #NUM+NVAR+BPTR
8D60  F005 ^8D67          BEQ     :GN092          ; ERROR.
8D62  A6AB                LDX     XTEMP           ; RESTORE X REGISTER.
8D64  A900                LDA     #0
8D66  60          :GN090  RTS
8D67  A902        :GN092  LDA     #IMPERR
8D69  60                  RTS
8D6A                      PROC
                  ;
                  ; XIN -- READ COMMAND PROCESSOR
                  ;
8D6A  A904        XIN     LDA     #OREAD          ; READ DIRECTION.
8D6C  20FD97              JSR     SCNDEV          ; CONVERT DEVICE SPEC TO IOCB INDEX
8D6F  D0E5 ^8D56          BNE     XIN090          ; ERROR.
8D71  86AD                STX     XTEMP+2         ; SAVE IOCB INDEX.
8D73  20079F              JSR     SKPSEP          ; SKIP OVER SEPARATOR.
8D76  206E81              JSR     ATOM            ; FIND TYPE OF VARIABLE.
8D79  D0DB ^8D56          BNE     XIN090          ; ERROR.
8D7B  85AB                STA     XTEMP           ; SAVE ATOM TYPE.
8D7D  299D                AND     #SVAR+USVAR+NVAR+NULL+BPTR ; VALID TYPE?
8D7F  F0D3 ^8D54          BEQ     XIN080          ; NO.
8D81  A592                LDA     EXEC            ; EXECUTE MODE?
8D83  F0D1 ^8D56          BEQ     XIN090          ; NO.
8D85  84AC                STY     XTEMP+1         ; SAVE LINE INDEX.
8D87  A6AD                LDX     XTEMP+2         ; GET IOCB INDEX.
8D89  A000                LDY     #0              ; INIT INDEX TO ACCEPT BUFFER.
8D8B  848E                STY     TELN+2
8D8D  AD2005              LDA     OPNBUF          ; SEE IF READING FROM TEXT SCREEN.
8D90  C945                CMP     #'E'
8D92  D004 ^8D98          BNE     :XI030          ; NO.
8D94  98                  TYA                     ; YES -- ENABLE CURSOR CY = 0).
8D95  20A79F              JSR     CRSNOP          ; MAKE IT APPEAR.
8D98  205397      :XI030  JSR     DIN             ; GET A CHARACTER FROM DEVICE.
8D9B  C99B                CMP     #EOL            ; END OF LINE?
8D9D  F00E ^8DAD          BEQ     :XI040          ; YES -- DONE.
8D9F  918C                STA     (TELN),Y
8DA1  C8                  INY
8DA2  C0FE                CPY     #TEXLNG         ; BUFFER FULL?
8DA4  D0F2 ^8D98          BNE     :XI030          ; NO.
8DA6  205397      :XI035  JSR     DIN             ; YES -- FLUSH TO EOL.
8DA9  C99B                CMP     #EOL
8DAB  D0F9 ^8DA6          BNE     :XI035
8DAD  848F        :XI040  STY     TELN+3          ; SAVE STRING END INDEX.
8DAF  AD2005              LDA     OPNBUF          ; READING FROM TEXT SCREEN?
8DB2  C945                CMP     #'E'
8DB4  D003 ^8DB9          BNE     :XI045          ; NO.
8DB6  20A79F              JSR     CRSNOP          ; DISABLE CURSOR AGAIN (A = $45).
8DB9  A901        :XI045  LDA     #1              ; SET ACCEPT LITERAL.
8DBB  8D4605              STA     AXFLAG
8DBE  20BB8B              JSR     SAVIT           ; SAVE NAME IF STRING TARGET.
8DC1  4CC785              JMP     XAC024          ; GO TO ACCEPT CODE TO FINISH PROCESSING.
8DC4                      PROC
                  ;
                  ; XOUT -- WRITE COMMAND PROCESSOR
                  ;
8DC4  A908        XOUT    LDA     #OWRIT          ; WRITE DIRECTION.
8DC6  20FD97              JSR     SCNDEV          ; CONVERT I/O SPEC TO DEVICE INDEX.
8DC9  D02B ^8DF6          BNE     :XO090          ; ERROR.
8DCB  86AB                STX     XTEMP           ; SAVE IOCB INDEX.
8DCD  B180                LDA     (INLN),Y
8DCF  20F99E              JSR     CHKTRM          ; TERMINATOR FOLLOWING DEVICE SPEC?
8DD2  F001 ^8DD5          BEQ     :XO005          ; YES -- DON'T ADVANCE INDEX.
8DD4  C8                  INY                     ; NO -- SKIP OVER SINGLE SEPARATOR.
8DD5  20A7A0      :XO005  JSR     TEXP            ; REST OF STATEMENT IS A TEXT EXPRESSION.
                  ; *S*   LDA     EXEC            ; EXECUTE MODE?
8DD8  F01C ^8DF6          BEQ     :XO090          ; NO.
8DDA  84AC                STY     XTEMP+1         ; SAVE LINE INDEX.
8DDC  A6AB                LDX     XTEMP           ; GET IOCB INDEX.
8DDE  A48E                LDY     TELN+2          ; START OF TEXT EXPRESSION EVALUATION.
8DE0  C48F        :XO010  CPY     TELN+3          ; DONE?
8DE2  F009 ^8DED          BEQ     :XO020          ; YES.
8DE4  B900BC              LDA     TEXBUF,Y        ; NO -- PUT CHAR TO DEVICE.
8DE7  205897              JSR     DOUT
8DEA  C8                  INY
8DEB  D0F3 ^8DE0          BNE     :XO010          ; (BRA).
8DED  A99B        :XO020  LDA     #EOL            ; TERMINATE RECORD.
8DEF  205897              JSR     DOUT
8DF2  A4AC                LDY     XTEMP+1
8DF4  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
8DF6  60          :XO090  RTS                     ; RETURN WITH CC SET.
8DF7                      PROC
                  ;
                  ; XDONE -- CLOSE COMMAND PROCESSOR
                  ;
8DF7  A900        XDONE   LDA     #0              ; INVALID OPEN CODE MEANS CLOSE.
8DF9  20FD97              JSR     SCNDEV          ; CONVERT DEVICE SPEC TO ICCB INDEX.
8DFC  D009 ^8E07          BNE     :XD090          ; ERROR.
8DFE  A592                LDA     EXEC            ; EXECUTE MODE?
8E00  F005 ^8E07          BEQ     :XD090          ; NO.
8E02  203F97              JSR     DCLOSE          ; YES -- CLOSE IOCB & DEVICE.
8E05  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
8E07  60          :XD090  RTS                     ; RETURN WITH CC SET.
8E08                      PROC
                  ;
                  ; XSSAV -- SAVE SCREEN COMMAND PROCESSOR.
                  ;
8E08  20C297      XSSAV   JSR     SFNAME          ; EXTRACT DEVICE/FILENAME.
8E0B  D050 ^8E5D          BNE     :XS090          ; ERROR.
8E0D  20079F              JSR     SKPSEP          ; SKIP SEPARATOR(S).
8E10  A592                LDA     EXEC            ; EXECUTE MODE?
8E12  F049 ^8E5D          BEQ     :XS090          ; NO.
8E14  A230                LDX     #IOCB3          ; YES -- OPEN DEVICE FOR OUTPUT.
8E16  A908                LDA     #OWRIT
8E18  20F496              JSR     DOPEN
8E1B  A90B                LDA     #PUTC           ; SETUP IOCB FOR PUT CHARACTER.
8E1D  9D4203              STA     ICCOM,X
8E20  A230                LDX     #IOCB3
8E22  AD1405              LDA     GRFLAG          ; GRAPHICS SCREEN FLAG.
8E25  205897              JSR     DOUT
8E28  AD3705              LDA     GSMODE          ; SAVE SCREEN MODE.
8E2B  205897              JSR     DOUT
8E2E  AD5205              LDA     SPLTSC          ; FULL/SPLIT FLAG.
8E31  205897              JSR     DOUT
8E34  AD5105              LDA     LETTRSZ         ; LETTER SIZE.
8E37  205897              JSR     DOUT
8E3A  A559                LDA     SAVMSC+1        ; SETUP POINTER TO BOTTOM OF SCREEN.
8E3C  85F7                STA     ADRESS+1
8E3E  A900                LDA     #0
8E40  85F6                STA     ADRESS
8E42  84AB                STY     XTEMP
8E44  A458                LDY     SAVMSC
8E46  B1F6        :XS010  LDA     (ADRESS),Y      ; GET DATA BYTE.
8E48  205897              JSR     DOUT            ; OUTPUT IT.
8E4B  C8                  INY
8E4C  D0F8 ^8E46          BNE     :XS010
8E4E  E6F7                INC     ADRESS+1
8E50  A5F7                LDA     ADRESS+1
8E52  C56A                CMP     RAMTOP          ; DONE?
8E54  D0F0 ^8E46          BNE     :XS010          ; NO.
8E56  A4AB                LDY     XTEMP
8E58  203F97              JSR     DCLOSE
8E5B  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
8E5D  60          :XS090  RTS                     ; RETURN WITH CC SET.
8E5E                      PROC
                  ;
                  ; XSLOAD -- LOAD SCREEN COMMAND PROCESSOR.
                  ;
8E5E  20C297      XSLOD   JSR     SFNAME          ; EXTRACT DEVICE/FILENAME.
8E61  D05F ^8EC2          BNE     :XS090          ; ERROR.
8E63  A592                LDA     EXEC            ; EXECUTE MODE?
8E65  F05B ^8EC2          BEQ     :XS090          ; NO.
8E67  A230                LDX     #IOCB3          ; YES -- OPEN DEVICE FOR INPUT.
8E69  A904                LDA     #OREAD
8E6B  20F496              JSR     DOPEN
8E6E  84AB                STY     XTEMP
8E70  A907                LDA     #GETC           ; SETUP I OCB FOR GET CHARACTER
8E72  9D4203              STA     ICCOM,X
8E75  A230                LDX     #IOCB3
8E77  205397              JSR     DIN             ; GET GRAPHICS FLAG.
8E7A  8D1405              STA     GRFLAG
8E7D  205397              JSR     DIN             ; GET SCREEN MODE.
8E80  8D3705              STA     GSMODE
8E83  205397              JSR     DIN             ; GET FULL/SPLIT FLAG.
8E86  8D5205              STA     SPLTSC
8E89  205397              JSR     DIN             ; GET LETTER SIZE.
8E8C  8D5105              STA     LETTRSZ
8E8F  20BB96              JSR     TSTMOD          ; SEE IF TEXT/SMALL LETTERS.
8E92  C901                CMP     #TXSL
8E94  D006 ^8E9C          BNE     :XS005          ; NO.
8E96  20F494              JSR     TXOPEN          ; YES.
8E99  4C9F8E              JMP     :XS007
8E9C  201095      :XS005  JSR     GSOPEN          ; OPEN SCREEN.
8E9F  A559        :XS007  LDA     SAVMSC+1        ; SETUP POINTER TO BOTTOM OF SCREEN
8EA1  85F7                STA     ADRESS+1
8EA3  A900                LDA     #0
8EA5  85F6                STA     ADRESS
8EA7  A230                LDX     #IOCB3
8EA9  A458                LDY     SAVMSC
8EAB  205397      :XS010  JSR     DIN
8EAE  91F6                STA     (ADRESS),Y
8EB0  C8                  INY
8EB1  D0F8 ^8EAB          BNE     :XS010
8EB3  E6F7                INC     ADRESS+1
8EB5  A5F7                LDA     ADRESS+1
8EB7  C56A                CMP     RAMTOP          ; DONE?
8EB9  D0F0 ^8EAB          BNE     :XS010          ; NO.
8EBB  A4AB                LDY     XTEMP
8EBD  203F97              JSR     DCLOSE
8EC0  A900                LDA     #0
8EC2  60          :XS090  RTS
8EC3                      PROC
                  ;
                  ; XDIR -- DISK DIRECTORY COMMAND PROCESSOR
                  ;
8EC3  20D49F      XDIR    JSR     EXP             ; GET DRIVE NUMBER.
8EC6  A592                LDA     EXEC            ; EXECUTE MODE?
8EC8  F034 ^8EFE          BEQ     :XD090          ; NO -- SYNTAX SCAN ONLY.
8ECA  A207                LDX     #:DTLNG         ; MOVE OPEN TEMPLATE ...
8ECC  BDFE8E      :XD005  LDA     :DIRTB-1,X      ; ... TO OPEN BUFFER.
8ECF  9D1F05              STA     OPNBUF-1,X
8ED2  CA                  DEX
8ED3  D0F7 ^8ECC          BNE     :XD005
8ED5  A593                LDA     EXPSTK          ; INSERT DRIVE A.
8ED7  4930                EOR     #'0'
8ED9  8D2105              STA     OPNBUF+1
8EDC  A230                LDX     #IOCB3
8EDE  A906                LDA     #OREAD+2        ; OPEN FOR DIRECTORY READ.
8EE0  20F496              JSR     DOPEN
8EE3  A230        :XD010  LDX     #IOCB3          ; GET A BYTE.
8EE5  205397              JSR     DIN
8EE8  A6E4                LDX     IOSTAT          ; CHECK FOR END-OF-FILE.
8EEA  E088                CPX     #$88
8EEC  F006 ^8EF4          BEQ     :XD020          ; EOF -- ALL DONE.
8EEE  208294              JSR     CHOT            ; WRITE TO SCREEN.
8EF1  4CE38E              JMP     :XD010
8EF4  A230        :XD020  LDX     #IOCB3          ; CLOSE THE FILE.
8EF6  203F97              JSR     DCLOSE
8EF9  20989F              JSR     NEWLIN
8EFC  A900                LDA     #0              ; SET CC FOR EXIT.
8EFE  60          :XD090  RTS
8EFF  44203A2A2E  :DIRTB  DB      'D :*.*',EOL    ; DIRECTORY OPEN TEMPLATE.
      = 0007      :DTLNG  = *-:DIRTB
8F06                      PROC
                  ;
                  ; XCOMM -- COMMAND TABLE LISTER
                  ;
8F06  F014 ^8F1C  XCOMM   BEQ     :XC090          ; SYNTAX SCAN ONLY.
8F08  AD0005              LDA     USRTAB          ; FIRST LIST USER SUPPLIED TABLE.
8F0B  AE0105              LDX     USRTAB+1
8F0E  F003 ^8F13          BEQ     :XC010          ; NO TABLE.
8F10  201D8F              JSR     PRINTC
8F13  A901        :XC010  LDA     # LOW CTAB      ; NOW LIST BUILT-IN TABLE.
8F15  A27D                LDX     # HIGH CTAB
8F17  201D8F              JSR     PRINTC
8F1A  A900                LDA     #0
8F1C  60          :XC090  RTS                     ; RETURN WITH CC SET.
8F1D  8590        PRINTC  STA     TABADR          ; SETUP POINTER TO BEGIN OF TABLE.
8F1F  8691                STX     TABADR+1
8F21  84AB                STY     XTEMP           ; SAVE Y REG.
8F23  A905        :PC003  LDA     #5              ; 5 NAMES PER LINE.
8F25  85AC                STA     XTEMP+1
8F27  A000        :PC005  LDY     #0              ; START NAME SCAN.
8F29  B190        :PC010  LDA     (TABADR),Y      ; GET CHARACTER.
8F2B  F021 ^8F4E          BEQ     :PC080          ; END OF TABLE.
8F2D  3006 ^8F35          BMI     :PC020          ; END OF NAME.
8F2F  208294              JSR     CHOT            ; OUTPUT CHARACTER.
8F32  C8                  INY
8F33  D0F4 ^8F29          BNE     :PC010          ; (BRA).
8F35  209D9F      :PC020  JSR     SPACES
8F38  C8                  INY                     ; SKIP OVER PARAMETERS.
8F39  C8                  INY
8F3A  98                  TYA                     ; ADD Y REG TO TABADR.
8F3B  18                  CLC
8F3C  6590                ADC     TABADR
8F3E  8590                STA     TABADR
8F40  9002 ^8F44          BCC     :PC030
8F42  E691                INC     TABADR+1
8F44  C6AC        :PC030  DEC     XTEMP+1         ; LINE FULL (5 NAMES)?
8F46  D0DF ^8F27          BNE     :PC005
8F48  20989F              JSR     NEWLIN          ; YES.
8F4B  4C238F              JMP     :PC003
8F4E  20989F      :PC080  JSR     NEWLIN
8F51  A4AB                LDY     XTEMP
8F53  60                  RTS
8F54                      PROC
                  ;
                  ; XWAIT -- PAUSE COMMAND PROCESSOR
                  ;
8F54  20D49F      XWAIT   JSR     EXP             ; THERE MUST BE AN EXPRESSION FOLLOWING.
8F57  A592                LDA     EXEC            ; EXECUTE MODE?
8F59  F01B ^8F76          BEQ     :XW090          ; NO -- ALL DONE.
8F5B  A213                LDX     #EXPSTK-DTAB    ; YES -- WORK WITH COUNT.
8F5D  84AB                STY     XTEMP           ; SAVE LINE INDEX.
8F5F  A4AB        :XW010  LDY     XTEMP           ; RESTORE INDEX.
8F61  A593                LDA     EXPSTK          ; ALL DONE?
8F63  0594                ORA     EXPSTK+1
8F65  F00F ^8F76          BEQ     :XW090          ; YES.
8F67  A414                LDY     RTCLOK+2        ; NO -- WAIT FOR ...
8F69  207E9F      :XW020  JSR     ABRTCK          ; ... OPERATOR ABORT ...
8F6C  C414                CPY     RTCLOK+2
8F6E  F0F9 ^8F69          BEQ     :XW020          ; ... OR CLOCK TO CHANGE.
8F70  20129D              JSR     DDCRI           ; DECREMENT COUNT.
8F73  4C5F8F              JMP     :XW010
8F76  60          :XW090  RTS
8F77                      PROC
                  ;
                  ; XSPEED -- SPEED CONTROL COMMAND PROCESSOR
                  ;
8F77  20D49F      XSPEED  JSR     EXP             ; THERE MUST BE AN EXPRESSION.
8F7A  A592                LDA     EXEC            ; EXECUTE MODE?
8F7C  F007 ^8F85          BEQ     :XS090          ; NO.
8F7E  A593                LDA     EXPSTK          ; YES -- SET SPEED.
8F80  8D5D05              STA     SPEED
8F83  A900                LDA     #0              ; SET CC FOR EXIT.
8F85  60          :XS090  RTS                     ; RETURN WITH CC SET.
8F86                      PROC
                  ;
                  ; XCASS -- CASSETTE ON/OFF COMMAND PROCESSOR
                  ;
8F86  A20A        XCASS   LDX     #ONOFFX         ; CHECK FOR 'ON' OR 'OFF'
8F88  20AB7C              JSR     SBCMAT
8F8B  D00C ^8F99          BNE     :XC090          ; NOT FOUND -- ERROR.
8F8D  A592                LDA     EXEC            ; EXECUTE MODE?
8F8F  F008 ^8F99          BEQ     :XC090          ; NO.
8F91  BD9A8F              LDA     CASCTL,X        ; 0/1 -> CASSETTE CONTROL.
8F94  8D02D3              STA     PACTL
8F97  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
8F99  60          :XC090  RTS                     ; RETURN WITH CC SET.
                  ; CASSETTE CONTROL
                  ; REQUIRES KOFF = 0, KON = 1.
8F9A  3C          CASCTL  DB      CASSOF
8F9B  34                  DB      CASSON
8F9C                      PROC
                  ;
                  ; XCSYNC -- CASSETTE SYNC COMMAND PROCESSOR
                  ;
8F9C  F01B ^8FB9  XCSYNC  BEQ     :XC090          ; SYNTAX SCAN.
8F9E  AD02D3              LDA     PACTL           ; CHECK CASSETTE MOTOR.
8FA1  2908                AND     #$08
8FA3  D012 ^8FB7          BNE     :XC080          ; MOTOR OFF.
8FA5  A910                LDA     #$10            ; ON -- WAIT FOR MARK TO SPACE TRANSITION.
8FA7  207E9F      :XC010  JSR     ABRTCK          ; WAIT FOR BREAK ...
8FAA  2C0FD2              BIT     SKSTAT
8FAD  F0F8 ^8FA7          BEQ     :XC010          ; ... OR MARK.
8FAF  207E9F      :XC020  JSR     ABRTCK          ; WAIT FOR BREAK ...
8FB2  2C0FD2              BIT     SKSTAT
8FB5  D0F8 ^8FAF          BNE     :XC020          ; ... OR SPACE.
8FB7  A900        :XC080  LDA     #0              ; SET CC FOR NORMAL EXIT.
8FB9  60          :XC090  RTS                     ; RETURN WITH CC SET.
8FBA                      PROC
                  ;
                  ; XTRACE -- TRACE MODE ON/OFF COMMAND
                  ;
8FBA  A20A        XTRACE  LDX     #ONOFFX         ; CHECK FOR 'ON' OR 'OFF'.
8FBC  20AB7C              JSR     SBCMAT
8FBF  D009 ^8FCA          BNE     :XT090          ; NOT FOUND -- ERROR.
8FC1  A592                LDA     EXEC            ; EXECUTE MODE?
8FC3  F005 ^8FCA          BEQ     :XT090          ; NO.
                  ; REQUIRES KOFF = 0, KON <> 0.
8FC5  8E3505              STX     TRACE           ; SET FLAG.
8FC8  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
8FCA  60          :XT090  RTS                     ; RETURN WITH CC SET.
8FCB                      PROC
                  ;
                  ; XSAVE -- SAVE COMMAND PROCESSOR
                  ;
8FCB  20D696      XSAVE   JSR     DNAME           ; EXTRACT DEVICE/FILENAME.
8FCE  20079F              JSR     SKPSEP          ; SKIP SEPARATOR(S).
8FD1  A592                LDA     EXEC            ; EXECUTE MODE?
8FD3  F024 ^8FF9          BEQ     :XS090          ; NO.
8FD5  A230                LDX     #IOCB3
8FD7  A908                LDA     #OWRIT          ; YES -- OPEN DEVICE FOR OUTPUT.
8FD9  20F496              JSR     DOPEN
8FDC  A90B                LDA     #PUTC           ; SETUP IOCB FOR PUT CHARACTER.
8FDE  9D4203              STA     ICCOM,X
8FE1  A9B0                LDA     #$80+IOCB3      ; RE-ROUTE 'CHOT' OUTPUT TO DEVICE.
8FE3  8D3005              STA     CDEST
8FE6  20B490              JSR     LISTER          ; OUTPUT PROGRAM TO DEVICE.
8FE9  A230                LDX     #IOCB3
8FEB  203F97              JSR     DCLOSE          ; CLOSE DEVICE.
8FEE  A906                LDA     #EPUTC-IOVBAS   ; RESTORE 'CHOT' OUTPUT.
8FF0  8D3005              STA     CDEST
                  ; *** EXTERNAL ENTRY POINT FROM 'XLIST' ***
8FF3  202CB5      XSV050  JSR     RDYMES          ; GENERATE "READY" MESSAGE.
8FF6  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
8FF8              XAP090
8FF8              XME090
8FF8              XLO090
8FF8  60                  RTS                     ; RETURN WITH CC SET.
8FF9  4CB490      :XS090  JMP     LISTER          ; SYNTAX CHECK & RETURN WITH CC SET.
8FFC                      PROC
                  ;
                  ; XLOAD -- LOAD COMMAND PROCESSOR
                  ;
8FFC  201090      XLOAD   JSR     XLO100          ; COMMON CODE.
8FFF  D0F7 ^8FF8          BNE     XLO090          ; ERROR.
                  ; *** EXTERNAL ENTRY FROM 'XRUN' ***
9001  A592        XLO005  LDA     EXEC            ; EXECUTE MODE?
9003  F0F3 ^8FF8          BEQ     XLO090          ; NOT.
9005  20C087              JSR     CLRPRG          ; CLEAR PROGRAM STORAGE AREA.
9008  A901                LDA     #KLOAD          ; SET LOAD FLAG.
                  ; *** EXTERNAL ENTRY FROM 'XMERGE', 'XARPND' ***
900A  8D3205      XLO010  STA     LOADFG
900D  4C0979              JMP     MLLOAD          ; LOAD UNTIL I/O ERROR OR END OF FILE.
                                                  ; SET 'GETCOM'.
9010  20C297      XLO100  JSR     SFNAME          ; EXTRACT DEVICE/FILENAME.
9013  D0E3 ^8FF8          BNE     XLO090          ; ERROR.
9015  A592                LDA     EXEC            ; EXECUTE MODE?
9017  F0DF ^8FF8          BEQ     XLO090          ; NO.
9019  AD3205              LDA     LOADFG          ; ALREADY LOADING?
901C  D0DA ^8FF8          BNE     XLO090          ; YES -- ERROR.
901E  A230                LDX     #IOCB3
9020  A904                LDA     #OREAD          ; YES -- OPEN DEVICE FOR READING.
9022  20F496              JSR     DOPEN
9025  A900                LDA     #0              ; CLEAR USE STACK.
9027  8D4D05              STA     USTKP
902A  60                  RTS
                  ;
                  ; XMERGE -- MERGE COMMAND
                  ;
902B  201090      XMERGE  JSR     XLO100          ; COMMON CODE.
902E  D0C8 ^8FF8          BNE     XME090          ; ERROR.
9030  A592                LDA     EXEC            ; EXECUTE MODE?
9032  F0C4 ^8FF8          BEQ     XME090          ; NO.
9034  A902                LDA     #KMERGE         ; SET LOAD FLAG.
9036  D0D2 ^900A          BNE     XLO010          ; (BRA).
                  ;
                  ; XAPPND -- APPEND COMPAND PROCESSOR.
                  ;
9038  201090      XAPPND  JSR     XLO100          ; COMMON CODE.
903B  D0BB ^8FF8          BNE     XAP090          ; ERROR.
903D  201A91              JSR     XAU010          ; SHARE 'XAUTO' CODE FOR LINE #'S.
9040  D0B6 ^8FF8          BNE     XAP090          ; ERROR.
9042  A592                LDA     EXEC            ; EXECUTE MODE?
9044  F0B2 ^8FF8          BEQ     XAP090          ; NO.
9046  A903                LDA     #KAPPND         ; SET LOAD FLAG.
9048  D0C0 ^900A          BNE     XLO010          ; (BRA).
904A                      PROC
                  ;
                  ; XLETTR -- TEXT LETTER SIZE SELECTION
                  ;
904A  A20C        XLETTR  LDX     #LTTABX         ; CHECK FOR 'SMALL', 'MEDIUM', OR 'LARGE'.
904C  20AB7C              JSR     SBCMAT
904F  D02D ^907E          BNE     :XL090          ; NOT FOUND -- ERROR.
9051  A592                LDA     EXEC            ; EXECUTE MODE?
9053  F029 ^907E          BEQ     :XL090          ; NO.
9055  AD4505              LDA     SGLSTP          ; SINGLE STEP?
9058  F004 ^905E          BEQ     :XL020          ; NO.
905A  A983                LDA     #NRCERR         ; YES -- ERROR.
905C  D020 ^907E          BNE     :XL090
905E  84AB        :XL020  STY     XTEMP
9060  8E5105              STX     LETTRSZ         ; YES -- SET NEW LETTER SIZE.
9063  8A                  TXA
9064  D006 ^906C          BNE     :XL050          ; MEDIUM OR LARGE LETTERS.
9066  20F494              JSR     TXOPEN          ; SMALL LETTERS.
9069  4C7790              JMP     :XL080
906C  8E3705      :XL050  STX     GSMODE          ; GRAPHICS MODE.
906F  A900                LDA     #0
9071  8D5205              STA     SPLTSC          ; NO SPLIT SCREEN.
9074  201095              JSR     GSOPEN          ; OPEN SCREEN.
9077  A4AB        :XL080  LDY     XTEMP
9079  A900                LDA     #0              ; RESET GRAPHICS MODE FLAG & SET CC.
907B  8D1405              STA     GRFLAG
907E  60          :XL090  RTS                     ; RETURN WITH CC SET.
907F                      PROC
                  ;
                  ; XSCROLL -- SCROLL OPTION SELECTION
                  ;
907F  A210        XSCROLL LDX     #SCTABX         ; CHECK FOR 'FINE' OP 'COARSE'.
9081  20AB7C              JSR     SBCMAT
9084  D01D ^90A3          BNE     :XS090          ; NOT FOUND -- ERROR.
9086  A592                LDA     EXEC            ; EXECUTE MODE?
9088  F019 ^90A3          BEQ     :XS090          ; NO.
908A  20BB96              JSR     TSTMOD          ; TEXT MODE, SMALL LETTERS?
908D  C901                CMP     #TXSL
908F  D013 ^90A4          BNE     :XS092          ; NO.
9091  8EB205              STX     FINEFG          ; SET SCREEN EDITOR FLAG.
9094  84AB                STY     XTEMP
9096  202996              JSR     COMPRS          ; COMPRESS MEMORY.
9099  208E96              JSR     EOPEN           ; RE-OPEN E: ON IOCB 0.
909C  205C96              JSR     EXPAND          ; EXPAND MEMORY.
909F  A4AB                LDY     XTEMP
90A1  A900                LDA     #0              ; SET CC FOR NORMAL EXIT
90A3  60          :XS090  RTS                     ; RETURN WITH CC SET.
90A4  A983        :XS092  LDA     #NRCERR
90A6  60                  RTS
90A7                      PROC
                  ;
                  ; XLIST -- LIST COMMND PROCESSOR
                  ;
                  ; *** EXTERNAL ENTRY POINT FROM 'XSAVE' ***
90A7  20B490      XLIST   JSR     LISTER          ; DO THE LIST PROCESS.
90AA  D007 ^90B3          BNE     :XL009          ; ERROR.
90AC  A592                LDA     EXEC            ; EXECUTE MODE?
90AE  F003 ^90B3          BEQ     :XL009          ; NO.
90B0  4CF38F              JMP     XSV050          ; YES -- SIGN OFF & RETURN.
90B3  60          :XL009  RTS                     ; RETURN WITH CC SET.
90B4  A90D        LISTER  LDA     #LOW LSTNMS     ; ADDRESS OF DEFAULTS.
90B6  85B6                STA     POINT
90B8  A991                LDA     #HIGH LSTNMS
90BA  85B7                STA     POINT+1
90BC  206D93              JSR     MNYNMS          ; GET PARAMETERS.
90BF  D045 ^9106          BNE     :XL900          ; SYNTAX ERROR.
90C1  E003                CPX     #3
90C3  B041 ^9106          BCS     :XL900          ; TOO MANY NUMBERS.
90C5  E001                CPX     #1              ; HOW MANY ARGS?
90C7  D00C ^90D5          BNE     :XL010          ; 0 OR 2.
90C9  AD5305              LDA     NMSBF           ; 1 -- LAST LINE = FIRST.
90CC  8D5505              STA     NMSBF+2
90CF  AD5405              LDA     NMSBF+1
90D2  8D5605              STA     NMSBF+3
90D5              :XL010
                  ; *S*   STY     XTEMP           ; SAVE Y.
90D5  A25E                LDX     #LS-DTAB        ; 'LS'= FIRST.
90D7  A000                LDY     #0
90D9  207794              JSR     NMOVI
90DC  A260                LDX     #LEND-DTAB      ; 'LEND' = SECOND.
90DE  A002                LDY     #2
90E0  207794              JSR     NMOVI
90E3  20C893              JSR     BRACKT          ; BRACKET RANGE.
90E6  D01E ^9106          BNE     :XL900          ; FIRST > LAST.
90E8  A592                LDA     EXEC            ; EXECUTE MODE?
90EA  F01C ^9108          BEQ     :XL990          ; NO.
90EC  A213        :XL100  LDX     #BLOW-DTAB      ; ADDRESS OF NEXT LINE
90EE  A015                LDY     #BHIGH-DTAB     ; ADDRESS PAST END.
90F0  20159C              JSR     DCMPI
90F3  B00D ^9102          BCS     :XL200          ; DONE.
90F5  A013                LDY     #BLOW-DTAB
90F7  20229F              JSR     PSF             ; PRINT STORAGE FORM LINE.
90FA  A213                LDX     #BLOW-DTAB      ; ADVANCE TO NEXT LINE.
90FC  20AA9A              JSR     SNXTI
90FF  4CEC90              JMP     :XL100
9102  A900        :XL200  LDA     #0              ; SET CC FOR NORMAL EXIT.
9104  F002 ^9108          BEQ     :XL990          ; (BRA).
9106  A902        :XL900  LDA     #IMPERR         ; IMPROPER PARAMETER ERROR.
9108  08          :XL990  PHP                     ; SAVE CC.
9109  A4AB                LDY     XTEMP             ; RESTORE Y.
910B  28                  PLP                     ; RESTORE CC.
910C  60                  RTS                     ; RETURN KITH CC SET.
                  ; DEFAULTS FOR 'LIST'.
910D  0000        LSTNMS  DW      0
910F  0F27                DW      MAXLN
9111  FFFF                DW      EONMLS
9113                      PROC
                  ;
                  ; XAUTO -- AUTO-INPUT COMMAND PROCESSOR
                  ;
9113  201A91      XAUTO   JSR     XAU010          ; COMMON CODE.
9116  D04A ^9162          BNE     :XA900          ; ERROR.
9118  F030 ^914A          BEQ     :XA200
                  ; *** EXTERNAL ENTRY FOR 'APPEND' ***
911A  A969        XAU010  LDA     #LOW AUTNMS     ; ADDRESS OF DEFAULTS.
911C  85B6                STA     POINT
911E  A991                LDA     #HIGH AUTNMS
9120  85B7                STA     POINT+1
9122  206D93              JSR     MNYNMS          ; GET PARAMETERS.
9125  D022 ^9149          BNE     :XA190          ; SYNTAX ERROR.
                  ; *S*   STY     XTEMP           ; SAVE Y.
9127  8A                  TXA                     ; SET 'Z' FLAG.
9128  D00D ^9137          BNE     :XA100          ; FIRST LINE ENTERED.
                  ; DEFAULTS: NEXT LINE = LAST PROGRAM LINE + 10
912A  201294              JSR     GTLSLN          ; 'LINE NO' = LAST PROGRAM LINE + 10
912D  A27A                LDX     #ALINE-DTAB
912F  A05C                LDY     #LINENO-DTAB
9131  20459A              JSR     DMOVI
9134  4C3E91              JMP     :XA110
                  ; USE ENTERED VALUES.
9137  A27A        :XA100  LDX     #ALINE-DTAB     ; 'ALINE' = FIRST.
9139  A000                LDY     #0
913B  207794              JSR     NMOVI
913E  A27C        :XA110  LDX     #AINC-DTAB      ; 'AINC' = SECOND.
9140  A002                LDY     #2
9142  207794              JSR     NMOVI
9145  A4AB                LDY     XTEMP           ; RESTORE Y.
9147  A900                LDA     #0              ; SET CC FOR EXIT.
9149  60          :XA190  RTS
914A  A592        :XA200  LDA     EXEC            ; EXECUTE MODE?
914C  F016 ^9164          BEQ     :XA990          ; NO.
914E  8D3605              STA     AUTOIN          ; YES -- SET AUTO-INPUT MODE;
9151  A586                LDA     ACOLR2          ; SET SCREEN BACKGROUND COLOR.
9153  8DC602              STA     COLOR0+2
9156  A587                LDA     ACOLR1          ; SET SCREEN LETTER COLOR.
9158  8DC502              STA     COLOR0+1
915B  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
915D  8DCA05              STA     INDENT          ; INITIALIZE 'AUTO INDENT'.
9160  F002 ^9164          BEQ     :XA990          ; (BRA).
9162  A902        :XA900  LDA     #IMPERR
9164  08          :XA990  PHP                     ; SAVE CC.
9165  A4AB                LDY     XTEMP           ; RESTORE Y.
9167  28                  PLP                     ; RESTORE CC.
9168  60                  RTS
                  ; DEFAULTS FOR 'AUTO', 'APPEND'
9169  0000        AUTNMS  DW      0  ; (DON'T CARE)
916B  0A00                DW      10
916D  FFFF                DW      EONMLS
916F                      PROC
                  ;
                  ; XDELET -- DELETE COMMAND PROCESSOR
                  ;
916F  A90D        XDELET  LDA     #LOW LSTNMS     ; SHARE DEFAULTS.
9171  85B6                STA     POINT
9173  A991                LDA     #HIGH LSTNMS
9175  85B7                STA     POINT+1
9177  206D93              JSR     MNYNMS          ; GET PARAMETERS.
917A  D07C ^91F8          BNE     :XD900          ; SYNTAX ERROR.
917C  E001                CPX     #1              ; 0, 1, OR 2 PARAMETERS.
917E  9078 ^91F8          BCC     :XD900          ; 0 = ERROR.
9180  D00C ^918E          BNE     :XD010          ; 2.
9182  AD5305              LDA     NMSBF           ; 1 -- LAST LINE = FIRST.
9185  8D5505              STA     NMSBF+2
9188  AD5405              LDA     NMSBF+1
918B  8D5605              STA     NMSBF+3
918E              :XD010
                  ; *S*   STY     XTEMP           ; SAVE Y.
918E  A25E                LDX     #LS-DTAB        ; 'LS' = FIRST.
9190  A000                LDY     #0
9192  207794              JSR     NMOVI
9195  A260                LDX     #LEND-DTAB      ; 'LEND' = SECOND.
9197  A002                LDY     #2
9199  207794              JSR     NMOVI
919C  20C893              JSR     BRACKT          ; BRACKET RANGE.
919F  D057 ^91F8          BNE     :XD900          ; FIRST > LAST.
91A1  A592                LDA     EXEC            ; EXECUTE MODE?
91A3  F055 ^91FA          BEQ     :XD990          ; NO.
91A5  A597                LDA     BNUM            ; ANY LINES TO DELETE?
91A7  0598                ORA     BNUM+1
91A9  F049 ^91F4          BEQ     :XD600          ; NO.
                  ; WARN USER.
91AB  A99F                LDA     #DELMES         ; 'YOU ARE ABOUT TO DELETE '.
91AD  20FFB4              JSR     MESSOT
91B0  A217                LDX     #BNUM-DTAB      ; # OF LINES.
91B2  20149E              JSR     DECASC
91B5  A9A0                LDA     #DL2MES         ; 'LINES(S).<CR> ARE YOU SURE?'
91B7  20FFB4              JSR     MESSOT
91BA  A20C                LDX     #TELN-DTAB      ; USE 'TEXBUF'.
91BC  20B194              JSR     GETLIN
91BF  A58F                LDA     TELN+3          ; EMPTY?
91C1  F02C ^91EF          BEQ     :XD500          ; YES -- DO NOT CHANGE.
91C3  AD00BC              LDA     TEXBUF          ; FIRST CHARACTER.
91C6  0920                ORA     #LC             ; FORCE LOWER CASE.
91C8  C979                CMP     #'Y'+$20        ; Y?
91CA  D023 ^91EF          BNE     :XD500          ; NO -- DO NOT CHANGE.
                  ; USER AGREES.
91CC  8D4305              STA     NOCONT          ; NO CONTINUE AFTER DELETIONS.
91CF  A215                LDX     #BHIGH-DTAB     ; SIZE OF BRACKETED RANGE.
91D1  A013                LDY     #BLOW-DTAB
91D3  20429C              JSR     DSUBI
91D6  A252                LDX     #MEMA-DTAB      ; GET READY TO DELETE.
                  ; *S*   LDY     #BLOW-DTAB
91D8  20459A              JSR     DMOVI
91DB  A000                LDY     #0              ; SET BLOCK SIZE TO DELETE.
91DD  A595                LDA     BHIGH
91DF  9193                STA     (BLOW),Y
91E1  C8                  INY
91E2  A596                LDA     BHIGH+1
91E4  9193                STA     (BLOW),Y
91E6  203E9B              JSR     MDEALL          ; DELETE BLOCK.
91E9  202CB5              JSR     RDYMES
                  ;       LDA     #0              ; SET CC FOR NORMAL EXIT.
                  ;       BEQ     :XD990          ; (BRA).
91EC  4CF491              JMP     :XD600
                  ; USER DOES NOT AGREE.
91EF  A99E        :XD500  LDA     #NCHGMS         ; 'PROGRAM UNCHANGED'.
91F1  20FFB4              JSR     MESSOT
91F4  A900        :XD600  LDA     #0              ; SET CC FOR NORMAL EXIT.
91F6  F002 ^91FA          BEQ     :XD990
                  ; SYNTAX ERROR.
91F8  A902        :XD900  LDA     #IMPERR         ; IMPROPER PARAMETER ERROR.
91FA  08          :XD990  PHP                     ; SAVE CC.
91FB  A4AB                LDY     XTEMP           ; RESTORE Y.
91FD  28                  PLP                     ; RESTORE CC.
91FE  60                  RTS
91FF                      PROC
                  ;
                  ; XREN -- RENUMBER COMMAND PROCESSOR
                  ;
                  ;       STEP 1: BRACKET T HE RANGE OF LINES TO RENUMBER.
                  ;            2: COMPUTE THE NEW RANGE THEY WILL BECOME.
                  ;            3: FIND STARTING AND ENDING ADDRESSES OF THE NEW LINES.
                  ;            4: THERE ARE TWO VALID CASES FOR THE NEW LINES:
                  ;                  A. THEY ALL FIT BETWEEN TWO EXISTING LINES.
                  ;                  B. THEY ALL FIT WITHIN THE RENUMBERED RANGE.
                  ;            5: RENUMBER THE LINES IN PLACE.
                  ;            6: MOVE THEM BETWEEN TWO EXISTING LINES (IF 4A.).
                  ;
91FF  A963        XREN    LDA     #LOW RENNMS     ; ADDRESS OF DEFAULTS.
9201  85B6                STA     POINT
9203  A993                LDA     #HIGH RENNMS
9205  85B7                STA     POINT+1
9207  206D93              JSR     MNYNMS          ; GET PARAMETERS.
920A  F003 ^920F          BEQ     :XR010          ; OK.
920C  4C5E93      :XR005  JMP     :XR900          ; SYNTAX ERROR.
920F              :XR010
                  ; *S*   STY      XTEMP          ; SAVE Y.
920F  A27A                LDX     #ALINE-DTAB     ; 'ALINE' = FIRST.
9211  A000                LDY     #0
9213  207794              JSR     NMOVI
9216  A27C                LDX     #AINC-DTAB      ; 'AINC' = SECOND.
9218  A002                LDY     #2
921A  207794              JSR     NMOVI
921D  A25E                LDX     #LS-DTAB        ; 'LS' = THIRD.
921F  A004                LDY     #4
9221  207794              JSR     NMOVI
9224  A260                LDX     #LEND-DTAB      ; 'LEND' = FOURTH.
9226  A006                LDY     #6
9228  207794              JSR     NMOVI
922B  20C893              JSR     BRACKT          ; BRACKET RANGE.
922E  D0DC ^920C          BNE     :XR005          ; 'LS' > 'LEND'.
9230  A592                LDA     EXEC            ; EXECUTE M100E?
9232  D003 ^9237          BNE     :XR015          ; YES.
9234  4C5E93              JMP     :XR990          ; NO.
9237  A597        :XR015  LDA     BNUM            ; 0 LINES?
9239  0598                ORA     BNUM+1
923B  D003 ^9240          BNE     :XR020          ; NO.
923D  4C2E93              JMP     :XR500          ; YES.
9240  A219        :XR020  LDX     #RTMP-DTAB      ; 'RTMP' = # OF LINES.
9242  A017                LDY     #BNUM-DTAB
9244  20459A              JSR     DMOVI
9247  20129D              JSR     DDCRI           ; -1.
924A  A07C                LDY     #AINC-DTAB      ; INCREMENT.
924C  20549C              JSR     DMULI
924F  A07A                LDY     #ALINE-DTAB     ; # FIRST NEW LINE.
9251  20329C              JSR     DADDI           ; # LAST NEW LINE.
9254  206B94              JSR     CHKLN           ; IS LINE IN RANGE?
9257  9003 ^925C          BCC     :XR030          ; YES.
9259  4C3593              JMP     :XR600          ; NO -- OUT OF RANGE.
                  ; FIND STARTING AND ENDING ADDRESSES OF THE NEW RANGE.
925C              :XR030
                  ; *S*   LDX     #RTMP-DTAB      ; 'RTMP' = LAST NEW LINE;
925C  204294              JSR     RENFND
925F  85AC                STA     XTEMP+1         ; SAVE 'VALID' STATUS.
9261  A21B                LDX     #R2TMP-DTAB     ; 'R2TMP' = ADDRESS OF END.
9263  A04E                LDY     #PP-DTAB
9265  20459A              JSR     DMOVI
9268  A27A                LDX     #ALINE-DTAB
926A  204294              JSR     RENFND          ; 'PP' = ADDRESS OF START.
926D  05AC                ORA     XTEMP+1         ; IF EITHER IS INVALID, "OVERLAP" ERROR.
926F  F003 ^9274          BEQ     :XR040          ; OK.
9271  4C4293      :XR035  JMP     :XR700          ; OVERLAP.
                  ;
                  ; OVERLAPPING RANGES UNLESS:
                  ;       'START' OF NEW = 'END' OF NEW *OR*
                  ;       'START' OF OLD <= 'START' OF NEW *AND*
                  ;       'END' OF NEW <= 'END' OF OLD
                  ;
9274  A24E        :XR040  LDX     #PP-DTAB        ; 'START' OF NEW.
9276  A01B                LDY     #R2TMP-DTAB     ; 'END' OF NEW.
9278  20159C              JSR     DCMPI
927B  F010 ^928D          BEQ     :XR100          ; NOT OVERLAPPING.
                  ; *S*   LDX     #PP-DTAB        ; 'START' OF NEW.
927D  A013                LDY     #BLOW-DTAB      ; 'START' OF OLD.
927F  20159C              JSR     DCMPI
9282  90ED ^9271          BCC     :XR035          ; OVERLAPPING.
9284  A215                LDX     #BHIGH-DTAB     ; 'END' OF NEW.
9286  A01B                LDY     #R2TMP-DTAB     ; 'END' OF OLD.
9288  20159C              JSR     DCMPI
928B  90E4 ^9271          BCC     :XR035          ; OVERLAPPING.
                  ; RENUMBER IS VALID
928D  A219        :XR100  LDX     #RTMP-DTAB
928F  A04E                LDY     #PP-DTAB
9291  20459A              JSR     DMOVI           ; 'RTMP' = ADDRESS OF START.
                  ; RENUMBER EACH LINE IN PLACE
9294  8D4305      :XR110  STA     NOCONT
9297  A24E                LDX     #PP-DTAB        ; NO CONTINUE AFTER RENUMBER.
9299  A013                LDY     #BLOW-DTAB
929B  20459A              JSR     DMOVI
                  ; 'PP     = ADDRESS OF NEXT LINE TO RENUMBER.
                  ; 'ALINE' = NEW LINE NUMBER.
                  ; 'AINC'  = INCREMENT.
                  ; 'BNUM'  = # OF LINES LEFT TO RENUMBER.
929E  A004        :XR200  LDY     #4
92A0  A5FA                LDA     ALINE
92A2  91CE                STA     (PP),Y          ; NEW LSB (INVERTED).
92A4  88                  DEY
92A5  A5FB                LDA     ALINE+1
92A7  91CE                STA     (PP),Y          ; NEW MSB (INVERTED).
92A9  A27A                LDX     #ALINE-DTAB
92AB  A07C                LDY     #AINC-DTAB
92AD  20329C              JSR     DADDI           ; INCREMENT 'ALINE'.
92B0  A24E                LDX     #PP-DTAB
92B2  20AA9A              JSR     SNXTI           ; ADDRESS OF NEXT LINE.
92B5  A217                LDX     #BNUM-DTAB
92B7  20129D              JSR     DDCRI           ; ONE LESS LINE.
92BA  A597                LDA     BNUM            ; ANY LINES LEFT?
92BC  0598                ORA     BNUM+1
92BE  D0DE ^929E          BNE     :XR200          ; YES.
                  ; THE LINES HAVE BEEN RENUMBERED IN PLACE.
                  ; THERE ARE FOUR CASES:
                  ;    1. 'START' ADDRESS < 'END' ADDRESS -> ALREADY IN ORDER.
                  ;    2. ONE LINE MOVE, ALREADY IN ORDER (NEW = OLD).
                  ;    3. MOVE THE BLOCK TO LOWER MEMORY (NEW #'S < OLD).
                  ;    4. MOVE THE BLCCK TO HIGHER MEMORY ( NEW #'S > OLD).
92C0  A219                LDX     #RTMP-DTAB      ; 'START' ADDRESS.
92C2  A01B                LDY     #R2TMP-DTAB     ; 'END' ADDRESS.
92C4  20159C              JSR     DCMPI
92C7  D065 ^932E          BNE     :XR500          ; ALREADY IN ORDER.
                  ; MOVE ONE STATEMENT AT A TIME (TO AVOID 'NOT ENOUGH MEMORY'), USING 'TEXBUF'.
                  ; 'BLOW'  = ADDRESS OF NEXT STATEMENT TO MOVE.
                  ; 'BHIGH' = ADDRESS PAST END.
                  ; *S*   LDX     #RTMP-DTAB
92C9  A013                LDY     #BLOW-DTAB
92CB  20159C              JSR     DCMPI           ; IS 'NEW' < 'OLD'?
92CE  F05E ^932E          BEQ     :XR500          ; NEW = OLD.
92D0  A900                LDA     #0              ; SET 'NEW' < 'OLD'.
92D2  9002 ^92D6          BCC     :XR210          ; YES.
92D4  A901                LDA     #1              ; NO -- SET 'NEW' > 'OLD'.
92D6  859B        :XR210  STA     R2TMP
92D8  A000        :XR300  LDY     #0              ; GET LENGTH OF STATEMENT.
92DA  B193                LDA     (BLOW),Y
92DC  A8                  TAY
92DD  B193        :XR310  LDA     (BLOW),Y        ; MOVE NEXT RYTE TO 'TEXBUF'.
92DF  9900BC              STA     TEXBUF,Y        ; (EXTRA BYTE IS "DON'T CARE").
92E2  88                  DEY
92E3  10F8 ^92DD          BPL     :XR310
92E5  A252                LDX     #MEMA-DTAB
92E7  A013                LDY     #BLOW-DTAB
92E9  20459A              JSR     DMOVI           ; 'MEMA' = ADDRESS IN STORAGE.
92EC  203E9B              JSR     MDEALL          ; DELETE IT.
92EF  A59B                LDA     R2TMP           ; 'NEW' > 'OLD'?
92F1  D00A ^92FD          BNE     :XR320          ; YES.
                  ; 'NEW' < 'OLD'.
92F3  A213                LDX     #BLOW-DTAB
92F5  A054                LDY     #MEMB-DTAB
92F7  20329C              JSR     DADDI           ; ADJUST 'BLOW' FOR NEXT LINE.
92FA  4C0993              JMP     :XR330
                  ; 'NEW' > 'OLD'.
92FD  A219        :XR320  LDX     #RTMP-DTAB
92FF  A054                LDY     #MEMB-DTAB
9301  20429C              JSR     DSUBI           ; MOVE 'RTMP' FOR INSERTION.
9304  A215                LDX     #BHIGH-DTAB
                  ; *S*   LDY     #MEMB-DTAB
9306  20429C              JSR     DSUBI           ; ADJUST 'BHIGH' FOR NEXT LINE.
                  ; ALLOCATE A BLOCK AT 'RTMP'.
9309  A252        :XR330  LDX     #MEMA-DTAB
930B  A019                LDY     #RTMP-DTAB
930D  20459A              JSR     DMOVI
9310  20C19A              JSR     MALLOC          ; ? ALLOCATE IT (MUST BE ROOM).
9313  A4D4                LDY     MEMB            ; COPY STATEMENT FROM 'TEXBUF'.
9315  88                  DEY                     ; # - 1 OF BYTES.
9316  B900BC      :XR350  LDA     TEXBUF,Y
9319  9199                STA     (RTMP),Y
931B  88                  DEY
931C  10F8 ^9316          BPL     :XR350
                  ; STATEMENT HAS BEEN INSERTED.
931E  A219                LDX     #RTMP-DTAB
9320  A054                LDY     #MEMB-DTAB
9322  20329C              JSR     DADDI           ; ADJUST 'RTMP' FOR NEXT LINE.
                  ; ANY MORE TO MOVE?
9325  A213                LDX     #BLOW-DTAB
9327  A015                LDY     #BHIGH-DTAB
9329  20159C              JSR     DCMPI
932C  90AA ^92D8          BCC     :XR300          ; YES.
932E  202CB5      :XR500  JSR     RDYMES          ; ALL DONE.
9331  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
9333  F029 ^935E          BEQ     :XR990          ; (BRA).
                  ; ERROR -- MAXIMUM LINE NUMBER EXCEEDED.
9335  A99B        :XR600  LDA     #RENERR         ; CAN'T RENUMBER.
9337  20FFB4              JSR     MESSOT
933A  A98D                LDA     #LNOERR         ; LINE # OUT OF RANGE.
933C  20FFB4              JSR     MESSOT
933F  4C2E93              JMP     :XR500
                  ;
                  ; ERROR -- OVERLAPPING RANGE.
                  ;       'ALINE' FIRST NEW LINE.
                  ;       'RTMP'  LAST.
9342  A99B        :XR700  LDA     #RENERR         ; CAN'T RENUMBER.
9344  20FFB4              JSR     MESSOT
9347  A99C                LDA     #OVLPER         ; OVERLAPPING RANGE.
9349  20FFB4              JSR     MESSOT
934C  A27A                LDX     #ALINE-DTAB     ; FIRST NEW LINE.
934E  20149E              JSR     DECASC
9351  A99D                LDA     #TOMES          ; TO.
9353  20FFB4              JSR     MESSOT
9356  A219                LDX     #RTMP-DTAB      ; LAST NEW LINE.
9358  20149E              JSR     DECASC
935B  4C2E93              JMP     :XR500
                  ; ERROR -- SYNTAX.
935E              :XR900
                  ; EXIT.
935E  08          :XR990  PHP                     ; SAVE CC.
935F  A4AB                LDY     XTEMP           ; RESTORE Y.
9361  28                  PLP                     ; RESTORE CC.
9362  60                  RTS
                  ; DEFAULTS FOR 'RENUMBER'.
9363  0A00        RENNMS  DW      10              ; FIRST NEW.
9365  0A00                DW      10              ; INCREMENT.
9367  0000                DW      0               ; FIRST OLD.
9369  0F27                DW      MAXLN           ; LAST OLD.
936B  FFFF                DW      EONMLS
936D                      PROC
                  ;
                  ; MNYNMS -- RETURN 'MANY' NUMBERS FROM 'INLN'
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'INLN' POINTS TO THE STATEMENT LINE
                  ;       Y = CUPPENT OFFSET IN 'INLN'
                  ;       'POINT' = LIST OF VALUES FOR INITIALIZING 'NMSBF'
                  ;
                  ;       JSR MNYNMS
                  ;       BNE     SYNTAX ERROR, RANGE ERROR, OR TOO MANY NUMBERS (A=ERROR
                  ;               CODE)
                  ;
                  ;       X       = NUMBER OF NUMBERS FOUND.
                  ;       'NMSBF' = LIST OF NUMBERS
                  ;       Y       = CURRENT OFFSET IN 'INLN'
                  ;       XTEMP   = CURRENT OFFSET IN 'INLN'
                  ;
                  ;       'NMSBF' IS INITIALIZED FROM THE LIST ADDRESSED BY 'POINT'.
                  ;       'EONMLS' REPRESENTS THE END-OF-LIST.
                  ;       IF TOO MANY NUMER ARE IN THE SOURCE TEXT, AN ERROR CODE WILL BE
                  ;       RECOGNIZED.
                  ;
936D  84AB        MNYNMS  STY     XTEMP
936F  A000                LDY     #0              ; INITIALIZE 'NMSBF' FROM 'POINT'.
9371  B1B6        :MN010  LDA     (POINT),Y
9373  995305              STA     NMSBF,Y
9376  C8                  INY
9377  B1B6                LDA     (POINT),Y
9379  995305              STA     NMSBF,Y
937C  C8                  INY
937D  C9FF                CMP     #HIGH EONMLS    ; CHECK FOR END OF LIST.
937F  D0F0 ^9371          BNE     :MN010
9381  A4AB                LDY     XTEMP           ; RESTORE Y.
9383  A900                LDA     #0
9385  85B6                STA     POINT           ; INITIALIZE OFFSET TO STORE NEXT VALUE.
9387  20079F      :MN020  JSR     SKPSEP          ; SKIP LOADING SEPARATORS.
938A  206E81              JSR     ATOM            ; GET NEXT NUMBER.
938D  D032 ^93C1          BNE     :MN099          ; ERROR -- RETURN.
938F  C901                CMP     #NULL           ; CHECK FOR 'EOL'.
9391  F02E ^93C1          BEQ     :MN099          ; EOL -- DONE.
9393  C902                CMP     #NUM            ; CHECK FOR NUMBER.
9395  D028 ^93BF          BNE     :MN090          ; NO -- ERROR.
9397  84AB                STY     XTEMP           ; SAVE Y.
9399  A238                LDX     #NUMBER-DTAB    ; CHECK IF NUMBER IS IN RANGE.
939B  206B94              JSR     CHKLN
939E  B01B ^93BB          BCS     :MN080          ; NO -- OUT OF RANGE.
93A0  A6B6                LDX     POINT           ; INDEX IN 'NMSBF'.
93A2  A9FF                LDA     #$FF            ; CHECK IF TOO MANY VALUES.
93A4  DD5405              CMP     NMSBF+1,X
93A7  F016 ^93BF          BEQ     :MN090          ; YES -- TOO MANY.
93A9  A5B8                LDA     NUMBER          ; COPY TO NEXT POSITION IN 'NMSBF'.
93AB  9D5305              STA     NMSBF,X
93AE  A5B9                LDA     NUMBER+1
93B0  9D5405              STA     NMSBF+1,X
93B3  E8                  INX
93B4  E8                  INX
93B5  86B6                STX     POINT           ; UPDATE INDEX.
93B7  A4AB                LDY     XTEMP           ; RESTORE Y.
93B9  D0CC ^9387          BNE     :MN020          ; (BRA).
                  ; OUT OF RANGE
93BB  A98D        :MN080  LDA     #LNOERR
93BD  D002 ^93C1          BNE     :MN099          ; (BRA).
                  ; NEXT 'ATOM' IS NOT A NUMBER, OR TOO MANY NUMBERS.
93BF  A902        :MN090  LDA     #IMPERR         ; IMPROPER PARAMETER ERROR.
93C1  08          :MN099  PHP                     ; SAVE CC.
93C2  A5B6                LDA     POINT           ; INDEX IN 'NMSBF'.
93C4  4A                  LSR     A
93C5  AA                  TAX                     ; AS ADVERTISED.
93C6  28                  PLP
93C7  60                  RTS
93C8                      PROC
                  ;
                  ; BRACKT -- BRACKET A RANGE OF LINES
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'LS'    = START OF RANGE
                  ;       'LEND'  = END
                  ;
                  ;       JSR     BRACKT
                  ;       BNE     'LS' > 'LEND'
                  ;
                  ;       'BLOW'  = ADDRESS OF START OF RANGE
                  ;       'BHIGH' = ADDRESS OF (PAST) END OF RANGE
                  ;       'BNUM'  = # OF LINES IN THE RANGE
                  ;
                  ;       USES 'LINENO', 'POINT'
                  ;
93C8  A260        BRACKT  LDX     #LEND-DTAB      ; CHECK IF 'LS' <= 'LEND
93CA  A05E                LDY     #LS-DTAB
93CC  20159C              JSR     DCMPI
93CF  9040 ^9411          BCC     :BR090          ; ERROR -- 'LS' > 'LEND'
93D1  A900                LDA     #0              ; INITIALIZE # OF LINES.
93D3  8597                STA     BNUM
93D5  8598                STA     BNUM+1
93D7  A25E                LDX     #LS-DTAB
93D9  205D94              JSR     LNFIND
93DC  A213                LDX     #BLOW-DTAB      ; 'BLOW' = ADDRESS OF 'LS' OR SUCCESSOR.
93DE  A04E                LDY     #PP-DTAB
93E0  20459A              JSR     DMOVI
93E3  A236                LDX     #POINT-DTAB     ; USE 'POINT' FOR CURRENT LINE ADDRESS.
93E5  20459A              JSR     DMOVI
93E8              :BR010
                  ; *S*   LDX     #POINT-DTAB
93E8  20139A              JSR     SEND            ; CHECK IF END OF LIST.
93EB  F01B ^9408          BEQ     :BR050          ; YES -- DONE.
93ED  208C9F              JSR     GTLNNO          ; 'LINENO' IN L/H ORDER FROM 'POINT'.
93F0  A260                LDX     #LEND-DTAB      ; CHECK IF CURRENT LINE IS IN RANGE.
93F2  A05C                LDY     #LINENO-DTAB
93F4  20159C              JSR     DCMPI
93F7  900F ^9408          BCC     :BR050          ; NO -- NOT IN RANGE.
93F9  A901                LDA     #1              ; ONE MORE LINE IN RANGE.
93FB  A217                LDX     #BNUM-DTAB
93FD  20049D              JSR     DADDS
9400  A236                LDX     #POINT-DTAB     ; POINT TO NEXT LINE.
9402  20AA9A              JSR     SNXTI
9405  4CE893              JMP     :BR010          ; CHECK NEXT LINE.
                  ; CURRENT LINE IS NOT IN THE RANGE.
9408  A215        :BR050  LDX     #BHIGH-DTAB     ; AS ADVERTISED.
940A  A036                LDY     #POINT-DTAB
940C  20459A              JSR     DMOVI
940F  A900                LDA     #0              ; SET CC FOR EXIT.
                  ; +S*   RTS
                  ; ERROR -- 'LS' > 'LEND'
9411  60          :BR090  RTS
9412                      PROC
                  ;
                  ; GTLSLN -- GET LINE NUMBER OF LAST PROGRAM LINE + 10
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     GTLSLN
                  ;
                  ;       'LINENO' = LAST LINE NUMBER + 10 (0 IF EMPTY).
                  ;
9412  84AB        GTLSLN  STY     XTEMP           ; SAVE Y.
9414  A900                LDA     #0              ; 'EMPTY' VALUE.
9416  85DC                STA     LINENO
9418  85DD                STA     LINENO+1
941A  209F9E              JSR     STMLST          ; 'LP' = 'S1L'
941D  A23A                LDX     #LP-DTAB
941F  20139A              JSR     SEND            ; TRAP FOR PROGRAM EMPTY.
9422  F014 ^9438          BEQ     :GL090          ; EMPTY.
9424  A03A        :GL010  LDY     #LP-DTAB        ; UPDATE 'POINT'.
9426  A236                LDX     #POINT-DTAB
9428  20459A              JSR     DMOVI
942B  A23A                LDX     #LP-DTAB        ; NEXT LINE.
942D  20AA9A              JSR     SNXTI
9430  20139A              JSR     SEND
9433  D0EF ^9424          BNE     :GL010          ; KEEP CHECKING.
9435  208C9F              JSR     GTLNNO          ; 'LINENO' FROM 'POINT'.
9438  A25C        :GL090  LDX     #LINENO-DTAB    ; LAST LINE + 10
943A  A90A                LDA     #10
943C  20049D              JSR     DADDS
943F  A4AB                LDY     XTEMP           ; RESTORE Y.
9441  60                  RTS
9442                      PROC
                  ;
                  ; RENFND -- FIND LINE FOR 'RENUMBER'
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X       = DTAB OFFSET TO LINE NUMBER
                  ;       'BLOW'  = ADDRESS OF FIRST LINE TO RENUMBER
                  ;       'BHIGH' = ADDRESS PAST LAST
                  ;
                  ;       JSR     RENFND
                  ;       A       = 0 VALID
                  ;                 1 LINE OVERLAPS A NON-RENUMBERED ONE (ERROR)
                  ;
                  ;       PP = ADDRESS OF LINE (OR SUCCESSOR)
                  ;
9442  205D94      RENFND  JSR     LNFIND          ; FIND ADDRESS.
9445  D010 ^9457          BNE     :RFD80          ; NO OVERLAP.
9447  A24E                LDX     #PP-DTAB        ; >= 'BLOW'?
9449  A013                LDY     #BLOW-DTAB
944B  20159C              JSR     DCMPI
944E  900A ^945A          BCC     :RFD90          ; NO -- ERROR.
                  ; *S*   LDX     #PP-DTAB
9450  A015                LDY     #BHIGH-DTAB     ; < 'BHIGH'?
9452  20159C              JSR     DCMPI
9455  B003 ^945A          BCS     :RFD90          ; NO ERROR.
9457  A900        :RFD80  LDA     #0              ; CLEAR A FOR EXIT
9459  60                  RTS
945A  A901        :RFD90  LDA     #1              ; SET A FOR ERROR.
945C  60                  RTS
945D                      PROC
                  ;
                  ; LNFIND -- FIND LINE NUMBER
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X  = OFFSET TO DTAB LINE NUMBER
                  ;
                  ;       JSR LNFIND
                  ;       BNE NOT FOUND (PP POINTS TO SUCCESSOR)
                  ;
                  ;       PP = ADDRESS OF LINE (OR SUCCESSOR)
                  ;
                  ; USES LINENO
                  ;
945D  B580        LNFIND  LDA     DTAB,X          ; INVERT LINE NUMBER FOR SEARCH
945F  85DD                STA     LINENO+1
9461  B581                LDA     DTAB+1,X
9463  85DC                STA     LINENO
9465  20ED7A              JSR     NUMNAM          ; SETUP 'LINENO' FOR SEARCH.
9468  4C5B99              JMP     IFIND           ; FIND LINE (OP SUCCESSOR).
946B                      PROC
                  ; CHKLN -- CHECK STATEMENT LINE # FOR OUT OF RANGE.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB INDEX TO LINE NUMBER.
                  ;
                  ;       JSR     CHKLN
                  ;       BCS     OUT OF RANGE (A = ERROR CODE)
                  ;
946B  A027        CHKLN   LDY     # HIGH [MAXLN+1]
946D  A910                LDA     # LOW [MAXLN+1]
946F  200F9C              JSR     DCWCI
9472  9002 ^9476          BCC     :CL090          ; NOT OUT OF RANGE.
9474  A98D                LDA     #LNOERR
9476  60          :CL090  RTS
9477                      PROC
                  ;
                  ; NMOVI -- MOVE VALUE FROM 'NMSBF'
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB OFFSET TO DESTINATION
                  ;       Y = 'NMSBF' OFFSET
                  ;
                  ;       JSR NMOVI
                  ;
                  ;       DTAB(X) = NMSBF+Y,+Y+1
                  ;
9477  B95305      NMOVI   LDA     NMSBF,Y
947A  9580                STA     DTAB,X
947C  B95405              LDA     NMSBF+1,Y
947F  9581                STA     DTAB+1,X
9481  60                  RTS
                  ;
                  ; I/O SUBSYTEM ROUTINES
                  ;
9482                      PROC
                  ;
                  ; CHOT -- PRINT ONE CHARACTER TO "E:".
                  ;
                  ;       A = ATASCII CHARACTER
                  ;       'CDEST' = I/O ROUTINE OFFSET OR $80 + XX OR $FF
                  ;
                  ;       JSR     CHOT
                  ;
9482  86A1        CHOT    STX     TEMP            ; SAVE REGISTERS.
9484  84A2                STY     TEMP+1
9486  AE3005              LDX     CDEST           ; PREPARE TO OUTPUT TO DEVICE.
9489  300E ^9499          BMI     :CH100          ; SPECIAL OUTPUT.
948B  20B797              JSR     IOHAND
                  ; *** EXTERNAL ENTRY POINT ***
948E  C000        IOERCK  CPY     #0              ; ERROR CHECK.
9490  101A ^94AC          BPL     :CH120          ; O.K.
                  ; *** EXTERNAL ENTRY POINT ***
9492  84E4        IOE010  STY     IOSTAT          ; SAVE I/O STATUS.
9494  A986                LDA     #IOERR
9496  4C3A7A              JMP     PSTOP           ; STOP ON ERROR.
9499  E0FF        :CH100  CPX     #$FF            ; RESULT TO 'TEXBUF'?
949B  F005 ^94A2          BEQ     :CH110          ; YES.
949D  A230                LDX     #IOCB3          ; NO -- TO IOCB 3.
949F  4C6397              JMP     DIO005          ; OUTPUT CHARACTER AND RETURN
94A2  A48F        :CH110  LDY     TELN+3          ; GET INDEX.
94A4  C0FE                CPY     #TEXLNG         ; BUFFER FULL?
94A6  F004 ^94AC          BEQ     :CH120          ; YES -- STORE NO MORE.
94A8  918C                STA     (TELN),Y        ; NO -- STORE CHARACTER.
94AA  E68F                INC     TELN+3
94AC  A4A2        :CH120  LDY     TEMP+1          ; RESTORE REGISTERS.
94AE  A6A1                LDX     TEMP
94B0  60                  RTS
94B1                      PROC
                  ;
                  ; GETLIN -- GET LINE FROR "E:"
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET TO BUFFER ADDRESS.
                  ;
                  ;       JSR     GETLIN
                  ;
                  ;       DTAB(X+2) = 0 -- START INDEX.
                  ;       DTAB(X+3) = LINE LENGTH -- END INDEX.
                  ;
94B1  86A3        GETLIN  STX     TEMP+2          ; SAVE INDICES.
94B3  84A4                STY     TEMP+3
94B5  A900                LDA     #0              ; ENABLE TEXT CURSOR.
94B7  9582                STA     DTAB+2,X        ; AS ADVERTISED.
94B9  20A79F              JSR     CRSNOP          ; MAKE CURSOR SHOW NOW.
94BC  B580                LDA     DTAB,X          ; SETUP BUFFER ADDRESS.
94BE  8D4403              STA     IOCB0+ICBAL
94C1  B581                LDA     DTAB+1,X
94C3  8D4503              STA     IOCB0+ICBAH
94C6  A905                LDA     #GETR           ; GET RECORD COMMAND.
94C8  8D4203              STA     IOCB0+ICCOM
94CB  A979        :GL010  LDA     #LINLNG-1       ; SETUP MAXIMUM LINE LENGTH FOR READ.
94CD  8D4803              STA     IOCB0+ICBLL
94D0  A200                LDX     #IOCB0          ; IOCB0.
94D2  8E4903              STX     IOCB0+ICBLH     ; *S*.
94D5  2056E4              JSR     CIO             ; DO I/O.
94D8  C089                CPY     #$89            ; TRUNCATED RECORD?
94DA  D008 ^94E4          BNE     :GL020          ; NO.
94DC  A90F                LDA     #OLLERR         ; YES -- INFORM OPERATOR & TRY AGAIN
94DE  20FFB4              JSR     MESSOT
94E1  4CCB94              JMP     :GL010
94E4  98          :GL020  TYA                     ; ERROR CHECK
94E5  30AB ^9492          BMI     IOE010          ; ERROR.
94E7  20A79F              JSR     CRSNOP          ; DISABLE TEXT CURSOR (A <> 0).
94EA  A6A3                LDX     TEMP+2          ; RESTORE INDICES.
94EC  A4A4                LDY     TEMP+3
94EE  AD4803              LDA     IOCB0+ICBLL     ; SETUP END INDEX.
94F1  9583                STA     DTAB+3,X
94F3  60                  RTS
94F4                      PROC
                  ;
                  ; TXOPEN -- OPEN THE TEXT SCREEN.
                  ;
94F4  A200        TXOPEN  LDX     #0              ; RESET GRAPHICS MODE FLAG.
94F6  8E1405              STX     GRFLAG
94F9  8E5105              STX     LETTRSZ         ; SMALL LETTERS.
94FC  8E4F05              STX     TRTLON          ; VISIBLE TURTLE OFF.
94FF  200CA6              JSR     TRONOF
9502  202996              JSR     COMPRS          ; COMPRESS MEMORY.
9505  A220                LDX     #IOCB2          ; CLOSE 'S'.
9507  203F97              JSR     DCLOSE
950A  208E96              JSR     EOPEN           ; OPEN 'E'.
950D  4C5C96              JMP     EXPAND          ; EXPAND MEMORY & RETURN.
9510                      PROC
                  ;
                  ; GSOPEN -- OPEN THE GRAPHICS SCREEN
                  ;
                  ; THIS ROUTINE COMPRESSES MEMORY, OPENS THE GRAPHICS SCREEN AND DE-COMPRESSES
                  ; THE MEMORY AGAIN.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'GSMODE' = SCREEN MODE NUMBER.
                  ;       'SPLTSC' = SPLIT SCREEN OPTION SELECT.
                  ;       'FINEFG' = FINE SCROLLING FLAG.
                  ;
                  ;       JSR GSOPEN
                  ;
                  ;       'XC' & 'YC' = SCREEN CENTER.
                  ;       'S2L'&'S2H' = VAR LIMITS.
                  ;       'APPMHI'    = TOP OF VARIABLES.
                  ;       'TRTLON'    = 1 OR 0.
                  ;       'THETA'     = 0.
                  ;       'GX' & 'GY' = 0.
                  ;
9510  202996      GSOPEN  JSR     COMPRS          ; COMPRESS MEMORY.
                  ; NOW ATTEMPT TO OPEN 'S:' TO THE DESIRED SCREEN MODE; THERE MAY
                  ; ENOUGH MEMORY # HOWEVER.
9513  A220        :GO010  LDX     #IOCB2
9515  203F97              JSR     DCLOSE
9518  A953                LDA     #'S'            ; DEVICE NAME = 'S'.
951A  8D2005              STA     OPNBUF
951D  A99B                LDA     #EOL
951F  8D2105              STA     OPNBUF+1
9522  A90C                LDA     #OWRIT+OREAD    ; SCREEN OPTIONS.
9524  0D5205              ORA     SPLTSC
9527  AE3705              LDX     GSMODE          ; IF NO MODE CHANGE ...
952A  E457                CPX     DINDEX
952C  D002 ^9530          BNE     :GO012
952E  0920                ORA     #NOCLR          ; ... THEN DON'T CLEAR SCREEN.
9530  8D6A03      :GO012  STA     IOCB2+ICAUX1
9533  8E6B03              STX     IOCB2+ICAUX2
9536  A903                LDA     #OPEN           ; OPEN COMMAND.
9538  8D6203              STA     IOCB2+ICCOM
953B  A220                LDX     #IOCB2          ; OPEN DEVICE ON IOCB2.
953D  208C97              JSR     BUFPNT          ; SETUP OPEN BUFFER POINT.
9540  2056E4              JSR     CIO
9543  84E4                STY     IOSTAT          ; SAVE STATUS FOR LATER.
9545  1003 ^954A          BPL     :GO013
9547  4C1196              JMP     :GO020          ; ERROR -- DON'T PLOT POINT.
954A  CEF002      :GO013  DEC     CRSINH          ; INHIBIT THE CURSOR.
954D  AD3705              LDA     GSMODE          ; SETUP MODE DEPENDENT VARIABLES
9550  0A                  ASL     A               ; X2
9551  AA                  TAX
9552  BD16B8              LDA     XCENTR,X
9555  8D6105              STA     XC
9558  BD17B8              LDA     XCENTR+1,X
955B  8D6205              STA     XC+1
955E  BD36B8              LDA     YCENTR,X
9561  8D6305              STA     YC
9564  BD37B8              LDA     YCENTR+1,X
9567  8D6405              STA     YC+1
956A  BD56B8              LDA     COLMAX,X        ; SET 'FLOOD' LIMITS.
956D  8DAC05              STA     MAXCOL
9570  BD57B8              LDA     COLMAX+1,X
9573  8DAD05              STA     MAXCOL+1
9576  BD76B8              LDA     ROWMAX,X
9579  8DAB05              STA     MAXROW
957C  AE3705              LDX     GSMODE
957F  BD06B8              LDA     COLRS,X         ; # OF FOREGROUND COLORS.
9582  8DB905              STA     NCOLRS
9585  E003                CPX     #2+1            ; SEE IF MODES 1 OR 2.
9587  B022 ^95AB          BCS     :GO015          ; NO -- MODE 3-15
9589  BD96B8              LDA     LMRGTB,X        ; SET MARGINS FOR LARGE LETTERS.
958C  8DB505              STA     LFCOL
958F  BD99B8              LDA     RMRGTB,X
9592  8DB605              STA     RGCOL
9595  18                  CLC
9596  ADAB05              LDA     MAXROW
9599  6902                ADC     #2              ; SET 'BOTSCR' FOR 'VPOS'.
959B  8DBF02              STA     BOTSCR
959E  A900                LDA     #KOFF           ; SET TURTLE OFF.
95A0  8D4F05              STA     TRTLON
95A3  A916                LDA     #SPUTC-IOVBAS   ; ROUTE OUTPUTS TO S*.
95A5  8D3005              STA     CDEST
95A8  4C1196              JMP     :GO020          ; AVOID TURTLE SETUP.
95AB  AD6A03      :GO015  LDA     IOCB2+ICAUX1    ; WAS SCREEN CLEARED?
95AE  2920                AND     #NOCLR
95B0  F013 ^95C5          BEQ     :GO017          ; YES.
95B2  ADB905              LDA     NCOLRS          ; NO -- RE-ESTABLISH COLOR REGS.
95B5  48          :GO016  PHA
95B6  AA                  TAX
95B7  BDBB05              LDA     PNCLRS,X
95BA  20F7A4              JSR     SETCLR
95BD  68                  PLA
95BE  38                  SEC
95BF  E901                SBC     #1
95C1  10F2 ^95B5          BPL     :GO016
95C3  3016 ^95DB          BMI     :GO018          ; (BRA).
95C5  2075AF      :GO017  JSR     DFCLRS          ; SET DEFAULT COLORS FOR MODE.
95C8  A906                LDA     #EPUTC-IOVBAS   ; ROUTE OUTPUTS TO E:.
95CA  8D3005              STA     CDEST
95CD  A900                LDA     #0              ; CLEAR WALL SELECTION.
95CF  8DCD05              STA     WALLS
95D2  8DCE05              STA     WALLS+1
95D5  8D1305              STA     PEN             ; SET PEN TO ERASE & DOWN.
95D8  8D5105              STA     LETTRSZ         ; LETTER SIZE = SMALL.
95DB  A901        :GO018  LDA     #KON            ; SET TURTLE ON.
95DD  8D4F05              STA     TRTLON
95E0  20B7A3              JSR     GHOME           ; TURTLE HOME.
95E3  20CDA3              JSR     GNORTH          ; TURTLE NORTH.
95E6  AD5205              LDA     SPLTSC          ; SPLIT SCREEN MODE?
95E9  F026 ^9611          BEQ     :GO020          ; NO -- FULL SCREEN.
95EB  A9E7                LDA     # LOW GRDLI     ; SETUP PILOT'S DLI VECTOR.
95ED  8D0002              STA     VDSLST
95F0  A9B4                LDA     # HIGH GRDLI
95F2  8D0102              STA     VDSLST+1
95F5  A9C0                LDA     #$C0            ; ENABLE VBLANK 8, DLI.
95F7  8D0ED4              STA     NMIEN
95FA  AE3705              LDX     GSMODE          ; GET MODE DEPENDENT OFFSET FROM START ...
95FD  BDD0B8              LDA     DLIOFF,X        ; ... OF DISPLAY LIST TO LCC OF DLI.
9600  A8                  TAY
9601  AD3002              LDA     SDLSTL
9604  85A1                STA     TEMP
9606  AD3102              LDA     SDLSTL+1
9609  85A2                STA     TEMP+1
960B  B1A1                LDA     (TEMP),Y        ; SET THE DLI BIT.
960D  0980                ORA     #SB
960F  91A1                STA     (TEMP),Y
9611  200CA6      :GO020  JSR     TRONOF          ; ENABLE OR DISABLE VISIBLE TURTLE.
9614  205C96              JSR     EXPAND          ; EXPAND MEMORY.
9617  A4E4                LDY     IOSTAT          ; SEE IF THERE WAS AN I/O ERROR.
9619  1008 ^9623          BPL     :GO090          ; NO.
961B  A220                LDX     #IOCB2          ; YES -- CLOSE DEVICE & REPORT ERROR.
961D  203F97              JSR     DCLOSE
9620  4C9294              JMP     IOE010
9623  A901        :GO090  LDA     #1
9625  8D1405              STA     GRFLAG          ; SET GRAPHICS SCREEN FLAG.
9628  60                  RTS
9629                      PROC
                  ; FIRST COMPRESS THE RAM STORAGE, LEAVING THE FREE AREA AT THE HIGH ADDRESSES
                  ; BY REMOVING THE GAP BETWEEN THE PROGRAM STORAGE AREA AND THE STRING
                  ; STORAGE AREA.
9629  A5B0        COMPRS  LDA     S1H             ; 'MDP' = 'S1H' (DESTINATION).
962B  85D8                STA     MDP
962D  A5B1                LDA     S1H+1
962F  85D9                STA     MDP+1
9631  A5B2                LDA     S2L             ; 'MSP' = 'S2L' (SOURCE).
9633  85D6                STA     MSP
9635  A5B3                LDA     S2L+1
9637  85D7                STA     MSP+1
9639  38                  SEC                     ; 'MBC' = 'S2H' - 'S2L' (BYTE COUNT).
963A  A5B4                LDA     S2H             ; ('CETEMP' = SAME).
963C  E5B2                SBC     S2L
963E  85DA                STA     MBC
9640  8DB305              STA     CETEMP          ; (SAVE FOR LATER).
9643  A5B5                LDA     S2H+1
9645  E5B3                SBC     S2L+1
9647  85DB                STA     MBC+1
9649  8DB405              STA     CETEMP+1
964C  18                  CLC                     ; 'APPMHI' = 'S1H' + 'MBC'.
964D  A5B0                LDA     S1H
964F  65DA                ADC     MBC
9651  850E                STA     APPMHI
9653  A5B1                LDA     S1H+1
9655  65DB                ADC     MBC+1
9657  850F                STA     APPMHI+1
9659  4CA69B              JMP     MOVIA           ; MOVE STRING STORAGE DOWN & RETURN.
965C                      PROC
                  ; NOW MOVE THE STRING STORAGE AREA UP TO THE CURRENT TOP OF MEMORY SO
                  ; THAT THE FREE AREA IS ONCE AGAIN BETWEEN THE PROGRAM STORAGE AREA AND
                  ; THE STRING STORAGE AREA.
965C  ADB305      EXPAND  LDA     CETEMP          ; 'MBC' = PRIOR 'MBC' (BYTE COUNT).
965F  85DA                STA     MBC
9661  ADB405              LDA     CETEMP+1
9664  85DB                STA     MBC+1
9666  A5B0                LDA     S1H             ; 'MSP' = 'S1H' (SOURCE).
9668  85D6                STA     MSP
966A  A5B1                LDA     S1H+1
966C  85D7                STA     MSP+1
966E  38                  SEC                     ; 'MDP' = 'MEMHI' - 'MBC' (DESTINATION).
966F  ADE502              LDA     MEMHI
9672  85B4                STA     S2H             ; 'S2H' = 'MEMHI'.
9674  E5DA                SBC     MBC
9676  85D8                STA     MDP
9678  85B2                STA     S2L             ; S2L' = SAME AS NEW 'MDP'.
967A  ADE602              LDA     MEMHI+1         ; NOW AS ABOVE FOR MSB.
967D  85B5                STA     S2H+1
967F  E5DB                SBC     MBC+1
9681  85D9                STA     MDP+1
9683  85B3                STA     S2L+1
9685  A900                LDA     #0              ; ALLOWS RESET IN ANY MODE.
9687  850E                STA     APPMHI
9689  850F                STA     APPMHI+1
968B  4CCA9B              JMP     MOVDA           ; MOVE STRING STORAGE TO TOP OF MEM & RETURN.
968E                      PROC
                  ;
                  ; EOPEN -- OPEN IOCB 0 TO E:
                  ;
968E  A200        EOPEN   LDX     #IOCB0
9690  203F97              JSR     DCLOSE
9693  ADB205              LDA     FINEFG
9696  8D6E02              STA     FINE
9699  A906                LDA     #EPUTC-IOVBAS
969B  8D3005              STA     CDEST
969E  A945                LDA     #'E'
96A0  8D2005              STA     OPNBUF
96A3  A99B                LDA     #EOL
96A5  8D2105              STA     OPNBUF+1
96A8  A90C                LDA     #OREAD+OWRIT
96AA  20F496              JSR     DOPEN
96AD  A552                LDA     LMARGN
96AF  8DB505              STA     LFCOL
96B2  A553                LDA     RMARGN
96B4  8DB605              STA     RGCOL
96B7  CEF002              DEC     CRSINH
96BA  60                  RTS
96BB                      PROC
                  ;
                  ; TSTMOD -- TEST SCREEN MODE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       GRFLAG  = 0 FOR TEXT, ELSE GRAPHICS.
                  ;       SPLTSC  = 0 FOR FULL SCREEN, ELSE SPLIT.
                  ;       LETTRS  = 0 FOR SMALL, ELSE MEDIUM OR LARGE.
                  ;
                  ;       JSR     TSTMOD
                  ;
                  ;       A = 1 IF TEXT SCREEN, SMALL LETTERS.
                  ;           2 IF TEXT SCREEN, MEDIUM OR LARGE LETTERS.
                  ;           4 IF GRAPHICS SCREEN, WITH TEXT WINDOW (SPLIT).
                  ;           8 IF FULL GRAPHICS SCREEN.
96BB  AD1405      TSTMOD  LDA     GRFLAG          ; GRAPHICS MODE?
96BE  D00B ^96CB          BNE     :TM030          ; YES.
96C0  AD5105              LDA     LETTRSZ         ; NO -- CHECK FOR LETTER SIZE
96C3  D003 ^96C8          BNE     :TM020          ; NOT SMALL.
96C5  A901                LDA     #TXSL           ; SMALL.
96C7  60                  RTS
96C8  A902        :TM020  LDA     #TXML           ; MEDIUM OR LARGE.
96CA  60                  RTS
96CB  AD5205      :TM030  LDA     SPLTSC          ; SPLIT SCREEN GRAPHICS?
96CE  F003 ^96D3          BEQ     :TM040          ; NO -- FULL.
96D0  A904                LDA     #GRSS           ; YES -- SPLIT SCREEN.
96D2  60                  RTS
96D3  A908        :TM040  LDA     #GRFS           ; FULL SCREEN GRAPHICS.
96D5  60                  RTS
96D6                      PROC
                  ;
                  ; DNAME -- EXTRACT DEVICE/FILENAME
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = INDEX TO START OF NAME
                  ;
                  ;       JSR     DNAME
                  ;
                  ;       Y = INDEX TO NAME DELIMITER.
                  ;       X = 'OPNBUF' INDEX TO CHAR AFTER NAME (EOL).
                  ;       'OPNBUF' RECEIVES NAME.
                  ;
96D6  20139F      DNAME   JSR     SLB             ; SKIP LEADING BLANKS.
96D9  4CDC96              JMP     FNAME           ; NAME TO 'OPNBUF' & RETURN.
96DC                      PROC
96DC  A200        FNAME   LDX     #0
96DE  B180        :FN010  LDA     (INLN),Y
96E0  20ED9E              JSR     CHKSEP          ; SEPARATOR?
96E3  F009 ^96EE          BEQ     :FN020          ; YES -- DONE.
96E5  9D2005              STA     OPNBUF,X        ; NO -- PART OF NAME.
96E8  E8                  INX
96E9  C8                  INY
96EA  E00F                CPX     #DNSIZE         ; NAME TOO LONG?
96EC  D0F0 ^96DE          BNE     :FN010          ; NO -- KEEP SCANNING.
96EE  A99B        :FN020  LDA     #EOL            ; APPEND EOL AFTER NAME.
96F0  9D2005              STA     OPNBUF,X
96F3  60                  RTS
96F4                      PROC
                  ;
                  ; DOPEN -- DEVICE OPEN
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'IOEDIS' <> 0 INDICATES TO IGNORE I/O ERROR.
                  ;       X = IOCB INDEX.
                  ;       A = OPEN DIRECTION + AUX1 OPTIONS.
                  ;       'OPNBUF' CONTAINS DEVICE/FILENAME.
                  ;
                  ;       JSR     DOPEN
                  ;
                  ; RETURNS ONLY IF OPEN SUCCEEDED.
                  ;
96F4  48          DOPEN   PHA                     ; SAVE OPEN CODE.
96F5  203F97              JSR     DCLOSE          ; *** JUST IN CASE ***
96F8  68                  PLA                     ; RESTORE OPEN CODE.
96F9  86A1                STX     TEMP
96FB  84A2                STY     TEMP+1
96FD  0D1D05              ORA     AUX1            ; MERGE USER BYTE.
9700  9D4A03              STA     ICAUX1,X        ; SETUP OPEN DIRECTION.
9703  20B798              JSR     CHKDEV          ; CHECK FOR INVALID OPEN.
9706  AD1E05              LDA     AUX2            ; SETUP AUX2.
9709  9D4B03              STA     ICAUX2,X
970C  A900                LDA     #0
970E  9D4803              STA     ICBLL,X         ; SETUP FOR ACCUMULATOR XFER OF DATA.
9711  9D4903              STA     ICBLH,X
9714  8D1D05              STA     AUX1            ; CLEAR USER BYTES.
9717  8D1E05              STA     AUX2
971A  A903                LDA     #OPEN           ; OPEN COMMAND.
971C  9D4203              STA     ICCOM,X
971F  208C97              JSR     BUFPNT          ; SETUP OPEN BUFFER POINTER.
9722  2056E4              JSR     CIO
                  ;       JSR     COLORS          ; RE-ESTABLISH SPECIAL COLORS.
                  ;                               ; *** NEEDED ONLY IF OUTPUT TO S: OR E: ALLOWED
                  ;                               ;     IN GRAPHICS MODE ***
9725  98                  TYA                     ; CHECK STATUS.
9726  1026 ^974E          BPL     DOP010          ; O.K.
                  ; *** EXTERNAL ENTRY POINT ***
                  ;
                  ; X = IOCB INDEX.
                  ; Y = ERROR STATUS ON ENTRY.
9728  AD0405      DOP005  LDA     IOEDIS          ; ERROR STOP DISABLED?
972B  08                  PHP
972C  A99B                LDA     #EOL            ; (RETURN EOL CHAR ON ERROR).
972E  28                  PLP
972F  F008 ^9739          BEQ     :DO007          ; NO.
9731  A5FF                LDA     RUN             ; YES -- IS IT ALSO RUN MODE?
9733  08                  PHP
9734  A99B                LDA     #EOL            ; RETURN EOL ON ERROR.
9736  28                  PLP
9737  D015 ^974E          BNE     DOP010          ; YES.
9739  203F97      :DO007  JSR     DCLOSE          ; NO -- CLOSE FILE IN ERROR.
973C  4C9294              JMP     IOE010          ; ERROR -- STOP (SKIP BRANCH POINT).
973F                      PROC
                  ;
                  ; DCLOSE -- CLOSE IOCB
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = IOCB INDEX
                  ;
                  ;       JSR     DCLOSE
                  ;
                  ; NOTE: CLOSE STATUS IS OF NO IMPORTANCE TO THIS ROUTINE.
                  ;
973F  86A1        DCLOSE  STX     TEMP
9741  84A2                STY     TEMP+1
9743  A90C                LDA     #CLOSE
9745  9D4203              STA     ICCOM,X
9748  2056E4              JSR     CIO
974B  20B49F              JSR     AUDCLR          ; CLEAR AUDIO REGISTERS.
                  ; *** EXTERNAL ENTRY POINT ***
974E              DOP010
974E  A6A1        DIO010  LDX     TEMP            ; RESTORE REGISTERS.
9750  A4A2                LDY     TEMP+1
9752  60                  RTS
9753                      PROC
                  ;
                  ; DIN & DOUT -- IOCB DATA IN AND OUT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'IOEDIS' <> 0 INDICATES TO IGNORE I/O ERROR.
                  ;       X = IOCB INDEX
                  ;       A = DATA ('DOUT' ONLY)
                  ;
                  ;       JSR DIN/DOUT
                  ;
                  ;       A = DATA ('DIN' ONLY), RETURNS EOL ON ERROR.
                  ;
9753  48          DIN     PHA
9754  A907                LDA     #GETC           ; SETUP COMMAND BYTE.
9756  D003 ^975B          BNE     :IO003          ; (BRA).
9758  48          DOUT    PHA                     ; SAVE DATA BYTE.
9759  A90B                LDA     #PUTC           ; SETUP COMMAND BYTE.
975B  9D4203      :IO003  STA     ICCOM,X
975E  68                  PLA
975F  86A1                STX     TEMP            ; SAVE REGISTERS.
9761  84A2                STY     TEMP+1
                  ; *** EXTERNAL ENTRY POINT FROM 'CHOT' ***
9763  2056E4      DIO005  JSR     CIO
9766  84E4                STY     IOSTAT          ; SAVE I/O STATUS.
9768  C000                CPY     #0              ; CHECK STATUS.
976A  10E2 ^974E          BPL     DIO010          ; O.K.
976C  A99B                LDA     #EOL            ; RETURN EOL ON ERROR.
976E  C088                CPY     #$88            ; END OF FILE?
9770  D0B6 ^9728          BNE     DOP005          ; NO -- FATAL ERROR (SKIP BRANCH).
9772  F0DA ^974E          BEQ     DIO010          ; YES -- RETURN EOL (BRA).
9774                      PROC
                  ;
                  ; KIN -- KEYBOARD CHARACTER INPUT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     KIN
                  ;
                  ;       A =     ATASCII CHAR
                  ;
9774  86A1        KIN     STX     TEMP            ; SAME REGISTERS.
9776  84A2                STY     TEMP+1
9778  A224                LDX     #KGETC-IOVBAS   ; GET CHAR FROM 'K'.
977A  20B797              JSR     IOHAND
977D  4C8E94              JMP     IOERCK          ; CHECK FOR ERROR & RETURN.
9780                      PROC
                  ;
                  ; TOUT -- GRAPHICS DATA OUTPUT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = ONE GRAPHICS PIXEL
                  ;
                  ;       JSR     TOUT
                  ;
9780  86A1        TOUT    STX     TEMP            ; SAVE REGISTERS.
9782  84A2                STY     TEMP+1
9784  A216                LDX     #SPUTC-IOVBAS   ; PUT CHARACTER TO 'S:'
9786  20B797              JSR     IOHAND
9789  4C8E94              JMP     IOERCK          ; CHECK FOR ERROR & RETURN.
978C                      PROC
978C  A920        BUFPNT  LDA     # LOW OPNBUF    ; POINT TO NAME BUFFER FOR OPEN.
978E  9D4403              STA     ICBAL,X
9791  A905                LDA     # HIGH OPNBUF
9793  9D4503              STA     ICBAH,X
9796  60                  RTS
9797                      PROC
                  ;
                  ; PRTSTG -- PRINT TEXT DATA
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET TO TEXT DATA POINTER.
                  ;
                  ;       JSR     PRTSTG
                  ;
9797  84AA        PRTSTG  STY     TEMP2+3
9799  B580                LDA     DTAB,X          ; MOVE POINTER.
979B  85A7                STA     TEMP2
979D  B581                LDA     DTAB+1,X
979F  85A8                STA     TEMP2+1
97A1  B583                LDA     DTAB+3,X        ; ENDING INDEX.
97A3  85A9                STA     TEMP2+2
97A5  B482                LDY     DTAB+2,X        ; STARTING INDEX.
97A7  C4A9        :PR010  CPY     TEMP2+2         ; COMPARE START INDEX WITH END
97A9  F009 ^97B4          BEQ     :PR080          ; EQUAL -- DONE.
97AB  B1A7                LDA     (TEMP2),Y       ; GET NEXT CHARACTER.
97AD  C8                  INY
97AE  208294              JSR     CHOT            ; PRINT CHARACTER.
97B1  4CA797              JMP     :PR010
97B4  A4AA        :PR080  LDY     TEMP2+3
97B6  60                  RTS
97B7                      PROC
                  ;
                  ; IOHAND -- DIRECT I/O TO INTERFACE ROUTINE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = I/O ROUTINE OFFSET TO ADDRESS TABLE ENTRY (SYSTEM)
                  ;
                  ;       JSR     IOHAND
                  ;
                  ;       CLOBBERS Y REGISTER.
                  ;
97B7  A8          IOHAND  TAY                     ; SAVE REGISTER A.
97B8  BD01E4              LDA     IOVBAS+1,X      ; GET ADDRESS MSB.
97BB  48                  PHA
97BC  BD00E4              LDA     IOVBAS+0,X      ; GET ADDRESS USB.
97BF  48                  PHA
97C0  98                  TYA                     ; RESTORE REGISTER A.
97C1  60                  RTS                     ; (JMP) TO HANDLER.
97C2                      PROC
                  ;
                  ; SFNAME -- GET DEVICE NAME AND STORE IN 'OPNBUF'.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'EXEC = 0 FOR SCAN MODE, ELSE EXECUTE.
                  ;       'XXXX' = INPUT LINE INDEX.
                  ;       X = INDEX TO EOL IN 'OPNBUF'.
                  ;
                  ;       JSR     SFNAME
                  ;       BNE     ERROR (A = ERROR CODE).
                  ;
                  ;       'OPNBUF' = DEVICE NAME.
                  ;       Y = INPUT LINE INDEX TO FIELD AFTER DEVICE/FILENAME.
                  ;
97C2  206E81      SFNAME  JSR     ATOM            ; GET DEVICE/FILENAME
97C5  D00A ^97D1          BNE     :SF090          ; ERROR.
97C7  C920                CMP     #TEXT           ; TEXT LITERAL?
97C9  F007 ^97D2          BEQ     :SF100          ; YES.
97CB  2918                AND     #SVAR+USVAR     ; STRING NAME?
97CD  D00C ^97DB          BNE     :SF200          ; YES.
97CF  A902                LDA     #IMPERR         ; NO -- ERROR.
97D1  60          :SF090  RTS                     ; RETURN WITH CC SET.
                  ; SCAN TEXT LITERAL DATA TO EXTRACT DEVICE/FILENAME.
97D2  20DC96      :SF100  JSR     FNAME           ; NAME TO 'OPNBUF'.
97D5  8C4805              STY     XXXX            ; SAVE LINE INDEX.
97D8  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
97DA  60                  RTS                     ; RETURN WITH CC SET.
                  ; DEVICE/FILENAME IS A STRING VARIABLE VALUE
97DB  A592        :SF200  LDA     EXEC            ; EXECUTE MODE?
97DD  F0F2 ^97D1          BEQ     :SF090          ; NO -- DONE.
97DF  8C4805              STY     XXXX
97E2  A200                LDX     #0
97E4  A4C4                LDY     DP+2
97E6  C4C5        :SF220  CPY     DP+3            ; DONE?
97E8  F00B ^97F5          BEQ     :SF250          ; YES.
97EA  B1C2                LDA     (DP),Y          ; NO -- MOVE NAME.
97EC  9D2005              STA     OPNBUF,X
97EF  C8                  INY
97F0  E8                  INX
97F1  E00F                CPX     #DNSIZE         ; OVERLENGTH NAME?
97F3  D0F1 ^97E6          BNE     :SF220          ; O.K. SO FAR.
97F5  A99B        :SF250  LDA     #EOL
97F7  9D2005              STA     OPNBUF,X
97FA  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
97FC  60                  RTS                     ; RETURN WITH CC SET.
97FD                      PROC
                  ;
                  ; SCNDEV -- GET DEVICE NAME AND SETUP FOR 'READ:', 'WRITE:' OR 'CLOSE:'
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'EXEC' = 0 FOR SCAN MODE, ELSE EXECUTE.
                  ;       Y = INPUT LINE INDEX.
                  ;       A = AUX1 OPEN CODE. (0 = CLOSE, ELSE OPEN).
                  ;
97FD  85E0        SCNDEV  STA     LEND            ; SAVE DEVICE OPEN CODE.
97FF  20C297              JSR     SFNAME          ; EXTRACT FILENAME.
9802  D034 ^9838          BNE     :SC290          ; ERROR.
9804  A592                LDA     EXEC            ; EXECUTE MODE?
9806  F030 ^9838          BEQ     :SC290          ; NO -- ALL DONE.
9808  A900                LDA     #0
980A  85E4                STA     IOSTAT          ; CLEAR I/O STATUS.
980C  85C0                STA     NP+2
980E  86C1                STX     NP+3
9810  A920                LDA     # LOW OPNBUF
9812  85BE                STA     NP
9814  A905                LDA     # HIGH OPNBUF
9816  85BF                STA     NP+1
9818  20AD9E              JSR     SETSVL          ; SETUP TO ACCESS STRING VARIABLE LIST.
981B  A920                LDA     #ATRIO          ; 'I/O' ATTRIBUTE.
981D  8D6605              STA     ATRTYP
9820  20CE98              JSR     SFIND           ; SEE IF STRING EXIS:T.
9823  D014 ^9839          BNE     :SC300          ; NO.
9825  A4C4                LDY     DP+2            ; YES -- GET IOCB INDEX FROM VALUE.
9827  B1C2                LDA     (DP),Y
9829  48                  PHA
982A  A5E0                LDA     LEND              ; LOOK AT "OPEN" CODE.
982C  D003 ^9831          BNE     :SC270          ; NORMAL IN OR OUT.
982E  20EC98              JSR     SDELET          ; 'DONE' -- DELETE NAME.
9831  68          :SC270  PLA
9832  AA                  TAX
9833  AC4805              LDY     XXXX
9836  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
9838  60          :SC290  RTS                     ; RETURN WITH CC SET.
                  ; FIRST ACCESS TO DEVICE, DO IMPLICIT OPEN.
9839  20B798      :SC300  JSR     CHKDEV          ; CHECK FOR VALID DEVICE.
983C  A5E0                LDA     LEND              ; CHECK "OPEN" CODE.
983E  D006 ^9846          BNE     :SC310          ; NORMAL IN OR OUT.
9840  AC4805              LDY     XXXX            ; RESTORE INDEX.
9843  A902                LDA     #IMPERR         ; 'DONE' -- CLOSING NON-OPEN FILE.
9845  60                  RTS
9846  207098      :SC310  JSR     FNDIOB          ; FIND A FREE IOCB, IF AVAILABLE.
9849  D024 ^986F          BNE     :SC900          ; NONE AVAILABLE.
984B  A5E0                LDA     LEND              ; GET AUX1 OPEN CODE.
984D  20F496              JSR     DOPEN           ; OPEN DEVICE.
9850  86DE                STX     LS              ; SAVE IOCB # ASSOCIATED WITH DEVICE.
9852  8EF002              STX     CRSINH          ; INHIBIT CURSOR JUST IN CASE.
9855  A9DE                LDA     # LOW LS
9857  85C2                STA     DP
9859  A900                LDA     # HIGH LS
985B  85C3                STA     DP+1
985D  A900                LDA     #0
985F  85C4                STA     DP+2
9861  A901                LDA     #1
9863  85C5                STA     DP+3
9865  200599              JSR     SINSRT          ; INSERT NAMED STRING CONTAINING INFO.
9868  08                  PHP
9869  A6DE                LDX     LS
986B  AC4805              LDY     XXXX
986E  28                  PLP
986F  60          :SC900  RTS                     ; RETURN WITH CC SET.
9870                      PROC
                  ;
                  ; FNDIOB -- FIND A FREE IOCB
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     FNDIOB
                  ;       BNE     NO FREE IOCB (A = ERROR CODE)
                  ;
                  ;       X = = IOCB INDEX.
                  ;
9870  A240        FNDIOB  LDX     #IOCB4          ; START WITH IOCB #4.
9872  BD4003      :FD010  LDA     ICHID,X         ; TEST FOR CURRENTLY UNUSED.
9875  C9FF                CMP     #$FF
9877  F007 ^9880          BEQ     :FD090          ; FOUND ONE.
9879  208C98              JSR     NXTIOB          ; BUMP INDEX TO NEXT IOCB.
987C  D0F4 ^9872          BNE     :FD010          ; MORE TO CHECK.
987E  A996                LDA     #FILERR         ; NONE AVAILABLE.
9880  60          :FD090  RTS                     ; RETURN WITH CC SET.
9881                      PROC
                  ;
                  ; CLOSEM -- CLOSE IOCBS 3 THROUGH 7 (WHETHER OPEN OR NOT).
                  ;
9881  A230        CLOSEM  LDX     #IOCB3          ; START WITH IOCB #3.
9883  203F97      :CL010  JSR     DCLOSE          ; CLOSE THE IOCB.
9886  208C98              JSR     NXTIOB          ; BUMP INDEX TO NEXT IOCB.
9889  D0F8 ^9883          BNE     :CL010          ; MORE TO DO.
988B  60                  RTS
988C                      PROC
                  ;
                  ; NXTIOB -- BUMP INDEX TO NEXT IOCB.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = IOCB INDEX
                  ;
                  ;       JSR     NXTIOB
                  ;       BEQ     INDEX PAST IOCB #7
                  ;
                  ;       X = IOCB INDEX TO NEXT IOCB
                  ;
988C  8A          NXTIOB  TXA
988D  18                  CLC
988E  6910                ADC     #IOCBSZ
9890  AA                  TAX
9891  E080                CPX     #IOCB7+IOCBSZ
9893              RDV090
9893              CKD090
9893  60                  RTS                     ; RETURN WITH CC SET.
9894                      PROC
                  ;
                  ; REMDEV -- REMOVE DEVICE ASSIGNMENTS FROM STRING LIST
                  ;
9894  A252        :RD000  LDX     #MEMA-DTAB      ; REMOVE STRING VAR FROM LIST.
9896  A03A                LDY     #LP-DTAB
9898  20459A              JSR     DMOVI
989B  203E9B              JSR     MDEALL
989E  20AD9E      REMDEV  JSR     SETSVL          ; SETUP TO SCAN STRING VARIABLES ...
98A1  A23A                LDX     #LP-DTAB        ; ... TO REMOVE ALL DEVICE ASSIGNMENTS.
98A3  20139A      :RD010  JSR     SEND            ; END OF LIST?
98A6  F0EB ^9893          BEQ     RDV090          ; YES.
98A8  A23A                LDX     #LP-DTAB        ; CHECK ATTRIBUTE.
98AA  20869A              JSR     SATTR
98AD  C920                CMP     #ATRIO
98AF  F0E3 ^9894          BEQ     :RD000          ; YES -- REMOVE IT FROM LIST.
98B1  20AA9A              JSR     SNXTI           ; GO TO NEXT ITEM IN LTST.
98B4  4CA398              JMP     :RD010
98B7                      PROC
                  ; CHKDEV -- CHECK FOR VALID DEVICE
98B7  20BB96      CHKDEV  JSR     TSTMOD          ; CHECK SCREEN MODE.
98BA  C901                CMP     #TXSL           ; TEXT, SMALL LETTERS?
98BC  F0D5 ^9893          BEQ     CKD090          ; YES -- NO RESTRICTIONS.
98BE  AD2005              LDA     OPNBUF          ; CHECK FOR 'E' OR 'S'.
98C1  C945                CMP     #'E'
98C3  F004 ^98C9          BEQ     :CK010          ; INVALID -- CLOBBERS SCREEN.
98C5  C953                CMP     #'S'
98C7  D0CA ^9893          BNE     CKD090
98C9  A985        :CK010  LDA     #SCNERR
98CB  4C3A7A              JMP     PSTOP
                  ;
                  ; THIS PACKAGE HAS THREE LEVELS OF STRING HANDLING ROUTINES:
                  ;
                  ;       NAMED STRING HANDLING -- SFIND, SDELET & SINSRT
                  ;
                  ;       TEXT DATA HANDLING -- SCORP
                  ;
                  ;       IMPLEMENTATION UTILITIES -- IFIND, SEND, PSETUP, PROVE, ICOMP
                  ;                                   ILENG,  SNXTI, IMATCH & IALLOC
                  ;
                  ;
                  ; NAMED STRING HANDLING
                  ;
                  ; THESE ROUTINES USE THE FOLLOWING VARIABLES
                  ;
                  ;       NP = POINTER TO STRING NAME.
                  ;       DP = POINTER TO STRING DATA PORTION.
                  ;       LP = POINTER TO START OF LIST OF NAMED STRINGS (S1L OR S2L).
                  ;
98CE                      PROC
                  ;
                  ; SFIND -- FIND NAMED STRING IN LIST
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       LP POINTS TO START OF LIST OF NAMED STRINGS
                  ;       NP POINTS TO NAME TO FIND IN LIST
                  ;       ATRTYP  SET
                  ;
                  ;       JSR     SFIND
                  ;       BNE     NAME NOT IN LIST OR NAME IS NULL
                  ;
                  ;       DP POINTS TO DATA PORTION OF NAMED STRING FOUND IN LIST
                  ;
98CE  205B99      SFIND   JSR     IFIND           ; FIND NAME IN LIST.
98D1  D018 ^98EB          BNE     :SF080          ; NOT FOUND.
98D3  A242                LDX     #DP-DTAB        ; SET 'DP' TO POINT TO DATA PORTION.
98D5  A04E                LDY     #PP-DTAB
98D7  20459A              JSR     DMOVI
98DA  A5D1                LDA     PP+3            ; SKIP OVER NAME PORTION.
98DC  20089D              JSR     DADDP
98DF  A901                LDA     #1              ; SET START INDEX.
98E1  85C4                STA     DP+2
98E3  A000                LDY     #0              ; SET END INDEX.
98E5  18                  CLC
98E6  71C2                ADC     (DP),Y
98E8  85C5                STA     DP+3
98EA  98                  TYA                     ; SET CC FOR EXIT.
98EB  60          :SF080  RTS                     ; RETURN WITH CC SET.
98EC                      PROC
                  ;
                  ; SDELET -- DELETE NAMED STRING FROM LIST
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       NP POINTS TO STRING NAME
                  ;       LP POINTS TO START OF LIST OF NAMED STRNGS
                  ;       ATRTYP SET
                  ;
                  ;       JSR SDELET
                  ;       BNE NAMED STRING NOT FOUND OR NAME IS NULL
                  ;
98EC  205B99      SDELET  JSR     IFIND           ; FIND STRING IN LIST.
98EF  D013 ^9904          BNE     :SD090          ; NAMED STRING NOT FOUND.
                  ; * * * EXTERNAL ENTRY POINT ***
98F1  A252        SDEL2   LDX     #MEMA-DTAB      ; MEMA = PP (FOR DEALLOCATE CALL).
98F3  A04E                LDY     #PP-DTAB
98F5  20459A              JSR     DMOVI
98F8  203E9B              JSR     MDEALL          ; DELETE STRING.
98FB  A24E                LDX     #PP-DTAB        ; PP = MEMA.
98FD  A052                LDY     #MEMA-DTAB
98FF  20459A              JSR     DMOVI
9902  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
9904  60          :SD090  RTS                     ; RETURN WITH CC SET.
9905                      PROC
                  ;
                  ; SINSRT -- NAMED STRING INSERT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       NP POINTS TO STRING NAME
                  ;       DP POINTS TO STRING DATA PORTION
                  ;       LP POINTS TO START OF NAMED STRING LIST
                  ;       ATRTYP SET
                  ;       TKNTYP, TKNOFF SET IF NUMBERED STATEMENT.
                  ;
                  ;       JSR     SINSRT
                  ;       BNE     NAME IS NULL, OR NO ROOM FOR STRING IN LIST
                  ;
                  ;       ATRTYP  STORED IF 'VARIABLE'
                  ;       TKNTYP, TKNOFF  STORED IF NUMBERED STATEMENT.
                  ;
9905  205B99      SINSRT  JSR     IFIND           ; IS NAME ALREADY IN LIST?
9908  D003 ^990D          BNE     :SI020          ; NO.
990A  20F198              JSR     SDEL2           ; YES -- DELETE OLD OCCURRENCE.
990D  A900        :SI020  LDA     #0              ; CALCULATE ALLOCATION SIZE.
990F  85D4                STA     MEMB
9911  85D5                STA     MEMB+1
9913  A254                LDX     #MEMB-DTAB      ; STRING SIZE = NAME SIZE ...
9915  38                  SEC
9916  A5C1                LDA     NP+3
9918  E5C0                SBC     NP+2
991A  20089D              JSR     DADDP
991D  38                  SEC                     ; ... + DATA PORTION SIZE ...
991E  A5C5                LDA     DP+3
9920  E5C4                SBC     DP+2
9922  20089D              JSR     DADDP
9925  A906                LDA     #6              ; ... + 6 BYTES OF OVERHEAD.
                                                  ; 2 = BLOCK SIZE; 1 = NAME SIZE,
                                                  ; 1 = DATA SIZE; 2 = 'EXTRA' AT END.
9927  20089D              JSR     DADDP
992A  A252                LDX     #MEMA-DTAB      ; ALLOCATE ADDRESS FROM 'IFIND' CALL IN PP.
992C  A04E                LDY     #PP-DTAB
992E  20459A              JSR     DMOVI
9931  20C19A              JSR     MALLOC          ; ALLOCATE SPACE IN LIST.
9934  D01E ^9954          BNE     :SI090          ; NOT ENOUGH ROOM.
9936  A23E                LDX     #NP-DTAB        ; MOVE NAME TO NEW STRING ...
9938  A002                LDY     #2              ; ... STARTING AFTER ALLOCATION SIZE.
993A  20509A              JSR     SMOVI
993D  A242                LDX     #DP-DTAB        ; NOW MOVE DATA PORTION.
993F  20509A              JSR     SMOVI
                  ; 'MEMA' = ADDRESS OF 'ATTRIBUTE' DESTINATION.
                  ; Y = 0.
9942  AD6605              LDA     ATRTYP
9945  D009 ^9950          BNE     :SI060          ; 'VARIABLE' ATTRIBUTE.
9947  AD6805              LDA     TKNTYP          ; TOKENIZE LINE.
994A  91D2                STA     (MEMA),Y
994C  C8                  INY
994D  AD6A05              LDA     TKNOFF          ; OFFSET.
9950  91D2        :SI060  STA     (MEMA),Y
9952  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
9954  60          :SI090  RTS                     ; RETURN WITH CC SET.
                  ; TEXT DATA UTILITIES
                  ;
                  ; THESE ROUTINES USE THE FOLLOWING VARIABLES:
                  ;
                  ;       DP = POINTER TO TEXT DATA
                  ;       MP = POINTER TO TEXT PATTERN DATA
                  ;       AP1 = AUXILLIARY POINTER TO TEXT SUB-STRING
                  ;       AP2 = AUXILLIARY POINTER TO TEXT SUB-STRING
9955                      PROC
                  ;
                  ; SCOMP -- COMPARE TWO TEXT STRINGS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       DP POINTS TO DATA TEXT
                  ;       MP POINTS TO DATA TEXT
                  ;
                  ;       JSR     SCOMP
                  ;       BEQ     DATA TEXTS ARE IDENTICAL
                  ;       BCS     DP TEXT >= MP TEXT
                  ;       BCC     DP TEXT < MP TEXT
                  ;
                  ; NOTE: THE COMPARISON IS BASED UPON THE STANDARD ATASCII COLLATION
                  ;       SEQUENCE: WHEN ONE TEXT IS A SUBSET OF THE FIRST PART OF THE
                  ;       OTHER TEXT, THE SHORTER ONE IS CONSIDERED TO BE < THE LONGER ONE.
                  ;
9955  202D9A      SCOMP   JSR     PSETUP          ; DP TO SP, MP TO PP.
9958  4CA999              JMP     ICOMP           ; COMPARE TEXT & RETURN WITH CC SET.
                  ;
                  ; GENERAL STRING IMPLEMENTATION UTILITIES
                  ;
                  ; THESE ROUTINES USE THE FOLLOWING VARIABLES:
                  ;
                  ; SP = SOURCE TEXT POINTER
                  ; PP = PATTERN TEXT POINTER
995B                      PROC
                  ;
                  ; IFIND -- FIND NAMED STRING IN LIST
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       NP POINTS TO DESIRED NAME
                  ;       LP POINTS TO START OF NAMED STRING LIST
                  ;       ATRTYP  ATTRIBUTE
                  ;
                  ;       JSR     IFIND
                  ;       BNE     NOT FOUND  (PP POINTS TO SUCCESSOR)
                  ;
                  ;       PP POINTS TO NAMED STRING IN LIST
                  ;
                  ;       IF NOT FOUND. THE SUCCESSOR IS CHOSEN SO THAT:
                  ;
                  ;       STATEMENTS ARE KEPT IN LINE # ORDER.
                  ;       VARIABLES ARE APPENDED TO THE END OF THE LIST.
                  ;
995B  A5C0        IFIND   LDA     NP+2            ; NAME NULL?
995D  C5C1                CMP     NP+3
995F  F045 ^99A6          BEQ     :IF080          ; YES -- DONE.
9961  A24A                LDX     #SP-DTAB        ; SP = NP.
9963  A03E                LDY     #NP-DTAB
9965  203B9A              JSR     PMOVE
9968  A24E                LDX     #PP-DTAB        ; PP = LP.
996A  A03A                LDY     #LP-DTAB
996C  203B9A              JSR     PMOVE
996F              :IF020
996F  A24E                LDX     #PP-DTAB
9971  20139A              JSR     SEND            ; END OF LIST?
9974  F030 ^99A6          BEQ     :IF080          ; YES -- DONE.
9976  A903                LDA     #3              ; NO -- SETUP START INDEX ...
9978  85D0                STA     PP+2
997A  18                  CLC                     ; ... & END INDEX (TO NAME)
997B  A002                LDY     #2
997D  71CE                ADC     (PP),Y
997F  85D1                STA     PP+3
9981  20A999              JSR     ICOMP           ; NAME COMPARISON.
9984  F009 ^998F          BEQ     :IF030          ; A MATCH.
9986  B016 ^999E          BCS     :IF040          ; NOT THERE YET (IF LINE).
                                                  ; NOT A MATCH (IF VARIABLE).
9988  AD6605              LDA     ATRTYP          ; LINE INSERTION?
998B  D011 ^999E          BNE     :IF040          ; NO -- SEARCH TO END.
998D  9017 ^99A6          BCC     :IF080          ; YES -- PAST CORRECT SPOT (BRA).
                  ; CHECK IF ATTRIBUTE MATCHES.
998F  AD6605      :IF030  LDA     ATRTYP          ; ATTRIBUTE TO MATCH.
9992  F014 ^99A8          BEQ     :IF090          ; 'LINE' -- FOUND IT!
9994  A24E                LDX     #PP-DTAB        ; CHECK ATTRIBUTE.
9996  20869A              JSR     SATTR
9999  CD6605              CMP     ATRTYP
999C  F00A ^99A8          BEQ     :IF090          ; ATTRIBUTE MATCHED!
999E  A24E        :IF040  LDX     #PP-DTAB        ; SKIP TO NEXT LIST ENTRY.
99A0  20AA9A              JSR     SNXTI
99A3  4C6F99              JMP     :IF020          ; TRY AGAIN.
99A6  A9FF        :IF080  LDA     #$FF            ; SET CC FOR EXIT (NOT FOUND).
99A8  60          :IF090  RTS                     ; RETURN WITH CC SET.
99A9                      PROC
                  ;
                  ; ICOMP -- COMPARE TEXT DATA
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       SP POINTS TO DATA TEXT
                  ;       PP POINTS TO DATA TEXT
                  ;
                  ;       JSR     ICOMP
                  ;       BEQ     DATA TEXTS ARE IDENTICAL
                  ;       BCS     SP DATA >= PP DATA
                  ;       BCC     SP DATA < PP DATA
                  ;
99A9  201F9A      ICOMP   JSR     ILENG           ; SEE IF EQUAL LENGTHS.
99AC  F03C ^99EA          BEQ     IMATCH          ; YES -- COMPARE & RETURN.
99AE  B01D ^99CD          BCS     :IC050          ; PP DATA SHORTER THAN SP DATA.
99B0  A5D1                LDA     PP+3            ; SAVE STARTING VALUE.
99B2  85A7                STA     TEMP2
99B4  38                  SEC                     ; (CLEAR BORROW).
99B5  A5CD                LDA     SP+3            ; ADJUST PP DATA LENGTH FOR COMPARISON.
99B7  E5CC                SBC     SP+2
99B9  18                  CLC
99BA  65D0                ADC     PP+2
99BC  85D1                STA     PP+3
99BE  20EA99              JSR     IMATCH          ; NOW COMPARE.
99C1  08                  PHP
99C2  A5A7                LDA     TEMP2           ; RESTORE ALTERED PARAMETER.
99C4  85D1                STA     PP+3
99C6  28                  PLP
99C7  D020 ^99E9          BNE     :IC090          ; NOT EQUAL -- CC SET FOR EXIT.
99C9  A9FF                LDA     #$FF            ; SET CC FOR EXIT.
99CB  18                  CLC
99CC  60                  RTS                     ; RETURN WITH CC SET.
99CD  A5CD        :IC050  LDA     SP+3            ; SAVE STARTING VALUE.
99CF  85A7                STA     TEMP2
99D1  18                  CLC
99D2  A5CC                LDA     SP+2            ; ADJUST SP LENGTH FOR COMPARISON.
99D4  65D1                ADC     PP+3
99D6  38                  SEC
99D7  E5D0                SBC     PP+2
99D9  85CD                STA     SP+3
99DB  20EA99              JSR     IMATCH          ; NOW COMPARE.
99DE  08                  PHP
99DF  A5A7                LDA     TEMP2           ; RESTORE ALTERED PARAMETER.
99E1  85CD                STA     SP+3
99E3  28                  PLP
99E4  D003 ^99E9          BNE     :IC090          ; NOT EQUAL -- CC SET FOR EXIT.
99E6  A9FF                LDA     #$FF            ; SET CC FOR EXIT.
99E8  38                  SEC
99E9  60          :IC090  RTS                     ; RETURN WITH CC SET.
99EA                      PROC
                  ;
                  ; IMATCH -- MATCH TWO TEXT DATA STRINGS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       SP = SOURCE DATA TEXT (SOURCE DATA MUST BE LONGER THAN PATTERN)
                  ;       PP = PATTERN DATA TEXT
                  ;
                  ;       JSR     IMATCH
                  ;       BEQ     PATTERN IS CONTAINED WITHIN SOURCE
                  ;       BCS     SOURCE COLLATES >= PATTERN
                  ;       BCC     SOURCE COLLATES < PATTERN
                  ;
99EA  A5CC        IMATCH  LDA     SP+2            ; SAVE STARTING INDICES.
99EC  85A1                STA     TEMP
99EE  A5D0                LDA     PP+2
99F0  85A2                STA     TEMP+1
99F2  A4D0        :IM010  LDY     PP+2            ; SEE IF ALL OF PATTERN HAS MATCHED.
99F4  C4D1                CPY     PP+3
99F6  F010 ^9A08          BEQ     :IM090          ; YES -- ALL DONE.
99F8  A4CC                LDY     SP+2            ; NO -- COMPARE ANOTHER BYTE.
99FA  B1CA                LDA     (SP),Y
99FC  E6CC                INC     SP+2
99FE  A4D0                LDY     PP+2
9A00  D1CE                CMP     (PP),Y
9A02  D004 ^9A08          BNE     :IM090          ; NO COMPARE -- CC SET FOR EXIT.
9A04  E6D0                INC     PP+2
9A06  B0EA ^99F2          BCS     :IM010          ; (BRA).
9A08  08          :IM090  PHP                     ; SAVE CC.
9A09  A5A1                LDA     TEMP            ; RESTORE STARTING INDICES.
9A0B  85CC                STA     SP+2
9A0D  A5A2                LDA     TEMP+1
9A0F  85D0                STA     PP+2
9A11  28                  PLP                     ; RESTORE CC.
9A12              SEN090
9A12  60                  RTS                     ; RETURN WITH CC SET.
9A13                      PROC
                  ;
                  ; SEND -- CHECK FOR END OF STRING LIST
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB OFFSET TO LIST POINTER
                  ;
                  ;       JSR     SEND
                  ;       BEQ     END OF LIST REACHED
                  ;
                  ;       Y IS ALTERED
                  ;
9A13  A030        SEND    LDY     #S1H-DTAB       ; SEE IF END OF REGION #1.
9A15  20159C              JSR     DCMPI
9A18  F0F8 ^9A12          BEQ     SEN090          ; YES.
9A1A  A034                LDY     #S2H-DTAB       ; SEE IF END OF REGION #2 ...
9A1C  4C159C              JMP     DCMPI           ; ... & RETURN WITH CC SET.
9A1F                      PROC
                  ;
                  ; ILENG -- COMPARE LENGTHS OF SOURCE TEXT AND PATTERN TEXT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       SP POINTS TO SOURCE DATA TEXT
                  ;       PP POINTS TO PATTERN DATA TEXT
                  ;
                  ;       JSR     ILENG
                  ;       BEQ     DATA TEXTS ARE EQUAL LENGTH
                  ;       BCS     SOURCE TEXT >= PATTERN TEXT
                  ;       BCC     SOURCE TEXT < PATTERN TEXT
                  ;
9A1F  A5D1        ILENG   LDA     PP+3
9A21  38                  SEC
9A22  E5D0                SBC     PP+2
9A24  85A1                STA     TEMP
9A26  A5CD                LDA     SP+3
9A28  E5CC                SBC     SP+2
9A2A  E5A1                SBC     TEMP            ; CC = SP LENGTH = PP LENGTH.
9A2C  60                  RTS
9A2D                      PROC
                  ;
                  ; PSETUP -- MOVE POINTERS (DP TO SP, MP TO PP)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     PSETUP
                  ;
                  ;       SP = DP
                  ;       PP = MP
                  ;
9A2D  A24A        PSETUP  LDX     #SP-DTAB        ; SP = DP.
9A2F  A042                LDY     #DP-DTAB
9A31  203B9A              JSR     PMOVE
9A34  A24E                LDX     #PP-DTAB        ; PP = MP.
9A36  A046                LDY     #MP-DTAB
9A38  4C3B9A              JMP     PMOVE           ; AND RETURN.
9A3B                      PROC
                  ;
                  ; PMOVE -- MOVE STRING/DATA TEXT POINTERS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB OFFSET
                  ;       Y = DTAB OFFSET
                  ;
                  ;       JSR     PMOVE
                  ;
                  ;       DTAB(X) = DTAB(Y) (4 BYTE MOVE)
                  ;
9A3B  B98200      PMOVE   LDA     DTAB+2,Y
9A3E  9582                STA     DTAB+2,X
9A40  B98300              LDA     DTAB+3,Y
9A43  9583                STA     DTAB+3,X
                  ; ** EXTERNAL ENTRY POINT ***
9A45  B98000      DMOVI   LDA     DTAB,Y
9A48  9580                STA     DTAB,X
9A4A  B98100              LDA     DTAB+1,Y
9A4D  9581                STA     DTAB+1,X
9A4F  60                  RTS
      = 0000              IF      FALSE
                          PROC
                  ;
                  ; IALLOC -- ALLOCATE MEMORY
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = # OF BYTES TO ALLOCATE
                  ;
                  ;       JSR     IALLOC
                  ;       BNE     NOT ENGUGH ROOM
                  ;
                  ;       DP POINTS TO NEW ALLOCATION + 2 (START OF STRING)
                  ;
   -              IALLCC  STA     MEMB            ; SETUP MEMB = A BYTES ...
   -                      LDA     #0
   -                      STA     MEMB+1
   -                      LDA     #3              ; ... + 3
   -                      LDX     #MEMB-DTAB
   -                      JSR     DADDS
   -                      LDX     #MEMA-DTAB      ; SETUP MEMA = ALLOCATION ADDRESS.
   -                      LDY     #S2L-DTAB
   -                      JSR     DMOVI
   -                      JSR     MALLOC          ; ALLOCATE MEMORY.
   -                      BNE     :IA090          ; NOT ENOUGH ROOM.
   -                      LDX     #DP-DTAB        ; DP = ADDRESS OF STRING STORAGE AREA.
   -                      LDY     #MEMA-DTAB
   -                      JSR     DMOVI
   -                      LDA     #2
   -                      JSR     DADDS
   -                      LDA     #1              ; SET STARTING & ENDING INDICES.
   -                      STA     DP+2
   -                      STA     DP+3
   -                      LDA     #0              ; SET CC FOR EXIT.
   -              :IA090  RTS                     ; RETURN WITH CC SET.
                          ENDIF
9A50                      PROC
                  ;
                  ; SMOVI -- MOVE TEXT DATA TO MEMA (FORMING STRING)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB INDEX TO STRING POINTER
                  ;       Y = MEMA OFFSET TO START STORING
                  ;
                  ;       JSR     SMOVI
                  ;
                  ;       MEMA = LAST LOCATION STORED INTO + 1
                  ;       Y = 0
                  ;
9A50  B580        SMOVI   LDA     DTAB,X          ; MOVE SOURCE POINTER TO TEMP.
9A52  85A1                STA     TEMP
9A54  B581                LDA     DTAB+1,X
9A56  85A2                STA     TEMP+1
9A58  B582                LDA     DTAB+2,X
9A5A  85A3                STA     TEMP+2
9A5C  B583                LDA     DTAB+3,X
9A5E  85A4                STA     TEMP+3
9A60  38                  SEC                     ; CALCULATE STRING LENGTH ...
9A61  A5A4                LDA     TEMP+3
9A63  E5A3                SBC     TEMP+2
9A65  91D2        :SM010  STA     (MEMA),Y        ; ... & STORE IN TARGET AREA.
9A67  C8                  INY
9A68  84A5                STY     TEMP+4          ; SAVE INDEX.
9A6A  A4A3                LDY     TEMP+2          ; DONE?
9A6C  C4A4                CPY     TEMP+3
9A6E  F008 ^9A78          BEQ     :SM090          ; YES.
9A70  B1A1                LDA     (TEMP),Y        ; NO -- MOVE A BYTE.
9A72  E6A3                INC     TEMP+2
9A74  A4A5                LDY     TEMP+4          ; GET TARGET INDEX.
9A76  D0ED ^9A65          BNE     :SM010          ; (BRA).
9A78  A900        :SM090  LDA     #0              ; PREPARE FOR D.P. ADDITION.
9A7A  85A6                STA     TEMP+5
9A7C  A252                LDX     #MEMA-DTAB      ; PREPARE TO BUMP MEMA.
9A7E  A025                LDY     #TEMP+4-DTAB
9A80  20329C              JSR     DADDI
9A83  A000                LDY     #0              ; AS PROMISED.
9A85  60                  RTS
9A86                      PROC
                  ;
                  ; SATTR -- POINT TO ATTRIBUTE BYTE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X    = DATA OFFSET TO STRING POINTER
                  ;
                  ;       JSR SATTR
                  ;
                  ;       A    = ATTRIBUTE VALUE
                  ;       TEMP = ADDRESS OF ATTRIBUTE BYTE
                  ;       Y    = 0
                  ;
9A86  B581        SATTR   LDA     DTAB+1,X        ; MOVE POINTER TO TEMP.
9A88  85A2                STA     TEMP+1
9A8A  B580                LDA     DTAB,X
9A8C  85A1                STA     TEMP
9A8E  A000                LDY     #0              ; ADDRESS ...
9A90  18                  CLC                     ; ...+ LENGTH.
9A91  71A1                ADC     (TEMP),Y
9A93  48                  PHA                     ; LSB
9A94  C8                  INY
9A95  A5A2                LDA     TEMP+1
9A97  71A1                ADC     (TEMP),Y
9A99  85A2                STA     TEMP+1          ; MSB
9A9B  68                  PLA
9A9C  38                  SEC                     ; ... -2.
9A9D  E902                SBC     #2
9A9F  85A1                STA     TEMP
9AA1  B002 ^9AA5          BCS     :SA010
9AA3  C6A2                DEC     TEMP+1          ; (BORROW).
9AA5  A000        :SA010  LDY     #0
9AA7  B1A1                LDA     (TEMP),Y        ; AS ADVERTISED.
9AA9  60                  RTS
9AAA                      PROC
                  ;
                  ; SNXTI -- POINT TO NEXT STRING IN LIST
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DATA OFFSET TO STRING LIST POINTER
                  ;
                  ;       JSR SNXTI
                  ;
                  ;       DTAB(X) = POINTER TO NEXT STRING IN LIST
                  ;
9AAA  B581        SNXTI   LDA     DTAB+1,X        ; MOVE STRING POINTER TO TEMP.
9AAC  85A2                STA     TEMP+1
9AAE  B580                LDA     DTAB,X
9AB0  85A1                STA     TEMP
9AB2  A000                LDY     #0              ; ADD ADDRESS TO ...
9AB4  18                  CLC
9AB5  71A1                ADC     (TEMP),Y        ; ... ALLOCATION LENGTH ...
9AB7  9580                STA     DTAB,X          ; ... TO GET NEXT ADDRESS.
9AB9  C8                  INY
9ABA  A5A2                LDA     TEMP+1
9ABC  71A1                ADC     (TEMP),Y
9ABE  9581                STA     DTAB+1,X
9AC0  60                  RTS
9AC1                      PROC
                  ;
                  ; MALLOC -- MEMORY ALLOCATE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'MEMA' CONTAINS THE ADDRESS OF THE START OF ALLOCATION
                  ;          REGION #1: DATA AT START ADDRESS AND ABOVE ARE MOVED UP.
                  ;          REGION #2: DATA BELOW START ADDRESS ARE MOVED DOWN.
                  ;       'MEMB' CONTAINS THE NUMBER OF BYTES TO ALLOCATE
                  ;
                  ;       JSR     MALLOC
                  ;       BNE     NOT ENOUGH MEMORY TO SATISFY ALLOCATION
                  ;
                  ;       'MEMA' CONTAINS LOWEST ADDRESS IN THE ALLOCATED BLOCK
                  ;       FIRST TWO BYTES OF ALLOCATED BLOCK = BLOCK SIZE
                  ;
9AC1  A030        MALLOC  LDY     #S1H-DTAB       ; ACC = S1H ...
9AC3  20A29D              JSR     DLOADA
9AC6  A054                LDY     #MEMB-DTAB      ; ... + MEMB.
9AC8  20AC9D              JSR     DADDA
9ACB  A032                LDY     #S2L-DTAB       ; COMPARE ACC WITH S2L.
9ACD  20B69D              JSR     DCMPA
9AD0  B069 ^9B3B          BCS     :MA300          ; NOT ENOUGH ROOM.
9AD2  A252                LDX     #MEMA-DTAB      ; SEE IF ALLOCATION IN REGION #1 OR #2.
9AD4  A032                LDY     #S2L-DTAB
9AD6  20159C              JSR     DCMPI
9AD9  B028 ^9B03          BCS     :MA100          ; REGION M2.
                  ; ALLOCATE FROM REGION #1
9ADB  A256                LDX     #MSP-DTAB       ; MSP = MEMA.
9ADD  A052                LDY     #MEMA-DTAB
9ADF  20459A              JSR     DMOVI
9AE2  A258                LDX     #MDP-DTAB       ; MDP = MEM A ...
9AE4  20459A              JSR     DMOVI
9AE7  A054                LDY     #MEMB-DTAB      ; ... + MEMB.
9AE9  20329C              JSR     DADDI
9AEC  A25A                LDX     #MBC-DTAB       ; MBC = S1H ...
9AEE  A030                LDY     #S1H-DTAB
9AF0  20459A              JSR     DMOVI
9AF3  A052                LDY     #MEMA-DTAB      ; ... - MEMA.
9AF5  20429C              JSR     DSUBI
9AF8  A230                LDX     #S1H-DTAB       ; S1H = ACC (= S1H + MEMB).
9AFA  20A79D              JSR     DSTORA
9AFD  20CA9B              JSR     MOVDA
9B00  4C2E9B              JMP     :MA200
                  ; ALLOCATE IN REGION #2
9B03  A256        :MA100  LDX     #MSP-DTAB       ; MSP = S2L.
9B05  A032                LDY     #S2L-DTAB
9B07  20459A              JSR     DMOVI
9B0A  A25A                LDX     #MBC-DTAB       ; MBC = MEMA ...
9B0C  A052                LDY     #MEMA-DTAB
9B0E  20459A              JSR     DMOVI
9B11  A032                LDY     #S2L-DTAB       ; ... - S2L.
9B13  20429C              JSR     DSUBI
9B16  A232                LDX     #S2L-DTAB       ; S2L = S2L - MEMB.
9B18  A054                LDY     #MEMB-DTAB
9B1A  20429C              JSR     DSUBI
9B1D  A258                LDX     #MDP-DTAB       ; MDP = S2L (NEW VALUE).
9B1F  A032                LDY     #S2L-DTAB
9B21  20459A              JSR     DMOVI
9B24  A252                LDX     #MEMA-DTAB      ; MEMA = MEMA - MEMB.
9B26  A054                LDY     #MEMB-DTAB
9B28  20429C              JSR     DSUBI
9B2B  20A69B              JSR     MOVIA           ; MOVE DATA DOWNWARD.
                  ; COMMON CODE
9B2E  A000        :MA200  LDY     #0              ; MOVE BLOCK SIZE TO BLOCK.
9B30  A5D4                LDA     MEMB
9B32  91D2                STA     (MEMA),Y
9B34  C8                  INY
9B35  A5D5                LDA     MEMB+1
9B37  91D2                STA     (MEMA),Y
9B39  88                  DEY                     ; SET CC FOR NORMAL EXIT.
9B3A  60                  RTS
9B3B  A989        :MA300  LDA     #INSERR         ; SET CC FOR ERROR EXIT.
9B3D  60                  RTS
9B3E                      PROC
                  ;
                  ; MDEALL -- MEMORY DEALLOCATE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'MEMA' = ADDRESS OF BLOCK TO DEALLOCATE
                  ;       FIRST 2 BYTES OF BLOCK = SIZE OF BLOCK
                  ;
                  ;       JSR     MDEALL
                  ;
                  ;       'MEMA' = ADDRESS OF BLOCK FOLLOWING DEALLOCATED BLOCK (AFTER DEALL)
                  ;
9B3E  A000        MDEALL  LDY     #0              ; GET SIZE OF BLOCK TO MEMB.
9B40  B1D2                LDA     (MEMA),Y
9B42  85D4                STA     MEMB
9B44  C8                  INY
9B45  B1D2                LDA     (MEMA),Y
9B47  85D5                STA     MEMB+1
9B49  A252                LDX     #MEMA-DTAB      ; SEE IF IN REGION #1 OR #2.
9B4B  A032                LDY     #S2L-DTAB
9B4D  20159C              JSR     DCMPI
9B50  B029 ^9B7B          BCS     :MD100          ; REGION #2.
                  ; DEALLOCATE FROM REGION #1.
9B52  A256                LDX     #MSP-DTAB       ; MSP = MEMA ...
9B54  A052                LDY     #MEMA-DTAB
9B56  20459A              JSR     DMOVI
9B59  A054                LDY     #MEMB-DTAB      ; ... + MEMB.
9B5B  20329C              JSR     DADDI
9B5E  A25A                LDX     #MBC-DTAB       ; MBC = S1H ...
9B60  A030                LDY     #S1H-DTAB
9B62  20459A              JSR     DMOVI
9B65  A056                LDY     #MSP-DTAB       ; ... - MSP.
9B67  20429C              JSR     DSUBI
9B6A  A230                LDX     #S1H-DTAB       ; S1H = S1H - MEMB.
9B6C  A054                LDY     #MEMB-DTAB
9B6E  20429C              JSR     DSUBI
9B71  A258                LDX     #MDP-DTAB       ; MDP = MEMA.
9B73  A052                LDY     #MEMA-DTAB
9B75  20459A              JSR     DMOVI
9B78  4CA69B              JMP     MOVIA           ; MOVE DATA DOWNWARD & RETURN.
                  ; DEALLOCATE MEMORY IN REGION #2
9B7B  A256        :MD100  LDX     #MSP-DTAB       ; MSP = S2L.
9B7D  A032                LDY     #S2L-DTAB
9B7F  20459A              JSR     DMOVI
9B82  A25A                LDX     #MBC-DTAB       ; MBC = MEMA ...
9B84  A052                LDY     #MEMA-DTAB
9B86  20459A              JSR     DMOVI
9B89  A032                LDY     #S2L-DTAB       ; ... - S2L.
9B8B  20429C              JSR     DSUBI
9B8E  A232                LDX     #S2L-DTAB       ; S2L = S2L + MEMB.
9B90  A054                LDY     #MEMB-DTAB
9B92  20329C              JSR     DADDI
9B95  A258                LDX     #MDP-DTAB       ; MDP = S2L (NEW VALUE).
9B97  A032                LDY     #S2L-DTAB
9B99  20459A              JSR     DMOVI
9B9C  A252                LDX     #MEMA-DTAB      ; MEMA = MEMA + MEMB.
9B9E  A054                LDY     #MEMB-DTAB
9BA0  20329C              JSR     DADDI
9BA3  4CCA9B              JMP     MOVDA           ; MOVE DATA UPWARD & RETURN
                  ;
                  ; MOVE UTILITIES FOR MEMORY MANAGEMENT
                  ;
                  ; MOVE BLOCKS OF DATA WITH EITHER INCREASING OR DECREASING ADDRESS
                  ;
                  ; THREE VARIABLES CONTROL THE MOVE ROUTINES?
                  ;
                  ; 'MSP' CONTAINS POINTER TO SOURCE DATA LOCATION
                  ; 'MDP' CONTAINS POINTER TO DESTINATION DATA LOCATION
                  ; 'MBC' CONTAINS THE NUMBER OF BYTES TO MOVE
                  ;
9BA6                      PROC
                  ;
                  ; MOVIA -- MOVE DATA BLOCK WITH INCREASING ADDRESS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'MSP', 'MDP' & 'MBC' SETUP
                  ;
                  ;       JSR     MOVIA
                  ;
9BA6  A5DA        MOVIA   LDA     MBC             ; SEE IF BYTE COUNT = ZERO.
9BA8  AA                  TAX                     ; SAVE LSB OF BYTE COUNT.
9BA9  05DB                ORA     MBC+1
9BAB  F01C ^9BC9          BEQ     :MI090          ; ZERO -- NOTHING TO DO.
9BAD  A000                LDY     #0              ; INDEX TO DATA BLOCK.
9BAF  B1D6        :MI010  LDA     (MSP),Y         ; MOVE DATA.
9BB1  91D8                STA     (MDP),Y
9BB3  C8                  INY                     ; BUMP INDEX.
9BB4  D004 ^9BBA          BNE     :MI020          ; NO PAGE WRAP.
9BB6  E6D7                INC     MSP+1           ; PAGE WRAP -- BUMP POINTER VARIABLES.
9BB8  E6D9                INC     MDP+1
9BBA  CA          :MI020  DEX                     ; DONE?
9BBB  D004 ^9BC1          BNE     :MI030          ; NO.
9BBD  A5DB                LDA     MBC+1           ; NOT SURE -- CHECK FURTHER.
9BBF  F008 ^9BC9          BEQ     :MI090          ; YES -- DONE.
9BC1  E0FF        :MI030  CPX     #$FF            ; MAINTAIN D.P. BYTE COUNT.
9BC3  D0EA ^9BAF          BNE     :MI010
9BC5  C6DB                DEC     MBC+1           ; BORROW FROM MSB.
9BC7  B0E6 ^9BAF          BCS     :MI010          ; (BRA).
9BC9  60          :MI090  RTS
9BCA                      PROC
                  ;
                  ; MOVDA -- MOVE DATA BLOCK WITH DECREASING ADDRESS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'MSP', 'MDP' & 'MBC' SETUP
                  ;
                  ;       JSR     MOVDA
                  ;
9BCA  A5DA        MOVDA   LDA     MBC             ; SETUP BYTE COUNT ...
9BCC  AA                  TAX
9BCD  A8                  TAY                     ; ... AND DATA INDEX.
9BCE  05DB                ORA     MBC+1           ; TEST FOR ZERO BYTE COUNT.
9BD0  F024 ^9BF6          BEQ     :MD090          ; ZERO -- NOTHING TO DO.
9BD2  18                  CLC                     ; ADJUST POINTERS FOR START.
9BD3  A5D7                LDA     MSP+1
9BD5  65DB                ADC     MBC+1
9BD7  85D7                STA     MSP+1
9BD9  18                  CLC
9BDA  A5D9                LDA     MDP+1
9BDC  65DB                ADC     MBC+1
9BDE  85D9                STA     MDP+1
9BE0  88          :MD010  DEY                     ; DECREMENT INDEX.
9BE1  C0FF                CPY     #$FF            ; WRAP?
9BE3  D006 ^9BEB          BNE     :MD020          ; NO.
9BE5  C6DB                DEC     MBC+1           ; YES -- DECREMENT ALL POINTERS (MSB)
9BE7  C6D7                DEC     MSP+1
9BE9  C6D9                DEC     MDP+1
9BEB  B1D6        :MD020  LDA     (MSP),Y         ; MOVE A DATA BYTE.
9BED  91D8                STA     (MDP),Y
9BEF  CA                  DEX                     ; DONE?
9BF0  D0EE ^9BE0          BNE     :MD010          ; NO -- CONTINUE.
9BF2  A5DB                LDA     MBC+1           ; NOT SURE -- CHECK FURTHER.
9BF4  D0EA ^9BE0          BNE     :MD010          ; NO -- CONTINUE.
9BF6  60          :MD090  RTS                     ; YES -- RETURN.
9BF7                      PROC
                  ;
                  ; MVINLN -- MOVE PART OF 'INLN' TO A FIXED ADDRESS BUFFER
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = CURRENT INDEX IN 'INLN'
                  ;
                  ;       JSR :MINLN
                  ;
                  ;       'INLNBF' CONTAINS Y/Y+'INBFSZ'-1 CHARACTERS FROM 'INLN'
                  ;       LOWER CASE IS CONVERTED TO UPPER CASE.
                  ;       Y IS NOT PRESERVED.
                  ;
9BF7  A200        MVINLN  LDX     #0
9BF9  B180        :MVN10  LDA     (INLN),Y
9BFB  C961                CMP     #'A'+$20        ; LC?
9BFD  9006 ^9C05          BCC     :MVN20          ; NO.
9BFF  C97B                CMP     #'Z'+1+$20
9C01  B002 ^9C05          BCS     :MVN20          ; NO.
9C03  29DF                AND     #UC             ; YES
9C05  9D3805      :MVN20  STA     INLNBF,X
9C08  C8                  INY
9C09  E8                  INX
9C0A  E00A                CPX     #INBFSZ
9C0C  90EB ^9BF9          BCC     :MVN10
9C0E  60                  RTS
                  ; DOUBLE PRECISION ROUTINES
                  ;
                  ; ALL VARIABLES ARE ACCESSED VIA THEIR OFFSET FROM SYMBOL 'DTAB'.
                  ; NORMALLY THE X AND/OR Y REGISTERS CONTAIN THE 'DTAB' OFFSET
                  ; VALUES TO THE VARIABLE(S) TO BE DEALT WITH.
                  ;
9C0F                      PROC
                  ;
                  ; DCWCI -- DOUBLE BYTE UNSIGNED COMPARE WITH CONSTANT.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB OFFSET TO VARIABLE.
                  ;       Y = MSB OF CONSTANT.
                  ;       A = LSB OF CONSTANT.
                  ;
                  ;       JSR     DCWCI           ; UNSIGNED COMPARE.
                  ;
                  ;       CC = DTAB(X) : Y,A
                  ;
9C0F  85A7        DCWCI   STA     TEMP2           ; SAVE LSB.
9C11  84A8                STY     TEMP2+1         ; SAVE MSB.
9C13  A027                LDY     #TEMP2-DTAB
                  ; *S*   JMP     DCMPI           ; COMPARE & RETURN.
9C15                      PROC
                  ;
                  ; DCMPI -- DOUBLE BYTE UNSIGNED COMPARE INDEXED
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DATA #1 OFFSET
                  ;       Y = DATA #2 OFFSET
                  ;
                  ;       JSR     DCMPI
                  ;       BEQ     DTAB(X) = DTAB(Y)
                  ;       BCS     BTAB(X) >= DTAB(Y)
                  ;       BCC     DTAB(X) < DTAB(Y)
                  ;
                  ; CC = DTAB(X) : DTAB(Y) (UNSIGNED)
                  ;
9C15  B581        DCMPI   LDA     DTAB+1,X        ; COMPARE MSBS.
9C17  D98100              CMP     DTAB+1,Y
9C1A  D005 ^9C21          BNE     :DC090          ; NOT EQUAL -- ALL DONE.
                  ; *** EXTERNAL ENTRY POINT **
9C1C  B580        DCM010  LDA     DTAB,X          ; EQUAL -- COMPARE LSBS.
9C1E  D98000              CMP     DTAB,Y
9C21  60          :DC090  RTS
9C22                      PROC
                  ;
                  ; DSCMI -- DOUBLE BYTE SIGNED COMPARE INDEXED
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DATA #1 OFFSET
                  ;       Y = DATA #2 OFFSET
                  ;
                  ;       JSR     DSCMI
                  ;       BEQ     DTAB(X) = DTAB(Y)
                  ;       BCS     DTAB(X) >= DTAB(Y)
                  ;       BCC     DTAB(X) < DTAB(Y)
                  ;
9C22  B98100      DSCMI   LDA     DTAB+1,Y        ; COMPARE MSBS FIRST.
9C25  4980                EOR     #$80
9C27  85A1                STA     TEMP
9C29  B581                LDA     DTAB+1,X
9C2B  4980                EOR     #$80
9C2D  C5A1                CMP     TEMP
9C2F  F0EB ^9C1C          BEQ     DCM010          ; EQUAL -- COMPARE LSBS.
9C31  60                  RTS                     ; NOT EQUAL -- ALL DONE.
                  ;
                  ; DMOVI -- DOUBLE BYTE MOVE INDEXED
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DESTINATION OFFSET
                  ;       Y = SOURCE OFFSET
                  ;
                  ;       JSR     DMOVI
                  ;
                  ;       DTAB(X) = DTAB(Y)
                  ;
                  ; *** SEE 'PMOVE' FOR THE 'DMOVI' CODE ***
9C32                      PROC
                  ;
                  ; DADDI -- DOUBLE PRECISION ADD
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET TO
                  ;       Y = OFFSET TO
                  ;
                  ;       JSR     DADDI
                  ;       BVS     OVERFLOW
                  ;
                  ;       DTAB(X) = DTAB(X) + DTAB(Y)
                  ;
9C32  18          DADDI   CLC
9C33  B580        DADDIX  LDA     DTAB,X
9C35  798000              ADC     DTAB,Y
9C38  9580                STA     DTAB,X
9C3A  B581                LDA     DTAB+1,X
9C3C  798100              ADC     DTAB+1,Y
9C3F  9581                STA     DTAB+1,X
9C41  60                  RTS
9C42                      PROC
                  ;
                  ; DSUBI -- DOUBLE PRECISION SUBTRACT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;       Y = OFFSET
                  ;
                  ;       JSR     DSUBI
                  ;       BVS     OVERFLOW
                  ;       BEQ     RESULT = 0
                  ;
                  ;       DTAB(X) = DTAB(X) - DTAB(Y)
                  ;
9C42  38          DSUBI   SEC
9C43  B580        DSUBIX  LDA     DTAB,X
9C45  F98000              SBC     DTAB,Y
9C48  9580                STA     DTAB,X
9C4A  B581                LDA     DTAB+1,X
9C4C  F98100              SBC     DTAB+1,Y
9C4F  9581                STA     DTAB+1,X
9C51  1580                ORA     DTAB,X          ; SET CC FOR ZERO TEST.
9C53  60                  RTS
9C54                      PROC
                  ;
                  ; DMULI -- DOUBLE PRECISION MULTIPLY
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;       X = OFFSET
                  ;
                  ;       JSR     DMULI
                  ;
                  ;       DTAB(X) = DTAB(X) * DTAB(Y)
                  ;
9C54  A910        DMULI   LDA     #16             ; SETUP LOOP COUNTER.
9C56  85A3                STA     TEMP+2
9C58  A900                LDA     #0              ; INITIALIZE TEMP ACCUMULATOR.
9C5A  85A1                STA     TEMP
9C5C  85A2                STA     TEMP+1
9C5E  1680        :DM010  ASL     DTAB,X          ; DOUBLE PRECISION SHIFT LEFT.
9C60  3681                ROL     DTAB+1,X
9C62  900F ^9C73          BCC     :DM020          ; NO BIT PRESENT.
9C64  18                  CLC                     ; BIT SET -- ADD TO PARTIAL.
9C65  A5A1                LDA     TEMP
9C67  798000              ADC     DTAB,Y
9C6A  85A1                STA     TEMP
9C6C  A5A2                LDA     TEMP+1
9C6E  798100              ADC     DTAB+1,Y
9C71  85A2                STA     TEMP+1
9C73  C6A3        :DM020  DEC     TEMP+2          ; DONE?
9C75  F007 ^9C7E          BEQ     :DM090          ; YES -- RESULT IS IN 'TEMP'.
9C77  06A1                ASL     TEMP            ; NO -- DOUBLE PRECISION SHIFT LEFT.
9C79  26A2                ROL     TEMP+1
9C7B  4C5E9C              JMP     :DM010
9C7E  A5A1        :DM090  LDA     TEMP            ; DONE -- MOVE RESULT.
9C80  9580                STA     DTAB,X
9C82  A5A2                LDA     TEMP+1
9C84  9581                STA     DTAB+1,X
9C86  60                  RTS
9C87                      PROC
                  ;
                  ; DDIVI -- DOUBLE PRECISION DIVIDE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET TO DIVIDEND
                  ;       Y = OFFSET TO DIVISOR
                  ;
                  ;       JSR     DDIVI
                  ;
                  ;       DTAB(X) = DTAB(X) / DTAB(Y) (SIGNED)
                  ;       'TEMP' = REMAINDER (SIGN MAY BE WRONG!!!)
                  ;
9C87  B98000      DDIVI   LDA     DTAB,Y          ; CHECK FOR DIVIDE BY ZERO.
9C8A  198100              ORA     DTAB+1,Y
9C8D  D005 ^9C94          BNE     :DD003          ; NO -- O.K.
9C8F  A984                LDA     #DIVERR         ; ERROR.
9C91  4C3A7A              JMP     PSTOP
9C94  A911        :DD003  LDA     #16+1           ; SETUP LOOP COUNTFR.
9C96  85A3                STA     TEMP+2
9C98  86A4                STX     TEMP+3          ; SAVE INDEX TO DIVIDEND.
9C9A  A900                LDA     #0              ; INITIALIZE REMAINDER.
9C9C  85A1                STA     TEMP
9C9E  85A2                STA     TEMP+1
9CA0  B98100              LDA     DTAB+1,Y        ; SEE IF DIVISOR IS NEGATIVE.
9CA3  85A6                STA     TEMP+5
9CA5  1006 ^9CAD          BPL     :DD006          ; NO.
9CA7  20F19C              JSR     DNEGI           ; YES -- NEGATE DIVIDEND ...
9CAA  20DD9C              JSR     :DD093          ; ... & DIVISOR (*** CRAZY CALL ***).
9CAD  B581        :DD006  LDA     DTAB+1,X        ; SEE IF DIVIDEND IS NEGATIVE.
9CAF  85A5                STA     TEMP+4
9CB1  1003 ^9CB6          BPL     :DD008          ; NO.
9CB3  20F19C              JSR     DNEGI           ; YES -- NEGATE IT NOW (& THEN AGAIN LATER).
9CB6  18          :DD008  CLC
9CB7  A6A4        :DD010  LDX     TEMP+3          ; GET INDEX TO DIVIDEND.
9CB9  3680                ROL     DTAB,X          ; DOUBLE PRECISION ROTATE.
9CBB  3681                ROL     DTAB+1,X
9CBD  C6A3                DEC     TEMP+2          ; DONE?
9CBF  F011 ^9CD2          BEQ     :DD090          ; YES.
9CC1  26A1                ROL     TEMP            ; NO.
9CC3  26A2                ROL     TEMP+1
9CC5  A221                LDX     #TEMP-DTAB      ; IS REMAINDER < DIVISOR?
9CC7  20159C              JSR     DCMPI
9CCA  90EB ^9CB7          BCC     :DD010          ; YES.
9CCC  20429C              JSR     DSUBI           ; NO.
9CCF  38                  SEC
9CD0  B0E5 ^9CB7          BCS     :DD010          ; (BRA).
9CD2  A5A5        :DD090  LDA     TEMP+4          ; SEE IF RESULT IS TO BE NEGATED.
9CD4  1003 ^9CD9          BPL     :DD092          ; NO.
9CD6  20F19C              JSR     DNEGI           ; YES -- NEGATE POSITIVE RESULT.
9CD9  A5A6        :DD092  LDA     TEMP+5          ; WAS DIVISOR NEGATED EARLIER.
9CDB  1007 ^9CE4          BPL     :DD095          ; NO.
9CDD  98          :DD093  TYA                     ; YES -- NEGATF IT BACK TO ORIGINAL SIGN.
9CDE  AA                  TAX
9CDF  20F19C              JSR     DNEGI
9CE2  A6A4                LDX     TEMP+3          ; RESTORE INDEX.
9CE4  60          :DD095  RTS
9CE5                      PROC
                  ;
                  ; DMODI -- MODULO OF SORTS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET TO DIVIDEND
                  ;       Y = OFFSET OT DIVISOR
                  ;
                  ;       JSR     DMODI
                  ;
                  ;       DTAB(X) = DTAB(X) MOD DTAB(Y)
                  ;
9CE5  20879C      DMODI   JSR     DDIVI           ; FIRST DO DIVISION.
9CE8  A5A1                LDA     TEMP            ; TAKE ADVANTAGE OF SIDE EFFECT.
9CEA  9580                STA     DTAB,X
9CEC  A5A2                LDA     TEMP+1
9CEE  9581                STA     DTAB+1,X
9CF0  60                  RTS
9CF1                      PROC
                  ;
                  ; DNEGI -- DOUBLE PRECISION NEGATE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET TO NUMBER
                  ;
                  ;       JSR     DNEGI
                  ;
                  ;       DTAB(X) = -DTAB(X)
                  ;
9CF1  38          DNEGI   SEC                     ; (CLEAR BORROW).
9CF2  A900                LDA     #0
9CF4  F580                SBC     DTAB,X
9CF6  9580                STA     DTAB,X
9CF8  A900                LDA     #0
9CFA  F581                SBC     DTAB+1,X
9CFC  9581                STA     DTAB+1,X
9CFE  60                  RTS
9CFF                      PROC
                  ;
                  ; DABSI -- DOUBLE PRECISION ABS FUNCTION
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ; X = OFFSET TO NUMBER
                  ;
                  ; JSR DABSI
                  ;
                  ; DTAB(X) = ABS (DTAB(X))
                  ;
9CFF  B581        DABSI   LDA     DTAB+1,X        ; CHECK SIGN OF MSB.
9D01  30EE ^9CF1          BMI     DNEGI
9D03  60                  RTS
9D04                      PROC
                  ;
                  ; DADDS -- ADD A REGISTER TO DOUBLE BYTE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = SIGNED BINARY NUMBER (-126 TO 127)
                  ;       X = DTAB OFFSET TO DP NUMBER
                  ;
                  ;       JSR     DADDS
                  ;
                  ;       DTAB(X) = DTAB(X) + A
                  ;
9D04  C900        DADDS   CMP     #0              ; SEE IF POSITIVE OR NEGATIVE.
9D06  300C ^9D14          BMI     :DA030          ; NEGATIVE.
                  ; *** EXTERNAL ENTRY POINT ***
9D08  18          DADDP   CLC                     ; POSITIVE -- ADD.
9D09  7580                ADC     DTAB,X
9D0B  9580                STA     DTAB,X
9D0D  9002 ^9D11          BCC     :DA010          ; NO CARRY.
9D0F  F681                INC     DTAB+1,X        ; CARRY -- ADD TO MSB.
9D11  60          :DA010  RTS
                  ; *** EXTERNAL ENTRY FOINT ***
9D12  A9FF        DDCRI   LDA     #-1
9D14  18          :DA030  CLC
9D15  7580                ADC     DTAB,X
9D17  9580                STA     DTAB,X
9D19  B002 ^9D1D          BCS     :DA040          ; NO BORROW.
9D1B  D681                DEC     DTAB+1,X        ; BORROW -- SUB FROM MSB
9D1D  60          :DA040  RTS
9D1E                      PROC
                  ; RELATIONAL TESTS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DATA #1 OFFSET
                  ;       Y = DATA #2 OFFSET
                  ;
                  ;       JSR     DXXTI           ONE OF SIX ROUTINES
                  ;
                  ;       DTAB(X) = 1 IF RELATION TRUE, 0 IF FALSE
9D1E  20159C      DEQTI   JSR     DCMPI           ; UNSIGNED COMPARE (FASTER THAN SIGNED).
9D21  F027 ^9D4A          BEQ     DTRUE           ; EQUAL RESULTS IN TRUE.
9D23  D029 ^9D4E          BNE     DFALSE          ; UNEQUAL RESULTS IN FALSE.
9D25  20159C      DNETI   JSR     DCMPI           ; UNSIGNED COMPARE (FASTER THAN SIGNED).
9D28  D020 ^9D4A          BNE     DTRUE           ; UNEQUAL RESULTS IN TPUE.
9D2A  F022 ^9D4E          BEQ     DFALSE          ; EQUAL RESULTS IN FALSE.
9D2C  20229C      DGTTI   JSR     DSCMI           ; SIGNED COMPARE.
9D2F  F01D ^9D4E          BEQ     DFALSE          ; EQUAL RESULTS IN FALSE.
9D31  901B ^9D4E          BCC     DFALSE          ; LESS THAN RESULTS IN FALSE.
9D33  B015 ^9D4A          BCS     DTRUE           ; GREATER THAN RESULTS IN TRUE.
9D35  20229C      DLTTI   JSR     DSCMI           ; SIGNED COMPARE.
9D38  9010 ^9D4A          BCC     DTRUE           ; LESS THAN RESULTS IN TPUE.
9D3A  B012 ^9D4E          BCS     DFALSE          ; GREATER THAN OR EQUAL PESULTS IN FALSE
9D3C  20229C      DGETI   JSR     DSCMI           ; SIGNED COMPARE.
9D3F  B009 ^9D4A          BCS     DTRUE           ; GREATER THAN OR EQUAL RESULTS IN TRUE.
9D41  900B ^9D4E          BCC     DFALSE          ; LESS THAN RESULTS IN FALSE.
9D43  20229C      DLETI   JSR     DSCMI           ; SIGNED COMPARE.
9D46  F002 ^9D4A          BEQ     DTRUE           ; EQUAL RESULTS IN TRUE.
9D48  B004 ^9D4E          BCS     DFALSE          ; GREATER THAN RESULTS IN FALSE.
                  ; *S*   BCC     DTRUE           ; LESS THAN RESULTS IN TPUE.
9D4A  A901        DTRUE   LDA     #1              ;"TRUE" ...
9D4C  D002 ^9D50          BNE     DFA010          ; ... TO VARIABLE.
9D4E  A900        DFALSE  LDA     #0              ; "FALSE" ...
9D50  9580        DFA010  STA     DTAB,X          ; ... TO VARIABLE.
9D52  A900                LDA     #0
9D54  9581                STA     DTAB+1,X
9D56  60                  RTS
9D57                      PROC
      = 0000              IF      LOGGRP
                  ;
                  ; DLANDI -- DOUBLE PRECISION LOGICAL AND
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;       Y = OFFSET
                  ;
                  ;       JSR     DLAND
                  ;
                  ;       DTAB(X) = DTAB(X) LOGICAL AND DTAB(Y)
                  ;
   -              DLANDI  JSR     DTXP            ; IS DTAB(X) FALSE?
   -                      BEQ     DFALSE          ; YES.
                  ; *** ENTRY FOR 'DLORI' ***
   -              DAN010  JSR     DTYP            ; IS DTAB(Y) FALSE?
   -                      BEQ     DFALSE          ; YES -- SET DTAB(X) = FALSE AND EXIT.
   -                      BNE     DTRUE           ; NO -- SET DTAB(X) = TRUE AND EXIT.
   -                      PROC
                  ; DLORI -- DOUBLE PRECISION LOGICAL OR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;       Y = OFFSET
                  ;
                  ;       JSR     DLORI
                  ;
                  ;       DTAB(X) = DTAB(X) LOGICAL OR DTAB(Y)
                  ;
   -              DLORI   JSR     DTXP            ; IS DTAB(X) TRUE?
   -                      BNE     DTRUE           ; YES.
   -                      BEQ     DAN010          ; NO (BRA).
                          ENDIF
9D57                      PROC
                  ;
                  ; DLNOTI -- DOUBLE PRECISION LOGICAL NOT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;
                  ;       JSR     DLNOTI
                  ;
                  ;       DTAB(X) = LOGICAL NOT DTAB(X)
                  ;
9D57  205E9D      DLNOTI  JSR     DTXP            ; TRUE OR FALSE?
9D5A  F0EE ^9D4A          BEQ     DTRUE           ; FALSE -> TRUE AND EXIT.
9D5C  D0F0 ^9D4E          BNE     DFALSE          ; TRUE -> FALSE AND EXIT.
9D5E                      PROC
                  ;
                  ; DTXP -- DTAB(X) PREDICATE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;
                  ;       JSR DTXP
                  ;
                  ;       BNE IF DTAB(X) POSITIVE (TRUE)
                  ;       BEQ IF DTAB(X) ZERO OR NEGATIVE (FALSE)
                  ;
9D5E  B581        DTXP    LDA     DTAB+1,X
9D60  3003 ^9D65          BMI     DTX010          ; NEGATIVE.
9D62  1580                ORA     DTAB,X          ; POSITIVE OR ZERO.
9D64  60                  RTS                     ; CC IS SET.
9D65              DTY010
9D65  A900        DTX010  LDA     #0
9D67  60                  RTS
                  ;
                  ; DANDI -- DOUBLE PRECISION AND
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ; X = OFFSET
                  ; Y = OFFSET
                  ;
                  ; JSR DANDI
                  ;
                  ; DTAB(X) = DTAB(X)
9D68  B580        DANDI   LDA     DTAB,X
9D6A  398000              AND     DTAB,Y
9D6D  9580                STA     DTAB,X
9D6F  B581                LDA     DTAB+1,X
9D71  398100              AND     DTAB+1,Y
9D74  9581                STA     DTAB+1,X
9D76  60                  RTS
                  ;
                  ; DORI -- DOUBLE PRECISION OR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;       Y = OFFSET
                  ;
                  ;       JSR     DORI
                  ;
                  ;       DTAB(X) = DTAB(X) OR DTAB(Y)
                  ;
9D77  B580        DORI    LDA     DTAB,X
9D79  198000              ORA     DTAB,Y
9D7C  9580                STA     DTAB,X
9D7E  B581                LDA     DTAB+1,X
9D80  198100              ORA     DTAB+1,Y
9D83  9581                STA     DTAB+1,X
9D85  60                  RTS
                  ;
                  ; DXORI -- DOUBLE PRECISION XOR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;       Y = OFFSET
                  ;
                  ;       JSR     DXORI
                  ;
                  ;       DTAB(X) = DTAB(X) XOR DTAB(Y)
                  ;
9D86  B580        DXORI   LDA     DTAB,X
9D88  598000              EOR     DTAB,Y
9D8B  9580                STA     DTAB,X
9D8D  B581                LDA     DTAB+1,X
9D8F  598100              EOR     DTAB+1,Y
9D92  9581                STA     DTAB+1,X
9D94  60                  RTS
                  ;
                  ; DNOTI -- DOUBLE PRECISION NOT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET
                  ;
                  ;       JSR     DNOTI
                  ;
                  ;       DTAB(X) = NOT DTAB(X)
                  ;
9D95  B580        DNOTI   LDA     DTAB,X
9D97  49FF                EOR     #$FF
9D99  9580                STA     DTAB,X
9D9B  B581                LDA     DTAB+1,X
9D9D  49FF                EOR     #$FF
9D9F  9581                STA     DTAB+1,X
9DA1  60                  RTS
      = 0000              IF      LOGGRP
   -                      PROC
                  ; DTYP -- DTAB(Y) PREDICATE.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = OFFSET
                  ;
                  ;       JSR     DTYP
                  ;
                  ;       BNE IF DTAB(Y) POSITIVE (TRUE)
                  ;       BEQ IF DTAB(Y) ZERO OR NEGATIVE (FALSE)
                  ;
   -              DTYP    LDA     DTAB+1,Y
   -                      BMI     DTY010          ; NEGATIVE.
   -                      ORA     DTAB,Y          ; POSITIVE OR ZERO.
   -                      RTS                     ; CC IS SET.
                          ENDIF
9DA2                      PROC
                  ;
                  ; ACCUMULATOR FUNCTIONS -- ASSUME THE EXISTENCE OF A DOUBLE PRECISION
                  ; VARIABLE WITHIN 'DTAB' NAMED 'ACC'.
                  ;
                  ;
                  ; DLOADA -- LOAD 'ACC' WITH DATA
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = OFFSET TO SOURCE DATA
                  ;
                  ;       JSR     DLOADA
                  ;
                  ;       X = ACC OFFSET
                  ;       'ACC' = DTAB(Y)
                  ;
9DA2  A262        DLOADA  LDX     #ACC-DTAB
9DA4  4C459A              JMP     DMOVI
9DA7                      PROC
                  ;
                  ; DSTORA -- STORE 'ACC' TO LOCATION
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = OFFSET TO DESTINATION
                  ;
                  ;       JSR     DSTORA
                  ;
                  ;       Y = 'ACC' OFFSET
                  ;       DTAB(X) = 'ACC'
                  ;
9DA7  A062        DSTORA  LDY     #ACC-DTAB
9DA9  4C459A              JMP     DMOVI
9DAC                      PROC
                  ;
                  ; DADDA -- ADD DATA TO 'ACC'
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = OFFSET TO DATA
                  ;
                  ;       JSR     DADDA
                  ;
                  ;       X = 'ACC' OFFSET
                  ;       'ACC' = 'ACC' + DTAB(Y)
                  ;
9DAC  A262        DADDA   LDX     #ACC-DTAB
9DAE  4C329C              JMP     DADDI
9DB1                      PROC
                  ;
                  ; DSUBA -- SUBTRACT DATA PROM 'ACC'
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = OFFSET TO DATA
                  ;
                  ;       JSR     DSUBA
                  ;       BEQ     RESULT = 0
                  ;
                  ;       X = 'ACC' OFFSET
                  ;       'ACC' = 'ACC' - DTAB(Y)
                  ;
                  ;
9DB1  A262        DSUBA   LDX     #ACC-DTAB
9DB3  4C429C              JMP     DSUBI
9DB6                      PROC
                  ;
                  ; DCMPA -- COMPARE 'ACC' WITH DATA (UNSIGNED)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = DATA OFFSET
                  ;
                  ;       JSR     DCMPA
                  ;
                  ;       CC = 'ACC' : DTAB(Y) (UNSIGNED)
                  ;       X = 'ACC' OFFSET
                  ;
9DB6  A262        DCMPA   LDX     #ACC-DTAB
9DB8  4C159C              JMP     DCMPI
9DBB                      PROC
                  ;
                  ; ASCDEC -- DECIMAL IN ASCII TO BINARY CONVERSION
                  ;
                  ; CALLING SEGUENCE:
                  ;
                  ;       X = DTAB OFFSET TO POINTER VARIABLE
                  ;       Y = OFFSET WITHIN STRING TO START OF NUMBER
                  ;
                  ;       JSR     ASCDEC
                  ;
                  ;       'NUMBER' = RESULT OF CONVERSION (MODULO 2**16)
                  ;       Y = INDEX TO END OF NUMBER DELIMITER
                  ;       USES 'TEMP' THRU 'TEMP'+4
                  ;
9DBB  A900        ASCDEC  LDA     #0              ; INITIALIZE RESULT.
9DBD  85B8                STA     NUMBER
9DBF  85B9                STA     NUMBER+1
9DC1  B580                LDA     DTAB,X          ; MOVE POINTER.
9DC3  85A3                STA     TEMP+2
9DC5  B581                LDA     DTAB+1,X
9DC7  85A4                STA     TEMP+3
9DC9  B583                LDA     DTAB+3,X        ; SAVE END INDEX.
9DCB  85A5                STA     TEMP+4
9DCD  B1A3                LDA     (TEMP+2),Y
9DCF  C92D                CMP     #'-'            ; UNARY MINUS?
9DD1  D009 ^9DDC          BNE     :AC010          ; NO.
9DD3  C8                  INY                     ; YES -- SKIP OVER IT.
9DD4  20DC9D              JSR     :AC010          ; *** RECURSIVE CALL ***.
9DD7  A238                LDX     #NUMBER-DTAB
9DD9  4CF19C              JMP     DNEGI           ; NEGATE RESULT & RETURN.
9DDC  C4A5        :AC010  CPY     TEMP+4          ; END OF STRING?
9DDE  F033 ^9E13          BEQ     :AC090          ; YES.
9DE0  B1A3                LDA     (TEMP+2),Y      ; GET A CHARACTER.
9DE2  20839E              JSR     CNUMBR          ; VALID DECIMAL DIGIT?
9DE5  B02C ^9E13          BCS     :AC090          ; NO -- DONE.
9DE7  C8                  INY
9DE8  48                  PHA                     ; YES -- SAVE IT.
9DE9  06B8                ASL     NUMBER          ; X2.
9DEB  26B9                ROL     NUMBER+1
9DED  A5B9                LDA     NUMBER+1        ; SAVE X2.
9DEF  85A2                STA     TEMP+1
9DF1  A5B8                LDA     NUMBER
9DF3  85A1                STA     TEMP
9DF5  0A                  ASL     A               ; X4.
9DF6  26B9                ROL     NUMBER+1
9DF8  0A                  ASL     A               ; X8.
9DF9  26B9                ROL     NUMBER+1
9DFB  18                  CLC                     ; X10 = X8 + X2.
9DFC  65A1                ADC     TEMP
9DFE  85B8                STA     NUMBER
9E00  9003 ^9E05          BCC     :AC020          ; NO CARRY.
9E02  E6B9                INC     NUMBER+1        ; CARRY -- ADD TO MSB.
9E04  18                  CLC
9E05  68          :AC020  PLA                     ; GET NEW DIGIT.
9E06  65B8                ADC     NUMBER          ; ADD TO PARTIAL RESULT.
9E08  85B8                STA     NUMBER
9E0A  A5B9                LDA     NUMBER+1
9E0C  65A2                ADC     TEMP+1
9E0E  85B9                STA     NUMBER+1
9E10  4CDC9D              JMP     :AC010
9E13  60          :AC090  RTS
9E14                      PROC
                  ;
                  ; DECASC -- BINARY TO DECIMAL IN ASCII CONVERSION
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB INDEX TO SIGNED VALUE
                  ;
                  ;       JSR     DECASC
                  ;
                  ;       PRINTS RESULT TO 'CHOT' ROUTINE
                  ;       USES 'TEMP'+2 THRU 'TEMP'+5 & 'TEMP2' THRU 'TEMP2'+2
                  ;
9E14  84A6        DECASC  STY     TEMP+5          ; SAVE Y REGISTER.
9E16  B580                LDA     DTAB,X          ; MOVE DATA TO TEMPORARY STORAGE.
9E18  85A7                STA     TEMP2
9E1A  B581                LDA     DTAB+1,X
9E1C  85A8                STA     TEMP2+1
9E1E  100A ^9E2A          BPL     :DC020          ; NUMBER IS POSITIVE.
9E20  A227                LDX     #TEMP2-DTAB     ; NEGATE NUMBEP.
9E22  20F19C              JSR     DNEGI
9E25  A92D                LDA     #'-'             ; PRINT LEADING MINUS SIGN.
9E27  208294              JSR     CHOT            ; PRINT A CHARACTER.
9E2A  A000        :DC020  LDY     #0              ; INITIALIZE CONVERSION INDEX ...
9E2C  84A9                STY     TEMP2+2         ; ... & LEADING ZERO SUPPRESS FLAG.
9E2E  B9799E      :DC030  LDA     PTEN,Y          ; GET POWER OF TEN.
9E31  85A3                STA     TEMP+2
9E33  B97A9E              LDA     PTEN+1,Y
9E36  85A4                STA     TEMP+3
9E38  84A5                STY     TEMP+4          ; SAVE INDEX TO TABLE.
9E3A  A930                LDA     #'0'             ; INITIALIZE DIGIT.
9E3C  8D1105              STA     DIGIT
9E3F  A227                LDX     #TEMP2-DTAB     ; PREPARE FOR SUCCESSIVE SUBTRACTION.
9E41  A023                LDY     #TEMP+2-DTAB
9E43  20429C      :DC040  JSR     DSUBI
9E46  A5A8                LDA     TEMP2+1         ; SEE IF RESULT IS NEGATIVE.
9E48  3005 ^9E4F          BMI     :DC045          ; YES -- ENOUGH ALREADY.
9E4A  EE1105              INC     DIGIT           ; NO -- KEEP SUBTRACTING.
9E4D  D0F4 ^9E43          BNE     :DC040          ; (BRA).
9E4F  20329C      :DC045  JSR     DADDI           ; NOW CORRECT FROM ONE TOO MANY SUBTRACTS.
9E52  A5A9                LDA     TEMP2+2         ; SEE IF NON-ZERO DIGIT HAS BEEN PRINTED YET.
9E54  D009 ^9E5F          BNE     :DC050          ; YES -- PRINT ALL SUBSEQUENT DIGITS.
9E56  AD1105              LDA     DIGIT           ; NO -- SEE IF THIS DIGIT IS ANOTHER ZERO.
9E59  C930                CMP     #'0'
9E5B  F008 ^9E65          BEQ     :DC060          ; YES IT IS -- SUPPRESS IT.
9E5D  85A9                STA     TEMP2+2         ; NO -- SET FLAG AND PRINT DIGIT.
9E5F  AD1105      :DC050  LDA     DIGIT           ; PRINT DIGIT.
9E62  208294              JSR     CHOT
9E65  A4A5        :DC060  LDY     TEMP+4          ; RESTORE TABLE INDEX.
9E67  C8                  INY
9E68  C8                  INY
9E69  C00A                CPY     #PTENL          ; DONE?
9E6B  D0C1 ^9E2E          BNE     :DC030          ; NO.
9E6D  A5A9                LDA     TEMP2+2         ; WAS THE NUMBER = 0?
9E6F  D005 ^9E76          BNE     :DC070          ; NO.
9E71  A930                LDA     #'0'             ; YES -- PRINT SINGLE ZERO DIGIT.
9E73  208294              JSR     CHOT
9E76  A4A6        :DC070  LDY     TEMP+5          ; YES -- RESTORE Y REGISTER ...
9E78  60                  RTS                     ; ... & RETURN.
9E79  1027E80364  PTEN    DW   10000,1000,100,10,1     ; DECREASING POWERS OF TEN.
      = 000A      PTENL = *-PTEN                            ; TABLE LENGTH IN WORDS.
9E83                      PROC
                  ;
                  ; CNUMBR -- CHECK ASCII CHARACTER FUR VALID NUMBER ('0 - '9)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = ASCII CHAPACTER
                  ;
                  ;       JSR     CNUMBR
                  ;       BCS     NOT DECIMAL DIGIT
                  ;
                  ;       A = BINARY DIGIT
                  ;
9E83  C930        CNUMBR  CMP     #'0'             ; < '0?
9E85  9004 ^9E8B          BCC     :CN010          ; YES -- INVALID.
9E87  C93A                CMP     #'9'+1           ; > '9?
9E89  9002 ^9E8D          BCC     :CN020          ; NO -- VALID DECIMAL DIGIT.
9E8B  38          :CN010  SEC                     ; SET CARRY FOR EXIT.
9E8C  60                  RTS
9E8D  E92F        :CN020  SBC     #'0'-1          ; (ADJUST FOR CARRY CLEAR).
9E8F  18                  CLC                     ; SET CC FOR EXIT.
9E90  60                  RTS
9E91                      PROC
                  ;
                  ; CLETTR -- CHECK ASCII CHARACTER FOR ALPHA LETTER ('A - 'Z)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = ASCII CHARACTER
                  ;
                  ;       JSR     CLETTR
                  ;       BCS     NOT ALPHA LETTER
                  ;
                  ;       A = ASCII CHARACTER
                  ;
9E91  48          CLETTR  PHA                     ; SAVE CHARACTER.
9E92  29DF                AND     #UC             ; FORCE UPPER CASE.
9E94  C941                CMP     #'A'            ; < 'A?
9E96  9004 ^9E9C          BCC     :CL010          ; YES -- NOT ALPHA.
9E98  C95B                CMP     #'Z'+1           ; > 'Z?
9E9A  9001 ^9E9D          BCC     :CL020          ; NO -- VALID LETTFR
9E9C  38          :CL010  SEC                     ; SET CARRY FOR EXIT
9E9D  68          :CL020  PLA                     ; RESTORE CHARACTER.
9E9E  60                  RTS
9E9F                      PROC
                  ;
                  ; STMLST -- SETUP LIST POINTER TO STATEMENT LIST
                  ;
9E9F              STMLST
9E9F  A5AE                LDA     S1L             ; 'LP' = 'S1L'.
9EA1  85BA                STA     LP
9EA3  A5AF                LDA     S1L+1
9EA5  85BB                STA     LP+1
9EA7  A900                LDA     #ATRLIN         ; 'LIN' FOR LINE
9EA9  8D6605              STA     ATRTYP
9EAC  60                  RTS
9EAD                      PROC
                  ;
                  ; SETSVL -- SETUP LIST POINTER TO NAMED STRING LIST
                  ;
9EAD  A5B2        SETSVL  LDA     S2L             ; 'LP' = 'S2L'.
9EAF  85BA                STA     LP
9EB1  A5B3                LDA     S2L+1
9EB3  85BB                STA     LP+1
9EB5  60                  RTS
9EB6                      PROC
                  ;
                  ; CKEOA -- CHECK FOR END OF ATOM (NON- ALPHANUMERIC CHARACTER)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = ASCII CHARACTER
                  ;
                  ;       JSR     CKEOA
                  ;       BEQ     END OF ATOM (NOT AN ALPHANUMERIC CHARACTER)
                  ;
9EB6  20919E      CKEOA   JSR     CLETTR          ; ALPHA LETTER
9EB9  900C ^9EC7          BCC     :CK090          ; YES.
9EBB  48                  PHA
9EBC  20839E              JSR     CNUMBR          ; NO -- NUMERIC CHARACTER?
9EBF  68                  PLA
9EC0  9005 ^9EC7          BCC     :CK090          ; YES.
9EC2  85A1                STA     TEMP            ; NEITHER -- SET CC FOR EXIT.
9EC4  C5A1                CMP     TEMP
9EC6  60                  RTS
9EC7  C9FF        :CK090  CMP     #$FF            ; SET CC FOR E
9EC9  60                  RTS
                  ;
                  ; SCEOA -- SCAN TO END OF ATOM
                  ;
9ECA  C8                  INY
9ECB  B180        SCEOA   LDA     (INLN),Y
9ECD  20B69E              JSR     CKEOA           ; END OF ATOM?
9ED0  D0F8 ^9ECA          BNE     SCEOA-1         ; NO.
9ED2  60                  RTS                     ; YES -- RETURN WITH CC SET.
9ED3                      PROC
                  ;
                  ; SCNLBL -- IDENTIFY (& SCAN TO END OF) LABEL
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = INDEX TO INPUT LINE.
                  ;
                  ;       JSR     SCNLBL
                  ;       BNE     NO LABEL PRESENT (A = CODE)
                  ;
                  ;       Y = INDEX TO END OF LABEL + 1
                  ;  INDENT = INDEX TO FIRST NON-SEPARATOR.
                  ;
                  ; NOTE: JUMPS TO 'PSTOP' IF INVALID LABEL NAME FOUND.
                  ;
9ED3  20079F      SCNLBL  JSR     SKPSEP          ; SKIP LEADING BLANKS AND/OR COMMAS.
9ED6  8CCA05              STY     INDENT          ; UPDATE # AUTO INDENT
9ED9  C92A                CMP     #'*'            ; LABEL PREFIX DELIMITER?
9EDB  F003 ^9EE0          BEQ     :SL005          ; YES.
9EDD  A902                LDA     #IMPERR         ; NO LABEL.
9EDF  60                  RTS
9EE0  C8          :SL005  INY
9EE1  B180                LDA     (INLN),Y
9EE3  20B69E              JSR     CKEOA           ; SEE IF AT LEAST ONE ALPHANUMERIC.
9EE6  D0E3 ^9ECB          BNE     SCEOA           ; YES -- SCAN TO END OF ATOM & RETURN.
9EE8  A902                LDA     #ATMERR         ; NO -- INVALID LABEL NAME.
9EEA  4C3A7A              JMP     PSTOP
9EED                      PROC
                  ;
                  ; CHKSEP -- CHECK FOR OPERAND SEPARATOR CHARACTER
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = CHARACTER.
                  ;
                  ;       JSR     CHKSEP
                  ;       BNE     NOT A SEPARATOR
                  ;
9EED  C920        CHKSEP  CMP     #' '            ; BLANK?
9EEF  F007 ^9EF8          BEQ     :CS090          ; YES.
9EF1  C92C                CMP     #','            ; COMMA?
9EF3  F003 ^9EF8          BEQ     :CS090          ; YES.
9EF5  4CF99E              JMP     CHKTRM          ; END OF STATEMENT CHECK & RETURN.
9EF8  60          :CS090  RTS
9EF9                      PROC
                  ;
                  ; CHKTRM -- CHECK FOR STATEMENT TERMINATOR (EOL OR '[').
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = CHARACTER.
                  ;
                  ;       JSR CHKTRM
                  ;       BNE NOT STATEMENT TERMINATOR.
                  ;
9EF9  C99B        CHKTRM  CMP     #EOL
9EFB  F002 ^9EFF          BEQ     :CK090
9EFD  C95B                CMP     #SBRACK
9EFF  60          :CK090  RTS
9F00                      PROC
                  ;
                  ; CHKEQS -- CHECK FOR EQUAL SIGN
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = 'INLN' INDEX.
                  ;
                  ;       JSR     CHKEQS
                  ;       BEQ     1ST NON-BLANK CHARACTER WAS '='.
                  ;
                  ;       Y = 'INLN' INDEX TO 1ST NON-BLANK CHAR.
                  ;
9F00  20139F      CHKEQS  JSR     SLB             ; SKIP LEADING BLANKS.
9F03  C93D                CMP     #'='
9F05  60                  RTS                     ; RETURN WITH CC SET.
9F06                      PROC
                  ;
                  ; SKPSEP -- SKIP OPERAND SEPARATOR(S)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ; Y = INDEX TO INPUT LINE
                  ;
                  ; JSR SKPSEP
                  ;
                  ; Y = INDEX TO FIRST NON-SEPARATOR FOUND
                  ;
                  ; NOTE: ANY STRING OF CONSECUTIVE BLANKS AND/OR COMMAS IS TREATED AS A SINGLE
                  ;       SEPARATOR.
                  ;
9F06  C8                  INY
9F07  B180        SKPSEP  LDA     (INLN),Y
9F09  C920                CMP     #' '             ; BLANK?
9F0B  F0F9 ^9F06          BEQ     SKPSEP-1        ; YES.
9F0D  C92C                CMP     #','             ; COMMA?
9F0F  F0F5 ^9F06          BEQ     SKPSEP-1        ; YES.
9F11  60                  RTS
9F12                      PROC
                  ;
                  ; SLB -- SKIP LEADING BLANKS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     SLB
                  ;
                  ;       A = FIRST NON-BLANK CHARACTER FOUND.
                  ;
9F12  C8                  INY
9F13  B180        SLB     LDA     (INLN),Y
9F15  C920                CMP     #' '             ; BLANK?
9F17  F0F9 ^9F12          BEQ     SLB-1           ; YES -- KEEP SCANNING.
9F19  60                  RTS
9F1A                      PROC
                  ;
                  ; SCNEOL -- SCAN TO END OF LINE
                  ;
9F1A  C8                  INY
9F1B  B180        SCNEOL  LDA     (INLN),Y
9F1D  C99B                CMP     #EOL
9F1F  D0F9 ^9F1A          BNE     SCNEOL-1
9F21  60                  RTS                     ; RETURN WITH CC SET.
9F22                      PROC
                  ;
                  ; PSF -- PRINT A STORAGE FORMAT LINE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = INDEX TO LINE POINTER.
                  ;
                  ;       JSR     PSF
                  ;
9F22  A236        PSF     LDX     #POINT-DTAB     ; MOVE POINTER TO 'POINT'.
9F24  20459A              JSR     DMOVI
9F27  208C9F              JSR     GTLNNO          ; GET LINE A TO 'LINENO'.
9F2A  A6DD                LDX     LINENO+1        ; LEADING SPACES TO RIGHT-JUSTIFY LINE A.
9F2C  E003                CPX     # HIGH 1000     ; >= 1000?
9F2E  9008 ^9F38          BCC     :PS002          ; NO.
9F30  D01C ^9F4E          BNE     :PS003          ; YES.
9F32  A5DC                LDA     LINENO
9F34  C9E8                CMP     # LOW 1000
9F36  B016 ^9F4E          BCS     :PS003          ; YES.
9F38  20A29F      :PS002  JSR     SPACE
9F3B  8A                  TXA                     ; >= 100?
9F3C  D010 ^9F4E          BNE     :PS003          ; YES.
9F3E  A6DC                LDX     LINENO
9F40  E064                CPX     # 100           ; >= 100?
9F42  B00A ^9F4E          BCS     :PS003          ; YES.
9F44  20A29F              JSR     SPACE
9F47  E00A                CPX     # 10            ; >= 10?
9F49  B003 ^9F4E          BCS     :PS003          ; YES.
9F4B  20A29F              JSR     SPACE
9F4E  A25C        :PS003  LDX     #LINENO-DTAB
9F50  20149E              JSR     DECASC          ; PRINT BINARY LINE #.
9F53  C8                  INY                     ; LOOK AHEAD TO 1ST CHAR OF STATEMENT.
9F54  C8                  INY
9F55  A920                LDA     #' '            ; IS IT A SPACE?
9F57  D1B6                CMP     (POINT),Y
9F59  F003 ^9F5E          BEQ     :PS005          ; YES.
9F5B  20A29F              JSR     SPACE           ; NO -- PUT SPACE BETWEEN LINE A AND STATEMENT.
9F5E  88          :PS005  DEY                     ; GET STATEMENT LENGTH.
9F5F  B1B6                LDA     (POINT),Y
9F61  AA                  TAX
9F62  CEFE02              DEC     DSPFLG          ; DISPLAY CONTROL CHARACTERS.
9F65  C8          :PS010  INY                     ; PRINT STATEMENT BODY.
9F66  B1B6                LDA     (POINT),Y
9F68  208294              JSR     CHOT
9F6B  CA                  DEX
9F6C  D0F7 ^9F65          BNE     :PS010
9F6E  EEFE02              INC     DSPFLG          ; BACK TO ZERO.
9F71  60                  RTS
9F72                      PROC
                  ;
                  ; NULACC -- SET THE ACCEPT BUFFER TO NULL (SINGLE SPACE)
                  ;
9F72  A000        NULACC  LDY     #0
9F74  A920                LDA     #' '             ; SINGLE SPACE.
9F76  9188                STA     (ACLN),Y
9F78  848A                STY     ACLN+2          ; START INDEX.
9F7A  C8                  INY
9F7B  848B                STY     ACLN+3          ; END INDEX.
9F7D  60                  RTS
9F7E                      PROC
                  ;
                  ; ABRTCK -- BREAK KEY ABORT CHECK
                  ;
9F7E  48          ABRTCK  PHA                     ; (SEE 'XSYNC').
9F7F  A511                LDA     BREAK           ; OPERATOR ABORT?
9F81  D007 ^9F8A          BNE     :AC090          ; NO.
9F83  C611                DEC     BREAK           ; YES -- RESET FLAG.
9F85  A987        :AC005  LDA     #ABTERR         ; STOP WITH STATUS CODE.
9F87  4C3A7A              JMP     PSTOP
      = 0000              IF      FALSE
   -              :AC010  LDA     CONKEY          ; ALTERNATE ABORT?
   -                      AND     #STRTKY         ; START KEY?
   -                      BEQ     :AC090          ; NO.
   -                      LDA     CONKEY          ; YES -- RESET STATUS.
   -                      AND     #$FF-STRTKY
   -                      STA     CONKEY
   -                      JMP     :AC005
                          ENDIF
9F8A  68          :AC090  PLA
9F8B  60                  RTS
9F8C                      PROC
                  ;
                  ; GTLNNO -- GET LINE # FROM STORAGE LINE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'POINT' POINTS TO STORAGE LINE
                  ;
                  ;       JSR     GTLNNO
                  ;
                  ;       'LINENO' = BINARY LINE #
                  ;       Y = 4
                  ;
9F8C  A003        GTLNNO  LDY     #3
9F8E  B1B6                LDA     (POINT),Y
9F90  85DD                STA     LINENO+1        ; RE-INVERT ORDER.
9F92  C8                  INY
9F93  B1B6                LDA     (POINT),Y
9F95  85DC                STA     LINENO
9F97  60                  RTS
9F98                      PROC
                  ; NEWLIN -- ISSUE NEW LINE SEQUENCE TO 'CHOT'
9F98  A99B        NEWLIN  LDA     #EOL
9F9A  4C8294              JMP     CHOT            ; NEWLINE & RETURN.
9F9D                      PROC
                  ; SPACE(S) -- ISSUE SPACE(S) TO 'CHOT'
9F9D  A920        SPACES  LDA     #' '            ; TWO SPACES.
9F9F  208294              JSR     CHOT
9FA2  A920        SPACE   LDA     #' '            ; ONE SPACE.
9FA4  4C8294              JMP     CHOT            ; & RETURN.
9FA7                      PROC
                  ;
                  ; CRSNOP -- COMPLICATED NOP TO UPDATE CURSOR INHIBIT/ENABLE STATE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = 0 TO ENABLE CURSOR, ELSE DISABLE CURSOR.
                  ;
9FA7  8DF002      CRSNOP  STA     CRSINH          ; SET CURSOR INHIBIT FLAG.
9FAA  A91C                LDA     #CUP            ; CURSOR UP ...
9FAC  208294              JSR     CHOT
9FAF  A91D                LDA     #CDOWN          ; ... THEN DOWN ...
9FB1  4C8294              JMP     CHOT            ; ... & RETURN.
9FB4                      PROC
                  ;
                  ; AUDCLR -- CLEAR AUDIO REGISTERS AND SELECTS
                  ;
9FB4  A903        AUDCLR  LDA     #$03            ; MAGIC CONSTANT FROM D. CRANE, 27-AUG-79.
9FB6  8D3202              STA     SSKCTL
9FB9  8D0FD2              STA     SKCTL
9FBC  A900                LDA     #0
9FBE  8D08D2              STA     AUDCTL          ; SET AUDIO TO 4 INDEPENDENT REGISTERS.
9FC1  A208                LDX     #AUREGS*2
9FC3  9DFED1      :AC010  STA     AUDF1-2,X       ; CLEAR ALL ACTIVE TONES.
9FC6  9DFFD1              STA     AUDC1-2,X
9FC9  9D1305              STA     AUDIOR-2,X      ; CLEAR 'SO' SELECTS.
9FCC  9D1405              STA     AUDIOR-1,X
9FCF  CA                  DEX
9FD0  CA                  DEX
9FD1  D0F0 ^9FC3          BNE     :AC010
9FD3  60                  RTS
9FD4                      PROC
                  ;
                  ; EXP -- ARITHMETIC EXPRESSION EVALUATOR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'INLN' POINTS TO LINE TO BE EVALUATED
                  ;       Y = INDEX TO START OF EXPRESSION
                  ;
                  ;       JSR     EXP
                  ;
                  ;       Y = INDEX TO END OF EXPRESSION + 1
                  ;       'EXPSTK'+0 & +1 = RESULT OF EVALUATION.
                  ;
9FD4  A900        EXP     LDA     #0              ; INITIALIZE CPITICAL VARIABLES.
9FD6  8D4E05              STA     ESTKP
                  ; *** EXTERNAL ENTRY POINT ***
9FD9  2014A0      EXPRC   JSR     EXPVAL          ; CHECK FOR OPERAND & GET VALUE TO STACK.
9FDC  20139F      :EX030  JSR     SLB             ; SKIP LEADING BLANKS.
9FDF  84A7                STY     TEMP2           ; SAVE INDEX.
9FE1  206E81              JSR     ATOM            ; CHECK FOR OPERATOR.
9FE4  D021 ^A007          BNE     :EX080          ; INVALID ATOM.
9FE6  C940                CMP     #OPR
9FE8  D01D ^A007          BNE     :EX080          ; NOT AN OPERATOR.
9FEA  AE4E05              LDX     ESTKP           ; PUSH OPERATOR ROUTINE ADDR TO EXP STACK.
9FED  E00E                CPX     #ESTKSZ
9FEF  F019 ^A00A          BEQ     EXP192          ; STACK FULL.
9FF1  A5B6                LDA     POINT
9FF3  9593                STA     EXPSTK,X
9FF5  A5B7                LDA     POINT+1
9FF7  9594                STA     EXPSTK+1,X
9FF9  E8                  INX
9FFA  E8                  INX
9FFB  8E4E05              STX     ESTKP
9FFE  2014A0              JSR     EXPVAL          ; CHECK FOR OPERAND & GET VALUE TO STACK.
A001  207CA0              JSR     SOP             ; OPERATE ON STACK DATA.
A004  4CDC9F              JMP     :EX030
A007  A4A7        :EX080  LDY     TEMP2
A009  60                  RTS
A00A  A902        EXP192  LDA     #EXPERR
A00C  4C3A7A      EXP194  JMP     PSTOP
A00F                      PROC
                  ;
                  ; EXPVAL -- VALIDATE OPERAND & PUSH VALUE TO STACK
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = INDEX TO 'INLN'
                  ;
                  ;       JSR     EXPVAL
                  ;
A00F  A900        EXPP    LDA     #0              ; EVALUATE EXPR IN PARENS.
A011  8D4E05              STA     ESTKP
A014  20139F      EXPVAL  JSR     SLB
A017  A202                LDX     #UNTABX         ; UNARY OPERATOR?
A019  20AB7C              JSR     SBCMAT
A01C  D01D ^A03B          BNE     :EX010          ; NO.
A01E  8A                  TXA                     ; YES.
A01F  48                  PHA                     ; SAVE OFFSET IN 'SBDTAB'.
A020  2014A0              JSR     EXPVAL          ; *** RECURSIVE CALL ***
A023  68                  PLA                     ; RESTORE OFFSET IN 'SBDTAB'.
A024  AA                  TAX
A025  BDAA80              LDA     SBDTAB,X        ; GET OPERATOR ROUTINE ADDRESS.
A028  8D0E05              STA     SJUMP+1
A02B  BDAB80              LDA     SBDTAB+1,X
A02E  8D0F05              STA     SJUMP+2
A031  AD4E05              LDA     ESTKP           ; GET OFFSET TO RESULT.
A034  18                  CLC
A035  6911                ADC     #EXPSTK-DTAB-2
A037  AA                  TAX
A038  4C0D05              JMP     SJUMP           ; UNARY ROUTINE & RETURN.
A03B  B180        :EX010  LDA     (INLN),Y        ; RESTORE CHAR.
A03D  C928                CMP     #'('            ; LEFT PAREN?
A03F  D00C ^A04D          BNE     :EX020 ; NO.
A041  C8                  INY
A042  20D99F              JSR     EXPRC           ; YES -- EVALUATE SUB-EXPRESSION.
A045  B180                LDA     (INLN),Y
A047  C929                CMP     #')'            ; MATCHING RIGHT RAREN?
A049  D0BF ^A00A          BNE     EXP192          ; NO -- ERROR.
A04B  C8                  INY                     ; YES -- SKIP OVER IT.
A04C  60                  RTS
A04D  C93F        :EX020  CMP     #'?'            ; RANDOM NUMBER?
A04F  D00D ^A05E          BNE     :EX030          ; NO.
A051  AD0AD2              LDA     PKYRND          ; YES -- GET RANDOM # FROM POKEY.
A054  85B8                STA     NUMBER
A056  AD0AD2              LDA     PKYRND
A059  85B9                STA     NUMBER+1
A05B  C8                  INY                     ; SKIP OVER '?'.
A05C  D009 ^A067          BNE     :EX040          ; (BRA).
A05E  206E81      :EX030  JSR     ATOM
A061  D0A9 ^A00C          BNE     EXP194          ; ERROR.
A063  2986                AND     #NUM+NVAR+BPTR  ; NUMERIC VARIABLE, POINTER OR CONSTANT?
A065  F0A3 ^A00A          BEQ     EXP192          ; NO -- ERROR.
A067  AE4E05      :EX040  LDX     ESTKP           ; RESULT TO STACK.
A06A  E00E                CPX     #ESTKSZ
A06C  F09C ^A00A          BEQ     EXP192          ; STACK OVERFLOW.
A06E  A5B8                LDA     NUMBER
A070  9593                STA     EXPSTK,X
A072  A5B9                LDA     NUMBER+1
A074  9594                STA     EXPSTK+1,X
A076  E8                  INX
A077  E8                  INX
A078  8E4E05              STX     ESTKP
A07B  60                  RTS
A07C                      PROC
                  ;
                  ; SOP -- STACK OPERATE
                  ;
                  ; CALLING SEQUENCE:
                  ;
A07C  A592        SOP     LDA     EXEC            ; EXECUTE?
A07E  F01D ^A09D          BEQ     :SO050          ; NO -- JUST REJUSTIFY THE STACK.
A080  84A7                STY     TEMP2
A082  AD4E05              LDA     ESTKP           ; GET EXP STACK INDEX.
      = 0000              IF      DEBUG
   -                      CMP     #6              ; SEE IF STACK HAS AT LEAST 3 ENTRIES.
   -                      BCC     :SO090          ; NO -- PROBLEM!
                          ENDIF
A085  18                  CLC                     ; YES -- CONVERT STACK INDEX TO 'DTAB'
A086  6911                ADC     #EXPSTK-DTAB-2
A088  A8                  TAY
A089  AA                  TAX
A08A  CA                  DEX                     ; INDEX TO OPERATOR PROCESSOR ADDRESS.
A08B  CA                  DEX
A08C  B580                LDA     DTAB,X          ; GET OPERATE ROUTINE ADDRESS.
A08E  8D0E05              STA     SJUMP+1
A091  B581                LDA     DTAB+1,X
A093  8D0F05              STA     SJUMP+2
A096  CA                  DEX                     ; INDEX TO TARGET ENTRY.
A097  CA                  DEX
A098  200D05              JSR     SJUMP           ; OPERATE ON DATA.
A09B  A4A7                LDY     TEMP2
A09D  38          :SO050  SEC                     ; (CLEAR BORROW).
A09E  AD4E05              LDA     ESTKP           ; ADJUST STACK INDEX
A0A1  E904                SBC     #4
A0A3  8D4E05              STA     ESTKP
A0A6  60                  RTS
      = 0000              IF      DEBUG
   -              :SO090  LDA     #INTERR         ; INTERNAL BUG
   -                      JMP     PSTOP
                          ENDIF
A0A7                      PROC
                  ;
                  ; TEXP -- EVALUATE TEXT EXPRESSION
                  ;
                  ;       Y = POINTER TO START OF TEXT EXPR IN 'INLN'.
                  ;
                  ;       JSR     TEXP
                  ;       BNE     EXECUTE MODE
                  ;
                  ;       TEXP+2 = 0
                  ;       TEXP+3 = END OF TEXT EXPRESSION.
                  ;
                  ;       THE EOL IS NOT PART OF THE RESULTANT TEXT.
                  ;
A0A7  A592        TEXP    LDA     EXEC            ; EXECUTE MODE?
A0A9  D003 ^A0AE          BNE     :TE005          ; YES.
A0AB  4C1B9F              JMP     SCNEOL          ; NO -- SCAN TO EOL & RETURN.
A0AE  A900        :TE005  LDA     #0              ; INIT RESULT LENGTH COUNT ...
A0B0  858F                STA     TELN+3
A0B2  858E                STA     TELN+2          ; ... & STARTING INDEX.
A0B4  AD3005              LDA     CDEST           ; SAVE 'CHOT' DESTINATION.
A0B7  8D3105              STA     CDEST+1
A0BA  A9FF                LDA     #$FF            ; YES -- RE-ROUTE 'CHOT' OUTPUT
A0BC  8D3005              STA     CDEST
A0BF  B180        :TE010  LDA     (INLN),Y        ; GET A CHARACTER.
A0C1  20F99E              JSR     CHKTRM          ; STATEMENT TERMINATOR?
A0C4  F05C ^A122          BEQ     :TE400          ; YES.
A0C6  C925                CMP     #'%'            ; SPECIAL NUMBER?
A0C8  F013 ^A0DD          BEQ     :TE100          ; YES.
A0CA  C940                CMP     #'@'            ; POINTER?
A0CC  F00F ^A0DD          BEQ     :TE100          ; YES.
A0CE  C923                CMP     #'#'            ; NUMERIC VARIABLE DELIMITER?
A0D0  F00B ^A0DD          BEQ     :TE100          ; YES.
A0D2  C924                CMP     #'$'            ; STRING VARIABLE DELIMITER?
A0D4  F007 ^A0DD          BEQ     :TE100          ; YES.
A0D6  C8          :TE020  INY
A0D7  208294              JSR     CHOT            ; YES -- PRINT TEXT LITERAL.
A0DA  4CBFA0              JMP     :TE010
A0DD  48          :TE100  PHA                     ; SAVE THE TEXT CHARACTER.
A0DE  98                  TYA                     ; SAVE THE Y REG.
A0DF  48                  PHA
A0E0  206E81              JSR     ATOM            ; GET VALUE.
A0E3  F021 ^A106          BEQ     :TE220          ; O.K.
A0E5  68          :TE210  PLA                     ; NOT ATOM -- RESTORE Y REG ...
A0E6  A8                  TAY
A0E7  C8                  INY                     ; LOOK AHEAD.
A0E8  B180                LDA     (INLN),Y        ; IS NEXT CHAR = DOUBLE QUOTE?
A0EA  C922                CMP     #'"'
A0EC  D014 ^A102          BNE     :TE216          ; NO.
A0EE  68                  PLA                     ; YES -- FLUSH THE '%'
A0EF  C8                  INY                     ; GET NEXT CHARACTER IN LITERAL
A0F0  B180        :TE212  LDA     (INLN),Y
A0F2  20F99E              JSR     CHKTRM          ; STATEMENT TERMINATOR?
A0F5  F02B ^A122          BEQ     :TE400          ; YES.
A0F7  C8                  INY
A0F8  C922                CMP     #'"'            ; LITERAL TERMINATOR?
A0FA  F0C3 ^A0BF          BEQ     :TE010          ; YES -- BACK TO NORMAL SCAN
A0FC  208294              JSR     CHOT            ; NOT PRINT LITERAL CHAR.
A0FF  4CF0A0              JMP     :TE212
A102  88          :TE216  DEY                     ; SET INDEX BACK.
A103  68                  PLA                     ; ... & CHARACTER.
A104  D0D0 ^A0D6          BNE     :TE020          ; (BRA).
A106  C910        :TE220  CMP     #USVAR          ; UNDEFINED STRING?
A108  F0DB ^A0E5          BEQ     :TE210          ; YES -- PRINT LITERALLY.
A10A  C908                CMP     #SVAR           ; DEFINED STRING?
A10C  F00A ^A118          BEQ     :TE300          ; YES -- PRINT VALUE.
                  ; NUMERIC DATA
A10E  68                  PLA                     ; NO -- MUST BE NUMERIC VALUE.
A10F  68                  PLA                     ; CLEAR STACK.
A110  A238                LDX     #NUMBER-DTAB    ; VALUE OF NUMBER.
A112  20149E              JSR     DECASC          ; CONVERT TO ASCII & OUTPUT.
A115  4CBFA0              JMP     :TE010          ; CONTINUE.
                  ; STRING VARIABLE
A118  68          :TE300  PLA                     ; CLEAR THE STACK.
A119  68                  PLA
A11A  A242                LDX     #DP-DTAB        ; INDEX TO STRING VALUE.
A11C  209797              JSR     PRTSTG
A11F  4CBFA0              JMP     :TE010
A122  AD3105      :TE400  LDA     CDEST+1         ; RESTORE 'CHOT' DESTINATION.
A125  8D3005              STA     CDEST
                  ; EXTERNAL ENTRY POINT FROM 'XACCPT' ***
A128  A68F        TRAILB  LDX     TELN+3          ; EXAMINE LAST CHAR OF TEXP.
A12A  E48E                CPX     TELN+2
A12C  F00C ^A13A          BEQ     :TE480          ; NULL RESULT.
A12E  BDFFBB              LDA     TEXBUF-1,X      ; GET LAST CHAR IN BUFFER.
A131  C95F                CMP     #'_'            ; UNDERSCORE?
A133  D005 ^A13A          BNE     :TE480          ; NO.
A135  A920                LDA     #' '            ; YES -- REPLACE WITH BLANK.
A137  9DFFBB              STA     TEXBUF-1,X
A13A  A592        :TE480  LDA     EXEC            ; THE CC IS BEING SET TO REFLECT THE STATE
                                                  ; OF THE 'EXEC' FLAG BECAUSE EVERY SINGLE
                                                  ; JSR TO 'STEP' USED TO BE FOLLOWED BY A
                                                  ; 'LDA EXEC ' INSTRUCTION. THESE HAVE ALL BEEN
                                                  ;"COMMENTED" OUT; WHEN WILL THIS ALL END?
A13C  60                  RTS
                  ;
                  ; HEREIN RESIDE THE LOWER LEVEL GRAPHICS ROUTINES FOR PILOT GRAPHICS.
                  ;
                  ;
A13D                      PROC
                  ;
                  ; GMODE -- GRAPHICS 'MODE' SUBCOMMAND.
                  ;
A13D  20D49F      GMODE   JSR     EXP             ; GET MODE #.
A140  A592                LDA     EXEC            ; EXECUTE MODE.
A142  F026 ^A16A          BEQ     :GM090          ; NO.
A144  84AB                STY     XTEMP
A146  A000                LDY     #0              ; SEE IF MODE IS 0-15.
A148  A910                LDA     #16
A14A  A213                LDX     #EXPSTK-DTAB
A14C  200F9C              JSR     DCWCI
A14F  B01A ^A16B          BCS     :GM092          ; NO -- MODE >=16.
A151  A693                LDX     EXPSTK          ; SEE IF ALLOWED AS GRAPHICS MODE.
A153  BDE6B7              LDA     GCHAR,X         ; WILL BE ZERO IF NOT ALLOWED.
A156  F013 ^A16B          BEQ     :GM092          ; NOT AN ALLOWFD MODE.
A158  AD5205              LDA     SPLTSC          ; SEE IF SPLIT DESIRED.
A15B  F005 ^A162          BEQ     :GM020          ; NO.
A15D  3DE6B7              AND     GCHAR,X         ; YES -- IS SPLIT ALLOWED?
A160  F010 ^A172          BEQ     :GM094          ; NO -- ERROR.
A162  8E3705      :GM020  STX     GSMODE          ; YES -- SAVE MODE.
A165  201095              JSR     GSOPEN          ; RE-OPEN GRAPHICS SCREEN.
A168  A4AB                LDY     XTEMP
A16A  60          :GM090  RTS
A16B  A922        :GM092  LDA     #MODERR         ; ILLEGAL GRAPHICS MODE.
A16D  A4AB                LDY     XTEMP
A16F  4C3A7A              JMP     PSTOP
A172              GSP094
A172  A921        :GM094  LDA     #SPTERR         ; SPLIT SCREEN NOT ALLOWED.
A174  A4AB                LDY     XTEMP
A176  4C3A7A              JMP     PSTOP
A179                      PROC
                  ;
                  ; GFULL -- GRAPHICS 'FULL' SUBCOMMAND.
                  ;
A179  A592        GFULL   LDA     EXEC            ; EXECUTE MODE?
A17B  F015 ^A192          BEQ     :GF090          ; NO.
A17D  A5FF                LDA     RUN             ; RUN MODE?
A17F  F012 ^A193          BEQ     :GF092          ; NO -- ERROR.
A181  AD4505              LDA     SGLSTP          ; SINGLE STOP?
A184  D00D ^A193          BNE     :GF092          ; YES -- ERROR.
A186  A900                LDA     #0              ; FULL SCREEN
A188  8D5205              STA     SPLTSC
A18B  84AB                STY     XTEMP
A18D  201095              JSR     GSOPEN          ; OPEN SCREEN.
A190  A4AB                LDY     XTEMP
A192  60          :GF090  RTS
A193  A983        :GF092  LDA     #NRCERR
A195  4C3A7A              JMP     PSTOP
A198                      PROC
                  ;
                  ; GSPLIT -- GRAPHICS 'SPLIT' SUBCOMMAND.
                  ;
A198  A592        GSPLIT  LDA     EXEC            ; EXECUTE MODE?
A19A  F014 ^A1B0          BEQ     :GS090          ; NO.
A19C  A910                LDA     #SPLIT          ; SPLIT SCPEEN.
A19E  8D5205              STA     SPLTSC
A1A1  AE3705              LDX     GSMODE          ; SEE IF SPLIT ALLOWED.
A1A4  3DE6B7              AND     GCHAR,X
A1A7  F0C9 ^A172          BEQ     GSP094          ; NO -- ERROR.
A1A9  84AB                STY     XTEMP
A1AB  201095              JSR     GSOPEN          ; YES -- OPEN SCREEN.
A1AE  A4AB                LDY     XTEMP
A1B0  60          :GS090  RTS
A1B1                      PROC
                  ;
                  ; 'DRAWTO', 'FILLTO' & 'GOTO' SUB-COMMAND PROCESSORS.
                  ;
A1B1  A912        GFILTO  LDA     #FILLTO         ; PEN DOWN.
A1B3  D006 ^A1BB          BNE     :GG005          ; (BRA).
A1B5  A90A        GDRWTO  LDA     #DRAWTO         ; PEN DOWN.
A1B7  D002 ^A1BB          BNE     :GG005          ; (BRA).
A1B9  A906        GGOTO   LDA     #GOTO           ; PEN UP.
A1BB  8DD405      :GG005  STA     GROPR           ; SET PEN POSITION.
A1BE  20D49F              JSR     EXP             ; GET X-COORDINATE.
A1C1  A592                LDA     EXEC            ; EXECUTE MODE?
A1C3  F008 ^A1CD          BEQ     :GG010          ; NO.
A1C5  A593                LDA     EXPSTK          ; YES -- UPDATE X.
A1C7  85E6                STA     GXNEW
A1C9  A594                LDA     EXPSTK+1
A1CB  85E7                STA     GXNEW+1
A1CD  20079F      :GG010  JSR     SKPSEP          ; SKIP OPERAND SEPARATOR.
A1D0  20D49F              JSR     EXP             ; GET Y-COORDINATE.
A1D3  A592                LDA     EXEC            ; EXECUTE MODE?
A1D5  F011 ^A1E8          BEQ     :GG090          ; NO.
A1D7  A593                LDA     EXPSTK          ; YES -- UPDATE Y.
A1D9  85E9                STA     GYNEW
A1DB  A594                LDA     EXPSTK+1
A1DD  85EA                STA     GYNEW+1
                  ; *** EXTERNAL ENTRY POINT FROM 'GHOME' ***
A1DF  A900        GGT030  LDA     #0              ; CLEAR FRACTIONAL PORTION OF X & Y.
A1E1  85E8                STA     GXNEW+2
A1E3  85EB                STA     GYNEW+2
A1E5  207AA6              JSR     GMOVE           ; NOW EFFECT MOVE.
A1E8              GGO090
A1E8              GTR090
A1E8              GTT090
A1E8  60          :GG090  RTS                     ; RETURN.
A1E9                      PROC
A1E9  20D49F      GTRNTO  JSR     EXP             ; GET POLAR ANGLE.
A1EC  A592                LDA     EXEC            ; EXECUTE MODE?
A1EE  F0F8 ^A1E8          BEQ     GTT090          ; NO.
A1F0  A593                LDA     EXPSTK          ; YES -- UPDATE POLAR ANGLE.
A1F2  85F2                STA     THETA
A1F4  A594                LDA     EXPSTK+1
A1F6  85F3                STA     THETA+1
A1F8  4C96AB              JMP     MOD360          ; MODULO 360 & RETURN
A1FB                      PROC
A1FB  A909        GBK     LDA     #DRAW           ; BK N = FD-N.
A1FD  8DD405              STA     GROPR
A200  20D49F              JSR     EXP             ; GET MAGNITUDE OF MOVE
A203  A213                LDX     #EXPSTK-DTAB    ; NEGATE IT.
A205  20F19C              JSR     DNEGI
A208  4C1BA2              JMP     :GG010          ; GO TO COMMON CODE.
A20B  A911        GFIL    LDA     #FILL           ; PEN DOWN
A20D  D006 ^A215          BNE     :GG005
A20F  A909        GDRW    LDA     #DRAW           ; PEN DOWN.
A211  D002 ^A215          BNE     :GG005
A213  A905        GGO     LDA     #GO             ; PEN UP.
A215  8DD405      :GG005  STA     GROPR           ; SET PEN POSITION.
A218  20D49F              JSR     EXP             ; GET MAGNITUDE OF MOVE.
A21B  A592        :GG010  LDA     EXEC            ; EXECUTE MODE?
A21D  F0C9 ^A1E8          BEQ     GGO090          ; NO.
A21F  2032A2              JSR     CALDEL          ; CALCULATE GXNEW & GYNEW.
A222  207AA6              JSR     GMOVE           ; NOW EFFECT MOVE.
A225  ADC505              LDA     RBTON           ; IS ROBOT TURTLE ON?
A228  F007 ^A231          BEQ     :GG090          ; NO.
A22A  84AB                STY     XTEMP           ; SAVE INDEX.
A22C  20D7B3              JSR     RGO             ; MOVE ROBOT ALSO.
A22F  A4AB                LDY     XTEMP           ; RESTORE INDEX.
A231  60          :GG090  RTS
A232  A901        CALDEL  LDA     #1              ; COS(THETA) = SIN(THETA+90).
A234  203BAD              JSR     SINVAL          ; GYNEW = GYNEW + (<EXP> * COS(THETA)).
A237  20F6AD              JSR     TMULT
A23A  A269                LDX     #GYNEW-DTAB
A23C  2044AE              JSR     TADDI
A23F  A900                LDA     #0
A241  203BAD              JSR     SINVAL          ; GXNEW = GXNEW + (<EXP> * SIN(THETA)).
A244  20F6AD              JSR     TMULT
A247  A266                LDX     #GXNEW-DTAB
A249  4C44AE              JMP     TADDI
A24C                      PROC
A24C  20D49F      GLT     JSR     EXP             ; LT N = RT -N.
A24F  A213                LDX     #EXPSTK-DTAB
A251  20F19C              JSR     DNEGI
A254  4C5AA2              JMP     :GT010          ; GO TO COMMON CODE.
A257  20D49F      GTRN    JSR     EXP             ; POLAR ANGLE DELTA THETA.
A25A  A592        :GT010  LDA     EXEC            ; EXECUTE MODE?
A25C  F08A ^A1E8          BEQ     GTR090          ; NO.
A25E  84AB                STY     XTEMP           ; YES -- SAVE INDEX.
A260  A272                LDX     #THETA-DTAB     ; THETA = THETA + DELTA.
A262  A013                LDY     #EXPSTK-DTAB
A264  20329C              JSR     DADDI
A267  2096AB              JSR     MOD360          ; MODULO 360.
A26A  ADC505              LDA     RBTON           ; IS ROBOT TURTLE ON?
A26D  F003 ^A272          BEQ     :GT090          ; NO.
A26F  20F9B3              JSR     RTURN           ; MOVE ROBOT ALSO.
A272  A4AB        :GT090  LDY     XTEMP
A274  60                  RTS
A275                      PROC
                  ;
                  ; GPEN -- GRAPHICS 'PEN' SUBCOMMAND
                  ;
A275  2096A4      GPEN    JSR     CLRMAT          ; SEE IF COLOR MATCH.
A278  D02E ^A2A8          BNE     :GP099          ; NO -- ERROR.
A27A  8DB805              STA     PENCOL          ; SAVE COLOR REGISTER VALUE.
A27D  A592                LDA     EXEC            ; EXECUTE MODE?
A27F  F026 ^A2A7          BEQ     :GP090          ; NO.
A281  B010 ^A293          BCS     :GP040          ; YES -- JIF 'UP', 'DOWN ' OR 'ERASE'.
A283  8A                  TXA                     ; IS COLOR ALREADY AVAILABLE?
A284  1008 ^A28E          BPL     :GP030          ;  YES.
A286  ADB805              LDA     PENCOL          ; NO -- FIND VACANT SLOT FOR NEW COLOR.
A289  20DEA4              JSR     CASSGN
A28C  D01A ^A2A8          BNE     :GP099          ; NO FREE SLOTS.
A28E  8A          :GP030  TXA                     ; MERGE PEN UP/DOWN STATUS WITH ...
      = 0000              IF      FALSE
   -                      EOR     PEN             ; ... NEW PIXEL VALUE.
   -                      AND     #$7F
   -                      EOR     PEN
                          ENDIF
A28F  8D1305              STA     PEN
A292  60                  RTS
A293  8A          :GP040  TXA
A294  F0F8 ^A28E          BEQ     :GP030          ; 'ERASE'.
A296  1007 ^A29F          BPL     :GP050          ; 'DOWN'.
A298  0D1305              ORA     PEN             ; 'UP'.
A29B  8D1305              STA     PEN
A29E  60                  RTS
A29F  AD1305      :GP050  LDA     PEN             ; 'DOWN'.
A2A2  297F                AND     #$FF-PCUP
A2A4  8D1305              STA     PEN
A2A7  60          :GP090  RTS
A2A8  4C3A7A      :GP099  JMP     PSTOP
A2AB  A592        GPU     LDA     EXEC            ;  PEN UP.
A2AD  F0F8 ^A2A7          BEQ     :GP090
A2AF  A280                LDX     #PCUP
A2B1  4C93A2              JMP     :GP040
A2B4  A592        GPD     LDA     EXEC            ; PEN DOWN.
A2B6  F0EF ^A2A7          BEQ     :GP090
A2B8  A240                LDX     #PCDN
A2BA  4C93A2              JMP     :GP040
A2BD  A592        GPE     LDA     EXEC            ; PEN ERASE.
A2BF  F0E6 ^A2A7          BEQ     :GP090
A2C1  A200                LDX     #0
A2C3  4C93A2              JMP     :GP040
A2C6                      PROC
                  ;
                  ; GBACK -- GRAPHICS 'BACKGROUND' SUBCOMMAND
                  ;
A2C6  2096A4      GBACK   JSR     CLRMAT          ; SEE IF COLOR MATCH.
A2C9  D014 ^A2DF          BNE     :GB099          ; NO -- ERROR.
A2CB  B010 ^A2DD          BCS     :GB092          ; JIF 'UP', 'DOWN' OR 'ERASE'.
A2CD  8DB805              STA     PENCOL          ; YES -- SAVE COLOR VALUE.
A2D0  A592                LDA     EXEC            ; EXECUTE MODE?
A2D2  F008 ^A2DC          BEQ     :GB090          ; NO.
A2D4  A200                LDX     #0              ; INDEX FOR BACKGROUND.
A2D6  ADB805              LDA     PENCOL          ; COLOR REGISTER VALUE.
A2D9  20F7A4              JSR     SETCLR          ; SET 'PNCLRS' AND COLOR REGISTER.
A2DC  60          :GB090  RTS
A2DD  A902        :GB092  LDA     #IMPERR         ; OPERAND ERROR.
A2DF  4C3A7A      :GB099  JMP     PSTOP
A2E2                      PROC
                  ;
                  ; GCHNGE -- GRAPHICS 'CHANGE' SUBCOMMAND
                  ;
A2E2  2096A4      GCHNGE  JSR     CLRMAT          ; GET "FROM" OPERAND.
A2E5  D030 ^A317          BNE     :GC099          ; ERROR.
A2E7  B023 ^A30C          BCS     :GC092          ; 'UP', 'DOWN' OR 'ERASE' INVALID.
A2E9  A592                LDA     EXEC            ; EXECUTE MODE?
A2EB  F003 ^A2F0          BEQ     :GC020          ; NO.
A2ED  8A                  TXA                     ; SEE IF "FROM" COLOR EXISTS.
A2EE  301C ^A30C          BMI     :GC092          ; NO -- ERROR.
A2F0  8EB705      :GC020  STX     PENNUM          ; YES -- SAVE PEN NUMBER.
A2F3  20079F              JSR     SKPSEP
A2F6  2096A4              JSR     CLRMAT          ; GET "TO" COLOR OPERAND.
A2F9  D01C ^A317          BNE     :GC099          ; ERROR.
A2FB  B00F ^A30C          BCS     :GC092          ; 'UP', 'DOWN' OR 'ERASE' INVALID.
A2FD  E0FF                CPX     #$FF            ; CHECK FOR DOUBLE ASSIGN AFTER CHG
A2FF  D010 ^A311          BNE     :GC094          ; DOUBLE ASSIGN -- ERROR.
A301  A692                LDX     EXEC            ; EXECUTE MODE?
A303  F006 ^A30B          BEQ     :GC090          ; NO.
A305  AEB705              LDX     PENNUM          ; GET PEN NUMBER.
A308  20F7A4              JSR     SETCLR          ; SET 'PNCLRS' AND COLOR REGISTER
A30B  60          :GC090  RTS
A30C  A902        :GC092  LDA     #IMPERR         ; INVALID OPERAND.
A30E  4C3A7A              JMP     PSTOP
A311  A592        :GC094  LDA     EXEC            ; NO PROBLEM IF NOT EXECUTE.
A313  F0F6 ^A30B          BEQ     :GC090
A315  A926                LDA     #DCAERR         ; DOUBLE ASSIGN.
A317  4C3A7A      :GC099  JMP     PSTOP
A31A                      PROC
                  ;
                  ; GSHADE -- GRAPHICS 'SHADE' SUBCOMMAND.
                  ;
A31A  2096A4      GSHADE  JSR     CLRMAT          ; MATCH OPERAND.
A31D  D031 ^A350          BNE     :GS099          ; NO MATCH.
A31F  B02A ^A34B          BCS     :GS092          ; 'UP', 'DOWN' OR 'ERASE'.
A321  8DB805              STA     PENCOL          ; SAVE PEN COLOR.
A324  A592                LDA     EXEC            ; EXECUTE MODE?
A326  F022 ^A34A          BEQ     :GS090          ; NO.
A328  8A                  TXA
A329  1008 ^A333          BPL     :GS030          ; COLOR ASSIGNED.
A32B  ADB805              LDA     PENCOL
A32E  20DEA4              JSR     CASSGN          ; COLOR NOT ASSIGNED -- DO SO.
A331  D01D ^A350          BNE     :GS099          ; NO FREE SLOT.
A333  8E9B05      :GS030  STX     FCOLOR          ; SAVE FILL COLOR.
A336  205EAC              JSR     GREAD           ; CHECK FOR IN BOUNDS.
A339  B00F ^A34A          BCS     :GS090          ; TURTLE OUT OF BOUNDS.
A33B  84AB                STY     XTEMP
A33D  2098AF              JSR     FLOOD           ; SHADE THE AREA.
A340  A03E                LDY     #GX1-DTAB       ; RESTORE VISIBLE TURTLE TO PROPER
A342  20FFAB              JSR     SETCUR
A345  209FAA              JSR     CNVRT
A348  A4AB                LDY     XTEMP
A34A  60          :GS090  RTS
A34B  8A          :GS092  TXA
A34C  F0E5 ^A333          BEQ     :GS030          ; 'ERASE' OK.
A34E  A902                LDA     #IMPERR
A350  4C3A7A      :GS099  JMP     PSTOP
A353                      PROC
                  ;
                  ; GWALL -- WALL SUBCOMMAND PROCESSOR.
                  ;
A353  A212        GWALL   LDX     #WLTABX         ; 'NONE'?
A355  20AB7C              JSR     SBCMAT
A358  D00D ^A367          BNE     :GW010          ; NO.
A35A  A592                LDA     EXEC            ; EXECUTE MODE?
A35C  F008 ^A366          BEQ     :GW009          ; NO.
A35E  A900                LDA     #0              ; YES -- CLEAR WALLS.
A360  8DCD05              STA     WALLS
A363  8DCE05              STA     WALLS+1
A366  60          :GW009  RTS
A367  2096A4      :GW010  JSR     CLRMAT          ; PEN/COLOR SELECTION?
A36A  D020 ^A38C          BNE     :GW092          ; NO.
A36C  B01E ^A38C          BCS     :GW092          ; YES -- JIF 'UP', 'DOWN' OR 'ERASE'.
A36E  A592                LDA     EXEC            ; EXECUTE MODE?
A370  F019 ^A38B          BEQ     :GW090          ; NO.
A372  8A                  TXA
A373  3017 ^A38C          BMI     :GW092          ; COLOR NOT ASSIGNED TO A PEN.
A375  F015 ^A38C          BEQ     :GW092          ; BACKGROUND CAN'T BE A WALL.
A377  0A                  ASL     A
A378  AA                  TAX
A379  BD3EAC              LDA     WMASK,X
A37C  0DCD05              ORA     WALLS
A37F  8DCD05              STA     WALLS
A382  BD3FAC              LDA     WMASK+1,X
A385  0DCE05              ORA     WALLS+1
A388  8DCE05              STA     WALLS+1
A38B  60          :GW090  RTS
A38C  A902        :GW092  LDA     #IMPERR
A38E  4C3A7A              JMP     PSTOP
A391                      PROC
                  ;
                  ; GEXIT -- GRAPHICS 'QUIT' SUBCOMMAND.
                  ;
A391  A592        GEXIT   LDA     EXEC            ; EXECUTE MODE?
A393  F00A ^A39F          BEQ     :GE090          ; NO.
A395  84AB                STY     XTEMP
A397  2074B3              JSR     RBTOFF          ; 'ROBOT TURTLE' OFF.
A39A  20F494              JSR     TXOPEN          ; OPEN TEXT MODE SCREEN.
A39D  A4AB                LDY     XTEMP
A39F              GHM090
A39F              GCL090
A39F  60          :GE090  RTS
A3A0                      PROC
                  ;
                  ; GCLEAR -- GRAPHICS 'CLEAR' SUBCOMMAND.
                  ;
                  ; *** CALLED BY 'XRUN' TOO ***
A3A0  A592        GCLEAR  LDA     EXEC            ; EXECUTE MODE?
A3A2  F0FB ^A39F          BEQ     GCL090          ; NO.
A3A4  A900                LDA     #0              ; TO AVOID ERROR $80 IF CURSOR AT LOWER ...
A3A6  8554                STA     ROWCRS          ; ... RIGHT CORNER OF SCREEN.
A3A8  A97D                LDA     #CLEAR          ; YES -- CLEAR GRAPHICS SCREEN ...
A3AA  4C8097              JMP     TOUT            ; ... & RETURN.
A3AD                      PROC
                  ;
                  ; GCLRPN -- GRAPHICS 'CLEARPENS'.
                  ;
A3AD  A592        GCLRPN  LDA     EXEC            ; EXECUTE MODE?
A3AF  F0EE ^A39F          BEQ     GCL090          ; NO.
A3B1  A901                LDA     #1              ; YES -- CLEAR PEN SELECTS.
A3B3  8DBA05              STA     NXTCLR
A3B6  60                  RTS
A3B7                      PROC
                  ; GHOME -- TURTLE HOME
A3B7  A592        GHOME   LDA     EXEC            ; EXECUTE MODE?
A3B9  F0E4 ^A39F          BEQ     GHM090          ; NO.
A3BB  A900                LDA     #0              ; YES -- SET TURTLE X & Y TO ZERO.
A3BD  85E6                STA     GXNEW
A3BF  85E7                STA     GXNEW+1
A3C1  85E9                STA     GYNEW
A3C3  85EA                STA     GYNEW+1
A3C5  A906                LDA     #GOTO
A3C7  8DD405              STA     GROPR           ; GOTO TYPE.
A3CA  4CDFA1              JMP     GGT030
A3CD                      PROC
                  ; GNORTH -- TURTLE NORTH
A3CD  A592        GNORTH  LDA     EXEC            ; EXECUTE MODE?
A3CF  F009 ^A3DA          BEQ     :GN090          ; NO,.
A3D1  A900                LDA     #0              ; YES -- SET THETA TO ZERO.
A3D3  85F2                STA     THETA
A3D5  85F3                STA     THETA+1
A3D7  2096AB              JSR     MOD360
A3DA  60          :GN090  RTS
A3DB                      PROC
                  ;
                  ; GEDGE -- 'EDGE' SUBCOMMAND
                  ;
A3DB  A20E        GEDGE   LDX     #EDTABX         ; 'FREE', 'HALT', WRAP', OR 'BOUNCE'.
A3DD  20AB7C              JSR     SBCMAT
A3E0  D016 ^A3F8          BNE     :GE099          ; NO MATCH.
A3E2  A592                LDA     EXEC            ; EXECUTE MODE?
A3E4  F011 ^A3F7          BEQ     :GE090          ; NO.
A3E6  8E5E05              STX     EDGRUL          ; YES -- SET RULE SELECT.
A3E9  E008                CPX     #EFREE          ; RULE = FREE?
A3EB  F00A ^A3F7          BEQ     :GE090          ; YES.
A3ED  A26C                LDX     #GX-DTAB        ; TURTLE IN SCREEN BOUNDS?
A3EF  200DAB              JSR     INTEST
A3F2  F003 ^A3F7          BEQ     :GE090          ; YES.
A3F4  20B7A3              JSR     GHOME           ; NO -- SEND TURTLE HOME.
A3F7  60          :GE090  RTS
A3F8  4C3A7A      :GE099  JMP     PSTOP
A3FB                      PROC
                  ; GTURTL -- TURTLE ON/OFF
A3FB  A20A        GTURTL  LDX     #ONOFFX         ; EXPECT 'ON' OR 'OFF'
A3FD  20AB7C              JSR     SBCMAT
A400  D014 ^A416          BNE     :GT100          ; NO MATCH - SEE IF COLOR.
A402  A592                LDA     EXEC            ; EXECUTE MODE?
A404  F00A ^A410          BEQ     :GT090          ; NO.
A406  8E4F05      :GT020  STX     TRTLON          ; YES -- SET TURTLE FLAG.
A409  84AB                STY     XTEMP           ; SAVE INDEX.
A40B  200CA6              JSR     TRONOF          ; DEAL WITH TURTLE REP.
A40E  A4AB                LDY     XTEMP           ; RESTORE INDEX.
A410  60          :GT090  RTS
A411  A902        :GT092  LDA     #IMPERR
A413  4C3A7A      :GT099  JMP     PSTOP
A416  2096A4      :GT100  JSR     CLRMAT          ; COLOR SELECTION?
A419  D0F8 ^A413          BNE     :GT099          ; NO -- ERROR.
A41B  B0F4 ^A411          BCS     :GT092          ; JIF 'UP', 'DOWN', OR 'ERASE'.
A41D  A692                LDX     EXEC            ; EXECUTE MODE?
A41F  F0EF ^A410          BEQ     :GT090          ; NO.
A421  8DC405              STA     TRTCOL          ; YES -- UPDATE TURTLE COLOR.
A424  D0E0 ^A406          BNE     :GT020          ; (BRA) WITH X <> 0.
A426                      PROC
                  ;
                  ; XSETP -- 'SETPEN' COMMAND PROCESSOR
                  ; XSETL -- 'SETLET' COMMAND PROCESSOR
                  ;
A426  F012 ^A43A  XSETL   BEQ     :SP010          ; SYNTAX SCAN ONLY.
A428  20BB96              JSR     TSTMOD          ; LETTERS MEDIUM OR LARGE?
A42B  C902                CMP     #TXML
A42D  D064 ^A493          BNE     :SP094          ; NO -- ERROR.
A42F  F009 ^A43A          BEQ     :SP010          ; (BRA) TO COMMON CODE.
A431  F007 ^A43A  XSETP   BEQ     :SP010          ; SYNTAX SCAN ONLY.
A433  20BB96              JSR     TSTMOD          ; GRAPHICS MODE?
A436  290C                AND     #GRSS+GRFS
A438  F059 ^A493          BEQ     :SP094          ; NO -- ERROR.
A43A  20BDA4      :SP010  JSR     CLM040          ; GET PEN NUMBER.
A43D  D050 ^A48F          BNE     :SP090          ; ERROR.
A43F  8EB705              STX     PENNUM          ; SAVE PEN NUMBER.
A442  20079F              JSR     SKPSEP          ; SEE IF ALPHA -- IF SO CALL CLRMAT
A445  B180                LDA     (INLN),Y
A447  20919E              JSR     CLETTR          ; ALPHA CHARACTER?
A44A  B00D ^A459          BCS     :SP012          ; NO -- SHOULD BE NEXP.
A44C  2096A4              JSR     CLRMAT          ; YES -- SEE IF COLOR NAME?
A44F  D03E ^A48F          BNE     :SP090          ; NO -- ERROR.
A451  B03D ^A490          BCS     :SP092          ; NO -- 'UP', 'DOWN' OR 'ERASE'.
A453  A692                LDX     EXEC            ; EXECUTE MODE?
A455  F038 ^A48F          BEQ     :SP090          ; NO.
A457  902E ^A487          BCC     :SP030          ; VALID COLOR.
A459  20D49F      :SP012  JSR     EXP             ; GET HUE VALUE.
A45C  A592                LDA     EXEC            ; EXECUTE MODE?
A45E  F010 ^A470          BEQ     :SP020          ; NO.
A460  A594                LDA     EXPSTK+1
A462  D02C ^A490          BNE     :SP092          ; OUT OF RANGE. #
A464  A593                LDA     EXPSTK
A466  C910                CMP     #$10
A468  B026 ^A490          BCS     :SP092          ; OUT OF RANGE.
A46A  0A                  ASL     A               ; JUSTIFY THE HUE VALUE.
A46B  0A                  ASL     A
A46C  0A                  ASL     A
A46D  0A                  ASL     A
A46E  85AB                STA     XTEMP           ; SAVE ADJUSTED VALUE.
A470  20079F      :SP020  JSR     SKPSEP
A473  20D49F              JSR     EXP             ; GET LUM VALUE.
A476  A592                LDA     EXEC            ; EXECUTE MODE?
A478  F015 ^A48F          BEQ     :SP090          ; NO.
A47A  A594                LDA     EXPSTK+1
A47C  D012 ^A490          BNE     :SP092          ; OUT OF RANGE.
A47E  A593                LDA     EXPSTK
A480  C908                CMP     #8
A482  B00C ^A490          BCS     :SP092          ; OUT OF RANGE.
A484  0A                  ASL     A               ; X2.
A485  05AB                ORA     XTEMP           ; MERGE HUE WITH LUM.
A487  AEB705      :SP030  LDX     PENNUM          ; GET PEN NUMBER.
A48A  20F7A4              JSR     SETCLR          ; SET 'PNCLRS' AND COLOR REGISTER.
A48D  A900                LDA     #0              ; SET CC FOR NORMAL RETURN.
A48F  60          :SP090  RTS                     ; RETURN WITH CC SET.
A490  A902        :SP092  LDA     #IMPERR
A492  60                  RTS
A493  A983        :SP094  LDA     #NRCERR
A495  60                  RTS
A496                      PROC
                  ;
                  ; CLRMAT -- COLOR MATCHER
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'INLN' = POINTER TO STATEMENT.
                  ;       Y = STATEMENT INDEX.
                  ;
                  ;       JSR CLRNAT
                  ;       BNE ERROR
                  ;
                  ;       C = 1 INDICATES X = 'PCUP', 'PCDN' OR 0.
                  ;       C = 0 INDICATES A = COLOR REGISTER VALUE.
                  ;                       X = -1 IF NOT IN 'PNCLRS', OR
                  ;                       X = PIXEL VALUE ('PNCLRS' SLOT #).
                  ;
A496  A206        CLRMAT  LDX     #PCTABX         ; MATCH OPERAND.
A498  20AB7C              JSR     SBCMAT
A49B  D020 ^A4BD          BNE     :CM040          ; NO MATCH -- SEE IF NEXP
A49D  E080                CPX     #PCUP           ; CHECK FOR 'UP', 'DOWN', OR 'ERASE'.
A49F  F038 ^A4D9          BEQ     :CM080          ; 'UP'.
A4A1  E040                CPX     #PCDN           ; 'DOWN'.
A4A3  F034 ^A4D9          BEQ     :CM080
A4A5  8A                  TXA
A4A6  F031 ^A4D9          BEQ     :CM080          ; 'ERASE'.
A4A8  A200                LDX     #0              ; SEARCH 'PNCLRS' FOR VALUE PATCH.
A4AA  E8          :CM010  INX
A4AB  ECBA05              CPX     NXTCLR
A4AE  B007 ^A4B7          BCS     :CM020          ; END OF VALID ENTRIES.
A4B0  DDBB05              CMP     PNCLRS,X        ; COLOR VALUE MATCH?
A4B3  D0F5 ^A4AA          BNE     :CM010          ; NO.
A4B5  18                  CLC                     ; YES -- INDICATF COLOR VALUE O.K.
A4B6  60                  RTS                     ; RETURN WITH CC SET.
A4B7  A2FF        :CM020  LDX     #$FF            ;  INDICATE NOT FOUND.
A4B9  E0FF                CPX     #$FF            ; SET CC.
A4BB  18                  CLC                     ; INDICATE COLOR VALUE O.K.
A4BC  60                  RTS                     ; RETURN WITH CC SET.
                  ; *** EXTERNAL ENTRY POINT FROM 'XSETP' & ' XSETL ' ***
A4BD              :CM040
A4BD  20D49F      CLM040  JSR     EXP             ; PROCESS AS A NUMERIC EXPRESSION.
A4C0  A592                LDA     EXEC            ; EXECUTE MODE?
A4C2  F00D ^A4D1          BEQ     :CM050          ; NO.
A4C4  A694                LDX     EXPSTK+1
A4C6  D013 ^A4DB          BNE     :CM092          ; OUT OF RANGE.
A4C8  A693                LDX     EXPSTK
A4CA  ECB905              CPX     NCOLRS          ; IS VALUE IN RANGE?
A4CD  F002 ^A4D1          BEQ     :CM050          ; YES.
A4CF  B00A ^A4DB          BCS     :CM092          ; NO.
A4D1  BDBB05      :CM050  LDA     PNCLRS,X        ; YES -- GET COLOR VALUE.
A4D4  DDBB05              CMP     PNCLRS,X        ; SET CC FOR EXIT.
A4D7  18                  CLC                     ; INDICATE PEN NUMBER O.K.
A4D8  60                  RTS                     ; RETURN WITH CC SET.
A4D9  38          :CM080  SEC                     ; X = 'PCUP' OR 'PCDN' OR 0.
A4DA  60                  RTS                     ; RETURN WITH CC SET.
A4DB  A902        :CM092  LDA     #IMPERR         ; OUT OF RANGE PEN NUMBER.
A4DD  60                  RTS
A4DE                      PROC
                  ;
                  ; CASSGN -- COLOR ASSIGNMENT
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = COLOR REGISTER VALUE
                  ;       GSMODE = GRAPHICS MODE
                  ;       NXTCLR = NEXT AVAILABLE SLOT NUMBER
                  ;       NCOLRS = LAST SLOT NUMBER
                  ;
                  ;       JSR     CASSGN
                  ;       BNE     ERROR
                  ;
                  ;       X = PEN NUMBER
                  ;
A4DE  AEBA05      CASSGN  LDX     NXTCLR          ; GET NEXT SLOT NUMBER.
A4E1  ECB905              CPX     NCOLRS          ; USEABLE SLOT?
A4E4  F002 ^A4E8          BEQ     :CN005          ; YES.
A4E6  B00C ^A4F4          BCS     :CN092          ; NO MORE SLOTS.
A4E8  20F7A4      :CN005  JSR     SETCLR          ; ASSIGN COLOR TO PEN & COLOR REG.
A4EB  AEBA05              LDX     NXTCLR
A4EE  EEBA05              INC     NXTCLR
A4F1  A900                LDA     #0              ; SET CC FOR NORMAL EXIT.
A4F3  60                  RTS
A4F4  A925        :CN092  LDA     #NMCERR         ; NO MORE PEN SLOTS.
A4F6  60                  RTS
A4F7                      PROC
                  ;
                  ; SETCLR -- SET COLOR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = COLOR REGISTER VALUE.
                  ;       X = PEN NUMBER (PIXEL VALUE).
                  ;       GSMODE = GRAHICS MODE.
                  ;
                  ;       JSR     SETCLR
                  ;
A4F7  9DBB05      SETCLR  STA     PNCLRS,X        ; FIRST SET PIXEL VAL IN TABLE.
A4FA  8CCB05              STY     SCTEMP
A4FD  48                  PHA                     ; SAVE COLOR VALUE.
A4FE  8A                  TXA                     ; PIXEL VALUE TO Y REGISTER.
A4FF  A8                  TAY
A500  AD3705              LDA     GSMODE
A503  0A                  ASL     A               ; X2
A504  AA                  TAX
A505  BD60BA              LDA     COLADR,X        ; GET POINTER TO REGISTER SET.
A508  85F4                STA     FSTACK
A50A  BD61BA              LDA     COLADR+1,X
A50D  85F5                STA     FSTACK+1
A50F  B1F4                LDA     (FSTACK),Y      ; GET COLOR REGISTER INDEX.
A511  AA                  TAX
A512  68                  PLA
A513  9DC002              STA     PCOLR0,X        ; STORE COLOR VALUE TO REGISTER.
A516  ACCB05              LDY     SCTEMP
A519  60                  RTS
A51A                      PROC
                  ;
                  ; PRCLNM -- FIND AND FRINT COLOR NAME
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = INDEX TO 'PNCLRS'
                  ;
                  ;       JSR     PRCLNM
                  ;
A51A  BDBB05      PRCLNM  LDA     PNCLRS,X        ; GET COLOR REGISTER VALUE.
A51D  85A9                STA     TEMP2+2
A51F  8ECC05              STX     PRTEMP          ; SAVE X REGISTER.
A522  A2FF                LDX     #-1             ; SETUP TO SCAN THE NAME TABLE.
A524  E8          :PC010  INX
A525  86A8                STX     TEMP2+1         ; SAVE INDEX TO START OF NAME.
A527  BD707F      :PC015  LDA     PCTAB,X         ; GET A CHARACTER.
A52A  F016 ^A542          BEQ     :PC080          ; END OF TABLE -- NO MATCH.
A52C  3003 ^A531          BMI     :PC020          ; FOUND THE # SB' BYTE.
A52E  E8                  INX                     ; STILL INSIDE THE NAME.
A52F  D0F6 ^A527          BNE     :PC015          ; (BRA).
A531  E8          :PC020  INX                     ; BUMP TO THE VALUE BYTE.
A532  BD707F              LDA     PCTAB,X         ; GET THE VALUE.
A535  C5A9                CMP     TEMP2+2         ; IS THIS THE ONE WE ARE LOOKING FOR?
A537  D0EB ^A524          BNE     :PC010          ; NO.
A539  A6A8                LDX     TEMP2+1         ; YES -- GET INDEX TO NAME.
A53B  204FA5              JSR     PRNTCL          ; PRINT COLOR NAME.
A53E  AECC05              LDX     PRTEMP          ; RESTORE X REGISTER.
A541  60                  RTS
A542  A900        :PC080  LDA     #0              ; NO NAME -- PRINT THE NUMERIC VALUE.
A544  85AA                STA     TEMP2+3         ; ZERO THE MSB FIRST.
A546  A229                LDX     #TEMP2+2-DTAB   ; POINT TO NUMBER.
A548  20149E              JSR     DECASC
A54B  AECC05              LDX     PRTEMP          ; RESTORE X REGISTER.
A54E  60                  RTS
A54F                      PROC
                  ;
                  ; PRNTCL -- PRINT COLOR NAME FROM NAME TABLE.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = INDEX TO FIRST CHARACTER OF COLOR NAME.
                  ;
                  ;       JSR     PRNTCL
                  ;
                  ;       X = INDEX TO NAME DELIMITER.
                  ;
A54F  BD707F      PRNTCL  LDA     PCTAB,X         ; GET A CHARACTER.
A552  3006 ^A55A          BMI     :PC090          ; DELIMITER.
A554  208294              JSR     CHOT
A557  E8                  INX
A558  D0F5 ^A54F          BNE     PRNTCL          ; (BRA).
A55A  60          :PC090  RTS
A55B                      PROC
A55B  A26C        TRTPLC  LDX     #GX-DTAB        ; TURTLE IN BOUNDS?
A55D  200DAB              JSR     INTEST
A560  F008 ^A56A          BEQ     :TR090          ; YES.
A562  A9FF                LDA     #-1             ; NO -- SET FLAG.
A564  8DD005              STA     GCOL+1
A567  206BA5              JSR     CLRTRT          ; CLEAR OLD TURTLE.
A56A  60          :TR090  RTS
A56B  AE5F05      CLRTRT  LDX     TRYPOS          ; GET OLD POSITION.
A56E  A00E                LDY     #VTHITE
A570  A900                LDA     #0
A572  9D0577      :TP020  STA     TRBUFF,X        ; REMOVE OLD REPRESENTATION.
A575  E8                  INX
A576  88                  DEY
A577  D0F9 ^A572          BNE     :TP020
A579  60                  RTS
A57A                      PROC
                  ;
                  ; TRTLOC -- PLACE VISIBLE TURTLE (AT NEW LOC).
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'TUFLAG'      = 0 IF GCOL & GROW O.K.
                  ;       'TRTLON'      = 0 IF OFF, ELSE ON.
                  ;       'GSMODE'      = GRAPHICS SCREEN MODE.
                  ;       'THETA'       = TURTLE ANGLE.
                  ;       'GCOL'        = TURTLE X POSITION.
                  ;       'GROW'        = TURTLE Y POSITION.
                  ;
                  ;       JSR     TRTLOC
                  ;
A57A  AD4F05      TRTLOC  LDA     TRTLON          ; TURTLE ON?
A57D  F061 ^A5E0          BEQ     :TP100          ; NO.
A57F  ADD905              LDA     TUFLAG          ; ARE FARMS VALID?
A582  D05C ^A5E0          BNE     :TP100          ; NOT NECESSARILY.
A584  ADD005              LDA     GCOL+1          ; IN SCREEN BOUND?
A587  3057 ^A5E0          BMI     :TP100          ; NO.
A589  206BA5              JSR     CLRTRT          ; CLEAR OLD TURTLE.
A58C  2039A6              JSR     DUMCAL          ; CALCULATE ORIENTATION.
                  ; CONVERT CURSOR X TO COLOR CLOCKS.
A58F  AE3705              LDX     GSMODE          ; SCREEN MODE DEPENDENT
A592  BC9CB8              LDY     CCPXTB,X        ; GET # OF COLOR CLOCKS PER X UNIT
A595  F00C ^A5A3          BEQ     :TP040          ; ZERO INDICATES 1/2 CLOCK.
A597  98                  TYA                     ; START WITH 1/2 POSITION OFFSET.
A598  18                  CLC
A599  6A                  ROR     A
A59A  18                  CLC
A59B  6DCF05      :TP030  ADC     GCOL            ; NOW DO MULTIPLY.
A59E  88                  DEY
A59F  D0FA ^A59B          BNE     :TP030
A5A1  F008 ^A5AB          BEQ     :TP050          ; (BRA).
A5A3  ADD005      :TP040  LDA     GCOL+1          ; DIVIDE BY 2 (1/2 COLOR CLOCK).
A5A6  6A                  ROR     A
A5A7  ADCF05              LDA     GCOL
A5AA  6A                  ROR     A
A5AB  18          :TP050  CLC
A5AC  6930                ADC     #$30            ; LEFT EDGE OFFSET.
A5AE  AC6005              LDY     ORIENT          ; SUBTRACT ORIENTATION OFFSET.
A5B1  38                  SEC
A5B2  F9F8B8              SBC     TRDX,Y
A5B5  18                  CLC
A5B6  8D03D0              STA     HPOS0+3         ; RESULT IS PLAYER3 HORIZONTAL POSITION.
                  ; CONVERT CURSOR Y TO SCAN LINES
A5B9  BCACB8              LDY     SLPYTB,X        ; GET #SC AN LINES PERR Y UNIT.
A5BC  98                  TYA                     ; START WITH 1/2 POSITION OFFSET.
A5BD  18                  CLC
A5BE  6A                  ROR     A
A5BF  18                  CLC
A5C0  6DD105      :TP060  ADC     GROW            ; MULTIPLY.
A5C3  88                  DEY
A5C4  D0FA ^A5C0          BNE     :TP060
A5C6  6915                ADC     #$15            ; *** MAGIC OFFSET ***
A5C8  AC6005              LDY     ORIENT          ; SUBTRACT ORIENTATION OFFSET.
A5CB  38                  SEC
A5CC  F9E0B8              SBC     TRDY,Y
A5CF  8D5F05              STA     TRYPOS          ; SAVE FOR NEXT TIME IN.
A5D2  AA                  TAX                     ; SETUP FOR THIS TIME.
A5D3  A000                LDY     #0
A5D5  B1F8        :TP090  LDA     (TRADDR),Y      ; MOVE PATTERN TO MISSILE BUFFER
A5D7  9D0577              STA     TRBUFF,X
A5DA  E8                  INX
A5DB  C8                  INY
A5DC  C00E                CPY     #VTHITE
A5DE  D0F5 ^A5D5          BNE     :TP090
A5E0  60          :TP100  RTS
A5E1                      PROC
                  ; TRTINI -- VISIBLE TURTLE INITIALIZATION.
A5E1              TRTINI
A5E1  A2FD                LDX     #253            ; CLEAR TURTLE REPRESENTATION BUFFER.
A5E3  A900                LDA     #0
A5E5  8D5F05              STA     TRYPOS
A5E8  8DD905              STA     TUFLAG          ; INITIALIZE TURTLE LOC. INTERLOCK.
A5EB  8D0BD0              STA     SIZEP3          ; PLAYER SIZE.
A5EE  9D0277      :TI010  STA     TPBUFF+2,X
A5F1  CA                  DEX
A5F2  D0FA ^A5EE          BNE     :TI010
A5F4  A208                LDX     #8              ; INITIALIZE PLAYER/MISSILE HARDWARE.
A5F6  9DFFCF      :TI020  STA     HPOS0-1,X       ; SET ALL HORIZONTAL POSITION TO ZERO
A5F9  CA                  DEX
A5FA  D0FA ^A5F6          BNE     :TI020
A5FC  A901                LDA     #1              ; SET PRIORITY.
A5FE  8D6F02              STA     GPRIOR
A601  A970                LDA     # HIGH [TPBUFF-$700]    ; PLAYER/MISSILE BASE ADDRESS
A603  8D07D4              STA     PMBASE
A606  A902                LDA     #$02            ; DEFAULT TURTLE COLOR.
A608  8DC405              STA     TRTCOL
A60B  60                  RTS
A60C                      PROC
                  ; TRONOF -- MISSILE DMA ON/OFF.
A60C  AD4F05      TRONOF  LDA     TRTLON          ; TURTLE ON?
A60F  F017 ^A628          BEQ     :TF050          ; NO.
A611  ADC405              LDA     TRTCOL          ; YES -- SET PLAYER COLOR REG.
A614  8DC302              STA     PCOLR0+3
A617  A902                LDA     #2
A619  8D1DD0              STA     GRACTL
A61C  AD2F02              LDA     DMACT           ; ENABLE PLAYER DMA (HIGH RESOLUTION
A61F  0918                ORA     #$18
A621  8D2F02              STA     DMACT
A624  8D00D4              STA     DMACTL
A627  60                  RTS
A628  AD2F02      :TF050  LDA     DMACT           ; PLAYER DMA OFF.
A62B  29E7                AND     #$E7
A62D  8D2F02              STA     DMACT
A630  A900                LDA     #0
A632  8D1DD0              STA     GRACTL
A635  8D10D0              STA     GRAFP3
A638  60                  RTS
A639                      PROC
A639  ADD205      DUMCAL  LDA     GANGLE          ; TRADDR := GANGLE.
A63C  85F8                STA     TRADDR
A63E  ADD305              LDA     GANGLE+1
A641  85F9                STA     TRADDR+1
A643  A000                LDY     #0
A645  A278                LDX     #TRADDR-DTAB
A647  A9F8                LDA     #-8
A649  20049D              JSR     DADDS
A64C  A5F9                LDA     TRADDR+1
A64E  3010 ^A660          BMI     :DC020
A650  C8          :DC010  INY
A651  A9F1                LDA     #-15
A653  20049D              JSR     DADDS
A656  A5F9                LDA     TRADDR+1
A658  10F6 ^A650          BPL     :DC010
A65A  C018                CPY     #24
A65C  9002 ^A660          BCC     :DC020
A65E  A000                LDY     #0
A660  8C6005      :DC020  STY     ORIENT
A663  A9B9                LDA     # HIGH VTURT    ; SETUP POINTER TO TURTLE REP.
A665  85F9                STA     TRADDR+1
A667  A910                LDA     # LOW VTURT
A669  85F8                STA     TRADDR
A66B  C000                CPY     #0
A66D  F00A ^A679          BEQ     :DC090
A66F  A278                LDX     #TRADDR-DTAB
A671  A90E        :DC030  LDA     #VTHITE         ; CALCULATE OFFSET.
A673  20049D              JSR     DADDS
A676  88                  DEY
A677  D0F8 ^A671          BNE     :DC030
A679  60          :DC090  RTS
A67A                      PROC
                  ;
                  ; LOWER LEVEL GRAPHICS UTILITIES
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'GX' & 'GY' = START COORDINATES.
                  ;       'GXNEW' & 'GYNEW' = END COORDINATES.
                  ;
                  ;       JSR     GMOVE
                  ;
                  ;       'GX' = 'GXNEW' = END COORDINATES.
                  ;       'GY' = 'GYNEW' = END COORDINATES.
                  ;
A67A  84E0        GMOVE   STY     LEND              ; SAVE Y REGISTER.
A67C  A20C                LDX     #12             ; VARIABLES OF 3 BYTES EACH.
A67E  B5E5        :GM010  LDA     GXNEW-1,X       ; MOVE COORDINATES TO WORKING VARIABLES
A680  2A                  ROL     A               ; PREPARE TO ROUND.
A681  B5E3                LDA     GXNEW-3,X       ; GET MIDDLE BYTE.
A683  6900                ADC     #0              ; ADO MSB OF FRACTION.
A685  95BB                STA     GX1-3,X
A687  B5E4                LDA     GXNEW-2,X       ; GET MSB.
A689  6900                ADC     #0              ; CONTINUE ROUNDING.
A68B  95BC                STA     GX1-2,X
A68D  A900                LDA     #0              ; NOW CLEAR FRACTION.
A68F  95BD                STA     GX1-1,X
A691  CA                  DEX
A692  CA                  DEX
A693  CA                  DEX
A694  D0E8 ^A67E          BNE     :GM010
                  ; *S*   LDA     #0
A696  8DDB05              STA     NOPLOT
A699  ADD405              LDA     GROPR           ; GOTO?
A69C  C906                CMP     #GOTO
A69E  F018 ^A6B8          BEQ     :GM10F          ; YES.
A6A0  2071AB              JSR     NEWDEL          ; CALCULATE SLOPE DELTA3.
A6A3  5003 ^A6A8          BVC     :GM005
A6A5  4C78A7              JMP     :GM041          ; OVERFLOW.
A6A8  ADD405      :GM005  LDA     GROPR
A6AB  C90A                CMP     #DRAWTO         ; 'DRAWTO'?
A6AD  F035 ^A6E4          BEQ     :GM012          ; YES.
A6AF  2910                AND     #$10            ; 'FILL' OR 'FILLTO'?
A6B1  F008 ^A6BB          BEQ     :GM011          ; NO -- 'DRAW' OR 'GO'.
A6B3  AD1305              LDA     PEN             ; PEN ERASE ON FILL?
A6B6  D003 ^A6BB          BNE     :GM011          ; NO.
A6B8  4CCEA7      :GM10F  JMP     :GM150
A6BB  AD5E05      :GM011  LDA     EDGRUL          ; FREE?
A6BE  C908                CMP     #EFREE
A6C0  F00A ^A6CC          BEQ     :GM11F          ; YES -- CLIP.
A6C2  A244                LDX     #GX2-DTAB       ; IS START POINT IN BOUNDS?
A6C4  200DAB              JSR     INTEST
A6C7  D01B ^A6E4          BNE     :GM012          ; NO -- CLIP.
A6C9  4CB4A7              JMP     :GM120          ; YES -- HALT, WRAP OR BOUNCE.
                  ; CHECK FOR LINE SEGMENT WITHIN SCREEN LIMITS
                  ; THE CLIPPING ALGORITHM USED HERE IS DESCRIBED IN SECTION 5-1 OF THE
                  ; SECOND EDITION OF "PRINCIPLES OF INTERACTIVE COMPUTER GRAPHICS" BY
                  ; NEWMAN & SPROULL.
A6CC  ADD405      :GM11F  LDA     GROPR           ; "GO"?
A6CF  C905                CMP     #GO
A6D1  D011 ^A6E4          BNE     :GM012          ; NO.
A6D3  AD5E05              LDA     EDGRUL          ; EDGE RULE = FREE?
A6D6  C908                CMP     #EFREE
A6D8  D00A ^A6E4          BNE     :GM012          ; NO.
A6DA  A23E                LDX     #GX1-DTAB       ; END POINT IN BOUNDS?
A6DC  200DAB              JSR     INTEST
A6DF  F003 ^A6E4          BEQ     :GM012          ; YES.
A6E1  EEDB05              INC     NOPLOT          ; NO -- DON'T PLOT END POINT.
A6E4  A23E        :GM012  LDX     #GX1-DTAB       ; TEST END POINT.
A6E6  200DAB              JSR     INTEST
A6E9  8D4905              STA     GNUMB           ; SAVE RESULT.
A6EC  A244                LDX     #GX2-DTAB       ; TEST START POINT.
A6EE  200DAB              JSR     INTEST
A6F1  8D4A05              STA     GNUMB+1         ; SAVE RESULT.
A6F4  2D4905              AND     GNUMB
A6F7  F003 ^A6FC          BEQ     :GM013          ; PART OF LIME MAY BE IN SCREEN.
A6F9  4CE0A7      :GMOVF  JMP     :GM157          ; NO PART OF LINE IS IN SCREEN.
A6FC  AD4905      :GM013  LDA     GNUMB
A6FF  0D4A05              ORA     GNUMB+1
A702  D003 ^A707          BNE     :GM014          ; PART OF LINE IS OFF THE SCREEN.
A704  4CAFA7              JMP     :GM110          ; ALL OF LINE IS IN SCREEN.
A707  A23E        :GM014  LDX     #GX1-DTAB       ; FIND AN INTERSECTION WITH AN EDGE.
A709  AD4905              LDA     GNUMB           ; IS X1,Y1 OUTSIDE SCREEN?
A70C  D005 ^A713          BNE     :GM016          ; YES.
A70E  A244                LDX     #GX2-DTAB       ; NO -- THEN X2,Y2 MUST BE.
A710  AD4A05              LDA     GNUMB+1
A713  48          :GM016  PHA                     ; SAVE INTERSECT STATUS.
A714  2908                AND     #ELEFT          ; LEFT EDGE INTERSECTION?
A716  F00C ^A724          BEQ     :GM020          ; NO.
A718  38                  SEC                     ; YES -- 'GACC' = LEFT EDGE X VALUE.
A719  A900                LDA     #0              ; 'GACC' = -XC.
A71B  ED6105              SBC     XC
A71E  85CE                STA     GACC
A720  A9FF                LDA     #-1
A722  D00D ^A731          BNE     :GM025          ; (BRA).
A724  68          :GM020  PLA                     ; GET STATUS.
A725  48                  PHA
A726  2904                AND     #ERIGHT         ; RIGHT EDGE INTERSECTION?
A728  F036 ^A760          BEQ     :GM030          ; NO.
A72A  AD6105              LDA     XC              ; YES -- 'GACC' = RIGHT EDGE
A72D  85CE                STA     GACC            ; 'GACC' = XC.
A72F  A900                LDA     #0
A731  85CF        :GM025  STA     GACC+1          ; EXTEND SIGN.
A733  A04E                LDY     #GACC-DTAB      ; GX1 OR GX2 = 'GACC'.
A735  20459A              JSR     DMOVI
A738  8A                  TXA                     ; GY1 OR GY2 = (GACC-GX) * DELY / DELX + GY.
A739  48                  PHA
A73A  A24E                LDX     #GACC-DTAB
A73C  A06C                LDY     #GX-DTAB
A73E  2057AF              JSR     RSUBI
A741  A04C                LDY     #DELY-DTAB
A743  205BAE              JSR     QMULT
A746  A04A                LDY     #DELX-DTAB
A748  20BEAE              JSR     QDIV
A74B  D02B ^A778          BNE     :GM041          ; OVERFLOW -- DON'T DRAW.
A74D  A06F                LDY     #GY-DTAB
A74F  2050AF              JSR     RADDI
A752  68                  PLA
A753  AA                  TAX
A754  A5CE                LDA     GACC
A756  9583                STA     DTAB+3,X
A758  A5CF                LDA     GACC+1
A75A  9584                STA     DTAB+4,X
A75C  68                  PLA                     ; CLEAR STACK.
A75D  4CE4A6              JMP     :GM012          ; KEEP THIS UP UNTIL LINE SEGMENT IS CLIPPED.
A760  68          :GM030  PLA                     ; GET STATUS.
A761  48                  PHA
A762  2902                AND     #EBOTOM         ; BOTTOM EDGE INTERSECTION?
A764  F00C ^A772          BEQ     :GM040          ; NO.
A766  38                  SEC                     ; YES -- 'GACC' = BOTTOM EDGE Y VALUE.
A767  A900                LDA     #0              ; 'GACC' = -YC.
A769  ED6305              SBC     YC
A76C  85CE                STA     GACC
A76E  A9FF                LDA     #-1
A770  D010 ^A782          BNE     :GM045          ; (BRA).
A772              :GM040
A772  68                  PLA                     ; GET STATUS.
A773  48                  PHA
A774  2901                AND     #ETOP           ; TOP EDGE INTERSECTION?
A776  D003 ^A77B          BNE     :GM042          ; YES.
A778  4CE0A7      :GM041  JMP     :GM157
A77B              :GM042
A77B  AD6305              LDA     YC              ; 'GACC' = TOP EDGE Y VALUE.
A77E  85CE                STA     GACC            ; 'GACC' = YC.
A780  A900                LDA     #0
A782  85CF        :GM045  STA     GACC+1          ; EXTEND SIGN.
A784  9584                STA     DTAB+4,X        ; GY1 OR GY2 = 'GACC'
A786  A5CE                LDA     GACC
A788  9583                STA     DTAB+3,X
A78A  8A                  TXA                     ; SAVE X REGISTER.
A78B  48                  PHA                     ; GX1 OR GX2 = (GACC - GY) * DELX / DELY + GX.
A78C  A24E                LDX     #GACC-DTAB
A78E  A06F                LDY     #GY-DTAB
A790  2057AF              JSR     RSUBI
A793  A04A                LDY     #DELX-DTAB
A795  205BAE              JSR     QMULT
A798  A04C                LDY     #DELY-DTAB
A79A  20BEAE              JSR     QDIV
A79D  D0D9 ^A778          BNE     :GM041          ; OVERFLOW. -- DON'T DRAW.
A79F  A06C                LDY     #GX-DTAB
A7A1  2050AF              JSR     RADDI
A7A4  68                  PLA
A7A5  AA                  TAX
A7A6  A04E                LDY     #GACC-DTAB
A7A8  20459A              JSR     DMOVI
A7AB  68                  PLA                     ; CLEAR THE STACK.
A7AC  4CE4A6              JMP     :GM012          ; KEEP THIS UP UNTIL LINE SEGMENT IS CLIPPED.
A7AF  2071AB      :GM110  JSR     NEWDEL          ; CALCULATE SLOPE DELTAS FOR CLIPPED LINF
A7B2  70C4 ^A778          BVS     :GM041          ; OVERFLOW.
A7B4  201CA8      :GM120  JSR     NEWDRW          ; DRAW LINE.
A7B7  ADD505              LDA     HITWLL          ; HIT WALL?
A7BA  D00C ^A7C8          BNE     :GM130          ; YES.
A7BC  ADD405              LDA     GROPR
A7BF  C90A                CMP     #DRAWTO         ; 'DRAWTO'?
A7C1  F01D ^A7E0          BEQ     :GM157          ; YES
A7C3  ADD605              LDA     HITEDG          ; HIT EDGE?
A7C6  F018 ^A7E0          BEQ     :GM157          ; NO.
A7C8  20E9A7      :GM130  JSR     SETCR2          ; SET CURSOR COORDINATES.
A7CB  4CE3A7              JMP     :GM160          ; (BRA).
                  ; GOTO
A7CE  A23E        :GM150  LDX     #GX1-DTAB       ; CHECK FOR POINT IN SCREEN.
A7D0  200DAB              JSR     INTEST
A7D3  D00B ^A7E0          BNE     :GM157          ; NOT IN SCREEN -- DON'T PLOT.
A7D5  A03E                LDY     #GX1-DTAB
A7D7  20FFAB              JSR     SETCUR          ; CONVERT TO HANDLER COORDINATES.
A7DA  209FAA              JSR     CNVRT
A7DD  2093AA              JSR     PLOT            ; PLOT POINT IF PEN DOWN.
A7E0  208CAB      :GM157  JSR     NEWCUR          ; ESTABLISH NEW CURSOR POSITION.
A7E3  205BA5      :GM160  JSR     TRTPLC          ; PLACE VISIBLE TURTLE
A7E6  A4E0                LDY     LEND              ; RESTORE Y REGISTER
A7E8  60                  RTS
A7E9  38          SETCR2  SEC                     ; GX := GCOL-XC.
A7EA  ADCF05              LDA     GCOL            ; GXNEW := SAME.
A7ED  ED6105              SBC     XC
A7F0  85EC                STA     GX
A7F2  85E6                STA     GXNEW
A7F4  ADD005              LDA     GCOL+1
A7F7  ED6205              SBC     XC+1
A7FA  85ED                STA     GX+1
A7FC  85E7                STA     GXNEW+1
A7FE  38                  SEC                     ; GY := YC-GROW
A7FF  AD6305              LDA     YC              ; GYNEW := SAME.
A802  EDD105              SBC     GROW
A805  85EF                STA     GY
A807  85E9                STA     GYNEW
A809  A900                LDA     #0
A80B  E900                SBC     #0
A80D  85F0                STA     GY+1
A80F  85EA                STA     GYNEW+1
A811  A900                LDA     #0              ; CLEAR FRACTION.
A813  85EE                STA     GX+2
A815  85F1                STA     GY+2
A817  85E8                STA     GXNEW+2
A819  85EB                STA     GYNEW+2
A81B  60                  RTS
A81C                      PROC
                  ;
                  ; NEWDRW -- LINE DRAW ROUTINE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       GX2,GY2 = START COORDINATE.
                  ;       GX1,GY1 = END COORDINATE.
                  ;       DELX,DELY DEFINES SLOPE OF LINE.
                  ;       PEN     = PIXEL VALUE.
                  ;       GSMODE  = SCREEN MODE.
                  ;       EDGRUL  = EDGE RULE IN EFFECT.
                  ;       GROPR   = OPERATION.
                  ;
                  ;       JSR     NEWDRW
                  ;
                  ;       HITWLL  = 0 IF NO WALL HIT
                  ;       HITEDG  = 0 IF NO EDGE HIT
                  ;       GCOL    = COL OF LAST DRAWN PIXEL
                  ;       GROW    = ROW OF LAST DRAWN PIXEL
                  ;
A81C  A044        NEWDRW  LDY     #GX2-DTAB     ; ROWCRS := YC - GY2.
A81E  20FFAB              JSR     SETCUR        ; COLCRS := GX2 + XC.
A821  209FAA              JSR     CNVRT
A824  A900                LDA     #0
A826  8DD705              STA     HALTFG
A829  8DD505              STA     HITWLL
A82C  8DD605              STA     HITEDG
A82F  ADD405              LDA     GROPR
A832  C905                CMP     #GO             ; 'GO'?
A834  F003 ^A839          BEQ     :DR020          ; YES -- DON'T PLOT START POINT.
A836  2093AA              JSR     PLOT            ; NO -- DRAW START POINT.
A839  A213        :DR020  LDX     #DELTAR-DTAB    ; DELTAR := ABS(DELY)
A83B  A04C                LDY     #DELY-DTAB
A83D  20459A              JSR     DMOVI
A840  20FF9C              JSR     DABSI
A843  A215                LDX     #DELTAC-DTAB    ; DELTAC := ABS(DELX)
A845  A04A                LDY     #DELX-DTAB
A847  20459A              JSR     DMOVI
A84A  20FF9C              JSR     DABSI
A84D  A213                LDX     #DELTAR-DTAB    ; IF DELTAR>DELTAC
A84F  A015                LDY     #DELTAC-DTAB
A851  20159C              JSR     DCMPI
A854  9028 ^A87E          BCC     :DR050
A856  A21E                LDX     #ENDPT-DTAB     ; THEN BEGIN.
A858  A013                LDY     #DELTAR-DTAB    ; ENDPT := DELTAR.
A85A  20459A              JSR     DMOVI
A85D  A21A                LDX     #COLAC-DTAB     ; COLAC := DELTAR/2.
A85F  20459A              JSR     DMOVI
A862  469B                LSR     COLAC+1
A864  669A                ROR     COLAC
A866  A900                LDA     #0              ; ROWAC := 0.
A868  8598                STA     ROWAC
A86A  8599                STA     ROWAC+1
A86C  A21C                LDX     #COUNTR-DTAB    ; COUNTR := ABS(GY1-GY2)
A86E  A041                LDY     #GY1-DTAB
A870  20459A              JSR     DMOVI
A873  A047                LDY     #GY2-DTAB
A875  20429C              JSR     DSUBI
A878  20FF9C              JSR     DABSI
A87B  4CA3A8              JMP     :DR060          ; END.
A87E  A21E        :DR050  LDX     #ENDPT-DTAB     ; ELSE BEGIN.
A880  A015                LDY     #DELTAC-DTAB    ; ENDPT := DELTAC.
A882  20459A              JSR     DMOVI
A885  A218                LDX     #ROWAC-DTAB     ; ROWAC := DELTAC/2.
A887  20459A              JSR     DMOVI
A88A  4699                LSR     ROWAC+1
A88C  6698                ROR     ROWAC
A88E  A900                LDA     #0              ; COLAC := 0.
A890  859A                STA     COLAC
A892  859B                STA     COLAC+1
A894  A21C                LDX     #COUNTR-DTAB    ; COUNTR := ABS(GX1-GX2).
A896  A03E                LDY     #GX1-DTAB
A898  20459A              JSR     DMOVI
A89B  A044                LDY     #GX2-DTAB
A89D  20429C              JSR     DSUBI
A8A0  20FF9C              JSR     DABSI           ; END.
A8A3  A59C        :DR060  LDA     COUNTR          ; IF COUNTR>0 THEN BEGIN.
A8A5  059D                ORA     COUNTR+1
A8A7  D003 ^A8AC          BNE     :DR60F
A8A9  4C30AA              JMP     :DR900
A8AC  A218        :DR60F  LDX     #ROWAC-DTAB     ; ROWAC := ROWAC + DELY.
A8AE  A04C                LDY     #DELY-DTAB
A8B0  20329C              JSR     DADDI
A8B3  A01E                LDY     #ENDPT-DTAB     ; IF ROWAC>=ENDPT THEN BEGIN.
A8B5  20229C              JSR     DSCMI
A8B8  9027 ^A8E1          BCC     :DR063
A8BA  20429C              JSR     DSUBI           ; ROWAC := ROWAC-ENDPT.
A8BD  C654                DEC     ROWCRS          ; ROWCRS := ROWCRS-1.
A8BF  A554                LDA     ROWCRS
A8C1  C9FF                CMP     #-1
A8C3  D065 ^A92A          BNE     :DR070
A8C5  8DD605              STA     HITEDG          ; SET EDGE HIT FLAG.
A8C8  AD5E05              LDA     EDGRUL          ; OFF TOP EDGE.
A8CB  C901                CMP     #EWRAP          ; WRAP?
A8CD  D007 ^A8D6          BNE     :DR061          ; NO -- MUST BE BOUNCE OR HALT.
A8CF  ADAB05              LDA     MAXROW          ; WRAP TO SCREEN BOTTOM EDGE.
A8D2  8554                STA     ROWCRS
A8D4  D054 ^A92A          BNE     :DR070          ; (BRA).
A8D6  E654        :DR061  INC     ROWCRS          ; BRING TURTLE BACK IN.
A8D8  C902                CMP     #EHALT          ; HALT?
A8DA  D030 ^A90C          BNE     :DR067          ; NO.
A8DC  8DD705              STA     HALTFG          ; YES -- SET FLAG.
A8DF  F049 ^A92A          BEQ     :DR070          ; (BRA).
A8E1  A599        :DR063  LDA     ROWAC+1         ; ELSE IF ROW AC < 0 THEN BEGIN.
A8E3  1045 ^A92A          BPL     :DR070
A8E5  20329C              JSR     DADDI           ; ROWAC := ROWAC + ENDPT.
A8E8  E654                INC     ROWCRS          ; ROWCRS := ROWCRS+1; END.
A8EA  ADAB05              LDA     MAXROW
A8ED  C554                CMP     ROWCRS
A8EF  B039 ^A92A          BCS     :DR070          ; ROWCRS <= MAXROW.
A8F1  8DD605              STA     HITEDG          ; SET EDGE HIT FLAG.
A8F4  AD5E05              LDA     EDGRUL          ; OFF BOTTOM EDGE.
A8F7  C901                CMP     #EWRAP          ; WRAP?
A8F9  D006 ^A901          BNE     :DR065          ; NO -- MUST BE BOUNCE OR HALT.
A8FB  A900                LDA     #0              ; WRAP TO SCREEN TOP EDGE.
A8FD  8554                STA     ROWCRS
A8FF  F029 ^A92A          BEQ     :DR070          ; (BRA).
A901  C654        :DR065  DEC     ROWCRS          ; BRING TURTLE BACK IN.
A903  C902                CMP     #EHALT          ; HALT?
A905  D005 ^A90C          BNE     :DR067          ; NO.
A907  8DD705              STA     HALTFG          ; YES -- SET FLAG.
A90A  F01E ^A92A          BEQ     :DR070          ; (BRA).
A90C  20F19C      :DR067  JSR     DNEGI           ; ROWAC:= ENDPT-ROWAC-1.
A90F  20329C              JSR     DADDI
A912  20129D              JSR     DDCRI
A915  38                  SEC                     ; THETA := THETA-180.
A916  A9B4                LDA     # LOW 180
A918  E5F2                SBC     THETA
A91A  85F2                STA     THETA
A91C  A900                LDA     # HIGH 180
A91E  E5F3                SBC     THETA+1
A920  85F3                STA     THETA+1
A922  2096AB              JSR     MOD360
A925  A24C                LDX     #DELY-DTAB      ; DELY != -DELY.
A927  20F19C              JSR     DNEGI
A92A  A21A        :DR070  LDX     #COLAC-DTAB     ; COLAC := COLAC+DELX.
A92C  A04A                LDY     #DELX-DTAB
A92E  20329C              JSR     DADDI
A931  A01E                LDY     #ENDPT-DTAB     ; IF COLAC >= ENOPT THEN BEGIN.
A933  20229C              JSR     DSCMI
A936  9035 ^A96D          BCC     :DR073
A938  20429C              JSR     DSUBI           ; COLAC := COLAC-ENDPT.
A93B  2043B2              JSR     INCCOL          ; COLCRS := COLCRS+1.
A93E  ADAD05              LDA     MAXCOL+1
A941  C556                CMP     COLCRS+1
A943  D005 ^A94A          BNE     :DR70F
A945  ADAC05              LDA     MAXCOL
A948  C555                CMP     COLCRS
A94A  B06B ^A9B7  :DR70F  BCS     :DR080          ; COLCRS <= MAXCOL.
A94C  8DD605              STA     HITEDG          ; SET EDGE HIT FLAG.
A94F  AD5E05              LDA     EDGRUL          ; OFF RIGHT EDGE.
A952  C901                CMP     #EWRAP          ; WRAP?
A954  D008 ^A95E          BNE     :DR071          ; NO -- MUST BE BOUNCE OR HALT.
A956  A900                LDA     #0              ; WRAP SCREEN LEFT EDGE.
A958  8555                STA     COLCRS
A95A  8556                STA     COLCRS+1
A95C  F059 ^A9B7          BEQ     :DR080          ; (BRA).
A95E  204AB2      :DR071  JSR     DECCOL          ; BRING TURTLE BACK IN.
A961  AD5E05              LDA     EDGRUL
A964  C902                CMP     #EHALT          ; HALT?
A966  D039 ^A9A1          BNE     :DR077          ; NO.
A968  8DD705              STA     HALTFG          ; YES -- SET FLAG.
A96B  F04A ^A9B7          BEQ     :DR080          ; (BRA).
A96D  A59B        :DR073  LDA     COLAC+1         ; ELSE IF COLAC < 0 THEN BEGIN.
A96F  1046 ^A9B7          BPL     :DR080
A971  20329C              JSR     DADDI           ; COLAC := COLAC+ENDPT.
A974  204AB2              JSR     DECCOL          ; COLCRS := COLCRS-1.
A977  A556                LDA     COLCRS+1
A979  103C ^A9B7          BPL     :DR080          ; COLORS >= MINCOL.
A97B  8DD605              STA     HITEDG          ; SET EDGE HIT FLAG.
A97E  AD5E05              LDA     EDGRUL          ; OFF LEFT EDGE.
A981  C901                CMP     #EWRAP          ; WRAP?
A983  D00D ^A992          BNE     :DR075          ; NO -- MUST BE BOUNCE.
A985  ADAC05              LDA     MAXCOL          ; WRAP TO SCREEN RIGHT EDGE.
A988  8555                STA     COLCRS
A98A  ADAD05              LDA     MAXCOL+1
A98D  8556                STA     COLCRS+1
A98F  4CB7A9              JMP     :DR080
A992  2043B2      :DR075  JSR     INCCOL          ; BRING TURTLE BACK IN.
A995  AD5E05              LDA     EDGRUL
A998  C902                CMP     #EHALT          ; HALT?
A99A  D005 ^A9A1          BNE     :DR077          ; NO
A99C  8DD705              STA     HALTFG          ; YES -- SET FLAG.
A99F  F016 ^A9B7          BEQ     :DR080          ; (BRA).
A9A1  20F19C      :DR077  JSR     DNEGI           ; COLAC:=ENDPT-COLAC-1.
A9A4  20329C              JSR     DADDI
A9A7  20129D              JSR     DDCRI
A9AA  A272                LDX     #THETA-DTAB     ; THETA := -THETA.
A9AC  20F19C              JSR     DNEGI
A9AF  2096AB              JSR     MOD360
A9B2  A24A                LDX     #DELX-DTAB      ; DELX := -DELX.
A9B4  20F19C              JSR     DNEGI
A9B7  ADD705      :DR080  LDA     HALTFG          ; HALT?
A9BA  F005 ^A9C1          BEQ     :DR081          ; NO.
A9BC  8DD605              STA     HITEDG          ; YES -- SET EDGE HIT FLAG.
A9BF  D06F ^AA30          BNE     :DR900          ; STOP DRAWING (BRA).
A9C1  ADCD05      :DR081  LDA     WALLS           ; WALLS ACTIVE?
A9C4  0DCE05              ORA     WALLS+1
A9C7  F00D ^A9D6          BEQ     :DR082          ; NO.
A9C9  2067AA              JSR     SGSTUF          ; SAVE GROW & GCOL.
A9CC  207CB2              JSR     TSTPIX          ; GET PIXEL VALUE AT CURRENT POSITIGN
A9CF  202BAC              JSR     WALLCK          ; IS IT A WALL?
A9D2  D056 ^AA2A          BNE     :DR300          ; YES -- BACKUP TO PRIOR POSITION.
A9D4  F003 ^A9D9          BEQ     :DR084          ; (BRA)
A9D6  209FAA      :DR082  JSR     CNVRT           ; ROW/COLUMN TO MEM ADDRESS.
A9D9  ADD405      :DR084  LDA     GROPR           ; 'GO'.
A9DC  C905                CMP     #GO
A9DE  F03F ^AA1F          BEQ     :DR085          ; YES -- DON'T PLOT INTERMEDIATE POINT.
A9E0  2093AA              JSR     PLOT            ; PLOT POINT IF PEN DOWN.
A9E3  ADD405              LDA     GROPR           ; 'FILL' OR 'FILLTO'?
A9E6  2910                AND     #$10
A9E8  F035 ^AA1F          BEQ     :DR085          ; NO.
A9EA  A900                LDA     #0              ; YES -- SETUP FOR TSTPIX CALL.
A9EC  8D9C05              STA     FLDCLR
A9EF  A555                LDA     COLCRS          ; SAVE CURRENT CURSOR POSITION.
A9F1  48                  PHA
A9F2  A556                LDA     COLCRS+1
A9F4  48                  PHA
A9F5  2093B2      :DR84D  JSR     TSTCOL          ; SEE IF TURTLE AT RIGHT EDGE.
A9F8  AD9F05              LDA     COLFLG
A9FB  2940                AND     #$40
A9FD  D006 ^AA05          BNE     :DR84E          ; YES
A9FF  2043B2              JSR     INCCOL          ; NO.
AA02  4C0BAA              JMP     :DR84F
AA05  A900        :DR84E  LDA     #0              ; SET TURTLE TO LEFT EDGE.
AA07  8555                STA     COLCRS
AA09  8556                STA     COLCRS+1
AA0B  207CB2      :DR84F  JSR     TSTPIX          ; IS TURTLE OVER BACKGROUND?
AA0E  D006 ^AA16          BNE     :DR84M          ; NO -- ALL DONE WITH SCAN.
AA10  2093AA              JSR     PLOT            ; YES -- REPLACE WITH FILL COLOR.
AA13  4CF5A9              JMP     :DR84D
AA16  68          :DR84M  PLA
AA17  8556                STA     COLCRS+1
AA19  68                  PLA
AA1A  8555                STA     COLCRS
AA1C  209FAA              JSR     CNVRT           ; REESTABLISH VISIBLE TURTLE.
AA1F  A21C        :DR085  LDX     #COUNTR-DTAB    ; COUNTR := COUNTR-1.
AA21  20129D              JSR     DDCRI
AA24  2048AA              JSR     SPDDEL
AA27  4CA3A8              JMP     :DR060          ; END.
AA2A  8DD505      :DR300  STA     HITWLL          ; SET FLAG.
AA2D  207AAA              JSR     RGSTUF          ; RESTORE GROW & GCOL.
AA30  ADD405      :DR900  LDA     GROPR           ; GO?
AA33  C905                CMP     #GO
AA35  D010 ^AA47          BNE     :DR990          ; NO.
AA37  ADD505              LDA     HITWLL          ; WALL HIT?
AA3A  D00B ^AA47          BNE     :DR990          ; YES -- DON'T PLOT POINT.
AA3C  ADDB05              LDA     NOPLOT          ; PLOT INHIBIT.
AA3F  D006 ^AA47          BNE     :DR990          ; YES -- DON'T PLOT POINT.
AA41  209FAA              JSR     CNVRT           ; PLOT STOP POINT.
AA44  2093AA              JSR     PLOT
AA47  60          :DR990  RTS
AA48                      PROC
AA48  AE5D05      SPDDEL  LDX     SPEED           ; CHECK SPEED SELECTION.
AA4B  F00E ^AA5B          BEQ     :SD200          ; FULL SPEED AHEAD.
AA4D  A514        :SD100  LDA     RTCLOK+2        ; COUNT CLOCK TICKS.
AA4F  C514        :SD110  CMP     RTCLOK+2        ; WAIT FOR ONE TICK.
AA51  F0FC ^AA4F          BEQ     :SD110
AA53  2022AC              JSR     GABRTC          ; OPERATOR BREAK?
AA56  F004 ^AA5C          BEQ     :SD300          ; YES.
AA58  CA                  DEX                     ; DONE?
AA59  D0F2 ^AA4D          BNE     :SD100          ; NO.
AA5B  60          :SD200  RTS
AA5C  20E9A7      :SD300  JSR     SETCR2          ; SET CURSOR.
AA5F  205BA5              JSR     TRTPLC          ; PLACE TURTLE.
AA62  A987                LDA     #ABTERR
AA64  4C3A7A              JMP     PSTOP
AA67  ADD105      SGSTUF  LDA     GROW            ; YES SAVE PRIOR POSITION.
AA6A  8DA005              STA     SAVROW
AA6D  ADCF05              LDA     GCOL
AA70  8DA105              STA     SAVCOL
AA73  ADD005              LDA     GCOL+1
AA76  8DA205              STA     SAVCOL+1
AA79  60                  RTS
AA7A  ADA005      RGSTUF  LDA     SAVROW          ; RESTORE PRIOR POSITION.
AA7D  8DD105              STA     GROW
AA80  EED905              INC     TUFLAG
AA83  ADA105              LDA     SAVCOL
AA86  8DCF05              STA     GCOL
AA89  ADA205              LDA     SAVCOL+1
AA8C  8DD005              STA     GCOL+1
AA8F  CED905              DEC     TUFLAG
AA92  60                  RTS
AA93  AD1305      PLOT    LDA     PEN             ; PEN UP?
AA96  3006 ^AA9E          BMI     :PL090          ; YES -- DON'T PLOT POINT.
AA98  8D9B05              STA     FCOLOR
AA9B  2056B2              JSR     FPLOT
AA9E  60          :PL090  RTS
AA9F                      PROC
                  ;
                  ; CONVERT ROW/COLUMN CURSOR INTO REAL ADDRESS (FROM SAVMSC ON UP).
                  ;
AA9F  A201        CNVRT   LDX     #01
AAA1  8EAE05              STX     MLTTMP          ; VERTICAL CALCULATIONS.
AAA4  CA                  DEX                     ; VERTICAL CALCULATIONS.
AAA5  86F7                STX     ADRESS+1        ; CLEAR HI BYTE.
AAA7  A554                LDA     ROWCRS          ; ADRESS := ROWCRS*5.
AAA9  8DD105              STA     GROW            ; FOR VISIBLE TURTLE.
AAAC  0A                  ASL     A               ; MULTIPLY BY 4.
AAAD  26F7                ROL     ADRESS+1
AAAF  0A                  ASL     A
AAB0  26F7                ROL     ADRESS+1        ; CLEAR CARRY.
AAB2  6554                ADC     ROWCRS          ; ADD TO MAKE *5.
AAB4  85F6                STA     ADRESS
AAB6  9002 ^AABA          BCC     :CNVR0
AAB8  E6F7                INC     ADRESS+1
AABA  AC3705      :CNVR0  LDY     GSMODE          ; GET MODE
AABD  BEBCB8              LDX     DHLINE,Y        ; GET NUMBER OF SHIFTS.
AAC0  06F6        :CNVR1  ASL     ADRESS          ; ADRESS := ADRESS *X.
AAC2  26F7                ROL     ADRESS+1        ; DO THE DIVIDE.
AAC4  CA                  DEX
AAC5  D0F9 ^AAC0          BNE     :CNVR1
AAC7  A556                LDA     COLCRS+1        ; HORIZONTAL CALCULATIONS.
AAC9  EED905              INC     TUFLAG          ; SET INTERLOCK FOR GCOL UPDATE
AACC  8DD005              STA     GCOL+1          ; FOR VISIBLE TURTLE.
AACF  4A                  LSR     A               ; SAVE LS8 FOR LATER.
AAD0  A555                LDA     COLCRS          ; GET LOW BYTE.
AAD2  8DCF05              STA     GCOL            ; FOR VISIBLE TURTLE.
AAD5  CED905              DEC     TUFLAG          ; CLEAR INTERLOCK.
AAD8  BE30B3              LDX     DIV2TB,Y        ; GET SHIFT AMOUNT.
AADB  F007 ^AAE4          BEQ     :CNVR3          ; CARRY CLEAR IF NO SHIFT.
AADD  6A          :CNVR2  ROR     A               ;  ROLL IN THE CARRY.
AADE  0EAE05              ASL     MLTTMP          ; SHIFT INDEX.
AAE1  CA                  DEX
AAE2  D0F9 ^AADD          BNE     :CNVR2
AAE4  65F6        :CNVR3  ADC     ADRESS          ; CARRY IS ALWAYS CLEAR.
AAE6  9002 ^AAEA          BCC     :CNVR4
AAE8  E6F7                INC     ADRESS+1
AAEA  18          :CNVR4  CLC
AAEB  6558                ADC     SAVMSC
AAED  85F6                STA     ADRESS
AAEF  A5F7                LDA     ADRESS+1
AAF1  6559                ADC     SAVMSC+1
AAF3  85F7                STA     ADRESS+1
AAF5  BE30B3              LDX     DIV2TB,Y
AAF8  BDCCB8              LDA     HMASK,X
AAFB  2555                AND     COLCRS
AAFD  6DAE05              ADC     MLTTMP
AB00  A8                  TAY                     ; MAKE A NEW INDEX.
AB01  B940B3              LDA     DMASKT,Y        ; GET THE FINAL MASK.
AB04  8DB105              STA     DMASK
AB07  8DB005              STA     SHFAMT
AB0A  A000                LDY     #00
AB0C  60                  RTS
AB0D                      PROC
                  ;
                  ; INTEST -- TEST FOR POINT WITHIN SCREEN LIMITS.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB OFFSET TO X,Y PAIR (EACH TRIPLE PRECISION)
                  ;
                  ;       JSR     INTEST
                  ;       BEQ     POINT IN SCREEN
                  ;
                  ;       A = EDGE TEST BITS (0000LRBT), WHERE 1=OUT OF BOUNDS FOR THAT EDGE.
AB0D  84A9        INTEST  STY     TEMP2+2         ; SAVE Y REGISTER.
AB0F  A027                LDY     #TEMP2-DTAB
AB11  A900                LDA     #0              ; INITIALIZE RESULT BYTE.
AB13  48                  PHA
AB14  85A8                STA     TEMP2+1
AB16  B581                LDA     DTAB+1,X        ; CHECK SIGN OF POSITION.
AB18  3011 ^AB2B          BMI     :IT010          ; NEGATIVE -- COULDN'T BE BEYOND RIGHT EDGE.
AB1A  AD6105              LDA     XC              ; SETUP RIGHT EDGE X POSITION
AB1D  85A7                STA     TEMP2
AB1F  20229C              JSR     DSCMI           ; TEST RIGHT EDGE.
AB22  901A ^AB3E          BCC     :IT020          ; INSIDE SCREEN.
AB24  F018 ^AB3E          BEQ     :IT020
AB26  68                  PLA                     ; OUTSIDE -- SET STATUS BIT.
AB27  0904                ORA     #ERIGHT
AB29  D012 ^AB3D          BNE     :IT019          ; (BRA).
AB2B  38          :IT010  SEC                     ; SET UP LEFT EDGE POSITION.
AB2C  A900                LDA     #0
AB2E  ED6105              SBC     XC
AB31  85A7                STA     TEMP2
AB33  C6A8                DEC     TEMP2+1
AB35  20229C              JSR     DSCMI           ; TEST LEFT EDGE.
AB38  B004 ^AB3E          BCS     :IT020          ; INSIDE.
AB3A  68                  PLA                     ; OUTSIDE -- SFT STATUS BIT.
AB3B  0908                ORA     #ELEFT
AB3D  48          :IT019  PHA
AB3E  E8          :IT020  INX                     ; ADVANCE TO Y POSITION.
AB3F  E8                  INX
AB40  E8                  INX
AB41  A900                LDA     #0
AB43  85A8                STA     TEMP2+1
AB45  B581                LDA     DTAB+1,X        ; CHECK SIGN OF POSITION.
AB47  1014 ^AB5D          BPL     :IT030          ; POSITIVE -- COULDN'T BE BELOW BOTTOM EDGE.
AB49  38                  SEC                     ; SET UP BOTTOM EDGE POSITION.
AB4A  A900                LDA     #0
AB4C  ED6305              SBC     YC
AB4F  85A7                STA     TEMP2
AB51  C6A8                DEC     TEMP2+1
AB53  20229C              JSR     DSCMI           ; TEST BOTTOM EDGE.
AB56  B015 ^AB6D          BCS     :IT040          ; INSIDE.
AB58  68                  PLA                     ; OUTSIDE -- SET STATUS BIT.
AB59  0902                ORA     #EBOTOM
AB5B  D00F ^AB6C          BNE     :IT039          ; (BRA).
AB5D  AD6305      :IT030  LDA     YC              ; SETUP TOP EDGE POSITION.
AB60  85A7                STA     TEMP2
AB62  20229C              JSR     DSCMI           ; TEST TOP EDGE.
AB65  9006 ^AB6D          BCC     :IT040          ; INSIDE.
AB67  F004 ^AB6D          BEQ     :IT040
AB69  68                  PLA                     ; OUTSIDE -- SET STATUS BIT.
AB6A  0901                ORA     #ETOP
AB6C  48          :IT039  PHA
AB6D  A4A9        :IT040  LDY     TEMP2+2         ; RESTORE Y REGISTER.
AB6F  68                  PLA                     ; GET STATUS BYTE FOR EXIT.
AB70  60                  RTS
AB71                      PROC
                  ;
                  ; NEWDEL -- COMPUTE SLOPE DELTAS.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     NEWDEL
                  ;       BVS     OVERFLOW
                  ;
                  ;       DELX := GX1-GX2.
                  ;       DELY := GY1-GY2.
                  ;
AB71  A24A        NEWDEL  LDX     #DELX-DTAB      ; DELX := GX1-GX2.
AB73  A03E                LDY     #GX1-DTAB
AB75  20459A              JSR     DMOVI
AB78  A044                LDY     #GX2-DTAB
AB7A  20429C              JSR     DSUBI
AB7D  700C ^AB8B          BVS     :ND092
AB7F  A24C                LDX     #DELY-DTAB      ; DELY := GY1-GY2.
AB81  A041                LDY     #GY1-DTAB
AB83  20459A              JSR     DMOVI
AB86  A047                LDY     #GY2-DTAB
AB88  20429C              JSR     DSUBI
AB8B  60          :ND092  RTS
AB8C                      PROC
                  ;
                  ; NEWCUR -- MOVE NEW CURSOR TO CURRENT CURSOR.
                  ;
                  ;       'GX'    := 'GXNEW'
                  ;       'GY'    := 'GYNEW'
                  ;
AB8C  A206        NEWCUR  LDX     #6              ; 2 VARIABLES OF 3 BYTES EACH.
AB8E  B5E5        :NC010  LDA     GXNEW-1,X
AB90  95EB                STA     GX-1,X
AB92  CA                  DEX
AB93  D0F9 ^AB8E          BNE     :NC010
AB95  60                  RTS
AB96                      PROC
                  ;
                  ; MOD36 -- 'THETA' = 'THETA ' MODULO 360
                  ;
AB96  A5F3        MOD360  LDA     THETA+1         ; SEE IF ANGLE IS NEGATIVE.
AB98  1022 ^ABBC          BPL     :MD020          ; NO.
AB9A  A272                LDX     #THETA-DTAB     ; YES.
AB9C  20F19C              JSR     DNEGI           ; GET ABSOLUTE VALUE.
AB9F  A5F3                LDA     THETA+1         ; THETA = 32768 IS A SPECIAL CASE.
ABA1  3043 ^ABE6          BMI     :MD030
ABA3  2096AB              JSR     MOD360          ; *** RECURSIVE CALL ***
ABA6  A5F2                LDA     THETA           ; TEST FOR RESULT = 0.
ABA8  05F3                ORA     THETA+1
ABAA  F052 ^ABFE          BEQ     :MD099          ; YES -- DONE.
ABAC  A968                LDA     # LOW 360       ; NO -- THETA = 360 - MOD(ABS(THETA)).
ABAE  38                  SEC
ABAF  E5F2                SBC     THETA
ABB1  85F2                STA     THETA
ABB3  A901                LDA     # HIGH 360
ABB5  E5F3                SBC     THETA+1
ABB7  85F3                STA     THETA+1
ABB9  4CEEAB              JMP     :MD090
ABBC  A5F3        :MD020  LDA     THETA+1         ; COMPARE WITH 360.
ABBE  C901                CMP     # HIGH 360
ABC0  D004 ^ABC6          BNE     :MD025
ABC2  A5F2                LDA     THETA
ABC4  C968                CMP     # LOW 360
ABC6  9026 ^ABEE  :MD025  BCC     :MD090          ; THETA < 360.
ABC8  A968                LDA     # LOW 360       ; PREPARE TO DIVIDE BY 360.
ABCA  85A7                STA     TEMP2
ABCC  A901                LDA     # HIGH 360
ABCE  85A8                STA     TEMP2+1
ABD0  84A9                STY     TEMP2+2
ABD2  A272                LDX     #THETA-DTAB
ABD4  A027                LDY     #TEMP2-DTAB
ABD6  20879C              JSR     DDIVI
ABD9  A4A9                LDY     TEMP2+2
ABDB  A5A1                LDA     TEMP            ; REMAINDER IN 'TEMP' AFTER DIVIDE.
ABDD  85F2                STA     THETA
ABDF  A5A2                LDA     TEMP+1
ABE1  85F3                STA     THETA+1
ABE3  4CEEAB              JMP     :MD090
ABE6  A960        :MD030  LDA     # LOW 352       ; -32769 MOD 360 = 352
ABE8  85F2                STA     THETA
ABEA  A901                LDA     # HIGH 352
ABEC  85F3                STA     THETA+1
ABEE  EED905      :MD090  INC     TUFLAG          ; INTERLOCK FOR GANGLE UPDATE.
ABF1  A5F2                LDA     THETA
ABF3  8DD205              STA     GANGLE
ABF6  A5F3                LDA     THETA+1
ABF8  8DD305              STA     GANGLE+1
ABFB  CED905              DEC     TUFLAG          ; CLEAR INTERLOCK.
ABFE  60          :MD099  RTS
ABFF                      PROC
                  ;
                  ; SETCUR -- SET HANDLER CURSOR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       Y = DTAB OFFSET TO TRIPLE PRECISION X,Y POSITION.
                  ;
                  ;       JSR     SETCUR
                  ;
ABFF  B98200      SETCUR  LDA     DTAB+2,Y
AC02  2A                  ROL     A
AC03  B98000              LDA     DTAB,Y
AC06  6D6105              ADC     XC
AC09  8555                STA     COLCRS
AC0B  B98100              LDA     DTAB+1,Y
AC0E  6D6205              ADC     XC+1
AC11  8556                STA     COLCRS+1
AC13  B98500              LDA     DTAB+5,Y
AC16  4980                EOR     #SB
AC18  2A                  ROL     A
AC19  AD6305              LDA     YC
AC1C  F98300              SBC     DTAB+3,Y
AC1F  8554                STA     ROWCRS
AC21  60                  RTS
AC22                      PROC
                  ;
                  ; GABRTC -- GRAPHICS GPERATOR ABORT CHECKER
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     GABRTC
                  ;       BEQ     ABORT
                  ;
AC22  A511        GABRTC  LDA     BREAK           ; OPERATOR ABORT?
AC24  D004 ^AC2A          BNE     :GA090          ; NO.
AC26  C611                DEC     BREAK           ; YES -- RESET FLAG.
AC28  A900                LDA     #0              ; SET EXIT STATUS.
AC2A  60          :GA090  RTS
AC2B                      PROC
                  ;
                  ; WALLCK -- CHECKS TO SEE IF PIXEL VALUE IS A WALL.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A =     PIXEL VALUE (00-$0F)
                  ;
                  ;       JSR     WALLCK
                  ;       BNE     PIXEL IS A WALL
                  ;
AC2B  0A          WALLCK  ASL     A               ; X2.
AC2C  AA                  TAX
AC2D  F00E ^AC3D          BEQ     :WL090          ; BACKGROUND CAN'T BE A WALL.
AC2F  BD3EAC              LDA     WMASK,X
AC32  2DCD05              AND     WALLS
AC35  D006 ^AC3D          BNE     :WL090          ; FOUND US A WALL.
AC37  BD3FAC              LDA     WMASK+1,X
AC3A  2DCE05              AND     WALLS+1
AC3D  60          :WL090  RTS                     ; RETURN WITH CC SET.
AC3E  0000010002  WMASK   DW 0,$01,$02,$04,$08,$10,$20,$40,$80
AC50  0001000200          DW $100,$200,$400,$800,$1000,$2000,$4000
AC5E                      PROC
                  ;
                  ; GREAD -- READ GRAPHICS DATA FROM SCREEN.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       CURSOR ALREADY SET TO LOCATION TO READ.
                  ;
                  ;       JSR     GREAD
                  ;
                  ;       A = VALUE OF PIXEL AT CURSOR LOCATION.
                  ;       C = 0 IF TURTLE ON SCREEN, 1 IF OFF.
                  ;
AC5E  A592        GREAD   LDA     EXEC            ; EXECUTE MODE?
AC60  F032 ^AC94          BEQ     :GR090          ; NO.
AC62  AD1405              LDA     GRFLAG          ; YES -- GRAPHICS SCREEN?
AC65  F02D ^AC94          BEQ     :GR090          ; NO.
AC67  A206                LDX     #6
AC69  B5EB        :GR010  LDA     GX-1,X          ; ROUND GX TO GX1 ...
AC6B  2A                  ROL     A               ; ... & GY TO GY1.
AC6C  B5E9                LDA     GX-3,X
AC6E  6900                ADC     #0
AC70  95BB                STA     GX1-3,X
AC72  B5EA                LDA     GX-2,X
AC74  6900                ADC     #0
AC76  95BC                STA     GX1-2,X
AC78  CA                  DEX
AC79  CA                  DEX
AC7A  CA                  DEX
AC7B  D0EC ^AC69          BNE     :GR010
AC7D  A23E                LDX     #GX1-DTAB       ; YES -- CHECK FOR POINT IN SCREEN LIMITS.
AC7F  200DAB              JSR     INTEST
AC82  D010 ^AC94          BNE     :GR090          ; NOT IN LIMITS -- RETURN VALUE OF ZERO.
AC84  8CD805              STY     GRTEMP          ; SAVE Y REGISTER.
AC87  A03E                LDY     #GX1-DTAB       ; SET CURSOR POSITION.
AC89  20FFAB              JSR     SETCUR
AC8C  207CB2              JSR     TSTPIX          ; GET PIXEL VALUE.
AC8F  ACD805              LDY     GRTEMP
AC92  18                  CLC
AC93  60                  RTS
AC94  A900        :GR090  LDA     #0              ; RETURN VALUE OF ZERO.
AC96  38                  SEC
AC97  60          VTSRET  RTS
AC98                      PROC
AC98  A900        VTSENS  LDA     #0              ; ASSUME NO OBSTACLE INITIALLY.
AC9A  8D5005              STA     TRTSNS
AC9D  AD1405              LDA     GRFLAG          ; GRAPHICS MODE?
ACA0  F0F5 ^AC97          BEQ     VTSRET          ; NO --* ALL DONE?
ACA2  2067AA              JSR     SGSTUF          ; SAVE GCOL & GROW.
ACA5  98                  TYA                     ; SAVE. Y REGISTER.
ACA6  48                  PHA
ACA7  AD1305              LDA     PEN             ; SAVE PEN.
ACAA  48                  PHA
ACAB  AD5E05              LDA     EDGRUL          ; SAVE EDGE RULE.
ACAE  48                  PHA
ACAF  A206                LDX     #6              ; SAVE TURTLE LOCATION.
ACB1  B5EB        :ST010  LDA     GX-1,X
ACB3  48                  PHA
ACB4  CA                  DEX
ACB5  D0FA ^ACB1          BNE     :ST010
ACB7  ADCD05              LDA     WALLS           ; SAVE WALL SELECTIONS.
ACBA  48                  PHA
ACBB  ADCE05              LDA     WALLS+1
ACBE  48                  PHA
ACBF  AE4E05              LDX     ESTKP           ; ANYTHING IN EXPSTK?
ACC2  F006 ^ACCA          BEQ     :ST017          ; NO.
ACC4  B592        :ST015  LDA     EXPSTK-1,X      ; YES -- SAVE IT ALL.
ACC6  48                  PHA
ACC7  CA                  DEX
ACC8  D0FA ^ACC4          BNE     :ST015
ACCA  A900        :ST017  LDA     #0              ; CLEAR WALLS.
ACCC  8DCD05              STA     WALLS
ACCF  8DCE05              STA     WALLS+1
ACD2  A980                LDA     #PCUP           ; SET PEN TO UP.
ACD4  8D1305              STA     PEN
ACD7  AD5E05              LDA     EDGRUL          ; IF EDGE RULE = HALT, CHANGE TO FREE.
ACDA  C902                CMP     #EHALT
ACDC  D005 ^ACE3          BNE     :ST020
ACDE  A908                LDA     #EFREE
ACE0  8D5E05              STA     EDGRUL
ACE3  A905        :ST020  LDA     #GO             ; SIMULATE A GO 1.
ACE5  8DD405              STA     GROPR
ACE8  A900                LDA     #0
ACEA  8594                STA     EXPSTK+1
ACEC  A901                LDA     #1
ACEE  8593                STA     EXPSTK
ACF0  2032A2              JSR     CALDEL
ACF3  207AA6              JSR     GMOVE
ACF6  AE4E05              LDX     ESTKP           ; RESTORE EXPSTK?
ACF9  F00B ^AD06          BEQ     :ST023          ; NO.
ACFB  A200                LDX     #0
ACFD  68          :ST022  PLA
ACFE  9593                STA     EXPSTK,X
AD00  E8                  INX
AD01  EC4E05              CPX     ESTKP
AD04  D0F7 ^ACFD          BNE     :ST022
AD06  68          :ST023  PLA
AD07  8DCE05              STA     WALLS+1
AD0A  68                  PLA
AD0B  8DCD05              STA     WALLS
AD0E  205EAC              JSR     GREAD
AD11  B008 ^AD1B          BCS     :ST025          ; NOT IN SCREEN.
AD13  202BAC              JSR     WALLCK          ; WALL?
AD16  F009 ^AD21          BEQ     :ST030          ; NO
AD18  CE5005              DEC     TRTSNS
AD1B  EE5005      :ST025  INC     TRTSNS          ; YES -- SET SENSOR.
AD1E  EE5005              INC     TRTSNS
AD21  A200        :ST030  LDX     #0              ; RESTORE TURTLE POSITION
AD23  68          :ST040  PLA
AD24  95EC                STA     GX,X
AD26  95E6                STA     GXNEW,X
AD28  E8                  INX
AD29  E006                CPX     #6
AD2B  D0F6 ^AD23          BNE     :ST040
AD2D  68                  PLA                     ; RESTORE EDGE RULE.
AD2E  8D5E05              STA     EDGRUL
AD31  68                  PLA                     ; RESTORE PEN.
AD32  8D1305              STA     PEN
AD35  207AAA              JSR     RGSTUF          ; RESTORE GCOL & GROW.
AD38  68                  PLA
AD39  A8                  TAY                     ; RESTORE Y-REGISTFR.
AD3A  60                  RTS
AD3B                      PROC
                  ;
                  ; SINVAL -- GET VALUE OF SIN(THETA+A*90)
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = QUADRANT OFFSET (0-3)
                  ;       'THETA' = ANGLE (0-359)
                  ;
                  ;       JSR     SINVAL
                  ;
                  ;       'TEMP' = SIN (THETA+A*90)
                  ;
AD3B  85A3        SINVAL  STA     TEMP+2          ; SAVE QUADRANT OFFSET.
AD3D  84A4                STY     TEMP+3
AD3F  A072                LDY     #THETA-DTAB     ; 'ACC' = 'THETA'.
AD41  20A29D              JSR     DLOADA          ; X = 'ACC' - 'DTAB'.
AD44  A95A                LDA     # LOW 90        ; 'TEMP' = 90.
AD46  85A1                STA     TEMP
AD48  A900                LDA     # HIGH 90
AD4A  85A2                STA     TEMP+1
                  ; NORMALIZE THETA TO 0-90 RANGE AND USE TRIG EQUALITIES TO COMPUTE SINE.
AD4C  A021        :SN010  LDY     #TEMP-DTAB      ; IS 'ACC' <= 90. HP
AD4E  20159C              JSR     DCMPI
AD51  F009 ^AD5C          BEQ     :SN020          ; YES.
AD53  9007 ^AD5C          BCC     :SN020          ; YES.
AD55  E6A3                INC     TEMP+2          ; NOT YET -- INCREMENT QUADRANT.
AD57  20429C              JSR     DSUBI           ; 'ACC' = 'ACC' - 90.
AD5A  D0F0 ^AD4C          BNE     :SN010          ; (BRA UNLESS RESULT = 0).
AD5C  A6E2        :SN020  LDX     ACC             ; RESULT IS 0 TO 90 FOR TABLE LOOKUP.
AD5E  A5A3                LDA     TEMP+2          ; QUADRANT A.
AD60  2903                AND     #$03            ; MODULO 4.
AD62  F018 ^AD7C          BEQ     :SN100          ; QUADRANT 0.
AD64  C901                CMP     #1
AD66  D008 ^AD70          BNE     :SN040
AD68  A95A                LDA     #90             ; QUADRANT 1.
AD6A  E5E2                SBC     ACC
AD6C  AA                  TAX
AD6D  4C7CAD              JMP     :SN100
AD70  C902        :SN040  CMP     #2
AD72  F020 ^AD94          BEQ     :SN150          ; QUADRANT 2.
AD74  A95A                LDA     #90             ; QUADRANT 3.
AD76  E5E2                SBC     ACC
AD78  AA                  TAX
AD79  4C94AD              JMP     :SN150
AD7C  A900        :SN100  LDA     #0              ; GET VALUE FROM TABLE.
AD7E  E057                CPX     #87             ; 87 THRU 90?
AD80  9008 ^AD8A          BCC     :SN120          ; NO -- USE TABLE.
AD82  85A1                STA     TEMP            ; SPECIAL CASE -- FORCE TO 1.0.
AD84  A901                LDA     #1
AD86  85A2                STA     TEMP+1
AD88  D012 ^AD9C          BNE     :SN900          ; (BRA).
AD8A  85A2        :SN120  STA     TEMP+1          ; MSB = 0.
AD8C  BD9FAD              LDA     SINTAB,X
AD8F  85A1                STA     TEMP            ; LSB = VALUE FROM TABLE.
AD91  4C9CAD              JMP     :SN900
AD94  207CAD      :SN150  JSR     :SN100          ; GET VALUE TO 'TEMP' *** RECURSIVE CALL ***.
AD97  A221                LDX     #TEMP-DTAB      ; THEN NEGATE VALUE.
AD99  20F19C              JSR     DNEGI
AD9C  A4A4        :SN900  LDY     TEMP+3
AD9E  60                  RTS
                  ; SINE TABLE VALUES FOR 0 THROUGH 86 DEGREES
      = AD9F      SINTAB = *        ; SIN(X) * 256          X
AD9F  0004090D12          DB   0,4,9,13,18             ; 0-4
ADA4  161B1F2428          DB   22,27,31,36,40          ; 5-9
ADA9  2C31353A3E          DB   44,49,53,58,62          ; 10-14
ADAE  42474B4F53          DB   66,71,75,79,83          ; 15-19
ADB3  585C606468          DB   88,92,96,100,104        ; 20-24
ADB8  6C7074787C          DB   108,112,116,120,124     ; 25-29
ADBD  8084888B8F          DB   128,132,136,139,143     ; 30-34
ADC2  93969A9EA1          DB   147,150,154,158,161     ; 35-39
ADC7  A5A8ABAFB2          DB   165,168,171,175,178     ; 40-44
ADCC  B5B8BBBEC1          DB   181,184,187,190,193     ; 45-49
ADD1  C4C7CACCCF          DB   196,199,202,204,207     ; 50-54
ADD6  D2D4D7D9DB          DB   210,212,215,217,219     ; 55-59
ADDB  DEE0E2E4E6          DB   222,224,226,228,230     ; 60-64
ADE0  E8EAECEDEF          DB   232,234,236,237,239     ; 65-69
ADE5  F1F2F3F5F6          DB   241,242,243,245,246     ; 70-74
ADEA  F7F8F9FAFB          DB   247,248,249,250,251     ; 75-79
ADEF  FCFDFEFEFF          DB   252,253,254,254,255     ; 80-84
ADF4  FFFF                DB   255,255                 ; 85-66
ADF6                      PROC
                  ;
                  ; TMUUT -- TRIPLE PRECISION MULTIPLY
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'EXPSTK' = WORD OF SIGNED DATA
                  ;       'TEMP' = WORD OF SIGNED DATA
                  ;
                  ;       JSR     TMULT
                  ;
                  ;       'GNUMB'+1 = MSB OF RESULT
                  ;       'GNUNB'+0 = MIDDLE OF RESULT
                  ;       'GNUMB'+2 = LSB OF RESULT
                  ;
ADF6  A900        TMULT   LDA     #0              ; CLEAR RESULT REGISTER.
ADF8  8D4905              STA     GNUMB
ADFB  8D4A05              STA     GNUMB+1
ADFE  8D4B05              STA     GNUMB+2
AE01  85A6                STA     TEMP+5          ; SIGN EXTENSION BYTES.
AE03  85A5                STA     TEMP+4
AE05  A5A2                LDA     TEMP+1          ; EXTEND SIGN OF 'TEMP'.
AE07  1002 ^AE0B          BPL     :TM005          ; SIGN IS POSITIVE.
AE09  C6A6                DEC     TEMP+5          ; SIGN IS NEGATIVE.
AE0B  A594        :TM005  LDA     EXPSTK+1        ; EXTEND SIGN OF 'EXPSTK'.
AE0D  1002 ^AE11          BPL     :TM008          ; SIGN IS POSITIVE.
AE0F  C6A5                DEC     TEMP+4          ; SIGN IS NEGATIVE.
AE11  A218        :TM008  LDX     #24             ; SETUP LOOP COUNT.
AE13  06A1        :TM010  ASL     TEMP
AE15  26A2                ROL     TEMP+1
AE17  26A6                ROL     TEMP+5
AE19  9019 ^AE34          BCC     :TM020
AE1B  18                  CLC
AE1C  AD4B05              LDA     GNUMB+2
AE1F  6593                ADC     EXPSTK
AE21  8D4B05              STA     GNUMB+2
AE24  AD4905              LDA     GNUMB+0
AE27  6594                ADC     EXPSTK+1
AE29  8D4905              STA     GNUMB+0
AE2C  AD4A05              LDA     GNUMB+1
AE2F  65A5                ADC     TEMP+4
AE31  8D4A05              STA     GNUMB+1
AE34  CA          :TM020  DEX
AE35  F00C ^AE43          BEQ     :TM090
AE37  0E4B05              ASL     GNUMB+2
AE3A  2E4905              ROL     GNUMB+0
AE3D  2E4A05              ROL     GNUMB+1
AE40  4C13AE              JMP     :TM010
AE43  60          :TM090  RTS
AE44                      PROC
                  ;
                  ; TADDI -- TRIPLE PRECISION ADDITION
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       X = DTAB OFFSET
                  ;
                  ;       JSR     TADDI
                  ;
                  ;       DTAB(X) = DTAB(X) + 'GNUMB'
                  ;
                  ; NOTE: MSB IS DTAB(X+1), MIDDLE IS DTAB(X+0), LSB IS DTAB(X+2)
                  ;
AE44  18          TADDI   CLC
AE45  B582                LDA     DTAB+2,X
AE47  6D4B05              ADC     GNUMB+2
AE4A  9582                STA     DTAB+2,X
AE4C  B580                LDA     DTAB+0,X
AE4E  6D4905              ADC     GNUMB
AE51  9580                STA     DTAB+0,X
AE53  B581                LDA     DTAB+1,X
AE55  6D4A05              ADC     GNUMB+1
AE58  9581                STA     DTAB+1,X
AE5A  60                  RTS
AE5B                      PROC
                  ;
                  ; QMULT -- 16 * 16 YIELDING 32 BIT SIGNED MULTIPLY
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'GACC' = 2 BYTE MULTIPLICAND.
                  ;       Y = DTAB OFFSET TO 2 BYTE MULTIPLIER.
                  ;
                  ;       JSR     QMULT
                  ;
                  ;       'GACC'[4 BYTE] = 'GACC'[2 BYTE] * 'DTAB'(Y)[2 BYTE]
                  ;
AE5B  A204        QMULT   LDX     #4
AE5D  B5CD        :QM010  LDA     GACC-1,X
AE5F  95D1                STA     GTEMP-1,X
AE61  A900                LDA     #0
AE63  95CD                STA     GACC-1,X
AE65  95D5                STA     GTEMP2-1,X
AE67  CA                  DEX
AE68  D0F3 ^AE5D          BNE     :QM010
AE6A  B98000              LDA     DTAB,Y
AE6D  85D6                STA     GTEMP2
AE6F  B98100              LDA     DTAB+1,Y
AE72  85D7                STA     GTEMP2+1
AE74  1006 ^AE7C          BPL     :QM015
AE76  A9FF                LDA     #-1             ; EXTEND SIGN.
AE78  85D8                STA     GTEMP2+2
AE7A  85D9                STA     GTEMP2+3
AE7C  A5D3        :QM015  LDA     GTEMP+1
AE7E  1004 ^AE84          BPL     :QM020
AE80  A9FF                LDA     #-1             ; EXTEND SIGN.
AE82  D002 ^AE86          BNE     :QM022          ; (BRA).
AE84  A900        :QM020  LDA     #0
AE86  85D4        :QM022  STA     GTEMP+2
AE88  85D5                STA     GTEMP+3
AE8A  A220                LDX     #32             ; SETUP LOOP COUNT.
AE8C  06D2        :QM030  ASL     GTEMP           ; LONG SHIFT LEFT.
AE8E  26D3                ROL     GTEMP+1
AE90  26D4                ROL     GTEMP+2
AE92  26D5                ROL     GTEMP+3
AE94  9019 ^AEAF          BCC     :QM040          ; MSB NOT SET
AE96  18                  CLC                     ; BIT SET -- ADD TO PARTIAL
AE97  A5CE                LDA     GACC
AE99  65D6                ADC     GTEMP2
AE9B  85CE                STA     GACC
AE9D  A5CF                LDA     GACC+1
AE9F  65D7                ADC     GTEMP2+1
AEA1  85CF                STA     GACC+1
AEA3  A5D0                LDA     GACC+2
AEA5  65D8                ADC     GTEMP2+2
AEA7  85D0                STA     GACC+2
AEA9  A5D1                LDA     GACC+3
AEAB  65D9                ADC     GTEMP2+3
AEAD  85D1                STA     GACC+3
AEAF  CA          :QM040  DEX                     ; DONE?
AEB0  F00B ^AEBD          BEQ     :QM090          ; YES.
AEB2  06CE                ASL     GACC            ; LONG SHIFT LEFT.
AEB4  26CF                ROL     GACC+1
AEB6  26D0                ROL     GACC+2
AEB8  26D1                ROL     GACC+3
AEBA  4C8CAE              JMP     :QM030
AEBD  60          :QM090  RTS
AEBE                      PROC
                  ;
                  ; QDIV -- 32 DIVIDED BY 16 YIELDING 16 BIT SIGNED DIVIDE.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'GACC' = 4 BYTE DIVIDEND.
                  ;       Y = DTAB OFFSET TO 2 BYTE DIVISOR.
                  ;
                  ;       JSR     QDIV
                  ;       BNE     OVERFLOW
                  ;
                  ;       'GACC'[2 BYTE] = 'GACC'[4 BYTE] / 'DTAB'(Y) [2 BYTE]
                  ;       X = DTAB OFFSET TO 'GACC'
                  ;
      = AEBE      QDIV    = *
AEBE  B98000              LDA     DTAB,Y          ; CHECK FOR DIVIDE BY ZERO.
AEC1  198100              ORA     DTAB+1,Y
AEC4  F066 ^AF2C          BEQ     :QD097
AEC6  A921                LDA     #32+1           ; LOOP COUNT.
AEC8  85A1                STA     TEMP
AECA  A900                LDA     #0
AECC  85D2                STA     GTEMP           ; CLEAR REMAINDER TO START.
AECE  85D3                STA     GTEMP+1
AED0  B98100              LDA     DTAB+1,Y        ; SEE IF DIVISOR IS NEGATIVE.
AED3  85A2                STA     TEMP+1          ; SAVE FOR LATER.
AED5  1008 ^AEDF          BPL     :QD003          ; NO.
AED7  98                  TYA                     ; YES -- NEGATE DIVISOR ...
AED8  AA                  TAX
AED9  20F19C              JSR     DNEGI
AEDC  2036AF              JSR     QNEGA           ; ... & DIVIDEND.
AEDF  A5D1        :QD003  LDA     GACC+3          ; SEE IF DIVIDEND IS NEGATIVE.
AEE1  85A3                STA     TEMP+2          ; SAVE FOR LATER.
AEE3  1003 ^AEE8          BPL     :QD006          ; NO.
AEE5  2036AF              JSR     QNEGA           ; YES -- NEGATE IT.
AEE8  A252        :QD006  LDX     #GTEMP-DTAB
AEEA  18                  CLC
AEEB  26CE        :QD010  ROL     GACC            ; LONG ROTATE LEFT.
AEED  26CF                ROL     GACC+1
AEEF  26D0                ROL     GACC+2
AEF1  26D1                ROL     GACC+3
AEF3  26D2                ROL     GTEMP           ; REMAINDER = 2 + NEW BIT.
AEF5  26D3                ROL     GTEMP+1
AEF7  C6A1                DEC     TEMP            ; DONE?
AEF9  F00B ^AF06          BEQ     :QD090          ; YES.
AEFB  20159C              JSR     DCMPI           ; IS REMAINDER < DIVISOR?
AEFE  90EB ^AEEB          BCC     :QD010          ; YES.
AF00  20429C              JSR     DSUBI           ; NO -- CORRECT FOR THAT.
AF03  38                  SEC
AF04  B0E5 ^AEEB          BCS     :QD010          ; (BRA).
AF06  20159C      :QD090  JSR     DCMPI
AF09  9007 ^AF12          BCC     :QD091
AF0B  A24E                LDX     #GACC-DTAB
AF0D  A901                LDA     #1
AF0F  20049D              JSR     DADDS
AF12  A5A3        :QD091  LDA     TEMP+2          ; DONE -- SEE IF RESULT IS TO BE NEGATED?
AF14  1003 ^AF19          BPL     :QD093          ; NO.
AF16  2036AF              JSR     QNEGA           ; YES.
AF19  A5A2        :QD093  LDA     TEMP+1          ; SEE IF DIVISOR WAS NEGATED AT BEGINNING.
AF1B  1005 ^AF22          BPL     :QD096          ; NO.
AF1D  98                  TYA
AF1E  AA                  TAX
AF1F  20F19C              JSR     DNEGI           ; YES -- CORRECT FOR THAT.
AF22  A24E        :QD096  LDX     #GACC-DTAB      ; AS ADVERTISED.
                  ; CHECK FOR OVERFLOW IN RESULT
AF24  A5CF                LDA     GACC+1          ; CHECK MSB OF USABLE PORTION.
AF26  1009 ^AF31          BPL     :QD098          ; POSITIVE.
AF28  A5D0                LDA     GACC+2
AF2A  25D1                AND     GACC+3
AF2C  C9FF        :QD097  CMP     #-1
AF2E  4C35AF              JMP     :QD099
AF31  A5D0        :QD098  LDA     GACC+2
AF33  05D1                ORA     GACC+3
AF35  60          :QD099  RTS                     ; RETURN WITH CC SET.
AF36                      PROC
                  ;
                  ; QNEGA -- 4 BYTE NEGATE
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     QNEGA
                  ;
                  ;       'GACC'[4 BYTE] = - 'GACC'[4 BYTE]
                  ;
AF36  38          QNEGA   SEC                     ; CLEAR BORROW.
AF37  A900                LDA     #0
AF39  E5CE                SBC     GACC
AF3B  85CE                STA     GACC
AF3D  A900                LDA     #0
AF3F  E5CF                SBC     GACC+1
AF41  85CF                STA     GACC+1
AF43  A900                LDA     #0
AF45  E5D0                SBC     GACC+2
AF47  85D0                STA     GACC+2
AF49  A900                LDA     #0
AF4B  E5D1                SBC     GACC+3
AF4D  85D1                STA     GACC+3
AF4F  60                  RTS
AF50                      PROC
                  ;
                  ; RADDI -- DOUBLE PRECISION ADD WITH ROUND FROM FRACTION
                  ;
AF50  B98200      RADDI   LDA     DTAB+2,Y        ; GET FRACTION.
AF53  2A                  ROL     A               ; MSB OF FRACTION TO CARRY.
AF54  4C339C              JMP     DADDIX
AF57                      PROC
                  ;
                  ; RSUBI -- DOUBLE PRECISION SUBTRACT WITH BORROW FROM FRACTION.
                  ;
AF57  B98200      RSUBI   LDA     DTAB+2,Y        ; GET FRACTION.
AF5A  4980                EOR     #$80            ; INVERT MSB OF FRACTION
AF5C  2A                  ROL     A               ; INVERTED MSB TO CARRY.
AF5D  4C439C              JMP     DSUBIX
AF60                      PROC
                  ; GPINIT -- INITIALIZE GRAPHICS PARAMETERS (X, Y, THETA & PEN COLOR)
AF60  A900        GPINIT  LDA     #0              ; PEN = ERASE AND DOWN.
AF62  8D1305              STA     PEN
AF65  A910                LDA     #SPLIT          ; FORCE SPLIT SCREEN.
AF67  8D5205              STA     SPLTSC
AF6A  A908                LDA     #EFREE          ; FREE EDGE TURTLE.
AF6C  8D5E05              STA     EDGRUL
AF6F  A907                LDA     #SCNMOD         ; SET DEFAULT SCREEN MODE
AF71  8D3705              STA     GSMODE
AF74  60                  RTS
AF75                      PROC
                  ;
                  ; DFCLRS -- SET DEFAULT COLORS
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       GSMODE     = GRAPHICS MODE
                  ;
                  ;       JSR     DFCLRS
                  ;
                  ;       'PEN'      = 0
                  ;       'NXTCLR'   = 1
                  ;       'PNCLRS'   = DEFAULT VALUES
                  ;       COLOR REGS = DEFAULT VALUES
                  ;
AF75  A200        DFCLRS  LDX     #0              ; BACKGROUND ...
AF77  8E1305              STX     PEN
AF7A  A901                LDA     #CBLACK         ; ... BLACK
AF7C  20F7A4              JSR     SETCLR
AF7F  A201                LDX     #1              ; PEN #1 ...
AF81  8EBA05              STX     NXTCLR
AF84  A942                LDA     #CRED           ; ... RED.
AF86  20F7A4              JSR     SETCLR
AF89  A202                LDX     #2              ; PEN #2 ...
AF8B  A91A                LDA     #CYELLO         ; ... YELLOW.
AF8D  20F7A4              JSR     SETCLR
AF90  A203                LDX     #3              ; PEN #3 ...
AF92  A984                LDA     #CBLUE          ; ... BLUE.
AF94  20F7A4              JSR     SETCLR
AF97  60                  RTS
AF98                      PROC
                  *
                  *  ENTRY POINT FOR FILL ROUTINE:
                  *
                  *  THE FOLLOWING PARAMETERS MUST BE SET ON ENTRY:
                  *
                  *  GSMODE=GRAPHIC MODE INDEX
                  *  FCOLOR=FILL COLOR
                  *  ROWCRS,COLCRS=STARTING COORDINATES
                  *  MAXROW,MAXCOL=MODE DEPENDENT VALUES
                  *  FSTACK = FILL STACK BASE ADDRESS
                  *
AF98              FLOOD                   ;ROUTINE ENTRY POINT
AF98  A5B0                LDA     S1H             ; INITIALIZE FLOODSTACK POINTER.
AF9A  85F4                STA     FSTACK
AF9C  A5B1                LDA     S1H+1
AF9E  85F5                STA     FSTACK+1
                  *
                  *  SAVE STARTING COORDINATES
                  *
AFA0  A554                LDA     ROWCRS
AFA2  8DA005              STA     SAVROW
AFA5  A555                LDA     COLCRS
AFA7  8DA105              STA     SAVCOL
AFAA  A556                LDA     COLCRS+1
AFAC  8DA205              STA     SAVCOL+1
AFAF  AE3705              LDX     GSMODE          ; MASK FCOLOR DOWN TO RANGE.
AFB2  AD9B05              LDA     FCOLOR
AFB5  3DF6B7              AND     DATMSK,X
AFB8  8D9B05              STA     FCOLOR
                  *
                  *  READ DATA AT STARTING COORDINATES
                  *  SAVE AS " FIELD COLOR"
                  *
AFBB  209FAA              JSR     CNVRT           ; GET ADDRESS
                  *
AFBE  ADB105              LDA     DMASK
AFC1  31F6                AND     (ADRESS),Y
AFC3  4EB005      :FIL02  LSR     SHFAMT
AFC6  B003 ^AFCB          BCS     :FIL03
AFC8  4A                  LSR     A
AFC9  90F8 ^AFC3          BCC     :FIL02
AFCB  8D9C05      :FIL03  STA     FLDCLR          ; FIELD COLOR
AFCE  CD9B05              CMP     FCOLOR          ; SAME AS FILL COLOR?
AFD1  D003 ^AFD6          BNE     :FIL3D          ; NO.
AFD3  4C26B2              JMP     :FIL90          ; YES -- ALL DONE.
                  *
AFD6  2056B2      :FIL3D  JSR     FPLOT           ;PLOT INITIAL POINT
                  *
                  *
AFD9  20B8B2              JSR     TSTROW          ;TEST ROW
AFDC  2C9E05              BIT     ROWFLG
AFDF  1006 ^AFE7          BPL     :FIL04 ; NOT ROW 0
                  *
                  *  IF STARTING ROW = 0 THEN BEGIN
                  *  ALGORITHM IN THE DOWN DIRECTION
                  *
AFE1  A901                LDA     #DOWN
AFE3  8597                STA     ROWINC
AFE5  D004 ^AFEB          BNE     :FIL05
                  *
                  *  STARTING ROW > 0, BEGIN ALGORITHM
                  *  IN THE UP DIRECTION
                  *
AFE7  A9FF        :FIL04  LDA     #UP
AFE9  8597                STA     ROWINC
                  *
                  *  PLOT TO STARTING LEFT COLUMN
                  *
AFEB  2093B2      :FIL05  JSR     TSTCOL
AFEE  2C9F05              BIT     COLFLG
AFF1  3010 ^B003          BMI     :FIL07          ;COLCRS=0
                  *
AFF3  204AB2              JSR     DECCOL
AFF6  207CB2              JSR     TSTPIX
AFF9  D005 ^B000          BNE     :FIL06
AFFB  2056B2              JSR     FPLOT
AFFE  B0EB ^AFEB          BCS     :FIL05
                  *
B000  2043B2      :FIL06  JSR     INCCOL
B003  A555        :FIL07  LDA     COLCRS
B005  8DA305              STA     LFTCOL
B008  A556                LDA     COLCRS+1
B00A  8DA405              STA     LFTCOL+1
                  *
                  * RESET START COLUMN
                  *
B00D  ADA105              LDA     SAVCOL
B010  8555                STA     COLCRS
B012  ADA205              LDA     SAVCOL+1
B015  8556                STA     COLCRS+1
                  *
                  * FPLOT TO STARTING RIGHT COLUMN
                  *
B017  2093B2      :FIL08  JSR     TSTCOL
B01A  2C9F05              BIT     COLFLG
B01D  7010 ^B02F          BVS     :FIL10          ;SCREEN EDGE
                  *
B01F  2043B2              JSR     INCCOL
B022  207CB2              JSR     TSTPIX
B025  D005 ^B02C          BNE     :FIL09
B027  2056B2              JSR     FPLOT           ;FILL PIXEL
B02A  B0EB ^B017          BCS     :FIL08
B02C  204AB2      :FIL09  JSR     DECCOL
B02F  A555        :FIL10  LDA     COLCRS
B031  8DA705              STA     RGTCOL
B034  A556                LDA     COLCRS+1
B036  8DA805              STA     RGTCOL+1
                  *
                  *  TEST ROW -- IF TOP OR BOTTOM THEN
                  *              NOTHING REQUIRED ON STACK
                  *
B039  20B8B2              JSR     TSTROW
B03C  AD9E05              LDA     ROWFLG
B03F  D00F ^B050          BNE     :FIL11          ;TOP OR BOTTOM
                  *
                  *  PUSH ONTO FILL STACK --
                  *       ROWCRS
                  *       DIRECTION
                  *       LFTCOL
                  *       RGTCOL
                  *
B041  20D3B2              JSR     REVROW          ;REVERSE ROW/DIRECTION
                  *
B044  20E1B2              JSR     STKROW
B047  20F5B2              JSR     STKLC
B04A  2001B3              JSR     STKRC
                  *
B04D  20D3B2              JSR     REVROW          ;RESTORE
                  *
                  *
                  *  START THE FILL ALGORITHM
                  *
B050  18          :FIL11  CLC                     ;GO TO NEXT ROW
B051  A554                LDA     ROWCRS
B053  6597                ADC     ROWINC
B055  8554                STA     ROWCRS
                  *
B057  2022AC      :FIL12  JSR     GABRTC          ; OPERATOR ABORT?
B05A  D003 ^B05F          BNE     :FIL13          ; NO.
B05C  4C36B2              JMP     :FIL95          ; YES.
                  *
B05F  ADA305      :FIL13  LDA     LFTCOL
B062  8555                STA     COLCRS
B064  ADA405              LDA     LFTCOL+1
B067  8556                STA     COLCRS+1
                  *
B069  207CB2              JSR     TSTPIX
B06C  D062 ^B0D0          BNE     :FIL20          ;BORDER PIXEL
                  *
B06E  2056B2      :FIL14  JSR     FPLOT           ; FILL PIXEL
                  *
B071  A555                LDA     COLCRS          ;SAVE NEW
B073  8DA505              STA     NEWLC           ;LEFT
B076  A556                LDA     COLCRS+1        ;COLUMN
B078  8DA605              STA     NEWLC+1
                  *
B07B  2093B2              JSR     TSTCOL
B07E  2C9F05              BIT     COLFLG
B081  3008 ^B08B          BMI     :FIL15          ;LEFT SCREEN EDGE
                  *
B083  204AB2              JSR     DECCOL
B086  207CB2              JSR     TSTPIX
B089  F0E3 ^B06E          BEQ     :FIL14          ;FIELD PIXEL
                  *
                  *  BOUNDARY ENCOUNTERED
                  *  COMPARE NEWLC TO LFTCOL
                  *
B08B  38          :FIL15  SEC
B08C  ADA305              LDA     LFTCOL
B08F  EDA505              SBC     NEWLC
B092  8595                STA     DELTAC
B094  ADA405              LDA     LFTCOL+1
B097  EDA605              SBC     NEWLC+1
                  *
B09A  D006 ^B0A2          BNE     :FIL16 ;POSSIBLE OPENING
B09C  A595                LDA     DELTAC
B09E  C903                CMP     #3
B0A0  9070 ^B112          BCC     :FIL30
                  *
                  *
                  *  POSSIBLE OPENING -- TEST FOR CLOSURE
                  *
B0A2  20D3B2      :FIL16  JSR     REVROW
B0A5  2043B2      :FIL17  JSR     INCCOL
                  *
B0A8  A556                LDA     COLCRS+1
B0AA  CDA405              CMP     LFTCOL+1
B0AD  D00D ^B0BC          BNE     :FIL18
B0AF  A555                LDA     COLCRS
B0B1  CDA305              CMP     LFTCOL
B0B4  D006 ^B0BC          BNE     :FIL18
                  *
                  * CLOSURE -- LEFT EDGE FOUND
                  * NO AREA TO BE PLACED ON STACK
                  * CONTINUE WITH SEARCH FOR RIGHT EDGE
                  *
B0B6  20D3B2              JSR     REVROW
B0B9  4C12B1              JMP     :FIL30
B0BC  207CB2      :FIL18  JSR     TSTPIX
B0BF  D0E4 ^B0A5          BNE     :FIL17          ;BORDER PIXEL
                  *
                  *  FIELD COLOR FOUND --
                  *  SAVE AREA DEFINITION ON STACK
                  *
B0C1  20E1B2              JSR     STKROW
B0C4  20EBB2              JSR     STKCC           ;CURRENT COLCRS
B0C7  20F5B2              JSR     STKLC           ;LEFT COLUMN
                  *
B0CA  20D3B2              JSR     REVROW
B0CD  4C12B1              JMP     :FIL30
                  *
                  *
                  *  BOUNDARY PIXEL ABOVE/BELOW LEFT COLUMN
                  *  SEARCH RIGHT TO FIND NEW LFTCOL
                  *  IF RGTCOL REACHED W/O FIELD PIXEL,
                  *  THEN AREA IS CLOSED, JUMP TO POP
                  *  STACK
                  *
B0D0  ADA405      :FIL20  LDA     LFTCOL+1
B0D3  CDA805              CMP     RGTCOL+1
B0D6  D00B ^B0E3          BNE     :FIL21
B0D8  ADA305              LDA     LFTCOL
B0DB  CDA705              CMP     RGTCOL
B0DE  D003 ^B0E3          BNE     :FIL21
                  *
                  *  IF LFTCOL=RGTCOL THEN CLOSURE
                  *
B0E0  4CF8B1              JMP     :FIL70
                  *
B0E3  2043B2      :FIL21  JSR     INCCOL
                  *
B0E6  207CB2              JSR     TSTPIX
B0E9  F011 ^B0FC          BEQ     :FIL22
                  *
                  *  COMPARE TO RGTCOL
                  *
B0EB  A556                LDA     COLCRS+1
B0ED  CDA805              CMP     RGTCOL+1
B0F0  D0F1 ^B0E3          BNE     :FIL21
B0F2  A555                LDA     COLCRS
B0F4  CDA705              CMP     RGTCOL
B0F7  D0EA ^B0E3          BNE     :FIL21
B0F9  4CF8B1              JMP     :FIL70          ;CLOSURE
                  *
                  *
                  *  FIELD PIXEL FOUND --
                  *
                  *  FILL PIXEL
                  *  SET NEWLC
                  *  PROCEED TO SEARCH RIGHT FOR RGTCOL
                  *
B0FC  2056B2      :FIL22  JSR     FPLOT
B0FF  A555                LDA     COLCRS
B101  8DA505              STA     NEWLC
B104  8DA905              STA     NEWRC
B107  A556                LDA     COLCRS+1
B109  8DA605              STA     NEWLC+1
B10C  8DAA05              STA     NEWRC+1
B10F  4C37B1              JMP     :FIL34
                  *
                  *  SEARCH RIGHT FROM LFTCOL TO FIND
                  *  NEW RGTCOL
                  *
B112  ADA305      :FIL30  LDA     LFTCOL
B115  8555                STA     COLCRS
B117  8DA905              STA     NEWRC
B11A  ADA405              LDA     LFTCOL+1
B11D  8556                STA     COLCRS+1
B11F  8DAA05              STA     NEWRC+1
                  *
B122  2043B2      :FIL32  JSR     INCCOL
                  *
B125  207CB2              JSR     TSTPIX
B128  D015 ^B13F          BNE     :FIL35          ;BORDER PIXEL
                  *
B12A  2056B2              JSR     FPLOT           ;FILL PIXEL
                  *
B12D  A555                LDA     COLCRS
B12F  8DA905              STA     NEWRC
B132  A556                LDA     COLCRS+1
B134  8DAA05              STA     NEWRC+1
                  *
B137  2093B2      :FIL34  JSR     TSTCOL
B13A  2C9F05              BIT     COLFLG
B13D  50E3 ^B122          BVC     :FIL32          ;NOT RIGHT SCREEN EDGE
                  *
                  *  NEWRC FOUND -- COMPARE TO RGTCOL
                  *
B13F  ADAA05      :FIL35  LDA     NEWRC+1
B142  CDA805              CMP     RGTCOL+1
B145  900C ^B153          BCC     :FIL40
B147  F002 ^B14B          BEQ     :FIL36
B149  B046 ^B191          BCS     :FIL50
                  *
B14B  ADA905      :FIL36  LDA     NEWRC
B14E  CDA705              CMP     RGTCOL
B151  B03E ^B191          BCS     :FIL50
                  *
                  *  NEWRC < RGTCOL
                  *  IF DELTAC > 3 THEN POSSIBLE OPENING
                  *                     IN SAME DIRECTION
                  *
B153  38          :FIL40  SEC
B154  ADA705              LDA     RGTCOL
B157  EDA905              SBC     NEWRC
B15A  8595                STA     DELTAC
B15C  ADA805              LDA     RGTCOL+1
B15F  EDAA05              SBC     NEWRC+1
B162  D009 ^B16D          BNE     :FIL41
B164  A595                LDA     DELTAC
B166  C903                CMP     #3
B168  B003 ^B16D          BCS     :FIL41
B16A  4CD5B1              JMP     :FIL60
                  *
                  *  CHECK FOR CLOSURE
                  *
B16D  2043B2      :FIL41  JSR     INCCOL
B170  A556                LDA     COLCRS+1
B172  CDA805              CMP     RGTCOL+1
B175  D009 ^B180          BNE     :FIL43
B177  A555                LDA     COLCRS
B179  CDA705              CMP     RGTCOL
B17C  F002 ^B180          BEQ     :FIL43
B17E  B00E ^B18E          BCS     :FIL49  ;CLOSURE
                  *
B180  207CB2      :FIL43  JSR     TSTPIX
B183  D0E8 ^B16D          BNE     :FIL41
                  *
                  *  OPENING FOUND -- PUSH AREA
                  *    DEFINITION ON THE STACK
                  *
B185  20E1B2              JSR     STKROW
B188  20EBB2              JSR     STKCC   ;CURRENT COLORS
B18B  2001B3              JSR     STKRC   ;RIGHT COLUMN
                  *
B18E  4CD5B1      :FIL49  JMP     :FIL60
                  *
                  *
                  *  NEWRC >= RGTCOL
                  *  IF DELTAC > 3 THEN POSSIBLE OPENING
                  *                IN THE OPPOSITE DIRECTION
                  *
B191  F042 ^B1D5  :FIL50  BEQ     :FIL60
B193  38                  SEC
B194  ADA905              LDA     NEWRC
B197  EDA705              SBC     RGTCOL
B19A  8595                STA     DELTAC
B19C  ADAA05              LDA     NEWRC+1
B19F  EDA805              SBC     RGTCOL+1
B1A2  D006 ^B1AA          BNE     :FIL51
B1A4  A595                LDA     DELTAC
B1A6  C903                CMP     #3
B1A8  902B ^B1D5          BCC     :FIL60
                  *
                  * POSSIBLE OPENING - CHECK FOR CLOSURE
                  *
B1AA  20D3B2      :FIL51  JSR     REVROW
B1AD  204AB2      :FIL52  JSR     DECCOL
                  *
B1B0  A556                LDA     COLCRS+1
B1B2  CDA805              CMP     RGTCOL+1
B1B5  D00D ^B1C4          BNE     :FIL53
B1B7  A555                LDA     COLCRS
B1B9  CDA705              CMP     RGTCOL
B1BC  D006 ^B1C4          BNE     :FIL53
                  *
                  * CLOSURE
                  *
B1BE  20D3B2              JSR     REVROW
B1C1  4CD5B1              JMP     :FIL60
                  *
B1C4  207CB2      :FIL53  JSR     TSTPIX
B1C7  D0E4 ^B1AD          BNE     :FIL52
                  *
                  *  FIELD COLOR FOUND -- PUSH AREA
                  *   DEFINITION ON THE STACK
                  *
B1C9  20E1B2              JSR     STKROW
B1CC  2001B3              JSR     STKRC   ;RIGHT COLUMN
B1CF  20EBB2              JSR     STKCC   ;CURRENT COLORS
                  *
B1D2  20D3B2              JSR     REVROW
                  *
                  *
                  *  CURRENT ROW FILLED --
                  *   TEST FOR SCREEN EDGES, IF NOT
                  *   THEN RESET LFTCOL AND RGTCOL
                  *   AND JUMP TO START OF ALGORITHM
                  *
B1D5  20B8B2      :FIL60  JSR     TSTROW
B1D8  AD9E05              LDA     ROWFLG          ; SCREEN TOP OR BOTTOM
B1DB  D01B ^B1F8          BNE     :FIL70
                  *
B1DD  ADA505              LDA     NEWLC
B1E0  8DA305              STA     LFTCOL
B1E3  ADA605              LDA     NEWLC+1
B1E6  8DA405              STA     LFTCOL+1
                  *
B1E9  ADA905              LDA     NEWRC
B1EC  8DA705              STA     RGTCOL
B1EF  ADAA05              LDA     NEWRC+1
B1F2  8DA805              STA     RGTCOL+1
                  *
B1F5  4C50B0              JMP     :FIL11
                  *
                  *
                  *  CLOSURE DETERMINED --
                  *  POP FILL STACK FOR OTHER AREAS TO
                  *  BE FILLED
                  *
                  *  SETUP NEW ROW,DIRECTION,LFTCOL,RGTCGL
                  *  JUMP TO START OF ALGORITHM
                  *
B1F8  A274        :FIL70  LDX     #FSTACK-DTAB
B1FA  A030                LDY     #S1H-DTAB
B1FC  20159C              JSR     DCMPI
B1FF  F025 ^B226          BEQ     :FIL90
B201  2012B3              JSR     POPFS
B204  8DA805              STA     RGTCOL+1
B207  2012B3              JSR     POPFS
B20A  8DA705              STA     RGTCOL
B20D  2012B3              JSR     POPFS
B210  8DA405              STA     LFTCOL+1
B213  2012B3              JSR     POPFS
B216  8DA305              STA     LFTCOL
B219  2012B3              JSR     POPFS
B21C  8597                STA     ROWINC
B21E  2012B3              JSR     POPFS
B221  8554                STA     ROWCRS
                  *
B223  4C57B0              JMP     :FIL12
                  *
                  *  FILL FUNCTION COMPLETE
                  *
                  *  RESTORE STARTING CURSOR COORDINATES
                  *  AND RETURN
                  *
B226  ADA005      :FIL90  LDA     SAVROW
B229  8554                STA     ROWCRS
B22B  ADA105              LDA     SAVCOL
B22E  8555                STA     COLCRS
B230  ADA205              LDA     SAVCOL+1
B233  8556                STA     COLCRS+1
                  *
B235  60                  RTS
                  *
                  * FILL FUNCTION ABORT
                  *
B236  A03E        :FIL95  LDY     #GX1-DTAB
B238  20FFAB              JSR     SETCUR
B23B  209FAA              JSR     CNVRT
B23E  A987                LDA     #ABTERR
B240  4C3A7A              JMP     PSTOP
B243                      PROC
                  *
                  *  SUBROUTINES TO SUPPORT THE FILL ROUTINE
                  *
                  *
B243                      PROC
                  *
                  *  INCREMENT COLCRS
                  *
B243  E655        INCCOL  INC     COLCRS
B245  D002 ^B249          BNE     :ICX
B247  E656                INC     COLCRS+1
B249  60          :ICX    RTS
                  *
                  * DECREMENT COLCRS
                  *
B24A  38          DECCOL  SEC
B24B  A555                LDA     COLCRS
B24D  E901                SBC     #1
B24F  8555                STA     COLCRS
B251  B002 ^B255          BCS     :DCX
B253  C656                DEC     COLCRS+1
B255  60          :DCX    RTS
                  *
                  * PLOT DATA POINT AT ROWCRS,COLCRS
                  * ADRESS ALREADY SET BY CONVRT
                  *
B256  ADFF02      FPLOT   LDA     SSFLAG          ; HONOR START/STOP (CTRL-1).
B259  D0FB ^B256          BNE     FPLOT
B25B  ADB105              LDA     DMASK
B25E  8DB005              STA     SHFAMT
B261  AD9B05              LDA     FCOLOR          ; FILL COLOR
B264  4EB005      :FPLT1  LSR     SHFAMT
B267  B003 ^B26C          BCS     :FPLT2
B269  0A                  ASL     A
B26A  90F8 ^B264          BCC     :FPLT1          ;UNCONDITIONAL
B26C  8D9D05      :FPLT2  STA     MSKTMP          ;MASKED DATA
B26F  ADB105              LDA     DMASK
B272  49FF                EOR     #$FF
B274  31F6                AND     (ADRESS),Y
B276  0D9D05              ORA     MSKTMP
B279  91F6                STA     (ADRESS),Y
B27B  60                  RTS                     ;CARRY SET
B27C                      PROC
                  *
                  *  TSTPIX --
                  *    CONVERT ROW,COL TO ADDRESS
                  *    UNMASK DATA BIT(S) COMPARE WITH FIELD
                  *    COLOR RETURN TO TEST CONDITIONS
                  *
B27C  209FAA      TSTPIX  JSR     CNVRT
B27F  ADB105              LDA     DMASK
B282  8DB005              STA     SHFAMT
B285  31F6                AND     (ADRESS),Y
B287  4EB005      :TSTP1  LSR     SHFAMT          ;RIGHT JUSTIFY
B28A  B003 ^B28F          BCS     :TSTP2          ;DATA PIXEL
B28C  4A                  LSR     A
B28D  90F8 ^B287          BCC     :TSTP1          ;UNCONDITIONAL
B28F  CD9C05      :TSTP2  CMP     FLDCLR          ;COMPARE TO FIELD COLOR
B292  60                  RTS
B293                      PROC
                  *
                  *  TSTCOL -- TEST CURSOR COLUMN
                  *  SET COLFLG=$80 FOR COLUMN=0
                  *  SET COLFLG=$40 FOR COLUMN=MAX
                  *
B293  A900        TSTCOL  LDA     #0
B295  8D9F05              STA     COLFLG
                  *
B298  A556                LDA     COLCRS+1
B29A  0555                ORA     COLCRS
B29C  D006 ^B2A4          BNE     :TSTC1
                  *
                  * COLUMN=0
                  *
B29E  A980                LDA     #$80
B2A0  8D9F05              STA     COLFLG
B2A3  60                  RTS
                  *
B2A4  A556        :TSTC1  LDA     COLCRS+1
B2A6  CDAD05              CMP     MAXCOL+1
B2A9  D00C ^B2B7          BNE     :TSTC9
B2AB  A555                LDA     COLCRS
B2AD  CDAC05              CMP     MAXCOL
B2B0  D005 ^B2B7          BNE     :TSTC9
                  *
                  * COLUMN=MAXCOL (RIGHT SCREEN EDGE)
                  *
B2B2  A940                LDA     #$40
B2B4  8D9F05              STA     COLFLG
B2B7  60          :TSTC9  RTS
B2B8                      PROC
                  *
                  *  TSTROW -- TEST CURSOR ROW
                  *  SET ROWFLG=$80 FOR ROW=0
                  *  SET ROWFLG=$40 FOR ROW=MAX
                  *
B2B8  A900        TSTROW  LDA     #0
B2BA  8D9E05              STA     ROWFLG
B2BD  18                  CLC
B2BE  A554                LDA     ROWCRS
B2C0  D006 ^B2C8          BNE     :TSTR1
                  *
                  *  ROW=0
                  *
B2C2  A980                LDA     #$80
B2C4  8D9E05              STA     ROWFLG
B2C7  60                  RTS
                  *
B2C8  CDAB05      :TSTR1  CMP     MAXROW
B2CB  9005 ^B2D2          BCC     TSTRWX
                  *
                  *  ROW=MAXROW (BOTTOM SCREEN EDGE)
                  *
B2CD  A940                LDA     #$40
B2CF  8D9E05              STA     ROWFLG
                  *
B2D2  60          TSTRWX  RTS
B2D3                      PROC
                  *
                  *
                  *  REVROW -- REVERSE ROW INCREMENT
                  *            VALUE (CHANGE SIGN)
                  *            AND ADD TO ROWCRS
                  *
B2D3  18          REVROW  CLC
B2D4  A597                LDA     ROWINC
B2D6  49FF                EOR     #$FF
B2D8  6901                ADC     #1
B2DA  8597                STA     ROWINC
B2DC  6554                ADC     ROWCRS
B2DE  8554                STA     ROWCRS
B2E0  60                  RTS
B2E1                      PROC
                  *
                  *  STACK SUBROUTINES
                  *
                  *  STKROW - PUSH ROWCRS,ROWINC ONTO FILL STACK
                  *
B2E1  A554        STKROW  LDA     ROWCRS
B2E3  201FB3              JSR     PUSHFS
B2E6  A597                LDA     ROWINC
B2E8  4C1FB3              JMP     PUSHFS
                  *
                  *  STKCC - PUSH CURRENT COLUMN CURSOR ONTO STACK
                  *
B2EB  A555        STKCC   LDA     COLCRS
B2ED  201FB3              JSR     PUSHFS
B2F0  A556                LDA     COLCRS+1
B2F2  4C1FB3              JMP     PUSHFS
                  *
                  *  STKLC - PUSH LEFT COLUMN ONTO STACK
                  *
B2F5  ADA305      STKLC   LDA     LFTCOL
B2F8  201FB3              JSR     PUSHFS
B2FB  ADA405              LDA     LFTCOL+1
B2FE  4C1FB3              JMP     PUSHFS
                  *
                  *  STKRC - PUSH RIGHT COLUMN ONTO STACK
                  *
B301  ADA705      STKRC   LDA     RGTCOL
B304  201FB3              JSR     PUSHFS
B307  ADA805              LDA     RGTCOL+1
B30A  4C1FB3              JMP     PUSHFS
B30D  A9A4        STKOVF  LDA     #FSOFER
B30F  4C3A7A              JMP     PSTOP
                  ;
                  ; POPFS -- POP ONE BYTE FROM STACK
                  ;
B312  A5F4        POPFS   LDA     FSTACK ; FSTACK := FSTACK-1.
B314  D002 ^B318          BNE     :POP10
B316  C6F5                DEC     FSTACK+1
B318  C6F4        :POP10  DEC     FSTACK
B31A  A000                LDY     #0
B31C  B1F4                LDA     (FSTACK),Y
B31E  60                  RTS
                  ;
                  ; PUSHFS -- PUSH ONE BYTE TO STACK.
                  ;
B31F  A4F5        PUSHFS  LDY     FSTACK+1
B321  C4B3                CPY     S2L+1
B323  B0E8 ^B30D          BCS     STKOVF
B325  A000                LDY     #0
B327  91F4                STA     (FSTACK),Y
B329  E6F4                INC     FSTACK          ; FSTACK := FSTACK+1
B32B  D002 ^B32F          BNE     :PSH90
B32D  E6F5                INC     FSTACK+1
B32F  60          :PSH90  RTS
                  *
                  *  TABLES
                  *
                  *  DIV2TR = NUMBER OF SHIFTS FOR COLUMN CURSOR
                  *           (INDICATES PIXELS PER BYTE)
                  *  DMASKT = TABLE OF PIXEL MASKS
                  *
                  *
                  *        DINDEX    ANTIC MODE   BYTSML   DIV2TB
                  *
                  *          0           2          40        0
                  *          1           6          20        0
                  *          2           7          20        0
                  *          3           8          10        2
                  *          4           9          10        3
                  *          5           A          20        2
                  *          6           8          20        3
                  *          7           D          40        2
                  *          8           F          40        3
                  *          9        GTIA 1        40        1
                  *          A        GTIA 2        40        1
                  *          B        GTIA 3        40        1
                  *          C           4          40        0
                  *          D           5          40        0
                  *          E           C          20        3
                  *          F           E          40        2
                  *
B330  0000000203  DIV2TB  DB      0,0,0,2,3,2,3,2,3,1,1,1,0,0,3,2
                  *
B340  00FFF00F    DMASKT  DB      $00,$FF,$F0,$0F
B344  C0300C03            DB      $C0,$30,$0C,$03
B348  80402010            DB      $80,$40,$20,$10
B34C  08040201            DB      $08,$04,$02,$01
                  *
B350                      PROC
                  ;
                  ; ROBOT TURTLE SUBCOMMANDS FOR PILOT GRAPHICS.
                  ;
                  ;
                  ; RBINIT -- INITIALIZE 'ROBOT TURTLE'
                  ;
B350  AD0305      PBINIT  LDA     RBVECT+1        ; ROBOT DRIVER INSTALLED?
B353  F033 ^B388          BEQ     :RI099          ; NO.
B355  A920                LDA     #RBON           ; INITIALIZE.
B357  8DC705              STA     RBTCMD
B35A  4C25B4              JMP     REXEC           ; EXIT THROUGH DRIVER.
                  ;
                  ; RONOFF -- 'ROBOT ON/OFF' SUBCOMMAND.
                  ;
B35D  AD0305      RONOFF  LDA     RBVECT+1        ; ROBOT DRIVER INSTALLED?
B360  F021 ^B383          BEQ     :RN090          ; NO.
B362  A20A                LDX     #ONOFFX         ; CHECK 'ON' OR 'OFF'.
B364  20AB7C              JSR     SBCMAT
B367  D01C ^B385          BNE     :RN092          ; NOT FOUND -- ERROR.
B369  8A                  TXA                     ; SET CC FOR 'ON'/'QFF'.
B36A  F00F ^B37B          BEQ     :RF020          ; 'OFF'.
                  ; 'ROBOT ON'.
B36C  8EC505              STX     RBTON           ; FLAG 'ROBOT ON'.
B36F  A920                LDA     #RBON           ; INTERNAL COMMAND.
B371  4C1BB4              JMP     RXDRIV          ; RETURN THROUGH DRIVER.
                  ; 'ROBOT OFF'.
                  ; *** EXTERNAL ENTRY FROM 'GEXIT' ***.
B374  AD0305      RBTOFF  LDA     RBVECT+1        ; ROBOT DRIVER INSTALLED?
B377  F00F ^B388          BEQ     :RN099          ; GO -- NOP.
B379  A200                LDX     #0              ; FLAG 'ROBOT OFF'.
B37B  8EC505      :RF020  STX     RBTON
B37E  A900                LDA     #RBOFF          ; INTERNAL COMMAND.
B380  4C1BB4              JMP     RXDRIV          ; RETURN THROUGH DRIVER.
B383              :RH090
B383              :RP090
B383              :RE090
B383  A902        :RN090  LDA     #IVCERR         ; NO 'ROBOT' OR 'OFF'.
B385              :RH092
B385              :RP092
B385              :RE092
B385  4C3A7A      :RN092  JMP     PSTOP
B388              :RI099
B388  60          :RN099  RTS
                  ;
                  ; REYES -- ROBOT 'EYES' SUBCOMMAND.
                  ;
B389  ADC505      REYES   LDA     RBTON           ; IS ROBOT ON?
B38C  F0F5 ^B383          BEQ     :RE090          ; NO -- ERROR.
B38E  A20A                LDX     #ONOFFX         ; CHECK FOR 'ON' OR 'OFF'.
B390  20AB7C              JSR     SBCMAT
B393  D0F0 ^B385          BNE     :RE092          ; NOT FOUND -- ERROR.
B395  A901                LDA     #RBEYES         ; INTERNAL COMMAND.
B397  4C1BB4              JMP     RXDRIV          ; RETURN THROUGH DRIVER.
                  ;
                  ; RPEN -- ROBOT 'RPEN' SUBCOMMAND.
                  ;
B39A  ADC505      RPEN    LDA     RBTON           ; IS ROBOT ON?
B39D  F0E4 ^B383          BEQ     :RP090          ; NO -- ERROR.
B39F  A208                LDX     #UPDWNX         ; CHECK FOR 'UP' OR 'DOWN'.
B3A1  20AB7C              JSR     SBCMAT
B3A4  D0DF ^B385          BNE     :RP092          ; NOT FOUND -- ERROR.
B3A6  8A                  TXA                     ; CONVERT TO 0 (UP)/1 (DOWN).
B3A7  A200                LDX     #0              ; ASSUME UP.
B3A9  C940                CMP     #PCDN
B3AB  D001 ^B3AE          BNE     :RP010          ; UP.
B3AD  E8                  INX                     ; DOWN.
B3AE  A902        :RP010  LDA     #RBPEN          ; INTERNAL COMMAND.
B3B0  4C1BB4              JMP     RXDRIV          ; RETURN THROUGH DRIVER.
                  ;
                  ; RHORN -- ROBOT 'HORN' SUBCOMMAND.
                  ;
                  ; 'RHORN OFF' = 'RHORN 0'.
                  ; 'RHORN ON'  = 'RHORN 1'.
                  ;
B3B3  ADC505      RHORN   LDA     RBTON           ; IS ROBOT ON?
B3B6  F0CB ^B383          BEQ     :RH090          ; NO -- ERROR.
B3B8  A20A                LDX     #ONOFFX         ; CHECK FOR 'ON' OR 'OFF'.
B3BA  20AB7C              JSR     SBCMAT
B3BD  F013 ^B3D2          BEQ     :RH020          ; FOUND IT.
                  ; NOT 'ON' OR 'OFF' - CHECK FOR 0,1,2.
B3BF  206E81              JSR     ATOM            ; GET 'HORN' PARAMETER.
B3C2  D0C1 ^B385          BNE     :RH092          ; ERROR -- RETURN.
B3C4  C902                CMP     #NUM            ; CHECK FOR NUMBER.
B3C6  D0BB ^B383          BNE     :RH090          ; NO -- ERROR.
B3C8  A6B9                LDX     NUMBER+1        ; 0,1,2 VALID.
B3CA  D0B7 ^B383          BNE     :RH090          ; INVALID.
B3CC  A6B8                LDX     NUMBER
B3CE  E003                CPX     #3
B3D0  B0B1 ^B383          BCS     :RH090          ; INVALID.
B3D2  A903        :RH020  LDA     #RBHORN         ; INTERNAL COMMAND.
B3D4  4C1BB4              JMP     RXDRIV          ; RETURN THROUGH DRIVER.
                  ;
                  ; RGO -- ROBOT 'GO' SUBCOMMAND.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       ROBOT TURTLE ON
                  ;       EXPSTK+0,+1 = SIGNED MAGNITUDE.
                  ;       EXECUTE MODE
                  ;
                  ;       JSR     RGO
                  ;
B3D7  A215        RGO     LDX     #EXPSTK+2-DTAB  ; EXPSTK+2,+3 = ABSOLUTE VALUE.
B3D9  A013                LDY     #EXPSTK-DTAB
B3DB  20459A              JSR     DMOVI
B3DE  A980                LDA     #RBFWD          ; ASSUME FORWARD.
B3E0  2496                BIT     EXPSTK+3        ; NOW CHECK SIGN.
B3E2  1005 ^B3E9          BPL     RGO010          ; FORWARD IT IS.
B3E4  20F19C              JSR     DNEGI           ; ABSOLUTE VALUE.
B3E7  A981                LDA     #RBBACK         ; BACK.
                  ; *** EXTERNAL ENTRY FROM 'RTURN' ***.
B3E9  8DC705      RGO010  STA     RBTCMD          ; INTERNAL COMMAND.
B3EC  A595                LDA     EXPSTK+2        ; VALUE.
B3EE  8DC805              STA     RBTPRM
B3F1  A596                LDA     EXPSTK+3
B3F3  8DC905              STA     RBTPRM+1
B3F6  4C25B4              JMP     REXEC           ; RETURN THROUGH DRIVER.
                  ;
                  ; RTURN -- ROBOT 'TURN' SUBCOMMAND.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       ROBOT TURTLE ON
                  ;       EXPSTK+0,+1 = SIGNED MAGNITUDE
                  ;       EXECUTE MODE
                  ;
                  ;       JSR     RTURN
                  ;
B3F9  A215        RTURN   LDX     #EXPSTK+2-DTAB  ; EXPSTK+2,+3 = ABSOLUTE VALUE.
B3FB  A013                LDY     #EXPSTK-DTAB
B3FD  20459A              JSR     DMOVI
B400  A941                LDA     #RBRGHT         ; ASSUME RIGHT.
B402  2496                BIT     EXPSTK+3        ; NOW CHECK SIGN
B404  10E3 ^B3E9          BPL     RGO010          ; RIGHT IT IS.
B406  20F19C              JSR     DNEGI           ; ABSOLUTE VALUE
B409  A940                LDA     #RBLEFT         ; LEFT.
B40B  D0DC ^B3E9          BNE     RGO010
                  ;
                  ; RRDSNS -- ROBOT 'READ SENSORS'.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       JSR     RRDSNS
                  ;
                  ;       RBTSNS = SENSOR VALUES.
                  ;       ;      = SNESOR VALUES.
                  ;
B40D  A980        RRDSNS  LDA     #RBFWD          ; 'GO 0' IS A 'NOP'.
B40F  A200                LDX     #0
B411  8EC905              STX     RBTPRM+1        ; MSB = 0.
B414  201BB4              JSR     RXDRIV          ; UPDATE SENSORS.
B417  ADC605              LDA     RBTSNS          ; AS ADVERTISED.
B41A  60                  RTS
B41B                      PROC
                  ;
                  ; RXDRIV -- INTERFACE TO ROBOT DRIVER.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = INTERNAL COMMAND.
                  ;       X = LSB OF INTERNAL PARAMETER.
                  ;
                  ;       JSR RXDRIV
                  ;
                  ;       RETURN WITH 'BEQ' ONLY IF OPERATION COMPLETED.
                  ;       JUMP TO 'PSTOP' IF 'BREAK' OR LOGIC ERROR.
                  ;
                  ;       Y IS PRESERVED.
                  ;
                  ;       CHECKS 'EXEC' FLAG AND RETURNS 'OK' IF 'FALSE'.
                  ;
B41B  8DC705      RXDRIV  STA     RBTCMD          ; INTERNAL COMMAND.
B41E  A592                LDA     EXEC            ; EXECUTE?
B420  F01D ^B43F          BEQ     :RX099          ; NO.
B422  8EC805              STX     RBTPRM          ; LSB (INTERNAL PARAMETER).
                  ; *S*   JMP     REXEC           ; INTERFACE TO DRIVER.
                  ;
                  ; REXEC -- CALL ROBOT DRIVER.
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       'RBTCMD' = INTERNAL COMMAND BYTE.
                  ;       'RBTPRM' = INTERNAL PARAMETER WORD.
                  ;
                  ;       JSR REXEC
                  ;       Y IS PRESERVED.
                  ;
                  ;       RETURN IF OPERATION COMPLETED.
                  ;       JUMP TO 'PSTOP' IF 'BREAK' OR LOGIC ERROR.
                  ;
B425  84A1        REXEC   STY     TEMP            ; SAVE Y.
B427  2040B4              JSR     :RX100          ; 'JSR' TO DRIVER.
B42A  204FB4              JSR     TONES
                  ; Y = 1 (OK); = 128 (BREAK); = 132 (LOGIC ERROR).
                  ; A = ROBOT SENSOR STATE.
B42D  8DC605              STA     RBTSNS
B430  C080                CPY     #128
B432  9007 ^B43B          BCC     :RX090          ; OK.
      = 0000              IF DEBUG
   -                      BEQ     :RX020          ; BREAK.
   -              :RX010  LDA     #INTERR         ; 'BUG'.
   -                      BNE     :RX022
                          ENDIF
B434  A987        :RX020  LDA     #ABTERR         ; BREAK.
B436  A4A1        :RX022  LDY     TEMP            ; RESTORE Y.
B438  4C3A7A              JMP     PSTOP
B43B  A4A1        :RX090  LDY     TEMP            ; RESTORE Y.
B43D  A900                LDA     #0              ; SET CC FOR EXIT.
B43F              :RX099
B43F  60                  RTS
B440              :RX100
      = 0000              IF DEBUG
   -                      LDA     RBVECT+1        ; ROBOT DRIVER INSTALLED?
   -                      BEQ     :RX010          ; NO -- BUG.
                          ENDIF
B440  ADC705              LDA     RBTCMD          ; STACK-3.
B443  48                  PHA
B444  ADC805              LDA     RBTPRM          ; STACK-2.
B447  48                  PHA
B448  ADC905              LDA     RBTPRM+1        ; STACK-1.
B44B  48                  PHA
B44C  6C0205              JMP     (RBVECT)
B44F                      PROC
                  ;
                  ; AUDIO TONE GENERATION PROCESSOR
                  ;
B44F  A208        TONES   LDX     #AUREGS*2       ; SETUP TO SCAN REGISTER ASSIGN TABLE.
B451  BD1305      :TO010  LDA     AUDIOR-2,X      ; POINTER TO VARIABLE.
B454  85B6                STA     POINT
B456  1D1405              ORA     AUDIOR-1,X      ; NULL ENTRY IF RESULT IS ZERO.
B459  F003 ^B45E          BEQ     :TO020
B45B  BD1405              LDA     AUDIOR-1,X      ; FINISH MOVING NON-NULL POINTER.
      = 0000              IF      FALSE
   -                      STA     POINT+1
   -                      BMI     :TO020          ; NUMERIC CONSTANT.
   -                      LDY     #0              ; NOW GET VALUE.
   -                      LDA     (POINT),Y
                          ENDIF
B45E  291F        :TO020  AND     #$1F            ; MODULO 32.
B460  A8                  TAY
B461  B971B4              LDA     AUDTAB,Y        ; GET FREQ FROM TABLE.
B464  9DFED1              STA     AUDF1-2,X       ; PUT IN HARDWARE.
B467  A9A4                LDA     #$A4            ; QUARTER VOLUME.
B469  9DFFD1              STA     AUDC1-2,X
B46C  CA                  DEX
B46D  CA                  DEX
B46E  D0E1 ^B451          BNE     :TO010
B470  60          :TO090  RTS
B471  00          AUDTAB  DB   0 ; REST
B472  F3E6D9CCC1          DB   243,230,217,204,193,182
B478  ACA2999088          DB   172,162,153,144,136,128
B47E  79726C6660          DB   121,114,108,102,96,91
B484  55514C4844          DB   85,81,76,72,68,64
B48A  3C3935322F          DB   60,57,53,50,47,45
B490  2A                  DB   42
B491                      PROC
                  ;
                  ; PILVBL -- DEFERRED VBLANK ROUTINE WHICH READS THE
                  ;           CONSOLE KEYS (START/OPTION/SELECT), DEBOUNCES
                  ;           THEM AND RETURNS THE STATUS IN 'CONKEY'.
                  ;
B491  209AB4      PILVBL  JSR     CONKRD          ; READ CONSOLE KEYS.
B494  207AA5              JSR     TRTLOC          ; VISIBLE TURTLE.
B497  4C62E4              JMP     XITVBV          ; EXIT VBLANK.
B49A  AD6505      CONKRD  LDA     CSTATE          ; IDLE STATE?
B49D  D01C ^B4BB          BNE     :CK010          ; NO.
B49F  AD1FD0              LDA     CONSOL          ; YES -- KEY PRESSED?
B4A2  2907                AND     #ANYKEY
B4A4  C907                CMP     #ANYKEY
B4A6  F03E ^B4E6          BEQ     :CK090          ; NO -- ALL DOME.
B4A8  4907                EOR     #ANYKEY         ; INVERT BIT SENSE.
B4AA  8D4405              STA     CONKEY          ; SAVE FOR 'MLOOP'.
B4AD  EE6505              INC     CSTATE          ; GO TO STATE 1.
B4B0  A90C                LDA     #$0C            ; PUT RETURN CODE IN 'CH'.
B4B2  8DFC02              STA     CH
B4B5  A905                LDA     #5              ; ACTIVATE TIMER.
B4B7  8D2002              STA     CDTMV5
B4BA  60                  RTS
B4BB  C901        :CK010  CMP     #1              ; KEY DOWN DEBOUNCE STATE?
B4BD  D009 ^B4C8          BNE     :CK020          ; NO.
B4BF  AD2002              LDA     CDTMV5          ; YES -- DEBOUNCE DONE?
B4C2  D022 ^B4E6          BNE     :CK090          ; NO.
B4C4  EE6505              INC     CSTATE          ; GO TO STATE 2.
B4C7  60                  RTS
B4C8  C902        :CK020  CMP     #2              ; WAIT FOR KEYS UP STATE?
B4CA  D012 ^B4DE          BNE     :CK030          ; NO.
B4CC  AD1FD0              LDA     CONSOL          ; YES -- ALL KEYS UP?
B4CF  2907                AND     #ANYKEY
B4D1  C907                CMP     #ANYKEY
B4D3  D011 ^B4E6          BNE     :CK090          ; NO.
B4D5  EE6505              INC     CSTATE          ; YES -- GO TO STATE 3.
B4D8  A905                LDA     #5              ; ACTIVATE TIMER.
B4DA  8D2002              STA     CDTMV5
B4DD  60                  RTS
B4DE  AD2002      :CK030  LDA     CDTMV5          ; DEBOUNCE DONE?
B4E1  D003 ^B4E6          BNE     :CK090          ; NO.
B4E3  8D6505              STA     CSTATE          ; YES -- GO TO STATE 0.
B4E6  60          :CK090  RTS
B4E7  48          GRDLI   PHA
B4E8  8D0AD4              STA     WSYNC
B4EB  A984                LDA     #CBLUE
B4ED  454F                EOR     COLRSH          ; ATTRACT
B4EF  254E                AND     DRKMSK
B4F1  8D18D0              STA     COLPF2
B4F4  A91A                LDA     #CYELLO
B4F6  454F                EOR     COLRSH          ; ATTRACT
B4F8  254E                AND     DRKMSK
B4FA  8D17D0              STA     COLPF1
B4FD  68                  PLA
B4FE  40                  RTI
B4FF                      PROC
                  ;
                  ; MESSOT -- MESSAGE GENERATOR
                  ;
                  ; CALLING SEQUENCE:
                  ;
                  ;       A = MESSAGE # (INDEX TO INTERNAL TABLE)
                  ;
                  ;       JSR     MESSOT
                  ;
      = B4FF      MESSOT = *
B4FF  297F                AND     #$7F ; MASK OFF SIGN BIT.
B501  0A                  ASL     A
      = 0000              IF      DEBUG
   -                      BEQ     :MO100          ; 0 IS ILLEGAL.
   -                      CMP     #MTSIZ+1
   -                      BCS     :MO100          ; # IS TOO LARGE.
                          ENDIF
B502  AA                  TAX
B503  BD34B5              LDA     MESTAB-2,X      ; GET MESSAGE ADDRESS FROM TABLE.
B506  85A7                STA     TEMP2
B508  BD35B5              LDA     MESTAB-1,X
B50B  85A8                STA     TEMP2+1
B50D  A000                LDY     #0
B50F  B1A7        :MO010  LDA     (TEMP2),Y
B511  F018 ^B52B          BEQ     :MO090          ; DONE (NO EOL AT END).
B513  C8                  INY                     ; BUMP POINTER.
B514  C90D                CMP     #CR             ; INTERNAL CR?
B516  D006 ^B51E          BNE     :MO015          ; NO.
B518  20989F              JSR     NEWLIN
B51B  4C0FB5              JMP     :MO010          ; CONTINUE.
B51E  C99B        :MO015  CMP     #EOL
B520  F006 ^B528          BEQ     :MO020          ; DONE.
B522  208294              JSR     CHOT
B525  4C0FB5              JMP     :MO010
B528  20989F      :MO020  JSR     NEWLIN
B52B  60          :MO090  RTS
      = 0000              IF     DEBUG
   -              :MO100  LSR     A
   -                      STA     ACC             ; PRINT # INSTEAD OF CANNED MESSAGE
   -                      LDA     #0
   -                      STA     ACC+1
   -                      LDA     #14
   -                      JSR     MESSOT          ; *** RECURSIVE CALL ***
   -                      LDX     #ACC-DTAB
   -                      JSR     DECASC
   -                      JMP     NEWLIN
                          ENDIF
B52C                      PROC
B52C  84A9        RDYMES  STY     TEMP2+2         ; SAVE Y REG.
B52E  A901                LDA     #RDYTXT         ; "READY" TEXT.
B530  20FFB4              JSR     MESSOT
B533  A4A9                LDY     TEMP2+2
B535  60                  RTS
B536                      PROC
                  ;
                  ; TABLE OF MESSAGE ADDRESSES
                  ;
B536  90B5        MESTAB  DW   :MES1
B538  97B5                DW   :MES2
B53A  A4B5                DW   :MES3
B53C  BBB5                DW   :MES4
B53E  C7B5                DW   :MES5
B540  CCB5                DW   :MES6
B542  D7B5                DW   :MES7
B544  DDB5                DW   :MES8
B546  E3B5                DW   :MES9
B548  EBB5                DW   :MES10
B54A  F2B5                DW   :MES11
B54C  97B5                DW   :MES12
B54E  FEB5                DW   :MES13
B550  97B5                DW   :MES14
B552  97B5                DW   :MES15
B554  12B6                DW   :MES16
B556  1BB6                DW   :MES17
B558  25B6                DW   :MES18
B55A  32B6                DW   :MES19
B55C  3EB6                DW   :MES20
B55E  45B6                DW   :MES21
B560  54B6                DW   :MES22
B562  62B6                DW   :MES23
B564  88B6                DW   :MES24
B566  8DB6                DW   :MES25
B568  9CB6                DW   :MES26
B56A  A1B6                DW   :MES27
B56C  B1B6                DW   :MES28
B56E  C5B6                DW   :MES29
B570  CAB6                DW   :MES30
B572  E0B6                DW   :MES31
B574  FAB6                DW   :MES32
B576  1CB7                DW   :MES33
B578  35B7                DW   :MES34
B57A  49B7                DW   :MES35
B57C  5CB7                DW   :MES36
B57E  75B7                DW   :MES37
B580  94B7                DW   :MES38
B582  A7B7                DW   :MES39
B584  AEB7                DW   :MES40
B586  BBB7                DW   :MES41
B588  C8B7                DW   :MES42
B58A  CFB7                DW   :MES43
B58C  D6B7                DW   :MES44
B58E  DEB7                DW   :MES45
      = 005A      MTSIZ   = *-MESTAB
B590  0D52454144  :MES1   DB   CR,'READY',EOL
      = FFFF              IF     DEBUG-1
B597              :MES12
B597              :MES14
B597              :MES15
                          ENDIF
B597  5748415427  :MES2   DB   'WHAT',SQUOTE,'S THAT?',0
B5A4  43414E2754  :MES3   DB   'CAN',SQUOTE,'T USE COMMAND HERE',0
B5BB  4449564944  :MES4   DB   'DIVIDE BY 0',0
B5C7  4F4F505300  :MES5   DB   'OOPS',0
B5CC  492F4F2045  :MES6   DB   'I/O ERROR ',0
B5D7  425245414B  :MES7   DB   'BREAK',0
B5DD  202A2A2A20  :MES8   DB   ' *** ',0
B5E3  4E4F20524F  :MES9   DB   'NO ROOM',0
B5EB  5748455245  :MES10  DB   'WHERE?',0
B5F2  553A20544F  :MES11  DB   'U: TOO DEEP',0
      = 0000              IF     DEBUG
   -              :MES12  DB   'BUG!',0
                          ENDIF
B5FE  4C494E4520  :MES13  DB   'LINE # OUT OF RANGE',0
      = 0000              IF     DEBUG
   -              :MES14  DB   'ERROR #',0
   -              :MES15  DB   'PLEASE SHORTEN',EOL
                          ENDIF
B612  2420564152  :MES16  DB   '$ VARS:',CR,EOL
B61B  0D23205641  :MES17  DB   CR,'# VARS:',CR,EOL
B625  0D55534520  :MES18  DB   CR,'USE STACK:',CR,EOL
B632  0D47522050  :MES19  DB   CR,'GR PARMS:',CR,EOL
B63E  5448455441  :MES20  DB   'THETA=',0
B645  0D0D465245  :MES21  DB   CR,CR,'FREE MEMORY=',0
B654  544F4F204D  :MES22  DB   'TOO MANY I/OS',0
B662  7D41544152  :MES23  DB   CLEAR,'ATARI PILOT (C) COPYRIGHT ATARI 1982',EOL
B688  2D2D3E2000  :MES24  DB   '--> ',0
B68D  43414E2754  :MES25  DB   'CAN',SQUOTE,'T CONTINUE',0
B69C  53544F5000  :MES26  DB   'STOP',0
B6A1  0D43414E27  :MES27  DB   CR,'CAN',SQUOTE,'T RENUMBER',EOL
B6B1  4F5645524C  :MES28  DB   'OVERLAPPING RANGE: ',0
B6C5  20544F2000  :MES29  DB   ' TO ',0
B6CA  0D50524F47  :MES30  DB   CR,'PROGRAM IS UNCHANGED',EOL
B6E0  0D594F5520  :MES31  DB   CR,'YOU ARE ABOUT TO DELETE ',0
B6FA  204C494E45  :MES32  DB   ' LINE(S).',CR,'ARE YOU SURE (Y OR N): ',0
B71C  53504C4954  :MES33  DB   'SPLIT SCREEN NOT ALLOWED',0
B735  4E4F542041  :MES34  DB   'NOT A GRAPHICS MODE',0
B749  0D492F4F20  :MES35  DB   CR,'I/O ASSIGNMENTS:',CR,EOL
B75C  5348414445  :MES36  DB   'SHADE REGION TOO COMPLEX',0
B775  4E4F204D4F  :MES37  DB   'NO MORE PEN COLORS--USE CHANGE',0
B794  414C524541  :MES38  DB   'ALREADY HAVE COLOR',0
B7A7  50454E533A  :MES39  DB   'PENS: ',0
B7AE  4241434B47  :MES40  DB   'BACKGROUND: ',0
B7BB  545552544C  :MES41  DB   'TURTLE PEN: ',0
B7C8  4D4F44453A  :MES42  DB   'MODE: ',0
B7CF  454447453A  :MES43  DB   'EDGE: ',0
B7D6  5350454544  :MES44  DB   'SPEED: ',0
B7DE  57414C4C53  :MES45  DB   'WALLS: ',0
                          EPROC
                  ;
                  ; GRAPHICS TABLES
                  ;
                  ;
                  ; MODE CHARACTERISTICS (BY MODE)
                  ;
      = 0000      NG      =    0                  ; NOT ALLOWED
      = 0080      FO      =    $80                ; ALLOWED BUT NO SPLIT SCREEN (FULL ONLY)
      = 0090      SC      =    FO+SPLIT           ; ALLOWED WITH SPLIT SCREEN.
B7E6  000000      GCHAR   DB   NG,NG,NG
B7E9  9090909090          DB   SC,SC,SC,SC,SC,SC,FO,FO,FO
B7F2  00009090            DB   NG,NG,SC,SC
                  ;
                  ; PIXEL WIDTH MASKS
                  ;
B7F6  FFFFFF      DATMSK  DB   $FF,$FF,$FF
B7F9  0301030103          DB   3,1,3,1,3,1,$F,$F,$F
B802  FFFF0103            DB   $FF,$FF,1,3
                  ; NUMBER OF FOREGROUND COLORS
B806  000404      COLRS   DB   0,4,4
B809  0301030103          DB   3,1,3,1,3,1,15,8,15
B812  00000103            DB   0,0,1,3
                  ; SCREEN CENTER OFFSETS
B816  1300090009  XCENTR  DW   19,9,9
B81C  1300270027          DW   19,39,39,79,79,159,39,39,39
B82E  130013004F          DW   19,19,79,79
B836  0B000B0005  YCENTR  DW   11,11,5
B83C  0B00170017          DW   11,23,23,47,47,95,95,95,95
B84E  0B0005005F          DW   11,5,95,95
                  ; SCREEN BOUNDARIES FOR FILL
B856  2600120012  COLMAX  DW   38,18,18
B85C  26004E004E          DW   38,78,78,158,158,318,78,78,78
B86E  260026009E          DW   38,38,158,158
B876  160016000A  ROWMAX  DW   22,22,10
B87C  16002E002E          DW   22,46,46,94,94,190,190,190,190
B88E  16000A00BE          DW   22,10,190,190
                  ; TEXT SCREEN MARGINS
B896  020000      LMRGTB  DB   2,0,0              ; LEFT MARGINS.
B899  271313      RMRGTB  DB   39,19,19           ; RIGHT MARGINS
                  ; COLOR CLOCKS PER HORIZONTAL UNIT FOR MODES 0 - 15.
B89C  080808      CCPXTB  DB   8,8,8
B89F  0402020101          DB   4,2,2,1,1,0,2,2,2  ; (0 = 1/2)
B8A8  04040101            DB   4,4,1,1
                  ; SCAN LINES PER CURSOR VERTICAL UNIT FOR MODES 0 - 15.
B8AC  100810      SLPYTB  DB   16,8,16
B8AF  0804040202          DB   8,4,4,2,2,1,1,1,1  ; (0 = 1/2)
B8B8  08100101            DB   8,16,1,1
                  ; THIS IS THE NUMBER OF LEFT SHIFTS NEEDED TO MULTIPLY COLORS
                  ; BY # BYTES/ROW.  (ROWCRS*5)/(2*DHLINE)
B8BC  030202      DHLINE  DB   3,2,2
B8BF  0101020203          DB   1,1,2,2,3,3,3,3,3
B8C8  03030203            DB   3,3,2,3
                  ;
B8CC  00010307    HMASK   DB   0,1,3,7
                  ; OFFSETS TQ DISPLAY LIST INTERRUPT BYTE FOR SPLIT SCREEN.
B8D0  000000      DLIOFF  DB   0,0,0
B8D3  182C2C5454          DB   24,44,44,84,84,166,0,0,0
B8DC  0000A4A6            DB   0,0,164,166
                  ; VISIBLE TURTLE Y OFFSET
B8E0  0101000100  TRDY    DB   1,1,0,1,0,0
B8E6  0002010101          DB   0,2,1,1,1,0
B8EC  0000020101          DB   0,0,2,1,1,2
B8F2  0000000100          DB   0,0,0,1,0,1
                  ; VISIBLE TURTLE X OFFSET
B8F8  0303030303  TRDX    DB   3,3,3,3,3,3
B8FE  0303030303          DB   3,3,3,3,3,3
B904  0303030304          DB   3,3,3,3,4,4
B90A  0504040404          DB   5,4,4,4,4,4
                  ; VISIBLE TURTLE PLAYER DATA
B910  10383810BA  VTURT   DB   $10,$38,$38,$10,$BA,$FE,$6C,$EE,$FE,$FE,$7C,$7C,$BA,$82    ; 0
      = 000E      VTHITE  = *-VTURT                                                       ; HEIGHT OF TURTLE REP.
B91E  06066E367C          DB   $06,$06,$6E,$36,$7C,$7C,$EE,$EE,$BE,$7F,$7D,$7D,$04,$0C    ; 1
B92C  3313BFFE7E          DB   $33,$13,$BF,$FE,$7E,$EE,$EE,$FF,$FD,$7D,$3C,$18,$08,$18    ; 2
B93A  30133BBFFC          DB   $30,$13,$3B,$BF,$FC,$7E,$EE,$EE,$FF,$7D,$7D,$38,$08,$18    ; 3
B948  1808BBFF7D          DB   $18,$08,$BB,$FF,$7D,$EE,$EE,$FE,$7C,$7D,$3B,$20,$60,$00    ; 4
B956  3090FB7FFF          DB   $30,$90,$FB,$7F,$FF,$EE,$EC,$7E,$7C,$32,$46,$C0,$00,$00    ; 5
B964  0888B07878          DB   $08,$88,$B0,$78,$78,$EA,$EF,$FA,$78,$78,$B0,$88,$08,$00    ; 6
B972  0000C04632          DB   $00,$00,$C0,$46,$32,$7C,$7E,$EC,$EE,$FF,$7F,$FB,$90,$30    ; 7
B980  0060203B7D          DB   $00,$60,$20,$3B,$7D,$7C,$EE,$EE,$FE,$7D,$FF,$BB,$08,$18    ; 8
B98E  1808387D7D          DB   $18,$08,$38,$7D,$7D,$FF,$EE,$EE,$7E,$FC,$BF,$3B,$13,$30    ; 9
B99C  1808183C7D          DB   $18,$08,$18,$3C,$7D,$FD,$EF,$EE,$FE,$7E,$FE,$BF,$13,$33    ; 10
B9AA  0C047D7D7F          DB   $0C,$04,$7D,$7D,$7F,$AE,$EE,$FE,$7C,$7C,$36,$6E,$06,$06    ; 11
B9B8  82BA7C7CFE          DB   $82,$BA,$7C,$7C,$FE,$EE,$EE,$7C,$FE,$BA,$10,$38,$38,$10    ; 12
B9C6  3020BEBE7E          DB   $30,$20,$BE,$BE,$7E,$6D,$6F,$7F,$3E,$3E,$6C,$76,$60,$60    ; 13
B9D4  1810183CBE          DB   $18,$10,$18,$3C,$BE,$BF,$FF,$6F,$6F,$7E,$7F,$FD,$C8,$CC    ; 14
B9E2  18101CBEBE          DB   $18,$10,$1C,$BE,$BE,$FF,$6F,$6F,$7E,$3F,$FD,$DC,$C8,$0C    ; 15
B9F0  000604DCBE          DB   $00,$06,$04,$DC,$BE,$3E,$77,$77,$7F,$BE,$FF,$DD,$10,$18    ; 16
B9FE  00000362AC          DB   $00,$00,$03,$62,$4C,$3E,$7E,$37,$77,$FF,$FE,$DF,$09,$0C    ; 17
BA0C  10110D1E1E          DB   $10,$11,$0D,$1E,$1E,$5B,$FB,$5F,$1E,$1E,$0D,$11,$10,$00    ; 18
BA1A  0C09DFFEFF          DB   $0C,$09,$DF,$FE,$FF,$77,$37,$7E,$3E,$4C,$62,$03,$00,$00    ; 19
BA28  1810DDFFBE          DB   $18,$10,$DD,$FF,$BE,$77,$77,$7F,$3E,$BE,$DC,$04,$06,$00    ; 20
BA36  0CC8DCFD3F          DB   $0C,$C8,$DC,$FD,$3F,$7E,$77,$77,$FF,$BE,$BE,$1C,$10,$18    ; 21
BA44  CCC8FD7F7E          DB   $CC,$C8,$FD,$7F,$7E,$77,$77,$FF,$BF,$BE,$3C,$18,$10,$18    ; 22
BA52  6060766C3E          DB   $60,$60,$76,$6C,$3E,$3E,$77,$77,$7D,$7E,$BE,$BE,$20,$30    ; 23
                  ; COLOR REGISTER ASSIGNMENTS
BA60                      PROC
BA60  80BA        COLADR  DW   :CSET0             ; MODE 0
BA62  84BA                DW   :CSET1             ; MODE 1
BA64  84BA                DW   :CSET1             ; MODE 2
BA66  84BA                DW   :CSET1             ; MODE 3
BA68  84BA                DW   :CSET1             ; MODE 4
BA6A  84BA                DW   :CSET1             ; MODE 5
BA6C  84BA                DW   :CSET1             ; MODE 6
BA6E  84BA                DW   :CSET1             ; MODE 7
BA70  89BA                DW   :CSET2             ; MODE 8
BA72  8DBA                DW   :CSET3             ; MODE 9
BA74  91BA                DW   :CSET4             ; MODE 10
BA76  8DBA                DW   :CSET3             ; MODE 11
BA78  80BA                DW   :CSET0             ; MODE 12
BA7A  80BA                DW   :CSET0             ; MODE 13
BA7C  84BA                DW   :CSET1             ; MODE 14
BA7E  84BA                DW   :CSET1             ; MODE 15
BA80  00000000    :CSET0  DB   0,0,0,0
BA84  0804050607  :CSET1  DB   8,4,5,6,7          ; BAK, PF0, PF1, PF2 (,PF3 FOR MODES 1 & 2).
BA89  06050000    :CSET2  DB   6,5,0,0            ; PF2, PF1
BA8D  08000000    :CSET3  DB   8,0,0,0            ; BAK
BA91  0001020304  :CSET4  DB   0,1,2,3,4,5,6,7,8
                          EPROC
      = BA99      PRGEND  =    *-1
BA9A                      END     PILINI