|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.