       0001          00 E0    DHITOK    EQU    $E1                                 HIGHEST 1.1 DISK TOKEN
       0002          00 32    CYEAR     EQU    '2'
       0003                   *
       0004                   *
       0005                   *
       0006                   **
       0007                   **** FILE ALLOCATION TABLE FORMAT
       0008                   **
       0009                   *
       0010                   * THE FILE ALLOCATION TABLE (FAT) CONTAINS THE STATUS OF THE GRANULES ON A DISKETTE.
       0011                   * THE FAT CONTAINS 6 CONTROL BYTES FOLLOWED BY 68 DATA BYTES (ONE PER GRANULE). ONLY THE
       0012                   * FIRST TWO OF THE SIX CONTROL BYTES ARE USED. A VALUE OF $FF IS SAVED IN UNALLOCATED
       0013                   * GRANULES. IF BITS 6 & 7 OF THE DATA BYTE ARE SET, THE GRANULE IS THE LAST GRANULE
       0014                   * IN A FILE AND BITS 0-5 ARE THE NUMBER OF USED SECTORS IN THAT GRANULE. IF BITS 6 & 7
       0015                   * ARE NOT SET, THE DATA BYTE CONTAINS THE NUMBER OF THE NEXT GRANULE IN THE FILE.
       0016
       0017                   * OFFSETS TO FAT CONTROL BYTES
       0018          00 00    FAT0      EQU    0                                   ACTIVE FILE COUNTER : DISK TO RAM FAT IMAGE DISABLE
       0019          00 01    FAT1      EQU    1                                   VALID DATA FLAG: 0=DISK DATA VALID, <> 0 = NEW FAT
       0020                   *                                                    DATA - DISK DATA INVALID
       0021                   *                2 TO 5                              NOT USED
       0022          00 06    FATCON    EQU    6                                   OFFSET TO START OF FAT DATA (68 BYTES)
       0023                   *
       0024                   **
       0025                   **** DIRECTORY ENTRY FORMAT
       0026                   **
       0027                   *
       0028                   * THE DIRECTORY IS USED TO KEEP TRACK OF HOW MANY FILES ARE STORED ON A DISKETTE
       0029                   * AND WHERE THE FILE IS STORED ON THE DISK. THE FIRST GRANULE USED BY THE FILE WILL
       0030                   * ALLOW THE FAT TO TRACK DOWN ALL OF THE GRANULES USED BY THE FILE. IF THE FIRST
       0031                   * BYTE OF THE DIRECTORY ENTRY IS ZERO, THE FILE HAS BEEN KILLED;
       0032                   * IF THE FIRST BYTE IS $FF THEN THE DIRECTORY ENTRY HAS NEVER BEEN USED.
       0033                   *
       0034                   *                BYTE                                DESCRIPTION
       0035
       0036          00 00    DIRNAM    EQU    0                                   FILE NAME
       0037          00 08    DIREXT    EQU    8                                   FILE EXTENSION
       0038          00 0B    DIRTYP    EQU    11                                  FILE TYPE
       0039          00 0C    DIRASC    EQU    12                                  ASCII FLAG
       0040          00 0D    DIRGRN    EQU    13                                  FIRST GRANULE IN FILE
       0041          00 0E    DIRLST    EQU    14                                  NUMBER OF BYTES IN LAST SECTOR
       0042                   *                16 TO 31                            UNUSED
       0043                   *
       0044                   **
       0045                   **** FILE CONTROL BLOCK FORMAT
       0046                   **
       0047                   *
       0048                   * THE FILE STRUCTURE OF COLOR TRS DOS IS CONTROLLED BY A FILE CONTROL BLOCK (FCB)
       0049                   * THE FCB CONTAINS 25 CONTROL BYTES AND A SECTOR LONG (256 BYTES) DATA BUFFER.
       0050                   * THE CONTROL BYTES CONTROL THE ORDERLY FLOW OF DATA FROM THE COMPUTER'S RAM TO
       0051                   * THE DISKETTE AND VICE VERSA. THE OPEN COMMAND INITIALIZES THE FCB; THE INPUT,
       0052                   * OUTPUT, WRITE, PRINT, GET AND PUT COMMANDS TRANSFER DATA THROUGH THE FCB AND
       0053                   * THE CLOSE COMMAND TURNS OFF THE FCB.
       0054
       0055                   * TABLES OF OFFSETS TO FCB CONTROL BYTES
       0056
       0057                   ***** RANDOM FILE
       0058                   *                BYTE                                DESCRIPTION
       0059          00 00    FCBTYP    EQU    0                                   FILE TYPE: $40=RANDOM/DIRECT, 0=CLOSED
       0060          00 01    FCBDRV    EQU    1                                   DRIVE NUMBER
       0061          00 02    FCBFGR    EQU    2                                   FIRST GRANULE IN FILE
       0062          00 03    FCBCGR    EQU    3                                   CURRENT GRANULE BEING USED
       0063          00 04    FCBSEC    EQU    4                                   CURRENT SECTOR BEING USED (1-9)
       0064                   *                5                                   UNUSED
       0065          00 06    FCBPOS    EQU    6                                   CURRENT PRINT POSITION - ALWAYS ZERO IN RANDOM FILES
       0066          00 07    FCBREC    EQU    7                                   CURRENT RECORD NUMBER
       0067          00 09    FCBRLN    EQU    9                                   RANDOM FILE RECORD LENGTH
       0068          00 0B    FCBBUF    EQU    11                                  POINTER TO START OF THIS FILE'S RANDOM ACCESS BUFFER
       0069          00 0D    FCBSOF    EQU    13                                  SECTOR OFFSET TO CURRENT POSITION IN RECORD
       0070          00 0F    FCBFLG    EQU    15                                  GET/PUT FLAG: 0=PUT, 1=PUT
       0071                   *                16,17                               NOT USED
       0072          00 12    FCBDIR    EQU    18                                  DIRECTORY ENTRY NUMBER (0-71)
       0073          00 13    FCBLST    EQU    19                                  NUMBER OF BYTES IN LAST SECTOR OF FILE
       0074          00 15    FCBGET    EQU    21                                  'GET' RECORD COUNTER: HOW MANY CHARACTERS HAVE BEEN
       0075                   *                                                    PULLED OUT OF THE CURRENT RECORD
       0076          00 17    FCBPUT    EQU    23                                  'PUT' RECORD COUNTER: POINTER TO WHERE IN THE RECORD THE NEXT
       0077                   *                                                    BYTE WILL BE 'PUT'
       0078          00 19    FCBCON    EQU    25                                  OFFSET TO START OF FCB DATA BUFFER (256 BYTES)
       0079
       0080                   ***** SEQUENTIAL FILE
       0081                   *                BYTE                                DESCRIPTION
       0082          00 00    FCBTYP    EQU    0                                   FILE TYPE: $10=INPUT, $20=OUTPUT, 0=CLOSED
       0083          00 01    FCBDRV    EQU    1                                   DRIVE NUMBER
       0084          00 02    FCBFGR    EQU    2                                   FIRST GRANULE IN FILE
       0085          00 03    FCBCGR    EQU    3                                   CURRENT GRANULE BEING USED
       0086          00 04    FCBSEC    EQU    4                                   CURRENT SECTOR BEING USED (1-9)
       0087                   FCBCPT    EQU    5                                   INPUT FILE: CHARACTER POINTER - POINTS TO NEXT CHARACTER IN
       0088                   *                                                    FILE TO BE PROCESSED.
       0089                   *                                                    OUTPUT FILE: FULL SECTOR FLAG - IF IT IS 1 WHEN THE FILE IS
       0090                   *                                                    CLOSED IT MEANS 256 BYTES OF THE LAST SECTOR HAVE BEEN USED.
       0091          00 06    FCBPOS    EQU    6                                   CURRENT PRINT POSITION
       0092          00 07    FCBREC    EQU    7                                   CURRENT RECORD NUMBER: HOW MANY WHOLE SECTORS HAVE BEEN
       0093                   *                                                    INPUT OR OUTPUT TO A FILE.
       0094                   *                9 TO 15                             UNUSED
       0095          00 10    FCBRLN    EQU    16                                  CACHE FLAG: 00=CACHE EMPTY, $FF=CACHE FULL
       0096          00 11    FCBCDT    EQU    17                                  CACHE DATA BYTE
       0097          00 12         FCBDIR    EQU     18                               DIRECTORY ENTRY NUMBER (0-71)
       0098          00 13         FCBLST    EQU     19                               NUMBER OF BYTES IN LAST SECTOR OF FILE
       0099                        *                 21,22                            UNUSED
       0100          00 17         FCBDFL    EQU     23                               INPUT FILE ONLY: DATA LEFT FLAG: 0=DATA LEFT, $FF=NO DATA (EMPTY)
       0101          00 18         FCBLFT    EQU     24                               NUMBER OF CHARACTERS LEFT IN BUFFER (INPUT FILE)
       0102                        *                                                  NUMBER OF CHARS STORED IN BUFFER (OUTPUT FILE)
       0103          00 19         FCBCON    EQU     25                               OFFSET TO FCB DATA BUFFER (256 BYTES)
       0104
       0105                                  ORG     $C000
       0106
       0107    C000 44 4B          DOSBAS    FCC     'DK'
       0108    C002 20 08          LC002     BRA     LC00C
       0109
       0110    C004 D7 5F          DCNVEC    FDB     DSKCON                           DSKCON POINTER
       0111    C006 00 EA          DSKVAR    FDB     DCOPC                            ADDRESS OF DSKCON VARIABLES
       0112    C008 DF 4C          DSINIT    FDB     DOSINI                           DISK INITIALIZATION VECTOR
       0113    C00A DF 00          DOSVEC    FDB     DOSCOM                           DOS COMMAND VECTOR
       0114
       0115                        **** ZERO OUT THE RAM USED BY DISK BASIC
       0116    C00C 8E 06 00       LC00C     LDX     #DBUF0                           POINT X TO START OF DISK RAM
       0117    C00F 6F 80          LC00F     CLR     ,X+                              CLEAR A BYTE
       0118    C011 8C 09 89                 CMPX #DFLBUF                             END OF DISK'S RAM?
       0119    C014 26 F9                    BNE     LC00F                            NO - KEEP CLEARING
       0120    C016 8E C1 09                 LDX     #LC109                           POINT X TO ROM IMAGE OF COMMAND INTERPRETATION TABLE
       0121    C019 CE 01 34                 LDU     #COMVEC+20                       POINT U TO RAM ADDRESS OF SAME
       0122    C01C C6 0A                    LDB     #10                              10 BYTES PER TABLE
       0123    C01E BD A5 9A                 JSR     LA59A                            MOVE (B) BYTES FROM (X) TO (U)
       0124    C021 CC B2 77                 LDD     #LB277                           SYNTAX ERROR ADDRESS
       0125    C024 ED 43                    STD     $03,U                            * SET JUMP TABLE ADDRESSES OF THE USER COMMAND
       0126    C026 ED 48                    STD     $08,U                            * INTERPRETATION TABLE TO POINT TO SYNTAX ERROR
       0127    C028 6F C4                    CLR     ,U                               CLEAR BYTE 0 OF USER TABLE (DOESN'T EXIST FLAG)
       0128    C02A 6F 45                    CLR     $05,U                            SET NUMBER OF SECONDARY USER TOKENS TO ZERO
       0129    C02C CC CF 0A                 LDD     #DXCVEC                          * SAVE NEW
       0130    C02F FD 01 2D                 STD     COMVEC+13                        * POINTERS TO EXBAS
       0131    C032 CC CF 32                 LDD     #DXIVEC                          * COMMAND AND SECONDARY
       0132    C035 FD 01 32                 STD     COMVEC+18                        * COMMAND INTERPRETATION ROUTINES
       0133                        **** MOVE THE NEW RAM VECTORS FROM ROM TO RAM
       0134    C038 CE 01 5E                 LDU     #RVEC0                           POINT U TO 1ST RAM VECTOR
       0135    C03B 86 7E          LC03B     LDA     #$7E                             OP CODE OF JMP INSTRUCTION
       0136    C03D B7 01 A0                 STA     RVEC22                           SET 1ST BYTE OF 'GET'/'PUT' RAM VECTOR TO 'JMP'
       0137    C040 A7 C0                    STA     ,U+                              SET 1ST BYTE OF RAM VECTOR TO 'JMP'
       0138    C042 EC 81                    LDD     ,X++                             GET RAM VECTOR FROM ROM
       0139    C044 ED C1                    STD     ,U++                             STORE IT IN RAM
       0140    C046 8C C1 39                 CMPX #LC139                              COMPARE TO END OF ROM VALUES
       0141    C049 26 F0                    BNE     LC03B                            BRANCH IF NOT ALL VECTORS MOVED
       0142    C04B 8E C2 B2                 LDX     #DVEC22                          GET ROM VALUE OF 'GET'/'PUT' RAM VECTOR
       0143    C04E BF 01 A1                 STX     RVEC22+1                         SAVE IT IN RAM
       0144    C051 8E C8 B0                 LDX     #DVEC20                          GET DISK COMMAND INTERPRETATION LOOP RAM VECTOR
       0145    C054 BF 01 9B                 STX     RVEC20+1                         SAVE IN RAM VECTOR TABLE
       0146                        **** INITIALIZE DISK BASIC'S USR VECTORS
       0147    C057 8E 09 5F                 LDX     #DUSRVC                          POINT X TO START OF DISK BASIC USR VECTORS
       0148    C05A 9F B0                    STX     USRADR                           SAVE START ADDRESS IN USRADR
       0149    C05C CE B4 4A                 LDU     #LB44A                           POINT U TO ADDRESS OF 'FUNCTION CALL' ERROR
       0150    C05F C6 0A                    LDB     #$0A                             10 USER VECTORS TO INITIALIZE
       0151    C061 EF 81          LC061     STU     ,X++                             SET USR VECTOR TO 'FC' ERROR
       0152    C063 5A                       DECB                                     DECREMENT USR VECTOR COUNTER
       0153    C064 26 FB                    BNE     LC061                            BRANCH IN NOT DONE WITH ALL 10 VECTORS
       0154    C066 8E D8 A1                 LDX     #DNMISV                          GET ADDRESS OF NMI SERVICING ROUTINE
       0155    C069 BF 01 0A                 STX     NMIVEC+1                         SAVE IT IN NMI VECTOR
       0156    C06C 86 7E                    LDA     #$7E                             OP CODE OF JMP
       0157    C06E B7 01 09                 STA     NMIVEC                           MAKE THE NMI VECTOR A JMP
       0158    C071 8E D8 AF                 LDX     #DIRQSV                          GET ADDRESS OF DISK BASIC IRQ SERVICING ROUTINE
       0159    C074 BF 01 0D                 STX     IRQVEC+1                         SAVE IT IN IRQVEC
       0160    C077 86 13                    LDA     #$13                             = INITIALIZE WRITE FAT
       0161    C079 B7 09 7A                 STA     WFATVL                           = TO DISK TRIGGER VALUE
       0162    C07C 7F 08 00                 CLR     FATBL0                           *
       0163    C07F 7F 08 4A                 CLR     FATBL1                           * INITIALIZE THE ACTIVE FILE COUNTER OF
       0164    C082 7F 08 94                 CLR     FATBL2                           * EACH FAT TO ZERO. THIS WILL CAUSE THE FATS
       0165    C085 7F 08 DE                 CLR     FATBL3                           * TO THINK THERE ARE NO ACTIVE FILES
       0166    C088 8E 09 89                 LDX     #DFLBUF                          = GET THE STARTING ADDRESS OF THE
       0167    C08B BF 09 48                 STX     RNBFAD                           = RANDOM FILE BUFFER FREE AREA AND DAVE IT AS THE
       0168                        *                                                  = START ADDRESS OF FREE RAM FOR RANDOM FILE BUFFERS
       0169    C08E 30 89 01 00              LEAX $0100,X                             SAVE 256 BYTES FOR RANDOM FILE BUFFERS INITIALLY
       0170    C092 BF 09 4A                 STX     FCBADR                           SAVE START ADDRESS OF FCBS
       0171    C095 30 01                    LEAX $01,X                               * ADD ONE AND SAVE THE STARTING
       0172    C097 BF 09 28                 STX     FCBV1                            * ADDRESS OF FCB1
       0173    C09A 6F 00                    CLR     FCBTYP,X                         CLEAR THE FIRST BYTE OF FCB 1 (CLOSE FCB)
       0174    C09C 30 89 01 19              LEAX FCBLEN,X                            POINT X TO FCB 2
       0175    C0A0 BF 09 2A                 STX     FCBV1+2                          SAVE ITS STARTING ADDRESS IN FCB VECTOR TABLE
       0176    C0A3 6F 00                    CLR     FCBTYP,X                         CLEAR THE FIRST BYTE OF FCB 2 (CLOSE FCB)
       0177    C0A5 30 89 01 19              LEAX FCBLEN,X                            * POINT X TO SYSTEM FCB - THIS FCB WILL ONLY
       0178                        *                                                  * BE USED TO COPY, LOAD, SAVE, MERGE, ETC
       0179    C0A9 BF 09 2C                 STX     FCBV1+4                          SAVE ITS ADDRESS IN THE FCB VECTOR TABLE
       0180    C0AC 6F 00                    CLR     FCBTYP,X                         CLEAR THE FIRST BYTE OF SYSTEM FCB (CLOSE FCB)
       0181    C0AE 86 02                    LDA     #$02                             * SET THE NUMBER OF ACTIVE RESERVED
       0182    C0B0 B7 09 5B                 STA     FCBACT                           * FILE BUFFERS TO 2 (1,2)
       0183    C0B3 30 89 01 19              LEAX FCBLEN,X                            POINT X TO ONE PAST THE END OF SYSTEM FCB
       0184    C0B7 1F 10                    TFR     X,D                              SAVE THE ADDRESS IN ACCD
       0185    C0B9 5D                       TSTB                                     ON AN EVEN 256 BYTE BOUNDARY?
       0186    C0BA 27 01                    BEQ     LC0BD                            YES
       0187    C0BC 4C                       INCA                                     NO - ADD 256 TO ADDRESS
       0188    C0BD 85 01          LC0BD     BITA #$01                                * CHECK TO SEE IF ACCD IS ON AN EVEN
       0189    C0BF 27 01                    BEQ     LC0C2                            * 512 BYTE (ONE GRAPHIC PAGE) BOUNDARY - ADD
       0190    C0C1 4C                       INCA                                     * 256 (INCA) TO IT IF NOT
       0191    C0C2 1F 89          LC0C2     TFR     A,B                              COPY ACCA TO ACCB
       0192    C0C4 CB 18                    ADDB #$18                                SAVE ENOUGH ROOM FOR 4 GRAPHICS PAGES (PCLEAR 4)
       0193    C0C6 D7 19                          STB    TXTTAB                                  SAVE NEW START OF BASIC ADDRESS
       0194    C0C8 BD 96 EC                       JSR    L96EC                                   INITIALIZE EXBAS VARIABLES & DO A NEW
       0195    C0CB 96 BA                          LDA    BEGGRP                                  GET THE START OF CURRENT GRAPHICS PAGE
       0196    C0CD 8B 06                          ADDA #$06                                      ADD 1.5K (6 X 256 = ONE GRAPHICS PAGE)
       0197    C0CF 97 B7                          STA    ENDGRP                                  SAVE NEW END OF GRAPHICS PAGE
       0198    C0D1 AD 9F C0 08                    JSR    [DSINIT]                                INITIALIZE SWI2,3 JUMP ADDRESSES
       0199    C0D5 8D 19                          BSR    LC0F0                                   GO INITIALIZE THE FLOPPY DISK CONTROLLER
       0200    C0D7 1C AF                          ANDCC #$AF                                     TURN ON IRQ AND FIRQ
       0201    C0D9 8E C1 38                       LDX    #LC139-1                                POINT X TO DISK BASIC COPYRIGHT MESSAGE
       0202    C0DC BD B9 9C                       JSR    STRINOUT                                PRINT COPYRIGHT MESSAGE TO SCREEN
       0203    C0DF 8E C0 E7                       LDX    #DKWMST                                 GET DISK BASIC WARM START ADDRESS
       0204    C0E2 9F 72                          STX    RSTVEC                                  SAVE IT IN RESET VECTOR
       0205    C0E4 7E A0 E2                       JMP    LA0E2                                   JUMP BACK TO BASIC
       0206
       0207    C0E7 12                   DKWMST    NOP                                            WARM START INDICATOR
       0208    C0E8 8D 06                          BSR    LC0F0                                   INITIALIZE THE FLOPPY DISK CONTROLLER
       0209    C0EA BD D2 D2                       JSR    LD2D2                                   CLOSE FILES AND DO MORE INITIALIZATION
       0210    C0ED 7E 80 C0                       JMP    XBWMST                                  JUMP TO EXBAS' WARM START
       0211    C0F0 7F 09 82             LC0F0     CLR    NMIFLG                                  RESET NMI FLAG
       0212    C0F3 7F 09 85                       CLR    RDYTMR                                  RESET DRIVE NOT READY TIMER
       0213    C0F6 7F 09 86                       CLR    DRGRAM                                  RESET RAM IMAGE OF DSKREG (MOTORS OFF)
       0214    C0F9 7F FF 40                       CLR    DSKREG                                  RESET DISK CONTROL REGISTER
       0215    C0FC 86 D0                          LDA    #$D0                                    FORCE INTERRUPT COMMAND OF 1793
       0216    C0FE B7 FF 48                       STA    FDCREG                                  SEND IT TO 1793
       0217    C101 1E 88                          EXG    A,A                                     * DELAY
       0218    C103 1E 88                          EXG    A,A                                     * DELAY SOME MORE
       0219    C105 B6 FF 48                       LDA    FDCREG                                  GET 1793 STATUS (CLEAR REGISTER)
       0220    C108 39                             RTS
       0221
       0222                              * DISK BASIC COMMAND INTERP TABLES
       0223    C109 14                   LC109     FCB    20                                      20 DISK BASIC 1.1 COMMANDS
       0224    C10A C1 92                          FDB    LC192                                   DISK BASIC'S COMMAND DICTIONARY
       0225    C10C C2 38                          FDB    LC238                                   COMMAND JUMP TABLE
       0226    C10E 06                             FCB    06                                      6 DISK BASIC SECONDARY FUNCTIONS
       0227    C10F C2 19                          FDB    LC219                                   SECONDARY FUNCTION TABLE
       0228    C111 C2 4E                          FDB    LC24E                                   SECONDARY FUNCTION JUMP TABLE
       0229
       0230                              * RAM HOOKS FOR DISK BASIC
       0231    C113 C4 4B C8 88 C8 93 LC113        FDB    DVEC0,DVEC1,DVEC2
       0232    C119 CC 1C C5 BC C8 48              FDB    DVEC3,DVEC4,DVEC5
       0233    C11F C8 4B CA E9 CA F9              FDB    DVEC6,DVEC7,DVEC8
       0234    C125 8E 90 CD 35 C8 A9              FDB    XVEC9,DVEC10,DVEC11
       0235    C12B C6 E4 CA E4 C9 0C              FDB    DVEC12,DVEC13,DVEC14
       0236    C131 CE D2 C6 E4                    FDB    DVEC15,DVEC12
       0237    C135 C2 65 CA 3E                    FDB    DVEC17,DVEC18
       0238
       0239                              * DISK BASIC COPYRIGHT MESSAGE
       0240    C139 44 49 53 4B 20 45 LC139        FCC    'DISK EXTENDED COLOR BASIC 1.1'
       0241    C13F 58 54 45 4E 44 45
       0242    C145 44 20 43 4F 4C 4F
       0243    C14B 52 20 42 41 53 49
       0244    C151 43 20 31 2E 31
       0245    C156 0D                             FCB    CR
       0246    C157 43 4F 50 59 52 49              FDB    'COPYRIGHT (C) 198'
       0247    C15D 47 48 54 20 28 43
       0248    C163 29 20 31 39 38
       0249    C168 32                             FCB    CYEAR
       0250    C169 20 42 59 20 54 41              FCC    ' BY TANDY'
       0251    C16F 4E 44 59
       0252    C172 0D                             FCB    CR
       0253    C173 55 4E 44 45 52 20              FCC    'UNDER LICENSE FROM MICROSOFT'
       0254    C179 4C 49 43 45 4E 53
       0255    C17F 45 20 46 52 4F 4D
       0256    C185 20 4D 49 43 52 4F
       0257    C18B 53 4F 46 54
       0258    C18F 0D 0D 00                       FDB    CR,CR,0
       0259
       0260
       0261                              * DISK BASIC COMMAND DICTIONARY TABLE
       0262                              *                                                        TOKEN #
       0263    C192 44 49 D2             LC192     FCC    'DI',$80+'R'                            CE
       0264    C195 44 52 49 56 C5                 FCC    'DRIV',$80+'E'                          CF
       0265    C19A 46 49 45 4C C4                 FCC    'FIEL',$80+'D'                          D0
       0266    C19F 46 49 4C 45 D3                 FCC    'FILE',$80+'S'                          D1
       0267    C1A4 4B 49 4C CC                    FCC    'KIL',$80+'L'                           D2
       0268    C1A8 4C 4F 41 C4                    FCC    'LOA',$80+'D'                           D3
       0269    C1AC 4C 53 45 D4                    FCC    'LSE',$80+'T'                           D4
       0270    C1B0 4D 45 52 47 C5                 FCC    'MERG',$80+'E'                          D5
       0271    C1B5 52 45 4E 41 4D C5              FCC    'RENAM',$80+'E'                         D6
       0272    C1BB 52 53 45 D4                    FCC    'RSE',$80+'T'                           D7
       0273    C1BF 53 41 56 C5                    FCC    'SAV',$80+'E'                           D8
       0274    C1C3 57 52 49 54 C5                 FCC    'WRIT',$80+'E'                          D9
       0275    C1C8 56 45 52 49 46 D9              FCC    'VERIF',$80+'Y'                         DA
       0276    C1CE 55 4E 4C 4F 41 C4              FCC    'UNLOA',$80+'D'                         DB
       0277    C1D4 44 53 4B 49 4E C9              FCC    'DSKIN',$80+'I'                         DC
       0278    C1DA 42 41 43 4B 55 D0              FCC    'BACKU',$80+'P'                         DD
       0279    C1E0 43 4F 50 D9                    FCC    'COP',$80+'Y'                           DE
       0280    C1E4 44 53 4B 49 A4                 FCC    'DSKI',$80+'$'                          DF
       0281    C1E9 44 53 4B 4F A4                 FCC    'DSKO',$80+'$'                          E0
       0282    C1EE 44 4F D3                       FCC    'DO',$80+'S'                            E1
       0283
       0284
       0285                              * DISK BASIC COMMAND JUMP TABLE
       0286                              *                                                        COMMAND / TOKEN #
       0287    C1F1 CC A9                LC1F1     FDB    DIR                                     DIR / CE
       0288    C1F3 CE C5                          FDB    DRIVE                                   DRIVE / CF
       0289    C1F5 D0 BC                    FDB    FIELD                               FIELD / D0
       0290    C1F7 D1 5C                    FDB    FILES                               FILES / D1
       0291    C1F9 C6 EF                    FDB    KILL                                KILL / D2
       0292    C1FB CA 48                    FDB    LOAD                                LOAD / D3
       0293    C1FD D1 02                    FDB    LSET                                LSET / D4
       0294    C1FF CA 39                    FDB    MERGE                               MERGE / D5
       0295    C201 D0 1B                    FDB    RENAME                              RENAME / D6
       0296    C203 D1 01                    FDB    RSET                                RSET / D7
       0297    C205 C9 E0                    FDB    SAVE                                SAVE / D8
       0298    C207 D0 66                    FDB    WRITE                               WRITE / D9
       0299    C209 D7 4E                    FDB    VERIFY                              VERIFY / DA
       0300    C20B D2 33                    FDB    UNLOAD                              UNLOAD / DB
       0301    C20D D5 99                    FDB    DSKINI                              DSKINI /DC
       0302    C20F D2 62                    FDB    BACKUP                              BACKUP / DD
       0303    C211 D3 B9                    FDB    COPY                                COPY / DE
       0304    C213 D4 ED                    FDB    DSKI                                DSKI$ / DF
       0305    C215 D5 62                    FDB    DSKO                                DSKO$ / E0
       0306    C217 D6 EC                    FDB    DOS                                 DOS / E1
       0307
       0308
       0309                        * SECONDARY FUNCTION DICTIONARY TABLE
       0310                        *                                                    TOKEN #
       0311    C219 43 56 CE       LC219     FCC    'CV',$80+'N'                        A2
       0312    C21C 46 52 45 C5              FCC    'FRE',$80+'E'                       A3
       0313    C220 4C 4F C3                 FCC    'LO',$80+'C'                        A4
       0314    C223 4C 4F C6                 FCC    'LO',$80+'F'                        A5
       0315    C226 4D 4B 4E A4              FCC    'MKN',$80+'$'                       A6
       0316    C22A 41 D3                    FCC    'A',$80+'S'                         A7
       0317
       0318
       0319                        * DISK BASIC SECONDARY FUNCTION JUMP TABLE
       0320                        *                                                    FUNCTION / TOKEN #
       0321    C22C CD F4          LC22C     FDB    CVN                                 CVN / A2
       0322    C22E CE 9C                    FDB    FREE                                FREE / A3
       0323    C230 CE 10                    FDB    LOC                                 LOC / A4
       0324    C232 CE 37                    FDB    LOF                                 LOF / A5
       0325    C234 CE 02                    FDB    MKN$                                MKN$ / A6
       0326    C236 B2 77                    FDB    AS                                  AS / A7
       0327
       0328                        *DISK BASIC COMMAND INTERPRETATION HANDLER
       0329    C238 81 E1          LC238     CMPA #DHITOK                               *COMPARE TO HIGHEST DISK BASIC TOKEN
       0330    C23A 22 08                    BHI    LC244                               *AND BRANCH IF HIGHER
       0331    C23C 8E C1 F1                 LDX    #LC1F1                              POINT X TO DISK BASIC COMMAND JUMP TABLE
       0332    C23F 80 CE                    SUBA #$CE                                  SUBTRACT OUT LOWEST DISK BASIC COMMAND TOKEN
       0333    C241 7E AD D4                 JMP    LADD4                               JUMP TO BASIC'S COMMAND HANDLER
       0334    C244 81 E1          LC244     CMPA #DHITOK                               COMPARE TO HIGHEST DISK BASIC TOKEN
       0335    C246 10 23 F0 2D              LBLS LB277                                 'SYNTAX' ERROR IF < DISK BASIC COMMAND TOKEN
       0336    C24A 6E 9F 01 41              JMP    [COMVEC+33]                         PROCESS A USER COMMAND TOKEN
       0337                        *DISK BASIC SECONDARY COMMAND INTERPRETATION HANDLER
       0338    C24E C1 4E          LC24E     CMPB #($A7-$80)*2                          *COMPARE MODIFIED SECONDARY TOKEN TO
       0339    C250 23 04                    BLS    LC256                               *HIGHEST DISK BASIC TOKEN & BRANCH IF HIGHER
       0340    C252 6E 9F 01 46              JMP    [,COMVEC+38]                        JUMP TO USER SECONDARY COMMAND HANDLER
       0341    C256 C0 44          LC256     SUBB #($A2-$80)*2                          *SUBTRACT OUT THE SMALLEST SECONDARY
       0342    C258 34 04                    PSHS B                                     *DISK TOKEN & SAVE MODIFIED TOKEN ON THE STACK
       0343    C25A BD B2 62                 JSR    LB262                               SYNTAX CHECK FOR '(' AND EVALUATE EXPRESSION
       0344    C25D 35 04                    PULS B                                     RESTORE MODIFIED TOKEN
       0345    C25F 8E C2 2C                 LDX    #LC22C                              POINT X TO SECONDARY COMMAND JUMP TABLE
       0346    C262 7E B2 CE                 JMP    LB2CE                               JUMP TO BASIC'S SECONDARY COMMAND HANDLER
       0347
       0348                        * ERROR DRIVER RAM VECTOR
       0349    C265 35 20          DVEC17    PULS Y                                     PUT THE RETURN ADDRESS INTO Y
       0350    C267 BD AD 33                 JSR    LAD33                               RESET THE CONT FLAG, ETC
       0351    C26A BD D2 D2                 JSR    LD2D2                               INITIALIZE SOME DISK VARIABLES AND CLOSE FILES
       0352    C26D 34 24                    PSHS Y,B                                   PUT RETURN ADDRESS AND ERROR NUMBER ON THE STACK
       0353    C26F BD CA E9                 JSR    DVEC7                               CLOSE ALL FILES
       0354    C272 35 04                    PULS B                                     GET THE ERROR NUMBER BACK
       0355    C274 C1 36                    CMPB #2*27                                 COMPARE TO THE LOWEST DISK ERROR NUMBER
       0356    C276 10 25 C6 76              LBCS XVEC17                                BRANCH TO EXBAS ERROR HANDLER IF NOT DISK ERROR NUMBER
       0357    C27A 32 62                    LEAS $02,S                                 PURGE RETURN ADDRESS OFF THE STACK
       0358    C27C BD A7 E9                 JSR    LA7E9                               TURN OFF THE CASSETTE MOTOR
       0359    C27F BD A9 74                 JSR    LA974                               DISABLE THE ANALOG MULTIPLEXER
       0360    C282 0F 6F                    CLR    DEVNUM                              SET DEVICE NUMBER TO THE SCREEN
       0361    C284 BD B9 5C                 JSR    LB95C                               SEND A CR TO THE SCREEN
       0362    C287 BD B9 AF                 JSR    LB9AF                               SEND A '?' TO THE SCREEN
       0363    C28A 8E C2 5A                 LDX    #LC290-2*27                         POINT X TO DISK BASIC'S ERROR TABLE
       0364    C28D 7E AC 60                 JMP    LAC60                               JUMP TO BASIC'S ERROR HANDLER
       0365
       0366                        * DISK BASIC ERROR MESSAGES
       0367    C290 42 52          LC290     FCC    'BR'                                27 BAD RECORD
       0368    C292 44 46                    FCC    'DF'                                28 DISK FULL
       0369    C294 4F 42                    FCC    'OB'                                29 OUT OF BUFFER SPACE
       0370    C296 57 50                    FCC    'WP'                                30 WRITE PROTECTED
       0371    C298 46 4E                    FCC    'FN'                                31 BAD FILE NAME
       0372    C29A 46 53                    FCC    'FS'                                32 BAD FILE STRUCTURE
       0373    C29C 41 45                    FCC    'AE'                                33 FILE ALREADY EXISTS
       0374    C29E 46 4F                    FCC    'FO'                                34 FIELD OVERFLOW
       0375    C2A0 53 45                    FCC    'SE'                                35 SET TO NON-FIELDED STRING
       0376    C2A2 56 46                    FCC    'VF'                                36 VERIFICATION ERROR
       0377    C2A4 45 52                    FCC    'ER'                                37 WRITE OR INPUT PAST END OF RECORD
       0378
       0379                        * DISK FILE EXTENSIONS
       0380    C2A6 42 41 53       BASEXT    FCC    'BAS'                               BASIC FILE EXTENSION
       0381    C2A9 20 20 20       DEFEXT    FCC    '   '                               BLANK (DEFAULT) FILE EXTENSION
       0382    C2AC 44 41 54       DATEXT    FCC    'DAT'                               DATA FILE EXTENSION
       0383    C2AF 42 49 4E       BINEXT    FCC    'BIN'                               BINARY FILE EXTENSION
       0384
       0385                        * CLS RAM VECTOR
       0386    C2B2 34 11          DVEC22    PSHS X,CC                                SAVE X REG AND STATUS
       0387    C2B4 AE 63                    LDX     $03,S                            LOAD X WITH CALLING ADDRESS
       0388    C2B6 8C 97 5F                 CMPX #L975F                              COMING FROM EXBAS' GET/PUT?
       0389    C2B9 26 04                    BNE     LC2BF                            NO
       0390    C2BB 81 23                    CMPA #'#'                                NUMBER SIGN (GET#, PUT#)?
       0391    C2BD 27 02                    BEQ     LC2C1                            BRANCH IF GET OR PUT TO RANDOM FILE
       0392    C2BF 35 91          LC2BF     PULS CC,X,PC                             RESTORE X REG, STATUS AND RETURN
       0393
       0394                        * GET/PUT TO A DIRECT/RANDOM FILE
       0395    C2C1 32 65          LC2C1     LEAS $05,S                               PURGE RETURN ADDRESS AND REGISTERS OFF OF THE STACK
       0396    C2C3 BD C8 2E                 JSR     LC82E                            EVALUATE DEVICE NUMBER & SET FCB POINTER
       0397    C2C6 9F F1                    STX     FCBTMP                           SAVE FCB POINTER
       0398    C2C8 6F 88 15                 CLR     FCBGET,X                         * RESET THE GET
       0399    C2CB 6F 88 16                 CLR     FCBGET+1,X                       * DATA POINTER
       0400    C2CE 6F 88 17                 CLR     FCBPUT,X                         = RESET THE PUT
       0401    C2D1 6F 88 18                 CLR     FCBPUT+1,X                       = DATA POINTER
       0402    C2D4 6F 06                    CLR     FCBPOS,X                         RESET PRINT POSITION COUNTER
       0403    C2D6 A6 01                    LDA     FCBDRV,X                         *GET THE FCB DRIVE NUMBER AND
       0404    C2D8 97 EB                    STA     DCDRV                            *SAVE IT IN DSKCON VARIABLE
       0405    C2DA 9D A5                    JSR     GETCCH                           GET CURRENT INPUT CHARACTER FROM BASIC
       0406    C2DC 27 0C                    BEQ     LC2EA                            BRANCH IF END OF LINE
       0407    C2DE BD B2 6D                 JSR     SYNCOMMA                         SYNTAX CHECK FOR COMMA
       0408    C2E1 BD B7 3D                 JSR     LB73D                            EVALUATE EXPRESSION - RETURN IN (X)
       0409    C2E4 1F 10                    TFR     X,D                              SAVE RECORD NUMBER IN ACCD
       0410    C2E6 9E F1          LC2E6     LDX     FCBTMP                           POINT X TO FCB
       0411    C2E8 ED 07                    STD     FCBREC,X                         SAVE RECORD NUMBER IN FCB
       0412    C2EA EC 07          LC2EA     LDD     FCBREC,X                         GET RECORD NUMBER
       0413    C2EC 27 1D                    BEQ     LC30B                            'BAD RECORD' ERROR IF RECORD NUMBER = 0
       0414    C2EE BD C6 85                 JSR     LC685                            INCREMENT RECORD NUMBER
       0415    C2F1 EC 09                    LDD     FCBRLN,X                         * GET RANDOM FILE RECORD LENGTH AND RANDOM FILE
       0416    C2F3 AE 0B                    LDX     FCBBUF,X                         * BUFFER POINTER AND SAVE THEM ON THE STACK - 
       0417    C2F5 34 16                    PSHS X,B,A                               * THESE ARE THE INITIAL VALUES OF A TEMPORARY
       0418                        *                                                  * RECORD LENGTH COUNTER AND RANDOM BUFFER
       0419                        *                                                  * POINTER WHICH ARE MAINTAINED ON THE STACK
       0420    C2F7 30 5E                    LEAX $-2,U                               POINT X TO (RECORD NUMBER -1)
       0421    C2F9 BD 9F B5                 JSR     L9FB5                            MULT (UNSIGNED) RECORD LENGTH X (RECORD NUMBER -1)
       0422    C2FC 34 60                    PSHS U,Y                                 SAVE PRODUCT ON THE STACK
       0423    C2FE A6 E0                    LDA     ,S+                              CHECK MS BYTE OF PRODUCT
       0424    C300 26 09                    BNE     LC30B                            'BR' ERROR IF NOT ZERO (RECORD NUMBER TOO BIG)
       0425    C302 35 10                    PULS X                                   * PULL THE BOTTOM 3 PRODUCT BYTES OFF THE STACK;
       0426    C304 35 04                    PULS B                                   * TOP TWO IN X, BOTTOM IN ACCB; ACCB POINTS TO
       0427                        *                                                  * THE FIRST BYTE OF THE SECTOR USED BY THIS RECORD,
       0428                        *                                                  * (X) CONTAINS THE SECTOR OFFSET (IN WHICH SECTOR
       0429                        *                                                  * FROM THE START THE BYTE IS LOCATED)
       0430    C306 8C 02 64       LC306     CMPX #(TRKMAX-1)                         612 SECTORS MAX IN A RANDOM FILE
       0431    C309 25 05                    BLO     LC310                            BRANCH IF RECORD LENGTH O.K.
       0432    C30B C6 36          LC30B     LDB     #2*27                            'BAD RECORD' ERROR
       0433    C30D 7E AC 46                 JMP     LAC46                            JUMP TO ERROR HANDLER
       0434    C310 DE F1          LC310     LDU     FCBTMP                           POINT U TO FCB
       0435    C312 AC 4D                    CMPX FCBSOF,U                            * COMPARE SAVED SECTOR OFFSET TO THE CURRENT SECTOR OFFSET
       0436    C314 10 27 00 B7              LBEQ LC3CF                               * BEING PROCESSED - DO NOT PROCESS A NEW SECTOR IF THEY ARE EQUAL
       0437    C318 34 14                    PSHS X,B                                 SAVE BYTE AND SECTOR OFFSET TO RECORD START ON STACK
       0438    C31A A6 4F                    LDA     FCBFLG,U                         * CHECK FCB GET/PUT FLAG AND
       0439    C31C 27 06                    BEQ     LC324                            * BRANCH IF IT WAS A GET
       0440    C31E 6F 4F                    CLR     FCBFLG,U                         FORCE GET/PUT TO 'PUT'
       0441    C320 C6 03                    LDB     #$03                             DSKCON WRITE OP CODE
       0442    C322 8D 33                    BSR     LC357                            GO WRITE A SECTOR - SAVE 'PUT' DATA ON DISK
       0443                        * CONVERT THE SECTOR OFFSET TO A GRANULE AND SECTOR NUMBER
       0444    C324 EC 61          LC324     LDD     $01,S                            * GET THE NUMBER OF SECTORS TO THE START OF
       0445    C326 BD C7 84                 JSR     LC784                            * THIS RECORD NUMBER AND CONVERT THEM TO A GRANULE OFFSET
       0446    C329 34 04                    PSHS B                                   SAVE GRANULE OFFSET ON THE STACK
       0447    C32B BD C7 79                 JSR     LC779                            MULTIPLY GRANULE NUMBER X 9 - CONVERT TO NUMBER OF SECTORS
       0448    C32E 50                       NEGB                                     * NEGATE LS BYTE OF GRANULE OFFSET AND ADD THE
       0449    C32F EB 63                    ADDB $03,S                               * LS BYTE OF SECTOR OFFSET - ACCB = SECTOR
       0450                        *                                                  * NUMBER (0-8) CORRESPONDING TO THE SECTOR NUMBER WITHIN A
       0451                        *                                                  * GRANULE OF THE LAST SECTOR OF THE SECTOR OFFSET
       0452    C331 5C                       INCB                                     = ADD ONE - SECTORS SAVED IN THE FCB; START
       0453    C332 E7 44                    STB     FCBSEC,U                         = AT 1 NOT 0 - SAVE IT IN THE FCB
       0454    C334 E6 42                    LDB     FCBFGR,U                         GET FIRST GRANULE IN FILE
       0455    C336 BD C7 55                 JSR     LC755                            POINT X TO FAT
       0456    C339 33 06                    LEAU FATCON,X                            POINT U TO FAT DATA
       0457    C33B A6 E4                    LDA     ,S                               GET NUMBER OF GRANULES OFFSET TO RECORD
       0458    C33D 4C                       INCA                                     ADD ONE (COMPENSATE FOR DECA BELOW)
       0459    C33E 30 C4          LC33E     LEAX ,U                                  POINT X TO FAT DATA
       0460    C340 3A                       ABX                                      POINT X TO CORRECT GRANULE
       0461    C341 4A                       DECA                                     DECREMENT GRANULE COUNTER
       0462    C342 27 37                    BEQ     LC37B                            BRANCH IF CORRECT GRANULE FOUND
       0463    C344 E7 E4                    STB     ,S                               SAVE GRANULE ADDRESS ON STACK
       0464    C346 E6 84                    LDB     ,X                               GET NEXT GRANULE IN FILE
       0465    C348 C1 C0                    CMPB #$C0                                LAST GRANULE IN FILE?
       0466    C34A 25 F2                    BLO     LC33E                            NO - KEEP LOOKING
       0467
       0468                        * THE GRANULE BEING SEARCHED FOR IS NOT PRESENTLY DEFINED IN THIS RANDOM FILE
       0469    C34C E6 E4                    LDB     ,S                               GET OFFSET TO LAST GRANULE
       0470    C34E 0D D8                    TST     VD8                              * CHECK GET/PUT FLAG
       0471    C350 26 14                    BNE     LC366                            * AND BRANCH IF PUT
       0472    C352 C6 2E          LC352     LDB     #2*23                            'INPUT PAST END OF FILE' ERROR
       0473    C354 7E AC 46                 JMP     LAC46                            JUMP TO ERROR HANDLER
       0474    C357 30 C8 19       LC357     LEAX FCBCON,U                            POINT X TO FCB DATA BUFFER
       0475
       0476                        * READ/WRITE A SECTOR. ENTER WITH OP CODE IN ACCB, BUFFER PTR IN X
       0477    C35A D7 EA          LC35A     STB     DCOPC                            SAVE DSKCON OPERATION CODE VARIABLE
       0478    C35C 9F EE                    STX     DCBPT                            SAVE DSKCON LOAD BUFFER VARIABLE
       0479    C35E 30 C4                    LEAX ,U                                  POINT X TO FCB
       0480    C360 BD C7 63                 JSR     LC763                            CONVERT FCB TRACK AND SECTOR TO DSKCON VARIABLES
       0481    C363 7E D6 F2                JMP     LD6F2                            READ/WRITE A TRACK OR SECTOR
       0482
       0483                        * 'PUT' DATA INTO A GRANULE NOT PRESENTLY INCLUDED IN THIS FILE
       0484    C366 34 12          LC366    PSHS X,A                                 SAVE GRANULE COUNTER AND POINTER TO LAST USED GRANULE
       0485    C368 BD C7 BF                JSR     LC7BF                            FIND FIRST FREE GRANULE IN FAT
       0486    C36B 1F 89                   TFR     A,B                              SAVE FREE GRANULE NUMBER IN ACCB
       0487    C36D 35 42                   PULS A,U                                 PULL LAST GRANULE POINTER AND COUNTER OFF OF STACK
       0488    C36F E7 C4                   STB     ,U                               SAVE NEWLY FOUND GRANULE NUMBER IN ADDRESS OF LAST GRANULE
       0489    C371 4A                      DECA                                     DECREMENT GRANULE COUNTER
       0490    C372 26 F2                   BNE     LC366                            GET ANOTHER GRANULE IF NOT DONE
       0491    C374 34 14                   PSHS X,B                                 SAVE POINTER TO LAST GRANULE AND OFFSET
       0492    C376 BD C7 1E                JSR     LC71E                            WRITE FAT TO DISK
       0493    C379 35 14                   PULS B,X                                 RESTORE POINTER AND OFFSET
       0494
       0495                        * WHEN CORRECT GRANULE IS FOUND, FIND THE RIGHT SECTOR
       0496    C37B 32 61          LC37B    LEAS $01,S                               REMOVE GRAN NUMBER FROM STACK
       0497    C37D DE F1                   LDU     FCBTMP                           POINT U TO FCB
       0498    C37F E7 43                   STB     FCBCGR,U                         SAVE CURRENT GRANULE IN FCB
       0499    C381 86 FF                   LDA     #$FF                             *SET FCBSOF,U TO ILLEGAL SECTOR OFFSET WHICH WILL
       0500    C383 A7 4D                   STA     FCBSOF,U                         *FORCE NEW SECTOR DATA TO BE READ IN
       0501    C385 A6 84                   LDA     ,X                               GET CURRENT GRANULE
       0502    C387 81 C0                   CMPA #$C0                                IS IT THE LAST GRANULE?
       0503    C389 25 27                   BLO     LC3B2                            NO
       0504    C38B 84 3F                   ANDA #$3F                                MASK OFF LAST GRANULE FLAG BITS
       0505    C38D A1 44                   CMPA FCBSEC,U                            * COMPARE CALCULATED SECTOR TO CURRENT SECTOR IN FCB
       0506    C38F 24 21                   BHS     LC3B2                            * AND BRANCH IF CALCULATED SECTOR IS > LAST SECTOR IN FILE
       0507    C391 96 D8                   LDA     VD8                              = CHECK GET/PUT FLAG: IF 'GET' THEN 'INPUT
       0508    C393 27 BD                   BEQ     LC352                            = PAST END OF FILE' ERROR
       0509    C395 A6 44                   LDA     FCBSEC,U                         * GET CURRENT SECTOR NUMBER FROM FCB,
       0510    C397 8A C0                   ORA     #$C0                             * OR IN THE LAST GRANULE FLAG BITS
       0511    C399 A7 84                   STA     ,X                               * AND SAVE IN FAT
       0512    C39B BD C5 A9                JSR     LC5A9                            WRITE FAT TO DISK IF NECESSARY
       0513    C39E AE 49                   LDX     FCBRLN,U                         * GET RECORD LENGTH AND CHECK TO
       0514    C3A0 8C 01 00                CMPX #SECLEN                             * SEE IF IT IS SECLEN (EXACTLY ONE SECTOR)
       0515    C3A3 26 08                   BNE     LC3AD                            BRANCH IF IT IS NOT EXACTLY ONE SECTOR
       0516    C3A5 AC C8 13                CMPX FCBLST,U                            =BRANCH IF THE NUMBER OF BYTES IN THE LAST SECTOR
       0517    C3A8 27 08                   BEQ     LC3B2                            =IS SET TO ONE SECTOR (SECLEN)
       0518    C3AA 86 81                   LDA     #$81                             *SET THE PRESAVED FLAG (BIT15) AND FORCE
       0519    C3AC 21 4F          LC3AC    BRN     $C3FD                            *THE NUMBER OF BYTES IN LAST SECTOR TO 256
       0520    C3AD 4F             LC3AD    CLRA                                     SET THE NUMBER OF BYTES IN LAST SECTOR TO ZERO
       0521    C3AE 5F                      CLRB                                     CLEAR LS BYTE OF ACCD
       0522    C3AF ED C8 13                STD     FCBLST,U                         SAVE THE NUMBER OF BYTES IN LAST SECTOR
       0523    C3B2 C6 02          LC3B2    LDB     #$02                             DSKCON READ OP CODE
       0524    C3B4 AE 49                   LDX     FCBRLN,U                         * GET RECORD LENGTH AND COMPARE
       0525    C3B6 8C 01 00                CMPX #SECLEN                             * IT TO SECLEN - EXACTLY ONE SECTOR
       0526    C3B9 26 0D                   BNE     LC3C8                            BRANCH IF NOT EXACTLY ONE SECTOR LONG
       0527    C3BB 32 67                   LEAS $07,S                               CLEAN UP STACK
       0528    C3BD AE 4B                   LDX     FCBBUF,U                         POINT X TO START OF RANDOM FILE BUFFER
       0529    C3BF 96 D8                   LDA     VD8                              * CHECK GET/PUT FLAG AND
       0530    C3C1 27 02                   BEQ     LC3C5                            * BRANCH IF GET
       0531    C3C3 C6 03                   LDB     #$03                             DSKCON WRITE OP CODE
       0532 > C3C5 7E C3 5A        LC3C5    JMP     LC35A                            READ/WRITE A SECTOR
       0533 > C3C8 BD C3 57        LC3C8    JSR     LC357                            READ A SECTOR INTO FCB DATA BUFFER
       0534    C3CB 35 14                   PULS B,X                                 * GET BACK THE BYTE OFFSET TO RECORD: X = NUMBER OF
       0535                        *                                                 * SECTORS; ACCB = BYTE POINTER IN SECTOR
       0536    C3CD AF 4D                   STX     FCBSOF,U                         SAVE SECTOR OFFSET IN FCB
       0537    C3CF 34 04          LC3CF    PSHS B                                   SAVE BYTE OFFSET ON STACK
       0538    C3D1 BD C7 55                JSR     LC755                            POINT X TO FILE ALLOCATION TABLE
       0539    C3D4 30 06                   LEAX FATCON,X                            MOVE X TO FAT DATA
       0540    C3D6 E6 43                   LDB     FCBCGR,U                         GET CURRENT GRANULE NUMBER
       0541    C3D8 3A                      ABX                                      POINT X TO PROPER GRANULE IN FAT
       0542    C3D9 A6 84                   LDA     ,X                               * GET CURRENT GRANULE AND CHECK TO
       0543    C3DB 81 C0                   CMPA #$C0                                * SEE IF IT IS LAST GRANULE
       0544    C3DD 25 2B                   BLO     LC40A                            BRANCH IF THIS GRANULE IS < LAST GRANULE
       0545    C3DF 84 3F                   ANDA #$3F                                MASK OFF LAST GRANULE FLAG BITS
       0546    C3E1 A1 44                   CMPA FCBSEC,U                            * COMPARE LAST SECTOR USED IN GRANULE TO
       0547    C3E3 26 25                   BNE     LC40A                            * CALCULATED SECTOR; BRANCH IF NOT EQUAL
       0548    C3E5 EC C8 13                LDD     FCBLST,U                         GET NUMBER OF BYTES IN LAST SECTOR
       0549    C3E8 84 7F                   ANDA #$7F                                MASK OFF PRESAVED FLAG (BIT 15)
       0550    C3EA 34 06                   PSHS B,A                                 SAVE NUMBER OF BYTES IN LAST SECTOR ON STACK
       0551    C3EC 4F                      CLRA                                     * LOAD ACCB WITH THE BYTE OFFSET TO CURRENT
       0552    C3ED E6 62                   LDB     $02,S                            * RECORD AND ADD THE REMAINING RECORD LENGTH
       0553    C3EF E3 63                   ADDD $03,S                               * TO IT - ACCD = END OF RECORD OFFSET
       0554    C3F1 10 A3 E1                CMPD ,S++                                =COMPARE THE END OF RECORD OFFSET TO THE NUMBER OF
       0555    C3F4 23 14                   BLS     LC40A                            =BYTES USED IN THE LAST SECTOR
       0556    C3F6 0D D8                   TST     VD8                              * CHECK GET/PUT FLAG AND BRANCH IF 'GET'
       0557    C3F8 10 27 FF 56             LBEQ LC352                               * TO 'INPUT PAST END OF FILE' ERROR
       0558
       0559                        * IF LAST USED SECTOR, CALCULATE HOW MANY BYTES ARE USED
       0560                        * IF DATA IS BEING 'PUT' PASTH THE CURRENT END OF FILE
       0561    C3FC 10 83 01 00             CMPD #SECLEN                             COMPARE TO ONE SECTOR'S LENGTH
       0562    C400 23 03                   BLS     LC405                            BRANCH IF REMAINDER OF RECORD LENGTH WILL FIT IN THIS SECTOR
       0563    C402 CC 01 00                LDD     #SECLEN                          FORCE NUMBER OF BYTES = ONE SECTOR LENGTH
       0564    C405 8A 80          LC405    ORA     #$80                             * SET PRE-SAVED FLAG BIT - ALL PUT RECORDS ARE
       0565                        *                                                 * WRITTEN TO DISK BEFORE LEAVING 'PUT'
       0566    C407 ED C8 13                STD     FCBLST,U                         SAVE NUMBER OF BYTES USED IN LAST SECTOR
       0567    C40A 35 04          LC40A    PULS B                                   PULL BYTE OFFSET OFF OF THE STACK
       0568    C40C 30 C8 19                LEAX FCBCON,U                            POINT X TO FCB DATA BUFFER
       0569    C40F 3A                      ABX                                      MOVE X TO START OF RECORD
       0570    C410 EE 62                   LDU     $02,S                            POINT U TO CURRENT POSITION IN RANDOM FILE BUFFER
       0571    C412 34 04                   PSHS B                                   SAVE BYTE OFFSET ON STACK
       0572    C414 86 FF                   LDA     #-1                              * CONVERT ACCD INTO A NEGATIVE 2 BYTE NUMBER
       0573                        *                                                 * REPRESENTING THE REMAINING UNUSED BYTES IN THE SECTOR
       0574    C416 E3 61                   ADDD $01,S                               * ADD TEMPORARY RECORD LENGTH COUNTER (SUBTRACT
       0575                        *                                                 * REMAINING BYTES FROM TEMPORARY RECORD LENGTH)
       0576    C418 24 07                   BHS     LC421                            BRANCH IF THERE ARE ENOUGH UNUSED BYTES TO FINISH THE RECORD
       0577    C41A ED 61                   STD     $01,S                            SAVE NEW TEMPORARY RECORD LENGTH COUNTER
       0578    C41C 35 04                   PULS B                                   RESTORE BYTE COUNTER
       0579    C41E 50                      NEGB                                     * NEGATE IT - ACCB = THE NUMBER OF BYTES
       0580                        *                                                 * AVAILABLE TO A RECORD IN THIS SECTOR
       0581    C41F 20 08                   BRA     LC429                            MOVE THE DATA
       0582
       0583                        * BRANCH HERE IF REMAINING RECORD LENGTH WILL FIT IN
       0584                        * WHAT'S LEFT OF THE CURRENTLY SELECTED SECTOR
       0585    C421 E6 62          LC421    LDB     $02,S                            GET REMAINING RECORD LENGTH
       0586    C423 6F 61                   CLR     $01,S                            * CLEAR THE TEMPORARY RECORD LENGTH
       0587    C425 6F 62                   CLR     $02,S                            * COUNTER ON THE STACK
       0588    C427 32 61                   LEAS $01,S                               PURGE BYTE OFFSET FROM STACK
       0589    C429 96 D8          LC429    LDA     VD8                              * CHECK GET/PUT FLAG AND
       0590    C42B 27 02                   BEQ     LC42F                            * BRANCH IF GET
       0591    C42D 1E 13                   EXG     X,U                              SWAP SOURCE AND DESTINATION POINTERS
       0592    C42F BD A5 9A       LC42F    JSR     LA59A                            TRANSFER DATA FROM SOURCE TO DESTINATION BUFFERS
       0593    C432 EF 62                   STU     $02,S                            SAVE NEW TEMP RECORD POINTER ON THE STACK (GET)
       0594
       0595                        * MOVE DATA FROM FCB DATA BUFFER TO THE RANDOM FILE BUFFER IF 'GET'
       0596                        * OR FROM RANDOM FILE BUFFER TO FCB DATA BUFFER IF 'PUT'
       0597    C434 DE F1                   LDU     FCBTMP                           POINT U TO FCB
       0598    C436 96 D8                   LDA     VD8                              * CHECK GET/PUT FLAG AND
       0599    C438 27 04                   BEQ     LC43E                            * BRANCH IF GET
       0600    C43A A7 4F                   STA     FCBFLG,U                         SAVE 'PUT' FLAG IN THE FCB
       0601    C43C AF 62                   STX     $02,S                            SAVE NEW TEMPORARY RECORD POINTER ON STACK (PUT)
       0602    C43E AE 4D          LC43E    LDX     FCBSOF,U                         * GET SECTOR OFFSET COUNTER AND
       0603    C440 30 01                   LEAX $01,X                               * ADD ONE TO IT
       0604    C442 5F                      CLRB                                     SET BYTE OFFSET = 0
       0605    C443 EE E4                   LDU     ,S                               * CHECK THE LENGTH OF THE TEMPORARY RECORD LENGTH
       0606    C445 10 26 FE BD             LBNE LC306                               * COUNTER AND KEEP MOVING DATA IF <> 0
       0607    C449 35 96                   PULS A,B,X,PC                            * PULL TEMPORARY RECORD LENGTH AND
       0608                        *                                                 * BUFFER ADDRESS OFF STACK AND RETURN
       0609
       0610                        * OPEN RAM HOOK
       0611    C44B 32 62          DVEC0    LEAS $02,S                               PULL RETURN ADDRESS OFF OF THE STACK
       0612    C44D BD B1 56                JSR     LB156                            EVALUATE AN EXPRESSION
       0613    C450 BD B6 A4                JSR     LB6A4                            *GET MODE(I,O,R) - FIRST BYTE OF STRING EXPRESSION
       0614    C453 34 04                   PSHS B                                   *AND SAVE IT ON STACK
       0615    C455 BD A5 A2                JSR     LA5A2                            GET DEVICE NUMBER
       0616    C458 5D                      TSTB                                     SET FLAGS
       0617    C459 10 2F E1 A6             LBLE LA603                               BRANCH IF NOT A DISK FILE
       0618    C45D 35 02                   PULS A                                   GET MODE
       0619    C45F 34 06                   PSHS B,A                                 SAVE MODE AND DEVICE NUMBER (FILE NUMBER)
       0620    C461 0F 6F                   CLR     DEVNUM                           SET DEVICE NUMBER TO SCREEN
       0621    C463 BD B2 6D                JSR     SYNCOMMA                         SYNTAX CHECK FOR COMMA
       0622    C466 8E C2 AC                LDX     #DATEXT                          POINT TO 'DAT' FOR EXTENSION
       0623    C469 BD C9 38                JSR     LC938                            GET FILENAME FROM BASIC
       0624    C46C CC 01 FF                LDD     #$01FF                           DEFAULT DISK FILE TYPE AND ASCII FLAG
       0625    C46F FD 09 57                STD     DFLTYP                           SAVE DEFAULT VALUES: DATA, ASCII
       0626    C472 8E 01 00                LDX     #SECLEN                          DEFAULT RECORD LENGTH - 1 PAGE
       0627    C475 9D A5                   JSR     GETCCH                           GET CHAR FROM BASIC
       0628    C477 27 08                   BEQ     LC481                            BRANCH IF END OF LINE
       0629    C479 BD B2 6D                JSR     SYNCOMMA                         SYNTAX CHECK FOR COMMA
       0630    C47C BD B3 E6                JSR     LB3E6                            EVALUATE EXPRESSION
       0631    C47F 9E 52                   LDX     FPA0+2                           GET EVALUATED EXPRESSION
       0632    C481 BF 09 7C       LC481    STX     DFFLEN                           RECORD LENGTH
       0633    C484 10 27 EF C2             LBEQ LB44A                               IF = 0, THEN 'ILLEGAL FUNCTION CALL'
       0634    C488 BD A5 C7                JSR     LA5C7                            ERROR IF ANY FURTHER CHARACTERS ON LINE
       0635    C48B 35 06                   PULS A,B                                 GET MODE AND FILE NUMBER
       0636
       0637                        * OPEN DISK FILE FOR READ OR WRITE
       0638    C48D 34 02          LC48D    PSHS A                                   SAVE MODE ON STACK
       0639    C48F BD C7 49                JSR     LC749                            POINT X TO FCB FOR THIS FILE
       0640    C492 10 26 E1 86             LBNE LA61C                               'FILE ALREADY OPEN' ERROR IF FILE OPEN
       0641    C496 9F F1                   STX     FCBTMP                           SAVE FILE BUFFER POINTER
       0642    C498 BD C7 9D                JSR     LC79D                            MAKE SURE FILE ALLOC TABLE IS VALID
       0643    C49B BD C6 8C                JSR     LC68C                            SCAN DIRECTORY FOR 'FILENAME.EXT'
       0644    C49E 35 04                   PULS B                                   GET MODE
       0645    C4A0 86 10                   LDA     #INPFIL                          INPUT TYPE FILE
       0646    C4A2 34 02                   PSHS A                                   SAVE FILE TYPE ON STACK
       0647    C4A4 C1 49                   CMPB #'I'                                INPUT MODE?
       0648    C4A6 26 1F                   BNE     LC4C7                            BRANCH IF NOT
       0649
       0650                        * OPEN A SEQUENTIAL FILE FOR INPUT
       0651    C4A8 BD C6 E5                JSR     LC6E5                            CHECK TO SEE IF DIRECTORY MATCH IS FOUND
       0652    C4AB BD C8 07                JSR     LC807                            CHECK TO SEE IF FILE ALREADY OPEN
       0653    C4AE BE 09 74                LDX     V974                             GET RAM DIRECTORY BUFFER
       0654    C4B1 EC 0B                   LDD     DIRTYP,X                         GET FILE TYPE AND ASCII FLAG
       0655    C4B3 FD 09 57                STD     DFLTYP                           SAVE IN RAM IMAGE
       0656    C4B6 8D 75                   BSR     LC52D                            INITIALIZE FILE BUFFER CONTROL BLOCK
       0657    C4B8 BD C6 27                JSR     LC627                            GO FILL DATA BUFFER
       0658    C4BB BD C7 55       LC4BB    JSR     LC755                            POINT X TO PROPER FILE ALLOCATION TABLE
       0659    C4BE 6C 00                   INC     FAT0,X                           ADD ONE TO FAT ACTIVE FILE COUNTER
       0660    C4C0 9E F1                   LDX     FCBTMP                           GET FILE BUFFER POINTER
       0661    C4C2 35 02                   PULS A                                   GET FILE TYPE
       0662    C4C4 A7 00                   STA     FCBTYP,X                         SAVE IT IN FCB
       0663    C4C6 39                      RTS
       0664    C4C7 68 E4          LC4C7    ASL     ,S                               SET FILE TYPE TO OUTPUT
       0665    C4C9 C1 4F                   CMPB #'O'                                FILE MODE = OUTPUT?
       0666    C4CB 26 1B                   BNE     LC4E8                            BRANCH IF NOT
       0667
       0668                        * OPEN A SEQUENTIAL FILE FOR OUTPUT
       0669    C4CD 7D 09 73                TST     V973                             DOES FILE EXIST ON DIRECTORY?
       0670    C4D0 27 0F                   BEQ     LC4E1                            BRANCH IF NOT
       0671    C4D2 BD C6 FC                JSR     LC6CF                            KILL THE OLD FILE
       0672    C4D5 B6 09 73                LDA     V973                             * GET DIRECTORY SECTOR NUMBER OF OLD FILE AND
       0673    C4D8 B7 09 77                STA     V977                                 * SAVE IT AS FIRST FREE DIRECTORY ENTRY
       0674    C4DB BE 09 74                LDX     V974                                 =GET RAM DIRECTORY IMAGE OF OLD FILE AND
       0675    C4DE BF 09 78                STX     V978                                 =SAVE IT AS FIRST FREE DIRECTORY ENTRY
       0676
       0677    C4E1 BD C5 67       LC4E1    JSR     LC567                                SET UP NEW DIRECTORY ENTRY ON DISK
       0678    C4E4 8D 52                   BSR     LC538                                INITIALIZE FILE BUFFER
       0679    C4E6 20 D3                   BRA     LC4BB                                FLAG AND MAP FCB AS BEING USED
       0680    C4E8 C1 52          LC4E8    CMPB #'R'                                    FILE MODE = R (RANDOM)?
       0681    C4EA 27 06                   BEQ     LC4F2                                BRANCH IF SO
       0682    C4EC C1 44                   CMPB #'D'                                    FILE MODE = D (DIRECT)?
       0683    C4EE 10 26 E1 24             LBNE LA616                                   'BAD FILE MODE' ERROR IF NOT
       0684
       0685                        * OPEN A RANDOM/DIRECT FILE
       0686    C4F2 68 E4          LC4F2    ASL     ,S                                   SET FILE TYPE TO DIRECT
       0687    C4F4 FC 09 48                LDD     RNBFAD                               * GET ADDRESS OF RANDOM FILE BUFFER AREA
       0688    C4F7 34 06                   PSHS B,A                                     * AND SAVE IT ON THE STACK
       0689    C4F9 F3 09 7C                ADDD DFFLEN                                  ADD THE RECORD LENGTH
       0690    C4FC 25 06                   BLO     LC504                                'OB' ERROR IF SUM > $FFFF
       0691    C4FE 10 B3 09 4A             CMPD FCBADR                                  IS IT > THAN FCB DATA AREA?
       0692    C502 23 05                   BLS     LC509                                BRANCH IF NOT
       0693    C504 C6 3A          LC504    LDB     #2*29                                'OUT OF BUFFER SPACE' ERROR
       0694    C506 7E AC 46                JMP     LAC46                                JUMP TO ERROR HANDLER
       0695    C509 34 06          LC509    PSHS B,A                                     SAVE END OF RANDOM BUFFER ON STACK
       0696    C50B 7D 09 73                TST     V973                                 DID THIS FILE EXIST
       0697    C50E 26 04                   BNE     LC514                                BRANCH IF SO
       0698    C510 8D 55                   BSR     LC567                                SET UP NEW FILE IN DIRECTORY
       0699    C512 20 05                   BRA     LC519                                INITIALIZE FCB
       0700    C514 86 FF          LC514    LDA     #$FF                                 * SET FILE TYPE MATCH = $FF (ILLEGAL VALUE) -
       0701    C516 BD C8 07                JSR     LC807                                * THIS WILL FORCE ANY OPEN MATCHED FILE TO CAUSE
       0702                        *                                                     * A 'FILE ALREADY OPEN' ERROR
       0703    C519 8D 12          LC519    BSR     LC52D                                INITIALIZE FCB
       0704    C51B 63 0D                   COM     FCBSOF,X                             * SET FCBSOF,X TO $FF (ILLEGAL SECTOR OFFSET) WHICH WILL
       0705                        *                                                     * FORCE NEW SECTOR DATA TO BE READ IN DURING GET/PUT
       0706    C51D 6C 08                   INC     FCBREC+1,X                           INITIALIZE RECORD NUMBER = 1
       0707    C51F 35 46                   PULS A,B,U                                   U = START OF RANDOM FILE BUFFER AREA, ACCD = END
       0708    C521 FD 09 48                STD     RNBFAD                               SAVE NEW START OF RANDOM FILE BUFFER AREA
       0709    C524 EF 0B                   STU     FCBBUF,X                             SAVE BUFFER START IN FCB
       0710    C526 FE 09 7C                LDU     DFFLEN                               * GET RANDOM FILE RECORD LENGTH
       0711    C529 EF 09                   STU     FCBRLN,X                             * AND SAVE IT IN FCB
       0712    C52B 20 8E                   BRA     LC4BB                                SET FAT FLAG, SAVE FILE TYPE IN FCB
       0713
       0714                        * INITIALIZE FCB DATA FOR INPUT
       0715    C52D 8D 09          LC52D    BSR     LC538                                INITIALIZE FCB
       0716    C52F FE 09 74                LDU     V974                                 GET RAM DIRECTORY IMAGE
       0717    C532 EE 4E                   LDU     DIRLIST,U                            *GET NUMBER OF BYTES IN LAST SECTOR OF FILE
       0718    C534 EF 88 13                STU     FCBLST,X                             *SAVE IT IN FCB
       0719    C537 39                      RTS
       0720                        * INITIALIZE FILE CONTROL BLOCK
       0721    C538 9E F1          LC538    LDX     FCBTMP                               GET CURRENT FILE BUFFER
       0722    C53A C6 19                   LDB     #FCBCON                              CLEAR FCB CONTROL BYTES
       0723    C53C 6F 80          LC53C    CLR     ,X+                                  CLEAR A BYTE
       0724    C53E 5A                      DECB                                         DECREMENT COUNTER
       0725    C53F 26 FB                   BNE     LC53C                                BRANCH IF NOT DONE
       0726    C541 9E F1                   LDX     FCBTMP                               GET CURRENT FILE BUFFER ADDRESS BACK
       0727    C543 96 EB                   LDA     DCDRV                                *GET CURRENT DRIVE NUMBER AND
       0728    C545 A7 01                   STA     FCBDRV,X                             *SAVE IT IN FCB
       0729    C547 B6 09 76                LDA     V976                                 =GET FIRST GRANULE -
       0730    C54A A7 02                   STA     FCBFGR,X                             =SAVE IT AS THE STARTING GRANULE NUMBER AND
       0731    C54C A7 03                   STA     FCBCGR,X                             =SAVE IT AS CURRENT GRANULE NUMBER
       0732    C54E F6 09 73                LDB     V973                                 GET DIRECTORY SECTOR NUMBER
       0733    C551 C0 03                   SUBB #$03                                    SUBTRACT 3 - DIRECTORY SECTORS START AT 3
       0734    C553 58                      ASLB                                         * MULTIPLY SECTORS
       0735    C554 58                      ASLB                                         * BY 8 (8 DIRECTORY
       0736    C555 58                      ASLB                                         * ENTRIES PER SECTOR)
       0737    C556 34 04                   PSHS B                                       SAVE SECTOR OFFSET
       0738    C558 FC 09 74                LDD     V974                                 GET RAM DIRECTORY IMAGE
       0739    C55B 83 06 00                SUBD #DBUF0                                  SUBTRACT RAM OFFSET
       0740    C55E 86 08                   LDA     #$08                                 8 DIRECTORY ENTRIES/SECTOR
       0741    C560 3D                      MUL                                          NOW ACCA CONTAINS 0-7
       0742    C561 AB E0                   ADDA ,S+                                     ACCA CONTAINS DIRECTORY ENTRY (0-71)
       0743    C563 A7 88 12                STA     FCBDIR,X                             SAVE DIRECTORY ENTRY NUMBER
       0744    C566 39                      RTS
       0745
       0746                        * SET UP DIRECTORY AND UPDATE FILE ALLOCATION TABLE ENTRY IN FIRST UNUSED SECTOR
       0747    C567 C6 38          LC567    LDB     #28*2                                'DISK FULL' ERROR
       0748    C569 B6 09 77                LDA     V977                                 GET SECTOR NUMBER OF FIRST EMPTY DIRECTORY ENTRY
       0749    C56C 10 27 E6 D6             LBEQ LAC46                                   'DISK FULL' ERROR IF NO EMPTY DIRECTORY ENTRIES
       0750    C570 B7 09 73                STA     V973                                 SAVE SECTOR NUMBER OF FIRST EMPTY DIRECTORY ENTRY
       0751    C573 97 ED                   STA     DSEC                                 SAVE SECTOR NUMBER IN DSKCON REGISTER
       0752    C575 C6 02                   LDB     #$02                                 READ OP CODE
       0753    C577 D7 EA                   STB     DCOPC                                SAVE IN DSKCON REGISTER
       0754    C579 BD D6 F2                JSR     LD6F2                                READ SECTOR
       0755    C57C BE 09 78                LDX     V978                                 * GET ADDRESS OF RAM IMAGE OF UNUSED DIRECTORY
       0756    C57F BF 09 74                STX     V974                                 * ENTRY AND SAVE AS CURRENT USED RAM IMAGE
       0757    C582 33 84                   LEAU ,X                                      (TFR X,U) POINT U TO DIRECTORY RAM IMAGE
       0758    C584 C6 20                   LDB     #DIRLEN                              SET COUNTER TO CLEAR 32 BYTES (DIRECTORY ENTRY)
       0759    C586 6F 80          LC586    CLR     ,X+                                  CLEAR BYTE
       0760    C588 5A                      DECB                                         DECREMENT COUNTER
       0761    C589 26 FB                   BNE     LC586                                CONTINUE IF NOT DONE
       0762    C58B 8E 09 4C                LDX     #DNAMBF                              POINT TO FILENAME AND EXTENSION RAM IMAGE
       0763    C58E C6 0B                   LDB     #11                                  11 BYTES IN FILENAME AND EXTENSION
       0764    C590 BD A5 9A                JSR     LA59A                                MOVE B BYTES FROM X TO U
       0765    C593 FC 09 57                LDD     DFLTYP                               GET FILE TYPE AND ASCII FLAG
       0766    C596 ED 40                   STD     $00,U                                SAVE IN RAM IMAGE
       0767    C598 C6 21                   LDB     #33                                  FIRST GRANULE TO CHECK
       0768    C59A BD C7 BF                JSR     LC7BF                                FIND THE FIRST FREE GRANULE
       0769    C59D B7 09 76                STA     V976                             SAVE IN RAM
       0770    C5A0 A7 42                   STA     $02,U                            SAVE IN RAM IMAGE OF DIRECTORY TRACK
       0771    C5A2 C6 03                   LDB     #$03                             * GET WRITE OPERATION CODE AND SAVE
       0772    C5A4 D7 EA                   STB     DCOPC                            * IT IN DSKCON REGISTER
       0773    C5A6 BD D6 F2                JSR     LD6F2                            GO WRITE A SECTOR IN DIRECTORY
       0774    C5A9 34 56          LC5A9    PSHS U,X,B,A                             SAVE REGISTERS
       0775    C5AB BD C7 55                JSR     LC755                            POINT X TO FILE ALLOCATION TABLE
       0776    C5AE 6C 01                   INC     FAT1,X                           INDICATE NEW DATA IN FILE ALLOC TABLE
       0777    C5B0 A6 01                   LDA     FAT1,X                           GET NEW DATA FLAG
       0778    C5B2 B1 09 7A                CMPA WFATVL                              * HAVE ENOUGH GRANULES BEEN REMOVED FROM THE FAT TO
       0779                        *                                                 * CAUSE THE FAT TO BE WRITTEN TO THE DISK
       0780    C5B5 25 03                   BLO     LC5BA                            RETURN IF NO NEED TO WRITE OUT ALLOCATION TABLE
       0781    C5B7 BD C7 1E                JSR     LC71E                            WRITE FILE ALLOCATION SECTOR TO DISK
       0782    C5BA 35 D6          LC5BA    PULS A,B,X,U,PC                          RESTORE REGISTERS
       0783
       0784                        * CONSOLE IN RAM VECTOR
       0785    C5BC 96 6F          DVEC4    LDA     DEVNUM                           GET DEVICE NUMBER
       0786    C5BE 10 2F C7 2F             LBLE XVEC4                               BRANCH IF NOT DISK FILE
       0787    C5C2 32 62                   LEAS $02,S                               GET RID OF RETURN ADDRESS
       0788    C5C4 34 14          LC5C4    PSHS X,B                                 SAVE REGISTERS
       0789    C5C6 0F 70                   CLR     CINBFL                           CLEAR BUFFER NOT EMPTY FLAG
       0790    C5C8 8E 09 26                LDX     #FCBV1-2                         POINT TO FILE BUFFER VECTOR TABLE
       0791    C5CB D6 6F                   LDB     DEVNUM                           GET ACTIVE DISK FILE NUMBER
       0792    C5CD 58                      ASLB                                     TIMES 2 - TWO BYTES PER FCB ADDRESS
       0793    C5CE AE 85                   LDX     B,X                              NOW X POINTS TO FILE BUFFER
       0794    C5D0 E6 84                   LDB     FCBTYPE,X                        GET FILE TYPE
       0795    C5D2 C1 40                   CMPB #RANFIL                             IS THIS A RANDOM (DIRECT) FILE?
       0796    C5D4 26 16                   BNE     LC5EC                            BRANCH IF NOT
       0797
       0798                        * GET A BYTE FROM A RANDOM FILE - RETURN CHAR IN ACCA
       0799    C5D6 EC 88 15                LDD     FCBGET,X                         GET THE RECORD COUNTER
       0800    C5D9 10 A3 09                CMPD FCBRLN,X                            *COMPARE TO RECORD LENGTH AND
       0801    C5DC 24 20                   BHS     LC5FE                            *BRANCH TO BUFFER EMPTY IF >= RECORD LENGTH
       0802    C5DE C3 00 01                ADDD #$0001                              = ADD ONE TO RECORD POINTER AND
       0803    C5E1 ED 88 15                STD     FCBGET,X                         = SAVE IT IN FCB
       0804    C5E4 AE 0B                   LDX     FCBBUF,X                         * POINT X TO START OF RANDOM FILE BUFFER AND
       0805    C5E6 30 8B                   LEAX D,X                                 * ADD THE RECORD COUNTER TO IT
       0806    C5E8 A6 1F                   LDA     $-1,X                            GET A CHARACTER FROM THE BUFFER
       0807    C5EA 35 94                   PULS B,X,PC                              RESTORE REGISTERS AND RETURN
       0808                        * GET A BYTE FROM A SEQUENTIAL FILE
       0809    C5EC E6 88 10       LC5EC    LDB     FCBCFL,X                         * TEST THE CACHE FLAG AND BRANCH IF AN
       0810    C5EF 27 08                   BEQ     LC5F9                            * EXTRA CHARACTER HAS NOT BEEN READ FROM FILE
       0811    C5F1 A6 88 11                LDA     FCBCDT,X                         GET THE CACHE CHARACTER
       0812    C5F4 6F 88 10                CLR     FCBCFL,X                         CLEAR THE CACHE FLAG
       0813    C5F7 35 94                   PULS B,X,PC                              RESTORE REGISTERS AND RETURN
       0814
       0815    C5F9 E6 88 17       LC5F9    LDB     FCBDFL,X                         IS ANY DATA LEFT?
       0816    C5FC 27 04                   BEQ     LC602                            BRANCH IF SO
       0817    C5FE 03 70                   COM     CINBFL                           SET FLAG TO BUFFER EMPTY
       0818    C600 35 94                   PULS B,X,PC                              RESTORE REGISTERS AND RETURN
       0819
       0820    C602 E6 05          LC602    LDB     FCBCPT,X                         GET CHARACTER POINTER
       0821    C604 6C 05                   INC     FCBCPT,X                         ADD ONE TO CHARACTER POINTER
       0822    C606 6A 88 18                DEC     FCBLFT,X                         DECREMENT NUMBER OF CHARACTERS LEFT IN FILE BUFFER
       0823    C609 27 06                   BEQ     LC611                            IF LAST CHARACTER, GO GET SOME MORE
       0824    C60B 3A                      ABX                                      ADD CHARACTER COUNTER TO X
       0825    C60C A6 88 19                LDA     FCBCON,X                         GET DATA CHARACTER (SKIP PAST 25 FCB CONTROL BYTES
       0826    C60F 35 94                   PULS B,X,PC
       0827                        * GET A CHARACTER FROM FCB DATA BUFFER - RETURN CHAR IN ACCA
       0828    C611 34 60          LC611    PSHS U,Y                                 SAVE REGISTERS
       0829    C613 4F                      CLRA                                     *
       0830    C614 33 8B                   LEAU D,X                                 * POINT U TO CORRECT CHARACTER
       0831    C616 A6 C8 19                LDA     FCBCON,U                         =GET DATA CHAR (SKIP PAST 25 CONTROL BYTES)
       0832    C619 34 02                   PSHS A                                   =AND SAVE DATA CHARACTER ON STACK
       0833    C61B 6F 05                   CLR     FCBCPT,X                         RESET CHAR POINTER TO START OF BUFFER
       0834    C61D A6 01                   LDA     FCBDRV,X                         GET DRIVE NUMBER AND SAVE IT IN
       0835    C61F 97 EB                   STA     DCDRV                            DSKCON VARIABLE
       0836    C621 8D 04                   BSR     LC627                            GO READ A SECTOR - FILL THE BUFFER
       0837    C623 35 62                   PULS A,Y,U                               RESTORE REGISTERS AND DATA CHARACTER
       0838    C625 35 94                   PULS B,X,PC                              RESTORE REGISTERS AND RETURN
       0839                        * REFILL THE FCB INPUT DATA BUFFER FOR SEQUENTIAL FILES
       0840    C627 A6 04          LC627    LDA     FCBSEC,X                         GET CURRENT SECTOR NUMBER
       0841    C629 4C             LC629    INCA                                     ADD ONE
       0842    C62A 34 02                   PSHS A                                   SAVE NEW SECTOR NUMBER ON THE STACK
       0843    C62C 81 09                   CMPA #$09                                NINE SECTORS PER GRANULE
       0844    C62E 23 01                   BLS     LC631                            BRANCH IF <= 9
       0845    C630 4F                      CLRA                                     SET TO SECTOR ZERO
       0846    C631 A7 04          LC631    STA     FCBSEC,X                         SAVE SECTOR NUMBER
       0847    C633 E6 03                   LDB     FCBCGR,X                         GET GRANULE NUMBET TO FAT POINTER
       0848    C635 33 84                   LEAU ,X                                  POINT U TO FCB (TFR X,U)
       0849    C637 BD C7 55                JSR     LC755                            POINT X TO PROPER FILE ALLOCATION TABLE
       0850    C63A 3A                      ABX                                      ADD OLD GRANULE NUMBER TO FAT POINTER
       0851    C63B E6 06                   LDB     FATCON,X                         GET GRANULE NUMBER (6 CONTROL BYTES AT FRONT OF FAT)
       0852    C63D 30 C4                   LEAX ,U                                  POINT X TO FCB
       0853    C63F C1 C0                   CMPB #$C0                                IS CURRENT GRANULE LAST ONE IN FILE?
       0854    C641 24 0A                   BHS     LC64D                            YES
       0855    C643 35 02                   PULS A                                   GET SECTOR NUMBER
       0856    C645 80 0A                   SUBA #10                                 WAS IT 10? - OVERFLOW TO NEXT GRANULE IF SO
       0857    C647 26 15                   BNE     LC65E                            BRANCH IF NOT
       0858    C649 E7 03                   STB     FCBCGR,X                         SAVE NEW GRANULE NUMBER
       0859    C64B 20 DC                   BRA     LC629                            SET VARIABLES FOR NEW GRANULE
       0860    C64D C4 3F          LC64D    ANDB #$3F                                GET NUMBER OF SECTORS USED IN THIS GRANULE
       0861    C64F C1 09                   CMPB #$09                                9 SECTORS / GRANULE
       0862    C651 23 05                   BLS     LC658                            BRANCH IF OK
       0863    C653 C6 40          LC653    LDB     #2*32                            'BAD FILE STRUCTURE' ERROR
       0864    C655 7E AC 46                JMP     LAC46                            ERROR DRIVER
       0865    C658 E0 E0          LC658     SUBB ,S+                                  SUBTRACT CURRENT SECTOR NUMBER AND PULS A
       0866    C65A 25 21                    BLO     LC67D                             BRANCH IF PAST LAST SECTOR
       0867    C65C 1F 98                    TFR     B,A                               SECTOR NUMBER TO ACCA
       0868    C65E 34 02          LC65E     PSHS A                                    SAVE SECTOR NUMBER DIFFERENCE
       0869    C660 8D 23                    BSR     LC685                             INCREMENT RECORD NUMBER
       0870    C662 86 02                    LDA     #$02                              *GET READ OPERATION CODE
       0871    C664 97 EA                    STA     DCOPC                             *AND SAVE IT IN DSKCON VARIABLE
       0872    C666 BD C7 63                 JSR     LC763                             GET PROPER TRACK AND SECTOR TO DSKCON VARIABLES
       0873    C669 33 88 19                 LEAU FCBCON,X                             * POINT U TO START OF FCB DATA BUFFER
       0874    C66C DF EE                    STU     DCBPT                             * AND SAVE IT IN DSKCON VARIABLE
       0875    C66E BD D6 F2                 JSR     LD6F2                             GO READ A SECTOR INTO FCB BUFFER
       0876    C671 6F 88 18                 CLR     FCBLFT,X                          NUMBER OF CHARS LEFT IN BUFFER = 256
       0877    C674 E6 E0                    LDB     ,S+                               GET SECTOR NUMBER OFF STACK
       0878    C676 26 0C                    BNE     LC684                             RETURN IF DATA LEFT; FALL THRU IF LAST SECTOR
       0879    C678 EC 88 13                 LDD     FCBLST,X                          GET NUMBER OF BYTES IN THE LAST SECTOR
       0880    C67B 26 04                    BNE     LC681                             BRANCH IF SOME BYTES IN LAST SECTOR
       0881    C67D 5F             LC67D     CLRB                                      SET NUMBER OF REMAINING BYTES = 256
       0882    C67E 63 88 17                 COM     FCBDFL,X                          SET DATA LEFT FLAG TO $FF
       0883    C681 E7 88 18       LC681     STB     FCBLFT,X                          SAVE THE NUMBER OF CHARS LEFT IN BUFFER
       0884    C684 39             LC684     RTS
       0885
       0886    C685 EE 07          LC685     LDU     FCBREC,X                          GET CURRENT RECORD NUMBER
       0887    C687 33 41                    LEAU $01,U                                BUMP IT
       0888    C689 EF 07                    STU     FCBREC,X                          PUT IT BACK
       0889    C68B 39                       RTS
       0890
       0891                        * SCAN DIRECTORY FOR FILENAME.EXT FOUND IN DNAMBF. IF FILENAME FOUND,
       0892                        * RETURN WITH SECTOR NUMBER IN V973, GRANULE IN V976 AND RAM BUFFER
       0893                        * CONTAINING DIRECTORY DATA IN V974. IF DISK IS FULL THEN V973,
       0894                        * V977 = 0. THE FIRST UNUSED SECTOR RETURNED IN V977, RAM IMAGE IN V978
       0895    C68C 7F 09 73       LC68C     CLR     V973                              CLEAR SECTOR NUMBER
       0896    C68F 7F 09 77                 CLR     V977                              CLEAR TEMP SECTOR COUNTER
       0897    C692 CC 11 02                 LDD     #$1102                            TRACK 17 (DIRECTORY), READ OPERATION CODE
       0898    C695 97 EC                    STA     DCTRK                             SAVE TRACK NUMBER
       0899    C697 D7 EA                    STB     DCOPC                             SAVE OPERATION CODE (READ)
       0900    C699 C6 03                    LDB     #$03                              READ SECTOR 3 (FIRST DIRECTORY SECTOR)
       0901    C69B D7 ED          LC69B     STB     DSEC                              SAVE SECTOR NUMBER IN DSKCON VARIABLE
       0902    C69D CE 06 00                 LDU     #DBUF0                            *BUFFER AREA NUMBER 0 AS DATA BUFFER - SAVE
       0903    C6A0 DF EE                    STU     DCBPT                             *IN DSKCON VARIABLE
       0904    C6A2 BD D6 F2                 JSR     LD6F2                             GO READ A SECTOR
       0905    C6A5 FF 09 74       LC6A5     STU     V974                              SAVE RAM DIRECTORY BUFFER ADDRESS
       0906    C6A8 31 C4                    LEAY ,U                                   POINT Y TO DIRECTORY BUFFER
       0907    C6AA A6 C4                    LDA     ,U                                GET A BYTE FROM BUFFER
       0908    C6AC 26 28                    BNE     LC6D6                             BRANCH IF NOT ZERO - FILE IS ACTIVE
       0909    C6AE 8D 29                    BSR     LC6D9                             SET UNUSED FILE POINTERS IF ENTRY HAS BEEN KILLED
       0910    C6B0 8E 09 4C       LC6B0     LDX     #DNAMBF                           POINT TO DISK FILE NAME BUFFER
       0911    C6B3 A6 80          LC6B3     LDA     ,X+                               *COMPARE THE FILENAME AND EXTENSION
       0912    C6B5 A1 C0                    CMPA ,U+                                  *STORED IN RAM AT DNAMBF TO THE DIRECTORY
       0913    C6B7 26 0E                    BNE     LC6C7                             *ENTRY STORED AT ,U (BRANCH IF MISMATCH)
       0914    C6B9 8C 09 57                 CMPX #DNAMBF+11                           AT END OF FILE NAME BUFFER?
       0915    C6BC 26 F5                    BNE     LC6B3                             BRANCH IF NOT DONE CHECKING FILENAME
       0916    C6BE F7 09 73                 STB     V973                              SAVE SECTOR NUMBER IN DSKCON VARIABLE
       0917    C6C1 A6 42                    LDA     FCBFGR,U                          *GET NUMBER OF FIRST GRANULE IN FILE
       0918    C6C3 B7 09 76                 STA     V976                              *AND SAVE IT IN V976
       0919    C6C6 39                       RTS
       0920
       0921    C6C7 33 A8 20       LC6C7     LEAU DIRLEN,Y                             GET NEXT DIRECTORY ENTRY (DIRLEN BYTES PER ENTRY)
       0922    C6CA 11 83 07 00              CMPU #DBUF0+SECLEN                        AT END OF BUFFER?
       0923    C6CE 26 D5                    BNE     LC6A5                             CHECK NEXT ENTRY IF NOT AT END
       0924    C6D0 5C                       INCB                                      NEXT SECTOR
       0925    C6D1 C1 0B                    CMPB #11                                  11 SECTORS MAX IN DIRECTORY
       0926    C6D3 23 C6                    BLS     LC69B                             BRANCH IF MORE SECTORS
       0927    C6D5 39                       RTS
       0928
       0929    C6D6 43             LC6D6     COMA                                      COMPLEMENT FIRST BYTE IN DIRECTORY EMTRY
       0930    C6D7 26 D7                    BNE     LC6B0                             BRANCH IF FILE IS ACTIVE - FALL THRU IF NOT USED
       0931
       0932                        * SET POINTERS FOR FIRST UNUSED DIRECTORY ENTRY
       0933    C6D9 B6 09 77       LC6D9     LDA     V977                              UNUSED ENTRY ALREADY FOUND?
       0934    C6DC 26 06                    BNE     DVEC12                            RETURN IF UNUSED ENTRY ALREADY FOUND
       0935    C6DE F7 09 77                 STB     V977                              SECTOR CONTAINING THIS DIRECTORY ENTRY
       0936    C6E1 FF 09 78                 STU     V978                              POINTS TO RAM AREA WHERE DIRECTORY DATA IS STORED
       0937    C6E4 39             DVEC12    RTS
       0938
       0939    C6E5 C6 34          LC6E4     LDB     #2*26                             'NE' ERROR
       0940    C6E7 7D 09 73                 TST     V973                              WAS A DIRECTORY MATCH FOUND?
       0941    C6EA 26 F8                    BNE     DVEC12                            RETURN IF FOUND
       0942    C6EC 7E AC 46                 JMP     LAC46                             JUMP TO ERROR HANDLER IF NOT FOUND
       0943
       0944                        * KILL COMMAND
       0945    C6EF BD C9 35       KILL      JSR     LC935                             GET FILENAME.EXT FROM BASIC
       0946    C6F2 BD A5 C7                 JSR     LA5C7                             'SYNTAX' ERROR IF MORE CHARACTERS ON LINE
       0947    C6F5 BD C7 9D                 JSR     LC79D                             GET VALID FAT DATA
       0948    C6F8 8D 92                    BSR     LC68C                             TEST FOR FILE NAME MATCH IN DIRECTORY
       0949    C6FA 8D E9                    BSR     LC6E5                             MAKE SURE THE FILE EXISTED
       0950    C6FC 86 FF          LC6FC     LDA     #$FF                              * MATCH FILE TYPE = $FF; THIS WILL CAUSE AN 'AO'
       0951                        *                                                   * ERROR TO BE GENERATED IF ANY FILE TYPE IS OPEN
       0952    C6FE BD C8 07                 JSR     LC807                             CHECK TO MAKE SURE FILE IS NOT OPEN
       0953    C701 BE 09 74                 LDX     V974                              *GET RAM IMAGE OF DIRECTORY
       0954    C704 6F 84                    CLR     DIRNAM,X                          *AND ZERO FIRST BYTE - KILL FILE
       0955    C706 C6 03                    LDB     #$03                              =WRITE OPERATION CODE - SAVE
       0956    C708 D7 EA                    STB     DCOPC                             =IT IN DSKCON VARIABLE
       0957    C70A BD D6 F2                 JSR     LD6F2                             WRITE A SECTOR
       0958    C70D E6 0D                    LDB     DIRGRN,X                          GET NUMBER OF FIRST GRANULE IN FILE
       0959    C70F 8D 44          LC70F     BSR     LC755                             POINT X TO PROPER FILE ALLOCATION TABLE
       0960    C711 30 06                    LEAX FATCON,X                             SKIP 6 CONTROL BYTES
       0961    C713 3A                      ABX                                         POINT TO CORRECT ENTRY
       0962    C714 E6 84                   LDB     ,X                                  GET NEXT GRANULE
       0963    C716 86 FF                   LDA     #$FF                                *GET FREE GRANULE FLAG AND
       0964    C718 A7 84                   STA     ,X                                  *MARK GRANULE AS FREE
       0965    C71A C1 C0                   CMPB #$C0                                   WAS THIS THE LAST GRANULE?
       0966    C71C 25 F1                   BLO     LC70F                               * KEEP FREEING GRANULES IF NOT LAST ONE
       0967                        *                                                    * WRITE FILE ALLOCATION SECTOR TO DIRECTORY - DO NOT WRITE
       0968                        *                                                    * THE SIX CONTROL BYTES AT THE START OF THE FAT TO THE DISK
       0969    C71E CE 06 00       LC71E    LDU     #DBUF0                              =POINT U TO DISK BUFFER 0 AND
       0970    C721 DF EE                   STU     DCBPT                               =SAVE IT AS DSKCON VARIABLE
       0971    C723 CC 11 03                LDD     #$1103                              * WRITE DIRECTORY TRACK - SAVE
       0972    C726 97 EC                   STA     DCTRK                               * TRACK AND WRITE OPERATION CODE IN
       0973    C728 D7 EA                   STB     DCOPC                               * DSKCON VARIABLES
       0974    C72A C6 02                   LDB     #$02                                = GET FILE ALLOCATION SECTOR AND
       0975    C72C D7 ED                   STB     DSEC                                = SAVE IN DSKCON VARIABLE
       0976    C72E 8D 25                   BSR     LC755                               POINT X TO PROPER FILE ALLOCATION TABLE
       0977    C730 6F 01                   CLR     FAT1,X                              RESET FLAG INDICATING VALID FAT DATA HAS BEEN STORED ON DISK
       0978    C732 30 06                   LEAX FATCON,X                               MOVE (X) TO START OF GRANULE DATA
       0979    C734 C6 44                   LDB     #GRANMX                             68 BYTES IN FAT
       0980    C736 BD A5 9A                JSR     LA59A                               MOVE ACCB BYTES FROM FAT RAM IMAGE TO DBUF0
       0981
       0982                        * ZERO OUT ALL OF THE BYTES IN THE FAT SECTOR WHICH DO NOT CONTAIN THE GRANULE DATA
       0983    C739 6F C0          LC739    CLR     ,U+                                 CLEAR A BYTE
       0984    C73B 11 83 07 00             CMPU #DBUF0+SECLEN                          FINISHED THE WHOLE SECTOR?
       0985    C73F 26 F8                   BNE     LC739                               NO
       0986    C741 7E D6 F2                JMP     LD6F2                               WRITE A SECTOR
       0987
       0988                        * ENTER WITH ACCB CONTAINING FILE NUMBER (1-15); EXIT WITH X POINTING
       0989                        * TO CORRECT FILE BUFFER; FLAGS SET ACCORDING TO FILE TYPE.
       0990
       0991    C744 34 04          LC744    PSHS B                                      SAVE FILE NUMBER ON STACK
       0992    C746 D6 6F                   LDB     DEVNUM                              GET DEVICE NUMBER (FILE NUMBER)
       0993    C748 8C                      CMPX #$3404                                 SKIP TWO BYTES
       0994    C749 34 04          LC719    PSHS B                                      SAVE FILE NUMBER ON STACK
       0995    C74B 58                      ASLB                                        X2: 2 BYTES PER POINTER
       0996    C74C 8E 09 26                LDX     #FCBV1-2                            POINT X TO START OF FCB POINTERS
       0997    C74F AE 85                   LDX     B,X                                 POINT X TO PROPER FCB
       0998    C751 E6 00                   LDB     FCBTYP,X                            SET FLAGS ACCORDING TO FILE TYPE
       0999    C753 35 84                   PULS B,PC                                   RESTORE FILE NUMBER
       1000
       1001                        * POINT X TO DRIVE ALLOCATION TABLE
       1002
       1003    C755 34 06          LC755    PSHS B,A                                    SAVE ACCD ON STACK
       1004    C757 96 EB                   LDA     DCDRV                               GET DRIVE NUMBER
       1005    C759 C6 4A                   LDB     #FATLEN                             GET LENGTH OF FILE ALLOCATION TABLE
       1006    C75B 3D                      MUL                                         MULTIPLY BY DRIVE NUMBER TO GET OFFSET
       1007    C75C 8E 08 00                LDX     #FATBL0                             START OF FILE ALLOCATION TABLE
       1008    C75F 30 8B                   LEAX D,X                                    POINT TO RIGHT TABLE
       1009    C761 35 86                   PULS A,B,PC                                 RESTORE ACCD
       1010
       1011                        * CONVERT GRANULE NUMBER TO TRACK & SECTOR NUMBER - X MUST BE POINTING TO CORRECT
       1012                        * FCB; THE TRACK AND SECTOR NUMBER WILL BE STORED IN DSKCON REGISTERS
       1013    C763 E6 03          LC763    LDB     FCBCGR,X                            GET GRANULE NUMBER
       1014    C765 54                      LSRB                                        DIVIDE BY 2 - 2 GRANULES / TRACK
       1015    C766 D7 EC                   STB     DCTRK                               TRACK NUMBER
       1016    C768 C1 11                   CMPB #17                                    TRACK 17 = DIRECTORY TRACK
       1017    C76A 25 02                   BLO     LC76E                               BRANCH IF < DIRECTORY TRACK
       1018    C76C 0C EC                   INC     DCTRK                               INCR TRACK NUMBER IF > DIRECTORY TRACK
       1019    C76E 58             LC76E    ASLB                                        MULTIPLY TRACK NUMBER BY 2
       1020    C76F 50                      NEGB                                        NEGATE GRANULE NUMBER
       1021    C770 EB 03                   ADDB FCBCGR,X                               B=0 IF EVEN GRANULE; 1 IF ODD
       1022    C772 8D 05                   BSR     LC779                               RETURN B=0 FOR EVEN GRANULE NUMBER, B=9 FOR ODD GRANULE NUMBER
       1023    C774 EB 04                   ADDB FCBSEC,X                               ADD SECTOR NUMBER
       1024    C776 D7 ED                   STB     DSEC                                SAVE SECTOR NUMBER
       1025    C778 39                      RTS
       1026                        * MULTIPLY ACCD BY 9
       1027    C779 34 06          LC778    PSHS B,A                                    TEMP STORE ACCD ON STACK
       1028    C77B 58                      ASLB                                        *
       1029    C77C 49                      ROLA                                        * MULTIPLY BY 2
       1030    C77D 58                      ASLB                                        =
       1031    C77E 49                      ROLA                                        = MULTIPLY BY FOUR
       1032    C77F 58                      ASLB                                        * 
       1033    C780 49                      ROLA                                        * MULTIPLY BY EIGHT
       1034    C781 E3 E1                   ADDD ,S++                                   ADD ONE = MULTIPLY BY NINE
       1035    C783 39                      RTS
       1036
       1037                        * CONVERT ACCD INTO A GRANULE NUMBER - RETURN RESULT IN ACCB;
       1038                        * ENTER WITH ACCD CONTAINING A NUMBER OF SECTORS. RETURN IN ACCB
       1039                        * THE NUMBER (0-67) CORRESPONDING TO THE NUMBER OF COMPLETE
       1040                        * GRANULES CONTAINED IN THAT MANY SECTORS.
       1041                        * DIVIDE BY 90, MULTIPLY BY 10 IS FASTER THAN DIVIDE BY 9
       1042    C784 6F E2          LC784    CLR     ,-S                                 CLEAR A TEMPORARY SLOT ON THE STACK
       1043    C786 6C E4          LC756    INC     ,S                                  * DIVIDE ACCD BY 90 - SAVE THE
       1044    C788 83 00 5A                SUBD #9*10                                  * QUOTIENT+1 ON THE STACK - REMAINDER
       1045    C78B 2A F9                   BPL     LC786                               * IN ACCB
       1046    C78D A6 E4                   LDA     ,S                                  = PUT THE QUOTIENT+1 IN ACCA AND
       1047    C78F E7 E4                   STB     ,S                                  = SAVE REMAINDER ON STACK
       1048    C791 C6 0A                   LDB     #10                                 * MULTIPLY (QUOTIENT+1)
       1049    C793 3D                      MUL                                         * BY 10
       1050    C794 35 02                   PULS A                                      PUT THE REMAINDER IN ACCA
       1051    C796 5A             LC796    DECB                                        * DECREMENT THE GRANULE COUNT BY ONE FOR
       1052    C797 8B 09                   ADDA #$09                                   * EVERY NINE SECTORS (1 GRANULE) IN THE
       1053    C799 2B FB                   BMI     LC796                               * REMAINDER - COMPENSATE FOR THE + 1 IN QUOTIENT+1
       1054    C79B 4F                      CLRA                                        CLEAR MS BYTE OF ACCD
       1055    C79C 39             LC79C    RTS
       1056
       1057                        * MAKE SURE RAM FILE ALLOCATION TABLE DATA IS VALID
       1058    C79D 8D B6          LC79D    BSR     LC755                             POINT X TO FAT FOR THE CORRECT DRIVE NUMBER
       1059    C79F 6D 00                   TST     FAT0,X                            CHECK TO SEE IF ANY FILES ARE ACTIVE
       1060    C7A1 26 F9                   BNE     LC79C                             RETURN IF ANY FILES ACTIVE IN THIS FAT
       1061    C7A3 6F 01                   CLR     FAT1,X                            RESET FAT DATA VALID FLAG
       1062    C7A5 33 06                   LEAU FATCON,X                             LOAD U WITH START OF GRANULE DATA BUFFER
       1063    C7A7 8E 06 00                LDX     #DBUF0                            BUFFER FOR DISK TRANSFER
       1064    C7AA 9F EE                   STX     DCBPT                             PUT IN DSKCON PARAMETER
       1065    C7AC CC 11 02                LDD     #$1102                            DIRECTORY TRACK, READ SECTOR
       1066    C7AF 97 EC                   STA     DCTRK                             STORE IN DSKCON TRACK NUMBER
       1067    C7B1 D7 EA                   STB     DCOPC                             STORE IN DSKCON OP CODE
       1068    C7B3 C6 02                   LDB     #$02                              GET SECTOR NUMBER 2 (FILE ALLOCATION TABLE)
       1069    C7B5 D7 ED                   STB     DSEC                              STORE IN DSKCON PARAMETER
       1070    C7B7 BD D6 F2                JSR     LD6F2                             GO READ SECTOR
       1071    C7BA C6 44                   LDB     #GRANMX                           TRANSFER FILE ALLOCATION TABLE TO FILE ALLOC TABLE BUFFER
       1072    C7BC 7E A5 9A                JMP     LA59A                             MOVE B BYTES FROM (X) TO (U)
       1073
       1074                        * FIND FIRST FREE GRANULE - ENTER WITH ACCB CONTAINING
       1075                        * GRANULE FROM WHICH TO START SEARCHING. THE FOUND GRANULE
       1076                        * IS MARKED BY STORING A $C0 IN THE GRANULE'S DATA BYTE
       1077                        * TO INDICATE THAT IT IS THE LAST GRANULE IN THE FILE.
       1078                        * RETURN WITH FIRST FREE GRANULE FOUND IN ACCA
       1079    C7BF 8D 94          LC7BF    BSR     LC755                             POINT X TO FILE ALLOC TABLE
       1080    C7C1 30 06                   LEAX FATCON,X                             SKIP CONTROL BYTES
       1081    C7C3 4F                      CLRA                                      USE ACCA AS GRANULE COUNTER
       1082    C7C4 C4 FE                   ANDB #$FE                                 MASK OFF BIT ZERO OF SEARCH GRANULE
       1083    C7C6 6F E2                   CLR     ,-S                               INITIALIZE AND SAVE A BYTE ON STACK (DIRECTION FLAG)
       1084    C7C8 63 85          LC7C8    COM     B,X                               IS THIS GRANULE FREE? ($FF=FREE)
       1085    C7CA 27 31                   BEQ     LC7FD                             BRANCH IF IT IS
       1086    C7CC 63 85                   COM     B,X                               RESTORE GRANULE DATA
       1087    C7CE 4C                      INCA                                      ADD ONE TO GRANULE COUNTER
       1088    C7CF 81 44                   CMPA #GRANMX                              GRANMX GEANULES PER DISK
       1089    C7D1 24 25                   BHS     LC7F8                             BRANCH IF ALL GRANULES CHECKED (DISK FULL)
       1090    C7D3 5C                      INCB                                      INCR TO NEXT GRANULE
       1091    C7D4 C5 01                   BITB #$01                                 IS BIT 0 SET?
       1092    C7D6 26 F0                   BNE     LC7C8                             BRANCH IF ODD GRANULE NUMBER (SAME TRACK)
       1093    C7D8 34 06                   PSHS B,A                                  SAVE GRANULE COUNTER AND CURRENT GRANULE NUMBER
       1094    C7DA C0 02                   SUBB #$02                                 SUBTRACT ONE TRACK (2 GRANULES)
       1095    C7DC 63 62                   COM     $02,S                             COMPLEMENT DIRECTION FLAG
       1096    C7DE 26 0C                   BNE     LC7EC                             BRANCH EVERY OTHER TIME
       1097    C7E0 E0 E0                   SUBB ,S+                                  SUBTRACT THE GRANULE COUNTER FROM THE CURRENT GRANULE NUMBER
       1098    C7E2 2A 04                   BPL     LC7E8                             BRANCH IF LOWER BOUND NOT EXCEEDED
       1099    C7E4 E6 E4                   LDB     ,S                                RESTORE CURRENT GRANULE NUMBER IF LOWER BOUND EXCEEDED
       1100    C7E6 63 61          LC7E6    COM     $01,S                             * COMPLEMENT FLAG - IF GRANULE NUMBER HAS EXCEEDED
       1101                        *                                                  * BOUNDS ON EITHER THE HI OR LO SIDE, FORCE IT TO GO IN
       1102                        *                                                  * THE DIRECTION OPPOSITE THE EXCEEDED BOUND
       1103    C7E8 32 61          LC7E8    LEAS $01,S                                CLEAN UP STACK
       1104    C7EA 20 DC                   BRA     LC7C8                             CHECK FOR ANOTHER FREE GRANULE
       1105
       1106    C7EC EB E0          LC7EC    ADDB ,S+                                  ADD THE GRANULE COUNTER TO THE CURRENT GRANULE NUMBER
       1107    C7EE C1 44                   CMPB #GRANMX                              GRANMX GRANULES PER DISK
       1108    C7F0 25 F6                   BLO     LC7E8                             BRANCH IF UPPER BOUND NOT EXCEEDED
       1109    C7F2 E6 E4                   LDB     ,S                                * RESTORE CURRENT GRANULE COUNT AND GO TWICE
       1110    C7F4 C0 04                   SUBB #$04                                 * AS FAR AS USUAL IN OPPOSITE DIRECTION IF UPPER BOUND EXCEEDED
       1111    C7F6 20 EE                   BRA     LC7E6                             KEEP SEARCHING
       1112    C7F8 C6 38          LC7F8    LDB     #2*28                             'DISK FULL' ERROR
       1113    C7FA 7E AC 46                JMP     LAC46                             JUMP TO ERROR HANDLER
       1114
       1115                        * POINT X TO FIRST FREE GRANULE POSITION IN THE FILE ALLOCATION
       1116                        * TABLE AND MARK THE POSITION WITH A LAST GRANULE IN FILE MARKER
       1117    C7FD 32 61          LC7FD    LEAS $01,S                                CLEAR UP STACK - REMOVE DIRECTION FLAG
       1118    C7FF 1F 98                   TFR     B,A                               GRANULE NUMBER TO ACCA
       1119    C801 3A                      ABX                                       POINT X TO FIRST FOUND GRANULE
       1120    C802 C6 C0                   LDB     #$C0                              LAST GRANULE FLAG
       1121    C804 E7 84                   STB     ,X                                MARK THE FIRST FOUND GRANULE AS THE LAST GRANULE
       1122    C806 39             LC806    RTS
       1123
       1124                        * CHECK ALL ACTIVE FILES TO MAKE SURE A FILE IS NOT ALREADY OPEN - TO BE OPEN
       1125                        * A FILE BUFFER MUST MATCH THE DRIVE NUMBER AND FIRST GRANULE NUMBER
       1126                        * IN RAM DIRECTORY ENTRY AND THE FCB TYPE MUST NOT MATCH THE FILE TYPE IN ACCA
       1127                        * AN 'AO' ERROR WILL NOT BE GENERATED IF A FILE IS BEING OPENED FOR
       1128                        * THE SAME MODE THAT IT HAS ALREADY BEEN OPENED UNDER.
       1129
       1130    C807 34 02          LC807    PSHS A                                    SAVE FILE TYPE ON STACK
       1131    C809 F6 09 5B                LDB     FCBACT                            NUMBER OF CURRENTLY OPEN FILES
       1132    C80C 5C                      INCB                                      ADD ONE MORE TO FILE COUNTER
       1133    C80D BD C7 49       LC80D    JSR     LC749                             POINT X TO FCB OF THIS FILE
       1134    C810 27 17                   BEQ     LC829                             BRANCH IF BUFFER NOT BEING USED
       1135    C812 96 EB                   LDA     DCDRV                             * GET DRIVE NUMBER AND CHECK TO SEE IF IT
       1136    C814 A1 01                   CMPA FCBDRV,X                             * MATCHES THE DRIVE NUMBER FOR THIS BUFFER
       1137    C816 26 11                   BNE     LC829                             FILE EXISTS ON ANOTHER DRIVE
       1138    C818 FE 09 74                LDU     V974                              GET RAM DIRECTORY AREA
       1139    C81B A6 4D                   LDA     DIRGRAN,U                         GET FIRST GRANULE IN FILE
       1140    C81D A1 02                   CMPA FCBFGR,X                             DOES IT MATCH THIS FILE BUFFER?
       1141    C81F 26 08                   BNE     LC829                             NO
       1142    C821 A6 00                   LDA     FCBTYP,X                          GET FILE TYPE OF THIS BUFFER
       1143    C823 A1 E4                   CMPA ,S                                   DOES IT MATCH THE ONE WE ARE LOOKING FOR?
       1144    C825 10 26 DD F3             LBNE LA61C                                'FILE ALREADY OPEN' ERROR IF NOT
       1145    C829 5A             LC829    DECB                                      DECR FILE COUNTER
       1146    C82A 26 E1                   BNE     LC80D                             BRANCH IF HAVEN'T CHECKED ALL ACTIVE FILES
       1147    C82C 35 82                   PULS A,PC                                 RESTORE FILE TYPE AND RETURN
       1148
       1149    C82E BD A5 A5       LC82E    JSR     LA5A5                             EVALUATE AN EXPRESSION (DEVICE NUMBER)
       1150    C831 0F 6F                   CLR     DEVNUM                            SET DEVICE NUMBER TO SCREEN
       1151    C833 5D                      TSTB                                      TEST NEW DEVICE NUMBER
       1152    C834 10 2F EC 12             LBLE LB44A                                'FC' ERROR IF DEVICE NUMBER NOT A DISK FILE
       1153    C838 BD C7 49                 JSR     LC749                                POINT X TO FCB
       1154    C83B A6 00                    LDA     FCBTYP,X                             TEST IF BUFFER IS IN USE
       1155    C83D 10 27 DB BA              LBEQ LA3FB                                   'FILE NOT OPEN' ERROR
       1156    C841 81 40                    CMPA #RANFIL                                 DIRECT/RANDOM FILE?
       1157    C843 27 C1                    BEQ     LC806                                RETURN IF RANDOM
       1158    C845 7E A6 16       LC856     JMP     LA616                                BAD FILE MODE ERROR IF NOT RANDOM
       1159
       1160                        * INPUT DEVICE NUMBER CHECK RAM HOOK
       1161    C848 86 10          DVEC5     LDA     #INPFIL                              INPUT FILE TYPE
       1162    C84A 8C             LC84A     CMPX #8620                                   SKIP TWO BYTES
       1163
       1164                        * PRINT DEVICE NUMBER CHECK RAM HOOK
       1165    C84B 86 20          DVEC6     LDA     #OUTFIL                              OUTPUT FILE TYPE
       1166    C84D 0D 6F                    TST     DEVNUM                               * CHECK DEVICE NUMBER AND RETURN IF
       1167    C84F 2F B5                    BLE     LC806                                * NOT A DISK FILE
       1168    C851 AF E4                    STX     ,S                                   = REPLACE SUBROUTINE RETURN ADDRESS WITH X REGISTER -
       1169                        *                                                      = THIS IS THE SAME AS LEAS 2,S AND PSHS X
       1170    C853 BD C7 44                 JSR     LC744                                POINT X TO FCB
       1171    C856 34 06                    PSHS B,A                                     SAVE ACCB AND FILE TYPE ON STACK
       1172    C858 A6 00                    LDA     FCBTYP,X                             GET FILE TYPE
       1173    C85A 10 27 DB 9D              LBEQ LA3FB                                   'FILE NOT OPEN' ERROR
       1174    C85E 81 40                    CMPA #RANFIL                                 RANDOM FILE?
       1175    C860 27 06                    BEQ     LC868                                BRANCH IF RANDOM FILE
       1176    C862 A1 E4                    CMPA ,S                                      IS THIS FCB OF THE PROPER TYPE?
       1177    C864 26 DF                    BNE     LC845                                'FILE MODE' ERROR IF NOT
       1178    C866 35 96          LC866     PULS A,B,X,PC                                RESTORE ACCB,X,ACCA (FILE TYPE) AND RETURN
       1179
       1180    C868 AE 64          LC868     LDX     $04,S                                * GET CALLING ADDRESS FROM THE STACK AND
       1181    C86A 8C B0 0C                 CMPX #LB00C                                  * RETURN UNLESS COMING FROM
       1182    C86D 26 F7                    BNE     LC866                                * BASIC'S 'INPUT' STATEMENT
       1183    C86F BD B2 6D                 JSR     SYNCOMMA                             SYNTAX CHECK FOR A COMMA
       1184    C872 81 22                    CMPA #'"'                                    CHECK FOR A DOUBLE QUOTE
       1185    C874 26 0B                    BNE     LC881                                RETURN TO BASIC'S 'INPUT' COMMAND
       1186    C876 BD B2 44                 JSR     LB244                                STRIP PROMPT STRING FROM BASIC AND PUT IT ON THE STRING STACK
       1187    C879 BD B6 57                 JSR     LB657                                PURGE THE STRING PUT ON THE STRING STACK
       1188    C87C C6 3B                    LDB     #';'                                 SEMICOLON
       1189    C87E BD B2 6F                 JSR     LB26F                                DO A SYNTAX CHECK FOR SEMICOLON
       1190    C881 8E B0 1E       LC881     LDX     #LB01E                               GET MODIFIED REENTRY POINT INTO BASIC
       1191    C884 AF 64                    STX     $04,S                                AND PUT IT INTO THE RETURN ADDRESS ON THE STACK
       1192    C886 35 96                    PULS A,B,X,PC                                RETURN TO BASIC
       1193
       1194                        * DEVICE NUMBER VALIDITY CHECK RAM HOOK
       1195    C888 2F 25          DVEC1     BLE     LC8AF                                RETURN IF NOT A DISK FILE
       1196    C88A F1 09 5B                 CMPB FCBACT                                  COMPARE DEVICE NUMBER TO HIGHEST POSSIBLE
       1197    C88D 10 22 DD 8E              LBHI LA61F                                   'DEVICE NUMBER' ERROR IF TOO BIG
       1198    C891 35 90                    PULS X,PC                                    RETURN
       1199
       1200                        * SET PRINT PARAMETERS RAM HOOK
       1201    C893 0D 6F          DVEC2     TST     DEVNUM                               *CHECK DEVICE NUMBER AND
       1202    C895 2F 18                    BLE     LC8AF                                *RETURN IF NOT DISK FILE
       1203    C897 32 62                    LEAS $02,S                                   PURGE RETURN ADDRESS OFF OF THE STACK
       1204    C899 34 16                    PSHS X,B,A                                   SAVE REGISTERS
       1205    C89B 0F 6E                    CLR     PRTDEV                               SET PRINT DEVICE NUMBER TO NON-CASSETTE
       1206    C89D BD C7 44                 JSR     LC744                                POINT X TO FCB
       1207    C8A0 E6 06                    LDB     FCBPOS,X                             GET PRINT POSITION
       1208    C8A2 4F                       CLRA                                         PRINT WIDTH (256)
       1209    C8A3 8E 10 00                 LDX     #$1000                               TAB FIELD WIDTH AND TAB ZONE
       1210    C8A6 7E A3 7C                 JMP     LA37C                                SAVE THE PRINT PARAMETERS
       1211
       1212                        * BREAK CHECK RAM HOOK
       1213    C8A9 0D 6F          DVEC11    TST     DEVNUM                               * CHECK DEVICE NUMBER AND RETURN
       1214    C8AB 2F 02                    BLE     LC8AF                                * IF NOT A DISK FILE
       1215    C8AD 32 62                    LEAS $02,S                                   = PURGE RETURN ADDRESS OFF OF THE STACK - DON'T
       1216    C8AF 39             LC8AF     RTS                                          = DO A BREAK CHECK IF DISK FILE
       1217
       1218                        * COMMAND INTERPRETATION RAM HOOK
       1219    C8B0 32 62          DVEC20    LEAS $02,S                                   PURGE RETURN ADDRESS OFF OF THE STACK
       1220    C8B2 1C AF          LC8B2     ANDCC #$AF                                   ENABLE IRQ & FIRQ
       1221    C8B4 7F FF 02                 CLR     PIA0+2                               STROBE ALL KEYS (COLUMN STROBE)
       1222    C8B7 B6 FF 00                 LDA     PIA0                                 READ KEYBOARD ROWS
       1223    C8BA 43                       COMA                                         INVERT KEYBOARD ROW DATA
       1224    C8BB 84 7F                    ANDA #$7F                                    MASK OFF JOYSTICK INPUT BIT
       1225    C8BD 27 03                    BEQ     LC8C2                                BRANCH IF NO KEY DOWN
       1226    C8BF BD AD EB                 JSR     LADEB                                GO DO A BREAK CHECK IF A KEY IS DOWN
       1227    C8C2 9E A6          LC8C2     LDX     CHARAD                               GET INPUT POINTER INTO X
       1228    C8C4 9F 2F                    STX     TINPTR                               TEMP SAVE IT
       1229    C8C6 A6 80                    LDA     ,X+                                  SEARCH FOR THE END OF CURRENT LINE
       1230    C8C8 27 07                    BEQ     LC8D1                                BRANCH IF END OF LINE
       1231    C8CA 81 3A                    CMPA #':'                                    CHECK FOR END OF SUB LINE, TOO
       1232    C8CC 27 25                    BEQ     LC8F3                                BRANCH IF END OF SUB LINE
       1233    C8CE 7E B2 77                 JMP     LB277                                'SYNTAX' ERROR IF NOT END OF LINE
       1234    C8D1 A6 81          LC8D1     LDA     ,X++                                 *GET MS BYTE OF ADDRESS OF NEXT BASIC LINE
       1235    C8D3 97 00                    STA     ENDFLAG                              *AND SAVE IT IN CURLIN
       1236    C8D5 26 03                    BNE     LC8DA                                BRANCH IF NOT END OF PROGRAM
       1237    C8D7 7E AE 15                 JMP     LAE15                                GO 'STOP' THE SYSTEM
       1238    C8DA EC 80          LC8DA     LDD     ,X+                                  *GET LINE NUMBER OF THIS LINE AND
       1239    C8DC DD 68                    STD     CURLIN                               *SAVE IT IN CURLIN
       1240    C8DE 9F A6                    STX     CHARAD                               RESET BASIC'S INPUT POINTER
       1241    C8E0 96 AF                    LDA     TRCFLG                               * CHECK THE TRACE FLAG AND
       1242    C8E2 27 0F                    BEQ     LC8F3                                * BRANCH IF TRACE OFF
       1243    C8E4 86 5B                    LDA     #'<'                                 < LEFT DELIMITER OF TRON
       1244    C8E6 BD A2 82                 JSR     LA282                                SEND CHARACTER TO CONSOLE OUT
       1245    C8E9 96 68                    LDA     CURLIN                               GET NUMBER OF CURRENT LINE NUMBER
       1246    C8EB BD BD CC                 JSR     LBDCC                                CONVERT ACCD TO DECIMAL & PRINT IT ON SCREEN
       1247    C8EE 86 5D                    LDA     #'>'                                 > RIGHT DELIMITER OF TRON
       1248    C8F0 BD A2 82                 JSR     LA282                                SEND A CHARACTER TO CONSOLE OUT
       1249    C8F3 9D 9F          LC8F3     JSR     GETNCH                           GET NEXT CHARACTER FROM BASIC
       1250    C8F5 1F A9                    TFR     CC,B                             SAVE STATUS REGISTER IN ACCB
       1251    C8F7 81 98                    CMPA #$98                                CSAVE TOKEN?
       1252    C8F9 26 03                    BNE     LC8FE                            NO
       1253    C8FB 7E 83 16                 JMP     L8316                            GO CHECK FOR CSAVEM
       1254    C8FE 81 97          LC8FE     CMPA #$97                                CLOAD TOKEN?
       1255    C900 26 03                    BNE     LC905                            NO
       1256    C902 7E 83 11                 JMP     L8311                            JUMP TO EXBAS' CLOAD ROUTINE
       1257    C905 1F 9A          LC905     TFR     B,CC                             RESTORE STATUS REGISTER
       1258    C907 BD AD C6                 JSR     LADC6                            LOOP THROUGH BASIC'S MAIN INTERPRETATION LOOP
       1259    C90A 20 A6                    BRA     LC8B2
       1260
       1261                        * EOF RAM HOOK
       1262    C90C 32 62          DVEC14    LEAS $02,S                               PURGE RETURN ADDRESS OFF OF THE STACK
       1263    C90E 96 6F                    LDA     DEVNUM                           * GET DEVICE NUMBER AND SAVE
       1264    C910 34 02                    PSHS A                                   * IT ON THE STACK
       1265    C912 BD A5 AE                 JSR     LA5AE                            STRIP DEVICE NUMBER OFF OF INPUT LINE
       1266    C915 BD A3 ED                 JSR     LA3ED                            VERIFY THAT THE FILE TYPE WAS 'INPUT'
       1267    C918 0D 6F                    TST     DEVNUM                           * CHECK DEVICE NUMBER AND
       1268    C91A 10 2F DC BC              LBLE LA5DA                               * BRANCH BACK TO  BASIC'S EOF IF NOT DISK FILE
       1269    C91E BD C7 44                 JSR     LC744                            POINT X TO FCB
       1270    C921 E6 00                    LDB     FCBTYP,X                         GET FILE TYPE
       1271    C923 C1 40                    CMPB #RANFIL                             RANDOM FILE?
       1272    C925 10 27 DC ED              LBEQ LA616                               'FM' BAD FILE MODE ERROR IF RANDOM
       1273    C929 5F                       CLRB                                     FILE NOT EMPTY FLAG - SET TO NOT EMPTY
       1274    C92A A6 88 10                 LDA     FCBCFL,X                         *CHECK THE CACHE FLAG - BRANCH IF
       1275    C92D 26 03                    BNE     LC932                            *THERE IS A CHARACTER WHICH HAS BEEN CACHED
       1276    C92F E6 88 17                 LDB     FCBDFL,X                         GET SEQUENTIAL INPUT FILE STATUS
       1277    C932 7E A5 E4       LC932     JMP     LA5E4                            LINK BACK TO BASIC'S EOF STATEMENT
       1278
       1279                        * GET FILENAME/EXTENSION: DRIVE NUMBER FROM BASIC
       1280    C935 8E C2 A9       LC935     LDX     #DEFEXT                          POINT TO '   ' BLANK (DEFAULT) EXTENSION
       1281    C938 6F E2                    CLR     ,-S                              CLEAR A BYTE ON STACK FOR USE AS A DRIVES FLAG
       1282    C93A B6 09 5A                 LDA     DEFDRV                           * GET DEFAULT DISK NUMBER
       1283    C93D 97 EB                    STA     DCDRV                            * STORE IN DSKCON PARAMETER
       1284    C93F CE 09 4C                 LDU     #DNAMBF                          DISK FILENAME BUFFER
       1285    C942 CC 20 08                 LDD     #$2008                           STORE 8 BLANKS IN RAM (DEFAULT FILE NAME)
       1286    C945 A7 C0          LC945     STA     ,U+                              STORE A BLANK IN FILE NAME
       1287    C947 5A                       DECB                                     DECREMENT COUNTER
       1288    C948 26 FB                    BNE     LC945                            BRANCH IF NOT DONE
       1289    C94A C6 03                    LDB     #$03                             3 BYTES IN EXTENSION
       1290    C94C BD A5 9A                 JSR     LA59A                            MOVE B BYTES FROM (X) TO (U)
       1291    C94F BD 87 48                 JSR     L8748                            EVALUATE A STRING EXPRESSION
       1292    C952 33 84                    LEAU ,X                                  POINT U TO START OF STRING
       1293    C954 C1 02                    CMPB #$02                                * CHECK LENGTH OF STRING AND
       1294    C956 25 12                    BLO     LC96A                            * BRANCH IF < 2
       1295    C958 A6 41                    LDA     $01,U                            = GET 2ND CHARACTER IN STRING AND
       1296    C95A 81 3A                    CMPA #':'                                = CHECK FOR COLON
       1297    C95C 26 0C                    BNE     LC96A                            BRANCH IF NO DRIVE NUMBER
       1298    C95E A6 C4                    LDA     ,U                               * GET 1ST CHARACTER
       1299    C960 81 30                    CMPA #'0'                                * IN STRING AND
       1300    C962 25 06                    BLO     LC96A                            * CHECK TO SEE
       1301    C964 81 33                    CMPA #'3'                                * IF IT IS IN
       1302    C966 22 02                    BHI     LC96A                            * THE RANGE 0-3
       1303    C968 8D 33                    BSR     LC99D                            GET DRIVE NUMBER
       1304    C96A 8E 09 4C       LC96A     LDX     #DNAMBF                          POINT X TO FILE NAME BUFFER
       1305    C96D 5C                       INCB                                     COMPENSATE FOR DECB BELOW
       1306    C96E 5A             LC96E     DECB                                     DECREMENT STRING LENGTH
       1307    C96F 26 0C                    BNE     LC97D                            BRANCH IF MORE CHARACTERS IN STRING
       1308    C971 32 61                    LEAS $01,S                               CLEAN UP STACK - REMOVE DRIVE FLAG
       1309    C973 8C 09 4C       LC973     CMPX #DNAMBF                             POINTER STILL AT START OF BUFFER?
       1310    C976 26 67                    BNE     LC9DF                            RETURN IF NOT
       1311    C978 C6 3E          LC978     LDB     #2*31                            'BAD FILENAME' ERROR IF NULL FILENAME
       1312    C97A 7E AC 46                 JMP     LAC46                            ERROR HANDLER
       1313    C97D A6 C0          LC97D     LDA     ,U+                              GET A CHARACTER FROM STRING
       1314    C97F 81 2E                    CMPA #'.'                                LOOK FOR PERIOD?
       1315    C981 27 2D                    BEQ     LC9B0                            YES
       1316    C983 81 2F                    CMPA #'/'                                SLASH?
       1317    C985 27 29                    BEQ     LC9B0                            YES
       1318    C987 81 3A                    CMPA #':'                                COLON?
       1319    C989 27 09                    BEQ     LC994                            YES
       1320    C98B 8C 09 54                 CMPX #DEXTBF                             COMPARE POINTER TO END OF FILENAME BUFFER
       1321    C98E 27 E8                    BEQ     LC978                            'BAD FILENAME' ERROR - FILENAME TOO LONG
       1322    C990 8D 3E                    BSR     LC9D0                            PUT A CHARACTER IN FILENAME
       1323    C992 20 DA                    BRA     LC96E                            GET ANOTHER CHARACTER FROM STRING
       1324    C994 8D DD          LC994     BSR     LC973                            'BAD FILENAME' ERROR IF NO FILENAME YET
       1325    C996 8D 05                    BSR     LC99D                            GET DRIVE NUMBER
       1326    C998 5D                       TSTB                                     * CHECK LENGTH OF STRING
       1327    C999 26 DD                    BNE     LC978                            * ''BAD FILENAME' ERROR IF MORE CHARACTERS LEFT
       1328    C99B 35 82          LC99B     PULS A,PC                                REMOVE DRIVES FLAG FROM STACK AND RETURN
       1329
       1330                        * GRAB DRIVE NUMBER
       1331    C99D 63 62          LC99D     COM     $02,S                            TOGGLE DRIVE FLAG
       1332    C99F 27 D7                    BEQ     LC978                            'BAD FILENAME' ERROR IF DRIVE NUMBER DEFINED TWICE
       1333    C9A1 A6 C1                    LDA     ,U++                             ASCII VALUE OF DRIVE NUMBER TO ACCA
       1334    C9A3 C0 02                    SUBB #$02                                DECREMENT STRING LENGTH BY 2 FOR DRIVE (:X)
       1335    C9A5 80 30                    SUBA #'0'                                SUBTRACT ASCII BIAS
       1336    C9A7 25 CF                    BLO     LC978                            DRIVE NUMBER TOO LOW - 'BAD FILENAME' ERROR
       1337    C9A9 81 03                    CMPA #$03                                MAX OF 4 DRIVES
       1338    C9AB 22 CB                    BHI     LC978                            DRIVE NUMBER TOO HIGH - 'BAD FILENAME' ERROR
       1339    C9AD 97 EB                    STA     DCDRV                            STORE IN DSKCON DRIVE NUMBER
       1340    C9AF 39                       RTS
       1341
       1342                        * GRAB EXTENSION
       1343    C9B0 8D C1          LC9B0     BSR     LC973                            'BAD FILENAME' ERROR IF NO FILENAME YET
       1344    C9B2 8E 09 57                 LDX     #DFLTYP                          POINT X TO END OF EXTENSION BUFFER
       1345    C9B5 86 20                    LDA     #SPACE                           BLANK
       1346    C9B7 A7 82          LC9B7     STA     ,-X                              *
       1347    C9B9 8C 09 54                 CMPX #DEXTBF                             * FILL EXTENSION WITH
       1348    C9BC 26 F9                    BNE     LC9B7                            * BLANKS (DEFAULT)
       1349    C9BE 5A             LC9BE     DECB                                     DECREMENT STRING COUNTER
       1350    C9BF 27 DA                    BEQ     LC99B                            RETURN IF ZERO
       1351    C9C1 A6 C0                    LDA     ,U+                              GET A CHARACTER FROM STRING
       1352    C9C3 81 3A                    CMPA #':'                                *CHECK FOR DRIVE SEPARATOR
       1353    C9C5 27 CD                    BEQ     LC994                            *
       1354    C9C7 8C 09 57                 CMPX #DFLTYP                             =CHECK FOR END OF ESTENSION RAM BUFFER &
       1355    C9CA 27 AC                    BEQ     LC978                            = 'BAD FILENAME' ERROR IF EXTENSION TOO LONG
       1356    C9CC 8D 02                    BSR     LC9D0                            PUT A CHARACTER IN EXTENSION BUFFER
       1357    C9CE 20 EE                    BRA     LC9BE                            GET ANOTHER EXTENSION CHARACTER
       1358
       1359                        * INSERT CHARACTER INTO FILENAME OR EXTENSION
       1360    C9D0 A7 80          LC9D0     STA     ,X+                              STORE CHARACTER IN FILENAME BUFFER
       1361    C9D2 27 A4                    BEQ     LC978                            'BAD FILENAME' ERROR; ZEROES ARE ILLEGAL
       1362    C9D4 81 2E                    CMPA #'.'                                PERIOD?
       1363    C9D6 27 A0                    BEQ     LC978                            'BAD FILENAME' ERROR IF PERIOD
       1364    C9D8 81 2F                    CMPA #'/'                                SLASH?
       1365    C9DA 27 9C                    BEQ     LC978                            'BAD FILENAME' ERROR IF SLASH
       1366    C9DC 4C                       INCA                                     CHECK FOR $FF
       1367    C9DD 27 99                    BEQ     LC978                            'BAD FILENAME' ERROR IF $FF
       1368    C9DF 39             LC9DF     RTS
       1369
       1370                        * SAVE COMMAND
       1371    C9E0 81 4D          SAVE      CMPA #'M'                                *
       1372    C9E2 10 27 05 82              LBEQ LCF68                               *BRANCH IF SAVEM
       1373    C9E6 8D 4B                    BSR     LCA33                            GO GET FILENAME, ETC. FROM BASIC
       1374    C9E8 9E 8A                    LDX     ZERO                             ZERO OUT X REG
       1375    C9EA BF 09 57                 STX     DFLTYP                           SET FILE TYPE AND ASCII FLAG TO ZERO
       1376    C9ED 9D A5                    JSR     GETCCH                           GET CURRENT INPUT CHARACTER FROM BASIC
       1377    C9EF 27 21                    BEQ     LCA12                            BRANCH IF END OF LINE
       1378    C9F1 BD B2 6D                 JSR     SYNCOMMA                         SYNTAX CHECK FOR COMMA
       1379    C9F4 C6 41                    LDB     #'A'                             *ASCII FILE?
       1380    C9F6 BD B2 6F                 JSR     LB26F                            *SYNTAX CHECK ON CONTENTS OF ACCB
       1381    C9F9 26 E4                    BNE     LC9DF                            RETURN IF NO MORE CHARACTERS ON LINE
       1382    C9FB 73 09 58                 COM     DASCFL                           SET CRUNCHED/ASCII FLAG TO ASCII
       1383    C9FE 8D 04                    BSR     LCA04                            OPEN A SEQUENTIAL FILE FOR OUTPUT
       1384    CA00 4F                       CLRA                                     SET ZERO FLAG - CAUSE ENTIRE FILE TO BE LISTED
       1385    CA01 7E B7 64                 JMP     LIST                             'LIST' THE FILE TO CONSOLE OUT
       1386
       1387                        * OPEN A SEQUENTIAL FILE FOR INPUT/OUTPUT - USE THE SYSTEM
       1388                        * FCB LOCATED AT THE TOP OF FCBS
       1389    CA04 86 4F          LCA04     LDA     #'O'                             OUTPUT FILE TYPE
       1390    CA06 8C             LCA06     CMPX #$8649                              SKIP TWO BYTES
       1391    CA07 86 49          LCA07     LDA     #'I'                             INPUT FILE TYPE
       1392    CA09 F6 09 5B                 LDB     FCBACT                           GET NUMBER OF RESERVED FILES CURRENTLY RESERVED
       1393    CA0C 5C                       INCB                                     ADD ONE - USE ONE ABOVE HIGHEST RESERVED FCB
       1394    CA0D D7 6F                    STB     DEVNUM                           SAVE IT IN DEVICE NUMBER
       1395    CA0F 7E C4 8D                 JMP     LC48D                            OPEN A FILE & INITIALIZE FCB
       1396                        * SAVE A CRUNCHED FILE - A PREAMBLE OF THREE BYTES WILL PRECEED CRUNCHED
       1397                        * FILES: BYTE 1 = $FF, 2,3 = LENGTH OF BASIC PROGRAM
       1398    CA12 8D F0          LCA12     BSR     LCA04                            OPEN A SEQUENTIAL FILE FOR OUTPUT
       1399    CA14 86 FF                    LDA     #$FF                             BASIC FILE FLAG
       1400    CA16 BD CC 24                 JSR     LCC24                            CONSOLE OUT
       1401    CA19 DC 1B                    LDD     VARTAB                           LOAD ACCD WITH START OF VARIABLES
       1402    CA1B 93 19                    SUBD TXTTAB                              SUBTRACT START OF BASIC
       1403    CA1D BD CC 24                 JSR     LCC24                            CONSOLE OUT FILE LENGTH MS BYTE
       1404    CA20 1F 98                    TFR     B,A                              PULL LS BYTE INTO ACCA
       1405    CA22 BD CC 24                 JSR     LCC24                            CONSOLE OUT FILE LENGTH LS BYTE
       1406    CA25 9E 19                    LDX     TXTTAB                           POINT X TO START OF BASIC
       1407    CA27 A6 80          LCA27     LDA     ,X+                              GET BYTE FROM BASIC
       1408    CA29 BD CC 24                 JSR     LCC24                            SEND TO CONSOLE OUT
       1409    CA2C 9C 1B                    CMPX VARTAB                              COMPARE TO END OF BASIC
       1410    CA2E 26 F7                    BNE     LCA27                            KEEP GOING IF NOT AT END
       1411    CA30 7E A4 2D                 JMP     LA42D                            CLOSE FILE
       1412    CA33 8E C2 A6                 LDX     #BASEXT                          POINT TO 'BAS' EXTENSION (DEFAULT)
       1413    CA36 7E C9 38                 JMP     LC938                            GET FILENAME.EXT FROM BASIC
       1414
       1415                        * MERGE COMMAND
       1416    CA39 4F             MERGE     CLRA                                     RUN FLAG (0 = DON'T RUN)
       1417    CA3A C6 FF                    LDB     #$FF                             MERGE FLAG ($FF = MERGE)
       1418    CA3C 20 12                    BRA     LCA50                            GO LOAD THE FILE
       1419
       1420                        * RUN RAM VECTOR
       1421    CA3E 81 22          DVEC18    CMPA #'"'                                CHECK FOR FILENAME DELIMITER (DOUBLE QUOTE)
       1422    CA40 10 26 B8 58              LBNE XVEC18                              NONE - JUMP TO EXBAS RUN RAM HOOK
       1423    CA44 86 02                    LDA     #$02                             RUN FLAG - DON'T CLOSE ALL FILES BEFORE RUN
       1424    CA46 20 07                    BRA     LCA4F                            LOAD THE FILE
       1425
       1426                        * LOAD COMMAND
       1427    CA48 81 4D          LOAD      CMPA #'M'                                *
       1428    CA4A 10 27 05 73              LBEQ LCFC1                               *BRANCH IF LOADM
       1429    CA4E 4F                       CLRA                                     RUN FLAG = ZERO (DON'T RUN)
       1430    CA4F 5F             LCA4F     CLRB                                     CLEAR MERGE FLAG
       1431    CA50 B7 09 59       LCA50     STA     DRUNFL                           RUN FLAG (0 = DON'T RUN, 2 = RUN)
       1432    CA53 F7 09 5E                 STB     DMRGFL                           MERGE FLAG (0 = NO MERGE, $FF = MERGE)
       1433    CA56 8D DB                    BSR     LCA33                            GO GET FILENAME, ETC. FROM BASIC
       1434    CA58 9D A5                    JSR     GETCCH                           GET CURRENT INPUT CHAR
       1435    CA5A 27 10                    BEQ     LCA6C                            BRANCH IF END OF LINE
       1436    CA5C BD B2 6D                 JSR     SYNCOMMA                         SYNTAX CHECK FOR COMMA
       1437    CA5F C6 52                    LDB     #'R'                             *
       1438    CA61 BD B2 6F                 JSR     LB26F                            *IS NEXT CHAR 'R'? RUN AFTER LOAD
       1439    CA64 BD A5 C7                 JSR     LA5C7                            SYNTAX ERROR IF ANY MORE CHARS ON LINE
       1440    CA67 86 03                    LDA     #$03                             *SET FLAGS TO RUN AND CLOSE ALL FILES
       1441    CA69 B7 09 59                 STA     DRUNFL                               *BEFORE THE FILE IS RUN
       1442    CA6C 8D 99          LCA6C     BSR     LCA07                                GRAB FCB FOR INPUT FILE
       1443    CA6E B6 09 58                 LDA     DASCFL                               *CHECK ASCII FLAG AND BRANCH
       1444    CA71 27 0B                    BEQ     LCA7E                                *IF CRUNCHED BASIC FILE
       1445    CA73 7D 09 5E                 TST     DMRGFL                               IS THIS A MERGE?
       1446    CA76 26 03                    BNE     LCA7B                                BRANCH IF MERGE
       1447    CA78 BD AD 19                 JSR     LAD19                                DO A 'NEW' - ERASE VARIABLES, RESET VARIABLES
       1448    CA7B 7E AC 7C       LCA7B     JMP     LAC7C                                GO TO BASIC'S MAIN LOOP, IT WILL LOAD PROGRAM
       1449
       1450                        * LOAD IN A CRUNCHED BASIC FILE
       1451    CA7E B6 09 57       LCA7E     LDA     DFLTYP                               *CHECK FILE TYPE (MUST BE BASIC:0) & CHECK
       1452    CA81 BA 09 5E                 ORA     DMRGFL                               *MERGE FLAG (MUST BE NO MERGE: 0)
       1453    CA84 10 26 DB 8E              LBNE LA616                                   'BAD FILE MODE' ERROR IF MERGE OR NON-BASIC
       1454    CA88 BD AD 19                 JSR     LAD19                                DO A 'NEW' - RESET POINTERS, ERASE VARIABLES
       1455    CA8B 73 09 5D                 COM     DLODFL                               * SET THE LOAD FLAG TO $FF - THIS WILL CAUSE A NEW TO
       1456                        *                                                      * OCCUR IF AN ERROR OCCURS WHILE THE PROGRAM IS BEING LOADED
       1457    CA8E BD CD BC                 JSR     LCDBC                                GET CHAR FROM BUFFER - SHOULD BE $FF
       1458    CA91 BD CD BC                 JSR     LCDBC                                GET ANOTHER - MS BYTE OF LENGTH
       1459    CA94 34 02                    PSHS A                                       SAVE MS BYTE ON STACK
       1460    CA96 BD CD BC                 JSR     LCDBC                                LS BYTE OF LENGTH OF PROGRAM
       1461    CA99 1F 89                    TFR     A,B                                  PUT LS BYTE INTO ACCB
       1462    CA9B 35 02                    PULS A                                       NOW ACCD CONTAINS LENGTH OF PROGRAM
       1463    CA9D D3 19                    ADDD TXTTAB                                  ADD BEGINNING OF BASIC
       1464    CA9F BD AC 37                 JSR     LAC37                                SEE OF ENOUGH ROOM IN RAM FOR THIS FILE
       1465    CAA2 9E 19                    LDX     TXTTAB                               GET START OF BASIC
       1466    CAA4 BD C5 C4       LCAA4     JSR     LC5C4                                READ A CHAR FROM CONSOLE IN
       1467    CAA7 D6 70                    LDB     CINBFL                               BUFFER EMPTY?
       1468    CAA9 26 04                    BNE     LCAAF                                BRANCH IF SO
       1469    CAAB A7 80                    STA     ,X+                                  STORE CHAR
       1470    CAAD 20 F5                    BRA     LCAA4                                GET ANOTHER CHARACTER
       1471
       1472    CAAF 7F 09 5D       LCAAF     CLR     DLODFL                               CLEAR LOAD FLAG - LOAD WAS ERROR FREE
       1473    CAB2 9F 1B                    STX     VARTAB                               SAVE NEW START OF VARIABLES
       1474                        * MAKE SURE LAST THREE BYTES LOADED WERE ZERO
       1475    CAB4 C6 03                    LDB     #$03                                 CHECK THREE BYTES
       1476    CAB6 A6 82          LCAB6     LDA     ,-X                                  CHECK A BYTE
       1477    CAB8 26 03                    BNE     LCABD                                BRANCH IF NON-ZERO
       1478    CABA 5A                       DECB                                         DECREMENT COUNTER
       1479    CABB 26 F9                    BNE     LCAB6                                KEEP CHECKING IF NOT DONE
       1480    CABD 9E 1B          LCABD     LDX     VARTAB                               GET START OF VARIABLES
       1481    CABF 9F 1B          LCABF     STX     VARTAB                               SAVE START OF VARIABLES
       1482    CAC1 6F 80                    CLR     ,X+                                  CLEAR A BYTE
       1483    CAC3 5A                       DECB                                         DECREMRNT COUNTER
       1484    CAC4 2A F9                    BPL     LCABF                                KEEP CLEARING BYTES IF NOT DONE
       1485    CAC6 BD A4 2D       LCAC6     JSR     LA42D                                CLOSE SELECTED FILE
       1486    CAC9 BD AD 21                 JSR     LAD21                                DO PART OF NEW - ERASE VARIABLES, RESET INPUT PTR
       1487    CACC BD 82 9C                 JSR     XVEC18                               INITIALIZE EXBAS GRAPHICS VARIABLES
       1488    CACF BD AC EF                 JSR     LACEF                                RELOCATE ALL THE BASIC NEXT LINE POINTERS
       1489    CAD2 77 09 59                 ASR     DRUNFL                               CHECK LSB OF RUN FLAG
       1490    CAD5 25 03                    BLO     LCADA                                BRANCH IF DON'T CLOSE ALL FILES
       1491    CAD7 BD A4 26                 JSR     LA426                                CLOSE ALL FILES
       1492    CADA 77 09 59       LCADA     ASR     DRUNFL                               TEST BIT 1 OF RUN FLAG
       1493    CADD 10 25 E2 BD              LBCS LAD9E                                   BRANCH TO COMM INTERPRETATION LOOP IF BIT 1 SET
       1494    CAE1 7E AC 73                 JMP     LAC73                                RETURN TO DIRECT MODE
       1495
       1496    CAE4 0D 6F          DVEC13    TST     DEVNUM                               * CHECK DEVICE NUMBER AND
       1497    CAE6 2E DE                    BGT     LCAC6                                * TRY TO RUN FILE IF IT IS A DISK FILE
       1498    CAE8 39                       RTS
       1499
       1500                        * CLOSE ALL FILE BUFFERS RAM VECTOR
       1501    CAE9 F6 09 5B       DVEC7     LDB     FCBACT                               GET THE NUMBER OF RESERVED FILE BUFFERS
       1502    CAEC 5C                       INCB                                         ADD ONE
       1503    CAED 34 04          LCAED     PSHS B                                       SAVE IT
       1504    CAEF D7 6F                    STB     DEVNUM                               STORE IT IN DEVICE NUMBER
       1505    CAF1 8D 0E                    BSR     LCB01                                CLOSE FILE
       1506    CAF3 35 04                    PULS B                                       GET BACK NUMBER OF FILE BUFFERS
       1507    CAF5 5A                       DECB                                         DECREMENT FILE BUFFER COUNTER
       1508    CAF6 26 F5                    BNE     LCAED                                BRANCH IF ALL FILES NOT CLOSED
       1509    CAF8 39             LCAF8     RTS
       1510
       1511                        * CLOSE FILE RAM HOOK
       1512    CAF9 0D 6F          DVEC8     TST     DEVNUM                               * CHECK DEVICE NUMBER AND RETURN
       1513    CAFB 10 2F B7 87              LBLE XVEC8                                   * IF NOT A DISK FILE
       1514    CAFF 32 62                    LEAS $02,S                                   PURGE RETURN ADDRESS OFF OF THE STACK
       1515    CB01 BD C7 44       LCB01     JSR     LC744                                POINT X TO CORRECT FCB
       1516    CB04 0F 6F                    CLR     DEVNUM                               SET DEVICE NUMBER TO SCREEN
       1517    CB06 9F F1          LCB06     STX     FCBTMP                               SAVE FILE BUFFER POINTER
       1518    CB08 A6 00                    LDA     FCBTYP,X                             GET THE TYPE OF THIS FILE
       1519    CB0A 27 EC                    BEQ     LCAF8                                RETURN IF FILE NOT OPEN
       1520    CB0C 34 02                    PSHS A                                       SAVE FILE TYPE
       1521    CB0E 6F 00                    CLR     FCBTYP,X                             CLOSE THE FILE - ZERO OUT THE FILE TYPE
       1522    CB10 E6 01                    LDB     FCBDRV,X                             * GET DRIVE NUMBER AND
       1523    CB12 D7 EB                    STB     DCDRV                                * SAVE IT IN DSKCON VARIABLE
       1524    CB14 81 20                    CMPA #OUTFIL                                 = CHECK FOR OUTPUT TYPE AND
       1525    CB16 26 19                    BNE     LCB31                                = BRANCH IF NOT OUTPUT TYPE FILE
       1526
       1527                        * CLOSE A SEQUENTIAL OUTPUT FILE
       1528    CB18 E6 88 18                 LDB     FCBLFT,X                             GET THE NUMBER OF CHARACTERS IN BUFFER
       1529    CB1B 86 80                    LDA     #$80                                 * SET THE PRE-SAVED BIT TO INDICATE THAT THE DATA
       1530                        *                                                      * HAS ALREADY BEEN SAVED ON DISK
       1531    CB1D AA 05                    ORA     FCBCPT,X                             'OR' IN THE FULL SECTOR FLAG
       1532    CB1F ED 88 13                 STD     FCBLST,X                             SAVE THE NUMBER OF BYTES USED IN THE LAST SECTOR
       1533    CB22 6C 04                    INC     FCBSEC,X                             INCREMENT THE SECTOR NUMBER
       1534    CB24 E6 03                    LDB     FCBCGR,X                             GET THE CURRENT GRANULE NUMBER
       1535    CB26 BD C7 55                 JSR     LC755                                POINT X TO FILE ALLOCATION TABLE
       1536    CB29 A7 01                    STA     FAT1,X                               SET FAT DATA NOT VALID FLAG (ACCA <> 0)
       1537    CB2B 3A                      ABX                                       ADD GRANULE OFFSET TO FAT POINTER
       1538    CB2C 6C 06                   INC     FATCON,X                          * INCREMENT GRANULE DATA (ADD ONE SECTOR TO LAST
       1539                        *                                                  * GRANULE) SKIP PAST THE SIX FAT CONTROL BYTES
       1540    CB2E 7E CB C3       LCB2E    JMP     LCBC3                             UPDATE FAT AND DIRECTORY
       1541    CB31 81 40          LCB31    CMPA #RANFIL                              RANDOM FILE?
       1542    CB33 26 F9                   BNE     LCB2E                             NO - UPDATE FAT AND DIRECTORY IF SEQUENTIAL INPUT FILE
       1543
       1544                        * CLOSE A RANDOM FILE
       1545    CB35 EC 09                   LDD     FCBRLN,X                          GET RECORD LENGTH
       1546    CB37 AE 0B                   LDX     FCBBUF,X                          POINT X TO RANDOM FILE BUFFER
       1547    CB39 31 8B                   LEAY D,X                                  POINT Y TO END OF RANDOM FILE BUFFER
       1548    CB3B 34 36                   PSHS Y,X,B,A                              SAVE POINTERS ON STACK
       1549    CB3D 31 E4                   LEAY ,S                                   POINT Y CURRENT STACK POINTER
       1550    CB3F DE 1B                   LDU     VARTAB                            GET START OF VARIABLES
       1551    CB41 11 93 1D       LCB41    CMPU ARYTAB                               COMPARE TO START OF ARRAYS
       1552    CB44 27 0E                   BEQ     LCB54                             BRANCH IF ALL VARIABLES CHECKED
       1553    CB46 A6 41                   LDA     $01,U                             GET 2ND BYTE OF VARIABLE NAME
       1554    CB48 33 42                   LEAU $02,U                                MOVE POINTER TO START OF DESCRIPTOR
       1555    CB4A 2A 02                   BPL     LCB4E                             BRANCH IF VARIABLE - NUMERIC
       1556    CB4C 8D 28                   BSR     LCB76                             ADJUST STRING VARIABLE IF IN RANDOM FILE BUFFER
       1557    CB4E 33 45          LCB4E    LEAU $05,U                                MOVE POINTER TO NEXT VARIABLE
       1558    CB50 20 EF                   BRA     LCB41                             PROCESS ANOTHER VARIABLE
       1559    CB52 35 40          LCB52    PULS U                                    GET ADDRESS OF NEXT ARRAY TO U
       1560    CB54 11 93 1F       LCB54    CMPU ARYEND                               COMPARE TO END OF ARRAYS
       1561    CB57 27 3A                   BEQ     LCB93                             BRANCH IF END OF ARRAYS
       1562    CB59 1F 30                   TFR     U,D                               * SAVE ARRAY START IN ACCD, ADD OFFSET
       1563    CB5B E3 42                   ADDD $02,U                                * TO NEXT ARRAY AND SAVE ADDRESS OF
       1564    CB5D 34 06                   PSHS B,A                                  * NEXT ARRAY ON THE STACK
       1565    CB5F A6 41                   LDA     $01,U                             GET 2ND LETTER OF VARIABLE NAME
       1566    CB61 2A EF                   BPL     LCB52                             BRANCH IF NUMERIC
       1567    CB63 E6 44                   LDB     $04,U                             GET THE NUMBER OF DIMENSIONS
       1568    CB65 58                      ASLB                                      X2:2 BYTES PER DIMENSION
       1569    CB66 CB 05                   ADDB #$05                                 5 BYTES CONSTANT PER ARRAY DESCRIPTOR
       1570    CB68 4F                      CLRA                                      CLEAR MSB OF OFFSET - (ONLY 125 DIMENSIONS ALLOWED)
       1571    CB69 33 CB                   LEAU D,U                                  POINT U TO START OF THIS ARRAY'S VARIABLES
       1572    CB6B 11 A3 E4       LCB6B    CMPU ,S                                   AT END OF THIS ARRAY?
       1573    CB6E 27 E2                   BEQ     LCB52                             YES
       1574    CB70 8D 04                   BSR     LCB76                             ADJUST STRING VARIABLE IF IN RANDOM FILE BUFFER
       1575    CB72 33 45                   LEAU $05,U                                MOVE POINTER TO NEXT DESCRIPTOR
       1576    CB74 20 F5                   BRA     LCB6B                             CHECK NEXT VARIABLE
       1577                        *
       1578                        * CHECK TO SEE IF A STRING IS LOCATED IN THE RANDOM FILE BUFFER AREA. IF IT IS
       1579                        * THE RANDOM FILE BUFFER IN QUESTION, IT WILL BE DELETED. IF IT IS HIGHER IN THE RANDOM
       1580                        * FILE BUFFER SPACE THAN THE BUFFER IN QUESTION, THE LENGTH OF THE CURRENT
       1581                        * BUFFER WILL BE SUBTRACTED FROM THE ADDRESS OF THE STRING BECAUSE THE CURRENT
       1582                        * BUFFER IS BEING DELETED (CLOSED).
       1583    CB76 AE 42          LCB76    LDX     $02,U                             POINT X TO START OF STRING
       1584    CB78 BC 09 48                CMPX RNBFAD                               COMPARE TO START OF FREE RANDOM FILE BUFFER AREA
       1585    CB7B 24 0E                   BHS     LCB8B                             RETURN IF > START OF FREE RANDOM FILE BUFFER AREA
       1586    CB7D AC 22                   CMPX $02,Y                                COMPARE TO START OF THIS FILE'S RANDOM BUFFER
       1587    CB7F 25 0A                   BLO     LCB8B                             RETURN IF < START OF THIS FILE'S RANDOM BUFFER
       1588    CB81 AC 24                   CMPX $04,Y                                COMPARE TO END OF THIS FILE'S RANDOM BUFFER
       1589    CB83 25 07                   BLO     LCB8C                             RETURN IF < END OF THIS FILE'S RANDOM BUFFER
       1590    CB85 1F 10                   TFR     X,D                               SAVE POINTER IN ACCD
       1591    CB87 A3 A4                   SUBD ,Y                                   SUBTRACT RECORD LENGTH FROM START OF STRING ADDRESS
       1592    CB89 ED 42                   STD     $02,U                             SAVE NEW START OF STRING ADDRESS
       1593    CB8B 39             LCB8B    RTS
       1594    CB8C 6F C4          LCB8C    CLR     ,U                                CLEAR THE LENGTH OF THE STRING
       1595    CB8E 6F 42                   CLR     $02,U                             * CLEAR THE ADDRESS
       1596    CB90 6F 43                   CLR     $03,U                             * OF THE STRING
       1597    CB92 39                      RTS
       1598                        * REMOVE RESERVED SPACE IN RANDOM FILE BUFFER FOR A 'CLOSED' RANDOM FILE
       1599                        * ADJUST THE START OF RANDOM FILE BUFFER POINTER IN ALL RANDOM FCBS
       1600    CB93 F6 09 5B       LCB93    LDB     FCBACT                            GET THE NUMBER OF ACTIVE FILES
       1601    CB96 5C                      INCB                                      ADD ONE
       1602    CB97 34 04          LCB97    PSHS B                                    SAVE FILES COUNT ON THE STACK
       1603    CB99 BD C7 49                JSR     LC749                             POINT X TO FCB
       1604    CB9C A6 00                   LDA     FCBTYP,X                          GET FILE TYPE
       1605    CB9E 81 40                   CMPA #RANFIL                              IS IT A RANDOM FILE?
       1606    CBA0 26 0B                   BNE     LCBAD                             BRANCH IF NOT
       1607    CBA2 EC 0B                   LDD     FCBBUF,X                          GET START OF THIS FILE'S RANDOM FILE BUFFER
       1608    CBA4 10 A3 24                CMPD $04,Y                                * COMPARE TO END OF RANDOM FILE BUFFER AREA AND
       1609    CBA7 25 04                   BLO     LCBAD                             * BRANCH IF < END OF RANDOM FILE BUFFER AREA
       1610    CBA9 A3 A4                   SUBD ,Y                                   = SUBTRACT RECORD LENGTH OF SELECTED FILE
       1611    CBAB ED 0B                   STD     FCBBUF,X                          = SAVE NEW START OF RANDOM FILE BUFFER
       1612    CBAD 35 04          LCBAD    PULS B                                    GET THE FILES COUNTER
       1613    CBAF 5A                      DECB                                      DECREMENT FILES COUNTER
       1614    CBB0 26 E5                   BNE     LCB97                             BRANCH IF ALL FILES NOT DONE
       1615    CBB2 35 56                   PULS A,B,X,U                              * U = END OF RANDOM FILE BUFFER, X = START OF RANDOM
       1616                                                                           * FILE BUFFER, ACCD = RECORD LENGTH
       1617
       1618                        ** THIS WOULD PROBABLY BE THE MOST CONVENIENT PLACE TO FIX THE BUG WHICH
       1619                        ** CAUSES THE SYSTEM TO HANG IF AN ERROR IS ENCOUNTERED DURING 'COPY'
       1620
       1621                        *        CMPU FCBADR                               * IS THE END OF THIS FCB'S BUFFER ABOVE THE END
       1622                        *                                                  * OF THE START OF THE FCB AREA
       1623                        *        BLO     LCBB4                             NO - FREE UP THE SPACE USED BY THIS FILE IN RANDOM BUFFER
       1624                        *        LDX     #DFLBUF                           YES - DOING A 'COPY'; RESET START OF RANDOM BUFFER
       1625                        *        BRA     LCBC0
       1626                        * RANDOM FILE BUFFER AREA
       1627                        * REMOVE RESERVED SPACE FOR CLOSED FILE FROM RANDOM FILE BUFFER SPACE
       1628
       1629    CBB4 11 B3 09 48    LCBB4    CMPU RNBFAD                               AT THE BOTTOM OF FREE RANDOM BUFFER AREA?
       1630    CBB8 27 06                   BEQ     LCBC0                             BRANCH IF THERE
       1631    CBBA A6 C0                   LDA     ,U+                               = GRAB A SOURCE BYTE AND
       1632    CBBC A7 80                   STA     ,X+                               = MOVE IT TO DESTINATION
       1633    CBBE 20 F4                   BRA     LCBB4                                    KEEP MOVING BYTES
       1634    CBC0 BF 09 48       LCBC0    STX     RNBFAD                                   SAVE NEW START OF FREE RANDOM BUFFER AREA
       1635    CBC3 BD C7 55       LCBC3    JSR     LC755                                    POINT X TO PROPER FILE ALLOCATION TABLE
       1636    CBC6 6A 00                   DEC     FAT0,X                                   REMOVE ONE ACTIVE FILE
       1637    CBC8 6D 01                   TST     FAT1,X                                   NEW DATA IN FAT RAM IMAGE?
       1638    CBCA 27 03                   BEQ     LCBCF                                    NO
       1639    CBCC BD C7 1E                JSR     LC71E                                    WRITE OUT FILE ALLOCATION TABLE TO DISK
       1640    CBCF 9E F1          LCBCF    LDX     FCBTMP                                   GET FILE BUFFER POINTER
       1641    CBD1 35 02                   PULS A                                           GET FILE TYPE
       1642    CBD3 81 20                   CMPA #OUTFIL                                     IS IT A SEQUENTIAL OUTPUT FILE?
       1643    CBD5 27 08                   BEQ     LCBDF                                    YES
       1644    CBD7 81 40                   CMPA #RANFIL                                     IS IT A RANDOM FILE?
       1645    CBD9 26 B0                   BNE     LCB8B                                    RETURN IF NOT A RANDOM FILE (SEQUENTIAL INPUT)
       1646    CBDB A6 0F                   LDA     FCBFLG,X                                 * TEST THE GET/PUT FLAG AND
       1647    CBDD 27 0A                   BEQ     LCBE9                                    * BRANCH IF 'GET'
       1648
       1649                        * WRITE CONTENTS OF FILE BUFFER TO DISK
       1650    CBDF BD C7 63       LCBDF    JSR     LC763                                    GET PROPER TRACK & SECTOR NUMBERS
       1651    CBE2 33 88 19                LEAU FCBCON,X                                    POINT U TO START OF FCB DATA
       1652    CBE5 DF EE                   STU     DCBPT                                    SET UP FILE BUFFER POINTER FOR DSKCON
       1653    CBE7 8D 2C                   BSR     LCC15                                    GO WRITE A SECTOR
       1654    CBE9 A6 88 13       LCBE9    LDA     FCBLST,X                                 CHECK THE PRE-SAVED FLAG
       1655    CBEC 2A 9D                   BPL     LCB8B                                    RETURN IF RECORD HAS ALREADY BEEN SAVED ON DISK
       1656    CBEE E6 88 12                LDB     FCBDIR,X                                 GET DIRECTORY NUMBER OF THIS FILE
       1657    CBF1 C4 07                   ANDB #$07                                        8 ENTRIES PER SECTOR
       1658    CBF3 86 20                   LDA     #DIRLEN                                  DIRLEN BYTES PER DIRECTORY ENTRY
       1659    CBF5 3D                      MUL                                              GET SECTOR OFFSET FOR THIS ENTRY
       1660    CBF6 CE 06 00                LDU     #DBUF0                                   * GET READ/WRITE BUFFER 0 AND
       1661    CBF9 DF EE                   STU     DCBPT                                    * SAVE IT IN DSKCON REGISTER
       1662    CBFB 31 CB                   LEAY D,U                                         Y POINTS TO CORRECT DIRECTORY ENTRY
       1663    CBFD E6 88 12                LDB     FCBDIR,X                                 GET DIRECTORY ENTRY NUMBER
       1664    CC00 54                      LSRB                                             *
       1665    CC01 54                      LSRB                                             *
       1666    CC02 54                      LSRB                                             * DIVIDE BY 8; EIGHT DIRECTORY ENTRIES PER SECTOR
       1667    CC03 CB 03                   ADDB #$03                                        ADD BIAS; FIRST 3 SECTORS NOT DIRECTORY
       1668    CC05 D7 ED                   STB     DSEC                                     STORE SECTOR NUMBER
       1669    CC07 CC 11 02                LDD     #$1102                                   DIRECTORY TRACK - READ OP CODE
       1670    CC0A 97 EC                   STA     DCTRK                                    STORE TRACK NUMBER
       1671    CC0C 8D 09                   BSR     LCC17                                    GO READ DIRECTORY
       1672    CC0E EC 88 13                LDD     FCBLST,X                                 GET NUMBER OF BYTES IN THE LAST SECTOR
       1673    CC11 84 7F                   ANDA #$7F                                        MASK OFF THE PRE-SAVED FLAG
       1674    CC13 ED 2E                   STD     DIRLIST,Y                                SAVE NUMBER OF BYTES IN LAST SECTOR OF FILE IN DIRECTORY
       1675    CC15 C6 03          LCC15    LDB     #$03                                     WRITE OP CODE
       1676    CC17 D7 EA          LCC17    STB     DCOPC                                    SAVE DSKCON OP CODE VARIABLE
       1677    CC19 7E D6 F2                JMP     LD6F2                                    GO READ/WRITE SECTOR
       1678
       1679                        * CONSOLE OUT RAM HOOK
       1680    CC1C 0D 6F          DVEC3    TST     DEVNUM                                   CHECK DEVICE NUMBER
       1681    CC1E 10 2F B6 51             LBLE XVEC3                                       BRANCH TO EX BASIC IF NOT A DISK FILE
       1682    CC22 32 62                   LEAS $02,S                                       POP RETURN OFF STACK
       1683                        * SEND A CHARACTER IN ACCA TO A DISK FILE. A CARRIAGE RETURN WILL RESET THE
       1684                        * PRINT POSITION AND CONTROL CODES WILL NOT INCREMENT THE PRINT POSITION.
       1685    CC24 34 16          LCC24    PSHS X,B,A                                       SAVE REGISTERS
       1686    CC26 8E 09 26                LDX     #FCBV1-2                                 POINT X TO TABLE OF FILE NUMBER VECTORS
       1687    CC29 D6 6F                   LDB     DEVNUM                                   GET CURRENT FILE NUMBER
       1688    CC2B 58                      ASLB                                             2 BYTES PER FCB ADDRESS
       1689    CC2C AE 85                   LDX     B,X                                      POINT X TO PROPER FCB
       1690    CC2E E6 84                   LDB     FCBTYP,X                                 GET FILE TYPE
       1691    CC30 C1 10                   CMPB #INPFIL                                     IS IT AN INPUT FILE?
       1692    CC32 27 36                   BEQ     LCC6A                                    RETURN IF SO
       1693    CC34 81 0D                   CMPA #CR                                         CARRIAGE RETURN (ENTER)
       1694    CC36 26 02                   BNE     LCC3A                                    NO
       1695    CC38 6F 06                   CLR     FCBPOS,X                                 CLEAR PRINT POSITION IF CARRIAGE RETURN
       1696    CC3A 81 20          LCC3A    CMPA #SPACE                                      *
       1697    CC3C 25 02                   BLO     LCC40                                    *BRANCH IF CONTROL CHAR
       1698    CC3E 6C 06                   INC     FCBPOS,X                                 INCREMENT PRINT POSITION
       1699    CC40 C1 40          LCC40    CMPB #RANFIL                                     IS IT RANDOM FILE?
       1700    CC42 26 1A                   BNE     LCC5E                                    BRANCH IF NOT RANDOM
       1701                        * PUT A BYTE INTO A RANDOM FILE
       1702    CC44 EC 88 17                LDD     FCBPUT,X                                 GET 'PUT' BYTE COUNTER
       1703    CC47 C3 00 01                ADDD #$0001                                      ADD ONE
       1704    CC4A 10 A3 09                CMPD FCBRLN,X                                    COMPARE TO RECORD LENGTH
       1705    CC4D 10 22 01 7A             LBHI LCDCB                                       'FR' ERROR IF 'PUT' BYTE COUNTER > RECORD LENGTH
       1706    CC51 ED 88 17                STD     FCBPUT,X                                 SAVE NEW 'PUT' BYTE COUNTER
       1707    CC54 AE 0B                   LDX     FCBBUF,X                                 POINT TO RANDOM FILE BUFFER POINTER
       1708    CC56 30 8B                   LEAX D,X                                         POINT TO ONE PAST END OF CURRENT RECORD DATA
       1709    CC58 35 02                   PULS A                                           PULL DATA FROM STACK
       1710    CC5A A7 1F                   STA     -1,X                                     STORE IN DATA BUFFER
       1711    CC5C 35 94                   PULS B,X,PC                                      RESTORE REGISTERS AND RETURN
       1712
       1713                        * WRITE A BYTE TO SEQUENTIAL OUTPUT FILE
       1714    CC5E 6C 88 18       LCC5E    INC     FCBLFT,X                                 INCREMENT CHARACTER COUNT
       1715    CC61 E6 88 18                LDB     FCBLFT,X                                 * GET CHARACTER COUNT AND BRANCH
       1716    CC64 27 06                   BEQ     LCC6C                                    * IF THE BUFFER IS FULL
       1717    CC66 3A                      ABX                                              ADD CHARACTER COUNT TO FCB ADDRESS
       1718    CC67 A7 88 18                STA     FCBCON-1,X                               STORE NEW CHARACTER (SKIP PAST 25 CONTROL BYTES AT FCB START)
       1719    CC6A 35 96          LCC6A    PULS A,B,X,PC
       1720
       1721                        * WRITE OUT A FULL BUFFER AND RESET BUFFER
       1722    CC6C 34 60          LCC6C    PSHS U,Y                                         SAVE REGISTERS
       1723    CC6E A7 89 01 18             STA     SECLEN+FCBCON-1,X                        STORE LAST CHARACTER IN BUFFER
       1724    CC72 E6 01                   LDB     FCBDRV,X                                 * GET DRIVE NUMBER AND SAVE
       1725    CC74 D7 EB                   STB     DCDRV                                    * IT IN DSKCON CONTROL TABLE
       1726    CC76 6C 04                   INC     FCBSEC,X                                 INCREMENT SECTOR NUMBER
       1727    CC78 BD CB DF                JSR     LCBDF                                    WRITE THE FILE BUFFER TO DISK
       1728    CC7B 31 84                   LEAY ,X                                          SAVE FCB POINTER IN Y
       1729    CC7D E6 03                   LDB     FCBCGR,X                          GET GRANULE NUMBER
       1730    CC7F BD C7 55                JSR     LC755                             POINT X TO PROPER ALLOCATION TABLE
       1731    CC82 3A                      ABX                                       ADD THE GRANULE NUMBER TO FAT POINTER
       1732    CC83 33 06                   LEAU FATCON,X                             POINT U TO THE CORRECT GRANULE IN FAT - SKIP PAST
       1733                                                                           THE SIX FAT CONTROL BYTES
       1734    CC85 A6 24                   LDA     FCBSEC,Y                          GET CURRENT SECTOR FOR THIS GRANULE
       1735    CC87 81 09                   CMPA #$09                                 MAX SECTOR NUMBER (9 SECTORS/GRANULE)
       1736    CC89 25 0E                   BLO     LCC99                             BRANCH IF NOT AT END OF GRANULE
       1737    CC8B 6A 24                   DEC     FCBSEC,Y                          *DECREMENT SECTOR NUMBER AND INCREMENT ERROR FLAG IN
       1738    CC8D 6C 25                   INC     FCBCPT,Y                          *CASE ERROR FOUND WHILE LOOKING FOR NEXT GRANULE -
       1739                        *                                                  THE ERROR FLAG IS USED TO INDICATE THAT ANOTHER SECTOR
       1740                        *                                                  MUST BE ADDED TO THE LENGTH OF FILE FOLLOWING ERROR PROCESSING.
       1741    CC8F BD C7 BF                JSR     LC7BF                             GET NEXT FREE GRANULE
       1742    CC92 6F 24                   CLR     FCBSEC,Y                          *CLEAR SECTOR NUMBER AND
       1743    CC94 6F 25                   CLR     FCBCPT,Y                          *ERROR FLAG - DISK WAS NOT FULL
       1744    CC96 A7 23                   STA     FCBCGR,Y                          SAVE NEW GRANULE IN FCB
       1745    CC98 8C 8A C0                CMPX #$8AC0                               SKIP TWO BYTES - NO DATA STORED IN NEW SECTOR YET
       1746    CC99 8A C0          LCC99    ORA     #$C0                              FORCE GRANULE NUMBER TO BE FINAL GRANULE IN FILE
       1747    CC9B A7 C4                   STA     ,U                                STORE IN MAP
       1748    CC9D 30 A4                   LEAX ,Y                                   POINT X TO FCB
       1749    CC9F BD C6 85                JSR     LC685                             INCREMENT RECORD NUMBER
       1750    CCA2 BD C5 A9                JSR     LC5A9                             UPDATE FILE ALLOCATION TABLE
       1751    CCA5 35 60                   PULS Y,U                                  RESTORE REGISTERS
       1752    CCA7 35 96                   PULS A,B,X,PC                             RESTORE REGISTERS AND RETURN
       1753
       1754                        * DIR COMMAND
       1755    CCA9 BD D2 4F       DIR      JSR     LD24F                             SCAN DRIVE NUMBER FROM INPUT LINE
       1756    CCAC BD C7 9D                JSR     LC79D                             GET FAT FOR THIS DRIVE
       1757    CCAF BD B9 58                JSR     LB958                             PRINT CARRIAGE RETURN TO CONSOLE OUT
       1758    CCB2 CC 11 02                LDD     #$1102                            * GET TRACK 17 AND
       1759    CCB5 97 EC                   STA     DCTRK                             * READ OP CODE AND
       1760    CCB7 D7 EA                   STB     DCOPC                             * SAVE IN DSKCON VARIABLES
       1761    CCB9 C6 03                   LDB     #$03                              START WITH SECTOR 3 (FIRST DIRECTORY SECTOR)
       1762
       1763                        * READ A DIRECTORY SECTOR INTO THE I/O BUFFER
       1764    CCBB D7 ED          LCCBB    STB     DSEC                              SAVE SECTOR NUMBER IN DSKCON VARIABLE
       1765    CCBD 8E 06 00                LDX     #DBUF0                            * USE I/O BUFFER 0 FOR DATA TRANSFER
       1766    CCC0 9F EE                   STX     DCBPT                             * SAVE IN DSKCON VARIABLE
       1767    CCC2 BD D6 F2                JSR     LD6F2                             READ A SECTOR
       1768
       1769                        * SEND DIRECTORY INFORMATION TO CONSOLE OUT
       1770    CCC5 35 40          LCCC5    PULS U                                    SAVE TOP OF STACK
       1771    CCC7 BD A5 49                JSR     LA549                             GO DO A BREAK CHECK
       1772    CCCA 34 40                   PSHS U                                    RESTORE STACK
       1773    CCCC A6 84                   LDA     DIRNAM,X                          TEST FILE NAME FIRST BYTE
       1774    CCCE 27 38                   BEQ     LCD08                             BRANCH IF KILLED
       1775    CCD0 43                      COMA                                      FF = END OF DIRECTORY
       1776    CCD1 27 44                   BEQ     LCD17                             RETURN IF END OF DIRECTORY
       1777    CCD3 34 10                   PSHS X                                    SAVE DIRECTORY POINTER ON STACK
       1778    CCD5 C6 08                   LDB     #$08                              NUMBER CHARACTERS TO PRINT
       1779    CCD7 BD B9 A2                JSR     LB9A2                             SEND FILENAME TO CONSOLE OUT
       1780    CCDA 8D 3F                   BSR     LCD1B                             SEND BLANK TO CONSOLE OUT
       1781    CCDC C6 03                   LDB     #$03                              NUMBER CHARACTERS TO PRINT
       1782    CCDE BD B9 A2                JSR     LB9A2                             SEND EXTENSION TO CONSOLE OUT
       1783    CCE1 8D 38                   BSR     LCD1B                             SEND BLANK TO CONSOLE OUT
       1784    CCE3 E6 00                   LDB     FCBTYP,X                          GET FILE TYPE
       1785    CCE5 C1 0A                   CMPB #10                                  * CHECK THE NUMBER OF DECIMAL DIGITS IN
       1786    CCE7 24 02                   BHS     LCCEB                             * ACCB: IF THERE IS ONLY ONE DIGIT,
       1787    CCE9 8D 30                   BSR     LCD1B                             * SEND BLANK TO CONSOLE OUT
       1788    CCEB 4F             LCCEB    CLRA                                      CLEAR MS BYTE OF ACCO
       1789    CCEC BD BD CC                JSR     LBDCC                             PRINT ACCD IN DECIMAL TO CONSOLE OUT
       1790    CCEF 8D 2A                   BSR     LCD1B                             SEND BLANK TO CONSOLE OUT
       1791    CCF1 AE E4                   LDX     ,S                                X NOW POINTS TO DIRECTORY ENTRY
       1792    CCF3 86 42                   LDA     #'A'+1                            ASCII BIAS
       1793    CCF5 AB 0C                   ADDA DIRASC,X                             ADD TO ASCII FLAG
       1794    CCF7 8D 1F                   BSR     LCD18                             PRINT CHARACTER AND BLANK TO CONSOLE OUT
       1795    CCF9 E6 0D                   LDB     DIRGRN,X                          GET FIRST GRANULE IN FILE
       1796    CCFB 8D 21                   BSR     LCD1E                             COUNT GRANULES
       1797    CCFD 1F 89                   TFR     A,B                               SAVE COUNT IN ACCB
       1798    CCFF 4F                      CLRA                                      CLEAR MS BYTE OF ACCD
       1799    CD00 BD BD CC                JSR     LBDCC                             PRINT ACCO IN DECIMAL TO CONSOLE OUT
       1800    CD03 BD B9 58                JSR     LB958                             SEND CARRIAGE RETURN TO CONSOLE OUT
       1801    CD06 35 10                   PULS X                                    PULL DIRECTORY POINTER OFF OF THE STACK
       1802    CD08 30 88 20       LCD08    LEAX DIRLEN,X                             MOVE X TO NEXT DIRECTORY ENTRY
       1803    CD0B 8C 07 00                CMPX #DBUF0+SECLEN                        END OF I/O BUFFER?
       1804    CD0E 25 B5                   BLO     LCCC5                             BRANCH IF MORE DIRECTORY ENTRIES IN BUFFER
       1805    CD10 D6 ED                   LDB     DSEC                              GET CURRENT SECTOR
       1806    CD12 5C                      INCB                                      BUMP COUNT
       1807    CD13 C1 12                   CMPB #SECMAX                              SECMAX SECTORS IN DIRECTORY TRACK
       1808    CD15 23 A4                   BLS     LCCBB                             GET NEXT SECTOR
       1809    CD17 39             LCD17    RTS                                       FINISHED
       1810    CD18 BD A2 82       LCD18    JSR     LA282                             SEND CHARACTER TO CONSOLE OUT
       1811    CD1B 7E B9 AC       LCD1B    JMP     LB9AC                             SEND BLANK TO CONSOLE OUT
       1812
       1813                        * ENTER WITH ACCB POINTING TO FIRST GRANULE IN A FILE; RETURN THE NUMBER OF
       1814                        * GRANULES IN THE FILE IN ACCA, THE GRANULE DATA FOR THE LAST SECTOR IN ACCB
       1815    CD1E BD C7 55       LCD1E    JSR     LC755                             POINT X TO FILE ALLOCATION BUFFER
       1816    CD21 33 06                   LEAU FATCON,X                             POINT U TO START OF GRANULE DATA
       1817    CD23 4F                      CLRA                                      RESET GRANULE COUNTER
       1818    CD24 4C             LCD24    INCA                                      INCREMENT GRANULE COUNTER
       1819    CD25 81 44                   CMPA #GRANMX                              CHECKED ALL 68 GRANULES?
       1820    CD27 10 22 F9 28             LBHI LC653                                YES - 'BAD FILE STRUCTURE' ERROR
       1821    CD2B 30 C4                   LEAX ,U                                   POINT U TO START OF GRANULE DATA
       1822    CD2D 3A                      ABX                                       ADD POINTER TO FIRST GRANULE
       1823    CD2E E6 84                   LDB     ,X                                GET THIS GRANULE'S CONTROL BYTE
       1824    CD30 C1 C0                   CMPB #$C0                                 IS THIS THE LAST GRANULE IN FILE?
       1825    CD32 25 F0                    BLO     LCD24                              NO - KEEP GOING
       1826    CD34 39                       RTS
       1827
       1828                        * INPUT RAM HOOK
       1829    CD35 0D 6F          DVEC10    TST     DEVNUM                             * CHECK DEVICE NUMBER AND RETURN
       1830    CD37 2F 5E                    BLE     LCD97                              * IF NOT A DISK FILE
       1831    CD39 8E B0 69                 LDX     #LB069                             = CHANGE THE RETURN ADDRESS ON THE STACK TO RE-ENTER BASIC'S INPUT
       1832    CD3C AF E4                    STX     ,S                                 = ROUTINE AT A DIFFERENT PLACE THAN THE CALLING ROUTINE
       1833    CD3E 8E 02 DD                 LDX     #LINBUF+1                          POINT X TO THE LINE INPUT BUFFER
       1834    CD41 C6 2C                    LDB     #','                               =
       1835    CD43 D7 01                    STB     CHARAC                             =COMMA IS READ ITEM SEPARATOR (TEMPORARY STRING SEARCH FLAG)
       1836    CD45 96 06                    LDA     VALTYP                             * GET VARIABLE TYPE AND BRANCH IF
       1837    CD47 26 02                    BNE     LCD4B                              * IT IS A STRING
       1838    CD49 C6 20                    LDB     #SPACE                             SPACE = NUMERIC SEARCH DELIMITER
       1839    CD4B 8D 6F          LCD4B     BSR     LCDBC                              GET AN INPUT CHARACTER
       1840    CD4D 81 20                    CMPA #SPACE                                SPACE?
       1841    CD4F 27 FA                    BEQ     LCD4B                              YES - GET ANOTHER CHARACTER
       1842    CD51 81 22                    CMPA #'"'                                  QUOTE?
       1843    CD53 26 0A                    BNE     LCD5F                              NO
       1844    CD55 C1 2C                    CMPB #','                                  SEARCH CHARACTER = COMMA?
       1845    CD57 26 06                    BNE     LCD5F                              NO - NUMERIC SEARCH
       1846    CD59 1F 89                    TFR     A,B                                * SAVE DOUBLE QUOTE AS
       1847    CD5B D7 01                    STB     CHARAC                             * THE SEARCH FLAG
       1848    CD5D 20 22                    BRA     LCD81                              SAVE DOUBLE QUOTES AS FIRST ITEM IN BUFFER
       1849
       1850    CD5F C1 22          LCD5F     CMPB #'"'                                  *
       1851    CD61 27 11                    BEQ     LCD74                              *BRANCH IF INPUTTING A STRING VARIABLE
       1852    CD63 81 0D                    CMPA #CR                                   IS THE INPUT CHARACTER A CARRIAGE RETURN
       1853    CD65 26 0D                    BNE     LCD74                              NO
       1854    CD67 8C 02 DD                 CMPX #LINBUF+1                             *IF AT THE START OF INPUTBUFFER, CHECK FOR A
       1855    CD6A 27 44                    BEQ     LCDB0                              *FOLLOWING LINE FEED AND EXIT ROUTINE
       1856    CD6C A6 1F                    LDA     -1,X                               =IF THE INPUT CHARACTER PRECEEDING THE CR WAS A LINE FEED,
       1857    CD6E 81 0A                    CMPA #LF                                   =THEN INSERT THE CR IN THE INPUT STRING, OTHERWISE
       1858    CD70 26 3E                    BNE     LCDB0                              =CHECK FOR A FOLLOWING LINE FEED AND EXIT THE ROUTINE
       1859    CD72 86 0D                    LDA     #CR                                RESTORE CARRIAGE RETURN AS THE INPUT CHARACTER
       1860    CD74 4D             LCD74     TSTA                                       *CHECK FOR A NULL (ZERO) INPUT CHARACTER AND
       1861    CD75 27 17                    BEQ     LCD8E                              *IGNORE IT IF lT IS A NULL
       1862    CD77 91 01                    CMPA CHARAC                                =
       1863    CD79 27 1D                    BEQ     LCD98                              =CHECK TO SEE IF THE INPUT CHARACTER MATCHES
       1864    CD7B 34 04                    PSHS B                                     =EITHER ACCB OR CHARAC AND IF IT DOES, THEN
       1865    CD7D A1 E0                    CMPA ,S+                                   =BRANCH TO CHECK FOR ITEM SEPARATOR OR
       1866    CD7F 27 17                    BEQ     LCD98                              =TERMINATOR SEQUENCE AND EXIT ROUTINE
       1867    CD81 A7 80          LCD81     STA     ,X+                                STORE NEW CHARACTER IN BUFFER
       1868    CD83 8C 03 D6                 CMPX #LINBUF+LBUFMX                        END OF INPUT BUFFER
       1869    CD86 26 06                    BNE     LCD8E                              NO
       1870    CD88 8D 46                    BSR     LCDD0                              GET A CHARACTER FROM CONSOLE IN
       1871    CD8A 26 06                    BNE     LCD92                              EXIT ROUTINE IF BUFFER EMPTY
       1872    CD8C 20 1E                    BRA     LCDAC                              CHECK FOR CR OR CR/LF AND EXIT ROUTINE
       1873
       1874    CD8E 8D 40          LCD8E     BSR     LCDD0                              GET A CHARACTER FROM CONSOLE IN
       1875    CD90 27 CD                    BEQ     LCD5F                              BRANCH IF BUFFER NOT EMPTY
       1876    CD92 6F 84          LCD92     CLR     ,X                                 PUT A ZERO AT END OF BUFFER WHEN DONE
       1877    CD94 8E 02 DC                 LDX     #LINBUF                            POINT (X) TO LINBUF - RESET POINTER
       1878    CD97 39             LCD97     RTS
       1879
       1880                        * CHECK FOR ITEM SEPARATOR OR TERMINATOR AND EXIT THE INPUT ROUTINE
       1881    CD98 81 22          LCD98     CMPA #'"'                                  QUOTE?
       1882    CD9A 27 04                    BEQ     LCDA0                              YES
       1883    CD9C 81 20                    CMPA #SPACE                                SPACE?
       1884    CD9E 26 F2                    BNE     LCD92                              NO - EXIT ROUTINE
       1885    CDA0 8D 2E                    BSR     LCDD0                              GET A CHARACTER FROM CONSOLE IN
       1886    CDA2 26 EE                    BNE     LCD92                              EXIT ROUTINE IF BUFFER EMPTY
       1887    CDA4 81 20                    CMPA #SPACE                                SPACE?
       1888    CDA6 27 F8                    BEQ     LCDA0                              YES - GET ANOTHER CHARACTER
       1889    CDA8 81 2C                    CMPA #','                                  COMMA (ITEM SEPARATOR)?
       1890    CDAA 27 E6                    BEQ     LCD92                              YES - EXIT ROUTINE
       1891    CDAC 81 0D          LCDAC     CMPA #CR                                   CARRIAGE RETURN?
       1892    CDAE 26 08                    BNE     LCDB8                              NO
       1893    CDB0 8D 1E                    BSR     LCDD0                              GET A CHARACTER FROM CONSOLE IN
       1894    CDB2 26 DE                    BNE     LCD92                              EXIT ROUTINE IF BUFFER EMPTY
       1895    CDB4 81 0A                    CMPA #LF                                   LINE FEED? TREAT CR,LF AS A CR
       1896    CDB6 27 DA                    BEQ     LCD92                              YES - EXIT ROUTINE
       1897    CDB8 8D 1C          LCDB8     BSR     LCDD6                              BACK UP PTR INPUT POINTER ONE
       1898    CDBA 20 D6                    BRA     LCD92                              EXIT ROUTINE
       1899
       1900    CDBC 8D 12          LCDBC     BSR     LCDD0                              GET A CHAR FROM INPUT BUFFER - RETURN IN ACCA
       1901    CDBE 27 15                    BEQ     LCDD5                              RETURN IF BUFFER NOT EMPTY
       1902    CDC0 BD C7 44                 JSR     LC744                              POINT X TO START OF FILE BUFFER
       1903    CDC3 E6 00                    LDB     FCBTYP,X                           GET FILE TYPE
       1904    CDC5 C1 40                    CMPB #RANFIL                               IS IT RANDOM FILE TYPE?
       1905    CDC7 10 26 F5 87              LBNE LC352                                 'INPUT PAST END OF FILE' ERROR IF NOT RANDOM
       1906    CDCB C6 4A          LCDCB     LDB     #2*37                              'WRITE/INPUT PAST END OF RECORD' ERROR IF RANDOM
       1907    CDCD 7E AC 46                 JMP     LAC46                              JUMP TO THE ERROR HANDLER
       1908
       1909    CDD0 BD A1 76       LCDD0     JSR     LA176                              GET A CHAR FROM INPUT BUFFER
       1910    CDD3 0D 70                    TST     CINBFL                             SET FLAGS ACCORDING TO CONSOLE INPUT FLAG
       1911    CDD5 39             LCDD5     RTS
       1912
       1913                        * MOVE THE INPUT POINTER BACK ONE (DISK FILE)
       1914    CDD6 34 14          LCDD6     PSHS X,B                                   SAVE REGISTERS ON STACK
       1915    CDD8 BD C7 44                 JSR     LC744                              POINT X TO PROPER FCB
       1916    CDDB E6 00                    LDB     FCBTYP,X                           GET FILE TYPE OF THIS FCB
       1917    CDDD C1 40                    CMPB #RANFIL                               IS IT A RANDOM FILE?
       1918    CDDF 26 0B                    BNE     LCDEC                              BRANCH IF NOT A RANDOM FILE
       1919    CDE1 EC 88 15                 LDD     FCBGET,X                           *GRAB THE RANDOM FILE 'GET' POINTER,
       1920    CDE4 83 00 01                 SUBD #$0001                                *MOVE IT BACK ONE AND RESTORE IT
       1921    CDE7 ED 88 15                STD      FCBGET,X                         *
       1922    CDEA 35 94                   PULS B,X,PC                               RESTORE REGISTERS AND RETURN
       1923    CDEC A7 88 11       LCDEC    STA      FCBCDT,X                         SAVE THE CHARACTER IN THE CACHE
       1924    CDEF 63 88 10                COM      FCBCFL,X                         SET THE CACHE FLAG TO $FF - DATA IN CACHE
       1925    CDF2 35 94                   PULS B,X,PC                               RESTORE REGISTERS AND RETURN
       1926
       1927                        * CVN COMMAND
       1928    CDF4 BD B6 54       CVN      JSR      LB654                            GET LENGTH AND ADDRESS OF STRING
       1929    CDF7 C1 05                   CMPB #$05                                 FIVE BYTES IN A FLOATING POINT NUMBER
       1930    CDF9 10 25 E6 4D             LBCS LB44A                                'FC' ERROR IF <> 5 BYTES
       1931    CDFD 0F 06                   CLR      VALTYP                           SET VARIABLE TYPE TO NUMERIC
       1932    CDFF 7E BC 14                JMP      LBC14                            COPY A PACKED FP NUMBER FROM (X) TO FPA0
       1933
       1934                        * MKN$ COMMAND
       1935    CE02 BD B1 43       MKN      JSR      LB143                            'TM' ERROR IF VALTYP=STRING
       1936    CE05 C6 05                   LDB      #$05                             FIVE BYTES IN A FLOATING POINT NUMBER
       1937    CE07 BD B5 0F                JSR      LB50F                            RESERVE FIVE BYTES IN STRING SPACE
       1938    CE0A BD BC 35                JSR      LBC35                            PACK FPA0 AND STORE IT IN STRING SPACE
       1939    CE0D 7E B6 9B                JMP      LB69B                            SAVE STRING DESCRIPTOR ON STRING STACK
       1940
       1941                        * LOC COMMAND
       1942    CE10 8D 07          LOC      BSR      LCE19                            POINT X TO FILE BUFFER
       1943    CE12 EC 07                   LDD      FCBREC,X                         GET RECORD NUMBER (RANDOM FILE) OR SECTOR CTR (SEQUENTIAL)
       1944    CE14 DD 52          LCE14    STD      FPA0+2                           *SAVE ACCD IN BOTTOM 2 BYTES OF FPA0 AND
       1945    CE16 7E 88 0E                JMP      L880E                            *CONVERT TO FLOATING POINT NUMBER
       1946
       1947                        * STRIP A DEVICE NUMBER FROM A BASIC STATEMENT, SET PRINT
       1948                        * PARAMETERS ACCORDING TO IT - ERROR IF FILE NOT
       1949                        * OPEN. RETURN WITH (X) POINTING TO THAT FILE'S FCB
       1950    CE19 96 6F          LCE19    LDA      DEVNUM                           * GET CURRENT DEVICE NUMBER AND
       1951    CE1B 34 02                   PSHS A                                    * SAVE IT ON THE STACK
       1952    CE1D BD B1 43                JSR      LB143                            'TM' ERROR IF VALTYP=STRING
       1953    CE20 BD A5 AE                JSR      LA5AE                            CHECK FOR VALID DEVICE NUMBER/SET PRINT PARAMETERS
       1954    CE23 0D 6F                   TST      DEVNUM                           * CHECK DEVICE NUMBER
       1955    CE25 10 2F E6 21             LBLE LB44A                                * BRANCH IF NOT DISK FILE 'ILLEGAL FUNCTION CALL'
       1956    CE29 BD C7 44                JSR      LC744                            POINT (X) TO FILE BUFFER
       1957    CE2C 35 02                   PULS A                                    * GET OLD DEVICE NUMBER OFF OF THE STACK AND
       1958    CE2E 97 6F                   STA      DEVNUM                           * SAVE IT AS DEVICE NUMBER
       1959    CE30 6D 00                   TST      FCBTYP,X                         IS FILE OPEN?
       1960    CE32 10 27 D5 C5             LBEQ LA3FB                                'FILE NOT OPEN' ERROR IF NOT OPEN
       1961    CE36 39                      RTS
       1962
       1963                        * LOF
       1964    CE37 8D E0          LOF      BSR      LCE19                            POINT X TO FILE BUFFER
       1965    CE39 A6 01                   LDA      FCBDRV,X                         * GET DRIVE NUMBER AND SAVE IT
       1966    CE3B 97 EB                   STA      DCDRV                            * IN DSKCON VARIABLE
       1967    CE3D E6 02                   LDB      FCBFGR,X                         GET FIRST GRANULE OF FILE
       1968    CE3F 34 10                   PSHS X                                    SAVE FCB POINTER ON STACK
       1969    CE41 BD CD 1E                JSR      LCD1E                            FIND TOTAL NUMBER OF GRANULES IN THIS FILE
       1970    CE44 4A                      DECA                                      SUBTRACT THE LAST GRANULE IN THE FILE
       1971    CE45 C4 3F                   ANDB #$3F                                 GET NUMBER OF SECTORS USED IN LAST GRANULE
       1972    CE47 34 04                   PSHS B                                    SAVE NUMBER OF SECTORS IN LAST GRANULE ON STACK
       1973    CE49 1F 89                   TFR      A,B                              * CONVERT ACCA TO POSITIVE
       1974    CE4B 4F                      CLRA                                      * 2 BYTE VALUE IN ACCD
       1975    CE4C BD C7 79                JSR      LC779                            MULT NUMBER OF FULL GRANULES BY 9
       1976    CE4F EB E0                   ADDB ,S+                                  ADD NUMBER SECTORS IN LAST TRACK
       1977    CE51 89 00                   ADCA #$00                                 PROPAGATE CARRY TO MS BYTE OF ACCD
       1978    CE53 35 10                   PULS X                                    GET FCB POINTER BACK
       1979    CE55 34 02                   PSHS A                                    SAVE ACCA ON STACK
       1980    CE57 A6 00                   LDA      FCBTYP,X                         * GET FILE TYPE OF THIS FCB AND
       1981    CE59 81 40                   CMPA #RANFIL                              * CHECK TO SEE IF IT'S A RANDOM FILE
       1982    CE5B 35 02                   PULS A                                    RESTORE ACCA
       1983    CE5D 26 B5                   BNE      LCE14                            IF NOT A RANDOM FILE, THEN THE TOTAL NUMBER OF SECTORS IN THE FILE
       1984                        *                                                  IS THE LENGTH OF THE FILE
       1985
       1986                        * CALCULATE LOF FOR A RANDOM FILE - THE LENGTH OF A RANDOM FILE IS THE
       1987                        * NUMBER OF RECORDS IN THE FILE.
       1988    CE5F 34 10                   PSHS X                                    SAVE FCB POINTER ON STACK
       1989    CE61 93 8A                   SUBD ZERO                                 SUBTRACT ZERO FROM ACCD (NUMBER OF SECTORS)
       1990    CE63 27 03                   BEQ      LCE68                            BRANCH IF ZERO SECTORS
       1991    CE65 83 00 01                SUBD #$0001                               SUBTRACT ONE SECTOR - THE LAST SECTOR MAY NOT BE IOOZ USED
       1992    CE68 8D AA          LCE68    BSR      LCE14                            PUT ACCD INTO FPA0
       1993    CE6A D6 4F                   LDB      FP0EXP                           GET EXPONENT OF FPA0
       1994    CE6C 27 04                   BEQ      LCE72                            BRANCH IF FPA0 = 0
       1995    CE6E CB 08                   ADDB #$08                                 * ADD 8 TO EXPONENT (MULTIPLY FPA0 BY
       1996    CE70 D7 4F                   STB      FP0EXP                           * 256 BYTES/SECTOR) AND SAVE NEW EXPONENT
       1997    CE72 BD BC 5F       LCE72    JSR      LBC5F                            SAVE NUMBER OF BYTES IN FULL SECTORS IN FPA1
       1998    CE75 AE E4                   LDX      ,S                               POINT X TO FCB
       1999    CE77 EC 88 13                LDD      FCBLST,X                         GET NUMBER OF BYTES IN LAST SECTOR
       2000    CE7A 84 7F                   ANDA #$7F                                 MASK OFF THE PRE-SAVED BYTE
       2001    CE7C 8D 96                   BSR      LCE14                            PUT NUMBER BYTES IN LAST SECTOR INTO FPA0
       2002    CE7E 0F 62                   CLR      RESSGN                           FORCE SUM SIGN = POSITIVE
       2003    CE80 96 5C                   LDA      FP1EXP                           * GET EXPONENTS OF FPA0 AND
       2004    CE82 D6 4F                   LDB      FP0EXP                           * FPA1 PRIOR TO ADDITION
       2005    CE84 BD B9 C5                JSR      LB9C5                            ADD NUMBER BYTES IN LAST SECTOR TO NUMBER OF
       2006                                                                           BYTES IN FULL SECTORS
       2007    CE87 BD BC 5F                JSR      LBC5F                            SAVE TOTAL NUMBER OF BYTES IN FPA1
       2008    CE8A 35 10                   PULS X                                    POINT X TO FCB
       2009    CE8C EC 09                   LDD      FCBRLN,X                         * GET RECORD LENGTH
       2010    CE8E 8D 84                   BSR      LCE14                            * PUT IT INTO FPA0
       2011    CE90 0F 62                   CLR      RESSGN                           FORCE QUOTIENT SIGN = POSITIVE
       2012    CE92 96 5C                   LDA      FP1EXP                           * GET EXPONENTS OF FPA0 AND
       2013    CE94 D6 4F                   LDB      FP0EXP                           * FPA1 PRIOR TO DIVISION
       2014    CE96 BD BB 91                JSR      LBB91                            DIVIDE TOTAL NUMBER OF BYTES BY NUMBER OF BYTES IN A RECORD
       2015    CE99 7E BC EE                JMP      INT                              CONVERT FPA0 TO AN INTEGER
       2016
       2017                        * FREE COMMAND
       2018    CE9C BD B1 43       FREE      JSR     LB143                            * NUMBER TYPE CHECK
       2019    CE9F BD B7 0E                 JSR     LB70E                            *EVALUATE NUMERIC EXPRESSION AND RETURN VALUE IN ACCB
       2020    CEA2 C1 03                    CMPB #$03                                ONLY 4 LEGAL DRIVES
       2021    CEA4 10 22 D7 77              LBHI LA61F                               'DEVICE NUMBER' ERROR IF DRIVE NUMBER IS > 3
       2022    CEA8 D7 EB                    STB     DCDRV                            SAVE IN DRIVE NUMBER
       2023    CEAA BD C7 9D                 JSR     LC79D                            GET FILE ALLOCATION TABLE AND STORE IN BUFFER
       2024    CEAD BD C7 55                 JSR     LC755                            POINT X TO START OF FILE ALLOCATION TABLE BUFFER
       2025    CEB0 30 06                    LEAX FATCON,X                            MOVE TO FIRST GRANULE DATA BYTE
       2026    CEB2 6F E2                    CLR     ,-S                              SPACE FOR FREE GRANULE COUNTER
       2027    CEB4 C6 44                    LDB     #GRANMX                          GET MAXIMUM NUMBER OF GRANULES
       2028    CEB6 A6 80          LCEB6     LDA     ,X+                              GET GRANULE DATA
       2029    CEB8 43                       COMA                                     *FREE GRANULES $FF
       2030    CEB9 26 02                    BNE     LCEBD                            *BRANCH IF NOT FREE
       2031    CEBB 6C E4                    INC     ,S                               INCREMENT FREE GRANULE COUNTER
       2032    CEBD 5A             LCEBD     DECB                                     DECREMENT GRANULE COUNTER
       2033    CEBE 26 F6                    BNE     LCEB6                            BRANCH IF NOT DONE
       2034    CEC0 35 04                    PULS B                                   GET FREE GRANULE COUNTER TO ACCB
       2035    CEC2 7E B4 F3                 JMP     LB4F3                            LOAD ACCB INTO FPA0
       2036
       2037                        * DRIVE COMMAND
       2038    CEC5 BD B7 0B       DRIVE     JSR     EVALEXPB                         EVALUATE EXPR; RETURN VALUE IN ACCB
       2039    CEC8 C1 03                    CMPB #$03                                MAX DRIVE NUMBER = 3
       2040    CECA 10 22 D7 51              LBHI LA61F                               'DEVICE #' ERROR IF DRIVE NUMBER > 3
       2041    CECE F7 09 5A                 STB     DEFDRV                           SAVE DEFAULT DRIVE NUMBER
       2042    CED1 39                       RTS
       2043
       2044                        * EVALUATE EXPRESSION RAM VECTOR
       2045    CED2 A6 64          DVEC15    LDA     $04,S                            = CHECK STACKED PRECEDENCE FLAG AND IF IT IS NOT AN END
       2046    CED4 26 13                    BNE     LCEE9                            = OF OPERATION, BRANCH TO EXTENDED BASIC'S EXPRESSION
       2047                                                                           = EVALUATION ROUTINE
       2048    CED6 AE 65                    LDX     $05,S                            *
       2049    CED8 8C AF 9A                 CMPX #LAF9A                              *
       2050    CEDB 26 0C                    BNE     LCEE9                            * CHECK TWO RETURN ADDRESSES BACK ON THE STACK
       2051    CEDD AE 62                    LDX     $02,S                            * TO SEE IF THE CALL TO EVALUATE EXPRESSION IS
       2052    CEDF 8C B1 66                 CMPX #LB166                              * COMING FROM THE 'LET' COMMAND - BRANCH OUT IF
       2053    CEE2 26 05                    BNE     LCEE9                            * NOT COMING FROM 'LET'
       2054    CEE4 8E CE EC                 LDX     #LCEEC                           = IF COMING FROM 'LET', REPLACE THE RETURN ADDR
       2055    CEE7 AF 65                    STX     $05,S                            = WITH THE DISK BASIC 'LET' MODIFIER ADDRESS
       2056    CEE9 7E 88 46       LCEE9     JMP     XVEC15                           EXTENDED BASIC EXPRESSION EVALUATION
       2057
       2058                        * LET MODIFIER
       2059    CEEC 35 02                    PULS A                                   PULL VARIABLE TYPE OFF OF THE STACK
       2060    CEEE 46                       RORA                                     SET CARRY IF SIRING, CLEAR CARRY IF NUMERIC
       2061    CEEF BD B1 48                 JSR     LB148                            DO A 'TM' CHECK
       2062    CEF2 10 27 ED 3D              LBEQ LBC33                               IF NUMERIC VARIABLE, PACK FPA0 INTO VARDES
       2063    CEF6 9E 52                    LDX     FPA0+2                           POINT X TO STRING DESCRIPTOR
       2064    CEF8 EC 02                    LDD     $02,X                            GET ADDRESS OF SIRING
       2065    CEFA 10 83 09 89              CMPD #DFLBUF                             * COMPARE TO START OF RANDOM FILE BUFFERS
       2066    CEFE 25 07                    BLO     LCF07                            * AND BRANCH IF LOWER
       2067    CF00 B3 09 4A                 SUBD FCBADR                              SUBTRACT OUT THE END OF RANDOM FILE BUFFERS
       2068    CF03 10 25 E0 AA              LBCS LAFB1                               BRANCH IF STRING STORED IN RANDOM FILE BUFFER -
       2069                                                                           MOVE IT INTO THE STRING SPACE
       2070    CF07 7E AF A4       LCF07     JMP     LAFA4                            BRANCH BACK TO BASIC'S 'LET' COMMAND
       2071
       2072                        *MODIFIER FOR EXBAS COMMAND INTERPRETATION HANDLER
       2073    CF0A 81 CA          DXCVEC    CMPA #$CA                                TOKEN FOR DLOAD?
       2074    CF0C 27 1C                    BEQ     LCF2A                            YES
       2075    CF0E 81 C8                    CMPA #$C8                                TOKEN FOR PMODE?
       2076    CF10 10 26 B2 28              LBNE L813C                               NO
       2077                        * DISK BASIC MODIFIER FOR PMODE - ALLOWS FOR THE RAM THE DOS USES
       2078    CF14 9D 9F                    JSR     GETNCH                           GET NEXT CHARACTER FROM BASIC
       2079    CF16 81 2C                    CMPA #','                                CHECK FOR COMMA
       2080    CF18 10 27 C7 34              LBEQ L9650                               BRANCH IF COMMA
       2081    CF1C BD B7 0B                 JSR     EVALEXPB                         EVALUATE EXPRESSION; RETURN VALUE IN ACCB
       2082    CF1F C1 04                    CMPB #$04                                CHECK FOR PMODE 4
       2083    CF21 10 22 E5 25              LBHI LB44A                               'FC' ERROR IF PMODE > 4
       2084    CF25 96 BC                    LDA     GRPRAM                           NUMBER BLOCKS BEFORE GRAPHICS PAGES
       2085    CF27 7E 96 2E                 JMP     L962E                            JUMP TO EXEAS' PMODE COMMAND
       2086
       2087                        * DISK BASIC DLOAD MODIFIER
       2088    CF2A BD A4 29       LCF2A     JSR     LA429                            CLOSE FILES
       2089    CF2D 9D 9F                    JSR     GETNCH                           GET NEXT CHARACTER FROM BASIC
       2090    CF2F 7E 8C 1B                 JMP     L8C1B                            JUMP TO EXEAS' DLOAD
       2091
       2092    CF32 C1 34          DXIVEC    CMPB #($9A-$80)*2                        MODIFIED TOKEN FOR POS
       2093    CF34 10 26 B2 30              LBNE L8168                               IF NOT POS, GO TO EXBAS SECONDARY COMM HANDLER
       2094    CF38 BD B2 62                 JSR     LB262                            SYNTAX CHECK FOR '(' AND EVALUATE EXPRESSION
       2095    CF3B 96 6F                    LDA     DEVNUM                           * GET DEVICE NUMBER AND
       2096    CF3D 34 02                    PSHS A                                   * SAVE IT ON STACK
       2097    CF3F BD A5 AE                 JSR     LA5AE                            EVALUATE DEVICE NUMBER
       2098    CF42 BD A4 06                 JSR     LA406                            TEST DEVICE NUMBER
       2099    CF45 0D 6F                    TST     DEVNUM                           * CHECK DEVICE NUMBER AND BRANCH
       2100    CF47 2F 13                    BLE     LCF5C                            * IF NOT A DISK FILE
       2101    CF49 BD C7 44                 JSR     LC744                            POINT X TO FCB
       2102    CF4C E6 00                    LDB     FCBTYP,X                         GET FILE TYPE
       2103    CF4E C1 40                    CMPB #RANFIL                             DIRECT/RANDOM FILE?
       2104    CF50 26 0A                    BNE     LCF5C                            BRANCH IF NOT A RANDOM FILE
       2105    CF52 35 02                    PULS A                                   * RESTORE DEVICE NUMBER
       2106    CF54 97 6F                    STA     DEVNUM                           *
       2107    CF56 EC 88 17                 LDD     FCBPUT,X                         =GRAB THE 'PUT' DATA ITEM COUNTER AND CONVERT
       2108    CF59 7E B4 F4                 JMP     GIVABF                           =IT TO A FLOATING POINT NUMBER
       2109    CF5C BD A3 5F       LCF5C     JSR     LA35F                            SET PRINT PARAMETERS
       2110    CF5F 35 02                    PULS A                                   * RESTORE DEVICE NUMBER
       2111    CF61 97 6F                    STA     DEVNUM                           *
       2112    CF63 D6 6C                    LDB     DEVPOS                           =GET PRINT POSITION AND
       2113    CF65 7E B4 F3                 JMP     LB4F3                            =CONVERT IT TO FLOATING POINT NUMBER IN FPA0
       2114
       2115                        * SAVEM COMMAND
       2116    CF68 9D 9F          LCF568    JSR     GETNCH                           GET NEXT INPUT CHARACTER
       2117    CF6A 8D 4F                    BSR     LCFBB                            GET FILENAME, ETC.
       2118    CF6C BD 83 6C                 JSR     L836C                            EVALUATE EXPRESSION, PUT II (2 BYTES) ON STACK
       2119    CF6F BD 83 6C                 JSR     L836C                            DITTO
       2120    CF72 AC 62                    CMPX $02,S                               COMPARE END ADDRESS TO START ADDRESS
       2121    CF74 10 25 E4 D2              LBCS LB44A                               IF START > END, THEN 'ILLEGAL FUNCTION CALL'
       2122    CF78 BD 83 6C                 JSR     L836C                            EVAL EXPRESSION (TRANSFER ADDRESS), PUT ON STACK
       2123    CF7B BD A5 C7                 JSR     LA5C7                            SYNTAX ERROR IF ANY MORE CHARS ON THIS LINE
       2124    CF7E CC 02 00                 LDD     #$0200                           * FILE TYPE=2, ASCII FLAG = CRUNCHED (0)
       2125    CF81 FD 09 57                 STD     DFLTYP                           *
       2126    CF84 BD CA 04                 JSR     LCA04                            GET NEXT UNOPEN FILE AND INITIALIZE FCB
       2127    CF87 4F                       CLRA                                     *ZERO FLAG - FIRST BYTE OF PREAMBLE
       2128    CF88 8D 2B                    BSR     LCFB5                            *WRITE A BYTE TO BUFFER
       2129    CF8A EC 62                    LDD     $02,S                            GET END ADDRESS
       2130    CF8C A3 64                    SUBD $04,S                               SUBTRACT THE START ADDRESS
       2131    CF8E C3 00 01                 ADDD #$0001                              THE SAVED DATA BLOCK WILL INCLUDE BOTH THE FIRST AND LAST BYTES
       2132    CF91 1F 02                    TFR     D,Y                              SAVE LENGTH IN Y
       2133    CF93 8D 1E                    BSR     LCFB3                            WRITE FILE LENGTH TO BUFFER - FIRST ARGUMENT OF PREAMBLE
       2134    CF95 EC 64                    LDD     $04,S                            GET THE START ADDRESS
       2135    CF97 8D 1A                    BSR     LCFB3                            WRITE OUT THE START ADDRESS - SECOND PREAMBLE ARGUMENT
       2136    CF99 AE 64                    LDX     $04,S                            GET START ADDRESS
       2137    CF9B A6 80          LCF9B     LDA     ,X+                              GRAB A BYTE
       2138    CF9D BD CC 24                 JSR     LCC24                            WRITE IT OUT
       2139    CFA0 31 3F                    LEAY -1,Y                                DECREMENT BYTE COUNTER
       2140    CFA2 26 F7                    BNE     LCF9B                            BRANCH IF ALL BYTES NOT DONE
       2141    CFA4 86 FF                    LDA     #$FF                             FIRST BYTE OF POSTAMBLE
       2142    CFA6 8D 0D                    BSR     LCFB5                            WRITE IT OUT - EOF RECORD
       2143    CFA8 4F                       CLRA                                     * FIRST ARGUMENT OF POSTAMBLE IS
       2144    CFA9 5F                       CLRB                                     * A DUMMY - ZERO VALUE
       2145    CFAA 8D 07                    BSR     LCFB3                            WRITE OUT POSTAMBLE FIRST ARGUMENT
       2146    CFAC 35 36                    PULS A,B,X,Y                             GET CONTROL ADDRESSES FROM THE STACK
       2147    CFAE 8D 03                    BSR     LCFB3                            WRITE OUT THE TRANSFER ADDRESS - 2ND ARGUMENT
       2148    CFB0 7E A4 2D                 JMP     LA42D                            GO CLOSE ALL FILES
       2149
       2150                        * WRITE ACCD TO THE BUFFER
       2151    CFB3 8D 00          LCFB3     BSR     LCFB5                            WRITE ACCA TO BUFFER, THEN SWAP ACCA,ACCB
       2152    CFB5 BD CC 24       LCFB5     JSR     LCC24                            WRITE ACCA TO BUFFER
       2153    CFB8 1E 89                    EXG     A,B                              SWAP ACCA,ACCB
       2154    CFBA 39                       RTS
       2155    CFBB 8E C2 AF       LCFBB     LDX     #BINEXT                          POINT TO .BIN EXTENSION
       2156    CFBE 7E C9 38                 JMP     LC938                            GET FILENAME, ETC.
       2157
       2158                        * LOADM COMMAND
       2159    CFC1 9D 9F          LCFC1     JSR     GETNCH                           GET NEXT INPUT CHARACTER
       2160    CFC3 8D F6                    BSR     LCFBB                            GET FILENAME, ETC.
       2161    CFC5 BD CA 07                 JSR     LCA07                            OPEN NEXT AVAILABLE FILE FOR INPUT
       2162    CFC8 FC 09 57                 LDD     DFLTYP                           GET FILE TYPE AND ASCII FLAG
       2163    CFCB 83 02 00                 SUBD #$0200                              FOR LOADM FILE: TYPE=2, ASCII FLAG=0
       2164    CFCE 10 26 D6 44              LBNE LA616                               'BAD FILE MODE' ERROR
       2165    CFD2 9E 8A                    LDX     ZERO                             ZERO OUT X REG - DEFAULT VALUE OF OFFSET
       2166    CFD4 9D A5                    JSR     GETCCH                           GET CURRENT CHARACTER FROM BASIC
       2167    CFD6 27 06                    BEQ     LCFDE                            BRANCH IF END OF LINE - NO OFFSET
       2168    CFD8 BD B2 6D                 JSR     SYNCOMMA                         SYNTAX CHECK FOR COMMA
       2169    CFDB BD B7 3D                 JSR     LB73D                            EVALUATE EXPRESSION
       2170    CFDE 9F D3          LCFDE     STX     VD3                              STORE OFFSET IN VD3
       2171    CFE0 BD A5 C7                 JSR     LA5C7                            SYNTAX ERROR IF OTHER CHARACTERS ON LINE
       2172
       2173                        * GET PREAMBLE/POSTAMBLE
       2174    CFE3 BD CD BC       LCFE3     JSR     LCDBC                            GET FIRST BYTE
       2175    CFE6 34 02                    PSHS A                                   SAVE IT ON THE STACK
       2176    CFE8 8D 29                    BSR     LD013                            GET FIRST ARGUMENT
       2177    CFEA 1F 02                    TFR     D,Y                              SAVE IT IN Y
       2178    CFEC 8D 25                    BSR     LD013                            GET THE SECOND ARGUMENT
       2179    CFEE D3 D3                    ADDD VD3                                 ADD IT TO THE OFFSET
       2180    CFF0 DD 9D                    STD     EXECJP                           STORE IT IN THE JUMP ADDRESS OF THE EXEC COMMAND
       2181    CFF2 1F 01                    TFR     D,X                              SAVE IT IN X
       2182    CFF4 A6 E0                    LDA     ,S+                              GET THE FIRST BYTE OFF OF THE STACK
       2183    CFF6 10 26 D4 33              LBNE LA42D                               CLOSE FILE IF POSTAMBLE (EOF)
       2184
       2185                        * GET RECORD BYTE(S)
       2186    CFFA BD C5 C4       LCFFA     JSR     LC5C4                            GET BYTE FROM BUFFER
       2187    CFFD D6 70                    LDB     CINBFL                           GET STATUS OF CONSOLE IN BUFFER
       2188    CFFF 27 03                    BEQ     LD004                            BRANCH IF BUFFER NOT EMPTY
       2189    D001 7E C3 52                 JMP     LC352                            'INPUT PAST END OF FILE' ERROR
       2190    D004 A7 84          LD004     STA     ,X                               STORE BYTE IN MEMORY
       2191    D006 A1 80                    CMPA ,X+                                 *TEST TO SEE IF IT STORED PROPERLY AND
       2192    D008 27 03                    BEQ     LD00D                            *BRANCH IF PROPER STORE (NOT IN ROM OR BAD RAM)
       2193    D00A 7E D7 09                 JMP     LD709                            'I/O ERROR' IF BAD STORE
       2194    D00D 31 3F          LD00D     LEAY -1,Y                                DECREMENT BYTE COUNT
       2195    D00F 26 E9                    BNE     LCFFA                            GET NEXT BYTE IF NOT DONE
       2196    D011 20 D0                    BRA     LCFE3                            READ ANOTHER PRE/POST AMBLE
       2197                        * READ TWO BYTES FROM BUFFER - RETURN THEM IN ACCD
       2198    D013 8D 00          LD013     BSR     LD015                            READ A BYTE, SAVE IT IN ACCB
       2199    D015 BD CD BC       LD015     JSR     LCDBC                            GET A CHARACTER FROM INPUT BUFFER, RETURN IT IN ACCA
       2200    D018 1E 89                    EXG     A,B                              SWAP ACCA,ACCB
       2201    D01A 39                       RTS
       2202
       2203                        * RENAME COMMAND
       2204    D01B 9E A6          RENAME    LDX     CHARAD                           * SAVE CURRENT INPUT POINTER
       2205    D01D 34 10                    PSHS X                                   * ON THE STACK
       2206    D01F 8D 35                    BSR     LD056                            GET FILENAME OF SOURCE FILE
       2207    D021 96 EB                    LDA     DCDRV                            * SAVE DRIVE NUMBER
       2208    D023 34 02                    PSHS A                                   * ON THE STACK
       2209    D025 8D 2A                   BSR     LD051                                 SYNTAX CHECK FOR 'TO' AND GET NEW FILENAME
       2210    D027 35 02                   PULS A                                        GET SOURCE DRIVE NUMBER
       2211    D029 91 EB                   CMPA DCDRV                                    COMPARE TO NEW FILE DRIVE NUMBER
       2212    D02B 10 26 E4 1B             LBNE LB44A                                    'FC' ERROR IF FlIES ON DIFFERENT DRIVES
       2213    D02F 8D 28                   BSR     LD059                                 VERIFY THAT NEW FILE DOES NOT ALREADY EXIST
       2214    D031 35 10                   PULS X                                        * RESTORE INPUT POINTER
       2215    D033 9F A6                   STX     CHARAD                                *
       2216    D035 8D 1F                   BSR     LD056                                 GET SOURCE FILENAME AGAIN
       2217    D037 BD C6 8C                JSR     LC68C                                 SCAN DIRECTORY FOR SOURCE FILENAME
       2218    D03A BD C6 E5                JSR     LC6E5                                 'NE' ERROR IF NOT FOUND
       2219    D03D 8D 12                   BSR     LD051                                 SYNTAX CHECK FOR 'TO' AND GET NEW FILENAME
       2220    D03F 8E 09 4C                LDX     #DNAMBF                               POINT X TO FILENAME
       2221    D042 FE 09 74                LDU     V974                                  POINT U TO DIRECTORY ENTRY OF SOURCE FILE
       2222    D045 C6 0B                   LDB     #$0B                                  11 CHARACTERS IN FILENAME AND EXTENSION
       2223    D047 BD A5 9A                JSR     LA59A                                 COPY NEW FILENAME TO SOURCE FILE DIRECTORY RAM IMAGE
       2224    D04A C6 03                   LDB     #$03                                  * GET WRITE OP CODE AND
       2225    D04C D7 EA                   STB     DCOPC                                 * SAVE IN DSKCON VARIABLE
       2226    D04E 7E D6 F2                JMP     LD6F2                                 WRITE NEW DIRECTORY SECTOR
       2227
       2228                        * DO A SYNTAX CHECK FOR 'TO' AND STRIP A FILENAME FROM BASIC
       2229    D051 C6 A5          LD051    LDB     #$A5                                  'TO' TOKEN
       2230    D053 BD B2 6F                JSR     LB26F                                 SYNTAX CHECK FOR 'TO'
       2231    D056 7E C9 35       LD056    JMP     LC935                                 GET FILENAME FROM BASIC
       2232    D059 BD C6 8C       LD059    JSR     LC68C                                 SCAN DIRECTORY FOR FILENAME
       2233    D05C C6 42                   LDB     #33*2                                 'FILE ALREADY EXISTS' ERROR
       2234    D05E 7D 09 73                TST     V973                                  CHECK FOR A MATCH
       2235    D061 10 26 DB E1             LBNE LAC46                                    'AE' ERROR IF FILE IN DIRECTORY
       2236    D065 39                      RTS
       2237
       2238                        * WRITE COMMAND
       2239    D066 10 27 E8 EE    WRITE    LBEQ LB958                                    PRINT CARRIAGE RETURN TO CONSOLE OUT IF END OF LINE
       2240    D06A 8D 03                   BSR     LD06F                                 GO WRITE AN ITEM LIST
       2241    D06C 0F 6F                   CLR     DEVNUM                                SET DEVICE NUMBER TO SCREEN
       2242    D06E 39             LD06E    RTS
       2243    D06F 81 23          LD06F    CMPA #'#'                                     CHECK FOR DEVICE NUMBER FLAG
       2244    D071 26 0F                   BNE     LD082                                 DEFAULT TO CURRENT DEVICE NUMBER IF NONE GIVEN
       2245    D073 BD A5 A5                JSR     LA5A5                                 SET DEVICE NUMBER; CHECK VALIDITY
       2246    D076 BD A4 06                JSR     LA406                                 MAKE SURE SELECTED FILE IS AN OUTPUT FILE
       2247    D079 9D A5                   JSR     GETCCH                                GET CURRENT INPUT CHARACTER
       2248    D07B 10 27 E8 D9             LBEQ LB958                                    PRINT CR TO CONSOLE OUT IF END OF LINE
       2249    D07F BD B2 6D       LD07F    JSR     SYNCOMMA                              SYNTAX CHECK FOR COMMA
       2250    D082 BD B1 56       LD082    JSR     LB156                                 EVALUATE EXPRESSION
       2251    D085 96 06                   LDA     VALTYP                                GET VARIABLE TYPE
       2252    D087 26 1E                   BNE     LD0A7                                 BRANCH IF STRING
       2253    D089 BD BD D9                JSR     LBDD9                                 CONVERT FP NUMBER TO ASCII STRING
       2254    D08C BD B5 16                JSR     LB516                                 PUT ON TEMPORARY STRING STACK
       2255    D08F BD B9 9F                JSR     LB99F                                 PRINT STRING TO CONSOLE OUT
       2256
       2257                        * PRINT ITEM SEPARATOR TO CONSOLE OUT
       2258    D092 9D A5          LD092    JSR     GETCCH                                GET CURRENT CHARACTER
       2259    D094 10 27 E8 C0             LBEQ LB958                                    PUT CR TO CONSOLE OUT IF END OF LINE
       2260    D098 86 2C                   LDA     #','                                  COMMA: NON-CASSETTE SEPARATOR
       2261    D09A BD A3 5F                JSR     LA35F                                 SET PRINT PARAMETERS
       2262    D09D 0D 6E                   TST     PRTDEV                                * GET CONSOLE PRINT DEVICE AND
       2263    D09F 27 02                   BEQ     LD0A3                                 * BRANCH IF NOT CASSETTE
       2264    D0A1 86 0D                   LDA     #CR                                   GET CARRIAGE RETURN - CASSETTE ITEM SEPARATOR
       2265    D0A3 8D 14          LD0A3    BSR     LD0B9                                 SEND SEPARATOR TO CONSOLE OUT
       2266    D0A5 20 D8                   BRA     LD07F                                 GET NEXT ITEM
       2267
       2268                        * PRINT A STRING TO CONSOLE OUT
       2269    D0A7 8D 07          LD0A7    BSR     LD0B0                                 PRINT LEADING STRING DELIMITER (")
       2270    D0A9 BD B9 9F                JSR     LB99F                                 PRINT STRING TO CONSOLE OUT
       2271    D0AC 8D 02                   BSR     LD0B0                                 PRINT ENDING STRING DELIMITER (")
       2272    D0AE 20 E2                   BRA     LD092                                 GO PRINT SEPARATOR
       2273
       2274                        * PRINT STRING DELIMITER (") TO CONSOLE OUT
       2275    D0B0 BD A3 5F       LD0B0    JSR     LA35F                                 SET PRINT PARAMETERS
       2276    D0B3 0D 6E                   TST     PRTDEV                                * GET CONSOLE PRINT DEVICE AND
       2277    D0B5 26 B7                   BNE     LD06E                                 * RETURN IF CASSETTE
       2278    D0B7 86 22                   LDA     #'"'                                  QUOTE: NON-CASSETTE STRING DELIMITER
       2279    D0B9 7E A2 82       LD0B9    JMP     LA282                                 SEND TO CONSOLE OUT
       2280
       2281                        * FIELD COMMAND
       2282    D0BC BD C8 2E       FIELD    JSR     LC82E                                 EVALUATE DEVICE NUMBER & VERIFY RANDOM FILE OPEN
       2283    D0BF 4F                      CLRA                                          *
       2284    D0C0 5F                      CLRB                                          * CLEAR TOTAL FIELD LENGTH COUNTER
       2285    D0C1 34 16                   PSHS X,B,A                                    SAVE FCB POINTER & INITIALIZE TOTAL FIELD LENGTH TO ZERO
       2286    D0C3 9D A5          LD0C3    JSR     GETCCH                                GET CURRENT INPUT CHARACTER
       2287    D0C5 26 02                   BNE     LD0C9                                 BRANCH IF NOT END OF LINE
       2288    D0C7 35 96                   PULS A,B,X,PC                                 CLEAN UP STACK AND RETURN
       2289    D0C9 BD B7 38       LD0C9    JSR     LB738                                 SYNTAX CHECK FOR COMMA, EVALUATE EXPRESSION
       2290    D0CC 34 14                   PSHS X,B                                      SAVE FIELD LENGTH (ACCB) ON STACK, X IS A DUMMY WHICH WILL
       2291                                                                               RESERVE 2 BYTES FOR THE ADDRESS WHICH WILL BE CALCULATED BELOW
       2292                        * AT THIS POINT THE STACK WILL HAVE THE FOLLOWING INFORMATION ON IT:
       2293                        * ,S = FIELD LENGTH   1 2,S = RANDOM FILE BUFFER ADDRESS
       2294                        * 3 4,S = TOTAL FIELD LENGTH  5 6,S = FCD POINTER
       2295    D0CE 4F                      CLRA                                          CLEAR MS BYTE
       2296    D0CF E3 63                   ADDD $03,S                                    ADD FIELD LENGTH TO TOTAL FIELD LENGTH COUNTER
       2297    D0D1 25 07                   BLO     LD0DA                                 'FO' ERROR IF SUM > $FFFF
       2298    D0D3 AE 65                   LDX     $05,S                                 POINT X TO FCB
       2299    D0D5 10 A3 09                CMPD FCBRLN,X                                 * COMPARE TO RECORD LENGTH & BRANCH IF
       2300    D0D8 23 05                   BLS     LD0DF                                 *TOTAL FIELD LENGTH < RECORD LENGTH
       2301    D0DA C6 44          LD0DA    LDB     #34*2                                 'FIELD OVERFLOW' ERROR
       2302    D0DC 7E AC 46                JMP     LAC46                                 JUMP TO ERROR DRIVER
       2303    D0DF EE 63          LD0DF    LDU     $03,S                                 LOAD U WITH OLD TOTAL LENGTH OF ALL FIELDS
       2304    D0E1 ED 63                   STD     $03,S                                 SAVE NEW TOTAL FIELD LENGTH
       2305    D0E3 EC 0B                   LDD      FCBBUF,X                         POINT ACCD TO START OF RANDOM FILE BUFFER
       2306    D0E5 33 CB                   LEAU D,U                                  *POINT U TO THIS FIELD'S SLOT IN THE RANDOM
       2307    D0E7 EF 61                   STU      $01,S                            *FILE BUFFER AND SAVE IT ON THE STACK
       2308    D0E9 C6 FF                   LDB      #$FF                             SECONDARY TOKEN
       2309    D0EB BD B2 6F                JSR      LB26F                            SYNTAX CHECK FOR SECONDARY TOKEN
       2310    D0EE C6 A7                   LDB      #$A7                             'AS' TOKEN
       2311    D0F0 BD B2 6F                JSR      LB26F                            SYNTAX CHECK FOR 'AS' TOKEN
       2312    D0F3 BD B3 57                JSR      LB357                            EVALUATE VARIABLE
       2313    D0F6 BD B1 46                JSR      LB146                            'TM' ERROR IF NUMERIC VARIABLE
       2314    D0F9 35 44                   PULS B,U                                  * PULL STRING ADDRESS AND LENGTH
       2315    D0FB E7 84                   STB      ,X                               * OFF OF THE STACK AND SAVE THEM
       2316    D0FD EF 02                   STU      $02,X                            * IN STRING DESCRIPTOR
       2317    D0FF 20 C2                   BRA      LD0C3                            CHECK FOR ANOTHER FIELD SPECIFICATION
       2318
       2319                        * RSET COMMAND
       2320    D101 86             RSET     LDA      #$4F                             SKIP ONE BYTE
       2321
       2322                        * LSET COMMAND
       2323    D102 4F             LSET     CLRA                                      LSET FLAG = 0
       2324    D103 34 02                   PSHS A                                    SAVE RSET($4F),LSET(00) FLAG ON THE STACK
       2325    D105 BD B3 57                JSR      LB357                            EVALUATE FIELD STRING VARIABLE
       2326    D108 BD B1 46                JSR      LB146                            'TM' ERROR IF NUMERIC VARIABLE
       2327    D10B 34 10                   PSHS X                                    SAVE STRING DESCRIPTOR ON STACK
       2328    D10D AE 02                   LDX      $02,X                            POINT X TO ADDRESS OF STRING
       2329    D10F 8C 09 89                CMPX #DFLBUF                              * COMPARE STRING ADDRESS TO START OF RANDOM
       2330    D112 25 05                   BLO      LD119                            * FILE BUFFER; 'SE' ERROR IF < RANDOM FILE BUFFER
       2331    D114 BC 09 4A                CMPX FCBADR                               = COMPARE STRING ADDRESS TO TOP OF RANDOM FILE BUFFER
       2332    D117 25 05                   BLO      LD11E                            = AREA - BRANCH IF STRING IN RANDOM FILE BUFFER
       2333    D119 C6 46          LD119    LDB      #2*35                            'SET TO NON-FIELDED STRING' ERROR
       2334    D11B 7E AC 46                JMP      LAC46                            JUMP TO ERROR HANDLER
       2335    D11E C6 B3          LD11E    LDB      #$B3                             *
       2336    D120 BD B2 6F                JSR      LB26F                            * SYNTAX CHECK FOR '=' TOKEN
       2337    D123 BD 87 48                JSR      L8748                            =EVALUATE DATA STRING EXPRESSION; RETURN WITH X
       2338                        *                                                  =POINTING TO STRING; ACCB = LENGTH
       2339    D126 35 20                   PULS Y                                    POINT Y TO FIELD STRING DESCRIPTOR
       2340    D128 A6 A4                   LDA      ,Y                               GET LENGTH OF FIELD STRING
       2341    D12A 27 2E                   BEQ      LD15A                            RETURN IF NULL STRING
       2342    D12C 34 04                   PSHS B                                    SAVE LENGTH OF DATA STRING ON STACK
       2343    D12E C6 20                   LDB      #SPACE                           PREPARE TO FILL DATA STRING WITH BLANKS
       2344    D130 EE 22                   LDU      $02,Y                            POINT U TO FIELD STRING ADDRESS
       2345                        * FILL THE FIELDED STRING WITH BLANKS
       2346    D132 E7 C0          LD132    STB      ,U+                              STORE A SPACE IN FIELDED STRING
       2347    D134 4A                      DECA                                      DECREMENT LENGTH COUNTER
       2348    D135 26 FB                   BNE      LD132                            KEEP FILLING W/SPACES IF NOT DONE
       2349    D137 E6 E0                   LDB      ,S+                              *GET THE LENGTH OF THE DATA STRING AND
       2350    D139 27 1F                   BEQ      LD15A                            *RETURN IF IT IS NULL (ZERO)
       2351    D13B E1 A4                   CMPB ,Y                                   =COMPARE LENGTH OF DATA STRING TO LENGTH OF FIELD
       2352    D13D 25 04                   BLO      LD143                            =STRING, BRANCH IF FIELD STRING > DATA STRING
       2353    D13F E6 A4                   LDB      ,Y                               *GET THE LENGTH OF THE FIELD STRING AND FORCE THE
       2354    D141 6F E4                   CLR      ,S                               *RSET/LSET FLAG TO LSET (0) IF DATA STRING LENGTH IS
       2355                        *                                                  *>= THE FIELD STRING LENGTH. THIS WILL CAUSE THE RIGHT
       2356                        *                                                  *SIDE OF THE DATA STRING TO BE TRUNCATED
       2357    D143 EE 22          LD143    LDU      $02,Y                            LOAD U WITH THE ADDRESS OF THE FIELD STRING
       2358    D145 6D E0                   TST      ,S+                              * GET THE RSET/LSET FLAG FROM THE STACK
       2359    D147 27 0E                   BEQ      LD157                            * AND BRANCH IF LSET
       2360                        * RSET ROUTINE
       2361    D149 34 04                   PSHS B                                    SAVE THE NUMBER OF BYTES TO MOVE INTO THE FIELD STRING
       2362    D14B 4F                      CLRA                                      = TAKE THE 2'S COMPLEMENT OF AN UNSIGNED
       2363    D14C 50                      NEGB                                      = NUMBER IN ACCB - LEAVE THE DOUBLE BYTE SIGNED
       2364    D14D 82 00                   SBCA #$00                                 = RESULT IN ACCD
       2365    D14F EB A4                   ADDB ,Y                                   * ADD THE LENGTH OF THE FIELD STRING TO THE INVERSE
       2366    D151 89 00                   ADCA #$00                                 * OF THE NUMBER OF BYTES TO BE MOVED
       2367    D153 33 CB                   LEAU D,U                                  =ADD RESULT TO START OF FIELD STRING. NOW U
       2368                        *                                                  =WILL POINT TO (-NUMBER OF BYTES TO MOVE)
       2369                        *                                                  =FROM THE RIGHT SIDE OF THE FIELD STRING
       2370    D155 35 04                   PULS B                                    GET THE NUMBER OF BYTES TO MOVE
       2371    D157 7E A5 9A       LD157    JMP      LA59A                            MOVE ACCB BYTES FROM X TO U (DATA TO FIELD STRING)
       2372    D15A 35 82          LD15A    PULS A,PC                                 PULL LSET/RSET FLAG OFF OF STACK AND RETURN
       2373
       2374                        * FILES COMMAND
       2375    D15C BD 95 AC       FILES    JSR      L95AC                            RESET SAM DISPLAY PAGE AND VDG MODE
       2376    D15F FC 09 4A                LDD      FCBADR                           GET START OF FILE BUFFERS
       2377    D162 83 09 89                SUBD #DFLBUF                              SUBTRACT THE START OF RANDOM FILE BUFFER SPACE
       2378    D165 34 06                   PSHS B,A                                  SAVE DEFAULT VALUE OF RANDOM FILE BUFFER SPACE ON STACK
       2379    D167 F6 09 5B                LDB      FCBACT                           * GET CURRENT NUMBER OF FCBS
       2380    D16A 34 04                   PSHS B                                    * AND SAVE ON THE STACK (DEFAULT VALUE)
       2381    D16C 9D A5                   JSR      GETCCH                           GET CURRENT INPUT CHAR
       2382    D16E 81 2C                   CMPA #','                                 CHECK FOR COMMA
       2383    D170 27 0F                   BEQ      LD181                            BRANCH IF COMMA - NO BUFFER NUMBER PARAMETER GIVEN
       2384    D172 BD B7 0B                JSR      EVALEXPB                         EVALUATE EXPRESSION (BUFFER NUMBER)
       2385    D175 C1 0F                   CMPB #15                                  15 FCBS MAX
       2386    D177 10 22 E2 CF             LBHI LB44A                                BRANCH IF > 15 - 'ILLEGAL FUNCTION CALL'
       2387    D17B E7 E4                   STB      ,S                               SAVE NUMBER OF FCBS ON STACK
       2388    D17D 9D A5                   JSR      GETCCH                           CHECK CURRENT INPUT CHAR
       2389    D17F 27 08                   BEQ      LD189                            BRANCH IF END OF LINE
       2390    D181 BD B2 6D       LD181    JSR      SYNCOMMA                         SYNTAX CHECK FOR COMMA
       2391    D184 BD B3 E6                JSR      LB3E6                            EVALUATE EXPRESSION, RETURN VALUE IN ACCD
       2392    D187 ED 61                   STD      $01,S                            SAVE RANDOM FILE BUFFER SIZE ON STACK
       2393    D189 BD CA E9       LD189    JSR      DVEC7                            CLOSE FILES
       2394    D18C E6 E4                   LDB      ,S                               * GET THE NUMBER OF BUFFERS TO MAKE AND
       2395    D18E 34 04                   PSHS B                                    * INITIALIZE A BUFFER COUNTER ON THE STACK
       2396    D190 CC 09 89                LDD      #DFLBUF                          GET START OF RANDOM FILE BUFFERS
       2397    D193 E3 62                   ADDD $02,S                                ADD THE NEWLY SPECIFIED RANDOM FILE BUFFER SPACE
       2398    D195 25 71                   BLO      LD208                            'OUT OF MEMORY' ERROR IF > $FFFF
       2399    D197 ED 62                   STD      $02,S                            SAVE START OF FCBS
       2400                        * RESERVE SPACE FOR FCBS
       2401    D199 C3 01 19       LD199     ADDD #FCBLEN                             FCBLEN REQUIRED FOR EACH BUFFER
       2402    D19C 25 6A                    BLO     LD208                            'OUT OF MEMORY' ERROR IF > $FFFF
       2403    D19E 6A E4                    DEC     ,S                               DECREMENT BUFFER COUNTER
       2404    D1A0 2A F7                    BPL     LD199                            *BRANCH IF NOT DONE - THE BPL WILL SET UP ONE MORE BUFFER
       2405                        *                                                  *THAN THE NUMBER REQUESTED. THIS EXTRA BUFFER IS THE SYSTEM BUFFER
       2406                        *                                                  *AND IS LOCATED AT THE END OF THE NORMAL FCBS. ONLY SYSTEM ROUTINES
       2407                        *                                                  *(COPY, BACKUP, MERGE ETC.) MAY ACCESS THIS BUFFER.
       2408    D1A2 5D                       TSTB                                     AT AN EXACT 256 BYTE BOUNDARY?
       2409    D1A3 27 03                    BEQ     LD1A8                            YES
       2410    D1A5 4C                       INCA                                     NO - ADD 256
       2411    D1A6 27 60                    BEQ     LD208                            'OUT OF MEMORY' ERROR IF PAST $FFFF
       2412    D1A8 85 01          LD1A8     BITA #$01                                ON A 512 BYTE BOUNDARY?
       2413    D1AA 27 03                    BEQ     LD1AF                            YES
       2414    D1AC 4C                       INCA                                     NO - ADD 256
       2415    D1AD 27 59                    BEQ     LD208                            'OM' ERROR IF PAST $FFFF
       2416    D1AF A7 E4          LD1AF     STA     ,S                               SAVE MS BYTE OF NEW GRAPHIC RAM START
       2417    D1B1 DC 1B                    LDD     VARTAB                           GET START OF VARIABLES
       2418    D1B3 90 BC                    SUBA GRPRAM                              *SUBTRACT THE OLD GRAPHIC RAM START - ACCD CONTAINS LENGTH
       2419                        *                                                  *OF PROGRAM PLUS RESERVED GRAPHIC RAM
       2420    D1B5 AB E4                    ADDA ,S                                  ADD IN THE AMOUNT OF RAM CALCULATED ABOVE
       2421    D1B7 25 4F                    BLO     LD208                            'OUT OF MEMORY' ERROR IF > $FFFF
       2422    D1B9 1F 01                    TFR     D,X                              SAVE NEW VARTAB IN X
       2423    D1BB 4C                       INCA                                     *ADD 256 - TO GUARANTEE ENOUGH ROOM SINCE ALL CALCULATIONS USE
       2424                        *                                                  *ONLY THE MSB OF THE ADDRESS
       2425    D1BC 27 4A                    BEQ     LD208                            'OUT OF MEMORY' ERROR IF PAST $FFFF
       2426    D1BE 10 93 21                 CMPD FRETOP                              IS IT GREATER THAN THE START OF STRING SPACE
       2427    D1C1 24 45                    BHS     LD208                            'OUT OF MEMORY' IF > START OF STRING SPACE
       2428    D1C3 4A                       DECA                                     SUBTRACT 256 - COMPENSATE FOR INCA ABOVE
       2429    D1C4 93 1B                    SUBD VARTAB                              SUBTRACT START OF VARIABLES
       2430    D1C6 D3 19                    ADDD TXTTAB                              ADD START OF BASIC
       2431    D1C8 1F 02                    TFR     D,Y                              Y HAS NEW START OF BASIC
       2432    D1CA A6 E4                    LDA     ,S                               * GET THE GRAPHIC RAM START, SUBTRACT
       2433    D1CC 90 BC                    SUBA GRPRAM                              * THE OLD GRAPHIC RAN START AND SAVE
       2434    D1CE 1F 89                    TFR     A,B                              * THE DIFFERENCE IN ACCA AND ACCB
       2435    D1D0 9B BA                    ADDA BEGGRP                              = ADD THE OLD GRAPHIC PAGE START AND
       2436    D1D2 97 BA                    STA     BEGGRP                           = STORE THE NEW START OF GRAPHICS RAM
       2437    D1D4 DB B7                    ADDB ENDGRP                              * ADD THE OLD GRAPHIC RAM END ADDRESS AND
       2438    D1D6 D7 B7                    STB     ENDGRP                           * STORE THE NEW END OF GRAPHICS RAM
       2439    D1D8 35 46                    PULS A,B,U                               = ACCA=MSB OF START OF GRAPHIC RAM; ACCB=NUMBER OF FILE BUFFERS
       2440                        *                                                  = U=START OF FILE BUFFERS
       2441    D1DA 97 BC                    STA     GRPRAM                           SAVE NEW START OF GRAPHIC RAM
       2442    D1DC F7 09 5B                 STB     FCBACT                           NUMBER OF FILE BUFFERS
       2443    D1DF FF 09 4A                 STU     FCBADR                           START OF FILE BUFFERS
       2444    D1E2 96 68                    LDA     CURLIN                           GET CURRENT LINE NUMBER
       2445    D1E4 4C                       INCA                                     ARE WE IN DIRECT MODE?
       2446    D1E5 27 08                    BEQ     LD1EF                            YES - MOVE BASIC PROGRAM
       2447    D1E7 1F 20                    TFR     Y,D                              MOVE NEW START OF BASIC TO ACCD
       2448    D1E9 93 19                    SUBD TXTTAB                              SUBTRACT OLD START OF BASIC
       2449    D1EB D3 A6                    ADDD CHARAD                              ADD OLD INPUT POINTER
       2450    D1ED DD A6                    STD     CHARAD                           SAVE NEW INPUT POINTER
       2451    D1EF DE 1B          LD1EF     LDU     VARTAB                           POINT U TO OLD START OF VARIABLES
       2452    D1F1 9F 1B                    STX     VARTAB                           SAVE NEW START OF VARIBLES
       2453    D1F3 11 93 1B                 CMPU VARTAB                              * COMPARE OLD START OF VARIABLES TO NEW START OF
       2454    D1F6 22 13                    BHI     LD20B                            * VARIABLES & BRANCH IF OLD > NEW
       2455                        * MOVE BASIC PROGRAM IF OLD START ADDRESS <= NEW START ADDRESS
       2456    D1F8 A6 C2          LD1F8     LDA     ,-U                              GET A BYTE
       2457    D1FA A7 82                    STA     ,-X                              MOVE lT
       2458    D1FC 11 93 19                 CMPU TXTTAB                              AT START OF BASIC PROGRAM?
       2459    D1FF 26 F7                    BNE     LD1F8                            NO
       2460    D201 10 9F 19                 STY     TXTTAB                           STORE NEW START OF BASIC PROGRAM
       2461    D204 6F 3F                    CLR     -1,Y                             RESET START OF PROGRAM FLAG
       2462    D206 20 13                    BRA     LD21B                            CLOSE ALL FILES
       2463    D208 7E AC 44       LD208     JMP     LAC44                            'OUT OF MEMORY' ERROR
       2464                        * MOVE BASIC PROGRAM IF OLD START ADDRESS > NEW START ADDRESS
       2465    D20B DE 19          LD20B     LDU     TXTTAB                           POINT U TO OLD START OF BASIC
       2466    D20D 10 9F 19                 STY     TXTTAB                           SAVE NEW START OF BASIC
       2467    D210 6F 3F                    CLR     -1,Y                             RESET START OF BASIC FLAG
       2468    D212 A6 C0          LD212     LDA     ,U+                              GET A BYTE
       2469    D214 A7 A0                    STA     ,Y+                              MOVE IT
       2470    D216 10 9C 1B                 CMPY VARTAB                              AT START OF VARIABLES
       2471    D219 26 F7                    BNE     LD212                            NO - MOVE ANOTHER BYTE
       2472
       2473                        * CLOSE ALL FCBS AND RECALCULATE FCB START ADDRESSES
       2474    D21B CE 09 28       LD21B     LDU     #FCBV1                           POINT U TO FILE BUFFER POINTERS
       2475    D21E BE 09 4A                 LDX     FCBADR                           POINT X TO START OF BUFFERS
       2476    D221 5F                       CLRB                                     RESET FILE COUNTER
       2477    D222 AF C1          LD222     STX     ,U++                             STORE FILE ADDRESS IN VECTOR TABLE
       2478    D224 6F 00                    CLR     FCBTYP,X                         RESET FILE TYPE TO CLOSED
       2479    D226 30 89 01 19              LEAX FCBLEN,X                            GO TO NEXT FCB
       2480    D22A 5C                       INCB                                     INCREMENT FILE COUNTER
       2481    D22B F1 09 5B                 CMPB FCBACT                              CLOSE ALL ACTIVE BUFFERS AND SYSTEM FCB
       2482    D22E 23 F2                    BLS     LD222                            BRANCH IF NOT DONE
       2483    D230 7E 96 CB                 JMP     L96CB                            READJUST LINE NUMBERS, ETC.
       2484
       2485                        * UNLOAD COMMAND
       2486    D233 8D 1A          UNLOAD    BSR     LD24F                            GET DRIVE NUMBER
       2487    D235 5F                       CLRB                                     CLEAR FILE COUNTER
       2488    D236 5C             LD236     INCB                                     INCREMENT FILE COUNTER
       2489    D237 BD C7 49                 JSR     LC749                            POINT X TO FCB
       2490    D23A 27 0D                    BEQ     LD249                            BRANCH IF FILE NOT OPEN
       2491    D23C A6 01                    LDA     FCBDRV,X                         CHECK DRIVE NUMBER
       2492    D23E 91 EB                    CMPA DCDRV                               DOES IT MATCH THE 'UNLOAD' DRIVE NUMBER?
       2493    D240 26 07                    BNE     LD249                            NO MATCH - DO NOT CLOSE THE FILE
       2494    D242 34 04                    PSHS B                                   SAVE FILE COUNTER ON THE STACK
       2495    D244 BD CB 06                 JSR     LCB06                            CLOSE FCB
       2496    D247 35 04                    PULS B                                   RESTORE FILE COUNTER
       2497    D249 F1 09 5B       LD249     CMPB FCBACT                                 CHECKED ALL FILES?
       2498    D24C 23 E8                    BLS     LD236                               NO
       2499    D24E 39                       RTS
       2500                        * GET DRIVE NUMBER FROM BASIC - USE THE DEFAULT DRIVE IF NONE GIVEN
       2501    D24F F6 09 5A       LD24F     LDB     DEFDRV                              GET DEFAULT DRIVE NUMBER
       2502    D252 9D A5                    JSR     GETCCH                              GET NEXT INPUT CHAR
       2503    D254 27 09                    BEQ     LD25F                               USE DEFAULT DRIVE NUMBER IF NONE GIVEN
       2504    D256 BD B7 0B       LD256     JSR     EVALEXPB                            EVALUATE EXPRESSION
       2505    D259 C1 03                    CMPB #$03                                   4 DRIVES MAX
       2506    D25B 10 22 D3 C0              LBHI LA61F                                  'DEVICE NUMBER ERROR' IF > 3
       2507    D25F D7 EB          LD25F     STB     DCDRV                               STORE IN DSKCON VARIABLE
       2508    D261 39                       RTS
       2509
       2510                        * BACKUP COMMAND
       2511    D262 10 27 D3 B9    BACKUP    LBEQ LA61F                                  DEVICE NUMBER ERROR IF NO DRIVE NUMBERS GIVEN
       2512    D266 BD 95 AC                 JSR     L95AC                               RESET SAM DISPLAY PAGE AND VOG MODE
       2513 > D269 BD D2 56                  JSR     LD256                               * GET SOURCE DRIVE NUMBER AND SAVE
       2514    D26C F7 06 FF                 STB     DBUF0+255                           * IT AT TOP OF DBUF0 (TOP OF NEW STACK)
       2515    D26F 9D A5                    JSR     GETCCH                              GET A CHARACTER FROM BASIC
       2516    D271 27 08                    BEQ     LD27B                               BRANCH IF END OF LINE
       2517    D273 C6 A5                    LDB     #$A5                                TOKEN FOR 'TO'
       2518    D275 BD B2 6F                 JSR     LB26F                               SYNTAX CHECK FOR 'TO'
       2519 > D278 BD D2 56                  JSR     LD256                               GET DESTINATION DRIVE NUMBER
       2520    D27B 10 CE 06 FF    LD27B     LDS     #DBUF0+255                          PUT STACK AT TOP OF DBUF0
       2521    D27F 34 04                    PSHS B                                      SAVE DESTINATION DRIVE NUMBER ON STACK
       2522    D281 BD A5 C7                 JSR     LA5C7                               SYNTAX ERROR IF NOT END OF LINE
       2523    D284 BD CA E9                 JSR     DVEC7                               CLOSE ALL FILES
       2524    D287 6F E2                    CLR     ,-S                                 CLEAR A TRACK COUNTER ON STACK
       2525    D289 8E 09 88                 LDX     #DFLBUF-1                           POINT X TO TOP OF DISK RAM VARIABLES
       2526    D28C 6C E4          LD28C     INC     ,S                                  INCREMENT TRACK COUNTER
       2527    D28E 30 89 12 00              LEAX SECMAX*SECLEN,X                        INCREMENT X BY ONE TRACK
       2528    D292 9C 27                    CMPX MEMSIZ                                 COMPARE TO TOP OF NON RESERVED RAN
       2529    D294 23 F6                    BLS     LD28C                               KEEP GOING IF MORE FREE RAM LEFT
       2530    D296 6A E4                    DEC     ,S                                  DECREMENT TRACK COUNTER
       2531    D298 10 27 D9 A8              LBEQ LAC44                                  'OM' ERROR IF < 1 TRACK OF FREE RAM
       2532    D29C 86 23                    LDA     #TRKMAX                             GET MAXIMUM NUMBER OF TRACKS - INITIALIZE REMAINING TRACKS CTR
       2533    D29E 5F                       CLRB                                        INITIALIZE TRACKS WRITTEN COUNTER TO ZERO
       2534    D29F 34 06                    PSHS B,A                                    SAVE TRACKS WRITTEN AND REMAINING COUNTERS ON STACK
       2535
       2536                        * AT THIS POINT THE STACK HAS THE FOLLOWING DATA ON IT:
       2537                        * ,S = TRACKS REMAINING COUNTER; 1,S = TRACKS WRITTEN COUNTER
       2538                        * 2,S = NUMBER OF TRACKS WHICH FIT IN RAM; 3,S = DESTINATION DRIVE NUMBER
       2539                        * 4,S = SOURCE DRIVE NUMBER
       2540    D2A1 73 09 5C                 COM     DRESFL                              SET THE DISK RESET FLAG TO CAUSE A RESET
       2541    D2A4 5F             LD2A4     CLRB                                        INITIALIZE WRITE TRACK COUNTER TO ZERO
       2542    D2A5 5C             LD2A5     INCB                                        ADD ONE TO WRITE TRACK COUNTER
       2543    D2A6 6A E4                    DEC     ,S                                  * DECREMENT REMAINING TRACKS COUNTER
       2544    D2A8 27 04                    BEQ     LD2AE                               * AND BRANCH IF NO TRACKS LEFT
       2545    D2AA E1 62                    CMPB $02,S                                  = COMPARE WRITE TRACK COUNTER TO NUMBER OF TRACKS THAT
       2546    D2AC 26 F7                    BNE     LD2A5                               = WILL FIT IN RAM AND BRANCH IF ROOM FOR MORE TRACKS IN RAM
       2547    D2AE D7 03          LD2AE     STB     TMPLOC                              SAVE THE NUMBER OF TRACKS TO BE TRANSFERRED
       2548    D2B0 E6 64                    LDB     $04,S                               GET SOURCE DRIVE NUMBER
       2549    D2B2 8D 48                    BSR     LD2FC                               FILL RAM BUFFER WITH TMPLOC TRACKS OF DATA
       2550    D2B4 86 FF                    LDA     #$FF                                SET SOURCE/DESTINATION FLAG TO DESTINATION
       2551 > D2B6 BD D3 22                  JSR     LD322                               PRINT PROMPT MESSAGE IF NEEDED
       2552    D2B9 E6 63                    LDB     $03,S                               GET DESTINATION DRIVE NUMBER
       2553    D2BB 8D 42                    BSR     LD2FF                               WRITE TMPLOC TRACKS FROM BUFFER
       2554    D2BD 6D E4                    TST     ,S                                  TEST TRACKS REMAINING FLAG
       2555    D2BF 27 0C                    BEQ     LD2CD                               BRANCH IF BACKUP DONE
       2556    D2C1 4F                       CLRA                                        SET SOURCE/DESTINATION FLAG TO SOURCE
       2557 > D2C2 BD D3 22                  JSR     LD322                               PRINT PROMPT MESSAGE IF NEEDED
       2558    D2C5 E6 61                    LDB     $01,S                               * GET THE TRACKS WRITTEN COUNTER, ADD THE NUMBER OF
       2559    D2C7 DB 03                    ADDB TMPLOC                                 * TRACKS MOVED THIS TIME THROUGH LOOP AND
       2560    D2C9 E7 61                    STB     $01,S                               * SAVE THE NEW TRACKS WRITTEN COUNTER
       2561    D2CB 20 D7                    BRA     LD2A4                               COPY SOME MORE TRACKS
       2562
       2563    D2CD 8D 03          LD2CD     BSR     LD2D2                               CHECK FOR DOS INITIALIZATION
       2564    D2CF 7E AC 73                 JMP     LAC73                               JUMP BACK TO BASIC'S MAIN LOOP
       2565
       2566    D2D2 35 40          LD2D2     PULS U                                      PUT THE RETURN ADDRESS IN U
       2567    D2D4 B6 09 5C                 LDA     DRESFL                              TEST DISK RESET FLAG
       2568    D2D7 27 16                    BEQ     LD2EF                               DON'T RESET THE DOS IF FLAG NOT SET
       2569    D2D9 8E 09 28                 LDX     #FCBV1                              POINT X TO TABLE OF FCB ADDRESSES
       2570    D2DC 4F                       CLRA                                        SET FILE COUNTER TO ZERO
       2571    D2DD 6F 91          LD2DD     CLR     [,X++]                              MARK FCB AS CLOSED
       2572    D2DF 4C                       INCA                                        ADD ONE TO FILE COUNTER
       2573    D2E0 B1 09 5B                 CMPA FCBACT                                 COMPARE TO NUMBER OF RESERVED FILES
       2574    D2E3 23 F8                    BLS     LD2DD                               BRANCH IF ANY FILES NOT SHUT DOWN
       2575    D2E5 9E 19                    LDX     TXTTAB                              LOAD X WITH THE START OF BASIC
       2576    D2E7 6F 1F                    CLR     -1,X                                SET FIRST BYTE OF BASIC PROGRAM TO ZERO
       2577    D2E9 BD AD 19                 JSR     LAD19                               GO DO A 'NEW'
       2578    D2EC 7F 09 5C                 CLR     DRESFL                              RESET THE DOS RESET FLAG
       2579    D2EF B6 09 5D       LD2EF     LDA     DLODFL                              * CHECK THE LOAD RESET FLAG AND
       2580    D2F2 27 06                    BEQ     LD2FA                               * BRANCH IF NOT SET
       2581    D2F4 7F 09 5D                 CLR     DLODFL                              CLEAR THE LOAD RESET FLAG
       2582    D2F7 BD AD 19                 JSR     LAD19                               GO DO A 'NEW'
       2583    D2FA 6E C4          LD2FA     JMP     ,U                                  JUMP BACK TO RETURN ADDRESS SAVED IN U ABOVE
       2584
       2585    D2FC 86 02          LD2FC     LDA     #$02                                READ OP CODE
       2586    D2FE 8C                       CMPX #$8603                                 SKIP TWO BYTES
       2587    D2FF 86 03          LD2FF     LDA     #$03                                WRITE OP CODE
       2588    D301 DD EA                    STD     DCOPC                               SAVE IN DSKCON VARIABLE
       2589    D303 A6 63                    LDA     $03,S                               * GET THE NUMBER OF THE TRACK BEING CURRENTLY
       2590    D305 97 EC                    STA     DCTRK                               * WRITTEN AND SAVE IT IN DSKCON VARIABLE
       2591    D307 8E 09 89                 LDX     #DFLBUF                             = TRACK BUFFER STARTS AT DFLBUF
       2592    D30A 9F EE                    STX     DCBPT                               = SAVE IT IN DSKCON VARIABLE
       2593    D30C 96 03                          LDA     TMPLOC                                 GET NUMBER OF TRACKS TO MOVE
       2594    D30E C6 01                LD30E     LDB     #$01                                   INITIALIZE SECTOR COUNTER TO ONE
       2595    D310 D7 ED                LD310     STB     DSEC                                   SAVE DSKCON SECTOR VARIABLE
       2596    D312 BD D6 F2                       JSR     LD6F2                                  READ/WRITE A SECTOR
       2597    D315 0C EE                          INC     DCBPT                                  MOVE BUFFER POINTER UP ONE SECTOR (256 BYTES)
       2598    D317 5C                             INCB                                           INCREMENT SECTOR COUNTER
       2599    D318 C1 12                          CMPB #SECMAX                                   COMPARE TO MAXIMUM NUMBER OF SECTORS PER TRACK
       2600    D31A 23 F4                          BLS     LD310                                  BRANCH IF ANY SECTORS LEFT
       2601    D31C 0C EC                          INC     DCTRK                                  INCREMENT TRACK COUNTER VARIABLE TO NEXT TRACK
       2602    D31E 4A                             DECA                                           DECREMENT TRACKS TO MOVE COUNTER
       2603    D31F 26 ED                          BNE     LD30E                                  READ MORE TRACKS IF ANY LEFT
       2604    D321 39                             RTS
       2605
       2606    D322 E6 65                LD322     LDB     $05,S                                  * GET THE DESTINATlON DRIVE NUMBER AND
       2607    D324 E1 66                          CMPB $06,S                                     * COMPARE IT TO THE SOURCE DRIVE NUMBER
       2608
       2609                              * PRINT SOURCE/DESTINATION DISK SWITCH PROMPT MESSAGE
       2610    D326 26 36                LD326     BNE     LD35E                                  RETURN IF DRIVE NUMBERS NOT EQUAL
       2611    D328 7F 09 85                       CLR     RDYTMR                                 RESET THE READY TIMER
       2612    D32B 7F FF 40                       CLR     DSKREG                                 CLEAR DSKREG - TURN OFF ALL DISK MOTORS
       2613    D32E 7F 09 86                       CLR     DRGRAM                                 CLEAR DSKREG RAM IMAGE
       2614    D331 34 02                          PSHS A                                         SAVE SOURCE/DESTINATION FLAG ON STACK
       2615    D333 BD A9 28                       JSR     LA928                                  CLEAR SCREEN
       2616    D336 8E D3 5F                       LDX     #LD35F                                 POINT X TO 'INSERT SOURCE' MESSAGE
       2617    D339 C6 0D                          LDB     #13                                    13 BYTES IN MESSAGE
       2618    D33B A6 E0                          LDA     ,S+                                    GET SOURCE/DESTINATION FLAG FROM THE STACK
       2619    D33D 27 05                          BEQ     LD344                                  BRANCH IF SOURCE
       2620    D33F 8E D3 6C                       LDX     #LD36C                                 POINT X TO 'INSERT DESTINATION' MESSAGE
       2621    D342 C6 12                          LDB     #18                                    18 BYTES IN MESSAGE
       2622    D344 BD B9 A2             LD344     JSR     LB9A2                                  SEND MESSAGE TO CONSOLE OUT
       2623    D347 8E D3 7E                       LDX     #LD37E                                 POINT X TO 'DISKETTE AND' MESSAGE
       2624    D34A C6 1B                          LDB     #27                                    27 BYTES IN MESSAGE
       2625    D34C BD B9 A2                       JSR     LB9A2                                  SEND MESSAGE TO CONSOLE OUT
       2626    D34F CC 64 05                       LDD     #$6405                                 * SET UP 'SOUND' PARAMETERS
       2627    D352 97 8C                          STA     SNDTON                                 * FOR A BEEP
       2628    D354 BD A9 51                       JSR     LA951                                  JUMP TO 'SOUND' - DO A BEEP
       2629    D357 BD A1 71             LD357     JSR     LA171                                  GET A CHARACTER FROM CONSOLE IN
       2630    D35A 81 0D                          CMPA #CR                                       * KEEP LOOKING AT CONSOLE IN UNTIL
       2631    D35C 26 F9                          BNE     LD357                                  * YOU GET A CARRIAGE RETURN
       2632    D35E 39                   LD45E     RTS
       2633
       2634    D35F 49 4E 53 45 52 54 LD35F        FCC     'INSERT SOURCE'
       2635    D365 20 53 4F 55 52 43
       2636    D36B 45
       2637    D36C 49 4E 53 45 52 54 LD36C        FCC     'INSERT DESTINATION'
       2638    D372 20 44 45 53 54 49
       2639    D378 4E 41 54 49 4F 4E
       2640    D37E 20 44 49 53 4B 45 LD37E        FCC     ' DISKETTE AND'
       2641    D384 54 54 45 20 41 4E
       2642    D38A 44
       2643    D38B 0D                             FCB     CR
       2644    D38C 50 52 45 53 53 20              FCC     'PRESS 'ENTER''
       2645    D392 27 45 4E 54 45 52
       2646    D398 27
       2647
       2648                              * PUSH FILENAME.EXT AND DRIVE NUMBER ONTO THE STACK
       2649    D399 35 20                LD399     PULS Y                                         SAVE RETURN ADDRESS IN Y
       2650    D39B C6 0B                          LDB     #11                                    11 CHARACTERS IN FILENAME AND EXTENSION
       2651    D39D 8E 09 57                       LDX     #DNAMBF+11                             POINT X TO TOP OF DISK NAME/EXT BUFFER
       2652    D3A0 A6 82                LD3A0     LDA     ,-X                                    * GET A CHARACTER FROM FILENAME.
       2653    D3A2 34 02                          PSHS A                                         * EXT BUFFER AND PUSH IT ONTO THE
       2654    D3A4 5A                             DECB                                           * STACK - DECREMENT COUNTER AND
       2655    D3A5 26 F9                          BNE     LD3A0                                  * KEEP LOOPING UNTIL DONE
       2656    D3A7 96 EB                          LDA     DCDRV                                  = GET DRIVE NUMBER AND PUSH
       2657    D3A9 34 02                          PSHS A                                         = IT ONTO THE STACK
       2658    D3AB 6E A4                          JMP     ,Y                                     PSEUDO - RETURN TO CALLING ROUTINE
       2659
       2660                              * PULL FILENAME.EXT AND DRIVE NUMBER FROM (X) TO RAM
       2661    D3AD A6 80                LD3AD     LDA     ,X+                                    * GET DRIVE NUMBER AND SAVE
       2662    D3AF 97 EB                          STA     DCDRV                                  * IT IN DSKCON VARIABLE
       2663    D3B1 C6 0B                          LDB     #11                                    11 BYTES IN FILENAME AND EXTENSION
       2664    D3B3 CE 09 4C                       LDU     #DNAMBF                                POINT U TO DISK NAME BUFFER
       2665    D3B6 7E A5 9A                       JMP     LA59A                                  MOVE FILENANE.EXT FROM (X) TO DNAMBF
       2666
       2667                              * COPY
       2668                              * THE COPY PROCESS IS PERFORMED BY COPYING DATA FROM THE SOURCE FILE
       2669                              * TO RAM AND THEN COPYING IT TO THE DESTINATION FILE. THE SOURCE AND
       2670                              * DESTINATION FILES ARE OPENED AS RANDOM FILES AND BOTH USE THE SYSTEM
       2671                              * FCB ABOVE THE RESERVED FCBS. ALL OF AVAILABLE FREE RAM ABOVE THE
       2672                              * VARIABLES IS USED AS A COPY BUFFER WHICH SPEEDS UP THE COPYING PROCESS
       2673                              * BUT UNFORTUNATELY THE METHOD USED WILL ALLOW AN ERROR ENCOUNTERED DURING
       2674                              * THE COPY PROCESS TO 'HANG' THE SYSTEM. THIS IS CAUSED BY POINTING THE FCB'S
       2675                              * RANDOM FILE BUFFER POINTER (FCBBUF,X) TO THE FREE RAM BUFFER. AN ERROR
       2676                              * WILL THEN CAUSE THE OPEN FILE TO BE CLOSED WITH FCBBUF,X POINTING TO AN
       2677                              * AREA IN RAM WHERE THE RANDOM FILE BUFFER CLOSE ROUTINE (LCAE2) WILL NEVER
       2678                              * LOOK FOR IT
       2679    D3B9 BD C9 35             COPY      JSR     LC935                                  * GET SOURCE FILENAME.EXT & DRIVE NUMBER FROM BASIC
       2680    D3BC 8D DB                          BSR     LD399                                  * AND SAVE THEM ON THE STACK
       2681    D3BE 6F E2                          CLR     ,-S                                    CLEAR A BYTE ON STACK - SINGLE DISK COPY (SDC) FLAG
       2682    D3C0 9D A5                          JSR     GETCCH                                 GET CURRENT INPUT CHARACTER
       2683    D3C2 27 0A                          BEQ     LD3CE                                  BRANCH IF END OF LINE - SINGLE DISK COPY
       2684    D3C4 63 E4                          COM     ,S                                     SET SOC FLAG TO $FF (NO SINGLE DISK COPY)
       2685    D3C6 C6 A5                          LDB     #$A5                                   TOKEN FOR 'TO'
       2686    D3C8 BD B2 6F                       JSR     LB26F                                  SYNTAX CHECK FOR 'TO'
       2687    D3CB BD C9 35                       JSR     LC935                                  GET DESTINATION FILENAME.EXT AND DRIVE NUMBER
       2688    D3CE 8D C9                LD3CE     BSR     LD399                                  SAVE DESTINATION FILENAME.EXT & DRIVE NUMBER ON STACK
       2689    D3D0 BD A5 C7                JSR     LA5C7                             SYNTAX ERROR IF MORE CHARACTERS ON LINE
       2690    D3D3 BD CA E9                JSR     DVEC7                             CLOSE ALL FILES
       2691
       2692                        * COUNT THE NUMBER OF SECTORS WORTH OF FREE RAM AVAILABLE
       2693    D3D6 6F E2                   CLR     ,-S                               CLEAR A SECTOR COUNTER ON THE STACK
       2694    D3D8 30 E9 FF 00             LEAX -SECLEN,S                            POINT X ONE SECTOR LENGTH DOWN FROM THE TOP OF STACK
       2695    D3DC 6C E4          LD3DC    INC     ,S                                INCREMENT SECTOR COUNTER
       2696    D3DE 30 89 FF 00             LEAX -SECLEN,X                            DECREMENT X BY ONE SECTOR
       2697    D3E2 9C 1F                   CMPX ARYEND                               COMPARE TO TOP OF ARRAYS
       2698    D3E4 24 F6                   BHS     LD3DC                             BRANCH IF NOT AT BOTTOM OF FREE RAM
       2699    D3E6 6A E4                   DEC     ,S                                DECREMENT SECTOR COUNTER
       2700    D3E8 10 27 D8 58             LBEQ LAC44                                'OM' ERROR IF NOT AT LEAST ONE FULL SECTOR OF FREE RAM
       2701    D3EC 30 6E                   LEAX 14,S                                 POINT X TO START OF SOURCE DATA
       2702    D3EE 8D BD                   BSR     LD3AD                             PUT SOURCE DATA INTO DNAMBF AND DSKCON
       2703    D3F0 BD C6 8C                JSR     LC68C                             SCAN DIRECTORY FOR A MATCH
       2704    D3F3 BD C6 E5                JSR     LC6E5                             'NE' ERROR IF MATCH NOT FOUND
       2705    D3F6 BE 09 74                LDX     V974                              POINT X TO DIRECTORY RAM IMAGE OF FOUND FILE
       2706    D3F9 EE 0E                   LDU     DIRLST,X                          * GET NUMBER OF BYTES IN LAST SECTOR AND
       2707    D3FB AE 0B                   LDX     DIRTYP,X                          * SOURCE FILE TYPE AND ASCII FLAG
       2708    D3FD 34 50                   PSHS U,X                                  * AND SAVE THEM ON THE STACK
       2709    D3FF BD C7 9D                JSR     LC79D                             GET VALID FAT DATA
       2710    D402 F6 09 76                LDB     V976                              GET NUMBER OF FIRST GRANULE IN FILE
       2711    D405 BD CD 1E                JSR     LCD1E                             * GET THE NUMBER OF GRANULES IN FILE
       2712    D408 34 02                   PSHS A                                    * AND SAVE IT ON THE STACK
       2713    D40A 4A                      DECA                                      SUBTRACT OFF THE LAST GRANULE
       2714    D40B C4 3F                   ANDB #$3F                                 * MASK OFF LAST GRANULE FLAG BITS AND SAVE THE
       2715    D40D 34 04                   PSHS B                                    * NUMBER OF SECTORS IN LAST GRANULE ON STACK
       2716    D40F 1F 89                   TFR     A,B                               SAVE THE NUMBER OF GRANULES IN ACCB
       2717    D411 4F                      CLRA                                      CLEAR THE MS BYTE OF ACCD
       2718    D412 BD C7 79                JSR     LC779                             MULTIPLY ACCD BY NINE
       2719    D415 EB E4                   ADDB ,S                                   * ADD THE NUMBER OF SECTORS IN THE LAST
       2720    D417 89 00                   ADCA #$00                                 * GRANULE TO ACCD
       2721    D419 8E 00 01                LDX     #$0001                            INITIALIZE RECORD COUNTER TO ONE
       2722    D41C 34 16                   PSHS X,B,A                                INITIALIZE SECTOR AND RECORD COUNTERS ON THE STACK
       2723
       2724                        * AT THIS POINT THE CONTROL VARIABLES FOR COPY ARE STORED ON THE STACK.
       2725                        *   0 1,S = REMAINING SECTORS COUNTER; 2 3,S = RECORD COUNTER
       2726                        *     4,S = NUMBER OF SECTORS TO BE COPIED. INITIALLY SET TO NUMBER OF
       2727                        *           SECTORS IN THE LAST GRANULE.
       2728                        *     5,S = GRAN TEST FLAG. INITIALLY SET TO NUMBER OF GRANS IN FILE
       2729                        *     6,S = FILE TYPE; 7,S = ASCII FLAG; 8 9,S = NUMBER OF BYTES IN LAST SECTOR
       2730                        *    10,S = NUMBER OF SECTORS WHICH WILL FIT IN THE CURRENTLY AVAILABLE FREE RAM
       2731                        * 11-22,S = DESTINATION FILENAME.EXT AND DRIVE NUMBER
       2732                        *    23,S = SINGLE DISK COPY FLAG; 24-35,S = SOURCE FILENAME.EXT AND DRIVE NUMBER
       2733    D41E 5F             LD41E    CLRB                                      SET SECTOR COUNTER TO ZERO
       2734    D41F AE E4                   LDX     ,S                                GET THE NUMBER OF SECTORS REMAINING IN THE FILE
       2735    D421 27 09                   BEQ     LD42C                             BRANCH IF NO SECTORS LEFT
       2736    D423 5C             LD423    INCB                                      ADD A SECTOR TO TEMPORARY SECTOR COUNTER
       2737    D424 30 1F                   LEAX -1,X                                 DECREMENT REMAINING SECTORS COUNTER
       2738    D426 27 04                   BEQ     LD42C                             BRANCH IF NO SECTORS LEFT
       2739    D428 E1 6A                   CMPB 10,S                                 *COMPARE TEMPORARY COUNTER TO NUMBER OF SECTORS WHICH MAY
       2740                        *                                                  *BE STORED IN FREE RAM
       2741    D42A 26 F7                   BNE     LD423                             BRANCH IF STILL ROOM FOR MORE SECTORS
       2742    D42C AF E4          LD42C    STX     ,S                                SAVE THE NUMBER OF UNCOPIED SECTORS REMAINING IN THE FILE
       2743    D42E E7 64                   STB     $04,S                             SAVE THE NUMBER OF SECTORS TO BE COPIED THIS TIME THROUGH LOOP
       2744    D430 8D 50                   BSR     LD482                             'GET' ACCB SECTORS TO RAM BUFFER
       2745    D432 86 FF                   LDA     #$FF                              SET SOURCE/DESTINATION FLAG TO DESTINATION
       2746    D434 8D 40                   BSR     LD476                             PRINT PROMPT MESSAGE IF REQUIRED
       2747    D436 6D 65                   TST     $05,S                             * CHECK THE GRAN TEST FLAG. IF <> 0, IT CONTAINS THE
       2748    D438 27 25                   BEQ     LD45F                             * NUMBER OF GRANS IN THE FILE AND THE DESTINATION DISK
       2749                        *                                                  * MUST BE CHECKED FOR ENOUGH ROOM. IF IT IS =0
       2750                        *                                                  * THEN THE CHECK HAS ALREADY BEEN DONE
       2751    D43A 30 6B                   LEAX 11,S                                 POINT TO DESTINATION FILE PARAMETERS
       2752    D43C BD D3 AD                JSR     LD3AD                             GET DESTINATION FILE PARAMETERS FROM STACK
       2753    D43F BD D0 59                JSR     LD059                             SCAN DIRECTORY FOR FILE - 'AE' ERROR IF IT EXISTS
       2754    D442 BD C7 9D                JSR     LC79D                             GET VALID FAT DATA
       2755
       2756                        * MAKE SURE THERE ARE ENOUGH FREE GRANULES ON THE DESTINATION DISK
       2757    D445 BD C7 55                JSR     LC755                             POINT X TO FAT
       2758    D448 30 06                   LEAX FATCON,X                             SKIP PAST THE FAT CONTROL BYTES
       2759    D44A A6 65                   LDA     $05,S                             GET THE NUMBER OF GRANS IN THE FILE
       2760    D44C C6 44                   LDB     #GRANMX                           SET GRAN COUNTER TO MAXIMUM
       2761    D44E 63 84          LD44E    COM     ,X                                * CHECK TO SEE IF A BRAN IS FREE
       2762    D450 26 03                   BNE     LD455                             * AND BRANCH IF IT IS NOT FREE
       2763    D452 4A                      DECA                                      = DECREMENT COUNTER AND BRANCH IF
       2764    D453 27 08                   BEQ     LD45D                             = THERE ARE ENOUGH FREE GRANULES
       2765    D455 63 80          LD455    COM     ,X+                               RESTORE FAT BYTE AND INCREMENT POINTER
       2766    D457 5A                      DECB                                      DECREMENT GRAN COUNTER
       2767    D458 26 F4                   BNE     LD44E                             BRANCH IF ALL GRANS NOT CHECKED
       2768    D45A 7E C7 F8                JMP     LC7F8                             'DISK FULL' ERROR
       2769    D45D 63 84          LD45D    COM     ,X                                RESTORE FAT BYTE
       2770    D45F 8D 1B          LD45F    BSR     LD47C                             'PUT' DATA FROM RAM BUFFER TO DESTINATION FILE
       2771    D461 AE E4                   LDX     ,S                                GET THE NUMBER OF REMAINING SECTORS
       2772    D463 27 0D                   BEQ     LD472                             EXIT ROUTINE IF NO SECTORS LEFT
       2773    D465 EC 62                   LDD     $02,S                             *
       2774    D467 EB 64                   ADDB $04,S                                * GET THE CURRENT RECORD COUNTER, ADD
       2775    D469 89 00                   ADCA #$00                                 * THE NUMBER OF SECTORS (RECORDS) MOVED
       2776    D46B ED 62                   STD     $02,S                             * AND SAVE THE NEW RECORD COUNTER
       2777    D46D 4F                      CLRA                                      SET SOURCE/DESTINATION FLAG TO SOURCE
       2778    D46E 8D 06                   BSR     LD476                             PRINT PROMPT MESSAGE IF REQUIRED
       2779    D470 20 AC                   BRA     LD41E                             KEEP COPYING SECTORS
       2780
       2781    D472 32 E8 24       LD472    LEAS 36,S                                 REMOVE TEMPORARY STORAGE VARIABLES FROM STACK
       2782    D475 39                      RTS                                       **** COPY DONE ****
       2783
       2784    D476 6D E8 19       LD476    TST     25,S                              *CHECK SINGLE DISK COPY FLAG - IF <> ZERO, THEN DON'T
       2785                     *                                                    *PRINT THE PROMPT MESSAGE
       2786    D479 7E D3 26             JMP     LD326                               PRINT THE PROMPT MESSAGE IF REQUIRED
       2787
       2788                     * 'PUT'.'GET' DATA FROM THE DESTINATION/SOURCE FILES
       2789    D47C 86 FF       LD47C    LDA     #$FF                                'PUT' FLAG
       2790    D47E 30 6D                LEAX 13,S                                   POINT X TO DESTINATION FILENAME DATA
       2791    D480 20 04                BRA     LD486                               GO 'PUT' SOME DATA
       2792    D482 4F          LD482    CLRA                                        ZERO IS THE 'GET' FLAG
       2793    D483 30 E8 1A             LEAX 26,S                                   POINT X TO THE SOURCE FILENAME DATA
       2794    D486 97 D8       LD486    STA     VD8                                 SAVE THE 'GET'/'PUT' FLAG
       2795    D488 BD D3 AD             JSR     LD3AD                               GET FILENAME AND DRIVE DATA FROM THE STACK
       2796    D48B AE 68                LDX     $08,S                               * GET ASCII FLAG AND FILE TYPE AND SAVE
       2797    D48D BF 09 57             STX     DFLTYP                              * THEM IN THE DISK RAM VARIABLES
       2798    D490 8E 01 00             LDX     #SECLEN                             = SAVE ONE SECTOR LENGTH IN
       2799    D493 BF 09 7C             STX     DFFLEN                              = RAM RECORD LENGTH VARIABLE
       2800    D496 86 52                LDA     #'R'                                RANDOM FILE TYPE FLAG
       2801    D498 F6 09 5B             LDB     FCBACT                              * GET THE HIGHEST RESERVED FCB NUMBER, ADD ONE
       2802    D49B 5C                   INCB                                        * AND OPEN A RANDOM FILE WHOSE FCB WILL BE ONE ABOVE
       2803    D49C BD C4 8D             JSR     LC48D                               * THE HIGHEST RESERVED FCB (THE SYSTEM FCB)
       2804    D49F 9E F1                LDX     FCBTMP                              POINT X TO THE 'SYSTEM' FCB
       2805    D4A1 CC 01 00             LDD     #SECLEN                             * SET THE NUMBER OF BYTES IN THE LAST SECTOR
       2806    D4A4 ED 88 13             STD     FCBLST,X                            * OF THE FILE EQUAL TO ONE SECTOR LENGTH
       2807    D4A7 E6 66                LDB     $06,S                               =GET THE NUMBER OF SECTORS TO MOVE AND
       2808    D4A9 27 29                BEQ     LD4D4                               =BRANCH IF NONE LEFT
       2809    D4AB D6 D8                LDB     VD8                                 *GRAB THE 'GET'/'PUT' FLAG, 'AND' IT WITH THE
       2810    D4AD E4 67                ANDB $07,S                                  *GRAN TEST FLAG - BRANCH IF 'GET'ING DATA OR THIS IS
       2811    D4AF 27 09                BEQ     LD4BA                               *NOT THE FIRST TIME THROUGH THE LOOP
       2812    D4B1 EC 62                LDD     $02,S                               =GET THE NUMBER OF SECTORS REMAINING TO BE COPIED AND
       2813    D4B3 EB 66                ADDB $06,S                                  =ADD THE NUMBER TO BE COPIED THIS TIME THROUGH LOOP
       2814    D4B5 89 00                ADCA #$00                                   =
       2815    D4B7 BD C2 E6             JSR     LC2E6                               *'PUT' THE LAST RECORD IN THE FILE TO THE SYSTEM FCB.
       2816                     *                                                    *THE RECORD NUMBER IS IN ACCD.
       2817    D4BA 9E F1       LD4BA    LDX     FCBTMP                              POINT X TO THE SYSTEM FCB
       2818    D4BC EE 64                LDU     $04,S                               * GET THE CURRENT RECORD NUMBER
       2819    D4BE EF 07                STU     FCBREC,X                            * AND SAVE IT IN THE FCB
       2820    D4C0 E6 66                LDB     $06,S                               GET THE NUMBER OF THE RECORD (SECTOR) TO MOVE
       2821    D4C2 DE 1F                LDU     ARYEND                              END OF ARRAYS IS THE START OF THE COPY FREE RAM BUFFER
       2822    D4C4 34 44       LD4C4    PSHS U,B                                    SAVE SECTOR COUNTER AND BUFFER POINTER ON THE STACK
       2823    D4C6 9E F1                LDX     FCBTMP                              POINT X TO SYSTEM FCB
       2824    D4C8 EF 0B                STU     FCBBUF,X                            *SET THE RANDOM FILE BUFFER POINTER TO THE 'COPY' RAM BUFFER
       2825                     *                                                    *THIS WILL CAUSE THE SYSTEM TO 'HANG' IF AN ERROR OCCURS DURING COPY.
       2826    D4CA BD C2 EA             JSR     LC2EA                               GO 'GET' OR 'PUT' DATA TO THE SYSTEM FCB
       2827    D4CD 6C 61                INC     $01,S                               ADD 256 (ONE SECTOR) TO THE BUFFER POINTER
       2828    D4CF 35 44                PULS B,U                                    GET THE SECTOR COUNTER AND BUFFER POINER
       2829    D4D1 5A                   DECB                                        DECREMENT SECTOR COUNTER
       2830    D4D2 26 F0                BNE     LD4C4                               BRANCH IF ALL SECTORS NOT DONE
       2831    D4D4 9E F1       LD4D4    LDX     FCBTMP                              POINT X TO SYSTEM FCB
       2832    D4D6 CE 09 89             LDU     #DFLBUF                             * RESET THE RANDOM FILE BUFFER POINTER FOR THE SYSTEM
       2833    D4D9 EF 0B                STU     FCBBUF,X                            * FCB TO THE BOTTOM OF RANDOM FILE BUFFER AREA
       2834    D4DB D6 D8                LDB     VD8                                 =GRAB THE 'GET'/'PUT' FLAG, 'AND' IT WITH THE GRAN
       2835    D4DD E4 67                ANDB $07,S                                  =TEST FLAG - CLOSE THE FILE IF 'GET'ING DATA AND
       2836    D4DF 27 09                BEQ     LD4EA                               =THIS IS NOT THE FIRST TIME THROUGH THE LOOP
       2837    D4E1 6F 67                CLR     $07,S                               RESET THE GRAN TEST FLAG IF FIRST TIME THROUGH LOOP
       2838    D4E3 EC 6A                LDD     10,S                                *GET THE NUMBER OF BYTES IN THE LAST SECTOR,
       2839    D4E5 8A 80                ORA     #$80                                *'OR' IN THE PRE-SAVED FLAG AND
       2840    D4E7 ED 88 13             STD     FCBLST,X                            *SAVE THE NUMBER OF BYTES IN THE LAST SECTOR IN THE FCB
       2841    D4EA 7E CB 06    LD4EA    JMP     LCB06                               CLOSE THE FILE
       2842
       2843                     * DSKI$ COMMAND
       2844    D4ED 8D 38       DSKI     BSR     LD527                               GET THE DRIVE, TRACK AND SECTOR NUMBERS
       2845    D4EF 8D 2B                BSR     LD51C                               * EVALUATE STRING VARIABLE 1 AND SAVE
       2846    D4F1 34 10                PSHS X                                      * THE DESCRIPTOR ADDRESS ON THE STACK
       2847    D4F3 8D 27                BSR     LD51C                               = EVALUATE STRING VARIABLE 2 AND SAVE
       2848    D4F5 34 10                PSHS X                                      = THE DESCRiPTOR ADDRESS ON THE STACK
       2849    D4F7 C6 02                LDB     #$02                                DSKCON READ OP CODE
       2850    D4F9 BD D5 8F             JSR     LD58F                               REAO A SECTOR INTO DBUF0
       2851    D4FC CE 06 80             LDU     #DBUF0+128                          POINT U TO TOP HALF OF DBUF0
       2852    D4FF 35 10                PULS X                                      GET STRING 2 DESCRIPTOR ADDRESS
       2853    D501 8D 05                BSR     LD508                               PUT STRING 2 INTO STRING SPACE
       2854    D503 CE 06 00             LDU     #DBUF0                              POINT U TO BOTTOM HALF OF DBUF0
       2855    D506 35 10                PULS X                                      GET STRING 1 DESCRIPTOR ADDRESS
       2856    D508 34 50       LD508    PSHS U,X                                    PUT STRING DESCRIPTOR & SOURCE POINTER ON THE STACK
       2857    D50A C6 80                LDB     #128                                *
       2858    D50C BD B5 0F             JSR     LB50F                               * RESERVE 128 BYTES IN STRING SPACE
       2859    D50F 33 84                LEAU ,X                                     POINT U TO RESERVED STRING SPACE
       2860    D511 35 10                PULS X                                      GET STRING DESCRIPTOR ADDRESS
       2861    D513 E7 84                STB     ,X                                  * SAVE DESCRIPTOR DATA (LENGTH AND ADDRESS)
       2862    D515 EF 02                STU     $02,X                               * OF THE NEW STRING
       2863    D517 35 10                PULS X                                      GET THE SOURCE (DBUF0) POINTER
       2864    D519 7E A5 9A    LD519    JMP     LA59A                               MOVE SECTOR DATA FROM DBUF0 TO STRING SPACE
       2865
       2866    D51C BD B2 6D    LD51C    JSR     SYNCOMMA                            SYNTAX CHECK FOR A COMMA
       2867    D51F 8E B3 57             LDX     #LB357                              POINT X TO EVALUATE VARIABLE ROUTINE
       2868    D522 8D 2F                BSR     LD553                               EVALUATE A VARIABLE
       2869    D524 7E B1 46    LD524    JMP     LB146                               'TM' ERROR IF NUMERIC VARIABLE
       2870
       2871                     * EVALUATE DRIVE, TRACK AND SECTOR NUMBERS
       2872    D527 BD B7 0B    LD527    JSR     EVALEXPB                            EVALUATE EXPRESSION, RETURN VALUE IN ACCB
       2873    D52A C1 03                CMPB #$03                                   * COMPARE TO 3 (HIGHEST DRIVE NUMBER) -
       2874    D52C 22 1C                BHI     LD54A                               * 'FC' ERROR IF IT'S > 3
       2875    D52E 34 04                PSHS B                                      SAVE DRIVE NUMBER ON THE STACK
       2876    D530 BD B7 38             JSR     LB738                               SYNTAX CHECK FOR COMMA. EVALUATE EXPRESSION (TRACK NUMBER)
       2877    D533 C1 22                CMPB #TRKMAX-1                              * CHECK FOR MAXIMUM TRACK NUMBER
       2878    D535 22 13                BHI     LD54A                               * 'FC' ERROR IF TRACK NUMBER > 34
       2879    D537 34 04                PSHS B                                      SAVE TRACK NUMBER ON THE STACK
       2880    D539 BD B7 38             JSR     LB738                               SYNTAX CHECK FOR COMMA, EVALUATE EXPRESSION (SECTOR NUMBER)
       2881    D53C D7 ED                    STB     DSEC                                   SAVE SECTOR NUMBER IN DSKCON VARIABLE
       2882    D53E 5A                       DECB                                           *USELESS INSTRUCTION. NEXT INSTRUCTION SHOULD JUST
       2883    D53F C1 11                    CMPB #SECMAX-1                                 *CHECK FOR MAXIMUM SECTOR NUMBER (SECMAX)
       2884    D541 22 07                    BHI     LD54A                                  'FC' ERROR IF SECTOR NUMBER TOO BIG
       2885    D543 35 06                    PULS A,B                                       * GET TRACK AND DRIVE NUMBER OFF OF
       2886    D545 97 EC                    STA     DCTRK                                  * THE STACK AND SAVE IN DSKCON
       2887    D547 D7 EB                    STB     DCDRV                                  * VARIABLES
       2888    D549 39                       RTS
       2889    D54A 7E B4 4A       LD54A     JMP     LB44A                                  JUMP TO 'FC' ERROR
       2890
       2891    D54D BD B2 6D       LD54D     JSR     SYNCOMMA                               SYNTAX CHECK FOR COMMA
       2892    D550 8E B1 56                 LDX     #LB156                                 POINT X TO 'EVALUATE EXPRESSION' ROUTINE ADDRESS
       2893    D553 D6 EB          LD553     LDB     DCDRV                                  * GET THE DSKCON DRIVE, TRACK AND
       2894    D555 DE EC                    LDU     DCTRK                                  * SECTOR VALUES AND SAVE THEM ON THE STACK
       2895    D557 34 44                    PSHS S,B                                       *
       2896    D559 AD 84                    JSR     ,X                                     GO EVALUATE AN EXPRESSION OR A VARIABLE
       2897    D55B 35 44                    PULS B,S                                       * GET THE DRIVE, TRACK AND SECTOR
       2898    D55D D7 EB                    STB     DCDRV                                  * NUMBERS OFF OF THE STACK AND PUT
       2899    D55F DF EC                    STU     DCTRK                                  * THEM BACK INTO THE DSKCON VARIABLES
       2900    D561 39                       RTS
       2901
       2902                        * DSKO$ COMMAND
       2903    D562 8D C3          DSKO      BSR     LD527                                  GET THE DRIVE, TRACK AND SECTOR NUMBERS
       2904    D564 8D E7                    BSR     LD54D                                  GET THE DESCRIPTOR OF STRING 1
       2905    D566 8D BC                    BSR     LD524                                  'TM' ERROR IF NUMERIC EXPRESSION
       2906    D568 9E 52                    LDX     FPA0+2                                 * GET STRING 1 DESCRIPTOR ADDRESS
       2907    D56A 34 10                    PSHS X                                         * AND SAVE IT ON THE STACK
       2908    D56C 8D DF                    BSR     LD54D                                  GET THE DESCRIPTOR OF STRING 2
       2909    D56E BD B6 54                 JSR     LB654                                  *GET LENGTH AND ADDRESS OF STRING 2 AND
       2910    D571 34 14                    PSHS X,B                                       *SAVE THEM ON THE STACK
       2911    D573 5F                       CLRB                                           SET CLEAR COUNTER TO 256 (FULL SECTOR BUFFER)
       2912    D574 8E 06 00                 LDX     #DBUF0                                 USE DBUF0 AS THE DSKO$ I/O BUFFER
       2913    D577 6F 80          LD577     CLR     ,X+                                    CLEAR A BYTE IN I/O BUFFER
       2914    D579 5A                       DECB                                           DECREMENT CLEAR COUNTER
       2915    D57A 26 FB                    BNE     LD577                                  BRANCH IF ALL 256 BYTES NOT CLEARED
       2916    D57C 35 14                    PULS B,X                                       GET THE LENGTH AND ADDRESS OF STRING 2
       2917    D57E CE 06 80                 LDU     #DBUF0+128                             POINT X TO STRING 2 DESTINATION
       2918    D581 8D 96                    BSR     LD519                                  MOVE STRING 2 DATA INTO DBUF0
       2919    D583 35 10                    PULS X                                         POINT X TO STRING 1 DESCRIPTOR
       2920    D585 BD B6 59                 JSR     LB659                                  GET THE LENGTH AND ADDRESS OF STRING 1
       2921    D588 CE 06 00                 LDU     #DBUF0                                 POINT U TO STRING 1 DESTINATION
       2922    D58B 8D 8C                    BSR     LD519                                  MOVE STRING 1 DATA INTO DBUF0
       2923    D58D C6 03                    LDB     #$03                                   DSKCON WRITE OP CODE
       2924    D58F 8E 06 00                 LDX     #DBUF0                                 POINT X TO I/O BUFFER (DBUF0)
       2925    D592 9F EE                    STX     DCBPT                                  *
       2926    D594 D7 EA                    STB     DCOPC                                  * SAVE NEW DSKCON BUFFER POINTER AND OP CODE VARIABLES
       2927    D596 7E D6 F2                 JMP     LD6F2                                  GO WRITE OUT A SECTOR
       2928
       2929                        * DSKINI COMMAND
       2930    D599 10 27 D0 82    DSKINI    LBEQ LA61F                                     BRANCH TO 'DN' ERROR IF NO DRIVE NUMBER SPECIFIED
       2931    D59D BD D2 56                 JSR     LD256                                  CALCULATE DRIVE NUMBER
       2932    D5A0 C6 04                    LDB     #$04                                   SKIP FACTOR DEFAULT VALUE
       2933    D5A2 9D A5                    JSR     GETCCH                                 GET CURRENT INPUT CHAR FROM BASiC
       2934    D5A4 27 0C                    BEQ     LD5B2                                  BRANCH IF END OF LINE
       2935    D5A6 BD B7 38                 JSR     LB738                                  SYNTAX CHECK FOR COMMA AND EVALUATE EXPRESSION
       2936    D5A9 C1 11                    CMPB #17                                       MAX VALUE OF SKIP FACTOR = 16
       2937    D5AB 10 24 DE 9B              LBHS LB44A                                     'ILLEGAL FUNCTION CALL' IF BAD SKIP FACTOR
       2938    D5AF BD A5 C7                 JSR     LA5C7                                  SYNTAX ERROR IF MORE CHARACTERS ON THE LINE
       2939    D5B2 34 04          LD5B2     PSHS B                                         SAVE SKIP FACTOR ON THE STACK
       2940    D5B4 8E 07 12                 LDX     #DBUF1+SECMAX                          POINT TO END OF LOGICAL SECTOR NUMBER STORAGE AREA
       2941    D5B7 C6 12                    LDB     #SECMAX                                18 SECTORS PER TRACK
       2942    D5B9 6F 82          LD5B9     CLR     ,-X                                    CLEAR A BYTE IN THE BUFFER
       2943    D5BB 5A                       DECB                                           CLEARED ALL 18?
       2944    D5BC 26 FB                    BNE     LD5B9                                  KEEP GOING IF NOT
       2945    D5BE 4F                       CLRA                                           RESET PHYSICAL SECTOR COUNTER
       2946    D5BF 20 0D                    BRA     LD5CE                                  START WITH FIRST PHYSICAL SECTOR = 1
       2947
       2948                        * CALCULATE LOGICAL SECTOR NUMBERS
       2949    D5C1 EB E4          LD5C1     ADDB ,S                                        ADD SKIP FACTOR TO LOGICAL SECTOR COUNTER
       2950    D5C3 5C             LD5C3     INCB                                           ADD ONE TO LOGICAL SECTOR COUNTER
       2951    D5C4 C0 12          LD5C4     SUBB #SECMAX                                   SUBTRACT MAX NUMBER OF SECTORS
       2952    D5C6 24 FC                    BHS     LD5C4                                  BRANCH UNTIL 0 > ACCB >= -18
       2953    D5C8 CB 12                    ADDB #SECMAX                                   ADD 18, NOW ACCB IS 0-17
       2954    D5CA 6D 85                    TST     B,X                                    IS ANYTHING STORED HERE ALREADY?
       2955    D5CC 26 F5                    BNE     LD5C3                                  YES - GET ANOTHER SECTOR
       2956    D5CE 4C             LD5CE     INCA                                           * INCREMENT PHYSICAL SECTOR NUMBER AND
       2957    D5CF A7 85                    STA     B,X                                    * SAVE IT IN THE RAM BUFFER
       2958    D5D1 81 12                    CMPA #SECMAX                                   FINISHED WITH ALL SECTORS?
       2959    D5D3 25 EC                    BLO     LD5C1                                  NO - KEEP GOING
       2960    D5D5 32 61                    LEAS $01,S                                     REMOVE SKIP FACTOR FROM STACK
       2961    D5D7 8E 22 0F                 LDX     #DFLBUF+$1888-2                        GET TOP OF RAM USED BY DSKINI
       2962    D5DA 9C 27                    CMPX MEMSIZ                                    IS IT > CLEARED AREA?
       2963    D5DC 10 22 D6 64              LBHI LAC44                                     'OUT OF MEMORY' ERROR IF > CLEARED AREA
       2964    D5E0 BD CA E9                 JSR     DVEC7                                  CLOSE ALL FILES
       2965    D5E3 73 09 5C                 COM     DRESFL                                 SET RESET FLAG TO $FF - THIS WILL CAUSE A DOS RESET
       2966    D5E6 10 CE 08 00              LDS     #DBUF1+SECLEN                          SET STACK TO TOP OF DBUF1
       2967    D5EA BD 95 AC                 JSR     L95AC                                  RESET SAM TO DISPLAY PAGE ZERO AND ALPHA GRAPHICS
       2968    D5ED 86 00                    LDA     #$00                                   YOU COULD DELETE THIS INSTRUCTION AND CHANGE FOLLOWING STA TO CLR
       2969    D5EF 97 EA                    STA     DCOPC                                  RESTORE HEAD TO TRACK ZERO DSKCON OP CODE
       2970    D5F1 0F EC                    CLR     DCTRK                                  SET DSKCON TRACK VARIABLE TO TRACK ZERO
       2971    D5F3 BD D6 F2                 JSR     LD6F2                                  RESTORE HEAD TO TRACK ZERO
       2972    D5F6 7F 09 85                 CLR     RDYTMR                                 RESET THE READY TIMER
       2973    D5F9 86 C0                    LDA     #$C0                                   * FOC READ ADDRESS CODE
       2974    D5FB B7 FF 48                 STA     FDCREG                                 *
       2975    D5FE BD D7 D1                 JSR     LD7D1                                  CHECK DRIVE READY - WAIT UNTIL READY
       2976    D601 27 1D                    BEQ     LD620                                  BRANCH IF DRIVES READY
       2977    D603 7E D6 88                JMP     LD688                              ERROR IF DRIVES NOT READY
       2978    D606 81 16          LD606    CMPA #22                                   = CHECK FOR TRACK 22 (PRECOMPENSATION)
       2979    D608 25 08                   BLO     LD612                              = AND BRANCH IF < TRACK 22 - NO PRECOMP
       2980    D60A B6 09 86                LDA     DRGRAM                             * GET THE RAM IMAGE OF DSKREG, 'OR'
       2981    D60D 8A 10                   ORA     #$10                               * IN THE PRECOMPENSATION FLAG AND
       2982    D60F B7 FF 40                STA     DSKREG                             * SEND IT TO DSKREG
       2983    D612 86 53          LD612    LDA     #$53                               = GET STEP IN COMMAND
       2984    D614 B7 FF 48                STA     FDCREG                             = AND SEND IT TO THE 1793
       2985    D617 1E 88                   EXG     A,A                                * DELAY AFTER ISSUING COMMAND TO 1793
       2986    D619 1E 88                   EXG     A,A                                *
       2987    D61B BD D7 D1                JSR     LD7D1                              CHECK DRIVE READY
       2988    D61E 26 68                   BNE     LD688                              BRANCH IF NOT READY - ISSUE AN ERROR
       2989    D620 BD D7 F0       LD620    JSR     LD7F0                              WAIT A WHILE
       2990    D623 8D 6C                   BSR     LD691                              BUILD A FORMATTED TRACK IN RAM
       2991    D625 10 8E FF 4B             LDY     #FDCREG+3                          Y POINTS TO 1793 DATA REGISTER
       2992    D629 1A 50                   ORCC #$50                                  DISABLE INTERRUPTS
       2993    D62B 8E D6 4F                LDX     #LD64F                             * GET RETURN ADDRESS AND STORE
       2994    D62E BF 09 83                STX     DNMIVC                             * IT IN THE NON MASKABLE INTERRUPT VECTOR
       2995    D631 8E 09 89                LDX     #DFLBUF                            POINT X TO THE FORMATTED TRACK RAM IMAGE
       2996    D634 B6 FF 48                LDA     FDCREG                             RESET STATUS OF THE 1793
       2997    D637 86 FF                   LDA     #$FF                               * ENABLE THE NMI FLAG TO VECTOR
       2998    D639 B7 09 82                STA     NMIFLG                             * OUT OF AN I/O LOOP UPON AN NMI INTERRUPT
       2999    D63C C6 F4                   LDB     #$F4                               = GET WRITE TRACK COMMAND AND
       3000    D63E F7 FF 48                STB     FDCREG                             = SEND TO 1793
       3001    D641 B6 09 86                LDA     DRGRAM                             * GET THE DSKREG RAM IMAGE AND 'OR' IN THE
       3002    D644 8A 80                   ORA     #$80                               * FLAG WHICH WILL ENABLE THE 1793 TO HALT
       3003    D646 B7 FF 40                STA     DSKREG                             * THE 6809. SEND RESULT TO DSKREG
       3004    D649 E6 80          LD649    LDB     ,X+                                = GET A BYTE FROM THE FORMATTED TRACK
       3005    D64B E7 A4                   STB     ,Y                                 = RAM IMAGE, SEND IT TO THE 1793 AND
       3006    D64D 20 FA                   BRA     LD649                              = LOOP BACK TO GET ANOTHER BYTE
       3007
       3008    D64F B6 FF 48       LD64F    LDA     FDCREG                             GET STATUS
       3009    D652 1C AF                   ANDCC #$AF                                 ENABLE INTERRUPTS
       3010    D654 84 44                   ANDA #$44                                  * KEEP ONLY WRITE PROTECT & LOST DATA
       3011    D656 97 F0                   STA     DCSTA                              * AND SAVE IT IN THE DSKCON STATUS BYTE
       3012    D658 26 2E                   BNE     LD688                              BRANCH IF ERROR
       3013    D65A 0C EC                   INC     DCTRK                              SKIP TO THE NEXT TRACK
       3014    D65C 96 EC                   LDA     DCTRK                              GET THE TRACK NUMBER
       3015    D65E 81 23                   CMPA #TRKMAX                               WAS IT THE LAST TRACK
       3016    D660 26 A4                   BNE     LD606                              NO - KEEP GOING
       3017
       3018                        * VERIFY THAT ALL SECTORS ARE READABLE
       3019    D662 86 02                   LDA     #$02                               = GET THE DSKCON READ OP CODE
       3020    D664 97 EA                   STA     DCOPC                              = AND SAVE IT IN THE DSKCON VARIABLE
       3021    D666 8E 06 00                LDX     #DBUF0                             * POINT THE DSKCON BUFFER POINTER
       3022    D669 9F EE                   STX     DCBPT                              * TO DBUF0
       3023    D66B CE 07 00                LDU     #DBUF1                             POINT U TO THE LOGICAL SECTOR NUMBERS
       3024    D66E 4F                      CLRA                                       RESET THE TRACK COUNTER TO ZERO
       3025    D66F 97 EC          LD66F    STA     DCTRK                              SET THE DSKCON TRACK VARIABLE
       3026    D671 5F                      CLRB                                       RESET THE SECTOR COUNTER
       3027    D672 A6 C5          LD672    LDA     B,U                                GET THE PHYSICAL SECTOR NUMBER
       3028    D674 97 ED                   STA     DSEC                               SAVE DSKCON SECTOR VARIABLE
       3029    D676 BD D6 F2                JSR     LD6F2                              READ A SECTOR
       3030    D679 5C                      INCB                                       * INCREMENT THE SECTOR COUNTER
       3031    D67A C1 12                   CMPB #SECMAX                               * AND COMPARE IT TO MAXIMUM SECTOR NUMBER
       3032    D67C 25 F4                   BLO     LD672                              * AND KEEP LOOPING IF MORE SECTORS LEFT
       3033    D67E 96 EC                   LDA     DCTRK                              = GET THE CURRENT TRACK NUMBER
       3034    D680 4C                      INCA                                       = ADD ONE TO IT, COMPARE TO THE MAXIMUM TRACK
       3035    D681 81 23                   CMPA #TRKMAX                               = NUMBER AND KEEP LOOPING IF
       3036    D683 25 EA                   BLO     LD66F                              = THERE ARE STILL TRACKS TO DO
       3037    D685 7E D2 CD                JMP     LD2CD                              GO CHECK FOR A DOS RESET
       3038    D688 7F 09 86       LD688    CLR     DRGRAM                             CLEAR RAM IMAGE OF DSKREG
       3039    D68B 7F FF 40                CLR     DSKREG                             CLEAR DSKREG - TURN DISK MOTORS OFF
       3040 > D68E 7E D7 01                 JMP     LD701                              PROCESS DRIVES NOT READY ERROR
       3041
       3042                        * BUILD A FORMATTED TRACK OF DATA IN RAM STARTING AT DFLBUF.
       3043
       3044    D691 8E 09 89       LD691    LDX     #DFLBUF                            START TRACK BUFFER AT DFLBUF
       3045    D694 CC 20 4E                LDD     #$204E                             GET SET TO WRITE 32 BYTES OF $4E
       3046    D697 8D 29                   BSR     LD6C2                              GO WRITE GAP IV
       3047    D699 5F                      CLRB                                       RESET SECTOR COUNTER
       3048    D69A 34 04          LD69A    PSHS B                                     SAVE SECTOR COUNTER
       3049    D69C CE 07 00                LDU     #DBUF1                             POINT U TO THE TABLE OF LOGICAL SECTORS
       3050    D69F E6 C5                   LDB     B,U                                * GET LOGICAL SECTOR NUMBER FROM TABLE AND
       3051    D6A1 D7 ED                   STB     DSEC                               * SAVE IT IN THE DSKCON VARIABLE
       3052    D6A3 CE D6 D4                LDU     #LD6D4                             POINT U TO TABLE OF SECTOR FORMATTING DATA
       3053    D6A6 C6 03                   LDB     #$03                               * GET FIRST 3 DATA BLOCKS AND
       3054    D6A8 8D 1E                   BSR     LD6C8                              * WRITE THEM TO BUFFER
       3055    D6AA 96 EC                   LDA     DCTRK                              = GET TRACK NUMBER AND STORE lT
       3056    D6AC A7 80                   STA     ,X+                                = IN THE RAM BUFFER
       3057    D6AE 6F 80                   CLR     ,X+                                CLEAR A BYTE (SIDE NUMBER) IN BUFFER
       3058    D6B0 96 ED                   LDA     DSEC                               * GET SECTOR NUMBER AND
       3059    D6B2 A7 80                   STA     ,X+                                * STORE IT IN THE BUFFER
       3060    D6B4 C6 09                   LDB     #$09                               = GET THE LAST NINE DATA BLOCKS AND
       3061    D6B6 8D 10                   BSR     LD6C8                              = WRITE THEM TO THE BUFFER
       3062    D6B8 35 04                   PULS B                                     GET SECTOR COUNTER
       3063    D6BA 5C                      INCB                                       NEXT SECTOR
       3064    D6BB C1 12                   CMPB #SECMAX                               18 SECTORS PER TRACK
       3065    D6BD 25 DB                   BLO     LD69A                              BRANCH IF ALL SECTORS NOT DONE
       3066    D6BF CC C8 4E                LDD     #$C84E                             WRITE 200 BYTES OF $4E AT END OF TRACK
       3067
       3068                        * WRITE ACCA BYTES OF ACCB INTO BUFFER
       3069    D6C2 E7 80          LD6C2    STB     ,X+                                STORE A BYTE IN THE BUFFER
       3070    D6C4 4A                      DECA                                       DECREMENT COUNTER
       3071    D6C5 26 FB                   BNE     LD6C2                              BRANCH IF ALL BYTES NOT MOVED
       3072    D6C7 39                      RTS
       3073    D6C8 34 04          LD6C8     PSHS B                                     SAVE THE COUNTER ON THE STACK
       3074    D6CA EC C1                    LDD     ,U++                               GET TWO BYTES OF DATA FROM THE TABLE
       3075    D6CC 8D F4                    BSR     LD6C2                              WRITE ACCA BYTES OF ACCB INTO THE BUFFER
       3076    D6CE 35 04                    PULS B                                     * GET THE COUNTER BACK, DECREMENT
       3077    D6D0 5A                       DECB                                       * IT AND BRANCH IF ALL DATA BLOCKS
       3078    D6D1 26 F5                    BNE     LD6C8                              * NOT DONE
       3079    D6D3 39                       RTS
       3080
       3081                        * DATA USED TO FORMAT A SECTOR ON THE DISK
       3082
       3083                        * THESE DATA ARE CLOSE TO THE IBM SYSTEM 34 FORMAT FOR 256 BYTE SECTORS.
       3084                        * DOUBLE DENSITY. THE FORMAT GENERALLY CONFORMS TO THAT SPECIFIED ON THE
       3085                        * 1793 DATA SHEET. THE GAP SIZES HAVE BEEN REDUCED TO THE MINIMUM
       3086                        * ALLOWABLE. THE IBM FORMAT USES $40 AS THE FILL CHARACTER FOR THE DATA
       3087                        * BLOCKS WHILE COLOR DOS USES AN $FF AS THE FILL CHARACTER.
       3088    D6D4 08 00          LD6D4     FCB     8,0                                SYNC FIELD
       3089    D6D6 03 F5                    FCB     3,$F5
       3090    D6D8 01 FE                    FCB     1,$FE                              ID ADDRESS MARK (AM1)
       3091                        * TRACK, SIDE, AND SECTOR NUMBERS ARE INSERTED HERE
       3092    D6DA 01 01                    FCB     1,1                                SECTOR SIZE (256 BYTE SECTORS)
       3093    D6DC 01 F7                    FCB     1,$F7                              CRC REQUEST
       3094    D6DE 16 4E                    FCB     22,$4E                             GAP II (POST-ID GAP)
       3095    D6E0 0C 00                    FCB     12,0                               SYNC FIELD
       3096    D6E2 03 F5                    FCB     3,$F5
       3097    D6E4 01 FB                    FCB     1,$FB                              DATA ADDRESS MARK (AM2)
       3098    D6E6 00 FF                    FCB     0,$FF                              DATA FIELD (256 BYTES)
       3099    D6E8 01 F7                    FCB     1,$F7                              CRC REQUEST
       3100    D6EA 18 4E                    FCB     24,$4E                             GAP III (POST DATA GAP)
       3101
       3102
       3103                        * DOS COMMAND
       3104    D6EC 26 54          DOS       BNE     LD742                              RETURN IF ARGUMENT GIVEN
       3105    D6EE 6E 9F C0 0A              JMP     [DOSVEC]                           JUMP TO THE DOS COMMAND
       3106
       3107    D6F2 34 04          LD6F2     PSHS B                                     SAVE ACCB
       3108    D6F4 C6 05                    LDB     #$05                               5 RETRIES
       3109    D6F6 F7 09 88                 STB     ATTCTR                             SAVE RETRY COUNT
       3110    D6F9 35 04                    PULS B                                     RESTORE ACCB
       3111    D6FB 8D 62          LD6FB     BSR     DSKCON                             GO EXECUTE COMMAND
       3112    D6FD 0D F0                    TST     DCSTA                              CHECK STATUS
       3113    D6FF 27 0D                    BEQ     LD70E                              BRANCH IF NO ERRORS
       3114    D701 96 F0          LD701     LDA     DCSTA                              GET DSKCON ERROR STATUS
       3115    D703 C6 3C                    LDB     #2*30                              'WRITE PROTECTED' ERROR
       3116    D705 85 40                    BITA #$40                                  CHECK BIT 6 OF STATUS
       3117    D707 26 02                    BNE     LD70B                              BRANCH IF WRITE PROTECT ERROR
       3118    D709 C6 28          LD709     LDB     #2*20                              'I/O ERROR'
       3119    D70B 7E AC 46       LD70B     JMP     LAC46                              JUMP TO ERROR DRIVER
       3120    D70E 34 02          LD70E     PSHS A                                     SAVE ACCA
       3121    D710 96 EA                    LDA     DCOPC                              GET OPERATION CODE
       3122    D712 81 03                    CMPA #$03                                  CHECK FOR WRITE SECTOR COMMAND
       3123    D714 35 02                    PULS A                                     RESTORE ACCA
       3124    D716 26 2A                    BNE     LD742                              RETURN IF NOT WRITE SECTOR
       3125    D718 7D 09 87                 TST     DVERFL                             CHECK VERIFY FLAG
       3126    D71B 27 25                    BEQ     LD742                              RETURN IF NO VERIFY
       3127    D71D 34 56                    PSHS U,X,B,A                               SAVE REGISTERS
       3128    D71F 86 02                    LDA     #$02                               READ OPERATION CODE
       3129    D721 97 EA                    STA     DCOPC                              STORE TO DSKCON PARAMETER
       3130    D723 DE EE                    LDU     DCBPT                              POINT U TO WRITE BUFFER ADDRESS
       3131    D725 8E 07 00                 LDX     #DBUF1                             * ADDRESS OF VERIFY BUFFER
       3132    D728 9F EE                    STX     DCBPT                              * TO DSKCON VARIABLE
       3133    D72A 8D 33                    BSR     DSKCON                             GO READ SECTOR
       3134    D72C DF EE                    STU     DCBPT                              RESTORE WRITE BUFFER
       3135    D72E 86 03                    LDA     #$03                               WRITE OP CODE
       3136    D730 97 EA                    STA     DCOPC                              SAVE IN DSKCON VARIABLE
       3137    D732 96 F0                    LDA     DCSTA                              CHECK STATUS FOR THE READ OPERATION
       3138    D734 26 0D                    BNE     LD743                              BRANCH IF ERROR
       3139    D736 5F                       CLRB                                       CHECK 256 BYTES
       3140    D737 A6 80          LD737     LDA     ,X+                                GET BYTE FROM WRITE BUFFER
       3141    D739 A1 C0                    CMPA ,U+                                   COMPARE TO READ BUFFER
       3142    D73B 26 06                    BNE     LD743                              BRANCH IF NOT EQUAL
       3143    D73D 5A                       DECB                                       * DECREMENT BYTE COUNTER AND
       3144    D73E 26 F7                    BNE     LD737                              * BRANCH IF NOT DONE
       3145    D740 35 56                    PULS A,B,X,U                               RESTORE REGISTERS
       3146    D742 39             LD742     RTS
       3147    D743 35 56          LD743     PULS A,B,X,U                               RESTORE REGISTERS
       3148    D745 7A 09 88                 DEC     ATTCTR                             DECREMENT THE VERIFY COUNTER
       3149    D748 26 B1                    BNE     LD6FB                              BRANCH IF MORE TRIES LEFT
       3150    D74A C6 48                    LDB     #2*36                              'VERIFY ERROR'
       3151    D74C 20 BD                    BRA     LD70B                              JUMP TO ERROR HANDLER
       3152
       3153                        * VERIFY COMMAND
       3154    D74E 5F             VERIFY    CLRB                                       OFF FLAG = 0
       3155    D74F 81 AA                    CMPA #$AA                                  OFF TOKEN ?
       3156    D751 27 07                    BEQ     LD75A                              YES
       3157    D753 53                       COMB                                       ON FLAG = $FF
       3158    D754 81 88                    CMPA #$88                                  ON TOKEN
       3159    D756 10 26 DB 1D              LBNE LB277                                 BRANCH TO 'SYNTAX ERROR' IF NOT ON OR OFF
       3160    D75A F7 09 87       LD75A     STB     DVERFL                             SET VERIFY FLAG
       3161    D75D 0E 9F                    JMP     GETNCH                             GET NEXT CHARACTER FROM BASIC
       3162
       3163                        * DSKCON ROUTINE
       3164    D75F 34 76          DSKCON    PSHS U,Y,X,B,A                             SAVE REGISTERS
       3165    D761 86 05                    LDA     #$05                               * GET RETRY COUNT AND
       3166    D763 34 02                    PSHS A                                     * SAVE IT ON THE STACK
       3167    D765 7F 09 85       LD765     CLR     RDYTMR                             RESET DRIVE NOT READY TIMER
       3168    D768 D6 EB                    LDB     DCDRV                              GET DRIVE NUMBER
       3169    D76A 8E D8 9D             LDX      #LD89D                           POINT X TO DRIVE ENABLE MASKS
       3170    D76D B6 09 86             LDA      DRGRAM                           GET DSKREG IMAGE
       3171    D770 84 A8                ANDA #$A8                                 KEEP MOTOR STATUS, DOUBLE DENSITY. HALT ENABLE
       3172    D772 AA 85                ORA      B,X                              'OR' IN DRIVE SELECT DATA
       3173    D774 8A 20                ORA      #$20                             'OR' IN DOUBLE DENSITY
       3174    D776 D6 EC                LDB      DCTRK                            GET TRACK NUMBER
       3175    D778 C1 16                CMPB #22                                  PRECOMPENSATION STARTS AT TRACK 22
       3176    D77A 25 02                BLO      LD77E                            BRANCH IF LESS THAN 22
       3177    D77C 8A 10                ORA      #$10                             TURN ON WRITE PRECOMPENSATION IF >= 22
       3178    D77E 1F 89       LD77E    TFR      A,B                              SAVE PARTIAL IMAGE IN ACCB
       3179    D780 8A 08                ORA      #$08                             'OR' IN MOTOR ON CONTROL BIT
       3180    D782 B7 09 86             STA      DRGRAM                           SAVE IMAGE IN RAM
       3181    D785 B7 FF 40             STA      DSKREG                           PROGRAM THE 1793 CONTROL REGISTER
       3182    D788 C5 08                BITB #$08                                 = WERE MOTORS ALREADY ON?
       3183    D78A 26 06                BNE      LD792                            = DON'T WAIT FOR IT TO COME UP TO SPEED IF ALREADY ON
       3184    D78C BD A7 D1             JSR      LA7D1                            * WAIT A WHILE
       3185    D78F BD A7 D1             JSR      LA7D1                            * WAIT SOME MORE FOR MOTOR TO COME UP TO SPEED
       3186    D792 8D 3D       LD792    BSR      LD7D1                            WAIT UNTIL NOT BUSY OR TIME OUT
       3187    D794 26 0A                BNE      LD7A0                            BRANCH IF TIMED OUT (DOOR OPEN. NO DISK, NO POWER. ETC.)
       3188    D796 0F F0                CLR      DCSTA                            CLEAR STATUS REGISTER
       3189    D798 8E D8 95             LDX      #LD895                           POINT TO COMMAND JUMP VECTORS
       3190    D79B D6 EA                LDB      DCOPC                            GET COMMAND
       3191    D79D 58                   ASLB                                      2 BYTES PER COMMAND JUMP ADDRESS
       3192    D79E AD 95                JSR      [B,X]                            GO DO IT
       3193    D7A0 35 02       LD7A0    PULS A                                    GET RETRY COUNT
       3194    D7A2 D6 F0                LDB      DCSTA                            GET STATUS
       3195    D7A4 27 0B                BEQ      LD7B1                            BRANCH IF NO ERRORS
       3196    D7A6 4A                   DECA                                      DECREMENT RETRIES COUNTER
       3197    D7A7 27 08                BEQ      LD7B1                            BRANCH IF NO RETRIES LEFT
       3198    D7A9 34 02                PSHS A                                    SAVE RETRY COUNT ON STACK
       3199    D7AB 8D 0B                BSR      LD7B8                            RESTORE HEAD TO TRACK 0
       3200    D7AD 26 F1                BNE      LD7A0                            BRANCH IF SEEK ERROR
       3201    D7AF 20 B4                BRA      LD765                            GO TRY COMMAND AGAIN IF NO ERROR
       3202    D7B1 86 78       LD7B1    LDA      #120                             120*1/60 = 2 SECONDS (1/60 SECOND FOR EACH IRQ INTERRUPT)
       3203    D7B3 B7 09 85             STA      RDYTMR                           WAIT 2 SECONDS BEFORE TURNING OFF MOTOR
       3204    D7B6 35 F6                PULS A,B,X,Y,U,PC                         RESTORE REGISTERS - EXIT DSKCON
       3205                     * RESTORE HEAD TO TRACK 0
       3206    D7B8 8E 09 7E    LD7B8    LDX      #DR0TRK                          POINT TO TRACK TABLE
       3207    D7BB D6 EB                LDB      DCDRV                            GET DRIVE NUMBER
       3208    D7BD 6F 85                CLR      B,X                              ZERO TRACK NUMBER
       3209    D7BF 86 03                LDA      #$03                             * RESTORE HEAD TO TRACK 0, UNLOAD THE HEAD
       3210    D7C1 B7 FF 48             STA      FDCREG                           * AT START, 30 MS STEPPING RATE
       3211    D7C4 1E 88                EXG      A,A                              =
       3212    D7C6 1E 88                EXG      A,A                              = WAIT FOR 1793 TO RESPOND TO COMMAND
       3213    D7C8 8D 07                BSR      LD7D1                            WAIT TILL DRIVE NOT BUSY
       3214    D7CA 8D 24                BSR      LD7F0                            WAIT SOME MORE
       3215    D7CC 84 10                ANDA #$10                                 1793 STATUS : KEEP ONLY SEEK ERROR
       3216    D7CE 97 F0                STA      DCSTA                            SAVE IN DSKCON STATUS
       3217    D7D0 39          LD7D0    RTS
       3218                     * WAIT FOR THE 1793 TO BECOME UNBUSY. IF IT DOES NOT BECOME UNBUSY,
       3219                     * FORCE AN INTERRUPT AND ISSUE A `DRIVE NOT READY' 1793 ERROR.
       3220    D7D1 9E 8A       LD7D1    LDX      ZERO                             GET ZERO TO X REGISTER - LONG WAIT
       3221    D7D3 30 1F       LD7D3    LEAX -1,X                                 DECREMENT LONG WAIT COUNTER
       3222    D7D5 27 08                BEQ      LD7DF                            lF NOT READY BY NOW, FORCE INTERRUPT
       3223    D7D7 B6 FF 48             LDA      FDCREG                           * GET 1793 STATUS AND TEST
       3224    D7DA 85 01                BITA #$01                                 * BUSY STATUS BIT
       3225    D7DC 26 F5                BNE      LD7D3                            BRANCH IF BUSY
       3226    D7DE 39                   RTS
       3227    D7DF 86 D0       LD7DF    LDA      #$D0                             * FORCE INTERRUPT COMMAND - TERMINATE ANY COMMAND
       3228    D7E1 B7 FF 48             STA      FDCREG                           * IN PROCESS. DO NOT GENERATE A 1793 INTERRUPT REQUEST
       3229    D7E4 1E 88                EXG      A,A                              * WAIT BEFORE READING 1793
       3230    D7E6 1E 88                EXG      A,A                              *
       3231    D7E8 B6 FF 48             LDA      FDCREG                           RESET INTRQ (FDC INTERRUPT REQUEST)
       3232    D7EB 86 80                LDA      #$80                             RETURN DRIVE NOT READY STATUS IF THE DRIVE DID NOT BECOME UNBUSY
       3233    D7ED 97 F0                STA      DCSTA                            SAVE DSKCON STATUS BYTE
       3234    D7EF 39                   RTS
       3235                     * MEDIUM DELAY
       3236    D7F0 8E 22 2E    LD7F0    LDX      #8750                            DELAY FOR A WHILE
       3237    D7F3 30 1F       LD7F3    LEAX -1,X                                 * DECREMENT DELAY COUNTER AND
       3238    D7F5 26 FC                BNE      LD7F3                            * BRANCH IF NOT DONE
       3239    D7F7 39                   RTS
       3240                     * READ ONE SECTOR
       3241    D7F8 86 80       LD7F8    LDA      #$80                             $80 IS READ FLAG (1793 READ SECTOR)
       3242    D7FA 8C          LD7FA    CMPX #$86A0                               SKIP TWO BYTES
       3243                     * WRITE ONE SECTOR
       3244    D7FB 86 A0       LD7FB    LDA      #$A0                             $A0 IS WRITE FLAG (1793 WRITE SECTOR)
       3245    D7FD 34 02                PSHS A                                    SAVE READ/WRITE FLAG ON STACK
       3246    D7FF 8E 09 7E             LDX      #DR0TRK                          POINT X TO TRACK NUMBER TABLE IN RAM
       3247    D802 D6 EB                LDB      DCDRV                            GET DRIVE NUMBER
       3248    D804 3A                   ABX                                       POINT X TO CORRECT DRIVE'S TRACK BYTE
       3249    D805 E6 84                LDB      ,X                               GET TRACK NUMBER OF CURRENT HEAD POSITION
       3250    D807 F7 FF 49             STB      FDCREG+1                         SEND TO 1793 TRACK REGISTER
       3251    D80A D1 EC                CMPB DCTRK                                COMPARE TO DESIRED TRACK
       3252    D80C 27 1E                BEQ      LD82C                            BRANCH IF ON CORRECT TRACK
       3253    D80E 96 EC                LDA      DCTRK                            GET TRACK DESIRED
       3254    D810 B7 FF 4B             STA      FDCREG+3                         SEND TO 1793 DATA REGiSTER
       3255    D813 A7 84                STA      ,X                               SAVE IN RAM TRACK IMAGE
       3256    D815 86 17                LDA      #$17                             * SEEK COMMAND FOR 1793: DO NOT LOAD THE
       3257    D817 B7 FF 48             STA      FDCREG                           * HEAD AT START, VERIFY DESTINATION TRACK,
       3258    D81A 1E 88                EXG      A,A                              * 30 MS STEPPING RATE - WAIT FOR
       3259    D81C 1E 88                EXG      A,A                              * VALID STATUS FROM 1793
       3260    D81E 8D B1                BSR      LD7D1                            WAIT TILL NOT BUSY
       3261    D820 26 08                BNE      LD82A                            RETURN IF TIMED OUT
       3262    D822 8D CC                BSR      LD7F0                            WAIT SOME MORE
       3263    D824 84 18                ANDA #$18                                 KEEP ONLY SEEK ERROR OR CRC ERROR IN ID FIELD
       3264    D826 27 04                BEQ      LD82C                            BRANCH IF NO ERRORS - HEAD ON CORRECT TRACK
       3265    D828 97 F0                 STA     DCSTA                              SAVE IN DSKCON STATUS
       3266    D82A 35 82       LD82A     PULS A,PC
       3267                     * HEAD POSITIONED ON CORRECT TRACK
       3268    D82C 96 ED       LD82C     LDA     DSEC                               GET SECTOR NUMBER DESIRED
       3269    D82E B7 FF 4A              STA     FDCREG+2                           SEND TO 1793 SECTOR REGISTER
       3270    D831 8E D8 8B              LDX     #LD88B                             * POINT X TO ROUTINE TO BE VECTORED
       3271    D834 BF 09 83              STX     DNMIVC                             * TO BY NMI UPON COMPLETION OF DISK I/O AND SAVE VECTOR
       3272    D837 9E EE                 LDX     DCBPT                              POINT X TO I/O BUFFER
       3273    D839 B6 FF 48              LDA     FDCREG                             RESET INTRQ (FDC INTERRUPT REQUEST)
       3274    D83C B6 09 86              LDA     DRGRAM                             GET DSKREG IMAGE
       3275    D83F 8A 80                 ORA     #$80                               SET FLAG TO ENABLE 1793 TO HALT 6809
       3276    D841 35 04                 PULS B                                     GET READ/WRITE COMMAND FROM STACK
       3277    D843 10 9E 8A              LDY     ZERO                               ZERO OUT Y - TIMEOUT INITIAL VALUE
       3278    D846 CE FF 48              LDU     #FDCREG                            U POINTS TO 1793 INTERFACE REGISTERS
       3279    D849 73 09 82              COM     NMIFLG                             NMI FLAG = $FF: ENABLE NMI VECTOR
       3280    D84C 1A 50                 ORCC #$50                                  DISABLE FIRQ,IRQ
       3281    D84E F7 FF 48              STB     FDCREG                             * SEND READ/WRITE COMMAND TO 1793: SINGLE RECORD, COMPARE
       3282    D851 1E 88                 EXG     A,A                                * FOR SIDE 0, NO 15 MS DELAY, DISABLE SIDE SELECT
       3283    D853 1E 88                 EXG     A,A                                * COMPARE, WRITE DATA ADDRESS MARK (FB) - WAIT FOR STATUS
       3284    D855 C1 80                 CMPB #$80                                  WAS THIS A READ?
       3285    D857 27 1C                 BEQ     LD875                              IF SO, GO LOOK FOR DATA
       3286                     * WAIT FOR THE 1793 TO ACKNOWLEDGE READY TO WRITE DATA
       3287    D859 C6 02                 LDB     #$02                               DRQ MASK BIT
       3288    D85B E5 C4       LD85B     BITB ,U                                    IS 1793 READY FOR A BYTE? (DRQ SET IN STATUS BYTE)
       3289    D85D 26 0C                 BNE     LD86B                              BRANCH IF SO
       3290    D85F 31 3F                 LEAY -1,Y                                  DECREMENT WAIT TIMER
       3291    D861 26 F8                 BNE     LD85B                              KEEP WAITING FOR THE 1793 DRQ
       3292    D863 7F 09 82    LD863     CLR     NMIFLG                             RESET NMI FLAG
       3293    D866 1C AF                 ANDCC #$AF                                 ENABLE FIRQ,IRQ
       3294    D868 7E D7 DF              JMP     LD7DF                              FORCE INTERRUPT, SET DRIVE NOT READY ERROR
       3295
       3296                     * WRITE A SECTOR
       3297    D86B E6 80       LD86B     LDB     ,X+                                GET A BYTE FROM RAM
       3298    D86D F7 FF 4B              STB     FDCREG+3                           SEND IT TO 1793 DATA REGISTER
       3299    D870 B7 FF 40              STA     DSKREG                             REPROGRAM FDC CONTROL REGISTER
       3300    D873 20 F6                 BRA     LD86B                              SEND MORE DATA
       3301                     * WAIT FOR THE 17933 TO ACKNOWLEDGE READY TO READ DATA
       3302    D875 C6 02       LD875     LDB     #$02                               DRQ MASK BIT
       3303    D877 E5 C4       LD877     BITB ,U                                    DOES THE 1793 HAVE A BYTE? (DRQ SET IN STATUS BYTE)
       3304    D879 26 06                 BNE     LD881                              YES, GO READ A SECTOR
       3305    D87B 31 3F                 LEAY -1,Y                                  DECREMENT WAIT TIMER
       3306    D87D 26 F8                 BNE     LD877                              KEEP WAITING FOR 1793 DRQ
       3307    D87F 20 E2                 BRA     LD863                              GENERATE DRIVE NOT READY ERROR
       3308
       3309                     * READ A SECTOR
       3310    D881 F6 FF 4B    LD881     LDB     FDCREG+3                           GET DATA BYTE FROM 1793 DATA REGISTER
       3311    D884 E7 80                 STB     ,X+                                PUT IT IN RAM
       3312    D886 B7 FF 40              STA     DSKREG                             REPROGRAM FDC CONTROL REGISTER
       3313    D889 20 F6                 BRA     LD881                              KEEP GETTING DATA
       3314                     * BRANCH HERE ON COMPLETION OF SECTOR READ/WRITE
       3315    D88B 1C AF       LD88B     ANDCC #$AF                                 ENABLE IRQ, FIRO
       3316    D88D B6 FF 48              LDA     FDCREG                             * GET STATUS & KEEP WRITE PROTECT, RECORD TYPE/WRITE
       3317    D890 84 7C                 ANDA #$7C                                  * FAULT, RECORD NOT FOUND, CRC ERROR OR LOST DATA
       3318    D892 97 F0                 STA     DCSTA                              SAVE IN DSKCON STATUS
       3319    D894 39                    RTS
       3320
       3321                     * DSKCON OPERATION CODE JUMP VECTORS
       3322    D895 D7 B8       LD895     FDB     LD7B8                              RESTORE HEAD TO TRACK ZERO
       3323    D897 D7 D0                 FDB     LD7D0                              NO OP - RETURN
       3324    D899 D7 F8                 FDB     LD7F8                              READ SECTOR
       3325    D89B D7 FB                 FDB     LD7FB                              WRITE SECTOR
       3326
       3327                     * DSKREG MASKS FOR DISK DRIVE SELECT
       3328    D89D 01          LD89D     FCB     1                                  DRIVE SEL 0
       3329    D89E 02                    FCB     2                                  DRIVE SEL 1
       3330    D89F 04                    FCB     4                                  DRIVE SEL 2
       3331    D8A0 40                    FCB     $40                                DRIVE SEL 3
       3332
       3333                     * NMI SERVICE
       3334    D8A1 B6 09 82    DNMISV    LDA     NMIFLG                             GET NMI FLAG
       3335    D8A4 27 08                 BEQ     LD8AE                              RETURN IF NOT ACTIVE
       3336    D8A6 BE 09 83              LDX     DNMIVC                             GET NEW RETURN VECTOR
       3337    D8A9 AF 6A                 STX     10,S                               STORE AT STACKED PC SLOT ON STACK
       3338    D8AB 7F 09 82              CLR     NMIFLG                             RESET NMI FLAG
       3339    D8AE 3B                    RTI
       3340
       3341                     * IRQ SERVICE
       3342    D8AF B6 FF 03    DIRQSV    LDA     PIA0+3                             63.5 MICRO SECOND OR 60 HZ INTERRUPT?
       3343    D8B2 2A FA                 BPL     LD8AE                              RETURN IF 63.5 MICROSECOND
       3344    D8B4 B6 FF 02              LDA     PIA0+2                             RESET 60 HZ PIA INTERRUPT FLAG
       3345    D8B7 B6 09 85              LDA     RDYTMR                             GET TIMER
       3346    D8BA 27 11                 BEQ     LD8CD                              BRANCH IF NOT ACTIVE
       3347    D8BC 4A                    DECA                                       DECREMENT THE TIMER
       3348    D8BD B7 09 85              STA     RDYTMR                             SAVE IT
       3349    D8C0 26 0B                 BNE     LD8CD                              BRANCH IF NOT TIME TO TURN OFF DISK MOTORS
       3350    D8C2 B6 09 86              LDA     DRGRAM                             = GET DSKREG IMAGE
       3351    D8C5 84 B0                 ANDA #$B0                                  = TURN ALL MOTORS AND DRIVE SELECTS OFF
       3352    D8C7 B7 09 86              STA     DRGRAM                             = PUT IT BACK IN RAM IMAGE
       3353    D8CA B7 FF 40              STA     DSKREG                             SEND TO CONTROL REGISTER (MOTORS OFF)
       3354    D8CD 7E 89 55    LD8CD     JMP     L8955                              JUMP TO EXTENDED BASIC'S IRQ HANDLER
       3355
       3356                     * THIS IS THE END OF DISK BASIC (EXCEPT FOR THE DOS COMMAND AT $DF00).
       3357                     * THE CODE FROM THIS POINT TO $DF00 IS GARBAGE.
       3358                     * DOSBAS 1.1 = 1686 WASTED BYTES
       3359
       3360                     ** THIS IS THE CODE FOR THE DOS COMMAND
       3361
       3362                                  ORG     DOSBAS+$1F00
       3363    DF00 11 3F          DOSCOM    SWI3                                         DO A SOFTWARE INTERRUPT (#3)
       3364    DF02 0F 03                    CLR     TMPLOC                               RESET SECTOR COUNTER
       3365    DF04 CC 26 00                 LDD     #DOSBUF                              RAM LOAD ADDRESS FOR SECTOR DATA
       3366    DF07 34 06                    PSHS B,A                                     SAVE RAM LOAD ADDRESS
       3367    DF09 BE C0 06       LDF09     LDX     DSKVAR                               POINT X TO DSKCON VARIABLES
       3368    DF0C 0C 03                    INC     TMPLOC                               INCREMENT SECTOR COUNTER
       3369    DF0E 96 03                    LDA     TMPLOC                               GET THE SECTOR COUNTER
       3370    DF10 81 12                    CMPA #SECMAX                                 LOADED IN 18 SECTORS? (ONE TRACK)
       3371    DF12 22 22                    BHI     LDF36                                YES - EXIT
       3372    DF14 A7 03                    STA     $03,X                                NO - SAVE SECTOR NUMBER IN DSEC
       3373    DF16 CC 02 00                 LDD     #$0200                               GET FDC OP CODE (READ) AND DRIVE NUMBER (0)
       3374    DF19 A7 84                    STA     ,X                                   SAVE THEM IN DSKCON VARIABLES (BUG - SHOULD BE STD ,X)
       3375    DF1B 86 22                    LDA     #34                                  GET TRACK NUMBER (34)
       3376    DF1D A7 02                    STA     $02,X                                SAVE IT IN DSKCON VARIABLES TOO
       3377    DF1F 35 06                    PULS A,B                                     GET RAM LOAD ADDRESS
       3378    DF21 ED 04                    STD     $04,X                                AND SAVE IT IN THE DSKCON VARIABLES
       3379    DF23 8B 01                    ADDA #$01                                    ADD 256 (ONE SECTOR) TO RAM LOAD ADDRESS (SHOULD BE INCA)
       3380    DF25 34 06                    PSHS B,A                                     SAVE NEW RAM LOAD ADDRESS
       3381    DF27 AD 9F C0 04              JSR     [DCNVEC]                             GO READ A SECTOR
       3382    DF2B 6D 06                    TST     $06,X                                CHECK FOR ERRORS
       3383    DF2D 27 DA                    BEQ     LDF09                                KEEP READING IF NONE
       3384    DF2F 35 06          LDF36     PULS A,B                                     PULL LOAD ADDRESS OFF OF THE STACK
       3385    DF31 C6 28                    LDB     #2*20                                'IO' ERROR
       3386    DF33 7E AC 46                 JMP     LAC46                                JUMP TO ERROR SERVICING ROUTINE
       3387    DF36 35 06                    PULS A,B                                     PULL RAM LOAD ADDRESS OFF OF THE STACK
       3388    DF38 FC 26 00                 LDD     DOSBUF                               GET FIRST TWO BYTES OF RAM DATA
       3389    DF3B 10 83 4F 53              CMPD #'OS'                                   LOOK FOR 'OS' (OS9) AT START OF BUFFER
       3390    DF3F 10 27 46 BF              LBEQ DOSBUF+2                                IF 'OS' THEN BRANCH TO DATA LOADED IN RAM
       3391    DF43 7F 26 00                 CLR     DOSBUF                               * OTHERWISE CLEAR THE FIRST TWO
       3392
       3393    DF46 7F 26 01       DOSINI    CLR     DOSBUF+1                             * BYTES OF RAM DATA
       3394    DF49 7E A0 E8                 JMP     BAWMST                               JUMP TO BASIC'S WARM START
       3395
       3396    DF4C CC 3B 3B                 LDD     #$3B3B                               TWO RTI INSTRUCTIONS
       3397    DF4F FD 01 00                 STD     SW3VEC                               *
       3398    DF52 FD 01 02                 STD     SW3VEC+2                             * LOAD THE SWI2 AND SWI3 JUMP
       3399    DF55 FD 01 04                 STD     SW2VEC+1                             * VECTORS WITH RTIS
       3400    DF58 39             END       RTS
       3401
       3402                        * END OF THE DOS AND DOSINI COMMANDS - THE REST OF THE CODE
       3403                        * TO THE END OF THE DISK ROM ($DFFF) IS GARBAGE.
       3404                        * DOSBAS 1.1 = 167 WASTED BYTES
       3405
