view 3rdparty/packages/basic09/basic09.asm @ 3054:22ddd48b4ec2

level1 krn: Fix scheduler bug that only affected 6309 The original 6809 binary was correct, but it was disassembled and interpreted wrongly, so that reassembly went wrong on 6309.
author Tormod Volden <debian.tormod@gmail.com>
date Sun, 25 Jan 2015 22:36:02 +0100
parents a74820eb1e86
children
line wrap: on
line source

********************************************************************
* Basic09 - BASIC for OS-9
*
* $Id$
*
* Edt/Rev  YYYY/MM/DD  Modified by
* Comment
* ------------------------------------------------------------------
*  22      2002/10/09  Boisy G. Pitre
* Obtained from Curtis Boyle, marked V1.1.0.
*
* BASIC09 - Copyright (C) 1980 by Microware & Motorola
***********
* Basic09 & RunB programs have extended memory module headers. Layout is as
*  follows:
*   Offset  | Name       | Purpose
*   --------+------------+----------
*   $0000   |  M$ID      | Module sync bytes ($87CD)
*   $0002   |  M$Size    | Size of module
*   $0004   |  M$Name    | Offset to module name
*   $0006   |  M$Type    | Type/Language ($22 for RUNB modules)
*   $0007   |  M$Revs    | Attributes/Revision level
*   $0008   |  M$Parity  | Header parity check
*   $0009   |  M$Exec    | Execution offset (start of tokenized RUNB code)
*   $000B   |  ???       | Data area size required
*   $000D   |  ???       | ???
*   $0017   |  ???       | Flags:
*           |            |   x0000000 - 1=Packed, 0=Not packed
*           |            |   0x000000 - ??? but 1 when CRC has just been made
*           |            |   0000000x - 1=Line with compiler error
*           |            |              0=No lines with compiler errors
*   $0018   |  ???       | Size of module name
* NitrOS9 V1.21 mods
* 06/17/94 - Changed intercept routine @ L07B5: Replaced LSL <u0034/COMA/
*            ROR <u0034/RTI with OIM #$80,<u0034/RTI/NOP/NOP 
*          - Changed routine @ start:
*               FROM                TO
*          4   LEAU >$100,u    4   LDW #$100
*          1   CLRA            2   CLR ,-s
*          1   CLRB            3   TFM s,u+
*          2   STD  ,--u       2   LEAS 1,s
*          3   CMPU ,s         1   NOP
*          2   BHI  L07C9      1   NOP
* Bytes:  15                  15
*          - Changed CLRA/LDB #$01 to LDD #$0001 @ end of start
* 06/22/94 - Changed L0DBB (reset temp buffer to empty state) to use PSHS D
*          - LDA #1 / STA <u007D / LDD <u0080 / STD <u0082 / PULS PC,D
*            (saves 5 cycles) ALSO WORKS AS 6809 MOD
*          - Changed BEQ L08E3 to BEQ L08E5 @ L08D3 (Std in for commands)
*          - Changed numerous CLRA/CLRB and COMA/COMB to CLRD & COMD respectiv
*            just to shorten source
* 06/27/94 - Added 2nd TFM to init routine to clear out $400-$4ff
* 06/28/94 - Changed BRA L5632 @ L5614 to PULS PC,U,A (6809 TOO)
* 12/22/94 - BIG TEST: TOOK OUT NOP'D CODE - SEE IF IT STILL WORKS
*          - IT DOESN'T - MOVED ALL NOPS TO JUST BEFORE ICPT ROUTINE TO
*            SEE IF THE SEPARATION OF CODE & DATA MAKES A DIFFERENCE
*          - THIS APPEARS TO WORK...THEREFORE, SOME REFERENCES TO THE DATA
*            AT THE BEGINNING OF BASIC09 IS STILL BEING REFERRED TO BY OFFSETS
*            IN THE CODE, THAT HAVE NOT BEEN FIXED UP YET.
* 12/23/94 - AFTER FIXING L03F0 TABLE, ATTEMPTED TO REMOVE 'TEST'
* 12/28/94 - Worked, changed 16 bit,pc's to 8 bit,pc's @:
*            L0DFC  leax L0E5F,pc  *
*            L1436  leax L1434,pc  *
*            L15B3  leax L15AA,pc  *
*            L1B97  leax L1B93,pc  *  (Doesn't seem to be referenced)
*            L39E0  leax L39DA,pc  *
*            L4751  leax L474D,pc  *
*            L479F  leax L479A,pc  *
*            L4812  leax L4805,pc  *
*            L4B03  leau L4AF4,pc  *
*            L4B0A  leau L4AF9,pc  *
*            L5791  leax L5723,pc  *
* 01/03/95 - Changed a ChgDir @ L397D to do it in READ mode, not UPDATE
* 01/04/95 - Changed L0C18 - 3 CLR ,Y+ to LEAY 3,Y
*            Changed LEAU ,Y / STD ,--U / STA ,-U to LEAU -3,y/STD ,u/
*              STD 2,u
*          - Changed LDA #$02 / LDB #SS.Size to LDD #$02*256+SS.Size @ L0D6B
*              (create output file)
*          - Replaced BEQ L2D17 @ L2D0B with BEQ L2CE1, removed L2D17 altog-
*            ether, change LBSR L2A26 @ L2D0B with LBRA L2A26
* 01/09/95 - Attempted to change both CLRA/CLRB (CLRD)'s @ L0F96 to CLRA for
*            F$Load/F$Link (since neither require B)
*          - Changed L0C83 frm LBSR L12CF to LBSR L1371
*          - Changed L12CF from LDA #C$CR/LBRA L1373 to LBRA L1371
* 01/12/95 - Attempted to remove LDD <U002F / ADDD $F,x @ L1A2E, move TFR
*            D,Y to earlier in code when [u002F]+($F,x) is calculated
* 01/17/95 - Removed useless CMPB #$00 @ L1E9B
*          - Moved L1FF5 label to an earlier RTS, removed original (saves 1 by
*          - Removed useless CMPA #$00 @ L2115
* 01/19/95 - Changed STB <u00A4 / STA <u00A3 to STD <u00A3 @ L236A
*          - Changed LDA <u00A3/CMPA <u00A3 to LDA <u00A3/ORCC #Zero @ L218E
*             (1 cycle faster)
*          - Changed L243F: took out LEAY -1,y, added BRA L2453 (saves 2 cycle
*             from original method)
* 01/20/95 - Changed L1B09 from to auto-inc Y, skip LEAY 1,Y entirely, & chang
*            LEAY 5,Y to LEAY 4,Y (+2 cyc if [,y]=$4F, but -3 cyc on any other
*            value)
*          - Changed L1B6D: changed CLRA / LDB D,X to to ABX / LDB ,X (3 cyc
*            faster on 6809/2 cyc faster on 6309)
*          - Mod @ L233E: Changed LBSR L2430 to LBSR L2432 (just did
*            L245D call, and 2nd call to it will return same Y anyways)
*          - Changed CLR ,Y+ to STB ,Y+ @ L2494
*          - Attempted to move L2368 routine to just before L239D routine to
*            change LBRA L2415 to BRA L2415. Changed L23EC from LBRA L236A to
*            STD <u00A3 / BRA L2415
*          - Changed LBHS L2A0D / BRA L27CE @ L27A3 to BLO L27CE / LBRA L2A0D
*          - Attempted Mod @ L2D2C - Changed LEAX B,X to ABX
* 01/23/95 - Made following mods involving L2E3B routine:
*            Changed CMPA #0 to TSTA, reversed L2EDC's LDA <u00D1 & LEAY 3,Y 
*            so TSTA not needed, changed BRA L2E3B to BRA L2E41 @: L2E89,
*            L2E8F, L2E95, L2E9F. Changed BRA L2E3B to BRA L2E3C @ L2EDC
*          - Changed LDA #1 to INCA @ L2E3B (since A=0 at this point)
*          - Took out CMPA #0, changed LDD #$0060 to LDB #$60 @ L2EE3
*          - Changed TST <u00D0 to LDA <u00D0 (saves 2 cyc) and following 4
*            lines @ L2F5E to version on right (+1 byte, -5 cycles):
*            lda #5             ldd #$ffff
*            sta <u00D1         std <u00D4
*            ldd #$ffff         lda #5
*            bra L2FB9          sta <u00D1
*              (std <u00D4/     rts
*               lda <u00D1/rts
* 01/31/95 - Moved L308D to just before L26CE (eliminates LBRA)
* 02/03/95 - Changed LBRA L1EC9 @ L216B to LBRA L233E (saves extra LBRA, saves
*            5/4 cycles)
* 02/13/95 - Moved JSR <u001B / FCB 8 from L3C29 to just after L4F77 to change
*            LBSR to BSR
* 02/14/95 - Moved 3 text strings that are only referred to once to their res-
*            pective routines in the code: L07AA to near L1882, L078B to near
*            L198A, and L0799 to L1211
*          - Moved JSR <u001E / FCB 4 from L010A to after L090F (called twice
*            from just before here)
*          - Attempted to move JSR <u001E / fcb 2 from L010D to just before
*            L0AC3 (change some LBSR's to BSR's)
*          - Moved L0110 (JSR <u001E / fcb 0) to just before L0DF6
*          - Moved L0113 (JSR <u0021 / fcb 0) to just before L0DF6
* 02/15/95 - Moved L0116 (JSR <u0024 / fcb 0) to just after L082E
*          - Moved L0119 (JSR <u0024 / fcb 0) to just after L0DFC
*          - Moved L011C (JSR <u0024 / fcb 2) to just after L0DFC
*          - Moved L011F (JSR <u002A / fcb 2) to just after L1394
*          - Moved L0122 (JSR <u001E / fcb A) to just before L1606
*          - Moved L0125 (JSR <u001E / fcb 6) to just after L19D1
*          - Moved L0128 (JSR <u001E / fcb 6) to just after L0B51
*          - Moved L012B (JSR <u0021 / fcb 6) to just after L110A
*          - Moved L012E (JSR <u0021 / fcb 4) to just after L119E
*          - REMARKED OUT L0131 JSR VECTOR - NOT CALLED IN BASIC09
*          - Moved L0134 (JSR <u0024 / fcb C) to just after L104E
*          - Moved L0137 (JSR <u0024 / fcb 8) to just after L119E
*          - Moved L013A (JSR <u002A / fcb 0) to just after L175A
*          - Moved L1CC1 (JSR <u001B / fcb 2) to just after L1E1C
*          - Moved L1CC4 (JSR <u001B / fcb 4) to just after L1E1F
*          - Moved L1CC7 (JSR <u001B / fcb 6) to replace LBRA L1CC7 @ L1E1C
*            & embedded JSR <u001B/fcb 4 @ L2428 since LBRA, not LBSR
*          - Moved L1CCA (JSR <u002A / fcb 0) to just after L239D
*          - Moved L1CCD (JSR <u001B / fcb $12) to just after L22C7
*          - Took out 2nd TST <u0035 / BNE L194C @ L191C
*          - Eliminated L2572 since duplicate of L1CC1, & not speed crucial
*          - Eliminated L2575 since duplicate of L1CC7, changed LBRA L2575 @
*            L2A0D to LBRA L1CC7
* 02/16/95 - Moved L2578 (JSR <u001B / fcb $14) to end of L2FDA (replacing
*            LBRA to it)
*          - Moved L257B (JSR <u001E / fcb 8) to end of L3069
*          - Moved L257E (JSR <u001E / fcb 6) to end of L310B
*          - Eliminated L3206 since duplicate of L1CC7, changed 3 LBRA calls
*            to it to go to L1CC7 instead (saves 3 bytes)
*          - Moved L3209 to just after table @ L323F, changed table entry from
*            L35F0 to L3209, eliminated L35F0 LBRA entirely
*          - Moved L320C (JSR <u001B / fcb $E) to end of L39A0
* 02/24/95 - Eliminated L320F since dupe of L1CC1, change appropriate LBSR's @
*            L3A1B & L3A23
*          - Moved L3212 (JSR <u001B / fcb 0) to end of L3A89
* 02/27/95 - Moved L3215 (JSR <u001B / fcb $A) to end of L3BF3
*          - Moved L3218 (JSR <u001B / fcb $10) to end of L3A42
*          - Took out L321B (JSR <u001E/fcb 6), replaced LBRA to it @ L35CA
*            with JSR/fcb
*          - Moved L321E (JSR <u0027/fcb 4) to end of L347E
*          - Moved L3221 (JSR <u0027/fcb $A) to end of L348E
*          - Moved L3224 (JSR <u0027/fcb 2) to before L3A8A, and moved 2 lines
*            from L35BB to here too)
*          - Moved L3227 (JSR <u0027/fcb $C) to after L381C
*          - Moved L322A (JSR <u0027/fcb $E) to after L381C
*          - Moved L322D (JSR <u0027/fcb 0) to after L3BFF
*          - Moved L3230 (JSR <u002A/fcb 2), even though dupe of L011F, to
*            after L3779
* 02/28/95 - Embedded L3233 (JSR <u001B/fcb $18) @ L35F3 & L3A23, changed LBSR
*            @ L3371 to point to L35F3 version
*          - Moved L3236 (JSR <u001B/fcb $16) to after L3391
*          - L3239 (JSR <u001B/fcb $1A) is NEVER CALLED IN BASIC09.
*            Removed L3239 entirely
*          - Embedded L323C (JSR <u001B/fcb $1C) @ L34DC since LBRA
*          - Changed LDB #0 @ L388F to CLRB
*          - Embedded L3C2C (JSR <u0024/fcb 6 (error handler)) @ L3DD5,L3E78,
*            L3F2E,L44C2,L458C,L491C,L4FC7) Moved it to just after L40CC.
*          - Changed LDB #0 @ L4409 to CLRB (part of Boolean routines)
*          - Changed LDB #0 @ L5046 to CLRB
*          - Removed L3C2F (dupe of L011F), changed LBSR's @ L471F & L4FAA to
*            it
*          - Moved L3C32 to after L505E (shorten LEAX)
* 03/01/95 - Modified Integer Multiply to use MULD @ L3EE1
* 03/10/95 - Modified Negate of REAL #'s to use EIM @ L3FA4 (saves 4 cyc)
*          - Changed L3FBB (Real add with dest var=0) to use LDQ/STQ (saves
*            6 cyc)
* 03/13/95 - Changed NEGA/NEGB/SBCA #0 to NEGD @ L4512 & L4591
*          - Changed BPL L451E to BPL L451F @ L4512 (eliminates 2nd useless
*            TSTA)
* 03/15/95 - Changed LDB $B,y/ANDB #$FE/STB $B,y & LDB 5,y/ANDB #$FE/STB $B,y
*            to AIM's @ L3FE5 (Real Add & Subtract)
*          - Changed ADCB 3,y/ADCA 2,y to ADCD 2,y @ L4039 (Real Add/Subtact)
*          - Changed SBCB 3,y/SBCA 2,y TO SBCD 2,y @ L400B (Real Add/Subtact)
*          - Changed LDA 5,y/ANDA #$FE/STA 5,y to AIM #$FE,5,y @ L45AE (ABS
*            for real #'s
*          - Changed NEGA/NEGB/SBCA #0 to NEGD @ L45B5 (ABS for Integers)
*          - Ditched special checks for 0 or 2 in Integer Multiply (L3EC1),
*            since overhead from checks is as slow or slower as straight MULD
*            except in dest. var=0's case
* 03/16/95 - Changed 2 LDD/STD's @ L3F93 to LDQ/STQ
* 03/18/95 - Changed Integer Divide (and MOD) routines to use DIVQ
* 03/20/95 - Changed L3F7C (copy Real # to temp var from inc'd X) to use
*            LDQ/STQ/LDB #4/ABX
*          - Moved Integer MOD routine (L46A2) to nearer divide (changes LBSR
*            to BSR)
* 04/23/95 - Changed Real Add/Subtract mantissa shift (L4082-L40C9) to use
*            <u0014 (unused in BASIC09) to hold shift count instead of stack
*            (saves 2 cyc for STA vs. PSHS, saves 1 cyc per DEC, & saves 5 cyc
*            by eliminating LEAS 1,s) (6809)
* 04/26/95 - Split real add/subtract out & made two versions: 6809 & 6309
* 06/09/95 - Modified 6309 REAL add/subtract routine - now 13-15% faster
* 06/20/95 - Took out useless LDB 2,s @ L412D (Real Multiply)
* 07/18/95 - Changed sign fix in Real Add @ L4071 to use TFR w,d/lsrb/lslb/orb
*            ,y/std $a,y
*          - Split real multiply out & made two versions: 6809 & 6309
* 08/11/95 - Removed useless LEAS 1,s in Init routine
*          - Split real divide out & made two versions: 6809 & 6309
* 08/15/95 - Removed useless: STA <u00BD in start, useless CLR <u0035 @ L07FC,
*            Changed LDD #1 to LDB #1/STD <u002D to STB <u002E in start, and
*            L07FC/L082E routine to use W instead of stack for base address
*          - Changed 'bye <CR>' buffer fill @ L08E5 to use LDQ/STQ
* 11/12/95 - Changed L3405 to use INCD instead of ADDD #1 (NEXT Integer STEP 1
*          - Changed L341E to TFR A,E instead of PSHS A, changed TST ,S+ to
*            TSTE (NEXT Integer STEP <>1)
* 11/16/95 - Changed to L345E (REAL NEXT STEP 1) to do direct call to REAL add
*            routine (changed BSR L321E/BSR L34DC to LBSR L3FB1)
*          - As per above, changed same call @ L34A5 (REAL NEXT STEP <>1), and
*            eliminated L321E completely
*          - @ L347E & L34CC, eliminated L3221 calls, replaced BSR L3221's
*            with LBSR L4449 (Real Compare) (in REAL NEXT, both cases)
* 11/25/95 - Remove L50A1 & L509E (calls to REAL Multiply & REAL divide),
*            changed L529B to call them directly (prints exponents?)
* 11/30/95 - Changed L3AF9 to use SUBR (saves 1 byte/9 cyc on RUN (mlsub)
* 12/05/95 - Changed L3A48 (called by REM) to use ABX instead of CLRA/LEAX D,X
*            (used to jump ahead in I-Code to skip remark text)
*          - Attempted to just move L33DF (NEXT) & L34E5 (FOR) Tables to just
*            after L3446 for 8 bit offsets - also removed LSLB @ L33EA
* 02/12/95 - Changed routines around L57EB to skip ORCC if not necessary (blo&
*            bcs)
*          - Changed LEAX to 8 bit from 16 @ L4B89
* 06/07/14 - Changed Date$ to conform with Y2K changes in F$Time. RG
********************************

* Version Numbers
B09Vrsn  equ   1         
B09Major equ   1         
B09Minor equ   0         

         NAM   Basic09   
         TTL   BASIC for OS-9

         IFP1            
         USE   defsfile  
         ENDC            

         mod   eom,name,Prgrm+Objct,ReEnt+0,start,size

u0000    rmb   2          Start of data memory / DP pointer
u0002    rmb   2          Size of Data area (including DP)
u0004    rmb   2          Ptr to list of Modules in BASIC09 workspace ($400)
u0006    rmb   1          ??? NEVER REFERENCED (possibly leftover from RUNB)
u0007    rmb   1          ??? NEVER REFERENCED
u0008    rmb   2          Ptr to start of I-code workspace
u000A    rmb   2          # bytes used by all programs for code in user workspace
* Data area sizes are taken from module headers Permanent storage size ($B-$C)
u000C    rmb   2          Bytes free in BASIC09 workspace for user
u000E    rmb   2          Ptr to jump table (L323F only) - Only used from L3D4A
u0010    rmb   2          Inited to L3CB5 (jump table)
u0012    rmb   2          Inited to L3D35 (jump table)
u0014    rmb   1          ??? NEVER REFERENCED
u0015    rmb   1          ??? NEVER REFERENCED
u0016    rmb   1          JMP ($7e) instruction
u0017    rmb   2          Address for above (inited to L3D41)
u0019    rmb   2          Inited to L3C32 (JSR <u001B / FCB $1A)
* The following vectors all contain a JMP >$xxxx set up from the module header
u001B    rmb   3          Jump vector #1  (Inited to L00DC)
u001E    rmb   3          Jump vector #2  (Inited to L1CA5)
u0021    rmb   3          Jump vector #3  (Inited to L255A)
u0024    rmb   3          Jump vector #4  (Inited to L31E8)
u0027    rmb   3          Jump vector #5  (Inited to L3C09)
u002A    rmb   3          Jump vector #6  (Inited to L5084)
u002D    rmb   1          Standard Input path # (Inited to 0)
u002E    rmb   1          Standard Output path # (inited to 1)
u002F    rmb   2          Ptr to start of 'current' module in BASIC09 workspace
u0031    rmb   2          Ptr to start of variable storage
u0033    rmb   1         
u0034    rmb   1          Flag: if high bit set, signal has been receieved
u0035    rmb   1          Last signal received
u0036    rmb   1          Error code
u0037    rmb   2         
u0039    rmb   1         
u003A    rmb   1         
u003B    rmb   1         
u003C    rmb   1         
u003D    rmb   1         
u003E    rmb   1         
u003F    rmb   1         
u0040    rmb   2         
u0042    rmb   1         
u0043    rmb   1         
* Next 2 are variable ptrs of some sort, temporary? Permanent?
u0044    rmb   2          Inited to $300 (some table that is built backwards)
u0046    rmb   2          Inited to $300
u0048    rmb   1         
u0049    rmb   1         
u004A    rmb   2          Ptr to end of currently used I-code workspace+1
u004C    rmb   1         
u004D    rmb   1         
u004E    rmb   2         
u0050    rmb   1          Inited to $0e
u0051    rmb   1          Inited to $12
u0052    rmb   1          Inited to $14
u0053    rmb   1          Inited to $A2
u0054    rmb   1          Inited to $BB
u0055    rmb   1          Inited to $40
u0056    rmb   1          Inited to $E6
u0057    rmb   1          Inited to $2D
u0058    rmb   1          Inited to $36
u0059    rmb   1          Inited to $19
u005A    rmb   2          Inited to $62E9
u005C    rmb   2         
u005E    rmb   2          Absolute exec address of basic09 module in memory
u0060    rmb   2          Absolute address of $F offset in basic09 mod in mem
u0062    rmb   2          Absolute address of $D offset in basic09 mod in mem
u0064    rmb   2          ??? Size of module-$D,x in mod hdr + 3
u0066    rmb   1         
u0067    rmb   1         
u0068    rmb   1         
u0069    rmb   1         
u006A    rmb   1         
u006B    rmb   1         
u006C    rmb   1         
u006D    rmb   1         
u006E    rmb   1         
u006F    rmb   1         
u0070    rmb   2         
u0072    rmb   2         
u0074    rmb   1         
u0075    rmb   1         
u0076    rmb   1         
u0077    rmb   1         
u0078    rmb   1         
u0079    rmb   1         
u007A    rmb   1         
u007B    rmb   1         
u007C    rmb   1         
u007D    rmb   1          Current # chars active in temp buffer ($100-$1ff)
u007E    rmb   1         
u007F    rmb   1         
u0080    rmb   2          Pointer to start of temp buffer ($100)
u0082    rmb   2          Pointer to current position in temp buffer ($100-$1ff)
u0084    rmb   1         
* For u0085, the following applies:
* 0=Integer, 1=Hex, 2=Real, 3=Exponential, 4=String, 5=Boolean, 6=Tab,
* 7=Spaces, 8=Quoted text
u0085    rmb   1          Specifier # for print using
u0086    rmb   1         
u0087    rmb   1         
u0088    rmb   1         
u0089    rmb   1         
u008A    rmb   1         
u008B    rmb   1         
u008C    rmb   2         
u008E    rmb   2         
u0090    rmb   1         
u0091    rmb   1         
u0092    rmb   2         
u0094    rmb   1         
u0095    rmb   1         
u0096    rmb   1         
u0097    rmb   1         
u0098    rmb   1         
u0099    rmb   1         
u009A    rmb   1         
u009B    rmb   1         
u009C    rmb   1         
u009D    rmb   1         
u009E    rmb   2          Ptr to current command table (normally L0140)
u00A0    rmb   1          ??? Flag of some sort?
u00A1    rmb   2         
u00A3    rmb   1          Token # from command table
u00A4    rmb   1          Command type (flags?) from command table
u00A5    rmb   1          Flag type of name string (2=Non variable)
u00A6    rmb   1          Size of current string/variable name (includes '$' on strings)
u00A7    rmb   2          Ptr to end of name string+1
u00A9    rmb   2          ??? Ptr of some sort
u00AB    rmb   2          Ptr to current line I-code end
u00AD    rmb   2          ??? Dupe of above
u00AF    rmb   2          ??? duped from AB @ L1F90
u00B1    rmb   2         
u00B3    rmb   2          # steps to do (debug mode from STEP command)
u00B5    rmb   2         
u00B7    rmb   2         
u00B9    rmb   1         
u00BA    rmb   1         
u00BB    rmb   1          ??? (inited to 0 at during load process)
u00BC    rmb   1         
u00BD    rmb   1          (inited to 0) - Path # of newly opened path
u00BE    rmb   1          I$Dup path # for duplicate of error path
u00BF    rmb   2         
u00C1    rmb   2         
u00C3    rmb   2         
u00C5    rmb   1         
u00C6    rmb   1         
u00C7    rmb   1         
u00C8    rmb   2         
u00CA    rmb   1         
u00CB    rmb   1         
u00CC    rmb   1         
u00CD    rmb   1         
u00CE    rmb   1         
u00CF    rmb   1         
u00D0    rmb   1         
u00D1    rmb   1          Some sort of variable type
u00D2    rmb   2         
u00D4    rmb   2         
u00D6    rmb   2          Size of var in bytes (from u00D1)
u00D8    rmb   1         
u00D9    rmb   1          Inited to 1
u00DA    rmb   1         
u00DB    rmb   1         
u00DC    rmb   1         
u00DD    rmb   1         
u00DE    rmb   1         
u00DF    rmb   1         
u00E0    rmb   1         
u00E1    rmb   1         
u00E2    rmb   2         
u00E4    rmb   1         
u00E5    rmb   1         
u00E6    rmb   2         
u00E8    rmb   2         
u00EA    rmb   1         
u00EB    rmb   4         
u00EF    rmb   3         
u00F2    rmb   1         
u00F3    rmb   6         
u00F9    rmb   1         
u00FA    rmb   4         
u00FE    rmb   1         
u00FF    rmb   1         
u0100    rmb   $100       256 byte temporary buffer for various things
u0200    rmb   $100       ??? ($200-$2ff) built backwards 2 bytes/time
u0300    rmb   $100       BASIC09 stack area ($300-$3ff)
u0400    rmb   $100       List of module ptrs (modules in BASIC09 workspace)
u0500    rmb   $100       I-Code buffer (for running)
u0600    rmb   $2000-.    Default buffer for BASIC09 programs & data
size     equ   .         

* Jump tables installed at $1b in DP: in form of JMP to (address of BASIC09's
* header in memory + 2 byte in table). In other words, jump to LXXXX
L000D    fdb   L00DC      $1b jump vector
         fdb   L1CA5      $1e jump vector
         fdb   L255A      $21 jump vector
         fdb   L31E8      $24 jump vector
         fdb   L3C09      $27 jump vector
         fdb   L5084      $2A jump vector
         fdb   $0000      End of jump vector table marker

name     fcs   /Basic09/ 

L0022    fdb   $1607      Edition #22 ($16)

* Intro screen

L0024    fcb   $0C       
         fcc   '            BASIC09'
         fcb   $0A       
         IFNE  H6309     
         fcc   '     6309 VERSION 0'
         ELSE            
         fcc   '     6809 VERSION 0'
         ENDC            
         fcb   B09Vrsn+$30
         fcc   '.0'      
         fcb   B09Major+$30
         fcc   '.0'      
         fcb   B09Minor+$30
         fcb   $0A       
         fcc   'COPYRIGHT 1980 BY MOTOROLA INC.'
         fcb   $0A       
         fcc   '  AND MICROWARE SYSTEMS CORP.'
         fcb   $0A       
         fcc   '   REPRODUCED UNDER LICENSE'
         fcb   $0A       
         fcc   '       TO TANDY CORP.'
         fcb   $0A       
         fcc   '    ALL RIGHTS RESERVED.'
         fcb   $8A       

* Jump vector @ $1B goes here
L00DC    pshs  x,d        Preserve regs
         ldb   [<$04,s]   Get function offset
         leax  <L00EC,pc  Point to vector table
         ldd   b,x        Get return offset
         leax  d,x        Point to return address
         stx   $4,s       Change RTS address to it
         puls  d,x,pc     restore regs and return to new address

* Vector offsets for above routine ($1B vector)

L00EC    fdb   L0F91-L00EC Function 0
         fdb   L1287-L00EC Function 2   Print error message (B=Error code)
         fdb   L0899-L00EC Function 4
         fdb   L088F-L00EC Function 6
         fdb   L18BE-L00EC Function 8
         fdb   L0E73-L00EC Function A
         fdb   L0E6D-L00EC Function C
         fdb   L0E8F-L00EC Function E
         fdb   L1BA2-L00EC Function 10
         fdb   L12F9-L00EC Function 12
         fdb   L19B1-L00EC Function 14
         fdb   L110C-L00EC Function 16
         fdb   L1026-L00EC Function 18
         fdb   L10AC-L00EC Function 1A (Pointed to by <u0019 & <u0017)
         fdb   L10B1-L00EC Function 1C

* UNUSED IN BASIC09
*L0131    jsr   <u0024
*         fcb   $0A 

* token/command type & command list?
         fdb   114        # entries in table
         fcb   2          # bytes to start text

L0140    fdb   $0101     
L0142    fcs   'PARAM'   
         fdb   $0201     
L0149    fcs   'TYPE'    
         fdb   $0301     
L014F    fcs   'DIM'     
         fdb   $0401     
L0154    fcs   'DATA'    
         fdb   $0501     
L015A    fcs   'STOP'    
         fdb   $0601     
L0160    fcs   'BYE'     
         fdb   $0701     
L0165    fcs   'TRON'    
         fdb   $0801     
L016B    fcs   'TROFF'   
         fdb   $0901     
L0172    fcs   'PAUSE'   
         fdb   $0A01     
L0179    fcs   'DEG'     
         fdb   $0B01     
L017E    fcs   'RAD'     
         fdb   $0C01     
L0183    fcs   'RETURN'  
         fdb   $0D01     
L018B    fcs   'LET'     
         fdb   $0F01     
L0190    fcs   'POKE'    
         fdb   $1001     
L0196    fcs   'IF'      
         fdb   $1101     
L019A    fcs   'ELSE'    
         fdb   $1201     
L01A0    fcs   'ENDIF'   
         fdb   $1301     
L01A7    fcs   'FOR'     
         fdb   $1401     
L01AC    fcs   'NEXT'    
         fdb   $1501     
L01B2    fcs   'WHILE'   
         fdb   $1601     
L01B9    fcs   'ENDWHILE'
         fdb   $1701     
L01C3    fcs   'REPEAT'  
         fdb   $1801     
L01CB    fcs   'UNTIL'   
         fdb   $1901     
L01D2    fcs   'LOOP'    
         fdb   $1A01     
L01D8    fcs   'ENDLOOP' 
         fdb   $1B01     
L01E1    fcs   'EXITIF'  
         fdb   $1C01     
L01E9    fcs   'ENDEXIT' 
         fdb   $1D01     
L01F2    fcs   'ON'      
         fdb   $1E01     
L01F6    fcs   'ERROR'   
         fdb   $1F01     
L01FD    fcs   'GOTO'    
         fdb   $2101     
L0203    fcs   'GOSUB'   
         fdb   $2301     
L020A    fcs   'RUN'     
         fdb   $2401     
L020F    fcs   'KILL'    
         fdb   $2501     
L0215    fcs   'INPUT'   
         fdb   $2601     
L021C    fcs   'PRINT'   
         fdb   $2701     
L0223    fcs   'CHD'     
         fdb   $2801     
L0228    fcs   'CHX'     
         fdb   $2901     
L022D    fcs   'CREATE'  
         fdb   $2A01     
L0235    fcs   'OPEN'    
         fdb   $2B01     
L023B    fcs   'SEEK'    
         fdb   $2C01     
L0241    fcs   'READ'    
         fdb   $2D01     
L0247    fcs   'WRITE'   
         fdb   $2E01     
L024E    fcs   'GET'     
         fdb   $2F01     
L0253    fcs   'PUT'     
         fdb   $3001     
L0258    fcs   'CLOSE'   
         fdb   $3101     
L025F    fcs   'RESTORE' 
         fdb   $3201     
L0268    fcs   'DELETE'  
         fdb   $3301     
L0270    fcs   'CHAIN'   
         fdb   $3401     
L0277    fcs   'SHELL'   
         fdb   $3501     
L027E    fcs   'BASE'    
         fdb   $3701     
L0284    fcs   'REM'     
         fdb   $3901     
L0289    fcs   'END'     
         fdb   $4003     
L028E    fcs   'BYTE'    
         fdb   $4103     
L0294    fcs   'INTEGER' 
         fdb   $4203     
L029D    fcs   'REAL'    
         fdb   $4303     
L02A3    fcs   'BOOLEAN' 
         fdb   $4403     
L02AC    fcs   'STRING'  
         fdb   $4503     
L02B4    fcs   'THEN'    
         fdb   $4603     
L02BA    fcs   'TO'      
         fdb   $4703     
L02BE    fcs   'STEP'    
         fdb   $4803     
L02C4    fcs   'DO'      
         fdb   $4903     
L02C8    fcs   'USING'   
         fdb   $3D03     
L02CF    fcs   'PROCEDURE'
         fdb   $9204     
L02DA    fcs   'ADDR'    
         fdb   $9404     
L02E0    fcs   'SIZE'    
         fdb   $9604     
L02E6    fcs   'POS'     
         fdb   $9704     
L02EB    fcs   'ERR'     
         fdb   $9804     
L02F0    fcs   'MOD'     
         fdb   $9A04     
L02F5    fcs   'RND'     
         fdb   $9C04     
L02FA    fcs   'SUBSTR'  
         fdb   $9B04     
L0302    fcs   'PI'      
         fdb   $9F04     
L0306    fcs   'SIN'     
         fdb   $A004     
L030B    fcs   'COS'     
         fdb   $A104     
L0310    fcs   'TAN'     
         fdb   $A204     
L0315    fcs   'ASN'     
         fdb   $A304     
L031A    fcs   'ACS'     
         fdb   $A404     
L031F    fcs   'ATN'     
         fdb   $A504     
L0324    fcs   'EXP'     
         fdb   $A804     
L0329    fcs   'LOG'     
         fdb   $A904     
L032E    fcs   'LOG10'   
         fdb   $9D04     
L0335    fcs   'SGN'     
         fdb   $A604     
L033A    fcs   'ABS'     
         fdb   $AA04     
L033F    fcs   'SQRT'    
         fdb   $AA04     
L0345    fcs   'SQR'     
         fdb   $AC04     
L034A    fcs   'INT'     
         fdb   $AE04     
L034F    fcs   'FIX'     
         fdb   $B004     
L0354    fcs   'FLOAT'   
         fdb   $B204     
L035B    fcs   'SQ'      
         fdb   $B404     
L035F    fcs   'PEEK'    
         fdb   $B504     
L0365    fcs   'LNOT'    
         fdb   $B604     
L036B    fcs   'VAL'     
         fdb   $B704     
L0370    fcs   'LEN'     
         fdb   $B804     
L0375    fcs   'ASC'     
         fdb   $B904     
L037A    fcs   'LAND'    
         fdb   $BA04     
L0380    fcs   'LOR'     
         fdb   $BB04     
L0385    fcs   'LXOR'    
         fdb   $BC04     
L038B    fcs   'TRUE'    
         fdb   $BD04     
L0391    fcs   'FALSE'   
         fdb   $BE04     
L0398    fcs   'EOF'     
         fdb   $BF04     
L039D    fcs   'TRIM$'   
         fdb   $C004     
L03A4    fcs   'MID$'    
         fdb   $C104     
L03AA    fcs   'LEFT$'   
         fdb   $C204     
L03B1    fcs   'RIGHT$'  
         fdb   $C304     
L03B9    fcs   'CHR$'    
         fdb   $C404     
L03BF    fcs   'STR$'    
         fdb   $C604     
L03C5    fcs   'DATE$'   
         fdb   $C704     
L03CC    fcs   'TAB'     
         fdb   $CD05     
L03D1    fcs   'NOT'     
         fdb   $D005     
L03D6    fcs   'AND'     
         fdb   $D105     
L03DB    fcs   'OR'      
         fdb   $D205     
L03DF    fcs   'XOR'     
         fdb   $F703     
L03E4    fcs   'UPDATE'  
         fdb   $f803     
L03EC    fcs   'EXEC'    
         fdb   $f903     
L03F2    fcs   'DIR'     

* 3 byte packets used by <u001B calls - Function $12
* 1st byte is used for bit tests, bytes 2-3 are offset from 2nd byte (can be
*   jump address, others seem to be ptrs to text)
L03F5    fcb   $40        ???
         fdb   $0000     
* label for reference only - remove after all are verified as correct

         fcb   $00        ???
         fdb   L0142-*    PARAM ($fd49)

         fcb   $00       
         fdb   L0149-*    TYPE  ($fd4d)

         fcb   $00       
         fdb   L014F-*    DIM   ($fd50)

         fcb   $00       
         fdb   L0154-*    DATA  ($fd52)

         fcb   $00       
         fdb   L015A-*    STOP  ($fd55)

         fcb   $00       
         fdb   L0160-*    BYE   ($fd58)

         fcb   $00       
         fdb   L0165-*    TRON  ($fd5a)

         fcb   $00       
         fdb   L016B-*    TROFF ($fd5d)

         fcb   $00       
         fdb   L0172-*    PAUSE ($fd61)

         fcb   $00       
         fdb   L0179-*    DEG   ($fd65)

         fcb   $00       
         fdb   L017E-*    RAD   ($fd67)

         fcb   $00       
         fdb   L0183-*    RETURN ($fd69)

         fcb   $00       
         fdb   L018B-*    LET    ($fd6e)

         fcb   $40        ???
         fdb   $0000     

         fcb   $00       
         fdb   L0190-*    POKE   ($fd6d)

         fcb   $00       
         fdb   L0196-*    IF     ($fd70)

         fcb   $63       
         fdb   L019A-*    ELSE   ($fd71)

         fcb   $02       
         fdb   L01A0-*    ENDIF  ($fd74)

         fcb   $01       
         fdb   L01A7-*    FOR    ($fd78)

         fcb   $22       
         fdb   L1419-*    (something with NEXT in it) ($0fe7)

         fcb   $01       
         fdb   L01B2-*    WHILE ($fd7d)

         fcb   $62       
         fdb   L01B9-*    ENDWHILE ($fd81)

         fcb   $01       
         fdb   L01C3-*    REPEAT ($fd88)

         fcb   $02       
         fdb   L01CB-*    UNTIL ($fd8d)

         fcb   $01       
         fdb   L01D2-*    LOOP ($fd91)

         fcb   $62       
         fdb   L01D8-*    ENDLOOP ($fd94)

         fcb   $02       
         fdb   L01E1-*    EXITIF ($fd9a)

         fcb   $63       
         fdb   L01E9-*    ENDEXIT ($fd9f)

         fcb   $00       
         fdb   L01F2-*    ON ($fda5)

         fcb   $00       
         fdb   L01F6-*    ERROR ($fda6)

         fcb   $20       
         fdb   L13C9-*    Point to something with GOTO ($0f76)

         fcb   $20       
         fdb   L13C9-*    Point to something with GOTO ($0f73)

         fcb   $20       
         fdb   L13C3-*    Point to something with GOSUB ($0f6a)

         fcb   $20       
         fdb   L13C3-*    Point to something with GOSUB ($0f67)

         fcb   $20       
         fdb   L140F-*    Point to something with RUN ($0fb0)

         fcb   $00       
         fdb   L020F-*    KILL ($fdad)

         fcb   $00       
         fdb   L0215-*    INPUT ($fdb0)

         fcb   $00       
         fdb   L021C-*    PRINT ($fdb4)

         fcb   $00       
         fdb   L0223-*    CHD ($fdb8)

         fcb   $00       
         fdb   L0228-*    CHX ($fdba)

         fcb   $00       
         fdb   L022D-*    CREATE ($fdbc)

         fcb   $00       
         fdb   L0235-*    OPEN ($fdc1)

         fcb   $00       
         fdb   L023B-*    SEEK ($fdc4)

         fcb   $00       
         fdb   L0241-*    READ ($fdc7)

         fcb   $00       
         fdb   L0247-*    WRITE ($fdca)

         fcb   $00       
         fdb   L024E-*    GET ($fdce)

         fcb   $00       
         fdb   L0253-*    PUT ($fdd0)

         fcb   $00       
         fdb   L0258-*    CLOSE ($fdd2)

         fcb   $00       
         fdb   L025F-*    RESTORE ($fdd6)

         fcb   $00       
         fdb   L0268-*    DELETE ($fddc)

         fcb   $00       
         fdb   L0270-*    CHAIN ($fde1)

         fcb   $00       
         fdb   L0277-*    SHELL ($fde5)

         fcb   $20       
         fdb   L1402-*    Points to something with BASE ($0f6d)

         fcb   $20       
         fdb   L1402-*    Points to something with BASE ($0f6a)

         fcb   $20       
         fdb   L143C-*    Points to something with REM ($0fa1)

         fcb   $20       
         fdb   L1436-*    Points to something with (* ($0f98)

         fcb   $00       
         fdb   L0289-*    END ($fde8)

         fcb   $20       
         fdb   L13CF-*    ??? end of goto/gosub routine ($0f2b)

         fcb   $20       
         fdb   L13CF-*    ??? end of goto/gosub routine ($0f28)

         fcb   $40        ???
         fdb   $0000     

         fcb   $20       
         fdb   L1443-*    ??? end of REM routine ($0f96)

         fcb   $40       
         fcc   ' \'       Command statement separator literal

         fcb   $20       
         fdb   L12D4-*    ??? ($0e21)

         fcb   $10       
         fdb   L028E-*    BYTE ($fdd8)

         fcb   $10       
         fdb   L0294-*    INTEGER ($fddb)

         fcb   $10       
         fdb   L029D-*    REAL ($fde1)

         fcb   $10       
         fdb   L02A3-*    BOOLEAN ($fde4)

         fcb   $10       
         fdb   L02AC-*    STRING ($fdea)

         fcb   $20       
         fdb   L1424-*    ??? Something that points to 'THEN' ($0f5f)

         fcb   $60       
         fdb   L02BA-*    TO ($fdf2)

         fcb   $60       
         fdb   L02BE-*    STEP ($fdf3)

         fcb   $00       
         fdb   L02C4-*    DO ($fdf6)

         fcb   $00       
         fdb   L02C8-*    USING ($fdf7)

         fcb   $20       
         fdb   L145E-*    ??? Something with file access modes ($0f8a)

         fcb   $40       
         fcc   ','        comma
         fcb   $00       

         fcb   $40       
         fcc   ':'        colon
         fcb   $00       

         fcb   $40       
         fcc   '('        Left parenthesis
         fcb   $00       

         fcb   $40       
         fcc   ')'        Right parenthesis
         fcb   $00       

         fcb   $40       
         fcc   '['        Left bracket
         fcb   $00       

         fcb   $40       
         fcc   ']'        Right bracket
         fcb   $00       

         fcb   $40       
         fcc   '; '       semi-colon with space

         fcb   $40       
         fcc   ':='       := (pascal like equals)

         fcb   $40       
         fcc   '='        Equals sign
         fcb   $00       

         fcb   $40       
         fcc   '#'        number sign
         fcb   $00       

         fcb   $20       
         fdb   L1AE1-*    ??? Bump Y up by 2 & return ($15ec)

* Guess: These following have to do with printing numeric values???
         fcb   $20       
         fdb   L138A-*    ??? ($0E92)

         fcb   $20       
         fdb   L138A-*    ??? ($0E8F)

         fcb   $20       
         fdb   L138A-*    ??? ($0E8c)

         fcb   $20       
         fdb   L138A-*    ??? ($0E89)

         fcb   $20       
         fdb   L138A-*    ??? ($0E86)

         fcb   $20       
         fdb   L138A-*    ??? ($0E83)

         fcb   $21       
         fdb   L138A-*    ??? ($0E80)

         fcb   $22       
         fdb   L138A-*    ??? ($0E7D)

         fcb   $23       
         fdb   L138A-*    ??? ($0E7A)

         fcb   $20       
         fdb   L1386-*    ??? (Appends period, does 138A routine) ($0E73)

         fcb   $21       
         fdb   L1386-*    ??? (Appends period, does 138A routine) ($0E70)

         fcb   $22       
         fdb   L1386-*    ??? (Appends period, does 138A routine) ($0E6d)

         fcb   $23       
         fdb   L1386-*    ??? (Appends period, does 138A routine) ($0E6a)

         fcb   $26       
         fdb   L13BE-*    ??? (print single byte numeric?) ($0E9f)

         fcb   $27       
         fdb   L13CF-*    ??? (print 2 byte integer numeric?) ($0Ead)

         fcb   $24       
         fdb   L13A0-*    ??? (possibly something with reals?) ($0E7b)

         fcb   $24       
         fdb   L13E1-*    ??? (string, puts " in) ($0Eb9)

         fcb   $27       
         fdb   L13F6-*    ??? (string, puts $ in) ($0Ecb)

         fcb   $11       
         fdb   L02DA-*    ADDR ($FDac)

         fcb   $80        ???
         fdb   $0000     

         fcb   $11       
         fdb   L02E0-*    SIZE ($FDAC)

         fcb   $80       
         fdb   $0000      ???

         fcb   $10       
         fdb   L02E6-*    POS ($FDAC)

         fcb   $10       
         fdb   L02EB-*    ERR ($FDAE)

         fcb   $12       
         fdb   L02F0-*    MOD ($FDB0)

         fcb   $12       
         fdb   L02F0-*    MOD ($FDAD)

         fcb   $11       
         fdb   L02F5-*    RND ($FDAF)

         fcb   $10       
         fdb   L0302-*    PI ($FDB9)

         fcb   $12       
         fdb   L02FA-*    SUBSTR ($FDAE)

         fcb   $11       
         fdb   L0335-*    SGN ($FDE6)

         fcb   $11       
         fdb   L0335-*    SGN ($FDE3)

         fcb   $11       
         fdb   L0306-*    SIN ($FDB1)

         fcb   $11       
         fdb   L030B-*    COS ($FDB3)

         fcb   $11       
         fdb   L0310-*    TAN ($FDB5)

         fcb   $11       
         fdb   L0315-*    ASN ($FDB7)

         fcb   $11       
         fdb   L031A-*    ACS ($FDB9)

         fcb   $11       
         fdb   L031F-*    ATN ($FDbb)

         fcb   $11       
         fdb   L0324-*    EXP ($FDBD)

         fcb   $11       
         fdb   L033A-*    ABS ($FDD0)

         fcb   $11       
         fdb   L033A-*    ABS ($FDCD)

         fcb   $11       
         fdb   L0329-*    LOG ($FDB9)

         fcb   $11       
         fdb   L032E-*    LOG10 ($FDBB)

         fcb   $11       
         fdb   L033F-*    SQRT ($FDC9)

         fcb   $11       
         fdb   L033F-*    SQRT ($FDC6)

         fcb   $11       
         fdb   L034A-*    INT ($FDCE)

         fcb   $11       
         fdb   L034A-*    INT ($FDCB)

         fcb   $11       
         fdb   L034F-*    FIX ($FDCD)

         fcb   $11       
         fdb   L034F-*    FIX ($FDCA)

         fcb   $11       
         fdb   L0354-*    FLOAT ($FDCC)

         fcb   $11       
         fdb   L0354-*    FLOAT ($FDC9)

         fcb   $11       
         fdb   L035B-*    SQ ($FDCD)

         fcb   $11       
         fdb   L035B-*    SQ ($FDCA)

         fcb   $11       
         fdb   L035F-*    PEEK ($FDCB)

         fcb   $11       
         fdb   L0365-*    LNOT ($FDCE)

         fcb   $11       
         fdb   L036B-*    VAL ($FDD1)

         fcb   $11       
         fdb   L0370-*    LEN ($FDD3)

         fcb   $11       
         fdb   L0375-*    ASC ($FDD5)

         fcb   $12       
         fdb   L037A-*    LAND ($FDD7)

         fcb   $12       
         fdb   L0380-*    LOR ($FDDA)

         fcb   $12       
         fdb   L0385-*    LXOR ($FDDC)

         fcb   $10       
         fdb   L038B-*    TRUE ($FDDF)

         fcb   $10       
         fdb   L0391-*    FALSE ($FDE2)

         fcb   $11       
         fdb   L0398-*    EOF ($FDE6)

         fcb   $11       
         fdb   L039D-*    TRIM$ ($FDE8)

         fcb   $13       
         fdb   L03A4-*    MID$ ($FDEC)

         fcb   $12       
         fdb   L03AA-*    LEFT$ ($FDEF)

         fcb   $12       
         fdb   L03B1-*    RIGHT$ ($FDF3)

         fcb   $11       
         fdb   L03B9-*    CHR$ ($FDF8)

         fcb   $11       
         fdb   L03BF-*    STR$ ($FDFB)

         fcb   $11       
         fdb   L03BF-*    STR$ ($FDF8)

         fcb   $10       
         fdb   L03C5-*    DATE$ ($FDFB)

         fcb   $11       
         fdb   L03CC-*    TAB ($FDFF)

         fcb   $80       
         fdb   $0000     

         fcb   $80       
         fdb   $0000     

         fcb   $80       
         fdb   $0000     

         fcb   $80       
         fdb   $0000     

         fcb   $80       
         fdb   $0000     

         fcb   $11       
         fdb   L03D1-*    NOT ($FDF2)

         fcb   $51       
         fcc   '-'        ??? (Sign as opposed to subtract?)
         fcb   $00       

         fcb   $51       
         fcc   '-'        ??? (Sign as opposed to subtract?)
         fcb   $00       

         fcb   $0A       
         fdb   L03D6-*    AND ($FDEE)

         fcb   $09       
         fdb   L03DB-*    OR ($FDF0)

         fcb   $09       
         fdb   L03DF-*    XOR ($FDF1)

* Would presume that the different duplicates are for different data types
* It appears that BYTE & INTEGER use the same routines, REAL is different,
* STRING/TYPE use a third, and BOOLEAN would be a rarely used 4th
* Order appears to be : REAL/(INTEGER or BYTE)/STRING/BOOLEAN
* 3 - real/integer/string

         fcb   $4B       
         fcc   '>'        greater than
         fcb   $00       

         fcb   $4B       
         fcc   '>'        greater than
         fcb   $00       

         fcb   $4B       
         fcc   '>'        greater than
         fcb   $00       

* 3 - real/integer/string
         fcb   $4B       
         fcc   '<'        less than
         fcb   $00       

         fcb   $4B       
         fcc   '<'        less than
         fcb   $00       

         fcb   $4B       
         fcc   '<'        less than
         fcb   $00       

* 4 - real/integer/string/boolean
         fcb   $4B       
         fcc   '<>'       not equal to

         fcb   $4B       
         fcc   '<>'       not equal to

         fcb   $4B       
         fcc   '<>'       not equal to

         fcb   $4B       
         fcc   '<>'       not equal to

* 4 - real/integer/string/boolean
         fcb   $4B       
         fcc   '='        equal to
         fcb   $00       

         fcb   $4B       
         fcc   '='        equal to
         fcb   $00       

         fcb   $4B       
         fcc   '='        equal to
         fcb   $00       

         fcb   $4B       
         fcc   '='        equal to
         fcb   $00       

* 3 - real/integer/string
         fcb   $4B       
         fcc   '>='       greater than or equal to

         fcb   $4B       
         fcc   '>='       greater than or equal to

         fcb   $4B       
         fcc   '>='       greater than or equal to

* 3 - real/integer/string
         fcb   $4B       
         fcc   '<='       less than or equal to

         fcb   $4B       
         fcc   '<='       less than or equal to

         fcb   $4B       
         fcc   '<='       less than or equal to

* 3 - real/integer/string
         fcb   $4c       
         fcc   '+'        plus
         fcb   $00       

         fcb   $4c       
         fcc   '+'        plus
         fcb   $00       

         fcb   $4c       
         fcc   '+'        plus
         fcb   $00       

* 2 - real/integer
         fcb   $4C       
         fcc   '-'        minus
         fcb   $00       

         fcb   $4C       
         fcc   '-'        minus
         fcb   $00       

* 2 - real/integer
         fcb   $4D       
         fcc   '*'        multiply
         fcb   $00       

         fcb   $4D       
         fcc   '*'        multiply
         fcb   $00       

* 2 - real/integer
         fcb   $4D       
         fcc   '/'        divide
         fcb   $00       

         fcb   $4D       
         fcc   '/'        divide
         fcb   $00       

* 1 - real
         fcb   $4E       
         fcc   '^'        exponent
         fcb   $00       

* 1 - real
         fcb   $4E       
         fcc   '**'       exponent (2nd version)

         fcb   $20       
         fdb   L138A-*    ??? ($0D3c)

         fcb   $21       
         fdb   L138A-*    ??? ($0D39)

         fcb   $22       
         fdb   L138A-*    ??? ($0D36)

         fcb   $23       
         fdb   L138A-*    ??? ($0D33)

         fcb   $20       
         fdb   L1386-*    ??? (Adds period, does 138A) ($0D2C)

         fcb   $21       
         fdb   L1386-*    ??? (Adds period, does 138A) ($0D29)

         fcb   $22       
         fdb   L1386-*    ??? (Add period, does 138A) ($0D26)

         fcb   $23       
         fdb   L1386-*    ??? (Add period, does 138A) ($0D23)

* System Mode commands
         fdb   2          # commands this table
         fcb   2          # bytes to first command string
L0668    fdb   L09F9-L0668
         fcs   '$'       
L066B    fdb   L094F-L066B
         fcb   C$CR+$80   (Carriage return)

         fdb   14         # commands this table
         fcb   2          # bytes to first command string
L0671    fdb   L0E6D-L0671
         fcs   'BYE'     
L0676    fdb   L094A-L0676
         fcs   'DIR'     
L067B    fdb   L1590-L067B
         fcs   'EDIT'    
L0681    fdb   L1590-L0681
         fcs   'E'       
L0684    fdb   L0D02-L0684
         fcs   'LIST'    
L068A    fdb   L0DC7-L068A
         fcs   'RUN'     
L068F    fdb   L0E98-L068F
         fcs   'KILL'    
L0695    fdb   L0CF4-L0695
         fcs   'SAVE'    
L069B    fdb   L0AC3-L069B
         fcs   'LOAD'    
L06A1    fdb   L0A32-L06A1
         fcs   'RENAME'  
L06A9    fdb   L0B51-L06A9
         fcs   'PACK'    
L06AF    fdb   L0918-L06AF
         fcs   'MEM'     
L06B4    fdb   L0A24-L06B4
         fcs   'CHD'     
L06B9    fdb   L0A28-L06B9
         fcs   'CHX'     

* Debug mode commands (offsets done by current base + offset)
         fdb   2          # of entries this table (-3,x)
         fcb   2          # of bytes to start of next entry (-1,x)
L06C1    fdb   L09F9-L06C1 base ptr goes here (0,x)
         fcs   '$'        base ptr+(-1,x) above points here
L06C4    fdb   L108B-L06C4
         fcb   C$CR+$80   (Carriage return)

L06C7    fdb   14         # of entries this table (but 13?)
         fcb   2          # bytes to next entry
* Debug set #2?
L06CA    fdb   L109A-L06CA
         fcs   'CONT'    
L06D0    fdb   L094A-L06D0
         fcs   'DIR'     
L06D5    fdb   L1068-L06D5
         fcs   'Q'       
L06D8    fdb   L10E4-L06D8
         fcs   'LIST'    
L06DE    fdb   L1195-L06DE
         fcs   'PRINT'   
L06E5    fdb   L120A-L06E5
         fcs   'STATE'   
L06EC    fdb   L1195-L06EC
         fcs   'TRON'    
L06F2    fdb   L1195-L06F2
         fcs   'TROFF'   
L06F9    fdb   L1195-L06F9
         fcs   'DEG'     
L06FE    fdb   L1195-L06FE
         fcs   'RAD'     
L0703    fdb   L1195-L0703
         fcs   'LET'     
L0708    fdb   L107C-L0708
         fcs   'STEP'    
L070E    fdb   L1226-L070E
         fcs   'BREAK'   
* Some edit mode stuff?
         fdb   8          # entries this table
         fcb   2          # bytes to start entry
L0718    fdb   L169E-L0718
         fcs   'L'       
L071B    fdb   L169E-L071B
         fcs   'l'       
L071E    fdb   L199A-L071E
         fcs   'D'       
L0721    fdb   L199A-L0721
         fcs   'd'       
L0724    fdb   L15E7-L0724
         fcs   '+'       
L0727    fdb   L15E7-L0727
         fcs   '-'       
L072A    fdb   L15E7-L072A
         fcb   C$CR+$80  
L072D    fdb   L1601-L072D
         fcb   C$SPAC+$80

         fdb   4          # entries
         fcb   2          # bytes to first entry
L0733    fdb   L175B-L0733
         fcs   'S'       
L0736    fdb   L175E-L0736
         fcs   'C'       
L0739    fdb   L18DF-L0739
         fcs   'R'       
L073C    fdb   L1993-L073C
         fcs   'Q'       

L073F    fcb   $0E       
         fcs   'Ready'   
L0745    fcs   'What?'   
L074A    fcs   ' free'   
L074F    fcs   'Program' 
L0756    fcs   'PROCEDURE'
         fcb   C$CR      
L0760    fcb   C$LF      
         fcs   '  Name      Proc-Size  Data-Size'
L0781    fcc   'Rewrite?: '
L0791    fcb   $0E       
         fcs   'BREAK: ' 
L07A2    fcs   'ok'      
L07A4    fcs   'D:'      
L07A6    fcs   'E:'      
L07A8    fcs   'B:'      

* F$Icpt routine
L07B5    lda   R$DP,s     Get DP register from stack
         tfr   a,dp       Put into real DP
         stb   <u0035     Save signal code

         IFNE  H6309
         oim   #$80,<u0034  Set high bit (flag signal was received)
         ELSE            
         lsl   <u0034     Set high bit (flag signal was received)
         coma            
         ror   <u0034    
         ENDC            

         rti              Return to normal BASIC09

* BASIC09 INIT
start                    
         IFNE  H6309
         tfr   u,d        Save start of data mem into D
         ldw   #$100      Size of DP area to clear
         clr   ,-s        Clear byte on stack
         tfm   s,u+       clear out DP
         ELSE            
         pshs  u          Save start of data mem on stack
         leau  >$100,u    Point to end of DP
         clra             Clear all of DP to $00
         clrb            
L07C9    std   ,--u      
         cmpu  ,s        
         bhi   L07C9     
         puls  d          Get start of data mem into D
         ENDC            

         leau  ,x         Point U to Start of parameter area
         std   <u0000     Preserve Start of Data memory ptr
         inca             Point to $100 in data area
         sta   <u00D9     Preserve the 1
         std   <u0080     Initialize ptr to start of temp buffer
         std   <u0082     Initialize current pos. in temp buffer
         adda  #$02       D=$300
         std   <u0046     Save subroutine stack ptr
         std   <u0044     Save top of string space ptr
         inca             D=$400
         tfr   d,s        Point stack to $400 ($300-$3ff)
         std   <u0004     Save ptr to ptr list of modules in workspace
         pshs  x          Preserve start of param area

         IFNE  H6309
         pshs  b          Put 0 byte on stack
         ldw   #$100      Size of area to clear ($400-$4ff)
         tfm   s,d+       Clear out list of module ptrs (D=$500 at end)
         leas  1,s        Eat stack byte
         ELSE            
         tfr   d,x        x=$400
         clra             d=$0000
ClrLp    sta   ,x+        Clear byte
         incb             Inc counter
         bne   ClrLp      Do until it wraps
         tfr   x,d        Move $500 to D
         ENDC            

         std   <u0008     Save ptr to start of I-Code workspace
         std   <u004A     Save ptr to end of used I-Code workspace
         tfr   u,d        Move start of param area ptr to D
         subd  <u0000     Calculate size for entire data area
         std   <u0002     Preserve size of Data area
         ldb   #01        Std Out path
         stb   <u002E     Save as std output path
         lda   #$03       Close all paths past the standard 3
L07FC    os9   I$Close   
         inca            
         cmpa  #$10       Do until 3-15 are closed
         blo   L07FC     
         lda   #$02       Create duplicate path for error path
         os9   I$Dup     
         sta   <u00BE     Preserve duplicate's path #
         leax  <L07B5,pc  Point to intercept routine and set it up with
         os9   F$Icpt     it's memory area @ start of param area
         leax  >L000D-$d,pc Point to beginning of module header
         IFNE  H6309
         tfr   x,w        Move it to W
         ELSE
         pshs  x
         ENDC
         ldx   <u0000     Point X to start of data mem
* Set up some JMP tables from the module header
         leax  <$1B,x     Point $1b bytes into it
         leay  >L000D,pc  Point to module header extensions
L082E    lda   #$7E       Opcode for JMP Extended instruction
         sta   ,x+        Store in table
         ldd   ,y++       Get jump offset from module header extension
         IFNE  H6309
         addr  w,d        Add to start of module address
         ELSE
         addd  ,s
         ENDC
         std   ,x++       Store as destination of JMP
         ldd   ,y         Keep installing JMP tables until 0000 found
         bne   L082E     
         IFEQ  H6309
         leas  2,s        eat X on stack
         ENDC
         bsr   L0116      Go init <$50 vars, & some table ptrs
         puls  y          Get parameter ptr
         leax  >L0140,pc  Point to main command token list
         stx   <u009E     Save it
         ldb   ,y         Get char from params
         cmpb  #C$CR      Carriage return?
         beq   L08A6      Yes, go print the title screen
* Optional filename specified when BASIC09 called
         leax  <L0860,pc  No, point to initial entry of routine
         pshs  y          Preserve param ptr
         bsr   L0870     
         lbsr  L0F91     
         bcc   L088F     
         lbsr  L0AC3      Go open path to name (Y=ptr to it)
         bra   L088F     

L0116    jsr   <u0024     JMP to L31E8 (default from module header)
         fcb   $00        Function code 0

L0860    puls  y          Get original contents of <u00B7
         bsr   L086D     
         ldx   <u0004     Get ptr to module list
         ldd   ,x         Get ptr to 1st module (initially 0 (none))
         std   <u002F     Save it
         lbsr  L0DC7     
L086D    leax  <L08B2,pc  Get ptr >1st entry into routine
L0870    puls  u          Get RTS address
         bsr   L0899      Push 2 bytes from <B7 onto stack, RTS=L0860
         pshs  u          Save RTS address from BSR L0870
         clr   <u0034     Clear out signal recieved flag
         ldd   <u0000     Get start of data mem
         addd  <u0002     Add size of data mem
         subd  <u0008     Subtract all BASIC09 reserved stuff ($500 bytes)
         subd  <u000A     Subtract # bytes used by user's programs (not Data)
         std   <u000C     Save # bytes free in workspace for user's programs
         leau  2,s        Point U to L0860 ptr on stack
         stu   <u0046     Save ptr to it
         stu   <u0044     And again
         leas  -$FE,s     Bump stack ptr back 254 bytes
         jmp   [<-2,u]    Jump to L0860 address on stack

L088F    lds   <u00B7    
         puls  d         
         std   <u00B7    
L0896    lbra  L0DBB      Reset temp buffer size & ptrs to defaults

L0899    ldd   <u00B7     Get some other stack ptr?
         pshs  d          Preserve it
         sts   <u00B7     Save stack ptr
         ldd   2,s        Get RTS address to L0870 or L0860
         stx   2,s        Save ptr to L0860 or L086D on stack
         tfr   d,pc       Return to L0870 (just after BSR L0899)

L08A6    leax  >L0024,pc  Point to intro screen credits
         bsr   L08D0      Copy to temp buffer/print to Std error
         leax  name,pc    Point to 'Basic09'
         bsr   L08D0      Copy to temp buffer/print to Std error

L08B2    bsr   L086D     
         leax  >L073F+1,pc  Point to 'Ready'
         bsr   L08D0      Copy to temp buffer/print to Std error
         leax  >L07A8,pc  Point to 'B:' prompt
         leay  >L0668,pc  Point to system mode command table
         clr   <u0084    
         bsr   L08D3      Get command & execute it
         bcc   L088F      Did it, no problem
         bsr   L08CC      Unknown command, print 'What?'
         bra   L088F      Resume normal operation

L08CC    leax  >L0745,pc  Point to 'What?'
L08D0    lbra  L125F      Copy to temp buffer/print to Std error

* Get next command from keyboard & execute it
* Entry: Y=Ptr to command table
* Exit: Carry set if command doesn't exist
L08D3    pshs  y,x        Preserve command tbl ptr & ptr to prompt (ex B:)
         clr   <u0035     Clear out last signal received
         lbsr  L126B      Go print a message if we have to to std err
         bsr   L0896      S/B LBSR L0DBB (saves 3 cycles)
         lda   <u00BD     Get current input path #
         beq   L08E5      If Std In, skip ahead
         os9   I$Close    Otherwise, close it
         clr   <u00BD     Force input path # to 0 (Std In)
L08E5    lbsr  L0B2D      ReadLn up to 256 bytes from std in
         bcc   L08F8      No error on read, continue
         cmpb  #E$EOF     <ESC> key?
         bne   L0915      No, exit routine with error
         IFNE  H6309
         ldq   #$6279650d     'bye' <CR>
         stq   ,y         Stick it in the keyboard buffer
         ELSE            
         ldd   #'b*256+'y Stick the word 'bye' <CR> into the keybrd buffer
         std   ,y        
         ldd   #'e*256+C$CR ('e' + CR)
         std   2,y       
         ENDC            
* Keyboard line read, no errors from ReadLn
L08F8    ldx   2,s        Get command tbl ptr back
         lda   #$80       Mask to check for end of entry (high bit set)
         bsr   L010A      Go parse line, y=ptr to offset in command found
         bne   L090F      '$' or <CR> command found, skip ahead
         lbsr  L010D      ???Go check for a procedure name, B=size
         beq   L0915      None, exit with carry set
         leax  $03,x      Point to system mode table 2
         lda   #C$SPAC    ???
         bsr   L010A      Go parse line, y=ptr to offset in command found
         beq   L0915      No command found, exit with carry set
* Command found in table
L090F    ldd   ,x         Get offset
         leas  4,s        Eat stack
         jmp   d,x        Call routine

L010A    jsr   <u001E    
         fcb   $04       

* Command not found
L0915    coma             Set carry & exit
         puls  pc,y,x    

* Entry: Y=Ptr to string of chars
L0918    lbsr  L0A90      Go find 1st non-space/comma char
         bne   L093C      Found one, skip ahead
         leax  ,y         Point X to char
         ldd   <u0008     Get ptr to start of I-Code workspace
         addd  <u000A     Add to size of all programs in workspace
         inca             Bump up by 256 bytes
         subd  <u0000     Subtract start of data mem ptr
         pshs  d          Preserve size
         lbsr  L1748      ??? Check something
         bcs   L0946      Error, exit with carry set
         cmpd  ,s++       Check with previously calculated size
         blo   L0948      Will fit, continue
         os9   F$Mem      Won't fit, request the required data mem size    
         bcs   L093C      Can't get it, skip ahead
         subd  #$0001     Bump gotten size down by 1 byte
         std   <u0002     Save new data mem size
L093C    lbsr  L0DBB      Reset temp buffer size & ptrs
         ldd   <u0002     Get data mem size
         bsr   L09BA      ???
L0943    lbra  L1264      Print temp buff contents to std error

L0946    leas  2,s        Eat something off stack
L0948    coma             Exit with carry set
         rts             

* Debug & System mode - DIR
L094A    leax  ,y        
         lbsr  L0D5F     
* System mode - <CR>
L094F    leax  >L0760,pc  Point to basic09 DIR header
         lbsr  L125F      Print it out to Std err
         ldy   <u0004     Get Ptr to list of modules in BASIC09 workspace
         bra   L099B      Go print directory

* Entry: X=Ptr to module in memory
* Prints module names out of modules in work-space.
* A '*' indicates the current module, a '-' indicates packed or other language
*   module
L095B    pshs  y,x        Preserve ? & module ptr
         lda   #C$SPAC    Space char as default
         tst   M$Type,x   Check type/language
         beq   L0965      If source code in workspace, skip ahead
         lda   #'-        '- char indicates packed or other language code
L0965    lbsr  L1373      Add char in A to temp text buffer
         lda   #C$SPAC    Default to space again
         cmpx  <u002F     Is this the 'current' module?
         bne   L0970      No, skip ahead
         lda   #'*        '*' to indicate current module
L0970    lbsr  L1373      Append that char to temp text buffer
         ldd   M$Name,x   Get offset to name of module
         leax  d,x        Point to name
         lbsr  L135A      ??? Print it out
         ldd   #$11*256+M$Size A=??, B=offset from module ptr to get data
         bsr   L09AD      Go print program size
         ldd   #$1C*256+M$Mem A=??, B=offset from module ptr to get data
         bsr   L09AD      Go print data area size
         ldd   M$Mem,x    Get data area size required by module
         addd  #$0040     Add 64 to it
         cmpd  <u000C     Bigger than bytes free in workspace for user?
         blo   L0993      Legal data area size, continue
         lda   #'?        Data area too big for current buffer space, print
         lbsr  L1373      a '?' beside data area size
L0993    bsr   L0943      Print line out to std error path
         puls  y,x        Get ??? & module ptr back
         tst   <u0035     Any signals pending?
         bne   L099F      Yes, skip ahead
L099B    ldx   ,y++       Get ptr to module
         bne   L095B      There is one, go print it's entry out
L099F    ldd   <u000C     None left, get # bytes free in BASIC09 workspace
         bsr   L09BA      Go convert to ASCII
         leax  >L074A,pc  Point to 'free'
         lbsr  L1261      Print it out to Std err
         lbra  L0D51      Close std err; Dup path @ <BE & return from there

* Entry: A=???, b=offset from module header to get 2 byte # from
L09AD    pshs  b          Preserve B
         ldb   #$10       Sub function (uses table @ L50B2)
         lbsr  L011F      Call <2A (inited to L5084), function 2
         puls  b          Restore B
         ldx   2,s        Get module ptr back
         ldd   b,x        Get size to print

* Convert # in D to ASCII version (decimal)
L09BA    pshs  y,x,d      Preserve End of data mem ptr,?,Data mem size
         pshs  d          Preserve data mem size again
         leay  <L09ED,pc  Point to decimal table (for integers)
L09C1    ldx   #$2F00    
L09C4    puls  d          Get data mem size
L09C6    leax  >$0100,x   Bump X up to $3000
         subd  ,y         Subtract value from table
         bhs   L09C6      No underflow, keep subtracting current power of 10
         addd  ,y++       Restore to before underflow state
         pshs  d          Preserve remainder of this power
         ldd   ,y         Get next lower power of 10
         tfr   x,d        Promptly overwrite it with X (doesn't chg flags)
         beq   L09E6      If finished table, skip ahead
         cmpd  #$3000     Just went through once?
         beq   L09C1      Yes, reset X & do again
         lbsr  L1373      Go save A @ [<u0082]
         ldx   #$2F01     Reset X differently
         bra   L09C4      Go do again

L09E6    lbsr  L1373      Go save A @ [<u0082]
         leas  2,s        Eat stack
         puls  pc,y,x,d   Restore regs & return

* Table of decimal values
L09ED    fdb   $2710      10000
         fdb   $03E8      1000
         fdb   $0064      100
         fdb   $000A      10
         fdb   $0001      1
         fdb   $0000      0

* Debug/System '$' goes here
* Entry: Y=Ptr to line typed in by user?
L09F9    lbsr  L0A90      Go check char @ Y for space or comma
         leau  ,y         Point to start of parameter area
         clrb             Current size of parameter area=0
L09FF    incb             Bump size up by 1
         lda   ,y+        Get char from user's line
         cmpa  #C$CR      Hit end yet?
         bne   L09FF      No, keep looking
         clra             parameter line never >255 chars
         tfr   d,y        Move size of parameter area to Y for Fork
         leax  >L0277,pc  Point to 'SHELL'
         lda   #Objct     ML program
         clrb             Size of data area=0 pages
         os9   F$Fork     Fork shell out
         bcs   L0A86      Error, deal with it
         pshs  a          Save process # of shell
L0A17    os9   F$Wait     Wait for death signal
         cmpa  ,s         Was it our shell process?
         bne   L0A17      No, wait for ours
         leas  1,s        Yes, eat process #
         tstb             Error status from child?
         bne   L0A86      Yes, deal with it
         rts              No, return
* System Mode - CHD (MOD 93/09/20 - CHANGED FROM UPDAT. TO READ.)
L0A24    lda   #DIR.+READ. Open Data directory in Update mode
         bra   L0A2A     

* System Mode - CHX
L0A28    lda   #DIR.+EXEC. Open Execution Directory
L0A2A    leax  ,y         Point to directory we are changing to
         os9   I$ChgDir   Change dir
         bcs   L0A86      Error, exit with it
         rts              No error, return

L0A32    bsr   L0A9D     
         lbsr  L0F6E     
         bcs   L0A8C     
         pshs  x         
         ldx   ,x        
         tst   6,x       
         bne   L0A8C     
         bsr   L0A90      Go check char @ Y for space or comma
         beq   L0A48      It is a space or comma, skip ahead
L0A45    comb             Set carry, restore X & return
         puls  pc,x      

L0A48    bsr   L010D      Call <u001E, function 2
         beq   L0A45     
         pshs  y         
         lbsr  L0F6E     
         bcs   L0A58     
         cmpx  $02,s     
         bne   L0A84     
L0A58    ldx   $02,s     
         lbsr  L1A2E     
         puls  x         
         ldy   <u004A    
L0A62    lda   ,x+       
         sta   ,y+       
         bpl   L0A62     
         sty   <u00AB    
         ldx   [,s++]    
         ldd   $04,x     
         leay  d,x       
         ldb   <$18,x    
         lda   <u00A6    
         sta   <$18,x    
         clra            
         lbsr  L19B1     
         addd  <u005E    
         std   <u005E    
L0A81    lbra  L1995     

L0A84    ldb   #$2C       Multiply-defined procedure error
* Error
L0A86    lbsr  L1287     
L0A89    lbra  L088F     

L0A8C    ldb   #$2B       Unknown procedure error
         bra   L0A86     

* Entry: Y=Ptr to string of chars?
* Exit:  Y=Ptr to char (or up 1 char if space/comma found)
*        B=Char found
L0A90    ldb   ,y+        Get char
         cmpb  #',        Is it a ','?
         beq   L0A9C      Yes, return
         cmpb  #C$SPAC    Is it a space?
         beq   L0A9C      Yes, return
         leay  -1,y       No, normal char, point Y to it
L0A9C    rts              Exit with B=char

* Entry: Y=Ptr to 1st char in possible string name
* Exit:  Y=Ptr to module name (or string name)
L0A9D    bsr   L010D      Call <u001E function 2 (string name search again)
         bne   L0AB0      Size possible name>0, exit
L0AA2    ldy   <u002F     Get ptr to 'current' module
         beq   L0AAC      None, use 'Program' as default
         ldd   M$Name,y   Get offset to module name
         leay  d,y        Point Y to module name & return
         rts             

L0AAC    leay  >L074F,pc  Point Y to 'Program'
L0AB0    rts             

L0AB1    ldb   #$2B       Unknown procedure error
         bra   L0ABD     

L0AB5    ldb   #$20       Memory full error
L0AB7    pshs  b         
         bsr   L0A81     
         puls  b         
L0ABD    cmpb  #E$EOF     End of file error?
         beq   L0A89      Yes, special case
         bra   L0A86      Exit with it

L010D    jsr   <u001E    
         fcb   $02       

* Entry: Y=Ptr to string (path name)
* Exit: Path opened to file, path # @ <u00BD
L0AC3    leax  ,y         Point to path name
         lda   #1         Std out path
         os9   I$Open     Open path
         bcs   L0ABD      Error, check if it is EOF
         sta   <u00BD     Save path #
         bsr   L0B2D      Go read a line into temp input buffer
         bsr   L0B3C      Go check if it starts with 'PROCEDURE'
         bne   L0AB1      No, exit with Unknown Procedure Error
L0AD4    bsr   L010D      Yes, call function
         beq   L0AB1     
         pshs  y         
         lbsr  L0F6E     
         bcs   L0AE8     
         ldy   ,s        
         leay  -$01,y    
         lbsr  L0E98     
L0AE8    ldy   ,s        
         lbsr  L0EFD     
         lbsr  L1A2E     
         puls  x         
         lbsr  L125F     
L0AF6    ldb   <u0035     Get last received signal code
         bne   L0AB7      Got a signal, use it as error code & abort load
         bsr   L0B2D      Go get line of source from file
         bcs   L0AB7      Error on read, exit with it
         lda   <u000C     Get MSB of bytes free in workspace
         cmpa  #$02       At least $2ff (767) bytes free?
         blo   L0AB5      No, exit with memory full error
         bsr   L0B3C      Check for word PROCEDURE
         beq   L0B14      Found it, skip ahead
         ldy   <u0080     Get temp buff ptr
         ldd   <u0060    
         std   <u005C    
         lbsr  L1606     
         bra   L0AF6     

L0B14    ldx   <u0080     Get ptr to start of temp buffer
         pshs  y,x        Save ??? & temp buffer start ptr
L0B18    lda   ,x+        Get char
         cmpa  #C$CR      Carriage return?
         bne   L0B18      No, keep looking for CR
         stx   <u0080     Save CR+1 position as start of temp buffer
         stx   <u0082     And as current position in temp buffer
* Is this function to read in a source listing (single procedure) not including
*   PROCEDURE line itself?
         bsr   L0128      JSR <$21, function 2
         puls  y,x        Restore ??? & temp buffer start ptr
         stx   <u0080     Save temp buffer start ptr again
         stx   <u0082     And save current position in temp buffer
         bra   L0AD4      Loop back

* Read line from source code file
L0B2D    lda   <u00BD     Get path # to file
         ldx   <u0080     Get address to get data into
         ldy   #$0100     Up to 256 bytes to be read
         os9   I$ReadLn   Go read a line
         ldy   <u0080     Get ptr to line read & return
         rts             

* Entry: Y=ptr to input buffer
* Exit: Carry clear if word 'PROCEDURE' was found
*       Y=Ptr to 1 byte past 'procedure' in buffer
L0B3C    bsr   L010D      Call function
         leax  >L0756,pc  Point to 'PROCEDURE'
L0B43    lda   ,x+        Get byte from 'procedure'
         eora  ,y+        Check (with case conversion) if it matches buffer
         anda  #$DF      
         bne   L0B50      No, exit
* NOTE: SHOULD MAKE LDA -1,X SINCE FASTER
         tst   -1,x       Was that the last letter of 'procedure'?
         bpl   L0B43      No, keep checking
         clra             Yes, no error & return
L0B50    rts             

L0B51    lbsr  L0C83     
         ldu   <u0046    
         bra   L0B79     

L0128    jsr   <u0021    
         fcb   $02       

* Entry: X=Ptr to possible filename
L0B58    ldy   ,y         Get module header ptr from somewhere
         tst   6,y        Check type of module
         lbne  L0E68      If anything but 0, exit with Line with Compiler error
         lda   <$17,y     Get flag byte
         rora             Shift out Line with compiler error bit
         lbcs  L0E68      Has error, exit with it
         ldd   $0D,y      ???
         leay  d,y        Point to that offset in module
         ldd   -3,y      
         lslb             Multiply by 2
         rola            
         inca             Add $100
         cmpd  <u000C     Compare with bytes free in workspace
         lbhi  L0F69      If higher, exit with memory full error
L0B79    ldy   ,--u      
         bne   L0B58     
         ldd   #(EXEC.+WRITE.)*256+UPDAT.+EXEC. Exec. dir & rd/wt/ex attribs
         lbsr  L0D6B      Go create file (0 byte length)
         ldy   <u0046    
         stu   <u0046    
         lbra  L0C7A     

L0B8C    pshs  y         
         lbsr  L1A2E     
         clr   <u00D9    
         bsr   L0128      JSR <u0021, function 2 (L255A)
         inc   <u00D9    
         ldx   <u0062    
         leay  ,x        
* NOTE: <u0000 UNECESSARY FOR LEVEL II
         ldd   <u0000     Get start of data area ptr
         addd  <u0002     Get ptr to end of data area
         tfr   d,u        Move to U
         ldd   -3,x      
         beq   L0C18     
         pshs  u          Save size of data area
L0BA8    pshs  d         
         leax  1,x       
         ldd   ,x        
         pshu  d         
         clr   ,x+       
         clr   ,x+       
L0BB4    lda   ,x+        Find hi-bit set char
         bpl   L0BB4     
         puls  d         
         subd  #1        
         bne   L0BA8     
         ldy   <u005E    
         bra   L0BD1     

L0BC4    ldd   ,y        
         ldx   <u0062    
         leax  d,x       
         ldd   1,x       
         sty   1,x       
         std   ,y++      
L0BD1    lbsr  L1BC2     
         bcc   L0BC4     
         puls  u         
         ldx   <u0062    
         ldd   -3,x      
         leay  ,x        
L0BDE    leau  -2,u      
         pshs  u,d       
         clra            
         ldu   1,x       
         beq   L0C04     
         pshs  x         
         tfr   y,d       
         subd  <u0062    
         bra   L0BF3     

L0BEF    std   ,u        
         leau  ,x        
L0BF3    ldx   ,u        
         bne   L0BEF     
         std   ,u        
         puls  x         
         lda   ,x        
         sta   ,y+       
         ldu   [<2,s]    
         stu   ,y++      
L0C04    leax  3,x       
L0C06    ldb   ,x+       
         cmpa  #$A0      
         bne   L0C0E     
         stb   ,y+       
L0C0E    tstb            
         bpl   L0C06     
         puls  u,d       
         subd  #1        
         bne   L0BDE     
L0C18    ldx   <u002F     Get ptr to start of current module
         ldd   M$Size,x   Get size of module
         pshs  d          Save it
         leay  3,y        Add size of 24 bit CRC
         tfr   y,d        Move ptr to end of module (including CRC bytes)
         subd  <u002F     Calculate size of module including CRC
         std   M$Size,x   Save it
         ldd   ,s         Get original size of module
         subd  M$Size,x   Subtract new size
         std   ,s         Save size difference
         addd  <u000C     Add to bytes free in workspace
         std   <u000C     Save new # bytes free
         ldd   <u000A     Get # bytes used by all programs in workspace
         subd  ,s++       Subtract size difference
         std   <u000A     Save new # bytes used by all programs in workspace
         addd  <u0008     Add to start ptr of I-code workspace (calculate end)
         std   <u004A     Save ptr to 1st free byte in I-code workspace
         ldb   #Sbrtn+ICode Subroutine module/I-Code type byte
         stb   M$Type,x   Save in module header
         ldb   #%10000000 Packed flag
         stb   <$17,x     Save flags
         leau  -3,y       Point Y to end of module - CRC bytes
         ldd   #$FFFF     Init CRC to $FF's
         std   ,u         (Header parity too)
         sta   2,u       
         ldb   #7         Bytes 0-7 used to calculate header parity
L0C52    eora  b,x        Calculate header parity
         decb            
         bpl   L0C52      Do all of header
         sta   M$Parity,x Save header parity
         ldy   M$Size,x   Get module size
         leay  -3,y       Minus CRC bytes themselves
         os9   F$CRC      Calculate module CRC
* If u not used after this, could change to com ,u/com 1,u/com 2,u
         com   ,u+        Last stage of CRC calc: Complement all 3 bytes
         com   ,u+       
         com   ,u+       
         ldy   M$Size,x   Get module size again (including CRC)
         lda   #2         Path 2 for file
         os9   I$Write    Write out entire module
         lda   #%11000000 Packed & CRC just made flags
         sta   <$17,x     Save them
         lbcs  L0DB6      If error on write, go deal with it
         puls  y         
L0C7A    ldx   ,--y      
         lbne  L0B8C     
         lbra  L0D51      Go close file, reopen path from <BE, rts from there

L0C83    bsr   L0C9D     
         lda   ,y         Get char
         cmpa  #C$CR      Is it CR?
         bne   L0C9A      No, point X to it & return
         ldx   <u0046     Get ???
         ldx   [<-2,x]   
         ldd   M$Name,x   Get offset to module name
         leax  d,x        Point X to module name
         lbsr  L135A      Go set up temp buffer with name
         lbsr  L1371      Append CR to end of temp buffer
L0C9A    leax  ,y        
         rts             

L0C9D    ldu   <u0046     Get table end ptr
         stu   <u0044     Save as current table ptr
         lbsr  L0A90      Go get char (bump y past it if , or space)
         beq   L0CC6      If comma or space, skip ahead
         cmpb  #'*        Is it a '*'?
         bne   L0CCB      No, skip ahead
         ldx   <u0004     Get ptr to workspace module ptr list
L0CAC    ldd   ,x         Get 1st possible entry
         beq   L0CB4      Empty, skip ahead
         tfr   x,d        Move ptr to D
         leax  2,x        Bump ptr up to next entry
L0CB4    std   ,--u       Save entry
         bne   L0CAC     
         stu   <u0044     Save new ptr
         lda   ,y         Get char from temp buffer
         cmpa  #C$CR      CR?
         beq   L0CC2      Yes, save ptr & return
         leay  1,y        No, bump ptr up by 1        
L0CC2    sty   <u0082     Save current pos in temp buffer & return
         rts             

L0CC6    lbsr  L010D      JSR <u001E, function 2
         bne   L0CD9     
L0CCB    sty   <u0082     Save current pos in temp buffer
         lbsr  L0AA2      Point Y to Name of current module (or 'Program')
         lbsr  L0F6E      Go check if module exists in BASIC09 workspace
         bcc   L0CE1      Yes, skip ahead
L0CD6    lbra  L0A8C      No, return with Unknown Procedure error

L0CD9    lbsr  L0F6E      Check if module exists in BASIC09 workspace
         bcs   L0CD6      No, return Unknown Procedure error
         sty   <u0082     Save Ptr to end of fname as current pos in tmp buf
L0CE1    stx   ,--u       Save ptr to start of module name
         ldy   <u0082     Get Ptr to end of filename
         lbsr  L0A90      Point Y to next char (or past ',' or space)
         bne   L0CF0      Not comma or space, skip ahead
         lbsr  L010D      JSR <u001E, function 2
         bne   L0CD9     
L0CF0    clra            
         clrb            
         bra   L0CB4     

L0CF4    tst   <u000C     >256 bytes free for user?
         lbeq  L0F69      No, exit with Memory Full error
         lda   #$80       Set hi-bit flag
         sta   <u0084    
         bsr   L0C83     
         bra   L0D06     

L0D02    bsr   L0C9D     
         leax  ,y        
L0D06    stx   <u005C    
         bsr   L0D5F     
         ldy   <u0046    
         stu   <u0046    
         bra   L0D49     

L0D11    pshs  y         
         ldy   [,y]      
         sty   <u002F     Save as current module ptr
         ldd   M$Exec,y   Get exec offset
         addd  <u002F     Add to start of current module
         std   <u005E     Save absolute exec address of current module
         ldd   $0F,y      Get ???
         addd  <u002F     Add to start of current module
         std   <u0060     Save this absolute address
         ldd   $0D,y      Get ???
         addd  <u002F     Add to start of module
         std   <u0062     Save this absolute address
         tst   M$Type,y   Check type of module
         bne   L0D47      If anything but unpacked BASIC09, skip ahead
         leax  <L0D3B,pc  Point to routine
         lbsr  L0899      ??? The <u00B7 stack swap
         lbsr  L10E4      ??? DEBUG list command
L0D38    lbra  L088F      Restore <u00B7, reset temp buff

L0D3B    tst   <u0084     Test flags
         bmi   L0D47     
         ldx   [,s]      
         lbsr  L1A2E     
         lbsr  L0128     
L0D47    puls  y         
L0D49    ldx   ,--y      
         bne   L0D11     
L0D4D    bsr   L0D51     
         bra   L0D38     

L0D51    pshs  b          Preserve B
         lda   #2        
         os9   I$Close    Close path #2 (error)
         lda   <u00BE     Get Duplicate error path #
         os9   I$Dup      Dupe the path
         puls  pc,b       Restore B & return

L0D5F    lbsr  L0A90      Point Y to next char (or past ',' or space)
         cmpb  #C$CR      Was it a CR?
         beq   L0DB5      Yes, skip ahead
         stx   <u0082     Save current pos in temp buffer
         ldd   #$020B     Write access mode & pr r w attributes
* Create output file
* Entry: A=access mode
*        B=file attributes
*        X=Ptr to filename to create
L0D6B    pshs  u,x,d      Preserve regs
         lda   #$02       Close std error path
         os9   I$Close   
         ldd   ,s         Get access mode & file attributes back
         os9   I$Create   Attempt to create the file
         bcc   L0DB3      Did it, skip ahead
         cmpb  #E$CEF     File already exists error?
         bne   L0DB6      No, skip ahead
         ldd   ,s         Get access modoe & file attributes again
         ldx   2,s        Get ptr to filename again
         os9   I$Open     Attempt to open the file
         bcs   L0DB6      User not allowed to access, skip ahaead
         leax  >L0781,pc  Point to 'Rewrite?:'
         ldy   #10        Size of rewrite string
         lda   <u00BE     Get error path #
         os9   I$WritLn   Prompt user
         clra            
         leax  ,--s       Make 2 byte buffer on stack
         ldy   #2         Get up to 2 chars from user
         os9   I$ReadLn  
         puls  d          Get chars from read buffer
         eora  #$59       Check for Y
         anda  #$DF       Force case
         bne   L0D4D      User didn't hit Y or y, exit
         ldd   #2*256+SS.Size Path #2, set file size call
         ldx   #0         Set size to 0 bytes
         leau  ,x        
         os9   I$SetStt   Truncate file size to 0 bytes
         bcs   L0DB6      If error, skip ahead
L0DB3    puls  pc,u,y,d   Restore regs & return

L0DB5    rts             

L0DB6    bsr   L0D51      Close & dupe error path
         lbra  L0A86      Print error

* Reset temp buffer to empty state
L0DBB    pshs  d          Preserve D
         lda   #1         # chars in buffer to 1
         sta   <u007D     Save it
         ldd   <u0080     Get ptr to temp buffer
         std   <u0082     Save it as current pos in temp buffer
         puls  pc,d       Restore D & return

* Get program name (with hi-bit on last char set + CR), pointed to by Y
*   Will be one of following:
*     1) Name pointed to by Y on entry
*     2) Name of 'current' module in BASIC09 workspace
*     3) 'Program' if neither of the above
L0DC7    lbsr  L010D      <1E,func. 2 (Get string size/make FCS type if var name)
         bne   L0DDF      There is >0 chars that qualify as name, skip ahead
         pshs  y          Save ptr to string name in question
* NOTE: MAY WANT TO CHANGE ENTRY POINT, SINCE L0A9D CALLS L010D AGAIN
         lbsr  L0A9D      Get ptr & size of name, or use current (or 'Program')
         ldx   ,s         Get ptr to string name in question again
L0DD3    lda   ,y+        Get char from name we _will_ use
         sta   ,x+        Save over top of string name in question
         bpl   L0DD3      Copy whole string (including last hi-bit byte)
         lda   #C$CR      Append CR to end
         sta   ,x        
         puls  y          Point to beginning of new string
L0DDF    lbsr  L0F91      Y=Ptr to end of string+1, X=Ptr to module ptr entry
         lbcs  L0A8C      Module not in workspace, exit with Unknown Procedure
         ldx   ,x         Get ptr to module
         stx   <u002F     Save as 'current module'
         lda   M$Type,x   Get type/language byte
         beq   L0DF6      If type & language are 0, skip ahead
         anda  #LangMask  Just want language type
         cmpa  #ICode     BASIC09 I-Code?
         bne   L0E68      No, Line With Compiler Error
         bra   L0DFC      Yes, skip ahead

L0110    jsr   <u001E    
         fcb   $00       

L0113    jsr   <u0021    
         fcb   $00       

* Type/Language byte of 0
L0DF6    lda   <$17,x     Get flags from module
         rora             Shift out Line with Compiler error flag
         bcs   L0E68      There is an error, report it
* Current module has no obvious errors
L0DFC    bsr   L0110      <1E, fnc. 0 (1F9E normally) (do token?)
         ldy   <u004A     Get ptr to end of currently used I-code workspace
         ldb   ,y         Get last char/token in workspace
         cmpb  #'=        Is it an = sign?
         beq   L0E68     
         sty   <u005E    
         sty   <u005C    
         ldx   <u00AB     Get ptr to current I-code line end
         stx   <u0060    
         stx   <u004A     Make it ptr to end of in use I-code workspace
         ldd   <u000C     Get # bytes free in workspace for user
         pshs  y,d       
         bsr   L0113     
         puls  y,d       
         std   <u000C     Save # bytes now free in workspace for user
         sty   <u004A     Save updated end of I-code workspace ptr
         ldx   <u002F     Get ptr to current module
         lda   <$17,x     Get flag byte
         rora             Shift out Line with Compiler error flag bit
         bcs   L0E68      Compiled line has error, report it
         leas  >$0102,s   Eat 258 bytes from stack ???
         ldd   <u0000     Get start of data mem ptr
         addd  <u0002     Add to Size of data area
         tfr   d,y        Move end of data area ptr to Y
         std   <u0046     Save it
         std   <u0044    
         ldu   #$0000    
         stu   <u0031    
         stu   <u00B3     # steps per run through program (0=continuous)
         inc   <u00B3+1   Set # steps to 1
         clr   <u0036     Clear out last error code
         ldd   <u004A     Get ptr to next free byte in I-code workspace
         ldx   <u000C     Get # bytes free in workspace for user
         pshs  x,d        Save them
         leax  <L0E5F,pc  Point to routine
         lbsr  L0899     
         ldx   <u004A     Get ptr to next free byte in I-code workspace
         bsr   L0119     
         lbsr  L0DBB     
         ldx   <u002F     Get ptr to start of current module
         bsr   L011C     
         bra   L0E65     

L0119    jsr   <u0024    
         fcb   $04       

L011C    jsr   <u0024    
         fcb   $02       

L0E5F    puls  x,d        Restore bytes free in workspace & ptr to next free
         std   <u004A     Save old next free byte in I-code workspace
         stx   <u000C     Save old # bytes free in workspace for user
L0E65    lbra  L088F     

L0E68    ldb   #$33       Line with compiler error
         lbra  L0A86      Go report it

* System mode - BYE
L0E6D    bsr   L0E8F     
         clrb             Exit without error
         os9   F$Exit    

L0E73    lbsr  L010D     
         beq   L0E8B     
         lbsr  L0F6E     
         bcs   L0E8B     
         ldu   <u0046    

         IFNE  H6309
         clrd            
         ELSE            
         clra            
         clrb            
         ENDC            

         pshu  x,d       
         inca            
         sta   <u0035    
         bsr   L0E9F     
         clr   <u0035    
         rts             

L0E8B    comb             Set carry for error
         ldb   #$2B       Divide by 0 error
         rts             

L0E8F    ldy   <u0082     Get ptr to current pos in temp buffer
         lda   #$2A       '*'
         sta   ,y         Save in temp buffer
         sta   <u0035     Save as last signal received
L0E98    lbsr  L0C9D     
         clr   <u002F     Clear out ptr to start of 'current' module
         clr   <u002F+1  
L0E9F    ldu   <u0046     Get default ??? tbl ptr
         stu   <u0044     Save as current ??? tbl ptr
         bra   L0EE3     

L0EA5    ldx   ,x         Get ptr to module
         ldb   M$Type,x   Get module type
         beq   L0EC0      If nothing (un-compiled or errors?), skip ahead
         cmpb  #Sbrtn+ICode Basic09 I-Code?           
         bne   L0EB5      No, skip ahead
         ldb   <$17,x     Get I-Code flag byte
         lslb             Shift out the packed bit
         bmi   L0EC0      If (CRC just made?) flag set, skip ahead
L0EB5    pshs  u          Preserved U
         leau  ,x         Point U to module start
         os9   F$UnLink   Unlink the I-Code module
         puls  u          Restore U
         bra   L0EDE     

L0EC0    tst   <u0035     Any signal code?
         bne   L0EE3      Yes, skip ahead
         ldx   ,u         No, get ptr to module
         lbsr  L0FB6      Go remove it from workspace pointers (?)
         ldy   ,x         Get ptr to module again
         ldd   <u000A     Get current total size of used I-Code space
         subd  M$Size,y   Subtract deleted module's size
         std   <u000A     Save new size of used I-Code space
         ldd   M$Size,y   Get size of module being removed
         addd  <u000C     Add to bytes free in I-Code space
         std   <u000C     Save new # bytes free in I-Code space
         ldd   <u004A     Get ptr to end of used I-Code space+1
         subd  M$Size,y   Bump it back to not include the deleted module
         std   <u004A     Save new ptr to where next added I-Code goes
L0EDE    ldd   #$FFFF     Module ptr unused marker
         std   [,u]       Mark it
* Compress list of modules in I-Code workspace (get rid of all deleted ones)
L0EE3    ldx   ,--u       Get previous module ptr
         bne   L0EA5      There is one, go remove it too
         ldx   <u0004     Get ptr to list of modules is I-Code workspace
         tfr   x,y        Move it to Y
L0EEB    ldd   ,x++       Get module ptr
         cmpd  #$FFFF     Unused one?
         beq   L0EEB      Yes, try next
L0EF3    std   ,y++       Save it 
         bne   L0EEB      Until a $0000 is hit
         cmpd  ,y         Is the next entry a 0 too?
         bne   L0EF3      No, keep Storing until we hit a 0
         rts              Otherwise, return

L0EFD    bsr   L0F6E     
         bcs   L0F02     
         rts             

* Set up module header info?
L0F02    pshs  u,x       
         tfr   x,d       
         cmpb  #$FE      
         beq   L0F69     
         ldx   <u000C     Get # bytes free in I-Code workspace for user
         cmpx  #$00FF     <255 bytes left free?
         blo   L0F69      Yes, skip ahead
         leax  <-$1C,x    Bump # bytes free down by 28 bytes
         ldu   <u004A     Get ptr to current I-code line start
* Clear out entire header of packed RUNB module
* 6809/6309 mod: should use sta (after clra) instead of clr b,u
* Wait until L0F69 is checked-does it need A?
         ldb   #$FF       Pre-init B for loop below
L0F18    incb             Next position
         clr   b,u        Clear byte
         cmpb  #$18       Done all $18 bytes?
         bne   L0F18      No, keep going
* Copy module name to $19
L0F1F    incb             Bump B to $19
         leax  -1,x       Bump X back
         beq   L0F69      If hit 0, exit with memory full error
         inc   $18,u      Bump up module name size to 1
         lda   ,y+        Get char from source (module name)
         sta   b,u        Save it
         bpl   L0F1F      Do until hi-bit terminated
         incb             Bump B to 1 byte past module name (start of I-code)
         stx   <u000C     Save # bytes left free in I-Code workspace
         clra             MSB of D=0
         std   $15,u      ???
         std   M$Exec,u   Save ptr to execution offset
         std   $F,u       ???
         stu   [,s]      
         pshs  b         
         addd  #$0003     Add 3 to size of module so far (for CRC)
         std   M$Size,u   Save as current size of module
         std   $D,u       ??? (Size of I-code ???)
         addd  <u000A     Add size to total # bytes used by I-Code
         std   <u000A     Save new # bytes used by I-Code
         ldd   #M$ID12    Module header code
         std   M$ID,u     Save as module header
         ldd   #$0019     Ptr to where module name will be
         std   M$Name,u   Save as module name ptr
         ldd   #$0081     Type/Lang.=0 (internal to BASIC09)/Sharbl Rev.1
         std   M$Type,u  
         ldd   #$0016     Minimum data area size=22 bytes
         std   M$Mem,u   
         puls  b          Get offset to just past module name back
         leax  d,u        Point X to just after filename
         ldb   #$03       Add $000003 to end
         sta   ,x+       
         std   ,x++      
         stx   <u004A     ??? Save end of module ptr?
         puls  pc,u,x     Restore regs & return

L0F69    ldb   #$20       BASIC09 memory full error (or too many modules)
         lbra  L0A86     

* Entry: Y=Ptr to module name
* Exit:  D=Ptr to string/file name
*          Carry set if adding new module to module list
*          Carry clear if replacing existing module in module list
*        X=Ptr to module directory entry we are adding/changing
*        Y=Ptr to end of filename+1
L0F6E    pshs  u,y        Preserve regs
         ldx   <u0004     Get ptr to list of modules in BASIC09 workspace
L0F72    ldy   ,s         Get ptr to string we are checking for
         ldu   ,x++       Get ptr to module in workspace
         beq   L0F8E      None left to check, exit with carry set
         ldd   M$Name,u   Get offset to name
         leau  d,u        Point to name of module
L0F7D    lda   ,y+        Get char from name we are looking for
         eora  ,u+       
         anda  #$DF       Force case
         bne   L0F72      Doesn't match, try next module
         clra             Clear carry (module found)
         tst   -1,u       Was it the last char in existing module name?
         bpl   L0F7D      No, keep checking
L0F8A    leax  -2,x       Point X to module ptr entry change (or add from F8E)
         puls  pc,u,d     Restore U, get string ptr into D & exit

L0F8E    coma             Set carry (flag new module being added)
         bra   L0F8A      Point to module ptr entry we are going to add

* Check if module is in BASIC09 workspace, try to add if it isn't
* Entry: Y=Ptr to module name to look for (hi-bit terminated with CR on end)
* Exit:  Carry clear if module in workspace
*        Carry set if module NOT in workspace
*        X=Ptr to module ptr entry ($400-$4FF) where module was found
*        D=Ptr to module name
*        Y=Ptr to last char of module name+1
L0F91    bsr   L0F6E      Go see if we should add or replace module
         bcs   L0F96      Adding new module, skip ahead
         rts              Replacing, exit

* Module not found currently in BASIC09 workspace... try to F$Link or F$Load
*   it in.
* Entry: X=Ptr to 1st free module directory entry in BASIC09 workspace
*        Y=Ptr to module name to add
* Exit:  Carry set & B=error code if still can't link module into workspace
*        Carry clear if linked in
*        Module ptr directory updated with new module
*        Y=Ptr to end of module name+1
*        X=Ptr to module directory entry
L0F96    pshs  u,y,x      Preserve regs
         ldb   1,s        Get LSB of module directory ptr
         cmpb  #$FE       At end of table?
         beq   L0F69      Yes, exit with Memory full error (too many modules)
         leax  ,y         Point X to module name
         clra             Type/language=wildcard (don't care)
         os9   F$Link     See if it's already in memory & map it in
         bcc   L0FB0      Yes, mapped in so skip ahead
         ldx   2,s        Get ptr to Module name again
         clra             Type/language=wildcard (don't care)
         os9   F$Load     Try loading it & linking it in
         bcs   L0FB4      Error, exit with it
L0FB0    stx   2,s        Save ptr to last byte of module name+1 in Y
         stu   [,s]       Save ptr to module in module ptr entry
L0FB4    puls  pc,u,y,x   Restore regs & return

* Entry: X=Ptr to module copy we are putting in I-Code workspace (at end of it)
*        Y=???
* Exit:  X=Ptr to where module was moved to
L0FB6    pshs  y,x        Preserve regs
         ldd   <u0008     Get ptr to start of I-Code workspace
         addd  <u000A     Add to total size of used I-Code workspace
         tfr   d,y        Move ptr to end of I-Code workspace to Y
         ldx   ,x         Get ptr to module we are adding to I-Code workspace
         sty   [,s]       Save ptr to where it is going over old one on stck
         ldd   M$Size,x   Get size of module we are adding
         bsr   L0FE3     
         pshs  y,x,d     
         ldx   <u0004     Get ptr to list of modules in BASIC09 workspace
         bra   L0FDB     

L0FCD    cmpd  2,s       
         blo   L0FDB     
         cmpd  4,s       
         bhi   L0FDB     
         subd  ,s        
         std   -2,x      
L0FDB    ldd   ,x++       Get possible module ptr
         bne   L0FCD      Found one, process
         leas  6,s        No more modules, eat stack
         puls  pc,y,x     Restore & return

* Entry: D=Size of module being added to I-Code workspace
*        X=Ptr to source of I-code module being added into I-Code workspace
*        Y=Ptr to destination of new I-Code module
*        U=???
* After PSHS below, stack is thus:
*  0,s = Size of module being added to I-Code buffer
*  2,s = Ptr to current location of I-Code
*  4,s = Ptr to destination of I-Code
*  6,s = Old U ???
*  8,s = RTS address
L0FE3    pshs  u,y,x,d    Preserve regs
         ldu   #$0000     Init counter to 0
         tfr   x,d        Move source ptr to D
         subd  4,s        D=distance between source & destination
         pshs  x,d        Preserve Source ptr & distance
*  0,s = Distance between source & destination (signed)
*  2,s = Work copy of ptr to current location of I-Code
*  4,s = Size of module being added to I-Code buffer
*  6,s = Ptr to current location of I-Code
*  8,s = Ptr to destination of I-Code
* 10,s = Old U ???
* 12,s = RTS address
         addd  4,s        D=distance between src & dest + size of module
         beq   L1022      If result=0 then restore regs & return
L0FF2    lda   ,x         Get 1st byte of source copy
         pshs  a          Save on stack
*  0,s = 1st byte from source copy
*  1,s = Distance between source & destination (signed)
*  3,s = Work copy of ptr to current location of I-Code
*  5,s = Size of module being added to I-Code buffer
*  7,s = Ptr to current location of I-Code
*  9,s = Ptr to destination of I-Code
* 11,s = Old U ???
* 13,s = RTS address
         bra   L1000     

L0FF8    lda   ,y         Get byte from source location
         sta   ,x         Save in destination location
         leau  1,u        Bump counter up
         tfr   y,x        Move source location to dest location
L1000    tfr   x,d        ??? Move src ptr to D
         addd  5,s        Add to size of module
         cmpd  9,s        Compare with dest. address
         blo   L100B      Fits, skip ahead
         addd  1,s        Won't, add to distance between src/dest
L100B    tfr   d,y        Move end address (?) to Y
         cmpd  3,s        Same as current location?
         bne   L0FF8      No, go bck
         puls  a         
         sta   ,x        
         leax  1,y       
         stx   2,s       
         leau  1,u       
         tfr   u,d       
         addd  ,s        
         bne   L0FF2     
L1022    leas  4,s        Eat temp vars
         puls  pc,u,y,x,d Restore regs & return

* Enter Debug mode?
L1026    pshs  u,y,x,d   
         lda   <u0036     Get last error code
         cmpa  #$39       System stack overflow error?
         beq   L1068      Yes, skip ahead
         tst   <u00A0     ??? Some flag set?
         bne   L10AA      Yes, skip ahead
         inc   <u00A0     Set flag
         lda   <u0035     Get last signal received
         bne   L1064      Was a signal, skip ahead
         ldd   <u00B3     Get # steps to do @ a time for trace
         subd  #1         Bump down by 1
         bhi   L1089      Was >1, skip ahead
         bmi   L104E      Was 0 or lower, skip ahead
L1041    lbsr  L0DBB     
         leax  >L0791,pc  Force to Alpha mode (if VDG window) & print BREAK
         lbsr  L135A     
         lbsr  L124D     
* Debug mode command loop
L104E    leax  >L07A4,pc  Point to 'D:'
         leay  >L06C1,pc  Point to start of debug command table
         lbsr  L08D3      Go process debug mode command
         bcc   L104E      Legit cmd executed, get next debug mode cmd
         lda   <u0035     Get last signal received
         bne   L1064      There was one, go check for abort
         lbsr  L08CC      None, print 'What?'
         bra   L104E      Go process next debug mode command

L0134    jsr   <u0024    
         fcb   $0C       

L1064    cmpa  #S$Abort   <CTRL>-<E> signal?
         bne   L1041      No, enter debug mode
* Debug 'Q' command (quite debug)
L1068    bsr   L0134     
         lda   #$03       Error path #3 we will check for
L106D    cmpa  <u00BE     Compare with I$Dup error path #
         beq   L1074      If not path we are looking for, skip ahead
         os9   I$Close    Same path, close it
L1074    inca             Next path
         cmpa  #16        Done all 16 possible?
         blo   L106D      No, keep going
         lbra  L088F      Done, reset temp buffers & ptrs to defaults

* Debug STEP command
* Entry: Y=Ptr to next char on line entered by user
L107C    lbsr  L0A90      Go check next char in STEP command
         bne   L108E      If anything but space or comma, STEP 1
         leax  ,y         Otherwise, point X to ASCII of steps specified
         lbsr  L1748      Go get # steps to do into D
         bcc   L1091      No error, continue
         rts              Else exit

L1089    bsr   L1091     
* Debug mode <CR> goes here (single step)
L108B    clrb            
         bra   L1090     

L108E    ldb   #1         Step rate of 1
L1090    clra            
L1091    std   <u00B3     Save # steps to do
         lsl   <u0034     Set high bit of signal flag
         coma            
         ror   <u0034    
         bra   L10A6      Continue

* Debug mode CONT command (continuous run)
L109A    lbsr  L0DBB      Reset temp buffer stuff
         lsl   <u0034     Clear high bit of signal flag
         lsr   <u0034    
         ldd   #$0001     1 step till we print out
         std   <u00B3     Save it
L10A6    leas  2,s       
         clr   <u00A0    
L10AA    puls  pc,u,y,x,d

L10AC    ldy   <u0019    
         jsr   ,y        
L10B1    pshs  u,y,x,d   
         cmpy  <u0046     ?? Get current pos in some table
         beq   L10E2      If no entries, exit
         ldb   <u007D     Get size of temp buff
         ldx   <u0080     Get ptr to start of temp buff
         ldu   <u0082     Get ptr to end of temp buff+1
         pshs  u,x,b      Preserve
         stu   <u0080     Temporarily set up temp buff to append to current
         lbsr  L0DBB     
         lda   #'=        Append '=' to temp buff
         lbsr  L1373     
         ldb   ,y        
         addb  #$01      
         cmpb  #$06      
         bhs   L10D7     
         leax  ,y        
         lbsr  L13AA     
L10D7    lbsr  L1264     
         puls  u,x,b      Get back temp buff stats
         stb   <u007D     Restore temp buff to normal
         stx   <u0080    
         stu   <u0082    
L10E2    puls  pc,u,y,x,d Restore regs & return

* Debug LIST command
L10E4    lbsr  L124B      Go print PROCEDURE & name
         tst   <$17,x     Is procedure packed?
         bmi   L110A      Yes, exit without error
         ldx   <u005E    
L10EE    clr   <u0074    
* List out each line loop
L10F0    tst   <u0035     Any signals?
         bne   L110A      Yes, exit without error (Can't list packed modules)
         leay  ,x         Point Y to beginning of I-Code module
         lbsr  L1BC9     
         bsr   L110C     
         exg   x,y       
         cmpx  <u0060    
         blo   L10F0     
         cmpx  <u005C    
         bne   L110A     
         cmpy  <u0060    
         blo   L10F0     
L110A    clra             No error & return
         rts             

L012B    jsr   <u0021    
         fcb   $06       

L110C    pshs  u,y,x      Preserve regs
         lbsr  L0DBB      Reset temp buffer to empty
         ldx   <u002F     Get current module ptr
         tst   <$17,x     Is it packed?
         bmi   L1193      Yes,  restore regs & exit
         ldx   ,s         Get original X back
         tfr   y,d       
         subd  ,s        
         bmi   L1190      Wrap to negative?
         pshs  x,d       
         addd  #40        If we needed 64 bytes...
         cmpd  <u000C     would it fit in BASIC09 workspace?
         lbhs  L0F69      No, return with BASIC09 memory full error
         tst   <u0084    
         bmi   L1158     
         lda   #C$SPAC   
         cmpx  <u005C    
         bhi   L113F     
         beq   L113D     
         cmpy  <u005C    
         bls   L113F     
L113D    lda   #'*        Append '*' to temp buffer
L113F    lbsr  L1373      Go append it
         cmpx  <u0060    
         bhs   L1158     
         tfr   x,d       
         subd  <u005E    
         ldx   <u0082     Get current pos. in temp buffer
         bsr   L012B      JSR <u0021 / function 6
         lda   #C$SPAC    Append space to temp buffer
         sta   ,x+       
         stx   <u0082     Save update temp buff ptr
         lbsr  L1270      Print message out
L1158    puls  y,d       
         cmpy  <u0060    
         bhs   L1190     
         ldu   <u004A    
         lbsr  L19EF     
         lbsr  L11F2     
         stu   <u005C    
         leax  d,u       
         stx   <u0060    
         stx   <u004A    
         leay  ,u        
         tst   <u0084    
         bmi   L1183     
         leax  ,y        
         lbsr  L1677     
         bne   L1183     
         leax  >L02EB,pc  Point to 'ERR' in basic09 commands
         lbsr  L126B      Print it out??
L1183    lbsr  L0DBB     
         lbsr  L1AC6     
         lbsr  L128B     
         bsr   L11D5     
         dec   <u0082+1  
L1190    lbsr  L1264     
L1193    puls  pc,u,y,x  

* Debug mode - PRINT/TRON/TROFF/DEG/RAD/LET commands
L1195    ldx   <u002F     Get ptr to start of 'current' module
         tst   <$17,x     Is it packed?
         bpl   L119E      No, skip ahead
         coma             Yes, set carry & return
         rts             

L119E    ldy   <u0080     Get ptr to start of temporary buffer
         lbsr  L0122      JSR <1E, function $A
         bsr   L11F2     
         ldx   <u004A    
         lbsr  L1677     
         beq   L11D5     
         stx   <u005E    
         stx   <u005C    
         leay  ,x        
         ldx   <u00AB    
         stx   <u0060    
         stx   <u004A    
         bsr   L012E     
         ldx   <u002F     Get ptr to current module
         lda   <$17,x     Get original flags
         clr   <$17,x     Clear flags out
         tsta             Were the flags special in any way?
         bne   L11D5      Yes, skip ahead
         leax  <L11D5,pc  No, point to the routine instead
         lbsr  L0899     
         ldx   <u005E    
         bsr   L0137      JSR <$24, function 8
         lbra  L088F      Swap stacks, reset temp buffer, return from there

L012E    jsr   <u0021    
         fcb   $04       

L0137    jsr   <u0024    
         fcb   $08       

L11D5    pshs  u,y,x,d    Preserve regs
         ldu   <u0046     Get reset value ($300) table ptr
         pulu  y,x,d      Get regs from there
         sty   <u000A     Save # bytes used by all code in workspace
         stx   <u000C     Save # bytes free in workspace
         std   <u004A     Save ptr to next free byte in workspace
         pulu  y,x,d      Get 6 more bytes
         sty   <u0060    
         stx   <u005E    
         std   <u005C    
L11EB    stu   <u0046    
         stu   <u0044    
         clra             No error,restore regs & return
         puls  pc,u,y,x,d

L11F2    pshs  u,y,x,d   
         ldu   <u0046    
         ldd   <u005C    
         ldx   <u005E    
         ldy   <u0060    
         pshu  y,x,d     
         ldd   <u004A    
         ldx   <u000C    
         ldy   <u000A    
         pshu  y,x,d     
         bra   L11EB     

* Debug mode - STATE command
L120A    ldy   <u0031    
         leax  >L0756,pc  Point to 'PROCEDURE'
L1211    bsr   L1223     
         lbsr  L135A     
         ldx   3,y       
         bsr   L1256     
         leax  <L0799,pc  Point to 'called by'
         ldy   7,y       
         bne   L1211     
L1223    lbra  L0DBB     

L0799    fcs   'called by'

* Debug mode - BREAK command
L1226    lbsr  L010D      JSR <1E, function 2
         beq   L1249     
         lbsr  L0F6E     
         bcs   L1249     
         ldx   ,x        
         ldy   <u0031    
L1235    ldy   7,y       
         beq   L1249     
         cmpx  3,y       
         bne   L1235     
* 6309, change to OIM #1,,y
         lsl   ,y         Set hi bit @ Y
         coma            
         ror   ,y        
         leax  >L07A2,pc  Point to 'ok'
         bra   L125F     

L1249    coma            
         rts             

L124B    bsr   L1223     
L124D    leax  >L0756,pc  Point to 'PROCEDURE'
         lbsr  L135A     
         ldx   <u002F     Get ptr to current module
L1256    pshs  x          Save it
         leax  <$19,x     Point to main code area
         bsr   L1261     
         puls  pc,x      

* Copy string pointed to by X to temp buffer & print it to std error
L125F    bsr   L1223      Set output txt size to 1, curr. temp buff pos=start
L1261    lbsr  L1392      Copy text string to temp buffer @ [u0080]
L1264    lbsr  L1371      Append a CR on the end of output buffer
         bsr   L1270      Print out the buffer to std error
         bra   L1223      Reset temp buffer size & ptrs to defaults & return

L126B    bsr   L1223     
         lbsr  L1392     
* Print message in temp buffer to std error path
* NOTE: MAY WANT TO CHECK INTO USING <7D FOR SIZE
L1270    pshs  y,x,d      Preserve regs
         ldd   <u0082     Get ptr to end of temp buffer+1
         subd  <u0080     Calculate size of temp buffer
         bls   L1285      If 0 or >32k, restore regs & exit
         tfr   d,y        Move size to proper reg for WritLn
         ldx   <u0080     Point to start of text
         lda   #$02       Std error path
         os9   I$WritLn   Write out the temporary buffer
         bcc   L1285      No error, restore regs & exit
         bsr   L1287      Print the error message out
L1285    puls  pc,y,x,d   Restore regs & exit

L1287    os9   F$PErr     Print error message
         rts             

L128B    ldy   <u005C    
         cmpy  <u0060    
         bhs   L12CF     
         ldb   ,y        
         cmpb  #$3A      
         bne   L12A3     
         leay  1,y       
         lbsr  L13CF     
         lbsr  L135C     
         ldb   ,y        
L12A3    tst   <u0084    
         bmi   L12B8     
         bsr   L12F9     
         ldb   <u0074    
         pshs  b         
         bsr   L12D8     
         puls  a         
         sta   <u0074    
         tfr   b,a       
         lbsr  L134E     
L12B8    ldb   ,y+       
         bmi   L12C4     
         bsr   L12F9     
         bsr   L12D8     
         bsr   L130C     
         bra   L12C7     

L12C4    lbsr  L1489     
L12C7    cmpy  <u0060    
         blo   L12B8     
L12CC    sty   <u005C    
L12CF    lbra  L1371     

L12D4    leas  2,s       
         bra   L12CC     

L12D8    sta   ,-s       
         bmi   L12F6     
         anda  #3        
         beq   L12F6     
         cmpa  #1        
         bne   L12E8     
         inc   <u0074    
         bra   L12F6     

L12E8    decb            
         bpl   L12EC     
         clrb            
L12EC    cmpa  #3        
         beq   L12F6     
         dec   <u0074    
         bpl   L12F6     
         clr   <u0074    
L12F6    lda   ,s+       
         rts             

L12F9    leax  >L03F5,pc  Point to 3 byte packets for <u001B calls - $12
         tstb             If positive, skip ahead
         bpl   L1302     
         subb  #$2A       Otherwise, bump down by 42
L1302    lda   #$03       Multiply by size of each entry
         mul             
         leax  d,x        Point to entry
         lda   ,x         Get 1st byte & return
         rts             

L130A    bsr   L12F9     
L130C    leax  1,x       
         anda  #$60      
         beq   L1318     
         cmpa  #$60      
         bne   L132A     
         leay  2,y       
L1318    lda   -1,x      
         pshs  a         
         ldd   ,x        
         leax  d,x       
         puls  a         
         anda  #$18      
         cmpa  #$10      
         beq   L1392     
         bra   L1358     

L132A    cmpa  #$20      
         bne   L1332     
         ldd   ,x        
         jmp   d,x       

L1332    bsr   L133A     
         bsr   L1336     
L1336    lda   ,x+       
         bne   L1373     
L133A    lda   <u007D    
         cmpa  #$41      
         bcs   L1357     
         lda   #$0A      
         bsr   L1373     
         clr   <u007D    
         tst   <u0084    
         bmi   L1357     
         lda   <u0074    
         adda  #3        
L134E    lsla            
         adda  #6        
         ldb   #$10      
         bsr   L011F     
         clra            
L1357    rts             

L1358    bsr   L135C     
L135A    bsr   L1392     
L135C    pshs  u,d       
         bsr   L133A     
         bcc   L136F     
         ldu   <u0082    
         lda   #C$SPAC   
         cmpa  -1,u      
         beq   L136F     
         cmpu  <u0080    
         bne   L1377     
L136F    puls  pc,u,d    

* Append byte in A to temp buffer, check for overflow
L1371    lda   #C$CR     
* Entry: A=Char (hi-bit stripped)
L1373    pshs  u,d        Preserve regs
         ldu   <u0082     ??? Get ptr to temp buffer
L1377    sta   ,u+        Save char in buffer
         ldd   <u0082     Get current pos in temp buffer
         subd  <u0080     Calc. current size of temp buffer
         tsta             Past our max (255 bytes)?
         bne   L1384      Yes, exit
         inc   <u007D     No, bump up char count
         stu   <u0082     Save current pos. in temp buffer+1
L1384    puls  pc,u,d     Restore & return

L1386    lda   #$2E      
         bsr   L1373     
L138A    ldx   ,y++      
         ldd   <u0062    
         leax  d,x       
         leax  3,x       

* Entry: X=ptr to text to output
* Exit: text output is in temp buffer from [u0080] to [u0082]-1
*       size of output string is in u007D
L1392    pshs  x          Preserve ptr to text to output
L1394    lda   ,x         Get 1st char from X
         anda  #$7F       Strip hi bit
         bsr   L1373      Add byte to temp buffer; check if full
         tst   ,x+        Was the high bit set? (last char flag)
         bpl   L1394      No, keep building output buffer
         puls  pc,x       Done, restore original text ptr & return

L011F    jsr   <u002A    
         fcb   $02       

* Called from Debug mode (?) -something with REAL #'s?
L13A0    ldb   #3        
         ldx   <u0044    
         pshs  y,b       
         leay  -1,y      
         bra   L13AC     

L13AA    pshs  y,b       
* on 6309, use LDQ/STQ, on 6809, uses std -2/-4/-6,x leay -6,x (saves 5 cycles)
L13AC    ldd   4,y       
         std   ,--x      
         ldd   2,y       
         std   ,--x      
         ldd   ,y        
         std   ,--x      
         leay  ,x        
         puls  b         
         bra   L13DC     

L13BE    ldb   ,y        
         clra            
         bra   L13D1     

L13C3    leax  >L0203,pc  Point to 'GOSUB'
         bra   L13CD     

L13C9    leax  >L01FD,pc  Point to 'GOTO'
L13CD    bsr   L1358     
L13CF    ldd   ,y++      
L13D1    pshs  y         
         ldy   <u0044    
         leay  -6,y      
         std   1,y       
         ldb   #2        
L13DC    bsr   L011F      JSR <$2A, function 2, sub-function 2
         puls  pc,y      

L13E1    bsr   L13F1     
L13E3    lda   ,y+        Get char
         cmpa  #$FF       EOS?
         beq   L13F1      Yes, add " to temp buffer
         bsr   L1373      No, add char to buffer
         cmpa  #'"        Was it a ?
         bne   L13E3      No, keep printing chars
         bra   L13E1      Yes, add " & continue

L13F1    lda   #'"        Add " to temp buffer
L13F3    lbra  L1373     

L13F6    lda   #'$        Add $ to temp buffer
         bsr   L13F3     
         ldb   #$14      
         bsr   L011F      JSR <$2A, function 2, sub-function $14
         leay  2,y       
         rts             

L1402    leax  >L027E,pc  Point to 'BASE'
         lbsr  L135A     
         lda   -1,y      
         adda  #$FB      
         bra   L13F3     

L140F    leax  >L020A,pc  Point to 'RUN'
L1413    lbsr  L135A     
         lbra  L138A     

L1419    leax  >L01AC,pc  Point to 'NEXT'
         leay  1,y       
         bsr   L1413     
         leay  6,y       
         rts             

L1424    leax  >L02B4,pc  Point to 'THEN'
         lbsr  L1358     
         lda   ,y        
         cmpa  #$3A      
         beq   L1433     
         inc   <u0074    
L1433    rts             

L1434    fcs   '(*'      

L1436    leax  <L1434,pc  Point to alternative REM statement
         bra   L1440     

L143C    leax  >L0284,pc  Point to 'REM'
L1440    lbsr  L135A     
L1443    ldb   ,y+       
L1445    decb            
         beq   L1433     
         lda   ,y+       
         bsr   L13F3     
         bra   L1445     

* File opening mode table: 3 bytes per entry
* Byte 1   : Actual mode bit pattern
* Bytes 2&3: Offset (from itself) to keyword describing mode
*   NOTE: keywords are high bit terminated
L144E    fcb   UPDAT.    
L144F    fdb   L03E4-*    Points to 'Update' string
L1451    fcb   READ.     
L1452    fdb   L0241-*    Points to 'Read' string
L1454    fcb   WRITE.    
L1455    fdb   L0247-*    Points to 'Write' string
L1457    fcb   EXEC.     
L1458    fdb   L03EC-*    Points to 'Exec' string
L145A    fcb   DIR.      
L145B    fdb   L03F2-*    Points to 'Dir' string
L145D    fcb   $00        End of table marker

L145E    lda   ,y+        Get requested file access mode
         pshs  a          Preserve on stack
         lda   #':        Separator that starts modes
L1464    bsr   L13F3      Parse for char?
         leax  <L144E-2,pc Point early for reentry point of loop
L1469    leax  2,x        Bump to next entry
         lda   ,s         Get requested mode
         anda  ,x         AND with mode in table
         cmpa  ,x+        Match so far?
         bne   L1469      No, check next entry
         tsta             Matched cuz we are at end of table?
         beq   L1487      Yes, exit routine
         eora  ,s         Mask out bits that are part of token, not mode
         sta   ,s         Preserve raw mode
         ldd   ,x         Get offset to text equivalent of mode
         leax  d,x        Point to it
         lbsr  L1392     
         lda   #'+        Now check for additional modes
         tst   ,s        
         bne   L1464      Go check them  & update accordingly
L1487    puls  pc,a       Restore A and exit

L1489    pshs  u         
         ldu   <u0044    
         clr   ,-u        Clear two bytes on stack
         clr   ,-u       
         leay  -1,y      
L1493    ldb   ,y        
         bpl   L14C4     
         lbsr  L12F9     
         tfr   a,b       
         lda   ,y+       
         bitb  #$80      
         bne   L1493     
         orb   #$80      
         pshu  d         
         bitb  #$18      
         bne   L1493     
         andb  #$7F      
         pshu  d         
         bitb  #$04      
         bne   L14B8     
         ldd   ,y++      
         std   2,u       
         bra   L1493     

L14B8    leay  -1,y      
         sty   2,u       
         ldb   ,y+       
         lbsr  L1B68     
         bra   L1493     

L14C4    sty   <u005C    
         leay  ,u        
         clra            
         clrb            
         std   ,--y      
         pshs  d         
         sta   <u00BF    
         sta   <u00B1    
L14D3    ldd   ,u++      
         bitb  #$08      
         beq   L14FE     
         andb  #$07      
         cmpb  <u00BF    
         bhi   L14F2     
         bne   L14EF     
         cmpb  #$06      
         bne   L14EB     
         tst   <u00B1    
         beq   L14EF     
         bra   L14F2     

L14EB    tst   <u00B1    
         beq   L14F2     
L14EF    lbsr  L1581     
L14F2    stb   <u00BF    
         orb   #$80      
         std   ,--y      
         lda   #$01      
         sta   <u00B1    
         bra   L14D3     

L14FE    clr   <u00B1    
         bitb  #$03      
         beq   L152D     
         bitb  #$04      
         bne   L152D     
         bitb  #$10      
         bne   L1510     
         pulu  x         
         stx   ,--y      
L1510    std   ,--y      
         andb  #$03      
         bsr   L1581     
         cmpa  #$BE      
         bne   L151F     
         ldx   #$54FF    
         stx   ,--y      
L151F    ldx   #$4B80    
         bra   L1526     

L1524    stx   ,--y      
L1526    decb            
         bne   L1524     
         stb   <u00BF    
L152B    bra   L14D3     

L152D    bitb  #$10      
         bne   L1535     
         pulu  x         
L1533    pshs  x         
L1535    pshs  d         
         cmpa  #$89      
         blo   L153F     
         cmpa  #$8C      
         bls   L14D3     
L153F    ldd   ,y++      
         tstb            
         bmi   L154A     
         beq   L1558     
         ldx   ,y++      
         bra   L1533     

L154A    pshs  d         
         clr   $01,s     
         bitb  #$10      
         bne   L153F     
         andb  #$07      
         stb   <u00BF    
         bra   L152B     

L1558    ldx   ,u++      
         beq   L1569     
         pshu  x         
         std   ,--y      
         bra   L152B     

L1562    puls  y         
         ldb   ,y+       
         lbsr  L130A     
L1569    ldd   ,s++      
         beq   L157C     
         bitb  #$04      
         bne   L1562     
         leay  ,s        
         exg   a,b       
         lbsr  L130A     
         leas  ,y        
         bra   L1569     

L157C    ldy   <u005C    
         puls  pc,u      

L1581    ldx   ,s        
         pshs  x         
         ldx   #$4E00    
         stx   $02,s     
         ldx   #$4DFF    
         stx   ,--y      
         rts             

L1590    lbsr  L0A9D     
         lbsr  L0EFD     
         ldy   ,x        
         tst   $06,y     
         bne   L15E5     
         pshs  x         
         lbsr  L1A2E     
         lbsr  L124B     
         ldy   <u005E    
         bsr   L15F3     
L15AA    lda   <u0035     Get last signal code received
         cmpa  #S$Abort   <CTRL>-<E>?
         bne   L15B3      No, skip ahead
         lbsr  L1993      Yes, ???
L15B3    leax  >L07A6,pc  Point to 'E:'
         leay  >L0718,pc  Point to EDIT mode command table
         lbsr  L08D3      Get next command from keyboard & execute it
         bcc   L15AA      Legit command done, get next one
         tst   <u0035     Signal received?
         bne   L15AA      Yes, go process it
         leax  <L15AA,pc  Point to routine (loop)
         pshs  x          Save it (for possible rts address?)
         ldx   <u0080     Get ptr to start of temp buffer
         lsl   ,x         Clear out hi bit in 1st char in temp buffer
         lsr   ,x        
         lbsr  L1748      ???
         lbcs  L08CC      If carry set, print 'What?'
         lbsr  L1A0D     
         lda   ,x        
         cmpa  #C$CR     
         beq   L15F3     
         ldy   <u0080     Get temp buffer ptr
         bra   L1601      Skip ahead

L15E5    coma            
         rts             

L15E7    leax  -1,y      
         lsl   ,x        
         asr   ,x        
         lbsr  L16F2     
         lbsr  L16BD     
L15F3    sty   <u005C    
         lbsr  L1682     
         leax  ,y        
         lbsr  L1BC9     
         lbra  L16AD     

L1601    bsr   L1606     
         bcc   L15F3     
         rts             

L0122    jsr   <u001E    
         fcb   $0A       

L1606    tst   <u000C    
         beq   L1670     
         clr   <u00A0    
         bsr   L0122     
         ldx   <u004A    
         lda   ,x        
         cmpa  #$3A      
         bne   L165E     
         clra            
         clrb            
         sta   ,-s       
         ldy   <u005C    
         lbsr  L1A10     
         cmpy  <u0060    
         bcc   L162F     
         ldd   $01,x     
         cmpd  $01,y     
         bls   L162F     
         inc   ,s        
L162F    ldy   <u005E    
         ldd   1,x       
         lbsr  L1A0D     
         tst   ,s+       
         bne   L1642     
         bhs   L1642     
         cmpy  <u005C    
         bhs   L165E     
L1642    sty   <u005C    
         cmpy  <u0060    
         bhs   L165E     
         ldx   <u004A    
         ldd   1,x       
         cmpd  1,y       
         bne   L165E     
         pshs  y         
         lbsr  L1BC9     
         tfr   y,d       
         subd  ,s++      
         bra   L1660     

L165E    clra            
         clrb            
L1660    ldy   <u005C    
         lbsr  L19B1     
         ldx   <u005C    
         bsr   L1677     
         bne   L166E     
         leay  ,x        
L166E    clra            
         rts             

L1670    ldb   #$20       Memory full error
         lbsr  L1287      Print error message
         coma             Return with carry set
         rts             

L1677    lda   ,x        
         cmpa  #$3A      
         bne   L167F     
         lda   3,x       
L167F    cmpa  #$3D      
         rts             

L1682    ldx   #$0000    
         ldy   <u005E    
L1688    cmpy  <u005C    
         bhs   L1697     
         leax  1,x       
         lbsr  L1BC9     
         cmpy  <u0060    
         blo   L1688     
L1697    sty   <u005C    
         stx   <u00B5    
         clra            
         rts             

L169E    bsr   L16CE     
         bsr   L16BD     
         cmpx  <u005E    
         bhi   L16AD     
         pshs  y,x       
         lbsr  L124B     
         puls  y,x       
L16AD    ldd   <u0060    
         pshs  d         
         sty   <u0060    
         lbsr  L10EE     
         puls  d         
         std   <u0060    
         clra            
         rts             

L16BD    pshs  x,b        Preserve regs
         ldx   <u0082     Get ptr to current pos in temp buffer
         ldb   ,x         Get char
         cmpb  #C$CR      Carriage return?
         bne   L16C9      No, skip ahead
         puls  pc,x,b     Yes, restore regs & return

L16C9    leas  5,s        Eat stack
         lbra  L08CC      Print 'What?' & return from there

L16CE    lda   ,y+        Get char
         cmpa  #C$SPAC    Space?
         beq   L16CE      Yes, keep looking
         cmpa  #'*        '*'?
         bne   L16E1      No, skip ahead
         sty   <u0082     Found star, save ptr as current pos in temp bffr
         ldx   <u005E     Get absolute exec address of basic module
         ldy   <u0060     Get absolute address of $F offest in basic module
         rts             

L16E1    leax  -1,y      
         bsr   L16F2     
         bcs   L16F1     
         ldx   <u005C    
         cmpy  <u005C    
         bhs   L16F1     
         exg   x,y       
         clra            
L16F1    rts             

L16F2    clr   ,-s        Clear flag?
         ldd   ,x         Get 2 chars
         cmpa  #'+        1st char a plus?
         bne   L1707      No, skip ahead
         ldy   <u0060     Get address of $F offset for basic module
L16FD    cmpb  #'*        2nd char='*'?
         bne   L1712      No, skip ahead
         leax  2,x        Yes, bump ptr up 2 chars
         stx   <u0082     Save as new current pos in temp buffer
         puls  pc,a      

L1707    cmpa  #'-        1st char dash?
         bne   L1714      No, skip ahead
         inc   ,s         Yes, set flag
         ldy   <u005E     Get address of $F offset for basic module
         bra   L16FD      Go check for '*'

L1712    leax  1,x        Bump ptr up
L1714    lda   ,x         Get char from there
         cmpa  #'0        Is it numeric?
         blo   L171E      No, skip ahead
         cmpa  #'9        Totally numeric?
         bls   L1723      Yes, skip ahead
L171E    ldd   #$0001    
         bra   L1727     

L1723    bsr   L1748     
         bcs   L1742     
L1727    stx   <u0082     Save current ptr into temp buff
         ldy   <u005C    
         tst   ,s+        Check flag
         beq   L173D     
         ldy   <u005E    
         pshs  d         
         ldd   <u00B5    
         subd  ,s++      
         bhs   L173D     
         clra            
         clrb            
L173D    lbsr  L1BCF     
         clra            
         rts             

L1742    ldy   <u005C    
         com   ,s+        Eat stack & set carry
         rts             

L1748    ldy   <u0046     ??? Get some sort of variable ptr
         bsr   L013A      JSR <2A, function 0 (Some temp var thing)
         lda   ,y+        ??? Get var type?
         cmpa  #2         Real?
         beq   L1759      Yes, set carry & exit
         clra             Clear carry
         ldd   ,y         Get integer
         bne   L175A      <>0, return with carry clear
L1759    coma             Set carry & return
L175A    rts             

L013A    jsr   <u002A    
         fcb   $00       

L175B    clrb            
         bra   L1760     

L175E    ldb   #1        
L1760    leas  -$F,s     
         stb   ,s        
         lda   ,y        
         clr   1,s       
         cmpa  #'*       
         bne   L1770     
         sta   1,s       
         leay  1,y       
L1770    ldb   ,y+        Find first non-space char
         cmpb  #C$SPAC   
         beq   L1770     
         tfr   b,a        Move char to A
         sty   <u0082     Save as next free pos in temp buffer
         lbsr  L18AA     
         stu   2,s       
         lbmi  L1985     
         tst   ,s        
         beq   L1791     
         lbsr  L18AA     
         stu   4,s       
         lbmi  L1985     
L1791    cmpa  #C$CR     
         beq   L179D     
         lda   ,y+       
         cmpa  #C$CR     
         lbne  L1985     
L179D    ldu   <u0046    
         stu   $D,s      
* TFM (W=entry (Y-1)-<u0082)
L17A1    lda   ,-y       
         sta   ,-u       
         cmpy  <u0082     ??? Back to beginning of temp buffer yet?
         bhi   L17A1      No, keep copying
         stu   <u0046    
         stu   <u0044    
         ldd   2,s       
         leau  d,u       
         leau  1,u       
         stu   6,s       
         ldy   <u005C    
         sty   $B,s      
         clr   $A,s      
         lbra  L1878     

L17C1    lbsr  L0DBB     
         sty   <u005C    
         lbsr  L128B     
         ldy   <u0080     Get ptr to start of temp buffer
         leay  5,y       
         lsl   $A,s       Dupe most sig bit into 2nd most sig bit???
         asr   $A,s      
L17D3    tst   <u0035     Any signals received?
         bne   L183A      Yes, skip ahead
         ldd   <u0082    
         subd  $02,s     
         ldx   <u0046    
         lbsr  L18BE     
         bcs   L182F     
         lda   #$81      
         sta   $A,s      
         tst   ,s        
         beq   L182F     
         ldd   <u0082    
         addd  4,s       
         subd  2,s       
         subd  <u0080    
         cmpd  #230      
         bhi   L182F     
         ldx   <u0082    
         exg   x,y       
         ldd   2,s       
         lbsr  L0FE3     
         tfr   y,d       
         subd  2,s       
         tfr   d,y       
         ldu   6,s       
         pshs  x,d       
L180B    lda   ,u+        Get byte
         sta   ,y+        Copy it
         cmpa  #$FF       Hit EOS marker?
         bne   L180B      No, keep copying until we do
         leay  -1,y      
         ldd   ,s++      
         subd  ,s        
         puls  x         
         lbsr  L0FE3     
         sty   <u0082    
         ldd   4,s       
         leay  d,x       
         ldd   2,s       
         bne   L182B     
         leay  1,y       
L182B    tst   1,s       
         bne   L17D3     
L182F    tst   $A,s      
         bpl   L1872     
         ldy   8,s       
         ldd   ,s        
         bne   L1845     
L183A    ldx   $D,s      
         stx   <u0046    
         stx   <u0044    
         leas  $F,s      
         lbra  L15F3     

L1845    lbsr  L1270     
         sty   $B,s      
         tst   ,s        
         beq   L1872     
         leax  ,y        
         lbsr  L1BC9     
         lbsr  L19A5     
         sty   <u005C    
         ldy   <u0080    
         lbsr  L1606     
         sty   <u005C    
         ldy   8,s       
         lbsr  L1BC9     
         cmpy  <u005C    
         bne   L1882     
         tst   1,s       
         beq   L1882     
L1872    ldy   8,s       
         lbsr  L1BC9     
L1878    sty   8,s       
         cmpy  <u0060    
         lbcs  L17C1     
L1882    lbsr  L0DBB     
         tst   $A,s      
         bne   L1899     
         leax  <L07AA,pc  Point to "can't find"
         lbsr  L135A     
         ldy   <u0046    
         lbsr  L13E1     
         lbsr  L1264     
L1899    ldy   $B,s      
         sty   <u005C    
         ldx   $D,s      
         stx   <u0046    
         stx   <u0044    
         leas  $F,s       Eat temp stack
         lbra  L1682     

L07AA    fcs   /can't find:/

L18AA    ldu   #-1        Pre-init counter to -1
L18AD    cmpa  #C$CR      Char a CR?
         beq   L18B9      Yes, set -1,y to a $FF, set carry & return
         leau  1,u        Bump counter up
         lda   ,y+        Get next char
         cmpb  -1,y       Match char in B?
         bne   L18AD      No, continue double checking
L18B9    clr   -1,y       Set -1,y to $FF
         com   -1,y       & set carry & return
         rts             

* CMPR Y,D for this with 18D2
L18BE    pshs  d         
         bra   L18D2     

L18C2    pshs  y,x       
L18C4    lda   ,x+       
         cmpa  #$FF      
         beq   L18DA     
         cmpa  ,y+       
         beq   L18C4     
         puls  y,x       
         leay  1,y       
L18D2    cmpy  ,s        
         bls   L18C2     
         coma            
         puls  pc,d      

L18DA    puls  y,x       
         clra            
         puls  pc,d      

L18DF    ldd   #100      
         ldx   #10       
         pshs  x,d       
         leax  ,y        
         ldy   <u00B5    
         lda   ,x        
         cmpa  #'*       
         bne   L18FA     
* 6309 MOD - use TFR 0,Y - same speed, 2 bytes shorter
         ldy   #$0000    
L18F6    leax  1,x       
         lda   ,x        
L18FA    cmpa  #C$SPAC   
         beq   L18F6     
         pshs  y         
         cmpa  #C$CR     
         beq   L191C     
         lbsr  L1748     
         bcs   L1981     
         std   2,s       
         lda   ,x+       
         cmpa  #C$CR     
         beq   L191C     
         lbsr  L1748     
         bcs   L1981     
         std   4,s       
         bmi   L1981     
         lda   ,x        
L191C    cmpa  #C$CR     
         bne   L1981     
         bsr   L1995     
         ldd   ,s++      
         ldy   <u005E    
         lbsr  L1BCF     
         sty   <u005C    
         ldd   ,s        
         lbsr  L1A0D     
         clr   ,-s       
         cmpy  <u005C    
         bcs   L198A     
         bsr   L1960     
         cmpx  #$0000    
         ble   L198A     
         tst   <u0035    
         bne   L194C     
         inc   ,s        
         bsr   L1960     
L194C    leas  5,s       
         ldx   2,s       
         lbsr  L1A2E     
         ldy   <u005E    
         ldd   <u00B5    
         lbsr  L1BCF     
         sty   <u005C    
         clra            
         rts             

L1960    ldy   <u005C    
         ldx   3,s       
L1965    clra            
         clrb            
         lbsr  L1A10     
         cmpy  <u0060    
         bhs   L1980     
         tst   2,s       
         beq   L1975     
         stx   1,y       
L1975    lbsr  L1BC9     
         tfr   x,d       
         addd  5,s       
         tfr   d,x       
         bpl   L1965     
L1980    rts             

L1981    leas  6,s       
         bra   L1987     

L1985    leas  $F,s      
L1987    lbra  L08CC     

L198A    leax  <L078B,pc  Point to 'RANGE'
         lbsr  L125F      Print it out to std error (From temp buffer)
         bra   L194C     

L078B    fcc   'RANGE'   
         fcb   $87        Hit bit set- Bell

L1993    leas  4,s       
L1995    lbsr  L0128      JSR <21, function 2 (dick around with module stuff?)
         clra            
         rts             

L199A    lbsr  L16CE     
         lbsr  L16BD     
         bsr   L19A5     
         lbra  L15F3     

L19A5    ldd   <u004A    
         std   <u00AB    
         tfr   y,d       
         pshs  x         
         subd  ,s++      
         leay  ,x        
L19B1    pshs  u,y,x,d   
         leax  d,y       
         pshs  x         
         ldy   <u00AB    
         ldd   <u004A    
         subd  ,s        
         beq   L19C3     
         lbsr  L0FE3     
L19C3    ldd   <u00AB    
         ldu   ,s        
         subd  ,s++      
         bls   L19D1     
         ldy   4,s       
         bsr   L0125     
L19D1    ldd   <u00AB    
         subd  <u004A    
         ldy   4,s       
         leay  d,y       
         sty   4,s       
         subd  ,s++      
         pshs  d         
         addd  <u0060    
         std   <u0060    
         std   <u004A    
         ldd   <u000C     Get # bytes free in workspace for user
         subd  ,s         Subtract ?
         std   <u000C     Save new # bytes free for user
         puls  pc,u,y,x,d Restore regs & return

L0125    jsr   <u001E    
         fcb   $06       

L19EF    pshs  y,x,d     
         leay  d,y       
         leau  d,u       
         andb  #$03      
L19F7    beq   L1A06     
         lda   ,-y       
         sta   ,-u       
         decb            
         bra   L19F7     

L1A00    ldx   ,--y      
         ldd   ,--y      
         pshu  x,d       
L1A06    cmpy  4,s       
         bne   L1A00     
         puls  pc,y,x,d  

L1A0D    ldy   <u005E    
L1A10    pshs  d         
         bra   L1A17     

L1A14    lbsr  L1BC9     
L1A17    cmpy  <u0060    
         bhs   L1A2B     
         lda   ,y        
         cmpa  #':       
         bne   L1A14     
         ldd   ,s        
         cmpd  1,y       
         bhi   L1A14     
         puls  pc,d      

L1A2B    coma            
         puls  pc,d      

* Part of RENAME (?)
L1A2E    pshs  u,y,x,d    Preserve regs
         lbsr  L0FB6      ??? Go move module in workspace?
         ldx   ,x         Get some sort of module ptr
         stx   <u002F     Save as ptr to current procedure
         ldd   M$Exec,x   Get exec offset
         addd  <u002F     Calculate exec address in memory
         std   <u005E     Save it
         ldd   $F,x       Get ???
         addd  <u002F     Add to current mod start
         tfr   d,y        Move to Y
         std   <u0060     Save ???
         std   <u004A    
         ldd   M$Size,x   Get size of module
         subd  $F,x       Subtract ???
         pshs  d          Save on stack
* 6809/6309 NOTE: LDD <U0000 IS UNECESSARY ON LEVEL II OS9
         ldd   <u0000     Get start of BASIC09 data mem ptr
         addd  <u0002     Add size of data area
         subd  ,s         Subtract calculated size
         tfr   d,u        Copy ??? size to U
         std   <u0066    
         puls  d          Get ??? calculated size
         bsr   L19EF     
         ldd   $D,x      
         subd  $F,x      
         subd  #3        
         std   <u0068    
         addd  <u0066    
         addd  #3        
         std   <u0062    
         ldd   M$Size,x   Get module size
         subd  $D,x       Subtract ???
         addd  #3         ??? Add CRC bytes?
         std   <u0064    
         ldy   <u005E    
         bsr   L1AC6     
         ldx   <u0062    
         ldd   -3,x      
         beq   L1A9E     
L1A83    pshs  d         
         leau  ,x        
         leax  3,x       
L1A89    ldb   ,x+       
         bpl   L1A89     
         lda   #2        
         cmpb  #$A4      
         bne   L1A95     
         lda   #4        
L1A95    sta   ,u        
         puls  d         
         subd  #1        
         bgt   L1A83     
L1A9E    ldx   <u0066    
         ldd   <u0068    
         leax  d,x       
         stx   <u00DA    
         stx   <u0066    
         addd  <u000C     Add to bytes free in workspace for user
         std   <u000C     Save new # bytes free in workspace for user
         clr   <u0068    
         clr   <u0069    
         puls  pc,u,y,x,d

* NOTE: CHECK IF ROUTINE CAN BE MOVED TO NEARER TABLE/SUBROUTINE
* L1AB2 & L1AB8 are only called within routine itself
* L1AC6 is called from way early in the code, and just before L1A83
L1AB2    ldb   ,y+       
         bpl   L1AB8     
         subb  #$2A      
L1AB8    clra            
         leax  >L1BD5,pc  Point to some sort of table
         ldb   d,x        Get entry
         lsrb             Divide by 16
         lsrb            
         lsrb            
         lsrb            
         lbsr  L1B75     
L1AC6    cmpy  <u0060    
         blo   L1AB2     
         rts             

* 8 bit offset jump table (base of JMP is L1ACC)
L1ACC    fcb   L1AE5-L1ACC
         fcb   L1AE3-L1ACC
         fcb   L1AE1-L1ACC
         fcb   L1B0F-L1ACC
         fcb   L1B00-L1ACC
         fcb   L1B12-L1ACC
         fcb   L1AFA-L1ACC
         fcb   L1B19-L1ACC
         fcb   L1B09-L1ACC
         fcb   L1AED-L1ACC
         fcb   L1B1F-L1ACC
         fcb   L1AEA-L1ACC
         fcb   L1AE8-L1ACC
         fcb   L1AE6-L1ACC
         fcb   L1ADB-L1ACC

* Routines called by above table follow here         
L1ADB    lda   -1,y      
         adda  #$93      
         sta   -1,y      
L1AE1    leay  1,y       
L1AE3    leay  1,y       
L1AE5    rts             

L1AE6    dec   -1,y      
L1AE8    dec   -1,y      
L1AEA    dec   -1,y      
         rts             

L1AED    ldd   ,y        
         addd  <u005E    
         tfr   d,x       
         ldd   -2,x      
         std   ,y++      
         dec   -3,y      
         rts             

L1AFA    lda   ,y+       
         cmpa  #$85      
         bne   L1B03     
L1B00    leay  9,y       
         rts             

L1B03    clrb            
         bsr   L1B23     
         leay  7,y       
         rts             

L1B09    lda   ,y+       
         cmpa  #$4F      
         bne   L1B11     
         leay  4,y       
L1B11    rts             

L1B0F    leay  5,y       
         rts             

L1B12    lda   ,y+       
         cmpa  #$FF      
         bne   L1B12     
         rts             

L1B19    ldb   ,y        
         clra            
         leay  d,y       
         rts             

L1B1F    ldb   -1,y      
L1B21    andb  #$04      
L1B23    lda   #$60      
         pshs  d         
         lda   #$85      
         sta   -1,y      
         ldx   <u0062    
         ldd   -3,x      
         ldu   ,y        
         bra   L1B40     

L1B33    puls  d         
L1B35    subd  #$0001    
         beq   L1B65     
         leax  3,x       
L1B3C    tst   ,x+       
         bpl   L1B3C     
L1B40    cmpu  1,x       
         bne   L1B35     
         pshs  d         
         lda   ,x        
         anda  #$E0      
         cmpa  2,s       
         bne   L1B33     
         lda   ,x        
         anda  #$18      
         bne   L1B33     
         lda   ,x        
         anda  #$04      
         eora  3,s       
         bne   L1B33     
         tfr   x,d       
         subd  <u0062    
         std   ,y++      
         leas  2,s       
L1B65    leas  2,s       
         rts             

L1B68    tstb             High bit set?
         bpl   L1B6D      No, skip ahead
         subb  #$2A       Adjust it down if it was
L1B6D    leax  <L1BD5,pc  Point to table
         abx              Point X to offset
         ldb   ,x         Get single byte
         andb  #$0F       Mask off high nibble
L1B75    leax  >L1ACC,pc  Point to vector offset table
         ldb   b,x        Point to routine that is close
         jmp   b,x        Go do it

L1B7D    pshs  u          Preserve U
         ldb   ,y+        Get byte
L1B81    cmpb  ,u+        If higher than byte in table, keep going
         bhi   L1B81     
         puls  u          Get U back
         beq   L1B91      If byte matches table entry, return
         bsr   L1B68      If not, go somewhere else

L1B8B    cmpy  <u0060    
         blo   L1B7D     
         coma            
L1B91    puls  pc,u,x,d   Restore regs & return

* 1 byte/entry table
L1B93    fcb   $1f       
         fcb   $21       
         fcb   $3a       
         fcb   $ff        End of table marker

L1B97    pshs  u,x,d     
         leau  <L1B93,pc  Point to table
         bra   L1B8B     

* 1 byte/entry table
L1B9F    fcb   $3E       
L1BA0    fcb   $3f       
L1BA1    fcb   $FF        End of table marker

L1BA2    pshs  u,x,d     
         leau  <L1B9F,pc  Point to table
         bra   L1B8B     

L1BA9    pshs  u,x,d     
         leau  <L1BA0,pc  Point to 2nd entry in table
         bra   L1B8B     

* Table: 1 byte entries
L1BB0    fcb   $23,$85,$86,$87,$88,$89,$8A,$8B,$8C
         fcb   $f2,$f3,$f4,$f5,$f6,$f7,$f8,$f9,$ff

L1BC2    pshs  u,x,d     
         leau  <L1BB0,pc  Point to table
         bra   L1B8B     

         IFNE  H6309
L1BC9    clrd            
         ELSE            
L1BC9    clra            
         clrb            
         ENDC            

L1BCB    bsr   L1BA9     
         bcs   L1BD4     
L1BCF    subd  #$0001    
         bhs   L1BCB     
L1BD4    rts             

* Table - single byte entries - one routine uses it to reference another
* table (1ACC), but divides it by 16 to determine which of that table to use
* Table goes from 1BD5 to 1CA4
L1BD5    fcb   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         fcb   $00,$22,$00,$00,$64,$00,$22,$00,$00,$00,$22,$00,$22,$00,$00,$22
         fcb   $92,$22,$92,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         fcb   $00,$00,$00,$00,$00,$00,$00,$77,$77,$00,$22,$92,$77,$77,$00,$00
         fcb   $00,$00,$00,$00,$80,$00,$22,$22,$00,$00,$11,$00,$00,$00,$00,$00
         fcb   $00,$00,$00,$00,$00,$22,$a2,$a2,$a2,$a2,$a2,$22,$22,$22,$22,$22
         fcb   $22,$22,$22,$11,$22,$33,$55,$22,$00,$00,$00,$00,$00,$00,$00,$b0
         fcb   $00,$00,$00,$00,$b0,$00,$00,$00,$00,$00,$00,$00,$00,$b0,$00,$00
         fcb   $00,$b0,$00,$b0,$00,$b0,$00,$b0,$00,$b0,$00,$00,$00,$00,$00,$00
         fcb   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$b0,$00,$00,$00,$00
         fcb   $00,$00,$00,$00,$00,$b0,$00,$00,$00,$00,$b0,$c0,$00,$b0,$c0,$00
         fcb   $b0,$c0,$d0,$00,$b0,$c0,$d0,$00,$b0,$c0,$00,$b0,$c0,$00,$b0,$c0
         fcb   $00,$b0,$00,$b0,$00,$b0,$00,$00,$e2,$e2,$e2,$e2,$e2,$e2,$e2,$e2

L1CA5    pshs  x,d        Preserve regs
         ldb   [<4,s]     Get function code
L1CAA    leax  <L1CB5,pc  Point to table
         ldd   b,x        Make offset vector
         leax  d,x       
         stx   4,s        Modify RTS address
         puls  pc,x,d     restore X & D and RTS to new address

* 2 byte/entry vector table (JMP >$1E calls have there function byte after
*  the JMP containing the offset to which of these entries to uses)
L1CB5    fdb   L1F9E-L1CB5 $00 function
         fdb   L2430-L1CB5 $02 function
         fdb   L252A-L1CB5 $04 function
         fdb   L2508-L1CB5 $06 function
         fdb   L24BD-L1CB5 $08 function
         fdb   L1E29-L1CB5 $0A function

* Data of some sort: Appears to be special symbols
L1CD0    fdb   33         (# of entries-33)
         fcb   $03        (# bytes to skip to start of next?)

L1CD3    fcb   L2368-L239D
         fcb   $d9,$0a    (token & type of operator???)
         fcs   '<>'      

         fcb   L2368-L239D
         fcb   $d9,$0a   
         fcs   '><'      

         fcb   L2368-L239D
         fcb   $e4,$0a   
         fcs   '<='      

         fcb   L2368-L239D
         fcb   $e4,$0a   
         fcs   '=<'      

         fcb   L2368-L239D
         fcb   $e1,$0a   
         fcs   '>='      

         fcb   L2368-L239D
         fcb   $e1,$0a   
         fcs   '=>'      

         fcb   L2368-L239D
         fcb   $52,$08   
         fcs   ':='      

         fcb   L2368-L239D
         fcb   $f1,$05   
         fcs   '**'      

         fcb   L2368-L239D
         fcb   $38,$01   
         fcs   '(*'      

         fcb   L2368-L239D
         fcb   $3e,$02   
         fcs   '\'       

         fcb   L2368-L239D
         fcb   $d3,$0a   
         fcs   '>'       

         fcb   L2368-L239D
         fcb   $d6,$0a   
         fcs   '<'       

         fcb   L2368-L239D
         fcb   $dd,$09   
         fcs   '='       

         fcb   L2368-L239D
         fcb   $e7,$05   
         fcs   '+'       

         fcb   L2368-L239D
         fcb   $ea,$05   
         fcs   '-'       

         fcb   L2368-L239D
         fcb   $ec,$05   
         fcs   '*'       

         fcb   L2368-L239D
         fcb   $ee,$05   
         fcs   '/'       

         fcb   L2368-L239D
         fcb   $f0,$05   
         fcs   '^'       

         fcb   L2368-L239D
         fcb   $4c,$0c   
         fcs   ':'       

         fcb   L2368-L239D
         fcb   $4f,$0c   
         fcs   '['       

         fcb   L2368-L239D
         fcb   $50,$0c   
         fcs   ']'       

         fcb   L2368-L239D
         fcb   $51,$0c   
         fcs   ';'       

         fcb   L2368-L239D
         fcb   $54,$0b   
         fcs   '#'       

         fcb   L2368-L239D
         fcb   $26,$01   
         fcs   '?'       

         fcb   L2368-L239D
         fcb   $37,$01   
         fcs   '!'       

         fcb   L233E-L239D Recurse to the search routine again (eat LF)
         fcb   $00,$0c   
         fcb   $80+C$LF   Line feed

         fcb   L2368-L239D
         fcb   $4b,$0c   
         fcs   ','       

         fcb   L2368-L239D
         fcb   $4d,$0c   
         fcs   '('       

         fcb   L2368-L239D
         fcb   $4e,$0c   
         fcs   ')'       

         fcb   L2371-L239D
         fcb   $89,$0c   
         fcs   '.'       

         fcb   L23BE-L239D
         fcb   $90,$06   
         fcs   '"'       

         fcb   L239D-L239D
         fcb   $91,$06   
         fcs   '$'       

         fcb   L2368-L239D
         fcb   $3f,$02   
         fcb   $80+C$CR   Carriage return

* Jump table for type 1 commands (see L0140)
*                           Command  Token
L1D60    fdb   L211B-L1D60 ???      0   Illegal statement construction error
         fdb   L1E82-L1D60 PARAM    1
         fdb   L1E72-L1D60 TYPE     2
         fdb   L1E82-L1D60 DIM      3
         fdb   L1ED3-L1D60 DATA     4
         fdb   L2029-L1D60 STOP     5
         fdb   L210B-L1D60 BYE      6
         fdb   L210B-L1D60 TRON     7 
         fdb   L210B-L1D60 TROFF    8
         fdb   L2029-L1D60 PAUSE    9
         fdb   L210B-L1D60 DEG      A
         fdb   L210B-L1D60 RAD      B
         fdb   L210B-L1D60 RETURN   C
         fdb   L2123-L1D60 LET      D
         fdb   L211B-L1D60 ???      E   Illegal Statement Construction err
         fdb   L1EE1-L1D60 POKE     F
         fdb   L1EEA-L1D60 IF       10
         fdb   L1EFF-L1D60 ELSE     11
         fdb   L210B-L1D60 ENDIF    12
         fdb   L1F03-L1D60 FOR      13
         fdb   L1F24-L1D60 NEXT     14
         fdb   L1F2E-L1D60 WHILE    15
         fdb   L1F3D-L1D60 ENDWHILE 16
         fdb   L210B-L1D60 REPEAT   17
         fdb   L1F39-L1D60 UNTIL    18
         fdb   L210B-L1D60 LOOP     19
         fdb   L1F3D-L1D60 ENDLOOP  1A
         fdb   L1F41-L1D60 EXITIF   1B
         fdb   L1F3D-L1D60 ENDEXIT  1C
         fdb   L1F4C-L1D60 ON       1D
         fdb   L213C-L1D60 ERROR    1E
         fdb   L1F87-L1D60 GOTO     1F
         fdb   L211B-L1D60 ???      20  Illegal Statement Construction err
         fdb   L1F87-L1D60 GOSUB    21
         fdb   L211B-L1D60 ???      22  Illegal Statement Construction err
         fdb   L1FB4-L1D60 RUN      23
         fdb   L213C-L1D60 KILL     24
         fdb   L1FF6-L1D60 INPUT    25
         fdb   L2029-L1D60 PRINT    26 (Also '?')
         fdb   L213C-L1D60 CHD      27
         fdb   L213C-L1D60 CHX      28
         fdb   L2093-L1D60 CREATE   29
         fdb   L2093-L1D60 OPEN     2A
         fdb   L2083-L1D60 SEEK     2B
         fdb   L205A-L1D60 READ     2C
         fdb   L2067-L1D60 WRITE    2D
         fdb   L2071-L1D60 GET      2E
         fdb   L2071-L1D60 PUT      2F
         fdb   L20D2-L1D60 CLOSE    30
         fdb   L20DC-L1D60 RESTORE  31
         fdb   L213C-L1D60 DELETE   32
         fdb   L213C-L1D60 CHAIN    33
         fdb   L213C-L1D60 SHELL    34
         fdb   L20E0-L1D60 BASE     35
         fdb   L20E0-L1D60 ???      36
         fdb   L20F8-L1D60 REM      37 (Also '!')
         fdb   L20F8-L1D60 (*       38
         fdb   L2029-L1D60 END      39

L1DD4    lda   <u000A+1   Get LSB of # bytes used by all programs (not data)
L1DD6    pshs  a          Save it
         ldx   <u00A7    
         lda   #C$CR      Byte to look for
L1DDC    lsl   ,x         Clear out high bit? (if so, use AIM instead)
         lsr   ,x        
         cmpa  ,x+        Find byte we want?
         bne   L1DDC      No, keep looking
         ldx   <u00A7     Get ptr to end of string name+1
         bsr   L1E1F      Print string out
         ldd   <u00B9    
         subd  <u00A7    
         pshs  b         
         ldx   <u00AF    
         stx   <u00AB    
         ldy   <u00A7    
         lda   #$3D      
         lbsr  L2415     
         lbsr  L20F8     
         lbsr  L2415     
         lda   #C$SPAC    Block copy Spaces (TFM)
         ldx   <u0080     Get start address
L1E04    sta   ,x+        Fill with spaces
         dec   ,s        
         bpl   L1E04     
         ldd   #$5E0D     Add ^ (CR) (part of debug?)
         std   -$01,x    
         ldx   <u0080     Get start ptr again
         bsr   L1E1F      Go print the debug line
         puls  d         
         bsr   L1CC1     
         ldx   <u0046    
         stx   <u0044    
L1CC7    jsr   <u001B     ??? Reset temp buff to defaults, SP restore from B7
         fcb   $06       

L1CC1    jsr   <u001B     Print error code to screen
         fcb   $02       

L1E1F    ldy   #$0100     Size=256 bytes
         lda   <u002E     Get path
         os9   I$WritLn   Write it & return
         rts             

L1CC4    jsr   <u001B     ??? Save SP @ <u00B7, muck around
         fcb   $04       

L1E29    puls  x         
         bsr   L1CC4     
         lbsr  L1F90     
         lbsr  L214C     
         sty   <u00A7    
         ldx   <u00AB    
         stx   <u00AF    
L1E3B    bsr   L1E4C      Go process command/variable/constant
         lda   <u00A3     Get token
         lbsr  L2415      Add to I-code line bffr & make sure no overflow
         cmpa  #$3E       Was it a $3E?
         beq   L1E3B      Yes, go get next one
         cmpa  #$3F       Was it a $3F?
         bne   L1DD4      No, do something
         bra   L1CC7      Yes, Call <u001B, function 6

L1E4C    lbsr  L233E      Go find command (or variable/constant name)
         lda   <u00A4     Get command type
         cmpa  #$01       (Is it a normal command?)
         bne   L1E62      No, check next
* Command type 1 goes here
         ldb   <u00A3     Get entry # (token) into JMP offset table
         clra             Make 16 bit for signed jump
         IFNE  H6309
         lsld             Multiply by 2 (2 bytes/entry)
         ELSE            
         lslb            
         rola            
         ENDC            
         leax  >L1D60,pc  Point to Basic09 COMMANDS vector table
         ldd   d,x        Get offset
         jmp   d,x        Execute command's routine

L1E62    cmpa  #$02       Command type 2?
         lbne  L2126      No, go process functions, etc.
* Command type 2 goes here
L1E68    pshs  x         
         ldx   <u00AB    
         leax  -$01,x    
         stx   <u00AB    
         puls  pc,x      

L1E72    lbsr  L2167     
         cmpa  #$DD      
         lbne  L211F     
         bsr   L1E68     
         lda   #$53      
         lbsr  L2415     

L1E82    lbsr  L2167     
         cmpa  #$4D      
         bne   L1E9B     
         lbsr  L216E     
         bne   L1E96     
         lbsr  L216E     
         bne   L1E96     
         lbsr  L216E     
L1E96    lbsr  L22BF     
         bsr   L1EC9     
L1E9B    lbsr  L21A1     
         beq   L1E82     
         cmpa  #$4C      
         bne   L1EC3     
         bsr   L1EC9     
         ldb   <u00A4     Get token
         beq   L1EC1      If 0, skip ahead
         cmpb  #$03      
         bne   L1ECC     
         cmpa  #$44      
         bne   L1EC1     
         bsr   L1EC9     
         cmpa  #$4F      
         bne   L1EC3     
         lbsr  L216E     
         cmpa  #$50      
         bne   L1ECC     
L1EC1    bsr   L1EC9     
L1EC3    cmpa  #$51      
         beq   L1E82     
         bra   L1E68     

L1EC9    lbra  L233E     

L1ECC    lda   #$18      
         bra   L1F36     

L1ED0    lbsr  L2415     
L1ED3    bsr   L1F1D     
         lbsr  L21A1     
         beq   L1ED0     
L1EDA    lda   #$55      
L1EDC    lbsr  L2415     
         bra   L1F2B     

L1EE1    lbsr  L213C     
         lbsr  L21A6     
         lbra  L2139     

L1EEA    bsr   L1F39     
         cmpa  #$45      
         bne   L1EFB     
         lbsr  L2415     
         lbsr  L214C     
         bcc   L1F3F     
         lbra  L1E4C     

L1EFB    lda   #$26      
         bra   L1F36     

L1EFF    bsr   L1F2B     
         bra   L1F49     

L1F03    lbsr  L2193     
         lbsr  L212D     
         lda   <u00A3    
         cmpa  #$46      
         bne   L1F20     
         bsr   L1F1B     
         lda   <u00A3    
         cmpa  #$47      
         bne   L1EDA     
         bsr   L1F1B     
         bra   L1EDA     

L1F1B    bsr   L1EDC     
L1F1D    lbra  L213C     

L1F20    lda   #$27      
         bra   L1F36     

L1F24    lbsr  L2193     
         bsr   L1F2B     
         bsr   L1F2B     
L1F2B    lbra  L2176     

L1F2E    bsr   L1F39     
         cmpa  #$48      
         beq   L1F47     
         lda   #$1F      
L1F36    lbra  L1DD6     

L1F39    bsr   L1F1D     
         bra   L1EDA     

L1F3D    bsr   L1F2B     
L1F3F    bra   L1F8D     

L1F41    bsr   L1F39     
         cmpa  #$45      
         bne   L1EFB     
L1F47    bsr   L1FB1     
L1F49    lbra  L1E4C     

L1F4C    ldd   <u00AB    
         pshs  y,d       
         lbsr  L233E     
         cmpa  #$1E      
         bne   L1F60     
         leas  $04,s     
         bsr   L1F8D     
         cmpa  #$1F      
         beq   L1F8A     
         rts             

L1F60    puls  y,d       
         std   <u00AB    
         bsr   L1F39     
         ldx   <u00AB    
         leax  -1,x      
         pshs  x         
         cmpa  #$1F      
         beq   L1F7C     
         cmpa  #$21      
         beq   L1F7C     
         lda   #$21      
         bra   L1F36     

L1F78    bsr   L1FB1     
         lda   #$3A      
L1F7C    inc   [,s]      
         bsr   L1F8A     
         lbsr  L21A1     
         beq   L1F78     
         puls  pc,x      

L1F87    lbsr  L210E     
L1F8A    lbsr  L2156     
L1F8D    lbra  L210B     

L1F90    sty   <u00A7     Save ptr to end of string name
         ldx   <u004A     ??? Get ptr to start of I-code
         stx   <u00AF     Save it
         stx   <u00AB     And again as current I-code line end ptr
         clr   <u00BB     Clear <u00BB & <u00BC
         clr   <u00BC    
L1FF5    rts             

* Entry: Y=Ptr to end of string name+1
L1F9E    bsr   L1F90      Set up some ptrs
         inc   <u00A0     ??? Set flag? (think it is 3-way flag)
         lbsr  L210B      ??? Go process source line? (A returns token)
         bsr   L1FC0      Go check for "(" command grouping start
         clr   <u00A0     ??? Clear flag?
         lda   <u00A3     Get 1st byte from command table (token)?
         cmpa  #$3F       Was it a carriage return token?
         lbne  L1DD4      No, go process token
L1FB1    lbra  L2415      Add token to I-code buffer, check for overflow

L1FB4    lbsr  L210E     
         pshs  x         
         lbsr  L2193     
         ldb   #$23      
         stb   [,s++]    
* Check for "(" token (start of group of operations)
L1FC0    cmpa  #$4D       Token $4D  - "(" group start token?
         bne   L1FF5      No, return
* Process "( )" command grouping
L1FC4    bsr   L1FB1      No, go call L2415 (X=Tble ptr, D=Token/type bytes?)
         ldd   <u00AB     Get ptr to current I-code line end
         pshs  y,d        Save with source ptr(?)
         lbsr  L233E      Process next command/line #/variable name
         ldd   #$0005     Token types 0 & 5
         cmpa  <u00A4     Just processed command token type 0?
         beq   L1FD8      Yes, skip ahead
         stb   <u00A4     No, replace with type 5 (AND,OR,XOR,NOT)
         bra   L1FDB      Skip ahead

L1FD8    lbsr  L2182      Go check for Illegal Statement Construction
L1FDB    puls  y,d        Get ptr to last char+1 & current I-code line end
         std   <u00AB     Save original I-code line end ptr
         ldb   <u00A4     Get token type
         cmpb  #$05       Type 5 (AND,OR,XOR,NOT)?
         beq   L1FE8      Yes, skip ahead
         lbsr  L225D      No, go force token $E & check for I-code overflow
L1FE8    lbsr  L2314     
         lbsr  L21A1     
         beq   L1FC4     
         pshs  a         
         lbra  L22F7     

L1FF6    sty   <u00A9    
         lbsr  L2186     
         bne   L2007     
         sty   <u00A9    
         bsr   L2022     
         bsr   L1FB1     
         bsr   L1F8D     
L2007    ldy   <u00A9    
         cmpa  #$90      
         bne   L201A     
         lbsr  L233E     
         lbsr  L1F8D     
L2014    bsr   L2022     
L2016    lda   #$4B      
         bsr   L2080     
L201A    bsr   L2073     
         lbsr  L219B     
         beq   L2016     
L2021    rts             

L2022    lbsr  L219B     
         beq   L2021     
         bra   L207D     

L2029    sty   <u00A9    
         lbsr  L2186     
         beq   L203A     
         cmpa  #$49      
         beq   L203E     
L2035    ldy   <u00A9    
         bra   L2045     

L203A    cmpa  #$49      
         bne   L2054     
L203E    lbsr  L2139     
         bra   L2054     

L2043    bsr   L2080     
L2045    lbsr  L245D     
         cmpa  #C$CR     
L204A    lbeq  L210B     
         cmpa  #'\       
         beq   L204A     
         bsr   L2085     
L2054    lbsr  L219B     
         beq   L2043     
         rts             

L205A    sty   <u00A9    
         lbsr  L2186     
         beq   L2014     
         ldy   <u00A9    
         bra   L201A     

L2067    sty   <u00A9    
         lbsr  L2186     
         beq   L2054     
         bra   L2035     
L2071    bsr   L2078     
L2073    inc   <u00BC    
         lbra  L2180     

L2078    lbsr  L2186     
         bne   L20D7     
L207D    lbsr  L21A6     
L2080    lbra  L2415     

L2083    bsr   L2078     
L2085    lbra  L213C     

* Data table for file access modes?
L2088    fcb   $2c,%00000001 Read mode?
         fcb   $2d,%00000010 Write mode?
         fcb   $f7,%00000011 Update mode?
         fcb   $f8,%00000100 Execution dir mode?
         fcb   $f9,%10000000 Directory mode?
         fcb   $00        End of table marker

L2093    lbsr  L233E     
         cmpa  #$54      
         bne   L20D7     
         bsr   L2073     
         bsr   L207D     
         bsr   L2085     
         lda   <u00A3     Get token
         cmpa  #$4C      
         bne   L2114     
         lda   #$4A      
         bsr   L2080     
         clr   ,-s       
L20AC    bsr   L210B     
         leax  <L2088,pc  Point to table (modes?)
L20B1    cmpa  ,x++      
         bhi   L20B1      We need higher entry #, keep looking
         bne   L20C7      Illegal, return error
         ldb   -1,x       Get mode (read/write/update)???
         orb   ,s         Merge with mode on stack???
         stb   ,s         Save new mode???
         bsr   L210B     
         cmpa  #$E7      
         beq   L20AC     
         lda   ,s+       
         bne   L2080     
L20C7    lda   #$0F       Illegal mode error?
         bra   L20D9     

L20CB    lbsr  L21A1     
         bne   L2114     
         bsr   L2080     
L20D2    lbsr  L2186     
         beq   L20CB     
L20D7    lda   #$1C       Missing Path Number error
L20D9    lbra  L1DD6     

L20DC    bsr   L214C     
         bra   L210B     

L20E0    lbsr  L245D     
         leay  1,y       
         suba  #$30       Convert ASCII digit to binary
         beq   L210B      If 0, skip ahead
         cmpa  #1        
         lbne  L21C9      If anything but 0 or 1, Illegal operand error
         bsr   L210E      If 1, skip ahead
         lda   #$36      
         lbsr  L2415     
         bra   L210B     

L20F8    ldx   <u00AB     Get ptr to current I-Code end
         lbsr  L245D     
         clra            
L20FE    lbsr  L2415     
         inc   ,x        
         lda   ,y+        Get char
         cmpa  #C$CR      CR?
         bne   L20FE      Nope, keep going
         leay  -1,y       Bump ptr back to CR

L210B    lbsr  L233E      Check for command/constant/variable names
L210E    ldx   <u00AD     Get ptr to end of I-code line
         stx   <u00AB     Make it the current end ptr
         lda   <u00A3     Get token & return
L2114    rts             

L2115    lda   <u00A4     Get token type
         beq   L2114      If 0, return
L211B    lda   #12        Exit with Illegal Statement Construction error
         bra   L20D9     

L211F    lda   #$1B       Missing Assignment Statement error
L2121    bra   L20D9     

L2123    lbsr  L233E     

* Token types >2 go here
L2126    bsr   L2115     
         inc   <u00BC    
         lbsr  L21FC     
L212D    lda   <u00A3     Get token
         cmpa  #$52       ??? Is it ':='?
         beq   L2139      Yes, skip ahead
         cmpa  #$DD       ??? Is it '='?
         bne   L211F      No, exit with Missing Assignment statement error
         lda   #$53       Token=$53
L2139    lbsr  L2415      Go append to I-Code buffer
L213C    lda   #$39      
L213E    ldx   <u0044    
         clrb            
         lbsr  L22BA     
L2144    bsr   L21B4     
         lbsr  L2262     
         bcc   L2144     
L214B    rts             

L214C    lbsr  L245D     
         lbsr  L246E     
         bcs   L214B     
         lda   #$3A       Go append $3A token to I-Code buffer
L2156    bsr   L217D     
         lbsr  L23A6     
         beq   L2163     
         ldd   ,x        
         lbgt  L240C     
L2163    lda   #$10       Illegal Number error
         bra   L2121     

L2167    bsr   L216B     
         bsr   L2115     
L216B    lbra  L233E     

L216E    lda   #$8E      
         bsr   L2156     
         bsr   L216B     
         bra   L21A1     

L2176    clra            
         bsr   L217D     
         bsr   L217D     
         bra   L218E     

L217D    lbra  L2415     

L2180    bsr   L216B     
L2182    bsr   L2115     
         bra   L21FC     

L2186    bsr   L210B     
         cmpa  #$54      
         bne   L2192     
         bsr   L2139     
* 6809/6309 MOD: If A not required, CLRA
L218E    lda   <u00A3    
         orcc  #Zero     
L2192    rts             

L2193    bsr   L216B     
         lbsr  L2115     
L2198    lbra  L210B     

L219B    lda   <u00A3    
         cmpa  #$51      
         beq   L21A5     
L21A1    lda   <u00A3    
         cmpa  #$4B      
L21A5    rts             

L21A6    bsr   L21A1     
         beq   L21A5     
         lda   #$1D      
         bra   L21CB     

L21AE    clrb            
         bsr   L21F5     
         lbsr  L210E     
L21B4    bsr   L21EA     
         bsr   L21CE     
         cmpa  #$4D      
         beq   L21AE     
         ldb   <u00A4    
         cmpb  #$06      
         beq   L2198     
         cmpb  #$04      
         bne   L2182     
         lbra  L22CA     

L21C9    lda   #$12       Illegal operand error
L21CB    lbra  L1DD6     

L21CE    cmpa  #$CD      
         beq   L21E3     
         cmpa  #$EA      
         bne   L21A5     
         lda   ,y        
         lbsr  L246E     
         bcc   L21ED     
         cmpa  #$2E      
         beq   L21ED     
         lda   #$CE      
L21E3    ldb   #$07      
         bsr   L21F5     
         lbsr  L210E     
L21EA    lbra  L233E     

L21ED    leay  -1,y      
         lbsr  L1E68     
         lbra  L237A     

L21F5    ldx   <u0044    
         std   ,--x      
         stx   <u0044    
         rts             

L21FC    ldd   #$8500    
L21FF    pshs  d         
         ldd   <u00A1    
         bsr   L21F5     
         puls  d         
         bsr   L21F5     
         lbsr  L210E     
         lbsr  L210B     
         clrb            
         cmpa  #$4D      
         beq   L2226     
L2214    cmpa  #$89      
         bne   L2247     
         bsr   L2257     
         bsr   L2247     
         bsr   L21EA     
         lbsr  L2115     
         ldd   #$8900    
         bra   L21FF     

L2226    bsr   L2257     
         incb            
         pshs  b         
         lbsr  L2314     
         lbsr  L21A1     
         bne   L223E     
         ldb   ,s+       
         cmpb  #$03      
         blo   L2226     
         lda   #$2A      
         lbra  L1DD6     

L223E    bsr   L22BF     
         lbsr  L210B     
         puls  b         
         bra   L2214     

L2247    clr   <u00BC    
         ldx   <u0044    
         addb  ,x++      
         lbsr  L2413     
         ldd   ,x++      
         stx   <u0044    
         lbra  L240C     

L2257    tst   <u00BC    
         beq   L228A     
         clr   <u00BC    
L225D    lda   #$0E      
L225F    lbra  L2415     

L2262    ldb   <u00A3     Get token
         clra            
         cmpb  #$4E      
         beq   L228B     
         tstb            
         bpl   L2273     
         bsr   L1CCD     
         bita  #$08      
         bne   L228B     
L2273    ldx   <u0044    
L2275    ldd   ,x++      
         cmpa  #$4D      
         beq   L22C5     
         bsr   L225F     
         tstb            
         bne   L2275     
         cmpa  #$39      
         bne   L2287     
         lbsr  L1E68     
L2287    stx   <u0044    
         coma            
L228A    rts             

L228B    anda  #$07      
         tfr   a,b       
         ldx   <u0044    
         bra   L2297     

L2293    lda   ,x++      
         bsr   L230F     
L2297    cmpb  1,x       
         blo   L2293     
         bhi   L22B8     
         cmpb  #6        
         beq   L22B8     
         tstb            
         bne   L2293     
         lda   ,x++      
         cmpa  #$4D      
         bne   L22B0     
         stx   <u0044    
         bsr   L22FE     
         bra   L2262     

L22B0    cmpa  #$39      
         beq   L2307     
         bsr   L230F     
         bra   L2287     

L22B8    lda   <u00A3     Get token
L22BA    std   ,--x      
         stx   <u0044    
L22BE    rts             

L22BF    lda   <u00A3     Get token
         cmpa  #$4E       ??? ^ or ** (power)?
         beq   L22BE      Yes, return
L22C5    lda   #$25      
L22C7    lbra  L1DD6     

L1CCD    jsr   <u001B    
         fcb   $12       

L22CA    lbsr  L1E68     
         lda   <u00A3     Get token
         pshs  a          Save it
         bsr   L22FE     
         ldb   ,s        
         bsr   L1CCD     
         leax  <L22F7,pc  Point to routine
         pshs  x         
         anda  #$03      
         beq   L230B     
         cmpa  #2        
         beq   L231B     
         bhi   L2322     
         ldb   2,s       
         cmpb  #$92      
         beq   L2331     
         cmpb  #$94      
         beq   L2331     
         cmpb  #$BE      
         beq   L2326     
         bra   L2312     

L22F7    bsr   L22BF     
         puls  a         
         lbsr  L2415     
L22FE    lbra  L210B     

L2301    lda   <u00A3    
         cmpa  #$4D      
         beq   L22BE     
L2307    lda   #$22      
         bra   L22C7     

L230B    leas  2,s       
         puls  a         
L230F    lbra  L2415     

L2312    bsr   L2301     
L2314    clra            
         lbsr  L213E     
         lbra  L1E68     

L231B    bsr   L2312     
L231D    lbsr  L21A6     
         bra   L2314     

L2322    bsr   L231B     
         bra   L231D     

L2326    bsr   L2301     
         bsr   L22FE     
         cmpa  #$54      
         beq   L2314     
         lbra  L20D7     

L2331    bsr   L2301     
         incb            
         lbsr  L2413     
         lbra  L2180     

L233A    lda   #$0A       Unrecognized symbol error
         bra   L22C7     

* Search for operator's loop? (An LF is eaten and it returns here)
L233E    ldd   <u00AB     Get current I-code line's end ptr
         std   <u00AD     Dupe it here
         lbsr  L245D      Find first non-space/LF char
         sty   <u00B9     Save ptr to it
         lbsr  L2432      Check for variable name
         lbne  L23E1      None, check for command names
         lda   ,y         Get first char of possible variable name
         lbsr  L246E      Does it start with a number (0-9)?
         bcc   L237A      Yes, skip ahead
         leax  >L1CD0+3,pc No, point to Operator's table
         lda   #$80       Get high bit mask to check for end of entry
         lbsr  L252A      Go find entry
         beq   L233A      None, exit with Unrecognized symbol error
         ldb   ,x         Get offset
         leau  <L239D,pc  Point to base routine
         jmp   b,u        Go to subroutine

* '.' goes here
L2371    lda   ,y         Get char from source
         lbsr  L246E     
         bcs   L2368     
         leay  -1,y      
* Starts with numeric (0-9) value
L237A    bsr   L23A6     
         bne   L238F     
         ldd   #$8F05     Token=$85, count=5
L2381    sta   <u00A3    
L2383    bsr   L23D6     
         lda   ,x+       
         decb            
         bpl   L2383     
         lda   #6        
         sta   <u00A4     Save type (?) as 6
         rts             

L238F    ldd   #$8E02    
         tst   ,x        
         bne   L2381     
         ldd   #$8D01    
         leax  1,x       
         bra   L2381     

* Almost all operators come here
L2368    ldd   1,x        Get the 2 mystery bytes
* Command found comes here with D=2 byte # in command table
L236A    std   <u00A3     Save token & type byte
         bra   L2415     

* '$' goes here
L239D    leay  -1,y       Bump source ptr back by 1
         bsr   L23A6     
         ldd   #$9102    
         bra   L2381     

L23A6    lbsr  L245D      Find 1st non-space/lf char
         leax  ,y         Point x to the char
         ldy   <u0044    
         bsr   L1CCA      Call vector <2A, function 00
         exg   x,y       
         bcs   L23BA      If error from vector, illegal literal error
         lda   ,x+       
         cmpa  #2        
         rts             

L1CCA    jsr   <u002A    
         fcb   $00       

L23BA    lda   #$16       Illegal literal error
         bra   L23DA     

* '"' goes here
L23BE    bsr   L2368     
         bra   L23C4     

L23C2    bsr   L2415     
L23C4    lda   ,y+        Get char from source
         cmpa  #C$CR      End of line already?
         beq   L23D8      Yes, no ending quote error
         cmpa  #'"        Is it the quote?
         bne   L23C2      No, keep looking
         cmpa  ,y+        Double quote?
         beq   L23C2      Yes, do something
         leay  -1,y       No, set src ptr back to next char
         lda   #$FF       Go save $FF at this point in I-code line
L23D6    bra   L2415     

L23D8    lda   #$29       No Ending Quote error
L23DA    lbra  L1DD6      Deal with error

L23DD    lda   #$31       Undefined Variable error
         bra   L23DA     

* Check for command names
L23E1    ldx   <u009E     Get ptr to commmands token list
         lbsr  L2528      Go find command
         beq   L23EF      No command found, skip ahead
         stx   <u00A1     Save ptr to command's 2 byte # in table
         ldd   ,x         Get 2 byte # from command's entry in table
L23EC    std   <u00A3     Save token & type bytes
         bra   L2415      Go check size of I-code line

L23EF    tst   <u00A0    
         bmi   L23DD     
         ldx   <u0062    
         lbsr  L2528     
         bne   L2401     
         tst   <u00A0    
         bne   L23DD     
         lbsr  L2494     
L2401    ldd   #$8500    
         bsr   L23EC      Go append token $85, type 0 & check for overflow
         tfr   x,d       
         subd  <u0062    
         std   <u00A1    
L240C    bsr   L2415     
         bsr   L2413     
         lda   <u00A3     Get token & return
         rts             

L2413    tfr   b,a       
L2415    pshs  x,d        Preserve Table ptr & 2 mystery bytes
         ldx   <u00AB     Get ptr to end of current I-code line
         sta   ,x+        Save token for operator
         stx   <u00AB     Save new end of current I-code line ptr
         ldd   <u00AB     Get it again
         subd  <u004A     Calculate current I-code line size
         cmpb  #255       Past maximum size?
         bhs   L2428      Yes, generate error
         clra             No, no error
         puls  pc,x,d     Restore regs & return

L2428    lda   #$0d       I-Code Overflow error
         lbsr  L1CC1      Print error message
         jsr   <u001B     ??? Reset temp buff to defaults, SP restore from B7
         fcb   $06       

L2430    bsr   L245D      Search for 1st non-space/LF char
L2432    pshs  y          Save ptr to it on stack
         ldb   #2         ??? Flag to indicate non-variable name
         stb   <u00A5    
         clrb             Set variable name size to 0
         bsr   L2478      Check if it is an alphabetic char or underscore
         bcs   L2459      Nope, skip ahead
         leay  1,y        Yes, point to next char
L243F    incb             Bump up variable name size
         lda   ,y+        Get next char
         bsr   L246A      Check if it is a letter, number or _
         bcc   L243F      Yes, check next one
         cmpa  #'$        Is it a string indicator?
         bne   L2451      No, skip ahead
         incb             Bump up variable name size to include '$'
         lda   #4         ??? Flag to indicate variable name?
         sta   <u00A5    
         bra   L2453      Skip ahead

L2451    leay  -1,y       Bump source ptr back by 1
L2453    lda   #$80       Get high bit (OIM on 6309)
         ora   -1,y       Set high bit on last char of variable name
         sta   -1,y       Save it back
L2459    stb   <u00A6     Save size of variable name
         puls  pc,y       Restore source ptr & return

* Find first non-space / non-LF char, and point Y to it
L245D    lda   ,y+        Get char from source
         cmpa  #C$SPAC    Is it a space?
         beq   L245D      Yes, get next char
         cmpa  #C$LF      Is it a line feed?
         beq   L245D      Yes, get next char
         leay  -1,y       Found legitimate char, point Y to it
         rts             

* Check if char is letter, number or _
L246A    bsr   L2478      Check if next char is letter or _
         bcc   L2493      Yes, exit with carry clear
L246E    cmpa  #'0        Is it a number?
         blo   L2493      No, return with carry set
         cmpa  #'9        Is it a number?
         bls   L2491      Yes, exit with carry clear
         bra   L248E      No, exit with carry set

* Check if char is a letter (or underscore)
* Entry: A=last char gotten (non-space/Lf)
* Exit: Carry clear if A-Z, a-z or '_'
*       Carry set if anything else
L2478    anda  #$7F       Take out any high bit that might exist
         cmpa  #'A        Is it lower than a 'A'
         blo   L2493      Yes, skip ahead (carry set)
         cmpa  #'Z        Is it an uppercase letter?
         bls   L2491      Yes, clear carry & exit
         cmpa  #'_        Is it an underscore?
         beq   L2493      Yes, exit (carry is clear)
         cmpa  #'a        Is it a [,\,],^ or inverted quote ($60)?
         blo   L2493      Yes, skip ahead (carry set)
         cmpa  #'z        Is it a lowercase letter?
         bls   L2491      Yes, exit
L248E    orcc  #$01       Error, non-alpha char
         rts             

L2491    andcc  #$FE       No error, alphabetic char
L2493    rts             

L2494    ldx   <u0062    
         ldd   -3,x      
         addd  #1         INCD
         std   -3,x      
         ldb   <u00A6     Get size of var name/ (or string?)
         clra             D=Size
         addd  #3         Add 3 to size
         sty   <u00A9    
         bsr   L24EE     
         pshs  y         
         lda   <u00A5    
         clrb            
         std   ,y++      
         stb   ,y+       
         ldx   <u00A9    
L24B3    lda   ,x+       
         sta   ,y+       
         bpl   L24B3     
         leay  ,x        
         puls  pc,x      

L24BD    pshs  u,d       
         ldd   <u000C    
         subd  ,s        
         bcc   L24CA     
         lda   #$20      
         lbra  L1DD6     

L24CA    std   <u000C    
         ldd   <u0066    
         subd  ,s        
         std   <u0066    
         ldu   <u00DA    
         ldd   <u00DA    
         subd  ,s        
         std   <u00DA    
         tfr   d,y       
         ldd   <u0066    
         subd  <u00DA    
         addd  <u0068    
         bsr   L2508     
         ldd   <u0068    
         addd  ,s++      
         std   <u0068    
         leax  ,u        
         puls  pc,u      

L24EE    pshs  u,d       
         bsr   L24BD     
         subd  ,s        
         std   <u0068    
         leau  ,x        
         leax  $03,y     
         stx   <u0062    
         ldd   <u0064    
         bsr   L2508     
         addd  ,s++      
         std   <u0064    
         leax  ,u        
         puls  pc,u      

L2508    pshs  x,d       
         leax  d,u       
         pshs  x         
L250E    bitb  #$03      
         beq   L251F     
         lda   ,u+       
         sta   ,y+       
         decb            
         bra   L250E     

L2519    pulu  x,d       
         std   ,y++      
         stx   ,y++      
L251F    cmpu  ,s        
         blo   L2519     
         clr   ,s++      
         puls  pc,x,d    

* Entry point from L23E1
L2528    lda   #%00100000 Bit pattern to test for end of entry
* Entry: X=Table ptr (ex. command table)
*        Y=Source ptr
*        A=Mask to check for end of entry (%10000000)
*        U=??? (just preserved)
* Exit:  X=Ptr to 2 byte # before matching text string
*        Y=Ptr to byte after matching entry in source
*        Zero flag set if no matching entry found
L252A    pshs  u,y,x,a    Save everything on stack
         ldu   -3,x       Get # of entries in table
         ldb   -1,x       Get # bytes to skip to next entry
* Loop to find entry (or until table runs out)
L2530    stx   1,s        Save new table ptr
         cmpu  #$0000     Done all entries?
         beq   L2558      Yes, exit
         leau  -1,u       Bump # entries left down
         ldy   3,s        Get source ptr
         leax  b,x        Point to next entry
L253F    lda   ,x+        Get byte from table
         eora  ,y+        Match byte from source?
         beq   L2551      Yes, skip ahead
         cmpa  ,s         Just high bit set (end of entry marker)?
         beq   L2551      Yes, skip ahead
         leax  -1,x       No, bump table ptr back by 1
L254B    lda   ,x+        Get byte
         bpl   L254B      Keep reading until high bit found (end of entry)
         bra   L2530      Go loop to check this entry

* Found a byte match (with or w/o high bit)
L2551    tst   -1,x       Check the byte
         bpl   L253F      If not at end of entry, keep looking
         sty   3,s        Entry matched, save new source ptr
L2558    puls  pc,u,y,x,a Restore regs & return

L255A    pshs  x,d        Preserve regs
         ldb   [<$04,s]   Get table entry #
         leax  <L256A,pc  Point to vector table
         ldd   b,x        Get vector offset
         leax  d,x        Calculate vector
         stx   4,s        Replace original RTS address with vector
         puls  pc,x,d     Restore regs and go to new routine

* Jump table
L256A    fdb   L2C50-L256A $06e6
         fdb   L30A0-L256A $0b36
         fdb   L2692-L256A $0128
         fdb   L26FD-L256A $0193

* Jump table
L2581    fdb   L2D07-L2581 $0786
         fdb   L277F-L2581 $01fe
         fdb   L2728-L2581 $01a7
         fdb   L2783-L2581 $0202
         fdb   L292A-L2581 $03a9
         fdb   L2C88-L2581 $0707
         fdb   L2D20-L2581 $079f
         fdb   L2D20-L2581 $079f
         fdb   L2D20-L2581 $079f
         fdb   L2C88-L2581 $0707
         fdb   L2D20-L2581 $079f
         fdb   L2D20-L2581 $079f
         fdb   L2D20-L2581 $079f
         fdb   L2954-L2581 $03D3
         fdb   L2952-L2581 $03D1
         fdb   L29A4-L2581 $0423
         fdb   L2A30-L2581 $04AF
         fdb   L2A4B-L2581 $04CA
         fdb   L2A62-L2581 $04E1
         fdb   L2A74-L2581 $04F3
         fdb   L2B0C-L2581 $058B
         fdb   L2B5B-L2581 $05DA
         fdb   L2B69-L2581 $05E8
         fdb   L2B81-L2581 $0600
         fdb   L2B88-L2581 $0607
         fdb   L2B9C-L2581 $061b
         fdb   L2BA0-L2581 $061f
         fdb   L2BA4-L2581 $0623
         fdb   L2BC1-L2581 $0640
         fdb   L29AB-L2581 $042a
         fdb   L2A1A-L2581 $0499
         fdb   L29CC-L2581 $044b
         fdb   L308D-L2581 $0b0c
         fdb   L29CC-L2581 $044b
         fdb   L308D-L2581 $0b0c
         fdb   L2C1F-L2581 $069e
         fdb   L2D07-L2581 $0786
         fdb   L2C65-L2581 $06e4
         fdb   L2C88-L2581 $0707
         fdb   L2D07-L2581 $0786
         fdb   L2D07-L2581 $0786
         fdb   L2CC6-L2581 $0745
         fdb   L2CC6-L2581 $0745
         fdb   L2CE2-L2581 $0761
         fdb   L2C65-L2581 $06e4
         fdb   L2C88-L2581 $0707
         fdb   L2CF0-L2581 $076f
         fdb   L2CF0-L2581 $076f
         fdb   L2CFA-L2581 $0779
         fdb   L2D18-L2581 $0797
         fdb   L2D07-L2581 $0786
         fdb   L2D07-L2581 $0786
         fdb   L2D07-L2581 $0786
         fdb   L2D20-L2581 $079f
         fdb   L2D20-L2581 $079f
         fdb   L26C8-L2581 $0147
         fdb   L26C8-L2581 $0147
         fdb   L2C88-L2581 $0707
         fdb   L265D-L2581 $00dc
         fdb   L308D-L2581 $0b0c
         fdb   L308D-L2581 $0b0c
         fdb   L26C1-L2581 $0140
         fdb   L2718-L2581 $0197
         fdb   L2718-L2581 $0197

* Table (called from L2D2C) - If 0, does something @ L308D, otherwise, AND's
*   with $1F, multiplies by 2, and uses result as offset to branch table @
*   L2DA2
L2601    fcb   $20,$20,$06,$00,$43,$40,$28,$25,$00,$43,$43,$43,$43,$43,$43,$43
         fcb   $05,$00,$43,$43,$43,$00,$45,$00,$25,$00,$45,$00,$05,$00,$21,$21
         fcb   $47,$27,$27,$22,$22,$22,$60,$60,$61,$87,$8a,$89,$89,$81,$85,$00
         fcb   $80,$81,$e0,$e0,$e0,$e0,$e0,$6b,$05,$00,$6c,$6c,$6c,$6d,$00,$00
         fcb   $6d,$00,$00,$6e,$00,$00,$00,$6e,$00,$00,$00,$6d,$00,$00,$6d,$00
         fcb   $00,$0d,$00,$00,$06,00,$06,$00,$06,$00,$44,$44

L265D    ldd   ,y        
         tst   <u00D9    
         bne   L2675     
         pshs  d         
         leay  -1,y      
         ldd   <u0060    
L2669    std   <u00AB    
         ldd   #3        
         lbsr  L2578     
         puls  d         
         bra   L2677     

L2675    leay  2,y       
L2677    lbsr  L29DE     
         bcc   L268E     
         std   ,x        
         tfr   y,d       
         subd  <u005E    
         leax  2,x       
L2684    ldu   ,x        
         std   ,x        
L2688    leax  ,u        
         bne   L2684     
         bra   L2692     

L268E    lda   #$4B       Multiply-defined Line Number error
         bsr   L26CE      Go print (Y-<u005E) to std err in hex
L2692    leax  >L2581,pc  Point to table
         ldb   ,y+        Get byte
         bpl   L269F      If high bit off, go get offset from table
         ldd   #L2952-L2581 Otherwise force to use L2952 offset
         bra   L26A9      Skip ahead

L269F    lslb             Multiply by 2
         clra             16 bit offset required
         ldd   d,x        Get offset
         cmpd  #L2952-L2581 Is it the special case one?
         blo   L26BF      If it or any lower offset, go execute it
L26A9    tst   <u00C7     ??? If ?? set, go execute routine
         bne   L26BF     
         inc   <u00C7     Set flag
         pshs  d          Preserve offset
         tfr   y,d        ??? Move current location to D
         subd  <u005E     Subtract something
         subd  #$0001     Subtract 1 more
         ldu   <u002F     Get 'current' module ptr
         std   $15,u      ??? Save some sort of size into module header?
         puls  d          Get offset back
L26BF    jmp   d,x        Jump to routine

L26C1    ldx   <u002F     Get ptr to current module
         lda   #$01       Flag for Line with Compiler error
         sta   <$17,x     Save in flag header byte
L26C8    ldb   ,y+        Get offset byte
         clra             Make 16 bit
         leay  d,y        Point Y to it & return
         rts             

L308D    ldy   <u0060    
         lda   #$30       Unimplemented Routine error
* ERROR MESSAGE REPORT:
* Prints Hex # address of where error occurs, & error message on screen
* Entry: Y=# to convert to hex after subtracting <u005E
* Exit: Writes out 4 digit hex # & space
L26CE    pshs  y,x,d      Preserve regs
         ldx   <u002F     Get Ptr to current module
         lda   #$01       Set Line with compiler error flag in mod. header
         sta   <$17,x    
         lda   <u0084     Get flag???
         bmi   L26FB      If high bit set, don't print address
         ldd   4,s        Get # to convert (current addr?)
         subd  <u005E     ??? Subtract start?
         leas  -5,s       Make 5 byte buffer
         leax  ,s         Point X to it
         bsr   L26FD      Convert D to 4 digit HEX characters
         lda   #C$SPAC    Add Space
         sta   ,x+       
         lda   #2         Std error path
         leax  ,s         Point to buffer
         ldy   #5         Write out the hex number
         os9   I$Write   
         leas  5,s        Eat temporary buffer
         ldb   ,s         Get error code
         lbsr  L1CC1      Print error message
L26FB    puls  pc,y,x,d   Restore regs & return

* Convert 16 bit number to ASCII Hex equivalent (Addresses in LIST?)
* Result is stored at ,X
L26FD    bsr   L2701      Convert A to hex
         tfr   b,a        Convert B to hex
L2701    pshs  a          Preserve byte
         lsra             Do high nibble first
         lsra            
         lsra            
         lsra            
         bsr   L270D      Convert to ASCII Hex equivalent
         puls  a          Get back original byte
         anda  #$0F       Do low nibble now
L270D    adda  #$30       Make ASCII
         cmpa  #'9        Past legal numeric?
         bls   L2715      Yes, save ASCII version
         adda  #$07       Bump >9 up to A-F for Hex
L2715    sta   ,x+        Save Hex ASCII version & return
         rts             

L2718    ldb   ,y         Get char(?)
         bsr   L2721      Check if it is $3E or $3F > or ?
         bne   L2720      Neither, return
L271E    leay  1,y        Yes, bump Y up & return
L2720    rts             

L2721    cmpb  #$3F      
         beq   L2727     
         cmpb  #$3E      
L2727    rts             

L2728    lbsr  L2F43     
         ldb   <u00CF    
         beq   L2733     
         lda   #$4C       Multiply-defined Variable error
         bsr   L26CE      Go print hex version of (Y-<u005E)
L2733    leay  4,y        Bump ptr up by 4
         lda   #$40      
         sta   <u00CE    
         ldd   <u00C1    
         pshs  d         
         clra            
         clrb            
         std   <u00C1    
         bsr   L2787     
         ldd   <u00CC    
         subd  <u0060    
         beq   L277A     
         addd  #3        
         cmpd  <u000C    
         lbcc  L2A0D     
         pshs  y,x       
         lbsr  L257B     
         ldd   <u00C1    
         leau  ,y        
         std   ,y++      
         clr   ,y+       
         ldx   <u0060     Get address of $F offset in header
L2762    ldd   ,x++       Get value there
         subd  <u0062    
         std   ,y++      
         inc   2,u       
         cmpx  <u00CC    
         blo   L2762     
         tfr   u,d       
         puls  y,x       
         subd  <u0066    
         std   1,x       
         lda   #$25      
         sta   ,x        
L277A    puls  d         
         std   <u00C1    
         rts             

L277F    lda   #$80      
         bra   L2785     

L2783    lda   #$60      
L2785    sta   <u00CE    
L2787    ldd   <u0060    
         pshs  x,d       
         std   <u00CC    
L278D    bsr   L27E0     
         ldb   ,y+       
         cmpb  #$4B      
         beq   L278D     
         cmpb  #$4C      
         beq   L279F     
         leay  -1,y      
         ldb   #$01      
         bra   L27A3     

L279F    lbsr  L283A     
         clrb            
L27A3    pshs  y,b       
         ldx   3,s       
         ldd   <u00CC    
         std   3,s       
         stx   <u00CC    
         subd  <u00CC    
         lslb             D=D*2
         rola            
         addd  3,s       
         cmpd  <u00DA    
         blo   L27CE     
         lbra  L2A0D     

L27BC    ldu   ,x++       Get some sort of var ptr
         tst   ,s        
         beq   L27CB     
         lda   ,u         Get var type
         sta   <u00D1     Save it
         lbsr  L3083      D=size of var in bytes
         std   <u00D6     Save size
L27CB    lbsr  L2878     
L27CE    cmpx  3,s       
         blo   L27BC     
         ldd   <u00CC    
         std   3,s       
         puls  y,b       
         ldb   ,y+       
         cmpb  #$51      
         beq   L278D     
         puls  pc,x,d    

L27E0    lbsr  L2F43     
         ldb   <u00CF    
         beq   L27FF     
         lda   #$4C       Multiply-defined Variable error
         lbsr  L26CE     
         leay  3,y       
         ldb   ,y        
         cmpb  #$4D      
         bne   L27FE     
         leay  1,y       
L27F6    bsr   L282E     
         ldb   ,y+       
         cmpb  #$4B      
         beq   L27F6     
L27FE    rts             

L27FF    ldd   <u00CC    
         addd  #$000A    
         cmpd  <u00DA    
         lbhs  L2A0D     
         ldx   <u00CC    
         ldd   <u00D2    
         std   ,x++      
         leau  ,x        
         clr   ,x+       
         leay  3,y       
         ldb   ,y        
         cmpb  #$4D      
         bne   L282B     
         leay  1,y       
L281F    bsr   L282E     
         std   ,x++      
         inc   ,u        
         ldb   ,y+       
         cmpb  #$4B      
         beq   L281F     
L282B    stx   <u00CC    
         rts             

L282E    ldb   ,y+       
         clra            
         cmpb  #$8D      
         beq   L2837     
         lda   ,y+       
L2837    ldb   ,y+       
         rts             

L283A    lda   ,y+       
         cmpa  #$85      
         beq   L285B     
         suba  #$40      
         sta   <u00D1     Save var type
         cmpa  #4         String type?
         bne   L2856      No, skip ahead
         ldb   ,y        
         cmpb  #$4F      
         bne   L2856     
         leay  1,y       
         bsr   L282E     
         leay  1,y       
         bra   L2875     

L2856    lbsr  L3083      Go get size of var
         bra   L2875      Go save size @ u00D6

L285B    leay  -1,y      
         lbsr  L2F43     
         leay  3,y       
         ldb   <u00CF    
         cmpb  #$20      
         beq   L286D     
         lda   #$18       Illegal Type suffix error
         lbra  L26CE     

L286D    ldd   1,x       
         std   <u00D2    
         ldx   <u0066    
         ldd   d,x        Get size of var
L2875    std   <u00D6     Save size of var & return
         rts             

L2878    ldb   ,x+       
         beq   L28D0     
         pshs  b         
         lslb            
         lslb            
         lslb            
         stb   <u00D0    
         lsrb            
         lsrb            
         leax  b,x       
         addb  #4        
         pshs  u,x       
         lda   <u00D1     Get var type
         cmpa  #4         Numeric type?
         blo   L2893      Yes, skip ahead
         addb  #2         If string or complex, add 2 to type
L2893    clra            
         cmpd  <u000C    
         lbhi  L2A0D     
         lbsr  L257B     
         ldx   ,s        
         leau  2,y       
         ldd   #$0001    
         std   ,u++      
L28A7    ldd   ,--x      
         std   ,u++      
         bsr   L28F7     
         dec   4,s       
         bne   L28A7     
         lda   <u00D1     Get var type
         cmpa  #4         Numeric or string?
         bls   L28BC      Yes, skip ahead
         ldd   <u00D2     No, (complex?)
* NOTE: Since 28BC only referred to here, should be able to change std ,u/coma
*   to bra L28C0 (std ,u)
         std   ,u         Save ???
         coma             Set carry to indicate complex?
L28BC    ldd   <u00D6     Get size of var in bytes
         bcs   L28C2      If complex, don't save sign again
         std   ,u         Save size
L28C2    bsr   L28F7      ??? Do some multiply testing based on size?
         tfr   y,d       
         puls  u,x       
         subd  <u0066    
         std   1,u       
         leas  1,s       
         bra   L28E0     

L28D0    stb   <u00D0    
         lda   <u00D1     Get var type
         cmpa  #4         Normal type (numeric/string)?
         bhi   L28DC      No, skip ahead
         ldd   <u00D6     Get size of var
         bra   L28DE      Skip ahead

L28DC    ldd   <u00D2     Get ??? (something with complex type?)
L28DE    std   1,u        Save size
L28E0    lda   <u00D1     Get var type
         ora   <u00D0     Keep common bits with ???
         ora   <u00CE     Keep common bits with ???
         sta   ,u         Save ???
         pshs  x         
         leax  ,u        
         lbsr  L2FEE     
         ldx   <u00CC    
         stu   ,x++      
         stx   <u00CC    
         puls  pc,x      

* Check if size of array will be too big
L28F7    pshs  d         
         ldb   2,y       
         mul             
         bne   L2923     
         lda   1,s       
         ldb   2,y       
         mul             
         tsta            
         bne   L2923     
         stb   2,y       
         lda   ,s        
         ldb   3,y       
         mul             
         tsta            
         bne   L2923     
         addb  2,y       
         bcs   L2923     
         stb   2,y       
         lda   1,s       
         ldb   3,y       
         mul             
         adda  2,y       
         bcs   L2923     
         std   2,y       
         puls  pc,d      

L2923    lda   #$49       Array Size Overflow error
         lbsr  L26CE     
         puls  pc,d      

L292A    ldu   <u00CA    
         bne   L2936     
         tfr   y,d       
         subd  <u005E    
         std   <u00C8    
         bra   L293C     

L2936    tfr   y,d       
         subd  <u005E    
         std   ,u        
L293C    lbsr  L2D65     
         lbsr  L2E52     
         ldb   ,y+       
         cmpb  #$4B      
         beq   L293C     
         sty   <u00CA    
         ldd   <u00C8    
         std   ,y++      
         lbra  L271E     

L2952    leay  -1,y      
L2954    bsr   L2984     
         leay  1,y       
         lbsr  L2D65     
         lbsr  L2E52     
         sta   <u00D1     Save var type
         lbsr  L2E52     
         cmpa  <u00D1     Same as var type?
         beq   L2981      Yes, skip ahead
         cmpa  #2         Var type from 2E52=Boolean/string/complex?
         bhi   L297E      Yes, skip ahead (print some hex # out)
         beq   L2971      Real #, skip ahead
         lda   #$C8      
         bra   L2973     

L2971    lda   #$CB      
L2973    ldb   <u00D1     Get var type
         cmpb  #2         Boolean/string/complex?
         bhi   L297E      Yes, skip ahead
         lbsr  L2FBE      Byte/Integer/Real, go do something
         bra   L2981     

L297E    lbsr  L2A26     
L2981    lbra  L2718      ??? Do some checking ,y, return from there

L2984    lda   ,y        
         cmpa  #$0E      
         lbne  L2D65     
         leay  1,y       
         lbsr  L2D65     
L2991    lda   -3,y      
         cmpa  #$85      
         bhs   L299F     
         ldd   <u00D2    
         subd  <u0062    
         std   -2,y      
         lda   #$85      
L299F    adda  #$6D      
         sta   -3,y      
         rts             

L29A4    bsr   L29A6     
L29A6    bsr   L2A1A     
         leay  1,y       
         rts             

L29AB    ldb   ,y+       
         cmpb  #$1E      
         beq   L29C5     
         leay  -1,y      
         bsr   L29A6     
         ldd   ,y++      
L29B7    pshs  d         
         leay  1,y       
         bsr   L29CC     
         puls  d         
         subd  #$0001    
         bne   L29B7     
         rts             

L29C5    ldb   ,y+       
         lbsr  L2721     
         beq   L29DD     
L29CC    ldd   ,y        
         bsr   L29DE     
         ldd   2,x       
         bcc   L29D7     
         sty   2,x       
L29D7    std   ,y        
         inc   -1,y      
         leay  3,y       
L29DD    rts             

L29DE    ldx   <u0066    
         pshs  d         
         bra   L29ED     

L29E4    ldd   ,x        
         anda  #$7F      
         cmpd  ,s        
         beq   L2A08     
L29ED    leax  -4,x      
         cmpx  <u00DA    
         bhs   L29E4     
         ldd   <u000C     Get # bytes free in workspace for user
         subd  #4         Subtract 4
         blo   L2A0D      Not enough mem, exit with Memory full error
         std   <u000C     Save new free space
         ldd   ,s        
         ora   #$80      
         std   ,x        
         clra            
         clrb            
         std   2,x       
         stx   <u00DA    
L2A08    lda   ,x        
         rola            
         puls  pc,d      

L2A0D    lda   #32        Memory full error
         sta   <u0036     Save error code
         lbsr  L26CE     
         lbsr  L30EB     
         lbra  L1CC7     

L2A1A    lbsr  L2D65     
         lbsr  L2E52     
         cmpa  #2         Real?
         beq   L2A2B      Yes, skip ahead
         blo   L29DD      Byte/Integer, return
L2A26    lda   #$47       Illegal Expression Type error
         lbra  L26CE     

L2A2B    lda   #$C8      
         lbra  L2FBE     

L2A30    lbsr  L2BAF     
         lda   3,y       
         cmpa  #$3A      
         beq   L2A3E     
         lda   #$10      
         lbra  L2BA8     

L2A3E    pshs  y         
         leay  4,y       
         bsr   L29CC     
         tfr   y,d       
         subd  <u005E    
         std   [,s++]    
         rts             

L2A4B    ldd   #$1002    
         lbsr  L2BDD     
         ldu   1,x       
         sty   1,x       
         leay  2,y       
         lbsr  L2718     
         tfr   y,d       
         subd  <u005E    
         std   ,u        
         rts             

L2A62    ldd   #$1001    
         lbsr  L2BDD     
         leay  1,y       
L2A6A    tfr   y,d       
         subd  <u005E    
         std   [<1,x]    
         lbra  L2C01     

L2A74    lbsr  L2F43     
         lbsr  L2EE3     
         cmpa  #$60      
         bne   L2A88     
         lda   <u00D1     Get var type
         cmpa  #1         Integer?
         beq   L2A94      Yes, skip ahead
         cmpa  #2         Real?
         beq   L2A94      Yes, skip ahead
L2A88    lda   #$46       Illegal FOR variable
         lbsr  L26CE     
         ldd   #$FFFF    
         std   <u00D2    
         bra   L2AA0     

* FOR variable is numeric but NOT byte, continue
L2A94    ldb   <u00D0    
         bne   L2A88     
         adda  #$80       Set hi bit on var type
         sta   ,y         Save it
         ldd   1,x       
         std   1,y       
L2AA0    ldx   <u0044     Get some sort of var ptr
         leax  -7,x       Make room for 7 more bytes
         stx   <u0044     Save new ptr
         lda   <u00D1     Get var type
         sta   ,x         Save it
         ldd   <u00D2    
         subd  <u0062    
         std   1,x       
         clra            
         clrb            
         std   5,x       
         leay  4,y       
         bsr   L2AF1     
         bsr   L2AD4     
         std   3,x       
         lda   ,y        
         cmpa  #$47      
         bne   L2AC6     
         bsr   L2AD4     
         std   5,x       
L2AC6    leay  1,y       
         sty   ,--x      
         lda   #$13      
         sta   ,-x       
         stx   <u0044    
         leay  3,y       
L2AD3    rts             

L2AD4    ldd   <u00C1    
         pshs  d         
         std   1,y       
         ldx   <u0044    
         lda   ,x        
         leax  >L307E,pc  Point to 5 single bytes table
         ldb   a,x        Get value
         clra             D=value
         addd  <u00C1     Add to value & save result
         std   <u00C1    
         leay  3,y       
         bsr   L2AF1     
         ldx   <u0044    
         puls  pc,d      

L2AF1    lbsr  L2D65     
         lbsr  L2E52     
         cmpa  ,u        
         beq   L2AD3     
         cmpa  #$02      
         bcs   L2B07     
         lbne  L2A26     
         lda   #$C8      
         bra   L2B09     

L2B07    lda   #$CB       ??? Illegal mode error?
L2B09    lbra  L2FBE     

L2B0C    leay  -1,y      
         ldd   #$130B    
         lbsr  L2BDD     
         ldd   2,y       
         cmpd  4,x       
         beq   L2B22     
         lda   #$46       Illegal FOR variable error
         lbsr  L26CE     
         bra   L2B51     

L2B22    addd  <u0062    
         exg   d,x       
         ldx   1,x       
         exg   d,x       
         std   2,y       
         lda   3,x       
         anda  #$02      
         sta   1,y       
         ldd   6,x       
         std   4,y       
         ldd   8,x       
         std   6,y       
         beq   L2B3E     
         inc   1,y       
L2B3E    ldu   1,x       
         tfr   y,d       
         subd  <u005E    
         addd  #$0001    
         std   ,u        
         leau  3,u       
         tfr   u,d       
         subd  <u005E    
         std   8,y       
L2B51    leay  $B,y      
         lbsr  L2C01     
         leax  7,x       
         stx   <u0044    
         rts             

L2B5B    leau  -1,y      
         pshs  u         
         bsr   L2BAF     
         puls  d         
         std   ,y        
         lda   #$15      
         bra   L2BA8     

L2B69    ldd   #$1503    
         bsr   L2BDD     
         ldx   1,x       
         ldd   ,x        
         subd  <u005E    
         std   ,y        
         leay  3,y       
         tfr   y,d       
         subd  <u005E    
         std   ,x        
         lbra  L2C01     

L2B81    lda   #$17      
L2B83    lbsr  L271E     
         bra   L2BD3     

L2B88    bsr   L2BAF     
         lda   #$17      
L2B8C    leay  -1,y      
         ldb   #$03      
         bsr   L2BDD     
         ldd   1,x       
         subd  <u005E    
         std   $01,y     
         leay  $04,y     
         bra   L2C01     

L2B9C    lda   #$19      
         bra   L2B83     

L2BA0    lda   #$19      
         bra   L2B8C     

L2BA4    bsr   L2BAF     
         lda   #$1B      
L2BA8    bsr   L2BD3     
         leay  3,y       
         lbra  L2718     

L2BAF    lbsr  L2D65     
         lbsr  L2E52     
         cmpa  #3         ??? Boolean variable?
         beq   L2BBE      Yes, skip ahead
         lda   #$47       Illegal Expression Type error
         lbsr  L26CE     
L2BBE    leay  1,y       
         rts             

L2BC1    ldd   #$1B03    
         bsr   L2BDD     
         leau  ,y        
         leay  3,y       
         lbsr  L2A6A     
         stu   ,--x      
         lda   #$1C      
         bra   L2BD8     

L2BD3    ldx   <u0044    
         sty   ,--x      
L2BD8    sta   ,-x       
         stx   <u0044    
         rts             

L2BDD    pshs  a         
         ldx   <u0044    
         bra   L2BE5     

L2BE3    leax  3,x       
L2BE5    cmpx  <u0046    
         bhs   L2BF3     
         lda   ,x        
         cmpa  #$1C      
         beq   L2BE3     
         cmpa  ,s        
         beq   L2BFF     
L2BF3    leas  3,s       
         lda   #$45       Unmatched Control Structure error
         lbsr  L26CE     
         leay  b,y       
         lbra  L2718     

L2BFF    puls  pc,a      

L2C01    ldx   <u0044    
         bra   L2C14     

L2C05    lda   ,x        
         cmpa  #$1C      
         bne   L2C1A     
         tfr   y,d       
         subd  <u005E    
         std   [<1,x]    
         leax  3,x       
L2C14    cmpx  <u0046    
         blo   L2C05     
         bra   L2C1C     

L2C1A    leax  3,x       
L2C1C    stx   <u0044    
         rts             

L2C1F    leay  -1,y      
         lbsr  L2F43     
         lda   <u00CF    
         beq   L2C41     
         cmpa  #$A0      
         beq   L2C4E     
         cmpa  #$60      
         bcs   L2C3A     
         lda   <u00D0    
         bne   L2C3A     
         lda   <u00D1    
         cmpa  #$04      
         beq   L2C4E     
L2C3A    lda   #$4C       Multiply-defined Variable error
         lbsr  L26CE     
         bra   L2C4E     

L2C41    lda   #$A0      
         sta   ,x        
         ldd   <u00C5    
         std   1,x       
         addd  #$0002    
         std   <u00C5    
L2C4E    leay  3,y       
L2C50    ldb   ,y+       
         cmpb  #$4D      
         bne   L2C64     
L2C56    lbsr  L2984     
         lbsr  L2E52     
         ldb   ,y+       
         cmpb  #$4B      
         beq   L2C56     
         leay  1,y       
L2C64    rts             

L2C65    bsr   L2CB2     
         leay  -1,y      
         cmpb  #$90      
         bne   L2C72     
         lbsr  L2D0B     
         leay  1,y       
L2C72    lbsr  L2984     
         lbsr  L2E52     
         cmpa  #$05      
         bcs   L2C81     
         lda   #$4D       Illegal Input Variable error
         lbsr  L26CE     
L2C81    lda   ,y+       
         cmpa  #$4B      
         beq   L2C72     
         rts             

L2C88    bsr   L2CB2     
         cmpb  #$49      
         bne   L2C92     
         bsr   L2D0B     
L2C90    ldb   ,y+       
L2C92    cmpb  #$4B      
         beq   L2C90     
         cmpb  #$51      
         beq   L2C90     
         lbsr  L2721     
         beq   L2CC5     
         leay  -1,y      
         lbsr  L2D65     
         lbsr  L2E52     
         cmpa  #$05      
         blo   L2C90     
         lda   #$47       Illegal Expression Type error
         lbsr  L26CE     
         bra   L2C90     

L2CB2    ldb   ,y+       
         cmpb  #$54      
         bne   L2CC5     
         lbsr  L2A1A     
L2CBB    ldb   ,y+       
         cmpb  #$4B      
         beq   L2CBB     
         cmpb  #$51      
         beq   L2CBB     
L2CC5    rts             

L2CC6    leay  1,y       
         lbsr  L2984     
         lbsr  L2E52     
         cmpa  #$01      
         beq   L2CD5     
         lbsr  L2A26     
L2CD5    leay  1,y       
         bsr   L2D0B     
         lda   ,y+       
         cmpa  #$4A      
         bne   L2CE1     
         leay  2,y       
L2CE1    rts             

L2CE2    bsr   L2D02     
         bsr   L2D65     
         lbsr  L2E52     
         cmpa  #$42      
         bls   L2D20     
         lbra  L2A26     

L2CF0    bsr   L2D02     
         lbsr  L2984     
         lbsr  L2E52     
L2CF8    bra   L2D20     

L2CFA    bsr   L2D02     
         cmpb  #$4B      
         beq   L2CFA     
         bra   L2D20     

L2D02    leay  1,y       
         lbra  L29A6     

L2D07    bsr   L2D0B     
         bra   L2D20     

L2D0B    bsr   L2D65     
         lbsr  L2E52     
         cmpa  #4        
         beq   L2CE1      Return
         lbra  L2A26      Return from there

L2D18    ldb   ,y+       
         cmpb  #$3A      
         lbeq  L29CC     
L2D20    lbra  L2718     

L2D23    cmpb  #$96      
         bhs   L2D2C     
         lbsr  L2E5F     
         bra   L2D65     

* B>=$96 goes here
L2D2C    cmpb  #$F2       If >=$F2, skip ahead
         lbhs  L308D     
         subb  #$96       Drop B to $00 - $5B
         leax  >L2601,pc  Point to data table
         abx              Point to entry we want
         ldb   ,x         Get it
         lbeq  L308D      If nothing, skip ahead
         andb  #$1F      
         beq   L2D4A     
         leau  <L2DA2,pc  point to routine
         lslb            
         jsr   b,u       
L2D4A    ldb   ,x         Get byte
         andb  #$E0       Mask out all but hi 3 bits
         beq   L2D60      If hi 3 bits all 0's, skip ahead
         clra             Move hi 3 bits to lo 3 bits in A
         rolb             ROLD
         rola            
         rolb             ROLD
         rola            
         rolb             ROLD
         rola            
         cmpa  #$07       All 3 bits set?
         bne   L2D60      No, skip ahead
         lbsr  L2FD4     
         bra   L2D65     

L2D60    lbsr  L2E3B     
         leay  1,y       
L2D65    ldb   ,y        
         bmi   L2D23     
         rts             

L2D6A    bsr   L2D6F     
         incb            
         bra   L2D71     

L2D6F    ldb   #$C8       (200)
L2D71    lbsr  L2E52     
         cmpa  #$02      
         blo   L2D85     
         beq   L2D7E     
         bsr   L2DC3     
         bra   L2D83     

L2D7E    tfr   b,a       
         lbsr  L2FBE     
L2D83    lda   #$01      
L2D85    rts             

L2D86    bsr   L2D8B     
         incb            
         bra   L2D8D     

L2D8B    ldb   #$CB      
L2D8D    lbsr  L2E52     
         cmpa  #$02      
         beq   L2DA1     
         blo   L2D9A     
         bsr   L2DC3     
         bra   L2D9F     

L2D9A    tfr   b,a       
         lbsr  L2FBE     
L2D9F    lda   #$02      
L2DA1    rts             

L2DA2    bra   L2DC0      (offset 0)
L2DA4    bra   L2D6F      (2)
L2DA6    bra   L2D6A      (4)
L2DA8    bra   L2D8B      (6)
L2DAA    bra   L2D86      (8)
L2DAC    bra   L2DDE      ($a)
L2DAE    bra   L2DC8      ($c)
L2DB0    bra   L2DF4      ($e)
L2DB2    bra   L2DF2      ($10)
L2DB4    bra   L2DFF      ($12)
L2DB6    bra   L2E04      ($14)
L2DB8    bra   L2E30      ($16)
L2DBA    bra   L2E2E      ($18)
L2DBC    bra   L2E13      ($1A)
L2DBE    bra   L2E09      ($1C)
L2DC0    lbra  L308D      ($1F)

L2DC3    lda   #$43       Illegal Argument error
         lbra  L26CE     

L2DC8    bsr   L2DE7     
         pshs  a         
         bsr   L2DE7     
         cmpa  ,s+       
         beq   L2DE0     
         lda   #$CB      
         bcc   L2DD7     
         inca            
L2DD7    lbsr  L2FBE     
         lda   #$02      
         bra   L2DE4     

L2DDE    bsr   L2DE7     
L2DE0    cmpa  #$02      
         bne   L2DE6     
L2DE4    inc   ,y        
L2DE6    rts             

L2DE7    bsr   L2E52     
         cmpa  #$02      
         bls   L2DF1     
         bsr   L2DC3     
         lda   #$02      
L2DF1    rts             

L2DF2    bsr   L2DF4     
L2DF4    bsr   L2E52     
         cmpa  #4        
         beq   L2DFE     
         bsr   L2DC3     
         lda   #4        
L2DFE    rts             

L2DFF    lbsr  L2D6F     
         bra   L2DF4     

L2E04    lbsr  L2D6A     
         bra   L2DF4     

L2E09    lda   #3        
         bsr   L2E20     
         bne   L2E13     
         ldb   #3        
         bra   L2E1B     

L2E13    lda   #4        
         bsr   L2E20     
         bne   L2DC8     
         ldb   #2        
L2E1B    addb  ,y        
         stb   ,y        
         rts             

L2E20    ldu   <u0044    
         cmpa  ,u+       
         bne   L2E2D     
         cmpa  ,u+       
         bne   L2E2D     
         stu   <u0044    
         clrb            
L2E2D    rts             

L2E2E    bsr   L2E30     
L2E30    bsr   L2E52     
         cmpa  #3        
         beq   L2E3A     
         bsr   L2DC3     
         lda   #3        
L2E3A    rts             

* Modified since all routines coming here freshly LDA
L2E3B    tsta             A=0?
L2E3C    bne   L2E41      No, skip ahead
         inca             A=1
L2E41    ldu   <u0044    
         cmpa  #5        
         bne   L2E4D     
         ldd   <u00D4    
         std   ,--u      
         lda   #5        
L2E4D    sta   ,-u       
         stu   <u0044    
         rts             

L2E52    ldu   <u0044    
         lda   ,u+       
         cmpa  #5        
         bne   L2E5C     
         leau  2,u       
L2E5C    stu   <u0044    
         rts             

L2E5F    cmpb  #$85      
         lblo  L308D     
         cmpb  #$89      
         blo   L2EAB     
         subb  #$8D      
         lblo  L2F07      $8a to $8c go here
         leau  <L2E75,pc  Point to list of branches
         lslb             2 bytes/per branch
         jmp   b,u        Call branch

L2E75    bra   L2E87     
L2E77    bra   L2E89     
L2E79    bra   L2E8F     
L2E7B    bra   L2E95     
L2E7D    bra   L2E89     
L2E7F    bra   L2E9F     
L2E81    bra   L2EA8     
L2E83    bra   L2E9F     
L2E85    bra   L2EA8     

L2E87    leay  -1,y      
L2E89    leay  3,y       
         lda   #1        
         bra   L2E41     

L2E8F    leay  6,y       
         lda   #2        
         bra   L2E41     

L2E95    ldb   ,y+       
         cmpb  #$FF      
         bne   L2E95     
         lda   #4        
         bra   L2E41     

L2E9F    lbsr  L2991     
         bsr   L2E52     
         lda   #1        
         bsr   L2E41     
L2EA8    leay  1,y       
         rts             

L2EAB    lbsr  L2F43     
         bsr   L2EE3     
         cmpa  #$60      
         beq   L2EBF     
         cmpa  #$80      
         beq   L2EBF     
         lda   #$12       Illegal Operand error
         lbsr  L26CE     
         bra   L2EDC     

L2EBF    ldb   #$85      
         lbsr  L2F5E     
         ldb   ,y        
         cmpb  #$85      
         bne   L2EDC     
         ldb   <u00CF    
         cmpb  #$60      
         bne   L2EDC     
         cmpa  #5        
         bhs   L2EDC     
         adda  #$80      
         sta   ,y        
         ldd   1,x       
         std   1,y       
L2EDC    leay  3,y       
         lda   <u00D1    
         lbra  L2E3C     

L2EE3    lda   <u00CF    
         bne   L2F06     
         ldb   #$60      
         sta   <u00D0    
         stb   <u00CF    
         lda   #$60       Take out, and change following to B's ?
         ora   <u00D1    
         sta   ,x        
         anda  #$07      
         cmpa  #4        
         bne   L2F01     
         ldd   #$0020    
         std   1,x       
L2F01    lbsr  L2FEE     
         lda   <u00CF    
L2F06    rts             

L2F07    bsr   L2F43     
         ldb   #$89      
         bsr   L2F5E     
         lbsr  L2E52     
         cmpa  #5        
         beq   L2F19     
         ldu   #$FFFF    
         bra   L2F1B     

L2F19    ldu   -2,u      
L2F1B    pshs  u         
         bsr   L2EDC     
         puls  u         
         cmpu  #$FFFF    
         beq   L2F3E     
         ldb   2,u       
         stb   <u00D6    
         ldd   <u00D2    
         subd  <u0062    
         leau  3,u       
L2F31    cmpd  ,u++      
         beq   L2F5D     
         dec   <u00D6    
         bne   L2F31     
         lda   #$14      
         bra   L2F40     

L2F3E    lda   #$42       Non-Record Type Operand error
L2F40    lbra  L26CE     

L2F43    ldd   1,y       
         addd  <u0062    
         std   <u00D2    
         ldx   <u00D2    
L2F4B    lda   ,x        
         anda  #$E0      
         sta   <u00CF    
         lda   ,x        
         anda  #$18      
         sta   <u00D0    
         lda   ,x        
         anda  #$07      
         sta   <u00D1    
L2F5D    rts             

L2F5E    pshs  b         
         ldb   ,y        
         subb  ,s+       
         bne   L2F73     
         lda   <u00D0    
         beq   L2F9D     
         ldd   #$FFFF    
         std   <u00D4    
         lda   #5        
         sta   <u00D1    
         rts             

L2F73    lslb             B=B*8
         lslb            
         lslb            
         cmpb  <u00D0    
         beq   L2F7F     
         lda   #$41       Wrong Number of Subscripts error
         lbsr  L26CE     
L2F7F    lda   #$C8      
         sta   <u00D8    
L2F83    lbsr  L2E52     
         cmpa  #2         Byte or Integer?
         blo   L2F97      Yes, skip ahead
         beq   L2F93      If real, skip ahead
         lda   #$47       Illegal Expression Type error
         lbsr  L26CE     
         bra   L2F97     

* Real comes here
L2F93    lda   <u00D8    
         bsr   L2FBE     
* Byte/Integer come here
L2F97    inc   <u00D8    
         subb  #$08      
         bne   L2F83     
L2F9D    lda   <u00D1    
         cmpa  #$05      
         bne   L2FBD     
         ldd   1,x       
         addd  <u0066    
         tfr   d,u       
         ldb   <u00D0    
         beq   L2FB5     
         lsrb             Divide by 4
         lsrb            
         addb  #4        
         ldd   b,u       
         bra   L2FB7     

L2FB5    ldd   2,u       
L2FB7    addd  <u0066    
L2FB9    std   <u00D4    
         lda   <u00D1    
L2FBD    rts             

L2FBE    pshs  x,b       
         ldx   <u000C    
         cmpx  #$0010    
         lbls  L2A0D     
         ldx   <u0060    
         sta   ,x+       
         stx   <u00AB    
         clrb            
         bsr   L2FDA     
         puls  pc,x,b    

L2FD4    ldd   <u0060    
         std   <u00AB    
         ldb   #$01      
L2FDA    clra            
L2578    jsr   <u001B    
         fcb   $14       

* Jump tables (NOTE:SINCE ALL ARE <$80, USE 8 BIT INSTEAD OF 16 BIT OFFSET)
L2FDE    fdb   L3027-L2FDE $0049
         fdb   L303A-L2FDE $005c
         fdb   L303E-L2FDE $0060
         fdb   L3048-L2FDE $006a

L2FE6    fdb   L304C-L2FE6 $0066
         fdb   L3058-L2FE6 $0072
         fdb   L3058-L2FE6 $0072
         fdb   L305C-L2FE6 $0076

L2FEE    pshs  u,y,x     
         leay  <L2FDE,pc  Point to 1st jump table
         ldb   ,x        
         andb  #$E0       Get rid of lowest 5 bits (b1-b5)
         cmpb  #%01100000 bits 6 & 7 set?
         beq   L3005      Yes, skip ahead
         cmpb  #%01000000 Just bit 7 set?
         beq   L3005      Yes, skip ahead
         cmpb  #%10000000 Just bit 8 set?
         bne   L3025      No, skip way ahead
* NOTE: IF TABLE CHANGED TO 8 BIT OFFSET, CHANGE THIS TO LEAY 4,Y
         leay  8,y        If just bit 8 set, use 2nd jump table
L3005    ldb   ,x         Reload the value
         andb  #%00011000 Just keep bits 4-5
         beq   L300F      Neither set, skip ahead
         ldd   6,y        If either set, use 4th entry
         bra   L3023      Go to subroutine

L300F    ldb   ,x         Reload the value
         andb  #%00000111 Just keep bits 1-3
L3013    cmpb  #%00000100 Just bits 1-2?
         blo   L3021      Yes, skip ahead
         bhi   L301D      Bit 3 + at least 1 more bit, skip ahead
         ldd   2,y        If just bit 3, use 2nd entry
         bra   L3023      Go to subroutine

L301D    ldd   4,y        Bit 3 + (1 or 2), use 3rd entry
         bra   L3023      Go to subroutine

L3021    ldd   ,y         Use 1st entry
L3023    jsr   d,y        Call subroutine
L3025    puls  pc,u,y,x   Restore regs & return

L3027    lda   ,x        
         anda  #$07      
         leay  1,x       
         bsr   L3083     
L302F    pshs  d          USE W
         ldd   <u00C1    
         std   ,y        
         addd  ,s++      
         std   <u00C1    
         rts             

L303A    bsr   L3069     
         bra   L302F     

L303E    bsr   L3069     
         addd  <u0066    
         tfr   d,x       
         ldd   ,x        
         bra   L302F     

L3048    bsr   L3060     
         bra   L302F     

L304C    leay  1,x       
L304E    ldd   <u00C3    
         std   ,y        
         addd  #$0004    
         std   <u00C3    
         rts             

L3058    bsr   L3069     
         bra   L304E     

L305C    bsr   L3060     
         bra   L304E     

L3060    ldd   1,x       
         addd  <u0066    
         tfr   d,y       
         ldd   2,y       
         rts             

L3069    ldd   #$0004     Requesting 4 bytes of memory from workspace
         bsr   L257B      Go see if we can get it & allocate it
         ldx   4,s       
         ldd   1,x       
         std   2,y       
         tfr   y,d       
         subd  <u0066    
         std   1,x       
         ldd   2,y       
         rts             

L257B    jsr   <u001E    
         fcb   $08       

* Table of # bytes/var type
L307E    fcb   1          1 byte =Byte
         fcb   2          2 bytes=Integer
         fcb   5          5 bytes=Real
         fcb   1          1 byte =Boolean
         fcb   $20        ??? Flag String value? (or default size=32 bytes)

* Entry: A=Variable type (0-4)
* Exit : B=# bytes to represent variable
L3083    pshs  x          Preserve X
         leax  <L307E,pc  Point to 5 1-byte entry table
         ldb   a,x        D=#
         clra            
         puls  pc,x      

* Single byte entry table
L3095    fcb   $01,$02,$03,$07,$08,$09,$37,$38,$3e,$3f,$ff

L30A0    ldd   #$0016    
         std   <u00C1    
         clrb            
         std   <u00C3    
         std   <u00C5    
         sta   <u00C7    
         std   <u00C8    
         std   <u00CA    
         ldx   <u002F     Get ptr to current module
         sta   <$17,x     Set flags to unpacked, no errors
         std   <$15,x    
L30B8    ldy   <u005E    
         bra   L30E2     

L30BD    pshs  y         
         lbsr  L2692     
         puls  x         
         ldb   <u00D9    
         bne   L30E2     
         lda   ,x        
         leau  <L3095,pc  Point to 11 entry 1 byte table
L30CD    cmpa  ,u+        Hunt through for range our byte is in
         blo   L30E2      If lower then table entry, skip ahead
         bne   L30CD      If not equal, keep looking
         pshs  x          Equal, preserve X
         tfr   y,d        Move ??? to d
         subd  ,s++      
         leay  ,x        
         ldu   <u004A     Get ptr to next free byte in I-code workspace
         stu   <u00AB     Save as ptr to current line I-code end
         lbsr  L2578     
L30E2    ldx   <u0060    
         clr   ,x        
         cmpy  <u0060    
         blo   L30BD     
L30EB    ldx   <u0066    
         bra   L310B     

L30EF    lda   ,x        
         bpl   L310B     
         anda  #$7F      
         sta   ,x        
         ldy   2,x       
L30FA    ldu   ,y        
         ldd   ,x        
         std   ,y        
         dec   -1,y      
         lda   #$4A       Undefined Line Number error
         lbsr  L26CE     
         leay  ,u        
         bne   L30FA     
L310B    leax  -4,x      
         cmpx  <u00DA    
         bhs   L30EF     
         ldd   <u0066    
         subd  <u00DA    
         addd  <u000C     Add to bytes free to user
         std   <u000C     Save as new # bytes free to user
         ldx   <u0044    
         bra   L3131     

L257E    jsr   <u001E    
         fcb   $06       

L311D    ldy   1,x       
         lda   #$45       Unmatched Control Structure error
         lbsr  L26CE     
         lda   ,x        
         cmpa  #$13      
         bne   L312D     
         leax  7,x       
L312D    leax  3,x       
         stx   <u0044    
L3131    cmpx  <u0046    
         blo   L311D     
         ldu   <u0066    
         ldy   <u0060    
         ldd   <u0064    
         addd  <u0068    
         bsr   L257E     
         ldx   <u002F     Get current module ptr
         ldd   <u00C8    
         std   <$13,x    
         ldd   <u00C1    
         std   <$11,x    
         addd  <u00C5    
         std   <u00C5    
         std   $0B,x      Save in data area size require in module header
         ldb   <$18,x     Get size of module name
         clra            
         addd  #$0019     Add 25 to it (size of BASIC09 header?)
         std   M$Exec,x   Save as execution address
         addd  <u0060    
         subd  <u005E    
         std   $0F,x     
         addd  <u0068    
         addd  #$0003    
         std   $0D,x     
         subd  #$0003    
         addd  <u0064    
         std   M$Size,x   Save as new module size
         addd  <u002F     Add to current module ptr
         std   <u004A    
         subd  <u0008    
         std   <u000A    
         ldd   <u002F     Get current module ptr
         addd  $D,x      
         std   <u0062    
         ldd   <u002F     Get current module ptr
         addd  $0F,x     
         std   <u0066    
         ldu   <u0062    
         bra   L31E2     

L3188    leax  ,u        
         lbsr  L2F4B     
         lda   <u00CF    
         cmpa  #$60      
         bcs   L31BD     
         cmpa  #$A0      
         bne   L319F     
         ldd   1,x       
         addd  <u00C1    
         std   1,x       
         bra   L31DC     

L319F    cmpa  #$80      
         bne   L31BD     
         ldb   <u00D0    
         bne   L31B1     
         lda   <u00D1    
         cmpa  #$04      
         bcc   L31B1     
         leax  1,u       
         bra   L31B7     

L31B1    ldd   1,u       
         addd  <u0066    
         tfr   d,x       
L31B7    ldd   ,x        
         addd  <u00C5    
         std   ,x        
L31BD    lda   <u00D1    
         cmpa  #$05      
         bne   L31DC     
         ldb   <u00D0    
         beq   L31CD      If 0, force to 2
         lsrb             Divide by by 4
         lsrb            
         addb  #4        
         bra   L31CF     

L31CD    ldb   #$02      
L31CF    clra            
         addd  1,u       
         ldx   <u0066    
         leay  d,x       
         ldd   ,y        
         ldd   d,x       
         std   ,y        
L31DC    leau  3,u       
L31DE    lda   ,u+       
         bpl   L31DE     
L31E2    cmpu  <u004A    
         blo   L3188     
         rts             

* Called by <$24 JMP vector
* Entry: X=byte after the last vector installed ($2D)
*        D=Last vector offset from start of BASIC09's module header
* Based on function code following the JMP that came here, this routine
*  modifies the return address to 1 of 7 routines
L31E8    pshs  x,d        Preserve ptr & offset
         ldb   [<4,s]     Get function code-style byte
         leax  <L31F8,pc  Point to vector table
         ldd   b,x        Get vector offset
         leax  d,x        Calculate address
         stx   4,s        Modify RTS address
         puls  pc,x,d     Restore X & D and return to new routine

* Vector table for <$24 calls
L31F8    fdb   L3BFF-L31F8 Function 0 call
         fdb   L32DD-L31F8 Function 1 call
         fdb   L3B5F-L31F8 Function 2 call
         fdb   L39FB-L31F8 Function 3 call  (error message)
         fdb   L33AE-L31F8 Function 4 call
         fdb   L3A69-L31F8 Function 5 call
         fdb   L3A73-L31F8 Function 6 call

* Jump table (from L323F+offset)
L323F    fdb   L3A51-L323F
         fdb   L3A51-L323F
         fdb   L3A51-L323F
         fdb   L3A51-L323F
         fdb   L3A51-L323F
         fdb   L35DF-L323F
         fdb   L3209-L323F Go direct to JSR <1B / fcb $C
         fdb   L3A69-L323F
         fdb   L3A73-L323F
         fdb   L35F3-L323F
         fdb   L3A5D-L323F
         fdb   L3A61-L323F
         fdb   L3619-L323F
         fdb   L33AE-L323F
         fdb   L352D-L323F
         fdb   L35D2-L323F
         fdb   L33BC-L323F
         fdb   L33CC-L323F
         fdb   L33D3-L323F
         fdb   L34ED-L323F
         fdb   L33E7-L323F NEXT routine
         fdb   L33D6-L323F
         fdb   L33CC-L323F
         fdb   L33AE-L323F
         fdb   L33D6-L323F
         fdb   L33AE-L323F
         fdb   L33CC-L323F
         fdb   L33D6-L323F
         fdb   L33CC-L323F
         fdb   L3632-L323F
         fdb   L39F7-L323F
         fdb   L3A59-L323F
         fdb   L33CC-L323F
         fdb   L3A59-L323F
         fdb   L35F9-L323F
         fdb   L3A8A-L323F
         fdb   L3BF3-L323F
         fdb   L36EE-L323F
         fdb   L3856-L323F
         fdb   L397D-L323F
         fdb   L398A-L323F
         fdb   L3688-L323F
         fdb   L3691-L323F
         fdb   L36BF-L323F
         fdb   L37CB-L323F
         fdb   L38E2-L323F
         fdb   L3917-L323F
         fdb   L391E-L323F
         fdb   L394A-L323F
         fdb   L3957-L323F
         fdb   L3970-L323F
         fdb   L39A0-L323F
         fdb   L39BC-L323F
         fdb   L3A3D-L323F
         fdb   L3A40-L323F
         fdb   L3A48-L323F
         fdb   L3A48-L323F
         fdb   L3397-L323F
         fdb   L33AC-L323F
         fdb   L33AC-L323F
         fdb   L3A4E-L323F
         fdb   L3A59-L323F
         fdb   L33AB-L323F
         fdb   L33AB-L323F
         fdb   L3551-L323F
         fdb   L3560-L323F
         fdb   L356F-L323F
         fdb   L3551-L323F
         fdb   L3588-L323F
         fdb   L35BB-L323F

L3209    jsr   <u001B    
         fcb   $0c       

L32CB    fcc   'STOP Encountered'
         fcb   C$LF,$FF  

* Vector #2 from table at L31F8 comes here

L32DD    lda   $17,x      Get something
         bita  #$01       check if 1st bit is set
         beq   L32E8      no, skip ahead
         ldb   #$33      
         bra   L3304     

L32E8    tfr   s,d       
         subd  #$0100    
         cmpd  <u0080    
         bhs   L32F6     
         ldb   #$39      
         bra   L3304     

L32F6    ldd   <u000C    
         subd  $0B,x     
         blo   L3302     
         cmpd  #$0100    
         bhs   L3307     
L3302    ldb   #$20       Memory full error
L3304    lbra  L39FB     

L3307    std   <u000C    
         tfr   y,d       
         subd  $0B,x     
         exg   d,u       
         sts   5,u       
         std   7,u       
         stx   3,u       
L3316    ldd   #$0001    
         std   <u0042    
         sta   1,u       
         sta   <$13,u    
         stu   <$14,u    
         bsr   L3351     
         ldd   <$13,x    
         beq   L332C     
         addd  <u005E    
L332C    std   <u0039    
         ldd   $0B,x     
         leay  d,u       
         pshs  y         
         ldd   <$11,x    
         leay  d,u       
         IFNE  H6309
         clrd            
         ELSE            
         clra            
         clrb            
         ENDC            
         bra   L333F     

L333D    std   ,y++      
L333F    cmpy  ,s        
         blo   L333D     
         leas  2,s       
         ldx   <u002F    
         ldd   <u005E    
         addd  <$15,x    
         tfr   d,x       
         bra   L3391     

L3351    stx   <u002F     Save current module ptr
         stu   <u0031    
         ldd   $0D,x     
         addd  <u002F     Add to start address of module
         std   <u0062    
         ldd   $0F,x     
         addd  <u002F     Add to start address of module
         std   <u0066    
         std   <u0060    
         ldd   M$Exec,x   Get exec offset
         addd  <u002F     Add to start of module address
         std   <u005E     Save exec offset
         ldd   <$14,u    
         std   <u0046    
         std   <u0044    
         rts             

L3371    stx   <u005C    
         lda   <u0034     Get signal received flag
         beq   L338F      Nothing happened, skip ahead
         bpl   L3382      No signal flagged, skip ahead
         anda  #$7F       Mask off signal received bit flag
         sta   <u0034     Save masked version
         lbsr  L3233      JSR <1B, fcb $18
         lda   <u0034     Shift out least sig bit
L3382    rora            
         bcc   L338F      Not set, skip ahead
         leay  ,x        
         lbsr  L3218     
         clr   <u0074    
         bsr   L3236     
L338F    bsr   L33AE     
L3391    cmpx  <u0060    
         blo   L3371     
         bra   L33A1     

L3236    jsr   <u001B    
         fcb   $16       

L3397    ldb   ,x        
         lbsr  L384F     
         beq   L33A1     
         lbsr  L3856     
L33A1    lbsr  L3A73     
         ldu   <u0031    
         lds   5,u       
         ldu   7,u       
L33AB    rts             

L33AC    leax  2,x       
L33AE    ldb   ,x+       
         bpl   L33B4      Hi bit clear, skip ahead
         addb  #$40       ??? Wrap it around
L33B4    lslb             Multiply by 2
         clra             Unsigned D
         ldu   <u000E     Get ptr to L323F
         ldd   d,u        Get offset
         jmp   d,u        Jump to that routine

L33BC    jsr   <u0016    
         tst   2,y       
         beq   L33CC     
         leax  3,x       
         ldb   ,x        
         cmpb  #$3B      
         bne   L33AB     
         leax  1,x       
L33CC    ldd   ,x        
         addd  <u005E    
         tfr   d,x       
         rts             

L33D3    leax  1,x       
         rts             

* UNTIL
L33D6    jsr   <u0016    
         tst   2,y       
         beq   L33CC      False, go back
         leax  3,x       
         rts             

* NEXT routine
L33E7    leay  <L33DF,pc  Point to table
L33EA    ldb   ,x+        Get byte
         ldb   b,y        Get jump offset
         ldu   <u0031     Get Base address for variable storage
         jmp   b,y        Jump to appropriate routine

L33F3    ldd   ,x        
         leay  d,u       
         bra   L3410     

L33F9    ldd   ,x        
         leay  d,u       
         ldd   4,x       
         lda   d,u       
         bpl   L3410     
         bra   L3430     

* Integer STEP 1
L3405    ldd   ,x         Get offset to current FOR/NEXT INTEGER value
         leay  d,u        Point Y to it
         ldd   ,y         Get current FOR/NEXT counter
         IFNE  H6309
         incd             Add 1 to it
         ELSE
         addd  #$0001
         ENDC
         std   ,y         Save it back
L3410    ldd   2,x        Get offset to TO variable
         leax  6,x        Eat temp var
         ldd   d,u        Get TO variable
         cmpd  ,y         We hit it yet?
         bge   L33CC      Yes, do X=[,x]+[u005E] & return
         leax  3,x        Eat 3 bytes from X & return
         rts             

* INTEGER STEP <>1
L341E    ldd   ,x         Y=ptr to current FOR/NEXT INTEGER value
         leay  d,u       
         ldd   4,x        Get STEP value
         ldd   d,u        Get current FOR/NEXT counter
         IFNE  H6309
         tfr   a,e        Preserve Hi byte (for sign)
         ELSE
         pshs  a
         ENDC
         addd  ,y         Add increment value
         std   ,y         Save new current value
         IFNE  H6309
         tste             Was STEP negative value?
         ELSE
         tst   ,s+
         ENDC
         bpl   L3410      No, go use normal compare routine
L3430    ldd   2,x        Get offset to TO value
         leax  6,x        Eat temp var
         ldd   d,u        Get TO value
         cmpd  ,y         Hit TO value yet?
         ble   L33CC      Yes, do X=[,x]+[u005E] & return
         leax  3,x        Eat 3 bytes from X & return
         rts             

L343E    ldy   <u0046    
         clrb            
         bsr   L348E     
         bra   L347E     

L3446    ldy   <u0046    
         clrb            
         bsr   L348E     
         ldd   4,x       
         addd  #4        
         ldu   <u0031    
         lda   d,u       
         lsra            
         bcc   L347E     
         bra   L34CC     

* NEXT table
* IF some of these entry points are moved before this table, 8 bit addressing
* may be used instead of 16
L33DF    equ   *
         fcb   L3405-L33DF Integer STEP 1
         fcb   L341E-L33DF Integer STEP <>1
         fcb   L345A-L33DF Real STEP 1
         fcb   L34A5-L33DF Real STEP <>1

* Jump table for FOR (relative to L34E5) (change to 8 bit if possible)
L34E5    equ   *
         fcb   L33F3-L34E5 $ff0e   INT step 1
         fcb   L33F9-L34E5 $ff14   INT step <>1
         fcb   L343E-L34E5 $ff59   REAL step 1
         fcb   L3446-L34E5 $ff61   REAL step <>1

* REAL NEXT STEP 1
L345A    ldy   <u0046     ??? Get subroutine stack ptr
         clrb            
         bsr   L348E     
         leay  -6,y       Make room for REAL variable
         ldd   #$0180     Initialize it to contain 1.
         std   1,y       
         clra            
         clrb            
         std   3,y       
         sta   5,y       
         lbsr  L3FB1      Increment counter (Do REAL add)
         IFNE  H6309
         ldq   1,y        Copy REAL # from 1,y to ,u
         stq   ,u        
         ELSE            
         ldd   1,y        Copy REAL # from 1,y to ,u
         std   ,u        
         ldd   3,y       
         std   2,u       
         ENDC            
         lda   5,y       
         sta   4,u       
* Incrementing REAL STEP value
L347E    ldb   #2        
         bsr   L348E     
         leax  6,x       
         lbsr  L4449      Do REAL # compare
         lble  L33CC      Loop again if still too small
         leax  3,x       
         rts             

L348E    ldd   b,x       
         addd  <u0031     Add to ptr to start of variable storage
         tfr   d,u       
         leay  -6,y       Make room for variable
         lda   #$02       Force it to REAL type
         ldb   ,u         Copy real # from u to y
         std   ,y        
         IFNE  H6309
         ldq   1,u       
         stq   2,y       
         ELSE            
         ldd   1,u       
         std   2,y       
         ldd   3,u       
         std   4,y       
         ENDC            
         rts             

L34A5    ldy   <u0046    
         clrb            
         bsr   L348E     
         stu   <u00D2    
         ldb   #$04      
         bsr   L348E     
         lda   4,u       
         sta   <u00D1    
         lbsr  L3FB1      Inc current FOR/NEXT value by STEP (Do REAL Add)
         ldu   <u00D2    
         IFNE  H6309
         ldq   1,y       
         stq   ,u        
         ELSE            
         ldd   1,y       
         std   ,u        
         ldd   3,y       
         std   2,u       
         ENDC            
         lda   5,y       
         sta   4,u       
         lsr   <u00D1     Check sign
         bcc   L347E      Positive, use that direction check
* Decrementing REAL STEP value
L34CC    ldb   #$02      
         bsr   L348E     
         leax  6,x       
         lbsr  L4449      Do REAL compare
         lbge  L33CC      Still bigger, keep looping
         leax  3,x       
L34DB    rts             

L34DC    ldb   <u0034     Get flag byte
         bitb  #$01       Least sig bit set?
         beq   L34DB      No, return
         jsr   <u001B    
         fcb   $1c       

L34ED    ldb   ,x+       
         cmpb  #$82      
         beq   L3515     
         bsr   L3560     
         bsr   L3508     
         ldb   -1,x      
         cmpb  #$47      
         bne   L34FF     
         bsr   L3508     
L34FF    lbsr  L33CC     
         leay  >L34E5,pc  Point to table
         lbra  L33EA     

L3508    ldd   ,x++      
         addd  <u0031    
         pshs  d         
         jsr   <u0016    
         ldd   1,y       
         std   [,s++]    
         rts             

L3515    bsr   L356F     
         bsr   L3523     
         ldb   -$01,x    
         cmpb  #$47      
         bne   L34FF     
         bsr   L3523     
         bra   L34FF     

L3523    ldd   ,x++      
         addd  <u0031    
         pshs  d         
         jsr   <u0016    
         bra   L3579     

* LET
L352D    jsr   <u0016     Get var type
L352F    cmpa  #4         Numeric or Boolean?
         blo   L3537      Yes, skip ahead
         pshs  u          Preserve U
         ldu   <u003E     ??? Get max var size for string or array
L3537    pshs  u,a        Save Size or Ptr & var type
         leax  1,x       
         jsr   <u0016    
L353D    puls  a         
         lsla             x2 for offset into branch table
         leau  <L3545,pc  Point to branch table
         jmp   a,u        Jump to routine

L3545    bra   L355B      LET - Byte
         bra   L356A      LET - Integer
         bra   L3579      LET - Real
         bra   L355B      LET - Boolean
         bra   L359C      LET - String
         bra   L35C1      Let - Array

L3551    ldd   ,x        
         addd  <u0031    
         pshs  d         
         leax  3,x       
         jsr   <u0016    
* LET - Byte/Boolean
L355B    ldb   2,y        Get byte/boolean value
         stb   [,s++]     Save at address on stack, eat stack & return
         rts             

L3560    ldd   ,x        
         addd  <u0031    
         pshs  d         
         leax  3,x       
         jsr   <u0016    
* LET - Integer
L356A    ldd   1,y        Get integer value
         std   [,s++]     Save at address on stack, eat stack & return
         rts             

L356F    ldd   ,x        
         addd  <u0031    
         pshs  d         
         leax  3,x       
         jsr   <u0016    
* LET - Real
L3579    puls  u         
         ldd   1,y        Copy 5 bytes from Y+1 to U
         std   ,u        
         ldd   3,y       
         std   2,u       
         lda   5,y       
         sta   4,u       
         rts             

L3588    ldd   ,x        
         addd  <u0066    
         tfr   d,u       
         ldd   ,u        
         addd  <u0031    
         pshs  d         
         ldd   2,u       
         pshs  d         
         leax  3,x       
         jsr   <u0016    
* LET - String
L359C    puls  u,d       
         tstb            
         bne   L35A2     
         deca            
L35A2    sta   <u003E    
         ldy   1,y       
         sty   <u0048    
* Block copy up to $FF (string terminator)
L35AA    lda   ,y+       
         sta   ,u+       
         cmpa  #$FF       End of string?
         beq   L35B9      Yes, skip ahead
         decb             Dec string size counter
         bne   L35AA      More left, continue copying
         dec   <u003E    
         bpl   L35AA     
L35B9    clra            
         rts             

* LET - Array
L35C1    puls  u,d       
         cmpd  3,y       
         bls   L35CA     
         ldd   3,y       
L35CA    ldy   1,y       
         exg   y,u       
         jsr   <u001E     Return from routine
         fcb   $06       

L35D2    jsr   <u0016    
         ldd   1,y       
         pshs  d         
         jsr   <u0016    
         ldb   2,y       
         stb   [,s++]    
         rts             

L35DF    lbsr  L3856     
         lda   <u002E    
         sta   <u007F    
         leax  >L32CB,pc  Point to 'STOP encountered'
         lbsr  L375F     
         lbra  L1CC7     

L35F3    lbsr  L3856     
L3233    jsr   <u001B     Use module header jump vector #1
         fcb   $18       

L35F9    ldd   ,x        
         leax  3,x       
L35FD    ldy   <u0031    
         ldu   <$14,y    
         cmpu  <u004A    
         bhi   L360D     
         ldb   #$35       Subroutine stack overflow error
         lbra  L39FB     

L360D    stx   ,--u      
         stu   <$14,y    
         stu   <u0046    
         addd  <u005E    
         tfr   d,x       
         rts             

L3619    ldy   <u0031    
         cmpy  <$14,y    
         bhi   L3627     
         ldb   #$36       Subroutine stack underflow error
         lbra  L39FB     

L3627    ldu   <$14,y    
         ldx   ,u++      
         stu   <$14,y    
         stu   <u0046    
         rts             

L3632    ldd   ,x        
         cmpa  #$1E      
         beq   L366D     
         jsr   <u0016    
         ldd   ,x        
         IFNE  H6309
         lsld            
         lsld            
         ELSE            
         lslb            
         rola            
         lslb            
         rola            
         ENDC            
         addd  #$0002    
         leau  d,x       
         pshs  u         
         ldd   1,y       
         ble   L366B     
         cmpd  ,x++      
         bhi   L366B     
         subd  #$0001    
         IFNE  H6309
         lsld            
         lsld            
         ELSE            
         lslb            
         rola            
         lslb            
         rola            
         ENDC            
         addd  #$0001    
         ldd   d,x       
* 6809 - Change to PSHS B/PULS X,B
         pshs  d         
         ldb   ,x        
         cmpb  #$22      
         puls  x,d       
         beq   L35FD     
         addd  <u005E    
         tfr   d,x       
L366A    rts             

L366B    puls  pc,x      

L366D    ldu   <u0031    
         cmpb  #$20      
         bne   L3682     
         ldd   2,x       
         addd  <u005E    
         std   <$11,u    
         lda   #$01      
         sta   <$13,u    
         leax  5,x       
         rts             

L3682    clr   <$13,u    
         leax  2,x       
         rts             

L3688    bsr   L36A6     
         ldb   #%00001011 Read/Write/Public Read
         os9   I$Create   Create the file
         bra   L3696     

L3691    bsr   L36A6     
         os9   I$Open    
L3696    lbcs  L39FB     
         puls  u,b       
         cmpb  #$01      
         bne   L36A2     
         clr   ,u+       
L36A2    sta   ,u        
         puls  pc,x      

L36A6    leax  1,x       
         lbsr  L3779     
         leax  1,x       
         jsr   <u0016    
         lda   #$03      
         cmpb  #$4A      
         bne   L36B7     
         lda   ,x++      
L36B7    ldu   3,s       
         stx   3,s       
         ldx   1,y       
         jmp   ,u        

L36BF    lbsr  L37B6     
         jsr   <u0016    
         ldb   #$0E      
         lbsr  L3230     
         lbcs  L39FD     
         rts             

* Input prompt?
L36CE    fcc   '? '      
         fcb   $ff       

* Illegal input error message
L36D1    fcc   '** Input error - reenter **'
         fcb   $0d,$ff   

L36EE    lda   <u002E    
         lbsr  L37B6     
         lda   #$2C      
         sta   <u00DD    
         pshs  x         
L36F9    ldx   ,s        
         ldb   ,x        
         cmpb  #$90      
         bne   L3709     
         jsr   <u0016    
         pshs  x         
         ldx   1,y       
         bra   L370E     

L3709    pshs  x         
         leax  <L36CE,pc  Point to '? '
L370E    bsr   L375F     
         puls  x         
         lda   <u007F    
         cmpa  <u002E    
         bne   L371C     
         lda   <u002D    
         sta   <u007F    
L371C    ldb   #$06      
L371E    bsr   L3230     
         bcc   L3730     
         cmpb  #$03      
         lbne  L39FD     
         lbsr  L3A23     
         clr   <u0036     Clear out error code
         bra   L36F9     

L3730    bsr   L3743     
         bcc   L373B     
         leax  <L36D1,pc  Print 'Input error re-enter'
         bsr   L375F     
         bra   L36F9     

L373B    ldb   ,x+       
         cmpb  #$4B      
         beq   L3730     
         puls  pc,d      

L3743    bsr   L3779     
         ldb   ,s        
         addb  #$07      
         ldy   <u0046    
         bsr   L3230     
         lbcc  L353D     
         lda   ,s        
L3755    cmpa  #$04      
         bcs   L375B     
         leas  2,s       
L375B    leas  3,s       
         coma            
         rts             

L375F    pshs  y         
         leas  -6,s      
         leay  ,s        
         stx   1,y       
         ldd   <u0080    
         std   <u0082    
         ldb   #$05      
         bsr   L3230     
         clrb            
         bsr   L3230      call L5084, function 2, sub-function 0 (B)
         leas  6,s       
         puls  pc,y      

L3230    jsr   <u002A     Use module header jump vector #6
         fcb   $02        Function code

L3779    lda   ,x+       
         cmpa  #$0E      
         bne   L3783     
         jsr   <u0016    
         bra   L37A8     

L3783    suba  #$80      
         cmpa  #$04      
         blo   L379E     
         beq   L3790     
         lbsr  L3224     
         bra   L37A8     

L3790    ldd   ,x++      
         addd  <u0066    
         tfr   d,u       
         ldd   2,u       
         std   <u003E    
         ldd   ,u        
         bra   L37A0     

L379E    ldd   ,x++      
L37A0    addd  <u0031    
         tfr   d,u       
         lda   -3,x      
         suba  #$80      
L37A8    puls  y         
         cmpa  #$04      
         blo   L37B2     
         pshs  u         
         ldu   <u003E    
L37B2    pshs  u,a       
         jmp   ,y        

L37B6    ldb   ,x        
         cmpb  #$54      
         bne   L37C8     
         leax  1,x       
         jsr   <u0016    
         cmpb  #$4B      
         beq   L37C6     
         leax  -1,x      
L37C6    lda   2,y       
L37C8    sta   <u007F    
         rts             

L37CB    ldb   ,x        
         cmpb  #$54      
         bne   L37F5     
         bsr   L37B6     
         clr   <u00DD    
         cmpb  #$4B      
         bne   L37DB     
         leax  -1,x      
L37DB    ldb   #$06       Call L5084, function 2, sub-function 6 (B)
         bsr   L3230      (Do ReadLn into temp buff, max of 256 bytes)
         bcc   L37EE      No error in ReadLn, skip ahead
         cmpb  #E$PrcAbt  ??? Process aborted error?
         beq   L37DB      Yes, try to do ReadLn again
L37E6    lbra  L39FD     

L37E9    lbsr  L3743     
         bcs   L37E6     
L37EE    ldb   ,x+       
         cmpb  #$4B      
         beq   L37E9     
         rts             

L37F5    bsr   L384F     
         beq   L3832     
L37F9    bsr   L3802     
         ldb   ,x+       
         cmpb  #$4B      
         beq   L37F9     
         rts             

L3802    lbsr  L3779     
         bsr   L3834     
         lda   ,s        
         bne   L380C     
         inca            
L380C    cmpa  ,y        
         lbeq  L353D     
         cmpa  #$02      
         blo   L381C     
         beq   L3828     
L3818    ldb   #$47       Illegal Expression Type
         bra   L383C     

L381C    lda   ,y         Get var type
         cmpa  #$02       Real #?
         bne   L3818      No, exit with Illegal Expression Type erro
         bsr   L3227      Call FIX (REAL to INT) routine
         lbra  L353D     

L3227    jsr   <u0027    
         fcb   $0c       
L322A    jsr   <u0027    
         fcb   $0e       

L3828    cmpa  ,y        
         bcs   L3818     
         bsr   L322A     
         lbra  L353D     

L3832    leax  1,x       
L3834    pshs  x         
         ldx   <u0039    
         bne   L383F     
         ldb   #$4F       Missing Data Statement error
L383C    lbra  L39FB     

L383F    jsr   <u0016    
         cmpb  #$4B      
         beq   L384B     
         ldd   ,x        
         addd  <u005E    
         tfr   d,x       
L384B    stx   <u0039    
         puls  pc,x      

L384F    cmpb  #$3F      
         beq   L3855     
         cmpb  #$3E      
L3855    rts             

L3856    lda   <u002E    
         lbsr  L37B6     
         ldd   <u0080    
         std   <u0082    
         ldb   ,x+       
         cmpb  #$49      
         beq   L38A3     
L3865    bsr   L384F     
         beq   L388B     
L3869    cmpb  #$4B      
         beq   L387F     
         cmpb  #$51      
         beq   L3883     
         leax  -1,x      
         jsr   <u0016    
         ldb   ,y        
         addb  #$01      
         bsr   L389B     
         ldb   -1,x      
         bra   L3865     

L387F    ldb   #$0D      
         bsr   L389B     
L3883    ldb   ,x+       
         bsr   L384F     
         bne   L3869     
         bra   L388F     

L388B    ldb   #$0C       L5084, function 2, sub-function C
         bsr   L389B      (WritLn a Carriage return)

L388F    clrb             L5084, function 2, sub-function 0
         bsr   L389B      (WritLn the temp buffer)
         lda   <u00DE    
         clr   <u00DE    
         tsta            
         bne   L38A0     
L389A    rts             

L389B    lbsr  L3230      Call <u002A, function 2
         bcc   L389A      If no error, return
L38A0    lbra  L39FD      Error from WritLn, report it

L38A3    jsr   <u0016    
         ldd   <u004A    
         std   <u008E    
         std   <u008C    
         ldu   <u0046    
         pshs  u,d       
         clr   <u0094    
         ldd   <u0048    
         std   <u004A    
L38B5    ldb   -1,x      
         bsr   L384F     
         beq   L38D7     
         ldb   ,x+       
         bsr   L384F     
         beq   L38D2     
         leax  -1,x      
         ldb   #$11      
         lbsr  L3230     
         bcc   L38B5     
         puls  u,d       
         std   <u004A    
         stu   <u0046    
         bra   L38A0     

L38D2    leay  <L388F,pc  Point to routine
         bra   L38DA     

L38D7    leay  <L388B,pc  Point to routine
L38DA    puls  u,d       
         std   <u004A    
         stu   <u0046    
         jmp   ,y        

L38E2    lda   <u002E    
         lbsr  L37B6     
         ldu   <u0080    
         stu   <u0082    
         ldb   ,x+       
         lbsr  L384F     
         beq   L3914     
         cmpb  #$4B      
         beq   L3902     
         leax  -1,x      
         bra   L3902     

L38FA    clra            
         ldb   #$12      
         lbsr  L3230     
         bcs   L38A0     
L3902    jsr   <u0016    
         ldb   ,y        
         addb  #$01      
         lbsr  L3230     
         bcs   L38A0     
         ldb   -$01,x    
         lbsr  L384F     
         bne   L38FA     
L3914    lbra  L388B     

L3917    bsr   L392A     
         os9   I$Read    
         bra   L3923     

L391E    bsr   L392A     
         os9   I$Write   
L3923    leax  ,u        
         bcc   L3949     
L3927    lbra  L39FB     

L392A    lbsr  L37B6     
         lbsr  L3779     
         leau  ,x        
         puls  a         
         cmpa  #$04      
         bhs   L3943     
         leax  >L3B5B,pc  Point to 4 entry, 1 byte table
         ldb   a,x       
         clra            
         tfr   d,y        Y=table entry
         bra   L3945     

L3943    puls  y         
L3945    puls  x         
         lda   <u007F    
L3949    rts             

L394A    lbsr  L37B6     
         os9   I$Close    Close path
         bcs   L3927      Error,
         cmpb  #$4B      
         beq   L394A     
         rts             

L3957    ldb   ,x+       
         cmpb  #';       
         beq   L3967     
         ldu   <u002F     Get ptr to current procedure
         ldd   $13,u     
L3962    addd  <u005E    
         std   <u0039    
         rts             

L3967    ldd   ,x        
         addd  #$0001    
         leax  3,x       
         bra   L3962     

L3970    jsr   <u0016    
         pshs  x         
         ldx   1,y        Get ptr to full pathlist
         os9   I$Delete   Delete file
L3979    bcs   L3927      Error, deal with it
         puls  pc,x       Restore X & return

L397D    jsr   <u0016    
         lda   #READ.     Open directory in Read mode
L3981    pshs  x          Preserve X
         ldx   1,y        Get ptr to full path list
         os9   I$ChgDir   Change directory
         bra   L3979     

L398A    jsr   <u0016    
         lda   #EXEC.     Execution directory
         bra   L3981      Go change execution directory

L3990    lbsr  L3779     
         ldy   <u0046    
         leay  -6,y      
         ldb   <u007F    
         clra            
         std   1,y       
         lbra  L353D     

L39A0    jsr   <u0016    
         ldy   1,y        Get what will be param area ptr
         pshs  u,y,x     
         bsr   L320C     
         puls  u,y,x     
         bsr   L39E0      Set regs for chain to SHELL
         sts   <u00B1     Save stack ptr
         lds   <u0080     Get other stack ptr
         os9   F$Chain    Chain to other program
         lds   <u00B1     Chain obviously didn't work, get old SP back
         bra   L39FB      Process error code

L320C    jsr   <u001B    
         fcb   $0e       

L39BC    jsr   <u0016    
         pshs  u,x       
         ldy   1,y       
         bsr   L39E0      Do stuff & point X to 'shell'
         os9   F$Fork     Fork a shell
         bcs   L39FB      If error, go to error routine
         pshs  a          Save process #
L39CC    os9   F$Wait     Wait until child process is done
         cmpa  ,s         Got wakeup signal, was it our child?
         bne   L39CC      No, keep waiting
         leas  1,s        Yes, eat process # off of stack
         tstb             Error?
         bne   L39FB      Yes, go to error routine
         puls  pc,u,x     No, restore regs & return

L39DA    fcc   'SHELL'   
         fcb   C$CR      

* Entry: Y=Ptr to parameter area
L39E0    ldx   <u0048    
         lda   #C$CR     
         sta   -1,x      
* Should be SUBR y,x / TFR y,u / TFR x,y / LEAX <L39DA,pc / clrd / RTS
         tfr   x,d       
         leax  <L39DA,pc  Point to 'Shell'
         leau  ,y         Point U to parameter area
         pshs  y         
         subd  ,s++      
         tfr   d,y        Move param area size to Y
         clra             Any language/type
         clrb             Data area size to 0 pages
         rts             

L39F7    jsr   <u0016    
         ldb   2,y       
* Error routine from forking a shell?
L39FB    stb   <u0036     Save error code
L39FD    ldu   <u0031    
         beq   L3A1B     
         tst   <$13,u    
         beq   L3A14     
         lds   5,u       
         ldx   <$11,u    
         ldd   <$14,u    
         std   <u0046    
         lbra  L3371     

L3A14    bsr   L3A23     
         bsr   L3A73     
         lbra  L1CC7     

* Entry: B=Error code
L3A1B    lbsr  L1CC1      Print error message
         lbra  L1CC7     

L3A21    fcb   $0E        Display Alpha code (for VDGInt screen)
         fcb   $ff        String terminator

L3A23    leax  <L3A21,pc  Point to force alpha string code
         lbsr  L375F      Go print it out to shut off any VDGInt gfx screen
         ldx   <u005C    
         leay  ,x        
         bsr   L3218     
         clr   <u0074    
         lbsr  L3236     
         ldb   <u0036     Get error code
         lbsr  L1CC1      Print error message
         jsr   <u001B     Call function & return from there
         fcb   $18       

* BASE 0
L3A3D    clrb             Save 0 in <42, incx, return
         bra   L3A42     

* BASE 1
L3A40    ldb   #1         Save 1 in <42, incx, return
L3A42    clra            
         std   <u0042    
         leax  1,x       
         rts             

L3218    jsr   <u001B    
         fcb   $10       

* REM/TRON/TROFF/PAUSE/RTS
* Skip # bytes used up by REM text
L3A48    ldb   ,x+        Get # bytes to skip ahead
         abx              Point X to next instruction
         rts             

L3A4E    exg   x,pc       Jump to routine pointed to by X
         rts              If EXG X,PC done again, return from here

L3A51    leay  ,x        
         bsr   L3218     
         leax  ,y        
         rts             

L3A59    ldb   #$33       Line with compiler error
         bra   L39FB     

L3A5D    lda   #$01      
         bra   L3A62     

L3A61    clra            
L3A62    ldu   <u0031    
         sta   1,u       
         leax  1,x       
         rts             

L3A69    lda   <u0034     Get signal flags
         bita  #$01       LSb set?
         bne   L3A89      Yes, exit
         ora   #$01       force it on
         bra   L3A7B     

L3A73    lda   <u0034     Get signal flags
         bita  #$01       Least sig set?
         beq   L3A89      Yes, return
         anda  #$FE       Clear least sig
L3A7B    sta   <u0034     Save modified copy
         ldd   <u0017     Swap JMP ptrs between L3C32 & L3D41
         pshs  d         
         ldd   <u0019    
         std   <u0017    
         puls  d         
         std   <u0019    
L3A89    rts             

L3212    jsr   <u001B     Verify/Insert module into workspace
         fcb   $00       

* Copy DIM'd array
L3224    jsr   <u0027    
         fcb   $02       

L35BB    bsr   L3224     
         lbra  L352F     

* Entry: U=source ptr of copy (or L3224 generates U - Look up in string pool)
L3A8A    bsr   L3224     
         pshs  x         
         ldb   <u00CF    
         cmpb  #$A0      
         beq   L3AB6     
         ldy   <u0048     Get destination ptr for copy
         ldx   <u003E     Get max size of copy
L3A9A    lda   ,u+        Get byte
         leax  -1,x       Bump counter down
         beq   L3AA8      Finished, skip ahead
         sta   ,y+        Save char
         cmpa  #$FF       String terminator?
         bne   L3A9A      No, keep copying
         lda   ,--y       Yes, get last char before terminator
L3AA8    ora   #$80       Set hi bit on last char
         sta   ,y         Save it out
         ldy   <u0048    
         bsr   L3212     
         bcs   L3AF4     
         leau  ,x        
L3AB6    ldd   ,u        
         bne   L3AC8     
         ldy   <u00D2    
         leay  3,y       
         bsr   L3212     
         bcs   L3AF4     
         ldd   ,x        
         std   ,u        
L3AC8    ldx   ,s        
         std   ,s        
         ldu   <u0031    
         lda   <u0034     Get flags
         sta   ,u         Save them
         ldb   <u0043    
         stb   2,u       
         ldd   <u004A     Get ptr to 1st free byte in I-code workspace
         std   $D,u       Save it
         ldd   <u0040     Get ptr to end of parm packets being passed
         std   $F,u      
         ldd   <u0039    
         std   9,u       
         bsr   L3B5F     
         stx   $B,u      
         puls  x          Get ptr to module to be called
         lda   M$Type,x   Get module type/language
         beq   L3B23      If 0 (un-packed BASIC09), skip ahead
         cmpa  #$22       Is it a packed RUNB subroutine module?
         beq   L3B23      Yes, skip ahead
         cmpa  #$21       Is it an ML subroutine module?
         beq   L3AF9      Yes, skip ahead
L3AF4    ldb   #$2B       If none of the above, Unknown Procedure Error
L3AF6    lbra  L39FB     

* ML subroutine call goes here
* Entry: X=Ptr to ML subroutine module to be called
L3AF9    ldd   5,u       
         pshs  d         
         sts   5,u        Save old stack ptr
         leas  ,y         Point stack to all the ptr/size packets for parms
         ldd   <u0040     Get ptr to end of parm packets @ Y
* 6309: Change PSHS/SUBD to SUBR Y,D
         IFNE  H6309
         subr  y,d        Calc size of all parm packets being sent
         lsrd             /4 to get # of parms being sent
         lsrd            
         ELSE            
         pshs  y          Put start of parms packets ptr on stack
         subd  ,s++       Calculate size of all parm packets being sent
         lsra             Divide by 4 (to get # parms being sent)
         rorb            
         lsra            
         rorb            
         ENDC            
         pshs  d          Preserve # parms waiting on stack
         ldd   M$Exec,x   Get execution offset
* USELESS-ROUTINE CHECKS FOR LINE WITH COMPILER ERROR & POSSIBLE STACK OVERFLOW
* BUT IT NEVER GETS CALLED - UNLESS MEANT FOR SUBROUTINE MODULE
* MAYBE IT SHOULD CALL ROUTINE, MAY BE PROBLEM WITH SOME CRASHES (LIKE EMULATE)
         leay  >L32DD,pc  Point to routine
         jsr   d,x        Call ML subroutine module
         ldu   <u0031     Get ptr to U block of data from above
         lds   5,u        Get old stack ptr back
         puls  x          Get original 5,u value
         stx   5,u        Save it back
         bcc   L3B3C      If no error, resume program
         bra   L3AF6      Notify user of error from ML subroutine

* BASIC09 or RUNB module subroutine call goes here
L3B23    lbsr  L3A73      If line with compiler err flg set, swap 17/19 vectors
         lda   <u0034     Get flags
         anda  #$7F       Mask out pending signal flag
         sta   <u0034     Save flags back
         lbsr  L32DD      Go check for line with compiler error/stack ovrflw
         lda   ,u        
         bita  #$01      
         beq   L3B3C     
         lbsr  L3A69     
         lda   ,u        
         sta   <u0034    
L3B3C    ldd   $D,u      
         std   <u004A    
         ldd   $F,u      
         std   <u0040     Save end of parm packets ptr
         ldd   9,u       
         std   <u0039    
         ldb   2,u       
         sex             
         std   <u0042    
         ldx   $3,u      
         lbsr  L3351     
         ldx   $B,u      
         ldd   <u0044    
         subd  <u004A     Subtract ptr to next free byte in workspace
         std   <u000C     Save # bytes free for user
         rts             

* Table of size of variables
L3B5B    fcb   1          Byte    (type 0)
         fcb   2          Integer (type 1)
         fcb   5          Real    (type 2)
         fcb   1          Boolean (type 3)

* Vector from $31E8
* Entry: U=
*        X=
L3B5F    pshs  u         
         ldb   ,x+       
         clra             Set flag on stack to 0
         pshs  x,a       
         cmpb  #$4D      
         bne   L3BE1     
         leay  ,s         Point Y to flag byte on stack
L3B6C    pshs  y          Save ptr to flag byte
         ldb   ,x        
         cmpb  #$0E      
         beq   L3BA3     
         jsr   <u0016    
         leax  -1,x      
         cmpa  #2         Real variable?
         beq   L3B86      Yes, skip ahead
         cmpa  #4         String/complex type variable?
         beq   L3B93      Yes, set up string stuff
         ldd   1,y        Byte/Integer/Boolean - Get value from var packet
         std   4,y        Duplicate it later in var packet
         lda   ,y         Get variable type again
L3B86    ldb   #6         Get size of var packet
         leau  <L3B5B,pc  Point to var size table
         subb  a,u        Calculate ptr to beginning of actual var value
         leau  b,y        Bump U to point to first byte of actual var value
         stu   <u0046     ??? Save some sort of variable ptr?
         bra   L3BA7     

* String being passed?
L3B93    ldu   1,y        Get ptr to actual string data
         ldd   <u0048    
         subd  <u004A     Subtract ptr to next free byte in workspace
         std   <u003E     Save result as ptr to string/complex
         ldd   <u0048    
         std   <u004A     Save new ptr to next free byte in workspace
         lda   #4         Variable type=String/complex
         bra   L3BA7     

L3BA3    leax  1,x       
         jsr   <u0016    
L3BA7    puls  y          Get ptr to flag byte
         inc   ,y         Bump up flag
         cmpa  #4         Variable type numeric?
         blo   L3BB3      Yes, skip ahead
         pshs  u          String/complex, save var data ptr
         ldu   <u003E     Get some ptr
L3BB3    pshs  u,a        Save variable ptr, variable type
         ldb   ,x+       
         cmpb  #$4B      
         beq   L3B6C     
         leax  1,x       
         stx   1,y       
         leax  <L3B5B,pc  Point to 4 entry, 1 byte table
         ldu   <u0046    
         stu   <u0040     Save ptr to end of parm packets
L3BC6    puls  b          Get variable type
         cmpb  #4         Is it a numeric type?
         blo   L3BD0      Yes, go process
         puls  d          No, get variable ptr again
         bra   L3BD3      Go handle string/complex

L3BD0    ldb   b,x        Get size of variable
         clra             D=size
L3BD3    std   ,--u       Save size of variable into parm area
         puls  d          Get ptr to variable
         std   ,--u       Save ptr to variable
         dec   ,y         Any vars left to pass?
         bne   L3BC6      ??? Yes, continue building parm area
         leay  ,u         ??? No, point Y to parm area
         bra   L3BE7     

L3BE1    ldy   <u0046    
         sty   <u0040    
L3BE7    tfr   y,d       
         subd  <u004A    
         lblo  L3302     
         std   <u000C    
         puls  pc,u,x,a  

L3BF3    jsr   <u0016    
         ldy   1,y       
         pshs  x         
         bsr   L3215     
         puls  pc,x      

L3215    jsr   <u001B    
         fcb   $0a       

L3BFF    bsr   L322D     
         leax  >L323F,pc  Point to huge jump table
         stx   <u000E     Save as address somewhere
         rts             

L322D    jsr   <u0027     Use module header jump vector #5
         fcb   $00        Function code

L3C09    pshs  x,d        Preserve regs
         ldb   [<4,s]     Get function code
         leax  <L3C19,pc  Point to function code jump table
         ldd   b,x        Get offset
         leax  d,x        Point X to subroutine
         stx   4,s        Save overtop original PC
         puls  pc,x,d     Restore regs & jump to function code routine

L3C19    fdb   L5050-L3C19 0
         fdb   L3D80-L3C19 2 Copy DIM'd arrary to temp var pool
         fdb   L3FB1-L3C19 4 Real # add
         fdb   L40D3-L3C19 6 Real # multiply
         fdb   L4234-L3C19 8 Real # divide
         fdb   L4449-L3C19 A Set flags for Real comparison
         fdb   L453B-L3C19 C FIX (Round & convert REAL to INTEGER)
         fdb   L4503-L3C19 E FLOAT (Convert INTEGER/BYTE to REAL)

* Function routines
* Negative offsets from base of table @ L3CB5
         fdb   L4F1E-L3CB5 MID$
         fdb   L4EE2-L3CB5 LEFT$
         fdb   L4EFA-L3CB5 RIGHT$
         fdb   L4EC7-L3CB5 CHR$
         fdb   L4FA4-L3CB5 STR$ (for INTEGER)
         fdb   L4FA8-L3CB5 STR$ (for REAL)
         fdb   L4FF8-L3CB5 DATE$
         fdb   L4FCC-L3CB5 TAB
         fdb   L453B-L3CB5 FIX (round & convert REAL to INTEGER)
         fdb   L45A0-L3CB5 ??? (calls fix but eats 1 var 1st)
         fdb   L45A7-L3CB5 ??? (calls fix but eats 2 vars 1st)
         fdb   L4503-L3CB5 FLOAT (convert INTEGER to REAL)
         fdb   L4534-L3CB5 ??? (calls float though)
         fdb   L4395-L3CB5 Byte - LNOT
         fdb   L3EA8-L3CB5 Integer - Negate a number
         fdb   L3FA4-L3CB5 Real - Negate a number
         fdb   L4380-L3CB5 Byte - LAND
         fdb   L4386-L3CB5 Byte - LOR
         fdb   L438C-L3CB5 Byte - LXOR
         fdb   L43FF-L3CB5 > : Integer/Byte relational
         fdb   L4443-L3CB5 > : Real relational
         fdb   L43D1-L3CB5 > : String relational
         fdb   L43D7-L3CB5 < : Integer/Byte relational
         fdb   L4425-L3CB5 < : Real relational
         fdb   L43B3-L3CB5 < : String relational
         fdb   L43E7-L3CB5 <> or >< : Integer/Byte relational
         fdb   L4431-L3CB5 <> or >< : Real relational
         fdb   L43C5-L3CB5 <> or >< : String relational
         fdb   L441D-L3CB5 <> or >< : Boolean relational
         fdb   L43EF-L3CB5 = : Integer/Byte relational
         fdb   L4437-L3CB5 = : Real relational
         fdb   L43BF-L3CB5 = : String relational
         fdb   L4415-L3CB5 = : Boolean relational
         fdb   L43F7-L3CB5 >= or => : Integer/Byte relational
         fdb   L443D-L3CB5 >= or => : Real relational
         fdb   L43CB-L3CB5 >= or => : String Relational
         fdb   L43DF-L3CB5 <= or =< : Integer/Byte relational
         fdb   L442B-L3CB5 <= or =< : Real relational
         fdb   L43B9-L3CB5 <= or =< : String Relational
         fdb   L3EAF-L3CB5 Integer - Add
         fdb   L3FB1-L3CB5 Real - Add
         fdb   L44E5-L3CB5 String add
         fdb   L3EB8-L3CB5 Integer - Subtract
         fdb   L3FAB-L3CB5 Real - Subtract
         fdb   L3EC1-L3CB5 Integer - Multiply
         fdb   L40CC-L3CB5 Real Multiply
         fdb   L3F1C-L3CB5 Integer - Divide
         fdb   L422D-L3CB5 Real Divide
         fdb   L4336-L3CB5 Real Exponent\ Probably for both ^ & **
         fdb   L4336-L3CB5 Real Exponent/ Hard coding for 0^x & x^1
         fdb   L3D6C-L3CB5 DIM
         fdb   L3D6C-L3CB5 DIM
         fdb   L3D6C-L3CB5 DIM
         fdb   L3D6C-L3CB5 DIM
         fdb   L3D72-L3CB5 PARAM
         fdb   L3D72-L3CB5 PARAM
         fdb   L3D72-L3CB5 PARAM
         fdb   L3D72-L3CB5 PARAM
         fdb   $0000      Unused function entries (maybe use for LONGINT?)
         fdb   $0000     
         fdb   $0000     
         fdb   $0000     
         fdb   $0000     
         fdb   $0000     

* Jump table (base is L3CB5)
L3CB5    fdb   L3E81-L3CB5 Copy BYTE var to temp pool
         fdb   L3E97-L3CB5 Copy INTEGER var to temp pool
         fdb   L3F8D-L3CB5 Copy REAL var to temp pool
         fdb   L436E-L3CB5 Copy BOOLEAN var to temp pool
         fdb   L44C7-L3CB5 Copy STRING var to temp pool (max 256 chars)
         fdb   L3D59-L3CB5 Copy DIM array
         fdb   L3D59-L3CB5 Copy DIM array
         fdb   L3D59-L3CB5 Copy DIM array
         fdb   L3D59-L3CB5 Copy DIM array
         fdb   L3D68-L3CB5 Copy PARAM array  
         fdb   L3D68-L3CB5 Copy PARAM array
         fdb   L3D68-L3CB5 Copy PARAM array
         fdb   L3D68-L3CB5 Copy PARAM array
         fdb   L3E7D-L3CB5 Copy BYTE constant to temp pool - CHECK IF USED
         fdb   L3E93-L3CB5 Copy INTEGER constant to temp pool
         fdb   L3F7C-L3CB5 Copy REAL constant to temp pool
         fdb   L4497-L3CB5 Copy STRING constant to temp pool
         fdb   L3E93-L3CB5 Copy INTEGER constant to temp pool
         fdb   L473F-L3CB5 ADDR
         fdb   L473F-L3CB5 ADDR
         fdb   L4751-L3CB5 SIZE
         fdb   L4751-L3CB5 SIZE
         fdb   L45F1-L3CB5 POS
         fdb   L45E3-L3CB5 ERR
         fdb   L46A2-L3CB5 MOD for Integer #'s
         fdb   L46AA-L3CB5 MOD for Real #'s
         fdb   L4DDA-L3CB5 RND
         fdb   L4B03-L3CB5 PI
         fdb   L4F77-L3CB5 SUBSTR
         fdb   L45D5-L3CB5 SGN for Integer
         fdb   L45C7-L3CB5 SGN for Real
         fdb   L4A82-L3CB5 Transcendental ???
         fdb   L4AAF-L3CB5 Transcendental ???
         fdb   L4ABD-L3CB5 Transcendental ???
         fdb   L4927-L3CB5 Transcendental ???
         fdb   L4968-L3CB5 Transcendental ???
         fdb   L4A03-L3CB5 Transcendental ???
         fdb   L4864-L3CB5 EXP
         fdb   L45B5-L3CB5 ABS for Integer #'s
         fdb   L45AE-L3CB5 ABS for Real #'s
         fdb   L47AB-L3CB5 LOG
         fdb   L479F-L3CB5 LOG10
         fdb   L45F5-L3CB5 SQR \ Square root
         fdb   L45F5-L3CB5 SQRT/
         fdb   L4503-L3CB5 FLOAT
         fdb   L46C6-L3CB5 INT (of real #)
         fdb   L45F0-L3CB5 ??? RTS
         fdb   L453B-L3CB5 FIX
         fdb   L4503-L3CB5 FLOAT
         fdb   L45F0-L3CB5 ??? RTS
         fdb   L4705-L3CB5 SQuare of integer
         fdb   L470E-L3CB5 SQuare of real
         fdb   L45C0-L3CB5 PEEK
         fdb   L477A-L3CB5 LNOT of Integer
         fdb   L471F-L3CB5 VAL  
         fdb   L4EAB-L3CB5 LEN
         fdb   L4EBD-L3CB5 ASC
         fdb   L477F-L3CB5 LAND of Integer
         fdb   L478F-L3CB5 LOR of Integer
         fdb   L4787-L3CB5 LXOR of Integer
         fdb   L4769-L3CB5 Force Boolean to TRUE
         fdb   L476E-L3CB5 Force Boolean to FALSE
         fdb   L5035-L3CB5 EOF
         fdb   L4F5F-L3CB5 TRIM$

* Jump table, base is L3D35
L3D35    fdb   L3E87-L3D35 Convert Byte to Int (into temp var)
         fdb   L3E9D-L3D35 Copy Int var into temp var
         fdb   L3F93-L3D35 Copy Real var into temp var
         fdb   L4374-L3D35 ??? Copy Boolean into temp var
         fdb   L44D7-L3D35 ??? Copy string to expression stack
         fdb   L44F6-L3D35 ??? Copy D&U regs into temp var type 5

L3D41    ldy   <u0046    
         ldd   <u004A    
         std   <u0048    
         bra   L3D51     

L3D4A    lslb             2 bytes per entry
         ldu   <u0010     Get ptr to jump table (could be L3CB5)
         ldd   b,u        Get offset
         jsr   d,u        Call subroutine
L3D51    ldb   ,x+        Get next byte
         bmi   L3D4A      If high bit set, need to call another subroutine
         clra             Otherwise, clear carry
         lda   ,y        
         rts             

* Copy DIM array to temp var pool
L3D59    bsr   L3D80     

* POSSIBLE MAIN ENTRY POINT FOR MATH & STRING ROUTINES
L3D5B    pshs  pc,u       Save U & PC on stack
         ldu   <u0012     Get ptr to jump table (L3D35)
         lsla             A=A*2 for 2 byte entries (note: 8 bit SIGNED)
         ldd   a,u        Get offset
         leau  d,u        Point to routine
         stu   2,s        Save over PC on stack
         puls  pc,u       Restore U & jump to routine

* Copy PARAM array to temp var pool
L3D68    bsr   L3D78     
         bra   L3D5B     

L3D6C    leas  2,s       
         lda   #$F2      
         bra   L3D82     

L3D72    leas  $02,s     
         lda   #$F6      
         bra   L3D7A     

L3D78    lda   #$89      
L3D7A    sta   <u00A3    
         clr   <u003B    
         bra   L3D86     

L3D80    lda   #$85      
L3D82    sta   <u00A3    
         sta   <u003B    
L3D86    ldd   ,x++      
         addd  <u0062    
         std   <u00D2    
         ldu   <u00D2    
         lda   ,u        
         anda  #$E0      
         sta   <u00CF    
         eora  #$80      
         sta   <u00CE    
         lda   ,u        
         anda  #$07      
         ldb   -$03,x    
         subb  <u00A3    
         pshs  d         
         lda   ,u        
         anda  #$18      
         lbeq  L3E3F     
         ldd   1,u       
         addd  <u0066    
         tfr   d,u       
         ldd   ,u        
         std   <u003C    
         lda   1,s       
         bne   L3DC4     
         lda   #$05      
         sta   ,s        
         ldd   2,u       
         std   <u003E    
         clra            
         clrb            
         bra   L3E17     

L3DC4    leay  -6,y       Make room for temp var
         clra             Force value to 0 (integer)
         clrb            
         std   1,y        Save it
         leau  4,u        Bump U up
         bra   L3DD5     

L3DCE    ldd   ,u         Get value from U
         std   1,y        Save in var space
         lbsr  L3EC1      Call Integer Multiply routine
L3DD5    ldd   7,y       
         subd  <u0042    
         cmpd  ,u++      
         blo   L3DE3     
         ldb   #$37       Subscript out of range error
         jsr   <u0024     Report it
         fcb   $06       

* Array subscript in range, process
L3DE3    addd  1,y       
         std   7,y       
         dec   1,s       
         bne   L3DCE     
* NOTE: IF FOLLOWING COMMENTS ARE ACCURATE, SHOULD USE LDA, DECA TRICK
         lda   ,s         ??? Get variable type?
         beq   L3DFF      If Byte, skip ahead
         cmpa  #$02       Real?
         blo   L3E03      No, integer, skip ahead
         beq   L3E0B      Real, skip ahead
         cmpa  #$04       String?
         blo   L3DFF      No, boolean - treat same as Byte
         ldd   ,u         String - do this
         std   <u003E    
         bra   L3E0E     

* BYTE or BOOLEAN
L3DFF    ldd   7,y        Get offset to entry in array we want
         bra   L3E07     

* INTEGER
L3E03    ldd   7,y        Get offset to entry in array we want
         lslb             x2 since Integers are 2 bytes/entry
         rola            
L3E07    leay  $C,y      
         bra   L3E17     

* REAL
L3E0B    ldd   #5         x5 since Real's are 5 bytes/entry
L3E0E    std   1,y        Save for Integer multiply routine
         lbsr  L3EC1      Go do Integer multiply
         ldd   1,y        Get offset to entry we want
         leay  6,y        Eat temp var.
L3E17    tst   <u00CE    
         bne   L3E33     
         pshs  d         
         ldd   <u003C    
         addd  <u0031    
         cmpd  <u0040    
         bhs   L3E78     
         tfr   d,u       
         puls  d         
         cmpd  2,u       
         bhi   L3E78     
         addd  ,u        
         bra   L3E73     

L3E33    addd  <u003C    
         tst   <u003B    
         bne   L3E71     
L3E39    addd  1,y       
         leay  6,y        Eat temp var.
         bra   L3E73     

L3E3F    lda   ,s         ??? Get var type
         cmpa  #$04       Set CC - Is it string type?
         ldd   1,u       
         blo   L3E51      No, either numeric or boolean, skip ahead
* String or complex
         addd  <u0066    
         tfr   d,u       
         ldd   2,u       
         std   <u003E    
         ldd   ,u        
L3E51    tst   <u003B    
         beq   L3E39     
         addd  <u0031    
         tfr   d,u       
         tst   <u00CE    
         bne   L3E75     
         cmpd  <u0040    
         bhs   L3E78     
         ldd   <u003E    
         cmpd  2,u       
         blo   L3E6D     
         ldd   2,u       
         std   <u003E    
L3E6D    ldu   ,u        
         bra   L3E75     

L3E71    addd  <u0031    
L3E73    tfr   d,u       
L3E75    clra            
         puls  pc,d      

L3E78    ldb   #$38       Parameter error
         jsr   <u0024    
         fcb   $06       

* Copy Byte constant to temp pool
L3E7D    leau  ,x+       
         bra   L3E87     

* Copy Byte variable to temp pool
L3E81    ldd   ,x++       Get offset to variable we want
         addd  <u0031     Add to start of string pool address
         tfr   d,u        Move to indexable register
L3E87    ldb   ,u         Get BYTE value
         clra             Force to integer type
         leay  -6,y       Make room for new variable
         std   1,y        Save integer value
         lda   #1         Save type as integer & return
         sta   ,y        
         rts             

* Copy Integer constant to temp pool
L3E93    leau  ,x++      
         bra   L3E9D     

* Copy integer var into temp var
L3E97    ldd   ,x++       Get offset to var we want
         addd  <u0031     Add to start of variable pool
         tfr   d,u        Point U to entry
L3E9D    ldd   ,u         Get Integer
         leay  -6,y       Make room for variable
         std   1,y        Save integer
         lda   #1         Integer Type
         sta   ,y         Save it & return
         rts             

* INTEGER NEGATE (- IN FRONT OF NUMBER)
         IFNE  H6309
L3EA8    clrd             Number=0-Number (negate it)
         ELSE            
L3EA8    clra            
         clrb            
         ENDC            
         subd  1,y       
         std   1,y        Save & return
         rts             

* INTEGER ADD
L3EAF    ldd   7,y        Get integer
         addd  1,y        Add to temp copy of 2nd #
         leay  6,y        Eat temp
         std   1,y        Save added result & return
         rts             

* INTEGER SUBTRACT
L3EB8    ldd   7,y        Get integer
         subd  1,y        Subtract 2nd #
         leay  6,y        Eat temp copy
         std   1,y        Save result & return
         rts             

* INTEGER MULTIPLY
         IFNE  H6309
L3EC1    ldd   1,y        Get temp var integer
         muld  7,y        Multiply by answer integer
         stw   7,y        Save 16 bit wrapped result
         leay  6,y        Eat temp var
         rts             
         ELSE            
L3EC1    ldd   7,y        Get value that result will go into
         beq   L3EFA      *0, leave result as 0
         cmpd  #2         Special case: times 2?
         bne   L3ECF      No, check other number
         ldd   1,y        Get 2nd number
         bra   L3EDB      Do quick x2

L3ECF    ldd   1,y        Get 2nd number
         beq   L3EDD      *0, go save result as 0
         cmpd  #2         Special case: times 2?
         bne   L3EE1      No, go do regular multiply
         ldd   7,y        Get 1st number
L3EDB    lslb            
         rola            
L3EDD    std   7,y        Save answer
         bra   L3EFA      Eat temp var & return

L3EE1    lda   8,y        Do 16x16 bit signed multiply, MOD 65536
         mul             
         sta   3,y       
         lda   8,y       
         stb   8,y       
         ldb   1,y       
         mul             
         addb  3,y       
         lda   7,y       
         stb   7,y       
         ldb   2,y       
         mul             
         addb  7,y       
         stb   7,y       
L3EFA    leay  6,y        Eat temp var & return
         rts             
         ENDC            
* Integer MOD routine
L46A2    bsr   L3F1C      Go do integer divide
         ldd   3,y        Get "hidden" remainder
         std   1,y        Save as answer & return
         rts             

         IFNE  H6309
L3F1C    ldd   1,y        Get # to divide by
         bne   GoodDiv    <>0, go do divide
         ldb   #$2D       =0, Divide by 0 error
         jsr   <u0024     Report error
         fcb   $06       

GoodDiv  ldw   7,y        Get 16 bit signed dividend
         sexw             Sign-Extend W into Q
Positive divq  1,y        Do 32/16 bit signed division
         tstw             Answer positive?
         ble   CheckD     If <=0, skip ahead
MustPos  tsta             Is remainder positive?
         bmi   NegRem     No, have to fix sign on remainder
SaveRem  std   9,y        Save remainder for MOD
         stw   7,y        Save answer for /
         leay  6,y        Eat temp var & return
         rts             

* Negative answer comes here
CheckD   beq   CheckZ     If answer is zero, need special stuff for remainder
CheckD1  tsta             Is remainder negative?
         bmi   SaveRem    Yes, save remainder
NegRem   negd             Otherwise, negate remainder
         bra   SaveRem    Now save it & return

* Zero answer comes here - W is zero, so we can use it's parts
CheckZ   lde   7,y        Get MSB of dividend
         bpl   CheckZ1    Positive, don't change negative flag
         incf             Negative, bump flag up
CheckZ1  lde   1,y        Get MSB of divisor
         bpl   CheckZ2    If positive, leave flag alone
         incf             Negative, bump up flag
CheckZ2  cmpf  #1         If 1, then remainder must be negative
         beq   CheckZ3    It is negative, go deal with it
         clrw             Zero out answer again
         bra   MustPos   

CheckZ3  clrw             Clear out answer to 0 again
         bra   CheckD1    Go deal with sign of remainder

         ELSE            
* Calculate sign of result of Integer Divide (,y - 0=positive, FF=negative)
L3EFD    clr   ,y         Clear flag (positive result)
         ldd   7,y        Get #
         bpl   L3F0B      If positive or 0, go check other #
         nega             Force it to positive (NEGD)
         negb            
         sbca  #$00      
         std   7,y        Save positive version
         com   ,y         Set flag for negative result
L3F0B    ldd   1,y        Get other #
         bpl   L3F17      If positive or 0, go check if it is a 2
         nega             Force it to positive (NEGD)
         negb            
         sbca  #$00      
         std   1,y        Save positive version
         com   ,y         Flip negative/positive result flag
L3F17    cmpd  #2         Check if dividing by 2
         rts             

* INTEGER DIVIDE
L3F1C    bsr   L3EFD      Go force both numbers to positive, check for /2
         bne   L3F2E      Normal divide, skip ahead
         ldd   7,y        Get # to divide by 2
         beq   L3F3B      If 0, result is 0, so skip divide
         asra            
         rorb            
         std   7,y        Save result
         ldd   #$0000     Remainder=0 (No CLRD since it fries carry)
         rolb             Rotate possible remainder bit into D
         bra   L3F65      Go save remainder, fix sign & return

L3F2E    ldd   1,y        Get divisor (integer)
         bne   L3F37      <>0, skip ahead
         ldb   #$2D       =0, Divide by 0 error
         jsr   <u0024     Report error
         fcb   $06       

L3F37    ldd   7,y        Get dividend (integer)
         bne   L3F40      Have to do divide, skip ahead
L3F3B    leay  6,y        ??? Eat temp var? (divisor)
         std   3,y        Save result
         rts             

* INTEGER DIVIDE MAIN ROUTINE
* 7-8,y = Dividend (already checked for 0)
* 1-2,y = Divisor (already checked for 0)
* 3,y   = # of powers of 2 shifts to do
L3F40    tsta             Dividend>256?
         bne   L3F4B      Yes, skip ahead
         exg   a,b        Swap LSB/MSB of dividend
         std   7,y        Save it
         ldb   #8         # of powers of 2 shifts for 8 bit dividend
         bra   L3F4D     

L3F4B    ldb   #16        # of powers of 2 shifts for 16 bit dividend
L3F4D    stb   3,y        Save # shifts required
         clra            
         clrb            
* Main powers of 2 subtract loop for divide
L3F51    lsl   8,y        Multiply dividend by 2
         rol   7,y       
         rolb             Rotate into D
         rola            
         subd  1,y        Subtract that power of 2 from divisor
         bmi   L3F5F      If wraps, add it back in
         inc   8,y       
         bra   L3F61     

L3F5F    addd  1,y       
L3F61    dec   3,y        Dec # shift/subtracts left to do
         bne   L3F51      Still more, continue
L3F65    std   9,y        Save remainder
         tst   ,y         Positive result?
         bpl   L3F79      Yes, eat temp var & return
         nega             NEGD
         negb            
         sbca  #$00      
         std   9,y        Save negative remainder
         ldd   7,y        Get actual divide result
         nega             NEGD
         negb            
         sbca  #$00      
         std   7,y        Save signed result
L3F79    leay  6,y        Eat temp var & return
         rts             
         ENDC            

* Copy REAL # from X (moving X to after real number) to temp var
L3F7C    leay  -6,y       Make room for temp var
         ldb   ,x+        Get hi-byte of real value
         lda   #2         Force var type to REAL
         std   ,y         Save in temp var
         IFNE  H6309
         ldq   ,x         Copy mantissa to temp var
         stq   2,y       
         ldb   #4         Bump X up to past end of var
         abx             
         ELSE            
         ldd   ,x++       Copy rest of real # to temp var & return
         std   2,y       
         ldd   ,x++      
         std   4,y       
         ENDC            
         rts             

* Copy REAL # from variable pool (pointed to by X) into temp var
L3F8D    ldd   ,x++       Get offset into var space for REAL var
         addd  <u0031     ??? Add to base address for variable storage?
         tfr   d,u        Move ptr to U
* Copy REAL # constant from within BASIC09 (pointed to by U) into temp var
L3F93    leay  -6,y       Make room for temp var
         lda   #2         Set 1st byte to be 2
         ldb   ,u         Get 1st byte of real #
         std   ,y        
         IFNE  H6309
         ldq   1,u        Get mantissa for real #
         stq   2,y        Save in temp var
         ELSE            
         ldd   1,u        Get bytes 2&3 of real #
         std   2,y       
         ldd   3,u        Get bytes 4&5 of real #
         std   4,y       
         ENDC            
         rts              Return

* Negate for REAL #'s
         IFNE  H6309
L3FA4    eim   #1,5,y     Negate sign bit of REAL #
         ELSE            
L3FA4    lda   5,y        Get LSB of mantissa & sign bit
         eora  #$01       Reverse the sign bit
         sta   5,y        Save it back
         ENDC            
         rts              return

* Subtract for REAL #'s
         IFNE  H6309
L3FAB    eim   #1,5,y     Negate sign bit of real #
         ELSE            
L3FAB    ldb   5,y        Reverse sign bit on REAL #
         eorb  #1        
         stb   5,y       
         ENDC            

         IFNE  H6309
         use   basic09.real.add.63.asm
         ELSE            
         use   basic09.real.add.68.asm
         ENDC            

* REAL Multiply?
L40CC    bsr   L40D3      Go do REAL multiply
         bcs   L3C2C      If error, report it
         rts              Return without error

L3C2C    jsr   <u0024     Report error
         fcb   $06       

         IFNE  H6309
         use   basic09.real.mul.63.asm
         ELSE            
         use   basic09.real.mul.68.asm
         ENDC            

* Real divide entry point?
L422D    bsr   L4234     
         bcs   LErr      
L4233    rts             

LErr     jsr   <u0024    
         fcb   $06       

         IFNE  H6309
         use   basic09.real.div.63.asm
         ELSE            
         use   basic09.real.div.68.asm
         ENDC            

* Real exponent
L4336    pshs  x          Preserve X
         ldd   7,y        Is the number to be raised 0?
         beq   L4331      Yes, eat temp & return with 0 as result
         ldx   1,y        Is the exponent 0?
         bne   L434F      No, go do normal exponent calculation
         leay  6,y        Eat temp var
L4342    ldd   #$0180     Save 1 in Real # format (all #'s to the power of
         std   1,y        0 result in 1, except 0 itself, which was trapped
* Possible 6809/6309 Mod: deca/sta 3,y/sta 4,y/sta 5,y (1 byte longer/5 cyc
* faster)
         clr   3,y        above)
         clr   4,y       
         clr   5,y       
         puls  pc,x      

L434F    std   1,y       
         stx   7,y       
         ldd   9,y       
         ldx   3,y       
         std   3,y       
         stx   9,y       
         lda   $B,y      
         ldb   5,y       
         sta   5,y       
         stb   $B,y      
         puls  x         
         lbsr  L47AB     
         lbsr  L40CC      Go do real multiply
         lbra  L4864     

* Copy Boolean value into temp var
L436E    ldd   ,x++       Get offset to var from beginning of var pool
         addd  <u0031     Add to base address for vars
         tfr   d,u        Move to index reg
L4374    ldb   ,u         Get boolean value
         clra             Make into Integer type
         leay  -6,y       Make room for temp var
         std   1,y        Save boolean value
         lda   #3         Type = BOOLEAN
         sta   ,y        
         rts             

L4380    ldb   8,y        Single byte LAND
         andb  2,y       
         bra   L4390     

L4386    ldb   8,y        Single byte LOR
         orb   2,y       
         bra   L4390     

L438C    ldb   8,y        Single byte LXOR
         eorb  2,y       
L4390    leay  6,y        Eat temp var
         std   1,y        Save result in original var & return
         rts             

L4395    com   2,y        Single byte LNOT
         rts             

* Main search loop for String comparison operators
L4398    pshs  y,x       
         ldx   1,y        Get ptr to temp string?
         ldy   7,y        Get ptr to var string?
         sty   <u0048    
L43A2    lda   ,y+        Get char from temp string
         cmpa  ,x+        Same as char from var string?
         bne   L43AC      No, skip ahead
         cmpa  #$FF       EOS marker?
         bne   L43A2      No, keep comparing
L43AC    inca             Inc last char checked
         inc   -1,x       Inc last char in compare string
         cmpa  -1,x       Same as last char checked with inc????
         puls  pc,y,x    

* String compare: < (?)
L43B3    bsr   L4398      Go do string compare
         blo   L4405      If less than, result=TRUE
         bra   L4409      Else, result=False

* String compare: <= or =< (?)
L43B9    bsr   L4398     
         bls   L4405     
         bra   L4409     

* String compare: =
L43BF    bsr   L4398     
         beq   L4405     
         bra   L4409     

* String compare: <> or ><
L43C5    bsr   L4398     
         bne   L4405     
         bra   L4409     

* String compare: >= or => (?)
L43CB    bsr   L4398     
         bhs   L4405     
         bra   L4409     

* String compare: > (?)
L43D1    bsr   L4398     
         bhi   L4405     
         bra   L4409     

* For Integer/Byte compares below: Works for signed Integer as well 
*  as unsigned Byte
* Integer/Byte compare: <
L43D7    ldd   7,y       
         subd  1,y        NOTE: SUBD is faster than CMPD
         blt   L4405     
         bra   L4409     

* Integer/Byte compare: <= or =<
L43DF    ldd   7,y       
         subd  1,y       
         ble   L4405     
         bra   L4409     

* Integer/Byte compare: <> or ><
L43E7    ldd   7,y       
         subd  1,y       
         bne   L4405     
         bra   L4409     

* Integer/Byte compare: =
L43EF    ldd   7,y       
         subd  1,y       
         beq   L4405     
         bra   L4409     

* Integer/Byte compare: >= or =>
L43F7    ldd   7,y       
         subd  1,y       
         bge   L4405     
         bra   L4409     

* Integer/Byte compare: >
L43FF    ldd   7,y        Get original var
         subd  1,y        > than compare var?
         ble   L4409      No, boolean result=FALSE
L4405    ldb   #$FF       Boolean result=TRUE
         bra   L440B     

L4409    clrb             Boolean result=FALSE
L440B    clra             Clear hi byte (since result is 1 byte boolean)
         leay  6,y        Eat temp var packet
         std   1,y        Save result in original var packet
         lda   #3         Save var type as Boolean
         sta   ,y        
         rts             

* BOOLEAN = compare
L4415    ldb   8,y        Get original BOOLEAN value
         cmpb  2,y        Same as comparitive BOOLEAN value?
         beq   L4405      Yes, result=TRUE
         bra   L4409      No, result=FALSE

* BOOLEAN <> or >< compare
L441D    ldb   8,y        Get original BOOLEAN value
         cmpb  2,y        Same as comparitive BOOLEAN value?
         bne   L4405      No, result=TRUE
         bra   L4409      Yes, result=FALSE

* Real < compare
L4425    bsr   L4449      Go compute flags between real #'s
         blt   L4405      If < then, result=TRUE
         bra   L4409      Otherwise, result=FALSE

* Real <= or =< compare
L442B    bsr   L4449     
         ble   L4405     
         bra   L4409     

* Real <> or >< compare
L4431    bsr   L4449     
         bne   L4405     
         bra   L4409     

* Real = compare
L4437    bsr   L4449     
         beq   L4405     
         bra   L4409     

* Real >= or => compare
L443D    bsr   L4449     
         bge   L4405     
         bra   L4409     

* Real > compare
L4443    bsr   L4449     
         bgt   L4405     
         bra   L4409     

* Set flags for Real comparison
L4449    pshs  y          Preserve Y
         andcc  #$F0       Clear out Negative, Zero, Overflow & Carry bits
         lda   8,y        Is original REAL var=0?
         bne   L4461      No, skip ahead
         lda   2,y        Is comparitive REAL var=0?
         beq   L445F      Yes, they are equal so return
L4455    lda   5,y        Get last byte of Mantissa with sign bit
L4457    anda  #$01       Ditch everything but sign bit
         bne   L445F      Sign bit set, negative value, return
L445B    andcc  #$F0       Clear out Negative, Zero, Overflow & carry bits
         orcc  #%00001000 Set Negative flag
L445F    puls  pc,y      

L4461    lda   2,y        Is comparitive REAL var=0?
         bne   L446B      No, go deal with whole exponent/mantissa mess
         lda   $B,y       Get sign bit of original var
         eora  #$01       Invert sign flag
         bra   L4457      Go set Negative bit appropriately

* No zero values in REAL compare-deal with exponent & mantissa
L446B    lda   $B,y       Get sign bit byte from original var
         eora  5,y        Calculate resulting sign from it with temp var
         anda  #$01       Only keep sign bit
         bne   L4455      One of the #'s is neg, other pos, go deal with it
         leau  6,y        Both same sign, point U to original var
         lda   5,y        Get sign byte from temp var
         anda  #$01       Just keep sign bit
         beq   L447D      If positive, skip ahead
         exg   u,y        If negative, swap ptrs to the 2 vars
* POSSIBLE 6309 MOD: DO LDA 1,U / CMPA 1,Y FOR EXPONENT, THEN LDQ / CMPD /
* CMPW FOR MANTISSA
L447D    ldd   1,u        Get exponent & 1st mantissa bytes
         cmpd  1,y        Compare
         bne   L445F      Not equal, exit with appropriate flags set
         ldd   3,u        Match so far, compare 2nd & 3rd mantissa bytes
         cmpd  3,y       
         bne   L4491      Not equal, exit with flags
         lda   5,u        Compare last byte of mantissa
         cmpa  5,y       
         beq   L445F      2 #'s are equal, exit
L4491    blo   L445B      If below, set negative flag & exit
         andcc  #$F0       Clear negative, zero, overflow & carry bits
         puls  pc,y       Restore Y & return

*??? Copy string var of some sort <=256 chars max
L4497    clrb             Max size of string copy=256
         stb   <u003E     Save it
L449A    ldu   <u0048     Get ptr to string of some sort
         leay  -6,y       Make room for temp var
         stu   1,y        Save ptr to it
         sty   <u0044     Save temp var ptr
L44A3    cmpu  <u0044     At end of string stack yet?
         bhs   L44C2      Yes, exit with String stack overflow error
         lda   ,x+        Get char from string
         sta   ,u+        Save it
         cmpa  #$FF       EOS?
         beq   L44BB      Yes, finished copying
         decb             Dec size left
         bne   L44A3      Still room, keep copying
         dec   <u003E     ???
         bpl   L44A3      Still good, keep copying
         lda   #$FF       Append string terminator
         sta   ,u+       
L44BB    stu   <u0048     Save end of string stack ptr
         lda   #4         Force var type to string
         sta   ,y        
         rts             

L44C2    ldb   #$2F       String stack overflow
         jsr   <u0024    
         fcb   $06       

L44C7    ldd   ,x++      
         addd  <u0066    
         tfr   d,u       
L44CD    ldd   ,u        
         addd  <u0031    
         ldu   2,u       
         stu   <u003E    
         tfr   d,u       
L44D7    pshs  x         
         ldb   <u003F    
         bne   L44DF     
         dec   <u003E    
L44DF    leax  ,u        
         bsr   L449A     
         puls  pc,x      

L44E5    ldu   1,y        Get ptr to string contents
         leay  6,y        Eat temp var
L44E9    lda   ,u+        Get char from temp var
         sta   -2,u       Save 1 byte back from original spot
         cmpa  #$FF       EOS?
         bne   L44E9      No, keep copying until EOS is hit
         leau  -1,u       Point U back to EOS
         stu   <u0048     Save string stack ptr & return
         rts             

L44F6    ldd   <u003E    
         leay  -6,y       Make room for temp var
         std   3,y        ???
         stu   1,y        ???
         lda   #5         Var type =5???
         sta   ,y        
         rts             

L4503    clra             Force least 2 sig bytes to 0 (and sign to positive)
         clrb            
         std   4,y       
         ldd   1,y        Get Exponent & 1st byte of mantissa
         bne   L4512      Not 0, skip ahead
         stb   3,y        Save 0 int 2nd byte of mantissa
         lda   #2         Var type=Real
         sta   ,y        
         rts             

L4512    ldu   #$0210     ??? (528)
         tsta             Exponent negative?
         bpl   L451F      No, positive (big number), skip ahead
         IFNE  H6309
         negd            
         ELSE            
         nega            
         negb            
         sbca  #$00      
         ENDC            
         inc   5,y       
         tsta             Check exponent again
L451F    bne   L4526      Exponent <>0, skip ahead
         ldu   #$0208     ??? If exponent=0, 522
         exg   a,b       
L4526    tsta            
         bmi   L452F     
L4529    leau  -1,u       Drop down U counter
         lslb             LSLD
         rola            
         bpl   L4529      Do until hi bit is set
L452F    std   2,y       
         stu   ,y        
         rts             

L4534    leay  6,y        Eat temp var
         bsr   L4503      ??? Something with reals
         leay  -6,y       Make room for temp var & return
         rts             

L453B    ldb   1,y        Get exponent
         bgt   L454E      If exponent >0, skip ahead
         bmi   L454A      If exponent <0, skip ahead
         lda   2,y        Exponent=0, get 1st byte of mantissa
         bpl   L454A      If high bit not set, integer result=0
         ldd   #$0001     High bit set, Integer result=1
         bra   L4591      Go adjust sign if necessary

L454A    clra             Integer result=0
         clrb            
         bra   L4599      Save integer & return

L454E    subb  #$10       Subtract 16 from exponent
         bhi   L458C     
         bne   L4566     
         ldd   2,y       
         ror   5,y       
         bcc   L4599     
         cmpd  #$8000    
         bne   L458C     
         tst   4,y       
         bpl   L4599     
         bra   L458C     

L4566    cmpb  #$F8      
         bhi   L4578     
         pshs  b         
         ldd   2,y       
         std   3,y       
         clr   2,y       
         puls  b         
         addb  #$08      
         beq   L4581     
L4578    lsr   2,y       
         ror   3,y       
         ror   4,y       
         incb            
         bne   L4578     
L4581    ldd   2,y       
         tst   4,y       
         bpl   L4591     
         addd  #$0001    
         bvc   L4591     
L458C    ldb   #$34       Value out of Range for Destination error
         jsr   <u0024    
         fcb   $06       

L4591    ror   5,y        Get sign bit of converted real #
         bcc   L4599      Positive, leave integer result alone
         IFNE  H6309
         negd             Reverse sign of integer
         ELSE            
         nega            
         negb            
         sbca  #$00      
         ENDC            
L4599    std   1,y        Save integer result
         lda   #1         Force type to integer & return
         sta   ,y        
         rts             

L45A0    leay  6,y       
         bsr   L453B     
         leay  -6,y      
         rts             

L45A7    leay  $C,y       Eat 2 temp vars
         bsr   L453B     
         leay  -$C,y      Make room for 2 temp vars & return
         rts             

* ABS for Real #'s
         IFNE  H6309
L45AE    aim   #$fe,5,y   Force sign of real # to positive
         ELSE            
L45AE    lda   5,y        Get sign bit for Real #
         anda  #$FE       Force to positive
         sta   5,y        Save sign bit back & return
         rts             
         ENDC            

* ABS for Integer's
L45B5    ldd   1,y        Get integer
         bpl   L45BF      If positive already, exit
         IFNE  H6309
         negd             Force to positive
         ELSE            
         nega             NEGD (force to positive)
         negb            
         sbca  #$00      
         ENDC            
         std   1,y        Save positive value back
L45BF    rts             

L45C0    clra            
         ldb   [<1,y]    
         std   1,y       
         rts             

L45C7    lda   2,y       
         beq   L45DB     
         lda   5,y        Get sign byte
         anda  #$01       Just keep sign bit
         bne   L45DE      Negative #, skip ahead
L45D1    ldb   #$01      
         bra   L45E0     

L45D5    ldd   $01,y     
         bmi   L45DE     
         bne   L45D1     
L45DB    clrb            
         bra   L45E0     

L45DE    ldb   #$FF      
L45E0    sex             
         bra   L45EA     

L45E3    ldb   <u0036    
         clr   <u0036    
L45E7    clra            
         leay  -6,y       Make room for temp var
L45EA    std   1,y        Save value
         lda   #1         Force type to integer & return
         sta   ,y        
L45F0    rts             

L45F1    ldb   <u007D    
         bra   L45E7     

L45F5    ldb   $05,y     
         asrb            
         lbcs  L4FC7     
         ldb   #$1F      
         stb   <u006E    
         ldd   $01,y     
         beq   L45F0     
         inca            
         asra            
         sta   $01,y     
         ldd   $02,y     
         bcs   L4616     
         lsra            
         rorb            
         std   -$04,y    
         ldd   $04,y     
         rora            
         rorb            
         bra   L461A     

L4616    std   -$04,y    
         ldd   $04,y     
L461A    std   -$02,y    
         clra            
         clrb            
         std   $02,y     
         std   $04,y     
         std   -$06,y    
         std   -$08,y    
         bra   L4638     

L4628    orcc  #$01      
         rol   $05,y     
         rol   $04,y     
         rol   $03,y     
         rol   $02,y     
         dec   <u006E    
         beq   L467A     
         bsr   L468F     
L4638    ldb   -$04,y    
         subb  #$40      
         stb   -$04,y    
         ldd   -$06,y    
         sbcb  $05,y     
         sbca  $04,y     
         std   -$06,y    
         ldd   -$08,y    
         sbcb  $03,y     
         sbca  $02,y     
         std   -$08,y    
         bpl   L4628     
L4650    andcc  #$FE      
         rol   $05,y     
         rol   $04,y     
         rol   $03,y     
         rol   $02,y     
         dec   <u006E    
         beq   L467A     
         bsr   L468F     
         ldb   -$04,y    
         addb  #$C0      
         stb   -$04,y    
         ldd   -$06,y    
         adcb  $05,y     
         adca  $04,y     
         std   -$06,y    
         ldd   -$08,y    
         adcb  $03,y     
         adca  $02,y     
         std   -$08,y    
         bmi   L4650     
         bra   L4628     

L467A    ldd   $02,y     
         bra   L4684     

L467E    dec   $01,y     
         lbvs  L40DD     
L4684    lsl   $05,y     
         rol   $04,y     
         rolb            
         rola            
         bpl   L467E     
         std   $02,y     
         rts             

L468F    bsr   L4691     
L4691    lsl   -$01,y    
         rol   -$02,y    
         rol   -$03,y    
         rol   -$04,y    
         rol   -$05,y    
         rol   -$06,y    
         rol   -$07,y    
         rol   -$08,y    
         rts             

* Real MOD routine (?)
L46AA    leau  -12,y      Make room for 2 temp vars
         pshs  y         
L46AE    ldd   ,y++      
         std   ,u++      
         cmpu  ,s        
         bne   L46AE     
         leas  2,s       
         leay  -12,u     
         lbsr  L422D     
         bsr   L46C6     
         lbsr  L40CC     
         lbra  L3FAB     

L46C6    lda   1,y       
         bgt   L46D3     
         clra            
         clrb            
         std   1,y       
         std   3,y       
         stb   5,y       
L46D2    rts             

L46D3    cmpa  #$1F      
         bcc   L46D2     
         leau  $06,y     
         ldb   -1,u      
         andb  #$01      
         pshs  u,b       
         leau  $01,y     
L46E1    leau  1,u       
         suba  #$08      
         bcc   L46E1     
         beq   L46F5     
         ldb   #$FF      
L46EB    lslb            
         inca            
         bne   L46EB     
         andb  ,u        
         stb   ,u+       
         bra   L46F9     

L46F5    leau  1,u       
L46F7    sta   ,u+       
L46F9    cmpu  $01,s     
         bne   L46F7     
         puls  u,b       
         orb   $05,y     
         stb   $05,y     
         rts             

L4705    leay  -6,y      
         ldd   7,y       
         std   1,y       
         lbra  L3EC1     

L470E    leay  -6,y      
         ldd   $A,y      
         std   4,y       
         ldd   8,y       
         std   2,y       
         ldd   6,y       
         std   ,y        
         lbra  L40CC     

L471F    ldd   <u0080    
         ldu   <u0082    
         pshs  u,d       
         ldd   1,y       
         std   <u0080    
         std   <u0082    
         std   <u0048    
         leay  6,y       
         ldb   #9        
         lbsr  L011F     
         puls  u,d       
         std   <u0080    
         stu   <u0082    
         lbcs  L4FC7     
         rts             

L473F    lbsr  L3D51     
         leay  -6,y       Make room for new variable packet
         stu   1,y        Save size of var
L4746    lda   #$01       ??? Integer type
         sta   ,y         ??? Save in variable packet
         leax  1,x       
         rts             

* Table to numeric variable type sizes in bytes? (duplicates earlier table @
*  L3B5B)
* Can either leave table here, change leau below to 8 bit pc (faster/1 byte
*   shorter), or eliminate table and point to 3B5B table (4 bytes shorter/same
*   speed)
L474D    fcb   $01        Byte             (type=0)
         fcb   $02        Integer size     (type=1)
         fcb   $05        Real size        (type=2)
         fcb   $01        Boolean          (type=3)

L4751    lbsr  L3D51     
         leay  -6,y       ??? Size of variable packets?
         cmpa  #4         String/complex variable?
         bhs   L4763      Yes, skip ahead
         leau  <L474D,pc  Point to numeric type size table
         ldb   a,u        Get size of var in bytes
         clra             D=size
         bra   L4765      Go save it

L4763    ldd   <u003E     ??? Get integer value
L4765    std   1,y        ??? Save integer value
         bra   L4746     

* BOOLEAN - TRUE
L4769    ldd   #$00FF     $FF in boolean is True flag
         bra   L4771     

L476E    ldd   #$0000     CLRD ($00 in boolean is False)
L4771    leay  -6,y       Make room for variable packet
         std   1,y        Save boolean flag value
         lda   #3         Save type as boolean (3)
         sta   ,y        
         rts             

L477A    com   1,y        Leave as LDD 1,y/COMD/STD 1,y is same speed
         com   2,y       
         rts             

L477F    ldd   1,y        Get value to AND with out of integer var.
         anda  7,y        ANDD (with value in variable)
         andb  8,y       
         bra   L4795     

L4787    ldd   1,y       
         eora  7,y        EORD
         eorb  8,y       
         bra   L4795     

L478F    ldd   1,y       
         ora   7,y        ORD
         orb   8,y       
L4795    std   7,y        Save result after logic applied
         leay  6,y        Eat temporary variable packet?
         rts             

L479A    fcb   $ff,$de,$5b,$d8,$aa ??? (.434294482)

L479F    bsr   L47AB     
         leau  <L479A,pc  Point to ???
         lbsr  L3F93     
         lbra  L40CC     

L47AB    pshs  x         
         ldb   5,y       
         asrb            
         lbcs  L4FC7     
         ldd   1,y       
         lbeq  L4FC7     
         pshs  a         
         ldb   #1        
         stb   1,y       
         leay  <-$1A,y   
         leax  <$1B,y    
         leau  ,y        
         lbsr  L4BCC     
         lbsr  L4CC7     
         clra            
         clrb            
         std   <$14,y    
         std   <$16,y    
         sta   <$18,y    
         leax  >L4C7F,pc  Point to routine
         stx   <$19,y    
         lbsr  L4909     
         leax  <$14,y    
         leau  <$1B,y    
         lbsr  L4BCC     
         lbsr  L4CE1     
         leay  <$1A,y    
         ldb   #$02      
         stb   ,y        
         ldb   $05,y     
         orb   #$01      
         stb   $05,y     
         puls  b         
         bsr   L480A     
         puls  x         
         lbra  L3FB1     

L4805    fcb   $00,$b1,$72,$17,$f8 (.693147181) LOG(2) in REAL format

L480A    sex              Convert to 16 bit number
         bpl   L480E      If positive, skip ahead
         negb             Invert sign on LSB
L480E    anda  #$01      
         pshs  d         
L4812    leau  <L4805,pc  Point to Log(2) in REAL format
         lbsr  L3F93     
         ldb   5,y       
         lda   1,s       
         cmpa  #1        
         beq   L485C      If multiplying by 1, don't bother
         mul             
         stb   5,y       
         ldb   4,y       
         sta   4,y       
         lda   1,s       
         mul             
         addb  $04,y     
         adca  #$00      
         stb   $04,y     
         ldb   $03,y     
         sta   $03,y     
         lda   $01,s     
         mul             
         addb  $03,y     
         adca  #$00      
         stb   $03,y     
         ldb   $02,y     
         sta   $02,y     
         lda   $01,s     
         mul             
         addb  $02,y     
         adca  #$00      
         beq   L4858     
L484B    inc   $01,y     
         lsra            
         rorb            
         ror   $03,y     
         ror   $04,y     
         ror   $05,y     
         tsta            
         bne   L484B     
L4858    stb   $02,y     
         ldb   $05,y     
L485C    andb  #$FE      
         orb   ,s        
         stb   $05,y     
         puls  pc,d      

L4864    pshs  x         
         ldb   $01,y     
         beq   L4880     
         cmpb  #$07      
         ble   L4877     
         ldb   $05,y     
         rorb            
         rorb            
         eorb  #$80      
         lbra  L491C     

L4877    cmpb  #$E4      
         lble  L4342     
         tstb            
         bpl   L488A     
L4880    clr   ,-s       
         ldb   $05,y     
         andb  #$01      
         beq   L48CD     
         bra   L48BB     

L488A    lda   #$71      
         mul             
         adda  $01,y     
         ldb   $05,y     
         andb  #$01      
         pshs  b,a       
         eorb  $05,y     
         stb   $05,y     
         ldb   ,s        
L489B    lbsr  L480A     
         lbsr  L3FAB     
         ldb   $01,y     
         ble   L48AD     
         addb  ,s        
         stb   ,s        
         ldb   $01,y     
         bra   L489B     

L48AD    puls  d         
         pshs  a         
         tstb            
         beq   L48CD     
         nega            
         sta   ,s        
         orb   5,y       
         stb   5,y       
L48BB    leau  >L4805,pc  Point to LOG(2) in REAL format
         lbsr  L3F93     
         lbsr  L3FB1     
         dec   ,s        
         ldb   5,y       
         andb  #$01      
         bne   L48BB     
L48CD    leay  <-$1A,y   
         leax  <$1B,y    
         leau  <$14,y    
         lbsr  L4BCC     
         lbsr  L4CC7     
         ldd   #$1000    
         std   ,y        
         clra            
         std   $02,y     
         sta   $04,y     
         leax  >L4C61,pc 
         stx   <$19,y    
         bsr   L4909     
         leax  ,y        
         leau  <$1B,y    
         lbsr  L4BCC     
         lbsr  L4CE1     
         leay  <$1A,y    
         puls  b         
         addb  $01,y     
         bvs   L491C     
         lda   #$02      
         std   ,y        
         puls  pc,x      

L4909    lda   #$01      
         sta   <u009A    
         leax  >L4D6F,pc 
         stx   <u0095    
         leax  >$005F,x  
         stx   <u0097    
         lbra  L4B97     

L491C    leay  -6,y      
         lbpl  L40DD     
         ldb   #$32       Floating Overflow error
         jsr   <u0024    
         fcb   $06       

L4927    pshs  x         
         bsr   L495D     
         ldd   $01,y     
         lbeq  L4A91     
         cmpd  #$0180    
         bgt   L4943     
         bne   L4946     
         ldd   $03,y     
         bne   L4943     
         lda   $05,y     
         lbeq  L4A0E     
L4943    lbra  L4FC7     

L4946    lbsr  L49CB     
         leay  <-$14,y   
         leax  <$15,y    
         leau  ,y        
         lbsr  L4BCC     
         lbsr  L4CC7     
         leax  <$1B,y    
         lbra  L4A3E     

L495D    ldb   $05,y     
         andb  #$01      
         stb   <u006D    
         eorb  $05,y     
         stb   $05,y     
         rts             

L4968    leau  <L49AB,pc 
         pshs  u,x       
         bsr   L495D     
         ldd   $01,y     
         lbeq  L4A0E     
         cmpd  #$0180    
         bgt   L4943     
         bne   L4995     
         ldd   $03,y     
         bne   L4943     
         lda   $05,y     
         bne   L4943     
         lda   <u006D    
         bne   L498E     
         clrb            
         std   $01,y     
         puls  pc,u,x    

L498E    leay  6,y        Eat temp var
         puls  u,x       
         lbra  L4B03     

L4995    bsr   L49CB     
         leay  <-$14,y   
         leax  <$1B,y    
         leau  ,y        
         lbsr  L4BCC     
         lbsr  L4CC7     
         leax  <$15,y    
         lbra  L4A3E     

L49AB    lda   5,y       
         bita  #$01      
         beq   L49C5     
         ldu   <u0031    
         tst   1,u       
         beq   L49BF     
         leau  <L49C6,pc  Point to 180 in FP format
         lbsr  L3F93     
         bra   L49C2     

L49BF    lbsr  L4B03     
L49C2    lbra  L3FB1     

* See if we can move label to RTS above @ L495D, or below @ end of L49CB
L49C5    rts             

L49C6    fcb   $08,$b4,$00,$00,$00 180

L49CB    lda   <u006D    
         pshs  a         
         leay  <-$12,y   
         ldd   #$0201    
         std   $0C,y     
         lda   #$80      
         clrb            
         std   $0E,y     
         clra            
         std   <$10,y    
         ldd   <$12,y    
         std   ,y        
         std   $06,y     
         ldd   <$14,y    
         std   $02,y     
         std   $08,y     
         ldd   <$16,y    
         std   $04,y     
         std   $0A,y     
         lbsr  L40CC     
         lbsr  L3FAB     
         lbsr  L45F5     
         puls  a         
         sta   <u006D    
         rts             

L4A03    pshs  x         
         lbsr  L495D     
         ldb   $01,y     
         cmpb  #$18      
         blt   L4A17     
L4A0E    leay  6,y       
         lbsr  L4B03     
         dec   1,y       
         bra   L4A6A     

L4A17    leay  <-$1A,y   
         ldd   #$1000    
         std   ,y        
         clra            
         std   $02,y     
         sta   $04,y     
         ldb   <$1B,y    
         bra   L4A34     

L4A29    asr   ,y        
         ror   1,y       
         ror   2,y       
         ror   3,y       
         ror   4,y       
         decb            
L4A34    cmpb  #$02      
         bgt   L4A29     
         stb   <$1B,y    
         leax  <$1B,y    
L4A3E    leau  $0A,y     
         lbsr  L4BCC     
         lbsr  L4CC7     
         clra            
         clrb            
         std   <$14,y    
         std   <$16,y    
         sta   <$18,y    
         leax  >L4C2C,pc 
         stx   <$19,y    
         lbsr  L4B89     
         leax  <$14,y    
         leau  <$1B,y    
         lbsr  L4BCC     
         lbsr  L4CE1     
         leay  <$1A,y    
L4A6A    lda   $05,y     
         ora   <u006D    
         sta   $05,y     
         ldu   <u0031    
         tst   1,u       
         beq   L4A91     
         leau  >L4AFE,pc 
         lbsr  L3F93     
         lbsr  L40CC     
         bra   L4A91     

L4A82    pshs  x         
         lbsr  L4B0A     
         leax  $0A,y     
         bsr   L4A97     
         lda   $05,y     
L4A8D    eora  <u009C    
L4A8F    sta   $05,y     
L4A91    lda   #$02      
         sta   ,y        
         puls  pc,x      

L4A97    leau  <$1B,y    
         lbsr  L4BCC     
         lbsr  L4CE1     
         leay  <$14,y    
         leax  >L4D6A,pc  Point to a table of Real #'s
         leau  1,y       
         lbsr  L4BCC     
         lbra  L40CC     

L4AAF    pshs  x         
         bsr   L4B0A     
         leax  ,y        
         bsr   L4A97     
         lda   $05,y     
         eora  <u009B    
         bra   L4A8F     

L4ABD    pshs  x         
         bsr   L4B0A     
         leax  $0A,y     
         leau  <$1B,y    
         lbsr  L4BCC     
         lbsr  L4CE1     
         leax  ,y        
         leay  <$14,y    
         leau  $01,y     
         lbsr  L4BCC     
         lbsr  L4CE1     
         ldd   $01,y     
         bne   L4AEB     
         leay  $06,y     
         ldd   #$7FFF    
L4AE2    std   $01,y     
         lda   #$FF      
         std   $03,y     
         deca            
         bra   L4AF0     

L4AEB    lbsr  L422D     
         lda   $05,y     
L4AF0    eora  <u009B    
         bra   L4A8D     

L4AF4    fcb   $02,$c9,$0f,$da,$a2 PI (3.14159265)

L4AF9    fcb   $fb,$8e,$fa,$35,$12 -1.74532925 E-02  (Degrees)

L4AFE    fcb   $06,$e5,$2e,$e0,$d4 57.2957795 (radians)

L4B03    leau  <L4AF4,pc  Point to PI in FP format
         lbra  L3F93     

L4B0A    ldu   <u0031    
         tst   1,u       
         beq   L4B1A     
         leau  <L4AF9,pc 
         lbsr  L3F93      Copy 5 bytes from u to 1,y (0,y=2)
         lbsr  L40CC     
L4B1A    clr   <u009B    
         ldb   $05,y     
         andb  #$01      
         stb   <u009C    
         eorb  $05,y     
         stb   $05,y     
         bsr   L4B03     
         inc   $01,y     
         lbsr  L4449     
         blt   L4B36     
         lbsr  L46AA     
         bsr   L4B03     
         bra   L4B38     

L4B36    dec   $01,y     
L4B38    lbsr  L4449     
         blt   L4B4A     
         inc   <u009B    
         lda   <u009C    
         eora  #$01      
         sta   <u009C    
         lbsr  L3FAB     
         bsr   L4B03     
L4B4A    dec   $01,y     
         lbsr  L4449     
         ble   L4B64     
         lda   <u009B    
         eora  #$01      
         sta   <u009B    
         inc   $01,y     
         lda   $0B,y     
         ora   #$01      
         sta   $0B,y     
         lbsr  L3FB1     
         leay  -$06,y    
L4B64    leay  <-$14,y   
         leax  >L4C33,pc 
         stx   <$19,y    
         leax  <$1B,y    
         leau  <$14,y    
         bsr   L4BCC     
         lbsr  L4CC7     
         ldd   #$1000    
         std   ,y        
         clra            
         std   $02,y     
         sta   $04,y     
         std   $0A,y     
         std   $0C,y     
         sta   $0E,y     
L4B89    leax  >L4D29,pc  Point to some real # table
         stx   <u0095    
         leax  <L4D6A-L4D29,x Point to further in table
         stx   <u0097    
         clr   <u009A    
L4B97    ldb   #$25      
         stb   <u0099    
         clr   <u009D    
L4B9D    leau  <$1B,y    
         ldx   <u0095    
         cmpx  <u0097    
         bhs   L4BAE     
         bsr   L4BCC     
         leax  5,x        Point to next entry in 5-byte entry table
         stx   <u0095     Save new ptr
         bra   L4BB2     

L4BAE    ldb   #$01      
         bsr   L4C1E     
L4BB2    leax  ,y        
         leau  5,y       
         bsr   L4BDE     
         tst   <u009A    
         bne   L4BC2     
         leax  $0A,y     
         leau  $0F,y     
         bsr   L4BDE     
L4BC2    jsr   [<$19,y]  
         inc   <u009D    
         dec   <u0099    
         bne   L4B9D     
         rts             

L4BCC    pshs  y,x       
         lda   ,x        
         ldy   1,x       
         ldx   3,x       
         sta   ,u        
         sty   1,u       
         stx   3,u       
         puls  pc,y,x    

L4BDE    ldb   ,x        
         sex             
         ldb   <u009D    
         lsrb            
         lsrb            
         lsrb            
         bcc   L4BE9     
         incb            
L4BE9    pshs  b         
         beq   L4BF2     
L4BED    sta   ,u+       
         decb            
         bne   L4BED     
L4BF2    ldb   #$05      
         subb  ,s+       
         beq   L4BFF     
L4BF8    lda   ,x+       
         sta   ,u+       
         decb            
         bne   L4BF8     
L4BFF    leau  -5,u      
         ldb   <u009D    
         andb  #$07      
         beq   L4C2B     
         cmpb  #$04      
         bcs   L4C1E     
         subb  #$08      
         lda   ,x        
L4C0F    lsla            
         rol   4,u       
         rol   3,u       
         rol   2,u       
         rol   1,u       
         rol   ,u        
         incb            
         bne   L4C0F     
         rts             

L4C1E    asr   ,u        
         ror   1,u       
         ror   2,u       
         ror   3,u       
         ror   4,u       
         decb            
         bne   L4C1E     
L4C2B    rts             

L4C2C    lda   $0A,y     
         eora  ,y        
         coma            
         bra   L4C36     

L4C33    lda   <$14,y    
L4C36    tsta            
         bpl   L4C4D     
         leax  ,y        
         leau  $0F,y     
         bsr   L4C8F     
         leax  $0A,y     
         leau  $05,y     
         bsr   L4CAB     
         leax  <$14,y    
         leau  <$1B,y    
         bra   L4C8F     

L4C4D    leax  ,y        
         leau  $0F,y     
         bsr   L4CAB     
         leax  $0A,y     
         leau  $05,y     
         bsr   L4C8F     
         leax  <$14,y    
         leau  <$1B,y    
         bra   L4CAB     

L4C61    leax  <$14,y    
         leau  <$1B,y    
         bsr   L4CAB     
         bmi   L4C8F     
         bne   L4C79     
         ldd   $01,x     
         bne   L4C79     
         ldd   $03,x     
         bne   L4C79     
         ldb   #$01      
         stb   <u0099    
L4C79    leax  ,y        
         leau  5,y       
         bra   L4C8F     

L4C7F    leax  ,y        
         leau  $05,y     
         bsr   L4C8F     
         cmpa  #$20      
         bcc   L4CAB     
         leax  <$14,y    
         leau  <$1B,y    
L4C8F    ldd   3,x       
         addd  3,u       
         std   3,x       
         ldd   1,x       
         bcc   L4CA0     
         addd  #$0001    
         bcc   L4CA0     
         inc   ,x        
L4CA0    addd  1,u       
         std   1,x       
         lda   ,x        
         adca  ,u        
         sta   ,x        
         rts             

L4CAB    ldd   3,x       
         subd  3,u       
         std   3,x       
         ldd   1,x       
         bcc   L4CBC     
         subd  #$0001    
         bcc   L4CBC     
         dec   ,x        
L4CBC    subd  1,u       
         std   1,x       
         lda   ,x        
         sbca  ,u        
         sta   ,x        
         rts             

L4CC7    ldb   ,u        
         clr   ,u        
         addb  #$04      
         bge   L4CDE     
         negb            
         lbra  L4C1E     

* Multiply 5 byte number @ ,u  by 2
* Entry: B=# times to multiply 
L4CD3    lsl   4,u       
         rol   3,u       
         rol   2,u       
         rol   1,u       
         rol   ,u        
         decb            
L4CDE    bne   L4CD3     
         rts             

L4CE1    lda   ,u         Get sign of 5 byte #
         bpl   L4CEE      If positive, skip ahead
         IFNE  H6309
         clrd             Clr 5 bytes @ u
         ELSE            
         clra            
         clrb            
         ENDC            
         std   ,u        
         std   2,u       
         sta   4,u       
         rts             

L4CEE    ldd   #$2004    
L4CF1    decb            
         lsl   4,u       
         rol   3,u       
         rol   2,u       
         rol   1,u       
         rol   ,u        
         bmi   L4D05     
         deca            
         bne   L4CF1     
         clrb            
         std   ,u        
         rts             

L4D05    lda   ,u        
         stb   ,u        
         ldb   1,u       
         sta   1,u       
         lda   2,u       
         stb   2,u       
         ldb   3,u       
         addd  #$0001    
         andb  #$FE      
         std   3,u       
         bcc   L4D28     
         inc   2,u       
         bne   L4D28     
         inc   1,u       
         bne   L4D28     
         ror   1,u       
         inc   ,u        
L4D28    rts             

* Data (all 5 byte entries for real #'s???)
L4D29    fcb   $0c,$90,$fd,$aa,$22 2319.85404
         fcb   $07,$6b,$19,$c1,$58 53.5503032
         fcb   $03,$eb,$6e,$bf,$26 7.35726888
         fcb   $01,$fd,$5b,$a9,$ab -1.97935983
         fcb   $00,$ff,$aa,$dd,$b9
         fcb   $00,$7f,$f5,$56,$ef
         fcb   $00,$3f,$fe,$aa,$b7
         fcb   $00,$1f,$ff,$d5,$56
         fcb   $00,$0f,$ff,$fa,$ab
         fcb   $00,$07,$ff,$ff,$55
         fcb   $00,$03,$ff,$ff,$eb
         fcb   $00,$01,$ff,$ff,$fd
         fcb   $00,$01,$00,$00,$00

L4D6A    fcb   $00,$9b,$74,$ed,$a8 .607252935
L4D6F    fcb   $0b,$17,$21,$7f,$7e 0185.04681
         fcb   $06,$7c,$c8,$fb,$30
         fcb   $03,$91,$fe,$f8,$f3
         fcb   $01,$e2,$70,$76,$e3
         fcb   $00,$f8,$51,$86,$01
         fcb   $00,$7e,$0a,$6c,$3a
         fcb   $00,$3f,$81,$51,$62
         fcb   $00,$1f,$e0,$2a,$6b
         fcb   $00,$0f,$f8,$05,$51
         fcb   $00,$07,$fe,$00,$aa
         fcb   $00,$03,$ff,$80,$15
         fcb   $00,$01,$ff,$e0,$03
         fcb   $00,$00,$ff,$f8,$00
         fcb   $00,$00,$7f,$fe,$00
         fcb   $00,$00,$3f,$ff,$80
         fcb   $00,$00,$1f,$ff,$e0
         fcb   $00,$00,$0f,$ff,$f8
         fcb   $00,$00,$07,$ff,$fe
         fcb   $00,$00,$04,$00,$00

L4DCE    fdb   $0E12,$14A2,$BB40,$E62D,$3619,$62E9

         IFNE  H6309
L4DDA    clrd            
         ELSE            
L4DDA    clra            
         clrb            
         ENDC            
         std   <u004C    
         std   <u004E    
         pshs  a          ??? Save flag (0)
         lda   2,y       
         beq   L4DFC     
         ldb   5,y        ??? Get sign/exponent byte
         bitb  #1         ??? Negative number?
         bne   L4DF0      ??? Yes, skip ahead
         com   ,s         ??? No, set flag
         bra   L4DFC     

L4DF0    addb  #$FE      
         addb  1,y       
         lda   4,y       
         std   <u0052    
         ldd   2,y       
         std   <u0050    
L4DFC    lda   <u0053    
         ldb   <u0057    
         mul             
         std   <u004E    
         lda   <u0052    
         ldb   <u0057    
         mul             
         addd  <u004D    
         bcc   L4E0E     
         inc   <u004C    
L4E0E    std   <u004D    
         lda   <u0053    
         ldb   <u0056    
         mul             
         addd  <u004D    
         bcc   L4E1B     
         inc   <u004C    
L4E1B    std   <u004D    
         lda   <u0051    
         ldb   <u0057    
         mul             
         addd  <u004C    
         std   <u004C    
         lda   <u0052    
         ldb   <u0056    
         mul             
         addd  <u004C    
         std   <u004C    
         lda   <u0053    
         ldb   <u0055    
         mul             
         addd  <u004C    
         std   <u004C    
         lda   <u0050    
         ldb   <u0057    
         mul             
         addb  <u004C    
         stb   <u004C    
         lda   <u0051    
         ldb   <u0056    
         mul             
         addb  <u004C    
         stb   <u004C    
         lda   <u0052    
         ldb   <u0055    
         mul             
         addb  <u004C    
         stb   <u004C    
* NOTE: ON 6809, CHANGE TO LDD <u0053
         lda   <u0053    
         ldb   <u0054    
         mul             
         addb  <u004C    
         stb   <u004C    
         ldd   <u004E    
         addd  <u005A    
         std   <u0052    
         ldd   <u004C    
* NOTE: 6309 ADCD <u0058
         adcb  <u0059    
         adca  <u0058    
         std   <u0050    
         tst   ,s+       
         bne   L4E98     
         ldd   <u0050    
         std   2,y       
         ldd   <u0052    
         std   4,y       
         clr   1,y       
L4E78    lda   #$1F      
         pshs  a         
         ldd   $02,y     
         bmi   L4E8E     
L4E80    dec   ,s        
         beq   L4E8E     
         dec   $01,y     
         lsl   $05,y     
         rol   $04,y     
         rolb            
         rola            
         bpl   L4E80     
L4E8E    std   $02,y     
         ldb   $05,y     
         andb  #$FE      
         stb   $05,y     
         puls  pc,b      

L4E98    ldd   <u0052    
         andb  #$FE       ??? Kill sign bit on real #?
         std   ,--y      
         ldd   <u0050    
         std   ,--y      
         IFNE  H6309
         clrd            
         ELSE            
         clra            
         clrb            
         ENDC            
         std   ,--y      
         bsr   L4E78     
         lbra  L40CC     

L4EAB    ldd   <u0048    
         ldu   1,y       
         subd  1,y       
         subd  #1        
         stu   <u0048    
L4EB6    std   1,y       
         lda   #1        
         sta   ,y        
         rts             

L4EBD    ldd   1,y       
         std   <u0048    
         ldb   [<$01,y]  
         clra            
         bra   L4EB6     

L4EC7    ldd   1,y       
         tsta            
         lbne  L4FC7     
         ldu   <u0048    
         stu   1,y       
         stb   ,u+       
         lbsr  L4FEA     
         sty   <u0044    
         cmpu  <u0044    
         lbhs  L44C2     
         rts             

L4EE2    ldd   1,y       
         ble   L4EF4     
         addd  7,y       
         tfr   d,u       
         cmpd  <u0048    
         bcc   L4EF1     
         bsr   L4F70     
L4EF1    leay  6,y       
         rts             

L4EF4    leay  6,y       
         ldu   1,y       
         bra   L4F70     

L4EFA    ldd   1,y       
         ble   L4EF4     
         pshs  x         
         ldd   <u0048    
         subd  1,y       
         subd  #1        
         cmpd  7,y       
         bls   L4F1A     
         tfr   d,x       
         ldu   7,y       
L4F10    lda   ,x+       
         sta   ,u+       
         cmpa  #$FF      
         bne   L4F10     
         stu   <u0048    
L4F1A    leay  6,y       
         puls  pc,x      

L4F1E    ldd   $01,y     
         ble   L4F26     
         ldd   $07,y     
         bgt   L4F2E     
L4F26    ldd   $01,y     
         leay  $06,y     
         std   $01,y     
         bra   L4EE2     

L4F2E    subd  #$0001    
         beq   L4F26     
         addd  $0D,y     
         cmpd  <u0048    
         bcs   L4F3E     
         leay  $06,y     
         bra   L4EF4     

L4F3E    pshs  x         
         tfr   d,x       
         ldb   $02,y     
         ldu   $0D,y     
L4F46    lda   ,x+       
         sta   ,u+       
         cmpa  #$FF      
         beq   L4F59     
         decb            
         bne   L4F46     
         dec   1,y       
         bpl   L4F46     
         lda   #$FF      
         sta   ,u+       
L4F59    stu   <u0048    
         leay  $0C,y     
         puls  pc,x      

L4F5F    ldu   <u0048    
         leau  -1,u      
L4F63    cmpu  $01,y     
         beq   L4F70     
         lda   ,-u       
         cmpa  #$20      
         beq   L4F63     
         leau  1,u       
L4F70    lda   #$FF      
         sta   ,u+       
         stu   <u0048    
         rts             

L4F77    pshs  y,x       
         ldd   <u0048     ??? Get size of string
         subd  1,y        Subtract ptr to string to search in
         addd  7,y        Add to ptr to string to search for
         addd  #1         +1
         ldx   7,y        Get ptr to string to search for
         ldy   1,y        Get ptr to string to search in
         bsr   L3C29      Call Substr function (should change to direct LBSR
         bcc   L4F90      If sub-string match found, skip ahead
         IFNE  H6309
         clrd            
         ELSE            
         clra            
         clrb            
         ENDC            
         bra   L4F99     

L3C29    jsr   <u001B     Substr string search
         fcb   $08       

L4F90    tfr   y,d       
         ldx   2,s       
         subd  1,x       
         addd  #$0001    
L4F99    puls  y,x       
         std   7,y       
         lda   #1        
         sta   6,y       
         leay  6,y       
         rts             

L4FA4    ldb   #$02      
         bra   L4FAA     

L4FA8    ldb   #$03      
L4FAA    lda   <u007D    
         ldu   <u0082    
         pshs  u,x,a     
         lbsr  L011F     
         bcs   L4FC7     
         ldx   <u0082    
         lda   #$FF      
         sta   ,x        
         ldx   $03,s     
         lbsr  L4497     
         puls  u,x,a     
         sta   <u007D    
         stu   <u0082    
         rts             

L4FC7    ldb   #$43       Illegal Arguement error
         jsr   <u0024    
         fcb   $06       

L4FCC    pshs  x         
         ldd   1,y       
         blt   L4FC7     
         sty   <u0044    
         ldu   <u0048    
         stu   $01,y     
         lda   #$20      
L4FDB    cmpb  <u007D    
         bls   L4FEC     
         sta   ,u+       
         decb            
         cmpu  <u0044    
         blo   L4FDB     
         lbra  L44C2     

L4FEA    pshs  x         
L4FEC    lda   #$FF      
         sta   ,u+       
         stu   <u0048    
         lda   #$04      
         sta   ,y        
         puls  pc,x      

* DATE$ routine
* Minor change to accommodate Y2K changes in year. RG
L4FF8    pshs  x         
         leay  -6,y      
         leax  -6,y      
         ldu   <u0048    
         stu   1,y       
         os9   F$Time     Get time packet
         bcs   L4FEC      Error, exit
*         bsr   L5021      Start converting
         lda   ,x+
         ldb   #'/
         cmpa  #100
         blo   Y19
cnty     suba  #100
         bhs   cnty
         adda  #100
Y19      bsr   L5025
         lda   #'/        Append / 
         bsr   L501F     
         lda   #'/       
         bsr   L501F     
         lda   #$20      
         bsr   L501F     
         lda   #':       
         bsr   L501F     
         lda   #':       
         bsr   L501F     
         bra   L4FEC     

L501F    sta   ,u+       
L5021    lda   ,x+        Get byte from time packet
         ldb   #'/       
L5025    incb            
         suba  #10       
         bcc   L5025     
         stb   ,u+       
         ldb   #':       
L502E    decb            
         inca            
         bne   L502E     
         stb   ,u+       
         rts             

L5035    lda   2,y        Get path #
         ldb   #SS.EOF    Check if we are at end of file
         os9   I$GetStt  
         bcc   L5046      No, skip ahead
         cmpb  #E$EOF     Was the error an EOF error?
         bne   L5046      No, skip ahead
         ldb   #$FF      
         bra   L5048     

L5046    clrb            
L5048    clra            
         std   1,y       
         lda   #$03      
         sta   ,y        
         rts             

L5050    ldb   #$06       6 2-byte entries to copy
         pshs  y,x,b      Preserve regs
         tfr   dp,a       Move DP to MSB of D
         ldb   #$50       Point to [dp]50 (always u0050 in Lvl II)
         tfr   d,y        Move to Y
         leax  >L4DCE,pc  Point to table
L505E    ldd   ,x++       Get 2 bytes
         std   ,y++       Move into DP
         dec   ,s         Do all 6
         bne   L505E      Until done
         leax  >L3CB5,pc  Point to jump table
         stx   <u0010     Save ptr
         leax  >L3D35,pc  Point to another jump table
         stx   <u0012     Save ptr
         lda   #$7E       Get opcode for JMP >xxxx
         sta   <u0016     Save it
         leax  >L3D41,pc  Point to routine
         stx   <u0017     Save as destination for above JMP
         leax  <L3C32,pc  Point to JSR <u001B / FCB $1A
         stx   <u0019     Save it
         puls  pc,y,x,b   Restore regs & return

L3C32    jsr   <u001B    
         fcb   $1a       

* <u002A goes here
L5084    pshs  x,d        Preserve regs
         ldb   [<$04,s]   Get function code
         leax  <L5094,pc  Point to table (only functions 0 & 2)
         ldd   b,x        Get offset
         leax  d,x        Point to routine
         stx   4,s        Save over PC on stack
         puls  pc,x,d     Restore X&D & go to routine

L5094    fdb   L514E-L5094 Function 0
         fdb   L50A4-L5094 Function 2

L5098    jsr   <u0027    
         fcb   $0c       
L509B    jsr   <u0027    
         fcb   $0e       

* <u002A function 2
* Entry: B=Sub-function #
L50A4    pshs  pc,x,d     Make room for new PC, preserve X & Y
         lslb             2 bytes / entry
         leax  <L50B2,pc  Point to jump offset table
L50AA    ldd   b,x        Get offset
L50AC    leax  d,x        Add to base of table
         stx   4,s        Save over PC on stack
         puls  pc,x,d     Restore X&D & JMP to subroutine

* Sub-function jump table (L50B2 is the base)
L50B2    fdb   L5511-L50B2 $045f  0
         fdb   L5675-L50B2 $05c3  1
         fdb   L5675-L50B2 $05c3  2
         fdb   L5569-L50B2 $04b7  3
         fdb   L5665-L50B2 $05b3  4
         fdb   L565C-L50B2 $05aa  5
         fdb   L54FC-L50B2 $044a  6
         fdb   L530A-L50B2 $0258  7
         fdb   L531D-L50B2 $026b  8
         fdb   L52E7-L50B2 $0235  9
         fdb   L5354-L50B2 $02a2  A
         fdb   L5331-L50B2 $027f  B
         fdb   L56AB-L50B2 $05f9  C
         fdb   L569B-L50B2 $05e9  D
         fdb   L552A-L50B2 $0478  E
         fdb   L5AC3-L50B2 $0a11  F    Exit with Unimplemented routine err
         fdb   L568C-L50B2 $05da  10
         fdb   L576C-L50B2 $06ba  11
         fdb   L5614-L50B2 $0562  12
         fdb   L580B-L50B2 $0759  13
L50DA    fdb   L56B4-L50B2 $0602  14

* Table for Integer conversion
L50DC    fdb   10000     
         fdb   1000      
         fdb   100       
         fdb   10        

* Table for REAL conversion
L50E4    fcb   $04,$a0,$00,$00,$00 10
         fcb   $07,$c8,$00,$00,$00 100
         fcb   $0a,$fa,$00,$00,$00 1000
         fcb   $0e,$9c,$40,$00,$00 10 thousand
         fcb   $11,$c3,$50,$00,$00 100 thousand
         fcb   $14,$f4,$24,$00,$00 1 million
         fcb   $18,$98,$96,$80,$00 10 million
         fcb   $1b,$be,$bc,$20,$00 100 million
         fcb   $1e,$ee,$6b,$28,$00 1 billion
         fcb   $22,$95,$02,$f9,$00 10 billion
         fcb   $25,$ba,$43,$b7,$40 100 billion
         fcb   $28,$e8,$d4,$a5,$10 1 trillion
         fcb   $2c,$91,$84,$e7,$2a 10 trillion
         fcb   $2f,$b5,$e6,$20,$f4 100 trillion
         fcb   $32,$e3,$5f,$a9,$32 1 quadrillion
         fcb   $36,$8e,$1b,$c9,$c0 10 quadrillion
         fcb   $39,$b1,$a2,$bc,$2e 100 quadrillion
         fcb   $3c,$de,$0b,$6b,$3a 1 quintillion
L513E    fcb   $40,$8a,$c7,$23,$04 10 quintillion

L5143    fcc   'True'    
         fcb   $ff       

L5148    fcc   'False'   
         fcb   $ff       

* <u0024 function 2
L514E    pshs  u         
         leay  -6,y       Make room for temp var
         clra            
         clrb            
* 6809/6309 MOD: Change following 4 lines to STD <u0075, STD <u0077
         sta   <u0075     ??? Zero out real # in DP?
         sta   <u0076    
         sta   <u0077    
         sta   <u0078    
         sta   <u0079    
         std   4,y        ??? Zero out temp real #
         std   2,y       
         sta   1,y       
         lbsr  L5390     
         bcc   L5172     
         leax  -1,x      
         cmpa  #$2C      
         bne   L51DE     
         lbra  L51FB     

L5172    cmpa  #$24      
         lbeq  L52B2     
         cmpa  #$2B      
         beq   L5182     
         cmpa  #$2D      
         bne   L5184     
         inc   <u0078    
L5182    lda   ,x+       
L5184    cmpa  #$2E      
         bne   L5190     
         tst   <u0077    
         bne   L51DE     
         inc   <u0077    
         bra   L5182     

L5190    lbsr  L57DE     
         bcs   L51E5     
         pshs  a         
         inc   <u0076    
         ldd   4,y       
         ldu   2,y       
         bsr   L51CB     
         std   4,y       
         stu   2,y       
         bsr   L51CB     
         bsr   L51CB     
         addd  4,y       
         exg   d,u       
* 6309 mod: ADCD 2,y
         adcb  3,y       
         adca  2,y       
         bcs   L51D8     
         exg   d,u       
         addb  ,s+       
         adca  #$00      
         bcc   L51BF     
         leau  1,u       
         stu   2,y       
         beq   L51DA     
L51BF    std   4,y       
         stu   2,y       
         tst   <u0077    
         beq   L5182     
         inc   <u0079    
         bra   L5182     

L51CB    lslb            
         rola            
         exg   d,u       
         rolb            
         rola            
         exg   d,u       
         bcs   L51D6     
         rts             

L51D6    leas  2,s       
L51D8    leas  1,s       
L51DA    ldb   #$3C       I/O conversion: Number out of range error
         bra   L51E0     

L51DE    ldb   #$3B      
L51E0    stb   <u0036    
         coma            
         puls  pc,u      

L51E5    eora  #$45      
         anda  #$DF      
         beq   L520E     
         leax  -1,x      
         tst   <u0076    
         bne   L51F3     
         bra   L51DE     

L51F3    tst   <u0077    
         bne   L523C     
         ldd   2,y       
         bne   L523C     
L51FB    ldd   4,y       
         bmi   L523C     
         tst   <u0078    
         beq   L5207     
         nega             NEGD
         negb            
         sbca  #$00      
L5207    std   1,y       
L5209    lda   #$01      
         lbra  L5295     

L520E    lda   ,x        
         cmpa  #$2B      
         beq   L521A     
         cmpa  #$2D      
         bne   L521C     
         inc   <u0075    
L521A    leax  1,x       
L521C    lbsr  L57DC     
         bcs   L51DE     
         tfr   a,b       
         lbsr  L57DC     
         bcc   L522C     
         leax  -1,x      
         bra   L5233     

L522C    pshs  a          Save 1's digit
         lda   #10        Multiply by 10 (for 10's digit)
         mul             
         addb  ,s+       
L5233    tst   <u0075    
         bne   L5238     
         negb            
L5238    addb  <u0079    
         stb   <u0079    
L523C    ldb   #$20      
         stb   1,y       
         ldd   2,y       
         bne   L524D     
         cmpd  4,y       
         bne   L524D     
         clr   1,y       
         bra   L5293     

L524D    tsta            
         bmi   L525A     
L5250    dec   1,y       
         lsl   5,y       
         rol   4,y       
         rolb            
         rola            
         bpl   L5250     
L525A    std   2,y       
         clr   <u0075    
         ldb   <u0079    
         beq   L528B     
         bpl   L5267     
         negb            
         inc   <u0075    
L5267    cmpb  #$13      
         bls   L527B     
         subb  #$13      
         pshs  b         
         leau  >L513E,pc 
         bsr   L529B     
         puls  b         
         lbcs  L51DA     
L527B    decb            
         lda   #5        
         mul             
         leau  >L50E4,pc 
         leau  b,u       
         bsr   L529B     
         lbcs  L51DA     
L528B    lda   5,y       
         anda  #$FE      
         ora   <u0078    
         sta   5,y       
L5293    lda   #2         Real # type
L5295    sta   ,y         Save it in var packet
         andcc  #$FE       Clear carry (no error)
         puls  pc,u      

L529B    leay  -6,y       Make room for temp var
         IFNE  H6309
         ldq   ,u         Copy real # from ,u to 1,y
         stq   1,y       
         ELSE            
         ldd   ,u         Get real # from ,u
         std   1,y        Save into real portion of var packet
         ldd   2,u       
         std   3,y       
         ENDC            
         ldb   4,u       
         stb   5,y       
         lda   <u0075     Get sign of exponent?
         lbeq  L4234      Real Divide
         lbra  L40D3      Real Multiply

L52B2    lbsr  L57DC     
         bcc   L52C7     
         cmpa  #$61      
         blo   L52BD     
         suba  #$20      
L52BD    cmpa  #$41      
         blo   L52DC     
         cmpa  #$46      
         bhi   L52DC     
         suba  #$37      
L52C7    inc   <u0076    
         ldb   #4         Loop counter for shift
L52CB    lsl   2,y       
         rol   1,y       
         lbcs  L51DA      If carried right out of byte, error
         decb            
         bne   L52CB      Do all 4 shifts
         adda  2,y       
         sta   2,y       
         bra   L52B2     

L52DC    leax  -1,x      
         tst   <u0076    
         lbeq  L51DE     
         lbra  L5209     

L52E7    pshs  x          Preserve X
         ldx   <u0082     Get current pos in temp buffer
         lbsr  L514E     
         bcc   L52F2     
L52F0    puls  pc,x      

L52F2    cmpa  #2         Real #?
         beq   L52F9      Yes, continue ahead
         lbsr  L509B      ??? convert to real?
L52F9    lbsr  L5384     
         bcs   L5305     
         ldb   #$3D       Illegal input format error
         stb   <u0036     Save error code
         coma             Set carry
         puls  pc,x       Restore X & return

L5305    stx   <u0082     Save new current pos in temp buffer
         clra             No error
         puls  pc,x       Restore X & return

L530A    pshs  x          Preserve X
         ldx   <u0082     Get current pos in temp buffer
         lbsr  L514E      ??? (returns A=var type)
         bcs   L52F0     
         cmpa  #1         Integer?
         bne   L532A     
         tst   1,y       
         beq   L52F9     
         bra   L532A     

L531D    pshs  x         
         ldx   <u0082     Get current pos in temp buffer
         lbsr  L514E     
         bcs   L52F0     
         cmpa  #1         Integer?
         beq   L52F9      Yes, go back
L532A    ldb   #$3A       I/O Type mismatch error
* TO SAVE ROOM, SINCE ERRORS AREN'T CRUCIAL TO SPEED, MAY WANT THIS TO
* BRANCH TO SAME CODE @ L52F9
         stb   <u0036    
         coma            
         puls  pc,x      

L5331    pshs  u,x       
         leay  -6,y       Make room for temp var
         ldu   <u004A    
         stu   1,y        ??? Save some string ptr
         lda   #4         Type=String/complex
         sta   ,y        
         ldx   <u0082    
L533F    lda   ,x+       
         bsr   L5396     
         bcs   L5349     
         sta   ,u+       
         bra   L533F     

L5349    stx   <u0082    
         lda   #$FF       Flag end of string?
         sta   ,u+       
         stu   <u0048    
         clra            
         puls  pc,u,x    

L5354    pshs  x         
         leay  -6,y      
         lda   #3        
         sta   ,y        
         clr   2,y       
         ldx   <u0082    
         bsr   L5390     
         bcs   L537F     
         cmpa  #'T       
         beq   L5379     
         cmpa  #'t       
         beq   L5379     
         eora  #$46      
         anda  #$DF      
         beq   L537B     
         ldb   #$3A      
         stb   <u0036    
         coma            
         puls  pc,x      

L5379    com   2,y       
L537B    bsr   L5384     
         bcc   L537B     
L537F    stx   <u0082    
         clra            
         puls  pc,x      

L5384    lda   ,x+       
         cmpa  #C$SPAC   
         bne   L5396     
         bsr   L5390     
         bcc   L53A5     
         bra   L53A7     

L5390    lda   ,x+        Get char
         cmpa  #C$SPAC    Space?
         beq   L5390      Yes, ignore & get next char
L5396    cmpa  <u00DD     Char we are looking for?
         beq   L53A7      Yes, set carry & exit
         cmpa  #C$CR      Carriage return?
         beq   L53A5      Yes, point X to it, set carry & exit
         cmpa  #$FF       End of string marker?
         beq   L53A5      Yes, point X to it, set carry & exit
         andcc  #$FE       Clear carry & return
         rts             

L53A5    leax  -1,x      
L53A7    orcc  #$01      
         rts             

L53AA    pshs  u,x       
         clra            
         sta   3,y       
         sta   <u0076    
         sta   <u0078    
         lda   #$04      
         sta   <u007E    
         ldd   1,y       
         bpl   L53C1      If positive, skip ahead
         nega             NEGD
         negb            
         sbca  #$00      
         inc   <u0078     Set flag?
L53C1    leau  >L50DA,pc 
L53C5    clr   <u007A    
         leau  2,u       
L53C9    subd  ,u        
         bcs   L53D1     
         inc   <u007A    
         bra   L53C9     

L53D1    addd  ,u        
         tst   <u007A    
         bne   L53DB     
         tst   $03,y     
         beq   L53E6     
L53DB    inc   $03,y     
         pshs  a         
         lda   <u007A    
         lbsr  L54EA     
         puls  a         
L53E6    dec   <u007E    
         bne   L53C5     
         tfr   b,a       
         lbsr  L54EA     
         leay  $06,y     
         puls  pc,u,x    

* NOTE: 6809/6309 mod
L53F3    pshs  u,x       
         clr   <u0075     Replace with CLRA/CLRB/STD <u0075/STD <u0078/
         clr   <u0078     STD <u007B (smaller & faster)
         clr   <u007C    
         clr   <u007B    
         clr   <u0079    
         clr   <u0076    
         leau  ,x        
         ldd   #$0A30     Store 10 ASCI 0's at U
L5406    stb   ,u+       
         deca            
         bne   L5406     
         ldd   1,y       
         bne   L5413     
         inca            
         lbra  L54E4     

L5413    ldb   5,y       
         bitb  #$01      
         beq   L541F     
         stb   <u0078    
         andb  #$FE      
         stb   5,y       
L541F    ldd   1,y        If this code is legit, why load D? just A?
         bpl   L5426     
         inc   <u0075    
         nega            
L5426    cmpa  #3        
         bls   L5457     
         ldb   #$9A       (154)
         mul             
         lsra            
         nop              WHY ARE THESE HERE?
         nop             
         tfr   a,b       
         tst   <u0075    
         beq   L5437     
         negb            
L5437    stb   <u0079    
         cmpa  #$13      
         bls   L544A     
         pshs  a         
         leau  >L513E,pc 
         lbsr  L529B     
         puls  a         
         suba  #$13      
L544A    leau  >L50E4,pc 
         deca            
         ldb   #$05      
         mul             
         leau  d,u       
         lbsr  L529B     
L5457    ldd   2,y       
         tst   1,y       
         beq   L5483     
         bpl   L546F     
L545F    lsra            
         rorb            
         ror   $04,y     
         ror   $05,y     
         ror   <u007C    
         inc   $01,y     
         bne   L545F     
         std   $02,y     
         bra   L5483     

L546F    lsl   $05,y     
         rol   $04,y     
         rolb            
         rola            
         rol   <u007B    
         dec   $01,y     
         bne   L546F     
         std   $02,y     
         inc   <u0079    
         lda   <u007B    
         bsr   L54EA     
L5483    ldd   $02,y     
         ldu   $04,y     
L5487    clr   <u007B    
         bsr   L54F1     
         std   $02,y     
         stu   $04,y     
         pshs  a         
         lda   <u007B    
         sta   <u007C    
         puls  a         
         bsr   L54F1     
         bsr   L54F1     
         exg   d,u       
         addd  $04,y     
         exg   d,u       
         adcb  $03,y     
         adca  $02,y     
         pshs  a         
         lda   <u007B    
         adca  <u007C    
         bsr   L54EA     
         lda   <u0076    
         cmpa  #$09      
         puls  a         
         beq   L54C1     
         cmpd  #$0000    
         bne   L5487     
         cmpu  #$0000    
         bne   L5487     
L54C1    sta   ,y        
         lda   <u0076    
         cmpa  #$09      
         bcs   L54E2     
         ldb   ,y        
         bpl   L54E2     
L54CD    lda   ,-x       
         inca            
         sta   ,x        
         cmpa  #$39      
         bls   L54E2     
         lda   #$30      
         sta   ,x        
         cmpx  ,s        
         bne   L54CD     
         inc   ,x        
         inc   <u0079    
L54E2    lda   #$09      
L54E4    sta   <u0076    
         leay  6,y       
         puls  pc,u,x    

L54EA    ora   #$30      
         sta   ,x+       
         inc   <u0076    
         rts             

L54F1    exg   d,u       
         lslb            
         rola            
         exg   d,u       
         rolb            
         rola            
         rol   <u007B    
         rts             

L54FC    pshs  y,x       
         ldx   <u0080    
         stx   <u0082    
         lda   #$01      
         sta   <u007D    
         ldy   #$0100    
         lda   <u007F    
         os9   I$ReadLn  
         bra   L5524     

L5511    pshs  y,x       
         ldd   <u0082    
         subd  <u0080    
         beq   L5528     
         tfr   d,y       
         ldx   <u0080    
         stx   <u0082    
         lda   <u007F    
         os9   I$WritLn  
L5524    bcc   L5528     
         stb   <u0036     Save error code
L5528    puls  pc,y,x    

L552A    pshs  u,x       
         lda   ,y        
         cmpa  #$02      
         beq   L5536     
         ldu   $01,y     
         bra   L553D     

L5536    lda   $01,y     
         bgt   L5542     
         ldu   #$0000    
L553D    ldx   #$0000    
         bra   L555E     

L5542    ldx   $02,y     
         ldu   $04,y     
         suba  #$20      
         bcs   L554F     
         ldb   #$4E      
         coma            
         bra   L5565     

L554F    exg   x,d       
         lsra            
         rorb            
         exg   d,u       
         rora            
         rorb            
         exg   d,x       
         exg   x,u       
         inca            
         bne   L554F     
L555E    lda   <u007F    
         os9   I$Seek    
         bcc   L5567     
L5565    stb   <u0036     Save error code
L5567    puls  pc,u,x    

L5569    pshs  u,x       
         leas  -$0A,s    
         leax  ,s        
         lbsr  L53F3     
         pshs  x         
         lda   #$09      
         leax  9,x       
L5578    ldb   ,-x       
         cmpb  #$30      
         bne   L5583     
         deca            
         cmpa  #$01      
         bne   L5578     
L5583    sta   <u0076    
         puls  x         
         ldb   <u0079    
         bgt   L55AC     
         negb            
         tfr   b,a       
         cmpb  #$09      
         bhi   L55C6     
         addb  <u0076    
         cmpb  #$09      
         bhi   L55C6     
         pshs  a         
         lbsr  L5643     
         clra            
         bsr   L5612     
         puls  b         
         tstb            
         beq   L55A8     
         lbsr  L5634     
L55A8    lda   <u0076    
         bra   L55BF     

L55AC    cmpb  #$09      
         bhi   L55C6     
         lbsr  L5643     
         tfr   b,a       
         bsr   L5601     
         bsr   L5612     
         lda   <u0076    
         suba  <u0079    
         bls   L55C1     
L55BF    bsr   L5601     
L55C1    leas  $0A,s     
         clra            
         puls  pc,u,x    

L55C6    bsr   L5643     
         lda   #$01      
         bsr   L5601     
         bsr   L5612     
         lda   <u0076    
         deca            
         bne   L55D4     
         inca            
L55D4    bsr   L5601     
         bsr   L55DA     
         bra   L55C1     

L55DA    lda   #$45      
         bsr   L5614     
         lda   <u0079    
         deca            
         pshs  a         
         bpl   L55EB     
         neg   ,s        
         bsr   L5647     
         bra   L55ED     

L55EB    bsr   L564B     
L55ED    puls  b         
         clra            
L55F0    subb  #$0A      
         bcs   L55F7     
         inca            
         bra   L55F0     

L55F7    addb  #$0A      
         bsr   L55FD     
         tfr   b,a       
L55FD    adda  #$30      
         bra   L5614     

L5601    tfr   a,b       
         tstb            
         beq   L560D     
L5606    lda   ,x+       
         bsr   L5614     
         decb            
         bne   L5606     
L560D    rts             

L560E    lda   #$20      
         bra   L5614     

L5612    lda   #$2E      
L5614    pshs  u,a        Preserve regs
         leau  <-$40,s    Is stack within 64 bytes of curr. pos in temp buff
         cmpu  <u0082    
         bhi   L562A      No, skip ahead
         cmpa  #C$CR      Is char we want added a CR?
         beq   L562A      Yes, skip ahead
         lda   #$50       ??? Error code 80? (internal flag byte?)
         sta   <u0036     ??? Save error code 80?
         sta   <u00DE     Save here too
         puls  pc,u,a     Restore regs & return

L562A    ldu   <u0082     Get current pos in temp buffer
         sta   ,u+        Save char there
         stu   <u0082     Save new current pos in temp buffer
         inc   <u007D     Inc # active chars in temp buffer
L5632    puls  pc,u,a     Restore regs & return

L5634    lda   #$30      
L5636    tstb             Any chars left to do?
         beq   L563E      No, exit
L5639    bsr   L5614      Save char (check for size within 64 of stack?)
         decb             Done all chars?
         bne   L5639      No, keep adding chars
L563E    rts             

L563F    tst   <u0078    
         beq   L560E     
L5643    tst   <u0078    
         beq   L563E     
L5647    lda   #$2D      
         bra   L5614     

L564B    lda   #$2B      
         bra   L5614     

L564F    lda   #C$SPAC    Space is fill char
         bra   L5636      Go add B # of spaces to temp buffer

L5653    bsr   L5614     
L5655    lda   ,x+       
         cmpa  #$FF      
         bne   L5653     
         rts             

L565C    pshs  x         
         ldx   1,y       
L5660    bsr   L5655     
         clra            
         puls  pc,x      

L5665    pshs  x         
         leax  >L5143,pc 
         lda   2,y       
         bne   L5660     
         leax  >L5148,pc 
         bra   L5660     

L5675    pshs  u,x       
         leas  -5,s      
         leax  ,s        
         lbsr  L53AA     
         bsr   L5643     
         lda   <u0076    
         leax  ,s        
         lbsr  L5601     
         leas  5,s       
         clra            
         puls  pc,u,x    

* <u002A Function 2, sub-function $10 - Add B spaces to temp buffer
* Entry: A=# spaces to append to temp buffer
L568C    tfr   a,b        Move byte we are working with to B
L568E    pshs  u          Preserve U
         ldu   <u0082     Get ptr to current pos in temp buffer
         subb  <u007D     Callers # - # chars active in temp buffer
         bls   L5698      If 0 or wraps negative, skip ahead
         bsr   L564F      Go add chars
L5698    clra             No error?
         puls  pc,u       Restore U & return

L569B    lbsr  L560E     
L569E    lda   <u007D    
         anda  #$0F      
         cmpa  #$01      
         beq   L56B2     
         lbsr  L560E     
         bra   L569E     

L56AB    lda   #C$CR     
         clr   <u007D    
         lbsr  L5614     
L56B2    clra            
         rts             

L56B4    pshs  u         
         lda   #$04      
         leau  ,y        
         tst   ,u        
         bne   L56C1     
         asra            
         leau  1,u       
L56C1    sta   <u0086    
         tfr   a,b       
         asrb            
         lbsr  L585D     
         puls  pc,u      

L56CB    clrb            
         stb   <u0087    
         cmpa  #$3C      
         beq   L56DE     
         cmpa  #$3E      
         bne   L56D9     
         incb            
         bra   L56DE     

L56D9    cmpa  #$5E      
         bne   L56E2     
         decb            
L56DE    stb   <u0087    
         lda   ,x+       
L56E2    cmpa  #$2C      
         beq   L571E     
         cmpa  #$FF      
         bne   L56FC     
         lda   <u0094    
         beq   L56F2     
         leax  -$01,x    
         bra   L5707     

L56F2    ldx   <u008E    
         tst   <u00DC    
         beq   L5700     
         clr   <u00DC    
         bra   L571E     

L56FC    cmpa  #$29      
         beq   L5703     
L5700    orcc  #$01      
         rts             

L5703    lda   <u0094    
         beq   L5700     
L5707    dec   <u0092    
         bne   L571C     
         ldu   <u0046    
         pulu  y,a       
         sta   <u0092    
         sty   <u0090    
         stu   <u0046    
         lda   ,x+       
         dec   <u0094    
         bra   L56E2     

L571C    ldx   <u0090    
L571E    stx   <u008C    
         andcc  #$FE      
         rts             

* Print USING format specifiers
L5723    fcc   'I'        Integer
         fdb   L5802-L5723
L5726    fcc   'H'        Hexidecimal
         fdb   L5802-L5726
L5729    fcc   'R'        Real
         fdb   L57F8-L5729
L572C    fcc   'E'        Exponential
         fdb   L57F8-L572C
L572F    fcc   'S'        String
         fdb   L5802-L572F
L5732    fcc   'B'        Boolean
         fdb   L5802-L5732
L5735    fcc   'T'        Tab
         fdb   L573F-L5735
L5738    fcc   'X'        Spaces
         fdb   L574A-L5738
L573B    fcc   "'"        Quoted text
         fdb   L5755-L573B
L573E    fcb   $00        End of table marker

* 'T' (tab)
L573F    bsr   L56E2     
         bcs   L57A7     
         ldb   <u0086    
         lbsr  L568E     
         bra   L5772     

* 'X' (spaces)
L574A    bsr   L56E2     
         bcs   L57A7     
         ldb   <u0086    
         lbsr  L564F     
         bra   L5772     

* '' (quoted text)
L5755    cmpa  #$FF       End of string?
         beq   L57A7      Yes, skip ahead
         cmpa  #$27       A single quote (')?
         bne   L5765      No, skip ahead
         lda   ,x+       
         bsr   L56E2     
         bcs   L57A7     
         bra   L5772     

L5765    lbsr  L5614     
         lda   ,x+       
         bra   L5755     

L576C    pshs  y,x       
         clr   <u00DC    
         inc   <u00DC    
L5772    ldx   <u008C    
         bsr   L57C2     
         bcs   L5791     
         cmpa  #'(        Repeat char?
         bne   L57AB     
         lda   <u0092    
         stb   <u0092    
         beq   L57AB     
         inc   <u0094    
         ldu   <u0046    
         ldy   <u0090    
         pshu  y,a       
         stu   <u0046    
         stx   <u0090    
         lda   ,x+       
L5791    leay  <L5723,pc  Point to start of specifiers table
         clrb             Init Specifier # to 0
L5796    pshs  a          Preserve original char
         eora  ,y         Flip any differing bits
         anda  #$DF       Mask out uppercase bit
         puls  a          Restore original char
         beq   L57B2      If char matches, skip ahead
         leay  3,y        Point to next table entry
         incb             Bump up specifier #
         tst   ,y         Are we at the end?
         bne   L5796      Nope, keep looking
L57A7    ldb   #$3F       I/O Format Syntax Error
         bra   L57AD      Exit with error

L57AB    ldb   #$3E      

L57AD    stb   <u0036     Save error code
         coma             Set carry
         puls  pc,y,x     Restore regs & return

* Found specifier match
L57B2    stb   <u0085     Save specifier #
         ldd   1,y        Get offset
         leay  d,y        Add to base address
         bsr   L57C2      Get up to 3 digit ASCII #'s, convert to binary
         bcc   L57BE      Got it, skip ahead
         ldb   #$01       None found, force to 1
L57BE    stb   <u0086     Save binary version of number
         jmp   ,y         Execute PRINT USING specifier routine

* Convert 3 digit ASCII decimal # @ ,X to binary equivalent. Carry clear if
* done, carry set if not ASCII decimal digits present
L57C2    bsr   L57DC      Go try & get ASCII number 0-9
* NOTE: 6809/6309 MOD, CHANGE TO BCS TO RTS, NOT ORCC/RTS
         bcs   L57ED      None found, Set carry & exit
         tfr   a,b        Move binary digit 0-9 to B
         bsr   L57DC      Try & get another ASCII number 0-9
         bcs   L57E8      Couldn't, exit with carry clear anyways
         bsr   L57EE      Convert 2 digit # into binary version (D)
         bsr   L57DC      Try & get another ASCII number 0-9
         bcs   L57E8      Couldn't, exit with carry clear anyways
         bsr   L57EE      Convert this digit & add to previous total
         tsta             result <255? (useless, ADCA should set flags)
         beq   L57D8      Yes, get next char & exit with carry clear
         clrb             Force result to 256
L57D8    lda   ,x+        Get next char
         bra   L57E8      Exit with carry clear

L57DC    lda   ,x+        Get char
L57DE    cmpa  #'0        If not ASCII 0-9, exit with carry set
         blo   L57ED      (Same as BCS)
         cmpa  #'9       
         bhi   L57EB     
         suba  #$30       If it is 0-9, convert to binary & exit with
L57E8    andcc  #$FE       carry clear
         rts             

L57EB    orcc  #$01      
L57ED    rts             

* Entry: A=LSB of ASCII 0-9 converted to binary, B=MSB
* IF NOT CALLED BY OTHER ROUTINES USING IT, MAY WANT TO USE DP LOCATION 14
* INSTEAD OF STACK
L57EE    pshs  a          Save Low nibble?
         lda   #10        Multiply B by 10
         mul             
         addb  ,s+        Add to saved nibble
         adca  #$00       possible carry into D
         rts             

L57F8    cmpa  #'.       
         bne   L57A7     
         bsr   L57C2     
         bcs   L57A7     
         stb   <u0089    

L5802    lbsr  L56CB     
         bcs   L57A7     
         puls  y,x       
         inc   <u00DC    
L580B    ldb   <u0085    
         lbeq  L58B3     
         decb            
         beq   L5826     
         decb            
         lbeq  L5969     
         decb            
         lbeq  L5A10     
         decb            
         lbeq  L591E     
         lbra  L5904     

L5826    jsr   <u0016    
         cmpa  #4         Numeric?
         blo   L583C      Yes, skip ahead
         ldu   1,y        Get ptr to string data
         clrb             Clear count=0
L582F    lda   ,u+        Get char from string
         cmpa  #$FF       EOS?
         beq   L5838      Yes, skip ahead
         incb             Bump up count
         bne   L582F      Do until EOS or 256 chars
L5838    ldu   1,y        Get string ptr again
         bra   L585D      Skip ahead with U=ptr to string, B=size of string

L583C    leau  1,y       
         lda   ,y         Get var type
         cmpa  #2         Real #?
         bne   L5848      No, skip ahead
         ldb   #5         Yes, force size to 5 bytes
         bra   L585D     

L5848    cmpa  #1         Integer?
         bne   L5852      No, skip ahead
         ldb   #2         Yes, size=2 bytes
         cmpb  <u0086     Same or less than ???
         blo   L5856      Yes, leave as 2
L5852    ldb   #1         Anything else (BYTE/BOOLEAN) is 1 byte
         leau  1,u       
L5856    tfr   b,a       
         lsla            
         cmpa  <u0086    
         bhi   L5893     
L585D    tst   <u0087    
         beq   L5889     
         bmi   L5870     
         pshs  b         
         lslb            
         pshs  b          SUBR
         ldb   <u0086    
         subb  ,s+       
         blo   L5887     
         bra   L587C     

L5870    pshs  b         
         lslb            
         pshs  b         
         ldb   <u0086    
         subb  ,s+       
         bcs   L5887     
         asrb            
L587C    pshs  b         
         lda   <u0086    
         suba  ,s+       
         sta   <u0086    
         lbsr  L564F     
L5887    puls  b         
L5889    lda   ,u        
         lsra            
         lsra            
         lsra            
         lsra            
         bsr   L58A3     
         beq   L58A1     
L5893    lda   ,u+       
         bsr   L58A3     
         beq   L58A1     
         decb            
         bne   L5889     
         ldb   <u0086    
         lbsr  L564F     
L58A1    clra            
         rts             

L58A3    anda  #$0F      
         cmpa  #$09      
         bls   L58AB     
         adda  #$07      
L58AB    lbsr  L55FD     
         dec   <u0086    
         rts             

L58B1    coma            
         rts             

L58B3    jsr   <u0016    
         cmpa  #$02      
         bcs   L58BE     
         bne   L58B1     
         lbsr  L5098     
L58BE    pshs  u,x       
         leas  -5,s      
         leax  ,s        
         lbsr  L53AA     
         ldb   <u0086    
         decb            
         subb  <u0076    
         bpl   L58D5     
         leas  5,s       
         puls  u,x       
         lbra  L5A07     

L58D5    tst   <u0087    
         beq   L58E3     
         bmi   L58F4     
         lbsr  L564F     
         lbsr  L563F     
         bra   L58FA     

L58E3    lbsr  L563F     
         pshs  b         
         lda   <u0076    
         lbsr  L5601     
         puls  b         
         lbsr  L564F     
         bra   L58FF     

L58F4    lbsr  L563F     
         lbsr  L5634     
L58FA    lda   <u0076    
         lbsr  L5601     
L58FF    leas  5,s       
         clra            
         puls  pc,u,x    

L5904    jsr   <u0016     Go get var type
         cmpa  #3         Boolean?
         bne   L58B1      No, set carry & exit
         pshs  u,x        Preserve regs
         leax  >L5143,pc  Point to 'True'
         ldb   #4         Size of 'True'
         lda   2,y        Get boolean value
         bne   L5932      $FF is true, so skip ahead
         leax  >L5148,pc  Point to 'False'
         ldb   #5         Size of 'False'
         bra   L5932      Go deal with it

L591E    jsr   <u0016     Go get var type
         cmpa  #4         String?
         bne   L58B1      No, exit with carry set
         pshs  u,x        Preserve regs
         ldx   1,y        Get ptr to string
         ldd   <u0048    
         subd  1,y       
         subd  #1        
         tsta            
         bne   L5936     
L5932    cmpb  <u0086    
         bls   L5938     
L5936    ldb   <u0086    
L5938    tfr   b,a       
         negb            
         addb  <u0086    
         tst   <u0087    
         beq   L594F     
         bmi   L5953     
         pshs  a         
         lbsr  L564F     
         puls  a         
         lbsr  L5601     
         bra   L5966     

L594F    pshs  b         
         bra   L595E     

L5953    lsrb            
         bcc   L5957     
         incb            
L5957    pshs  d         
         lbsr  L564F     
         puls  a         
L595E    lbsr  L5601     
         puls  b         
         lbsr  L564F     
L5966    clra            
         puls  pc,u,x    

L5969    jsr   <u0016     Go get var type
         cmpa  #2         Real?
         beq   L5976      Yes, skip ahead
         lbcc  L58B1      If carry clear, set carry & exit
         lbsr  L509B      ??? possible convert?
L5976    pshs  u,x       
         leas  -$0A,s    
         leax  ,s        
         lbsr  L53F3     
         lda   <u0079    
         cmpa  #$09      
         bgt   L5996     
         lbsr  L5A6A     
         lda   <u0086    
         suba  #$02      
         bmi   L5996     
         suba  <u0089    
         bmi   L5996     
         suba  <u008A    
         bpl   L599C     
L5996    leas  $0A,s     
         puls  u,x       
         bra   L5A07     

L599C    sta   <u0088    
         leax  ,s        
         ldb   <u0087    
         beq   L59AC     
         bmi   L59B2     
         bsr   L59E9     
         bsr   L59BE     
         bra   L59B9     

L59AC    bsr   L59BE     
         bsr   L59E9     
         bra   L59B9     

L59B2    bsr   L59E9     
         bsr   L59C1     
         lbsr  L563F     
L59B9    leas  $0A,s     
         clra            
         puls  pc,u,x    

L59BE    lbsr  L563F     
L59C1    lda   <u008A    
         lbsr  L5601     
         lbsr  L5612     
         ldb   <u0079    
         bpl   L59F9     
         negb            
         cmpb  <u0089    
         bls   L59D4     
         ldb   <u0089    
L59D4    pshs  b         
         lbsr  L5634     
         ldb   <u0089    
         subb  ,s+       
         stb   <u0089    
         lda   <u008B    
         cmpa  <u0089    
* 6809/6309 MOD: SHOULD BE BLS L59FB
         bls   L59E7     
         lda   <u0089    
L59E7    bra   L59FB     

L59E9    ldb   <u0088    
         lbra  L564F     

L59EE    lbsr  L563F     
         lda   <u008A    
         lbsr  L5601     
         lbsr  L5612     
L59F9    lda   <u008B    
L59FB    lbsr  L5601     
         ldb   <u0089    
         subb  <u008B    
         ble   L5A0F     
         lbra  L5634     

L5A07    ldb   <u0086    
         lda   #$2A       * (?)
         lbsr  L5636     
         clra            
L5A0F    rts             

L5A10    jsr   <u0016     Go get variable type
         cmpa  #2         Real?
         beq   L5A1D      Yes, skip ahead
         lbcc  L58B1      If carry clear, set carry & exit
         lbsr  L509B      ??? Convert to real?
L5A1D    pshs  u,x       
         leas  -$0A,s    
         leax  ,s        
         lbsr  L53F3     
         lda   <u0079    
         pshs  a         
         lda   #1        
         sta   <u0079    
         bsr   L5A6A     
         puls  a         
         ldb   <u0079    
         cmpb  #1        
         beq   L5A39     
         inca            
L5A39    ldb   #1        
         stb   <u008A    
         sta   <u0079    
         lda   <u0086    
         suba  #6        
         bmi   L5A4D     
         suba  <u0089    
         bmi   L5A4D     
         suba  <u008A    
         bpl   L5A53     
L5A4D    leas  $0A,s     
         puls  u,x       
         bra   L5A07     

L5A53    sta   <u0088    
         ldb   <u0087    
         beq   L5A62     
         bsr   L59E9     
         bsr   L59EE     
         lbsr  L55DA     
         bra   L5A67     

L5A62    bsr   L59EE     
         lbsr  L55DA     
L5A67    lbra  L59B9     

L5A6A    pshs  x          Save ptr to beginning of string number
         lda   <u0079    
         adda  <u0089    
         bne   L5A78     
         lda   ,x        
         cmpa  #$35      
         bcc   L5A8F     
L5A78    deca            
         bmi   L5AAB     
         cmpa  #$07      
         bhi   L5AAB     
         leax  a,x       
         ldb   1,x       
         cmpb  #$35      
         blo   L5AAB     
L5A87    inc   ,x         Inc ASCII digit
         ldb   ,x         Get digit
         cmpb  #'9        Past 9?
         bls   L5AAB      No, skip ahead
L5A8F    ldb   #'0        Wrap to 0
         stb   ,x        
         leax  -1,x       Bump ptr back
         cmpx  ,s         Hit beginning of text string yet?
         bhs   L5A87      No, loop back & continue
         ldx   ,s         Get beginning of text string ptr
         leax  8,x        Point 8 bytes past start
L5A9D    lda   ,-x        Block move bytes from 0-6 to 1-7
         sta   1,x       
         cmpx  ,s         Done moving?
         bhi   L5A9D      No, keep going until done
         lda   #'1        Force 1st digit to 1
         sta   ,x        
         inc   <u0079    
L5AAB    puls  x          Get string ptr back
         lda   <u0079    
         bpl   L5AB2     
         clra            
L5AB2    sta   <u008A    
         nega            
         adda  #$09      
         bpl   L5ABA     
         clra            
L5ABA    cmpa  <u0089    
         bls   L5AC0     
         lda   <u0089    
L5AC0    sta   <u008B    
         rts             

L5AC3    ldb   #48        Unimplemented routine error
         stb   <u0036     Save error code
         coma             Exit with error
         rts             

         emod            
eom      equ   *         
         end