Annotation of coco/mainsubs.src, revision 1.1.1.2

1.1       root        1:        PAGE
1.1.1.2 ! root        2:        ;SBTTL "--- MAIN LOOP SUPPORT ---"
1.1       root        3: 
                      4:        ; -----------------------
                      5:        ; FETCH A SHORT IMMEDIATE
                      6:        ; -----------------------
                      7: 
                      8: GETSHT:        JSR     NEXTPC          ; NEXT Z-BYTE IS
                      9:        STA     TEMP+1          ; THE LSB OF ARGUMENT
                     10:        CLR     TEMP            ; MSB IS ZERO
                     11:        RTS
                     12: 
                     13:        ; ----------------------
                     14:        ; FETCH A LONG IMMEDIATE
                     15:        ; ----------------------
                     16: 
                     17: GETLNG:        JSR     NEXTPC          ; NEXT Z-BYTE IS MSB
                     18:        PSHS    A               ; SAVE ON STACK
                     19:        JSR     NEXTPC          ; NOW GRAB LSB
                     20:        STA     TEMP+1          ; STORE IT
                     21:        PULS    A               ; RETRIEVE MSB
                     22:        STA     TEMP            ; AND STORE IT
                     23:        RTS
                     24: 
                     25:        ; ----------------
                     26:        ; FETCH A VARIABLE
                     27:        ; ----------------
                     28: 
                     29:        ; GET WITHIN AN OPCODE
                     30: 
                     31: VARGET:        TSTA                    ; IF NON-ZERO,
                     32:        BNE     GETVR1          ; ACCESS A VARIABLE
                     33:        JSR     POPSTK          ; ELSE TAKE VAR OFF STACK
                     34:        BRA     PSHSTK          ; WITHOUT ALTERING STACK
                     35: 
                     36: GETVAR:        JSR     NEXTPC          ; GRAB VAR-TYPE BYTE
                     37:        TSTA                    ; IF ZERO,
                     38:        BEQ     POPSTK          ; VALUE IS ON STACK
                     39: 
                     40:        ; IS VARIABLE LOCAL OR GLOBAL?
                     41: 
                     42: GETVR1:        CMPA    #16
                     43:        BHS     GETVRG          ; IT'S GLOBAL
                     44: 
                     45:        ; HANDLE A LOCAL VARIABLE
                     46: 
                     47: GETVRL:        DECA                    ; FORM A ZERO-ALIGNED INDEX
                     48:        ASLA                    ; WORD INDEX
                     49:        LDX     #LOCALS         ; INTO LOCAL VAR TABLE
                     50:        TFR     A,B             ; MOVE AND
                     51: GTVX:  ABX                     ; ADD INDEXING OFFSET
                     52:        LDD     ,X              ; FETCH VALUE
                     53:        STD     TEMP            ; AND RETURN IT
                     54:        RTS
                     55: 
                     56:        ; HANDLE A GLOBAL VARIABLE
                     57: 
                     58: GETVRG:        SUBA    #16             ; ZERO-ALIGN
                     59:        LDX     GLOBAL          ; BASE OF GLOBAL VAR TABLE
                     60:        TFR     A,B             ; CONVERT TO WORD-ALIGNED INDEX
                     61:        ABX                     ; BY ADDING OFFSET TWICE (CLEVER, EH?)
                     62:        BRA     GTVX            ; 2ND ADD ABOVE
                     63: 
                     64:        ; --------------
                     65:        ; RETURN A VALUE
                     66:        ; --------------
                     67: 
                     68:        ; RETURN FROM WITHIN OPCODE
                     69: 
                     70: VARPUT:        TSTA                    ; IF NON-ZERO
                     71:        BNE     PUTVR1          ; ACCESS A VARIABLE
                     72:        PULU    D               ; ELSE FLUSH TOP ITEM OFF STACK
                     73:        CMPU    #TOPSTA
                     74:        BHI     UNDER           ; WATCH FOR UNDERFLOW!
                     75:        BRA     PSHSTK          ; AND PUSH [TEMP] ONTO STACK
                     76: 
                     77:        ; RETURN A ZERO
                     78: 
                     79: RET0:  CLRA                    ; CLEAR MSB
                     80: 
                     81:        ; RETURN BYTE IN [A]
                     82: 
                     83: PUTBYT:        STA     TEMP+1          ; USE [A] AS LSB
                     84:        CLR     TEMP            ; ZERO MSB
                     85: 
                     86:        ; RETURN VALUE IN [TEMP]
                     87: 
                     88: PUTVAL:        LDX     TEMP            ; GET VALUE IN [TEMP]
                     89:        PSHS    X               ; AND HOLD ON TO IT
                     90:        JSR     NEXTPC          ; GET VAR-TYPE BYTE
                     91:        PULS    X               ; RETRIEVE VALUE
                     92:        STX     TEMP            ; PUT IT BACK IN [TEMP]
                     93:        TSTA                    ; IF TYPE-BYTE IS ZERO,
                     94:        BEQ     PSHSTK          ; VALUE GOES TO THE STACK
                     95: 
                     96:        ; LOCAL OR GLOBAL?
                     97: 
                     98: PUTVR1:        CMPA    #16
                     99:        BHS     PUTVLG          ; IT'S GLOBAL
                    100: 
                    101:        ; HANDLE A LOCAL VARIABLE
                    102: 
                    103: PUTVLL:        DECA
                    104:        ASLA
                    105:        TFR     A,B
                    106:        LDX     #LOCALS         ; INTO LOCAL VARIABLE TABLE
                    107: PTVX:  ABX
                    108:        LDD     TEMP
                    109:        STD     ,X
                    110:        RTS
                    111: 
                    112:        ; HANDLE A GLOBAL VARIABLE
                    113: 
                    114: PUTVLG:        SUBA    #16             ; ZERO-ALIGN
                    115:        LDX     GLOBAL          ; BASE OF GLOBAL VAR TABLE
                    116:        TFR     A,B             ; FORM WORD-ALIGNED INDEX
                    117:        ABX                     ; BY ADDING OFFSET TO BASE
                    118:        BRA     PTVX            ; TWICE
                    119: 
                    120:        ; --------------------
                    121:        ; PUSH [TEMP] TO STACK
                    122:        ; --------------------
                    123: 
                    124: PSHSTK:        LDD     TEMP
                    125: 
                    126:        ; PUSH [D] TO STACK
                    127: 
                    128: PSHDZ: PSHU    D
                    129:        CMPU    #ZSTACK
                    130:        BLO     OVER
                    131:        RTS
                    132: 
                    133:        ; -------------------------
                    134:        ; POP STACK, SAVE IN [TEMP]
                    135:        ; -------------------------
                    136: 
                    137: POPSTK:        PULU    D               ; PULL A WORD
                    138:        STD     TEMP            ; SAVE IT IN [TEMP]
                    139:        CMPU    #TOPSTA
                    140:        BHI     UNDER
                    141:        RTS
                    142: 
                    143:        ; *** ERROR #5 -- Z-STACK UNDERFLOW ***
                    144: 
                    145: UNDER: LDA     #5
                    146:        JMP     ZERROR
                    147: 
                    148:        ; *** ERROR #6 -- Z-STACK OVERFLOW ***
                    149: 
                    150: OVER:  LDA     #6
                    151:        JMP     ZERROR
                    152: 
                    153:        ; ---------------
                    154:        ; PREDICATE FAILS
                    155:        ; ---------------
                    156: 
                    157: PREDF: JSR     NEXTPC          ; GET 1ST BRANCH BYTE
                    158:        TSTA                    ; IF BIT 7 ISN'T SET,
                    159:        BPL     PREDB           ; DO THE BRANCH
                    160: 
                    161: PREDNB:        ANDA    #%01000000      ; ELSE TEST BIT 6
                    162:        BNE     PNBX            ; ALL DONE IF SET
                    163:        JSR     NEXTPC          ; ELSE SKIP OVER 2ND BRANCH BYTE
                    164: PNBX:  RTS                     ; BEFORE LEAVING
                    165: 
                    166:        ; ------------------
                    167:        ; PREDICATE SUCCEEDS
                    168:        ; ------------------
                    169: 
                    170: PREDS: JSR     NEXTPC
                    171:        TSTA                    ; IF BIT 7 IS SET,
                    172:        BPL     PREDNB          ; BRANCH ON PREDICATE FAILURE
                    173: 
                    174:        ; ----------------
                    175:        ; PERFORM A BRANCH
                    176:        ; ----------------
                    177: 
                    178: PREDB: BITA    #%01000000      ; LONG OR SHORT BRANCH?
                    179:        BEQ     PREDLB          ; LONG IF BIT 6 IS OFF
                    180:        ANDA    #%00111111      ; ELSE FORM SHORT OFFSET
                    181:        STA     TEMP+1          ; USE AS LSB OF BRANCH OFFSET
                    182:        CLR     TEMP            ; ZERO MSB OF OFFSET
                    183:        BRA     PREDB1          ; AND DO THE BRANCH
                    184: 
                    185:        ; HANDLE A LONG BRANCH
                    186: 
                    187: PREDLB:        ANDA    #%00111111      ; FORM MSB OF OFFSET
                    188:        BITA    #%00100000      ; CHECK SIGN OF 14-BIT VALUE
                    189:        BEQ     DOB2            ; IT'S POSITIVE
                    190:        ORA     #%11100000      ; ELSE EXTEND SIGN BITS
                    191: DOB2:  PSHS    A               ; SAVE MSB OF BRANCH
                    192:        JSR     NEXTPC          ; GRAB NEXT Z-BYTE
                    193:        STA     TEMP+1          ; USE AS LSB OF BRANCH
                    194:        PULS    A
                    195:        STA     TEMP            ; RETRIEVE MSB
                    196: 
                    197:        ; BRANCH TO Z-ADDRESS IN [TEMP]
                    198: 
                    199: PREDB1:        LDD     TEMP            ; IF OFFSET IS ZERO,
                    200:        LBEQ    ZRFALS          ; DO AN "RFALSE"
                    201:        SUBD    #1              ; IF OFFSET IS ONE,
                    202:        LBEQ    ZRTRUE          ; DO AN "RTRUE"
                    203: 
                    204: PREDB3:        SUBD    #1              ; D = OFFSET-2
                    205:        STD     TEMP            ; SAVE NEW OFFSET
                    206: 
                    207:        ; USE [VAL] TO HOLD TOP 9 BITS OF OFFSET
                    208: 
                    209:        STA     VAL+1
                    210:        CLRB
                    211:        ASLA                    ; EXTEND THE SIGN BIT
                    212:        ROLB                    ; SHIFT CARRY TO BIT 0 OF [B]
                    213:        STB     VAL             ; SAVE AS UPPER BYTE OF OFFSET
                    214: 
                    215:        LDA     TEMP+1          ; GET LOW BYTE OF OFFSET
                    216:        ANDCC   #%11111110      ; CLEAR CARRY
                    217:        ADCA    ZPCL            ; ADD LOW BYTE OF CURRENT ZPC
                    218:        BCC     PDB0            ; IF OVERFLOWED,
                    219: 
                    220:        INC     VAL+1           ; UPDATE
                    221:        BNE     PDB0            ; UPPER
                    222:        INC     VAL             ; 9 BITS
                    223: 
                    224: PDB0:  STA     ZPCL            ; LOW-BYTES CALCED
                    225: 
                    226:        LDD     VAL             ; IF 9 UPPER BITS ARE ZERO,
                    227:        BEQ     PDB1            ; NO NEED TO CHANGE PAGES
                    228: 
                    229:        LDA     VAL+1           ; ELSE ADD MIDDLE BYTES
                    230:        ANDCC   #%11111110      ; CLEAR CARRY
                    231:        ADCA    ZPCM
                    232:        STA     ZPCM
                    233:        LDA     VAL             ; NOW ADD THE TOP BITS
                    234:        ADCA    ZPCH            ; USING PREVIOUS CARRY
                    235:        ANDA    #%00000001      ; ISOLATE BIT 0
                    236:        STA     ZPCH
                    237:        CLR     ZPCFLG          ; CHANGED PAGES
                    238: PDB1:  RTS
                    239: 
1.1.1.2 ! root      240:        ;END
1.1       root      241: 

unix.superglobalmegacorp.com