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