Annotation of coco/mainsubs.src, revision 1.1

1.1     ! root        1:        PAGE
        !             2:        SBTTL "--- MAIN LOOP SUPPORT ---"
        !             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: 
        !           240:        END
        !           241: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.