'HEAD' STORE CODE GENERATION C EDIT DATE 05FEB79 16:11 C SOURCE FILE ARGENAJH.FS C AUTHOR A. J. HOWARD C CLUSTER 19 'OUTFILE' ARAGENAJH.FR N OVERLAY OLARA SUBROUTINE ARAGEN C OP LOGOS OPERATOR C LEFT STACK POINTER TO LEFT OPERAND C RIGHT STACK POINTER TO RIGHT OPERAND 'INCLUDE' LOGOSAJH.IN, 'INCLUDE' NLISTCFTM.IN, 'INCLUDE' REGSJHP.IN, 'INCLUDE' RMCODES.IN, 'INCLUDE' STKDEFA.IN, 'INCLUDE' STKDEFB.IN, 'INCLUDE' STKDEFE.IN, 'INCLUDE' WFLAGSJHP.IN, 'INCLUDE' GENCOMAJH.IN, INTEGER RET, RET1, RET2 INTEGER TRANS INTEGER BCODE (3, 3) INTEGER NLOPS LOGICAL NLTEST DATA BCODE / 169, 173, 165, ^ // LDAI LDAABS LDAZP 162, 174, 166, ^ // LDXI LDXABS LDXZP 160, 172, 164/ // LDYI LDYABS LDYZP 'EJECT' IF (MORE) GO TO 54 IF (RSTKX .NE. 0) ^ CALL REGSRC (5, NAMEX (RSTKX), 0, 0, 0, 0, 0) 1000 TS = LEFT 'DO' COL = 4 // ASSUME NOT REGISTER NLX = NAMEX (TS) 'IF' (NLTEST (NLX, REGBIT)) 'IF' (MODE (TS) .EQ. SPMODE) COL = NLOPS (REGNUM, NLX) 'ELSE' COL = 5 // 'DP' AREG 'ENDIF' 'ELSE' C CHECK FOR STACK/STACK POINTER REF 'IF' (NLX .EQ. STPTRX) COL = 6 'ELSE' 'IF' (SUBX (TS) .EQ. STPTRX) COL = 7 IF (MODE (TS) .EQ. DPMODE) COL = 8 'ENDIF' 'ENDIF' 'ENDIF' 'WHILE' (TS .EQ. LEFT) ROW = COL TS = RIGHT 'END' ASSIGN 1 TO RET GO TO ( 2, 2, 2, 40, 50, 2, 2, 2), ROW 1 RETURN 2 MORE = .TRUE. RETURN 'EJECT' 40 GO TO (41, ^ // CORE -> AREG 42, ^ // CORE -> XREG 43, ^ // CORE -> YREG 44, ^ // CORE -> CORE 45, ^ // CORE -> 'DP' AREG 46, ^ // CORE -> STK PTR 47, ^ // CORE -> [STK PTR] 48 ^ // CORE -> 'DP' [STK PTR] ), COL C CORE -> AREG 41 CALL GENLA GO TO 1 C CORE -> XREG 42 CALL GENLXY (XREG) GO TO 1 C CORE -> YREG 43 CALL GENLXY (YREG) GO TO 1 C CORE -> CORE 44 'IF' (MODE (RIGHT) .EQ. DPMODE ^ .AND. NAMEX (LEFT) .EQ. NAMEX (RIGHT)) CALL GENLXY (XREG) THIS = HI CALL GENDO THIS = LOW GO TO 54 'ENDIF' CALL GENLA 440 SIDE = RIGHT CALL GENDO // STORE CALL REGMAN (SETREG, AREG, RSTKX) 'IF' (MODE (RIGHT) .EQ. SPMODE) MODE (LEFT) = SPMODE GO TO 1 'ENDIF' SIDE = LEFT CALL GENMOV // LOAD SIDE = RIGHT CALL GENDO // STORE MODE (LEFT) = DPMODE GO TO 1 C CORE -> 'DP' AREG C DO IT LOW/HI: LOW -> X, HI -> A 45 CALL GENLXY (XREG) THIS = HI CALL GENDO MODE (LEFT) = DPMODE GO TO 1 'EJECT' C CORE -> STK PTR => CORE -> X -> S 46 CALL GENLXY (XREG) CALL BLDBLK (154, WF4) // TXS ACTLO = XREG GO TO 1 C CORE -> [STK PTR] => CORE -> A -> [S] 47 CALL GENLA CALL BLDBLK (72, WF4) // PHA ACTLO = AREG GO TO 1 C CORE -> 'DP' [STK PTR] C DO IT HI/LOW 48 THIS = HI CALL GENLA CALL BLDBLK (72, WF4) // PHA ACTHI = 0 THIS = LOW CALL GENDO CALL BLDBLK (72, WF4) // PHA ACTLO = 0 GO TO 1 'EJECT' 50 'IF' (STAREG .EQ. 0) STAREG = LEFT ACTHI = AREG ACTLO = XREG 'ENDIF' GO TO (51, ^ // 'DP' AREG -> AREG 52, ^ // 'DP' AREG -> XREG 53, ^ // 'DP' AREG -> YREG 54, ^ // 'DP' AREG -> CORE 55, ^ // 'DP' AREG -> 'DP' AREG 56, ^ // 'DP' AREG -> STK PTR 57, ^ // 'DP' AREG -> [STK PTR] 58 ^ // 'DP' AREG -> 'DP' [STK PTR] ), COL C 'DP' AREG -> AREG 51 CONTINUE C 'DP' AREG -> XREG 52 CONTINUE C 'DP' AREG -> YREG 53 STATUS (ACTHI) = 0 ACTHI = 0 NAMEX (LEFT) = REGS (ACTLO) MODE (LEFT) = SPMODE GO TO 1000 C 'DP' AREG -> CORE 54 MORE = .FALSE. IF (MODE (RIGHT) .EQ. SPMODE) GO TO 53 C 'DP' AREG -> 'DP' CORE 'IF' (ACTHI .EQ. AREG) C DO IT HI/LOW THIS = HI OTHER = LOW 'ENDIF' IF (OPCODE (RIGHT) .EQ. LDAZP .OR. OPCODE (RIGHT) .EQ. LDAABS) ^ EZSTA = .TRUE. GO TO 440 'EJECT' C 'DP' AREG -> 'DP' AREG 55 'IF' (ACTHI .EQ. AREG) 'IF' (ACTLO .GT. YREG) CALL BLDOP (166, WF5, 0, REGS (ACTLO), WF7) // LDXZP CALL BLDOP ( 9, WF5, 0, NULLX, WF7) // ORA =0 'ENDIF' 'ELSE' 'IF' (ACTHI .EQ. XREG) 'IF' (ACTLO .EQ. AREG) CALL REGMAN (CTFREE, ACTLO, 1) CALL BLDOP (STAZP, WF5, 0, REGS (ACTLO), WF7) 'ENDIF' CALL BLDOP (134, WF5, 1, REGS (ACTLO), WF7) // STXZP CALL BLDOP (166, WF5, 0, REGS (ACTLO), WF7) // LDXZP CALL BLDOP (LDAZP, WF5, 1, REGS (ACTLO), WF7) 'ELSE' C ACTHI = CT, ACTLO = AREG CALL REGMAN (SAVREG, XREG, DUMMY) CALL BLDBLK (TAX, WF4) CALL BLDOP (LDAZP, WF5, 1, REGS (ACTHI), WF7) 'ENDIF' 'ENDIF' STATUS (ACTLO) = 0 STATUS (ACTHI) = 0 ACTLO = XREG ACTHI = AREG GO TO 1 C 'DP' AREG -> STK PTR 56 CONTINUE C 'DP' AREG -> [STK PTR] 57 GO TO 51 'EJECT' C 'DP' AREG -> 'DP' [STK PTR] C MUST BE DONE HI/LO TO GET ONTO STACK 58 'IF' (ACTHI .GT. YREG) C SAVE LOW THEN DO CORE -> 'DP' [STKPTR] CALL BLDOP (STAZP, WF5, 0, REGS (ACTHI), WF7) NAMEX (LEFT) = REGS (ACTHI) STAREG = 0 ACTHI = 0 ACTLO = 0 GO TO 48 'ENDIF' 'IF' (ACTHI .EQ. AREG) CALL BLDBLK (72, WF4) // PHA 'IF' (ACTLO .EQ. XREG) CALL BLDBLK (TXA, WF4) 'ELSE' CALL BLDOP (LDAZP, WF5, 0, REGS (ACTLO), WF7) 'ENDIF' 'ELSE' C ACTHI IS XREG 'IF' (ACTLO .EQ. AREG) CALL REGMAN (CTFREE, ACTLO, 1) CALL BLDOP (STAZP, WF5, 0, REGS (ACTLO), WF7) 'ENDIF' C ACTLO IS CT CALL BLDBLK (TXA, WF4) CALL BLDBLK ( 72, WF4) // PHA CALL BLDOP (LDAZP, WF5, 0, REGS (ACTLO), WF7) 'ENDIF' CALL BLDBLK (72, WF4) // PHA STATUS (ACTHI) = 0 ACTHI = 0 STATUS (ACTLO) = 0 ACTLO = 0 GO TO 1 END 'OUTFILE' ARBGENAJH.FR N OVERLAY OLARB SUBROUTINE ARBGEN C OP LOGOS OPERATOR C LEFT STACK POINTER TO LEFT OPERAND C RIGHT STACK POINTER TO RIGHT OPERAND 'INCLUDE' LOGOSAJH.IN, 'INCLUDE' NLISTCFTM.IN, 'INCLUDE' REGSJHP.IN, 'INCLUDE' RMCODES.IN, 'INCLUDE' STKDEFA.IN, 'INCLUDE' STKDEFB.IN, 'INCLUDE' STKDEFE.IN, 'INCLUDE' WFLAGSJHP.IN, 'INCLUDE' GENCOMAJH.IN, INTEGER RET, RET1, RET2 INTEGER TRANS ASSIGN 1 TO RET MORE = .FALSE. GO TO ( 10, 20, 30, 6, 6, 60, 70, 80), ROW 1070 CALL FAULTP (70) // ILLEGAL STKPTR USEAGE 1 RETURN 6 CALL FATAL (6) 54 MORE = .TRUE. RETURN 'EJECT' 10 GO TO ( 1, ^ // AREG -> AREG 12, ^ // AREG -> XREG 13, ^ // AREG -> YREG 14, ^ // AREG -> CORE 15, ^ // AREG -> 'DP' AREG 16, ^ // AREG -> STK PTR 17, ^ // AREG -> [STK PTR] 1070 ^ // AREG -> 'DP' [STK PTR] ), COL C AREG -> AREG => NO CODE C AREG -> XREG 12 CALL GENTRA (AREG, XREG) GO TO 1 C AREG -> YREG 13 CALL GENTRA (AREG, YREG) GO TO 1 C AREG -> CORE 14 INREG = AREG TRANS = 0 140 SIDE = RIGHT CALL GENDO STATUS (INREG) = 0 CALL REGMAN (SETREG, INREG, RSTKX) IF (MODE (RIGHT) .EQ. SPMODE) GO TO 1 SIDE = LEFT CALL GENMOV SIDE = RIGHT OPCODE (RIGHT) = OPCODE (RIGHT) - TRANS CALL GENDO MODE (LEFT) = DPMODE GO TO 1 C AREG -> 'DP' AREG => A -> X -> 'DP' A 15 CALL GENTRA (AREG, XREG) GO TO 25 C AREG -> STK PTR => A -> X -> S 16 CALL GENTRA (AREG, XREG) GO TO 26 C AREG -> [STK PTR] 17 CALL BLDBLK (72, WF4) // PHA ACTLO = AREG GO TO 1 C AREG -> 'DP' [STK PTR] => ERROR 'EJECT' 20 GO TO (21, ^ // XREG -> AREG 1, ^ // XREG -> XREG 23, ^ // XREG -> YREG 24, ^ // XREG -> CORE 25, ^ // XREG -> 'DP' AREG 26, ^ // XREG -> STK PTR 27, ^ // XREG -> [STK PTR] 1070 ^ // XREG -> 'DP' [STK PTR] ), COL C XREG -> AREG 21 CALL GENTRA (XREG, AREG) GO TO 1 C XREG -> XREG => NO CODE C XREG -> YREG => X -> A -> Y 23 CALL GENTRA (XREG, AREG) GO TO 13 C XREG -> CORE C CHECK DIRECT STORE OR GO THROUGH A 24 TRANS = 1 CALL GENSXY (XREG, TRANS) INREG = XREG GO TO 140 C XREG -> 'DP' AREG 25 ACTLO = XREG ACTHI = AREG CALL BLDOP (169, WF5, 0, NULLX, WF7) // LDA =0 GO TO 1 C XREG -> STK PTR 26 CALL BLDBLK (154, WF4) //TXS ACTLO = XREG GO TO 1 C XREG -> [STK PTR] => X -> A -> [S] 27 CALL GENTRA (XREG, AREG) GO TO 17 C XREG -> 'DP' [STK PTR] => ERROR 'EJECT' 30 GO TO (31, ^ // YREG -> AREG 32, ^ // YREG -> XREG 1, ^ // YREG -> YREG 34, ^ // YREG -> CORE 35, ^ // YREG -> 'DP' AREG 36, ^ // YREG -> STK PTR 37, ^ // YREG -> [STK PTR] 1070 ^ // YREG -> 'DP' [STK PTR] ), COL C YREG -> AREG 31 CALL GENTRA (YREG, AREG) GO TO 1 C YREG -> XREG => Y -> A -> X 32 CALL GENTRA (YREG, AREG) GO TO 12 C YREG -> YREG => NO CODE C YREG -> CORE C CHECK DIRECT STORE OR GO THROUGH A 34 TRANS = -1 CALL GENSXY (YREG, TRANS) INREG = YREG GO TO 140 C YREG -> 'DP' AREG => Y -> A -> 'DP' A 35 CALL GENTRA (YREG, AREG) GO TO 15 C Y -> STK PTR => Y -> A -> X -> S 36 CALL GENTRA (YREG, AREG) GO TO 16 C Y -> [STK PTR] => Y -> A -> [S] 37 CALL GENTRA (YREG, AREG) GO TO 17 C YREG -> 'DP' [STK PTR] => ERROR 'EJECT' C GET STK PTR INTO XREG 60 CALL REGMAN (SAVREG, XREG, DUMMY) CALL BLDBLK (186, WF4) // TSX ACTLO = XREG GO TO (21, ^ // STK PTR -> AREG 1, ^ // STK PTR -> XREG 23, ^ // STK PTR -> YREG 24, ^ // STK PTR -> CORE 25, ^ // STK PTR -> 'DP' AREG 1, ^ // STK PTR -> STK PTR 27, ^ // STK PTR -> [STK PTR] 1070 ^ // STK PTR -> 'DP' [STK PTR] ), COL C STK PTR -> AREG => S -> X -> A C STK PTR -> XREG C STK PTR -> YREG => STK PTR -> X -> Y C STK PTR -> CORE => S -> X -> CORE C STK PTR -> 'DP' AREG => S -> X -> 'DP' A C STK PTR -> STK PTR => NO CODE C STK PTR -> [STK PTR] => S -> X -> A -> [S] C STK PTR -> 'DP' [STK PTR] => ERROR 'EJECT' C [STK PTR] -> AREG 70 CALL REGMAN (SAVREG, AREG, DUMMY) CALL BLDBLK (104, WF4) // PLA ACTLO = AREG GO TO ( 1, ^ // [STK PTR] -> AREG 12, ^ // [STK PTR] -> XREG 13, ^ // [STK PTR] -> YREG 14, ^ // [STK PTR] -> CORE 15, ^ // [STK PTR] -> 'DP' AREG 16, ^ // [STK PTR] -> STK PTR 1, ^ // [STK PTR] -> [STK PTR] 1070 ^ // [STK PTR] -> 'DP' [STK PTR] ), COL C [STK PTR] -> AREG C [STK PTR] -> XREG => [S] -> A -> X C [STK PTR] -> YREG => [S] -> A -> Y C [STK PTR] -> CORE => [S] -> A -> CORE C [STK PTR] -> 'DP' AREG => [S] -> A -> 'DP' A C [STK PTR] -> STK PTR => [S] -> A -> X -> S C [STK PTR] -> [STK PTR] => NO CODE C [STK PTR] -> 'DP' [STK PTR] => ERROR 'EJECT' C GET 'DP' [STK PTR] INTO 'DP' AREG C 80 CALL REGMAN (SAVREG, AREG, DUMMY) CALL BLDBLK (104, WF4) // PLA CALL GENTRA (AREG, XREG) CALL BLDBLK (104, WF4) // PLA ACTHI = AREG GO TO (1070, ^ // 'DP' [STK PTR] -> AREG 1070, ^ // 'DP' [STK PTR] -> XREG 1070, ^ // 'DP' [STK PTR] -> YREG 54, ^ // 'DP' [STK PTR] -> CORE 1, ^ // 'DP' [STK PTR] -> 'DP' AREG 1070, ^ // 'DP' [STK PTR] -> STK PTR 1070, ^ // 'DP' [STK PTR] -> [STK PTR] 1 ^ // 'DP' [STK PTR] -> 'DP' [STK PTR] ), COL C 'DP' [STK PTR] -> AREG => ERROR C 'DP' [STK PTR] -> XREG => ERROR C 'DP' [STK PTR] -> YREG => ERROR C 'DP' [STK PTR] -> CORE => 'DP' [S] -> 'DP' A -> CORE C 'DP' [STK PTR] -> 'DP' AREG => [S] -> A -> X, [S] -> A C 'DP' [STK PTR] -> STK PTR => ERROR C 'DP' [STK PTR] -> [STK PTR] => ERROR C 'DP' [STK PTR] -> 'DP' [STK PTR] => ERROR END