1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-18 01:02:15 +00:00
PDP-10.its/src/ucode/basic.23
Lars Brinkhoff 6d577568a2 KL10 microcode.
Plus assorted KL10-related documents.
2018-06-12 07:58:19 +02:00

690 lines
18 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.TOC "THE INSTRUCTION LOOP"
;INSTRUCTION DECODE, EA COMPUTATION, AND OPERAND FETCH
; IN GENERAL, AN INSTRUCTION IS STARTED AT XCTGO.
; AT THIS TIME THE INSTRUCTION IS IN ARX AND IR, AND PC HAS ITS ADDRESS.
; THE DRAM OUTPUTS AND "AC" BITS WILL SETTLE DURING THIS
; MICROINSTRUCTION, AND WILL BE LATCHED BY THE CLOCK WHICH ENDS
; THE CYCLE. XCTGO DISPATCHES ON THE STATE OF THE
; INDIRECT AND INDEX BITS OF THE ARX (EA MOD DISP) TO COMPEA OR
; ONE OF THE THREE LOCATIONS FOLLOWING IT.
; IF INDIRECT IS SPECIFIED, THE INDIRECT POINTER IS FETCHED (AT
; COMPEA+2 OR +3 DEPENDING ON WHETHER INDEXING IS ALSO SPECIFIED).
; WE WAIT FOR IT AT INDRCT, AND THEN LOOP BACK TO COMPEA. WHEN NO
; INDIRECT IS CALLED FOR, WE COMPUTE THE INSTRUCTION'S EFFECTIVE ADDRESS
; (EA) AT COMPEA OR COMPEA+1 (DEPENDING ON WHETHER INDEXING IS CALLED
; FOR), AND PERFORM THE FUNCTION "A READ", WHOSE OPERATION DEPENDS
; ON THE DRAM A FIELD, AS FOLLOWS:
;
; MACRO A-FLD MEM FUNCTION VMA DISPATCH
; I 0 NONE AD(=EA) DRAM J
; I-PF 1 FETCH PC+1 DRAM J
; 2 NONE AD 42
; W 3 WR TST AD 43
; R 4 READ AD 44
; R-PF 5 READ AD 45
; RW 6 READ/WR TST AD 46
; RPW 7 RD-PSE/WR TST AD 47
;
; A FIELD VALUES 0 AND 1 ARE USED FOR INSTRUCTIONS WHICH NEITHER
; READ NOR WRITE THE CONTENTS OF EA (IMMEDIATE-MODE INSTRUCTIONS,
; JUMPS, ETC). THESE DISPATCH FROM "A READ" DIRECTLY TO THE MICROCODE
; WHICH HANDLES THE INSTRUCTION. IF THE A FIELD CONTAINS 1, "A READ"
; CAUSES A PREFETCH (FROM PC+1), SO THAT THE MBOX CAN WORK ON GETTING
; THE NEXT INSTRUCTION INTO ARX WHILE THE EBOX PERFORMS THIS ONE.
; IF THE A FIELD CONTAINS 3, THE MBOX PERFORMS A PAGING CHECK ON
; EA, AND CAUSES A PAGE FAIL IF THAT LOCATION IS NOT WRITABLE.
; THE MICROCODE GOES TO 43 TO WAIT FOR COMPLETION OF THE PAGE CHECK,
; AND AT THAT LOCATION LOADS AC INTO AR. THE WRITABILITY OF EA IS
; VERIFIED AT THIS TIME TO PREVENT INCORRECTLY SETTING FLAGS OR
; THE PROCESSOR STATE IF THE INSTRUCTION WILL BE ABORTED BY PAGE
; FAILURE. LOCATION 43 THEN DISPATCHES TO THE HANDLER FOR THE
; CURRENT INSTRUCTION.
; A FIELD VALUES 4 TO 7 PERFORM READS FROM EA. 6 AND 7 ALSO TEST
; THE WRITABILITY OF THE LOCATION, AND 7 PERFORMS THE FIRST HALF OF
; A READ-PAUSE-WRITE CYCLE IF EA IS AN UN-CACHED ADDRESS. THE DISPATCH
; IS TO 40+A, WHERE WE WAIT FOR MEMORY DATA TO ARRIVE IN AR. IF THE A
; FIELD WAS 5, WE PREFETCH FROM PC+1 AS SOON AS THE DATA ARRIVES.
; IN ANY CASE, WE DISPATCH ACCORDING TO THE DRAM J FIELD TO THE
; HANDLER FOR THE INSTRUCTION.
; IF A PAGE FAIL OCCURS AT ANY TIME (EITHER IN THIS CODE OR DURING
; INSTRUCTION EXECUTION) THE MICROPROCESSOR TRAPS TO CRAM LOCATION
; 1777, WHERE IT CAUSES A PAGE FAIL TRAP.
; MOST INSTRUCTIONS (THE MOVE, HALFWORD, AND BOOLEAN GROUPS,
; PLUS ADD AND SUB) ARE PERFORMED BY HANDLERS CONSISTING OF ONE OR
; TWO MICROINSTRUCTIONS WHICH LEAVE THE RESULT IN AR, AND COMPLETE
; BY INVOKING THE "EXIT" MACRO. EXIT USES THE MEM/B WRITE FUNCTION
; TO BEGIN A STORE TO MEMORY FOR THOSE MODES IN WHICH THE RESULT
; GOES TO MEMORY, AND DISP/DRAM B TO GET TO ONE OF THE MICROINSTRUCTIONS
; FOLLOWING ST0. THIS CODE DEPENDS ON A CERTAIN AMOUNT OF CORRELATION
; BETWEEN THE DRAM A AND B FIELDS. IN PARTICULAR, STAC (STORE AC)
; ASSUMES THAT A PREFETCH HAS OCCURRED, WHILE THE OTHERS ASSUME THAT
; NO PREFETCH HAS OCCURED. THUS NORMAL AND IMMEDIATE MODES, WHOSE
; RESULTS GO ONLY TO AC, MUST PREFETCH IN THE DRAM A FIELD, WHILE
; MEM, BOTH, AND SELF MODES, WHOSE RESULTS GO TO MEMORY, MUST NOT.
; (THIS RESTRICTION IS AVOIDED FOR THOSE INSTRUCTIONS WHICH NEVER
; PREFETCH -- IN MUL, DIV, AND IDIV BY USE OF THE EXIT TO ST2AC,
; AND IN IMUL AND THE SINGLE PRECISION FLOATING POINT
; INSTRUCTIONS BY A RESTRICTED EXIT TO ST6.)
; ANOTHER LARGE SET OF INSTRUCTIONS (SKIP, AOS, SOS, JUMP, AOJ,
; SOJ, AOBJ, CAI, CAM, AND THE TEST GROUP) KNOWS WHERE TO PUT THE
; RESULTS WITHOUT MODE INFORMATION, AND THEY USE THE DRAM B FIELD TO
; DETERMINE WHETHER TO SKIP OR JUMP, AS A FUNCTION OF THEIR OPERANDS.
; SKIP, AOS, AND SOS ARE CONSIDERED SELF-MODE INSTRUCTIONS,
; AND AFTER MAKING THE FETCH DECISION (AND RE-WRITING MEMORY, IN
; THE CASE OF AOS OR SOS), JUMP TO STSELF TO DECIDE WHETHER OR NOT
; TO PUT THE RESULT ALSO IN AC. THE OTHER INSTRUCTIONS OF THIS SET
; JUMP TO STORAC OR NOP AFTER MAKING THE FETCH DECISION, DEPENDING
; ON WHETHER OR NOT THE OPCODE DEFINITION REQUIRES MODIFICATION OF AC.
; (NOTE THE DIFFERENCE BETWEEN STAC AND FINI ON THE ONE HAND,
; AND STORAC AND NOP ON THE OTHER -- STORAC AND NOP MUST BE USED WHEN
; THE NEXT INSTRUCTION FETCH OCCURS ON THE PRECEDING EBOX CYCLE, BECAUSE
; NICOND MUST NOT IMMEDIATELY FOLLOW A FETCH (ONE CYCLE REQUIRED FOR
; VMA AC REF TO MAKE IT THROUGH THE NICOND LOGIC), STAC AND FINI ARE
; USED WHEN THERE HAS BEEN AN INTERVENING CYCLE.)
.TOC "NEXT INSTRUCTION DISPATCH"
;START BY PUTTING PC WORD IN AR, JUMP HERE
0:
START: SET FLAGS_AR,BR/AR,J/BRJMP ;LOAD UP FLAGS
CONT: VMA/PC,FETCH,J/XCTW ;HERE TO CONTINUE FROM PC
; DISP/NICOND (THE "NXT INSTR" MACRO) BRINGS US TO ONE OF THE
; LOCATIONS FOLLOWING "NEXT". PC HAS BEEN UPDATED TO ADDRESS THE NEXT
; INSTRUCTION IN THE NORMAL FLOW, AND IF IT IS FROM MEMORY
; (AS OPPOSED TO AC'S), THE INSTRUCTION IS IN ARX AND IR.
; THE NICOND DISPATCH IS PRIORITY ENCODED, AS FOLLOWS:
; [FOR FULL DETAILS, SEE PRINT CON2]
;(1) IF PI CYCLE IS TRUE, GO TO NEXT FOR SECOND HALF
; OF STANDARD OR VECTOR INTERRUPT.
;(2) IF THE RUN FLOP (CON RUN) IS OFF, GO TO NEXT+2, FROM WHICH THE
; MICROCODE WILL ENTER THE HALT LOOP TO WAIT FOR THE CONSOLE TO RESTART
; INSTRUCTION PROCESSING.
;(3) IF THE METER HAS A REQUEST, GO TO NEXT+4 (MTRINT) TO SERVE IT.
;(4) IF THE PI SYSTEM HAS A REQUEST READY, GO TO NEXT+6 (INTRPT)
; TO START A PI CYCLE.
;(5) IF CON UCODE STATE 05 (TRACK EN) IS SET, GO TO NEXT+10 OR 11.
; THIS FLOP IS ENTIRELY UNDER CONTROL OF THE MICROCODE, AND IS ONLY
; USED FOR THE SPECIAL STATISTICS-GATHERING MICROCODE.
;(6) IF THE LAST INSTRUCTION SET A TRAP FLAG, GO TO NEXT+13 OR +17,
; IT DOESN'T MATTER WHICH.
;(7) IF VMA CONTAINS AN AC ADDRESS, IMPLYING THAT THE NEXT
; INSTRUCTION IS TO COME OUT OF FAST MEMORY, GO TO NEXT+16 TO GET IT.
;(10) --NORMAL CASE-- THE INSTRUCTION IS IN ARX, READY TO GO, GO
; TO NEXT+12 (XCTGO).
=11*0000 ;USE LOC'NS INACCESSIBLE TO DRAM
NEXT: SET PI CYCLE,GEN FE, ;2ND PART OF INTERRUPT
BYTE DISP,J/PICYC2 ;SKIP IF VECTOR INT
=0010 AR_0S,SET HALTED,J/HALT1 ;HERE IF RUN FLOP OFF
=0100
MTRINT: CLR ACCOUNT EN,J/MTRREQ ;HERE IF METER REQUEST UP
AR_EBUS,SC_#,#/2,J/PICYC1 ;HERE IF TAKE INTRPT DOESNT FIND
=0110 ; A METER REQUEST
INTRPT: AR_EBUS,SC_#,#/2,J/PICYC1 ;HERE IF INTERRUPT PENDING
.IF/TRACKS
=1000 AR_TRX+1,GEN CRY18,SKP CRY0,J/TRK1 ;HERE TO STORE PC BEFORE
AR_TRX+1,GEN CRY18,SKP CRY0,J/TRK1 ; EXECUTING NEXT INSTR
.ENDIF/TRACKS
.IF/OP.CNT
=1000 SC_#,#/9.,SKP USER,J/OPCT1 ;COUNT THIS INSTR
SC_#,#/9.,SKP USER,J/OPCT1
.ENDIF/OP.CNT
.IF/OP.TIME
=1000 AR_2,CLR TRK+PA EN,J/OPTM1 ;TIME OUT THIS INSTR
AR_2,CLR TRK+PA EN,J/OPTM1
.ENDIF/OP.TIME
;-- THE NICOND DISPATCH BLOCK CONTINUES ON THE NEXT PAGE --
;-- NICOND DISPATCH CONTINUED --
=1010
XCTGO: BRX/ARX,SET ACCOUNT EN, ;SAVE INSTR, ENABLE ACCOUNTING,
EA MOD DISP,J/COMPEA,AR_1S ;GO CALCULATE EA, -1 FOR SOJ HACK
.IFNOT/ONE PROCEED
TRAP: VMA_420+TRAP,J/TRAPX ;HERE IF TRAP BITS SET
.IF/ONE PROCEED
TRAP: GET ECL EBUS,SC_1,J/TR3CHK ;TRAP, CHECK FOR ONE PROCEED
.ENDIF/ONE PROCEED
=1110 ARX_FM(VMA),TIME/3T,LOAD IR,J/XCTGO ;HERE IF INSTR IS IN FM
.IFNOT/ONE PROCEED
VMA_420+TRAP,J/TRAPX ;HERE IF TRAP BITS SET
.IF/ONE PROCEED
ARX_FM(VMA),TIME/3T,LOAD IR, ;HERE IF TRAP AND VMA->ACS
J/TRAP ;FETCH THE INSTR THEN TRAP
.ENDIF/ONE PROCEED
.IF/ONE PROCEED
;HERE ON TRAPS, WITH INSTRUCTION IN ARX AND IR, 1 IN SC,
;AND ECL EBUS GRABBED. UNFORTUNATELY THE HARDWARE CAREFULLY
;CLEARS THE TRAP BITS IN THE PC WORD ON A NICOND, BUT
;WE CAN USE A DIAGNOSTIC FUNCTION TO READ THE TRAP CYC BITS (SCD4).
;THE "ADDRESS BREAK INHIBIT" HAIR (SCD5) IS USED TO
;DETECT WHEN AN INSTRUCTION IS COMPLETED.
;IF THIS IS A TRAP 3, AND SCD ADDR BRK CYC IS TRUE, WE ARE
;IN THE MIDDLE OF A ONE-PROCEED, SO SUPPRESS THE TRAP.
;SCD ADDR BRK CYC IS ON WHEN NICOND IS DONE WITH
;ADR BRK INH SET IN THE PC FLAGS (I.E. JUST STARTING
;OR RE-STARTING THE INSTRUCTION BEING ONE-PROCEEDED.)
TR3CHK: AR03-04_SCD TRAP CYC
VMA_420+TRAP,SH DISP,J/TR3DSP ;VMA -> TRAP INST, CHECK TRAP NUMBER
=11100
TR3DSP:
=01
REL ECL EBUS,J/TRAPX ;TRAP 1 - TAKE TRAP
REL ECL EBUS,J/TRAPX ;TRAP 2 - TAKE TRAP
AR05_SCD ADDR BRK CYC ;TRAP 3 - CHECK FOR ONE PROCEED
GEN P AND SC,SKP SCAD NE ;SKIP IF ONE-PROCEEDING
=1***0
REL ECL EBUS,J/TRAPX ;NO, TAKE THE TRAP
REL ECL EBUS ;YES, DO THE INSTR THEN
TRAP3,J/XCTGO ;ARRANGE FOR ANOTHER TRAP
;WHEN THE INSTRUCTION COMPLETES
.ENDIF/ONE PROCEED
;HERE ON TRAPS, VMA SETUP WITH 420+TRAP CODE
TRAPX: LOAD ARX,PT REF ;GET AND XCT TRAP INSTR
SET PC+1 INH ;DON'T INCREMENT PC FOR THIS INSTR
;HERE AFTER FETCHING INSTR TO BE EXECUTED
XCTW: ARX_MEM,LOAD IR,J/XCTGO ;GET INSTR TO XCT
.TOC "EFFECTIVE ADDRESS COMPUTATION AND OPERAND FETCH"
;COME HERE WITH -1 IN AR IF YOU EXPECT SOJ TO WORK!
=11***00 ;HERE WITH XR CALC IN PROG
COMPEA: AR_ARX (AD),A READ, ;NO MOD, GET OPERAND IF ANY
MQ_AR ;SOJ SERIES EXPECTS -1 IN MQ
AR_ARX+XR,A READ, ;INDEXED, NO @
MQ_AR ;SOJ SERIES EXPECTS -1 IN MQ
GEN ARX,A INDRCT, ;DO INDIRECT, NO INDEX
SKP INTRPT,J/INDRCT
GEN ARX+XR,A INDRCT, ;BOTH @ AND XR
SKP INTRPT,J/INDRCT
=11****0
INDRCT: ARX_MEM,J/INDLP ;GET INDIRECT POINTER, EVAL
TAKINT: ARX_MEM,TAKE INTRPT ;INTERRUPT DURING INDIRECT
;APPARENTLY A INDRCT AT COMPEA+2/+3 CAN
; CAUSE AR AS WELL AS ARX TO BE CLOBBERED BY ARX_MEM.
;HENCE WE MUST RESTORE THE -1 THAT THE SOJ SERIES DEPENDS ON.
INDLP: EA MOD DISP,AR_1S,J/COMPEA ;EVALUATE POINTER
.TOC "WAIT FOR (E)"
;THE EXECUTE CODE FOR EACH INSTRUCTION IS ENTERED WITH
; THE OPCODE AND AC # IN BRX AND IR, THE LAST INDIRECT WORD
; IN ARX, AND AR AND VMA SETUP AS A FUNCTION OF THE A
; FIELD OF THE DISPATCH RAM. A PREFETCH IS IN PROGRESS IF THE
; DRAM A FIELD WAS 1 OR 5 (OR IF IR CONTAINS "JRST 0,").
;ON "A READ", THE HARDWARE DISPATCHES TO THE EXECUTE CODE FOR
; THE INSTRUCTION IF THE DRAM A FIELD IS 0 OR 1. IF THE A FIELD
; CONTAINS 2-7, THE HARDWARE DISPATCHES TO 40+A, BELOW:
;COME HERE ON "A READ" FUNCTION IF DRAM A FIELD IS 3
; A "WRITE TST" IS IN PROGRESS
43: BR/AR,AR_AC0,MB WAIT, ;WAIT FOR PERMISSION TO WRITE
TIME/3T,IR DISP,J/0 ;AND GO TO EXECUTE CODE
;HERE ON "A READ" FUNCTION IF DRAM A FIELD IS 4
; A "LOAD AR" IS IN PROGRESS
44: BR/AR,AR_MEM,TIME/3T, ;GET OPERAND
IR DISP,J/0 ; START EXECUTE
;HERE ON "A READ" IF A FIELD IS 5
; A "LOAD AR" IS IN PROGRESS, AND WE MUST PREFETCH WHEN IT COMPLETES
45: BR/AR,FIN XFER,I FETCH, ;GET OPERAND, PREFETCH,
TIME/3T,IR DISP,J/0 ; & START EXECUTE
;HERE ON "A READ" IF A FIELD IS 6
; A "LOAD AR" IS IN PROGRESS, BUT PAGING IS TESTING WRITABILITY
46: BR/AR,AR_MEM,TIME/3T, ;GET OPERAND
IR DISP,J/0 ; START EXECUTE
;HERE ON "A READ" IF A FIELD IS 7
; A "READ-PAUSE-WRITE" IS IN PROGRESS
47: BR/AR,AR_MEM,TIME/3T, ;GET OPERAND
IR DISP,J/0 ; START EXECUTE
.TOC "TERMINATION"
;DISPATCH HERE WITH THE "EXIT" MACRO,
; OR JUMP DIRECTLY TO ONE OF THESE LOCATIONS.
=11*000
ST0: ;BASE FOR B DISP IN EXIT MACRO
=001
ST2AC: AC0_AR,AR_SIGN,I FETCH,J/STD1 ;HERE TO STORE AC0 & AC1
FIN STORE,EXIT DBL ;MULB, DIVB, ETC ...
FIN STORE,I FETCH, ;SELF MODE
SKP AC#0,J/STSELF ; RESULT TO AC TOO?
=101
STAC: AC0_AR,NXT INSTR ;NORMAL AND IMMEDIATE MODES
ST6:
IFNOP:
STMEM: FIN STORE,I FETCH,J/NOP ;MEM MODE
IFSTAC:
STBOTH: FIN STORE,I FETCH,J/STORAC ;BOTH MODE
=
;HERE TO FINISH, AFTER FETCHING NEXT INSTRUCTION.
; WE MUST GUARANTEE AT LEAST ONE EBOX CYCLE BETWEEN FETCH AND NICOND,
; TO ALLOW VMA AC REF TO MAKE IT THROUGH THE NICOND LOGIC.
=11***0
STSELF: ;SKIP, AOS, SOS COME HERE
STORAC: SR_0,J/STAC ;STORE AC, TOO
NOP: J/FINI ;DELAY THEN NXT INSTR
.IF/JPC SUPPORT
=11*110
NJPCP: AR_PC,SKP USER,J/JPCEX ;FOR JPC HACK - SKIP IF NOT JUMPING
.ENDIF/JPC SUPPORT
FINI: SR_0,NXT INSTR ;GET NEXT INSTR IN ARX & IR,
; LOAD PC, TEST PI CYCLE, RUN,
; PI READY, TRAPS
;HERE TO STORE ARITHMETIC DOUBLE RESULTS
DSTAC: AC0_AR,AR_SIGN ;HERE WITH FETCH STARTED
STD1: AR_SHIFT,SR_0 ;BRING IN LOW PART
STAC1: AC1_AR,NXT INSTR AFTER AC1 ;STORE AC1
;HERE TO GET MICRO-CODE VERSION #. FIXED LOC'N SO SOFTWARE CAN FIND IT
137:
UVERS: BR/AR,AR0-8_#,#/VERS,J/GTAR08 ;COPY VERSION TO AR
.TOC "MOVE GROUP, EXCH, BLT"
.DCODE
200: R-PF, AC, J/MOVE ;BASIC MOVE
I-PF, AC, J/MOVE
.IF/WRTST
W, M, J/MOVE
.IFNOT/WRTST
I, B/1, J/MOVEM
.ENDIF/WRTST
RPW, S, J/MOVE
204: R-PF, AC, J/MOVS
I-PF, AC, J/MOVS
W, M, J/MOVS
RPW, S, J/MOVS
210: R-PF, AC, J/MOVN
I-PF, AC, J/MOVN
W, M, J/MOVN
RPW, S, J/MOVN
214: R-PF, AC, J/MOVM
I-PF, AC, J/MOVM
W, M, J/MOVM
RPW, S, J/MOVM
.UCODE
; ENTER WITH 0,E, (E), OR (AC) IN AR
=00****
MOVS: AR_AR SWAP,EXIT ;ALSO USED BY HALFWORD GROUP
=
=00****
MOVM: BR/AR,SKP AR0,J/MOVE ;FORCE POSITIVE
=
=00****
MOVN: BR/AR,J/MOVNEG ;GET NEGATIVE
=
=00*000
MOVE: EXIT ;STORE AS IS FROM AR
MOVNEG: AR_-BR,AD FLAGS,FETCH WAIT,J/MOVE
;EXCH, BLT
.DCODE
250: RPW, B/0, J/EXCH
I, J/BLT
.UCODE
=00***0
MOVEM: ;LIKE EXCH, EXCEPT NO STORE AC
EXCH: ARX_AR,AR_AC0,STORE,J/STMAC ;PUT AC AT E, THEN STORE AC
BLT: MQ_AR,ARX_AR, ;END ADDR TO MQ & ARX
ARR_AC0,ARL_ARL,J/BLT1 ;FIRST DEST ADDR TO AR
.TOC "HALFWORD GROUP"
; DESTINATION LEFT HALF
.DCODE
500: R-PF, AC, J/HLL
I-PF, AC, J/HLL
RPW, M, J/HRR ;HLLM = HRR EXCEPT FOR STORE
RPW, S, J/MOVE ;HLLS = MOVES
R-PF, AC, J/HRL
I-PF, AC, J/HRL
RPW, M, J/HRLM
RPW, S, J/HRLS
510: R-PF, AC, J/HLLZ
I-PF, AC, J/HLLZ
W, M, J/HLLZ
RPW, S, J/HLLZ
R-PF, AC, J/HRLZ
I-PF, AC, J/HRLZ
W, M, J/HRLZ
RPW, S, J/HRLZ
520: R-PF, AC, J/HLLO
I-PF, AC, J/HLLO
W, M, J/HLLO
RPW, S, J/HLLO
R-PF, AC, J/HRLO
I-PF, AC, J/HRLO
W, M, J/HRLO
RPW, S, J/HRLO
530: R-PF, AC, J/HLLE
I-PF, AC, J/HLLE
W, M, J/HLLE
RPW, S, J/HLLE
R-PF, AC, J/HRLE
I-PF, AC, J/HRLE
W, M, J/HRLE
RPW, S, J/HRLE
; DESTINATION RIGHT HALF
540: R-PF, AC, J/HRR
I-PF, AC, J/HRR
RPW, M, J/HLL ;HRRM = HLL EXCEPT FOR STORE
RPW, S, J/MOVE ;HRRS = MOVES
R-PF, AC, J/HLR
I-PF, AC, J/HLR
RPW, M, J/HLRM
RPW, S, J/HLRS
550: R-PF, AC, J/HRRZ
I-PF, AC, J/HRRZ
W, M, J/HRRZ
RPW, S, J/HRRZ
R-PF, AC, J/HLRZ
I-PF, AC, J/HLRZ
W, M, J/HLRZ
RPW, S, J/HLRZ
560: R-PF, AC, J/HRRO
I-PF, AC, J/HRRO
W, M, J/HRRO
RPW, S, J/HRRO
R-PF, AC, J/HLRO
I-PF, AC, J/HLRO
W, M, J/HLRO
RPW, S, J/HLRO
570: R-PF, AC, J/HRRE
I-PF, AC, J/HRRE
W, M, J/HRRE
RPW, S, J/HRRE
R-PF, AC, J/HLRE
I-PF, AC, J/HLRE
W, M, J/HLRE
RPW, S, J/HLRE
.UCODE
;FIRST, THE 16 OPS WHICH DO NOT AFFECT THE "OTHER" HALF.
;THESE MUST BE TREATED SEPARATELY, BECAUSE THEY COMBINE MEMORY DATA
;IN AR WITH DATA FROM THE FM. ENTER WITH 0,E OR (E) IN AR.
=00***0
HRR: ARL_AC0,ARR_ARR,EXIT ;HRR, HRRI, HLLM
=00****
HLL: ARR_AC0,ARL_ARL,EXIT ;HLL, HLLI, HRRM
= ;HRRS, HLLS ARE BOTH EQUIVALENT TO MOVES
=00****
HRL: ARL_ARR,ARR_AC0,EXIT ;HRL, HRLI
=
=00****
HLR: ARR_ARL,ARL_AC0,EXIT ;HLR, HLRI
=
=00***0
HRLM: ARL_ARR,ARR_AC0,J/MOVS ;HRLM
HRLS: ARL_ARR,ARR_ARR,EXIT ;HRLS
=
=00***0
HLRM: ARR_ARL,ARL_AC0,J/MOVS ;HLRM
HLRS: ARR_ARL,ARL_ARL,EXIT ;HLRS
=
;NOW THE HALFWORD OPS WHICH CONTROL THE "OTHER" HALF
; ENTER WITH 0,E, (E), OR (AC) IN AR
=00****
HRRE: SKP AR18 ;SELECT HRRZ OR HRRO ON SIGN
=
=00***0
HRRZ: ARL_0S,ARR_ARR,EXIT
HRRO: ARL_1S,ARR_ARR,EXIT
=
=00****
HRLE: SKP AR18
=
=00***0
HRLZ: ARL_ARR,ARR_0S,EXIT
HRLO: ARL_ARR,ARR_1S,EXIT
=
=00****
HLRE: SKP AR0
=
=00***0
HLRZ: ARR_ARL,ARL_0S,EXIT
HLRO: ARR_ARL,ARL_1S,EXIT
=
=00****
HLLE: SKP AR0
=
=00***0
HLLZ: ARR_0S,ARL_ARL,EXIT
HLLO: ARR_1S,ARL_ARL,EXIT
=
.TOC "DMOVE, DMOVN, DMOVEM, DMOVNM"
;DOUBLE-WORD MOVES
.DCODE
120: R, B/0, J/DMOVE
R, B/1, J/DMOVN
.UCODE
; ENTER WITH (E) IN AR
=00****
DMOVN:
DMOVE: VMA_VMA+1,LOAD ARX,B DISP ;PICK UP (E+1)
=
=1**00
ARX_MEM,J/STDAC ;GO STORE DOUBLE AC
ARX_MEM,MQ_0.S,CALL.S,J/GTDBR ;LOAD BR WITH DOUBLE OPERAND
=11 AR_-BR LONG,AD FLAGS, ;NEGATE DOUBLE OPERAND
SC_#,#/35. ;& STORE RESULT
DBLST: AC0_AR,AR_0S,I FETCH,J/STD1 ;STORE HIGH WORD, READY LOW
;DOUBLE MOVES TO MEMORY
.DCODE
124: W, J/DMOVEM
W, J/DMOVNM
.UCODE
;ENTER WITH (AC) IN AR
=00**00
DMOVEM: ARX_AC1,STORE,SC_#,#/36.,J/DMVM1
DMOVNM: ARX_AC1,MQ_0.S,CALL.S,J/GTDBR ;HIGH WORD IS ALREADY IN AR
=11 AR_-BR LONG,AD FLAGS, ;NEGATE
STORE,SC_#,#/35. ; & STORE
=
DMVM1: MEM_AR,VMA_VMA+1,AR_0S
AR_SHIFT,STORE,J/STMEM
GTDBR: ARX_ARX*2 ;SHIFT OUT LOW SIGN
LDBRL: BR_AR LONG,RETURN3 ;COPY TO BR LONG
.TOC "BOOLEAN GROUP"
.DCODE
400: I-PF, AC, J/SETZ
I-PF, AC, J/SETZ
IW, M, J/SETZ
IW, B, J/SETZ
.UCODE
=00****
SETZ: AR_0S,EXIT
=
.DCODE
404: R-PF, AC, J/AND
I-PF, AC, J/AND
RPW, M, J/AND
RPW, B, J/AND
.UCODE
=00****
AND: AR_AR*AC0,AD/AND,EXIT
=
.DCODE
410: R-PF, AC, J/ANDCA
I-PF, AC, J/ANDCA
RPW, M, J/ANDCA
RPW, B, J/ANDCA
.UCODE
=00****
ANDCA: AR_AR*AC0,AD/ANDCB,EXIT
=
.DCODE
414: R-PF, AC, J/MOVE ;SETM = MOVE
I-PF, AC, J/MOVE
RPW, M, J/MOVE ;SETMM = NOP THAT WRITES MEMORY
RPW, B, J/MOVE ;SETMB = MOVE THAT WRITES MEMORY
420: R-PF, AC, J/ANDCM
I-PF, AC, J/ANDCM
RPW, M, J/ANDCM
RPW, B, J/ANDCM
.UCODE
=00****
ANDCM: AR_AR*AC0,AD/ANDCA,EXIT
=
.DCODE
424: R-PF, J/TDN
I-PF, J/TDN
W, M, J/MOVE ;SETAM = MOVEM
W, M, J/MOVE ;SETAB, TOO
.UCODE
.DCODE
430: R-PF, AC, J/XOR
I-PF, AC, J/XOR
RPW, M, J/XOR
RPW, B, J/XOR
.UCODE
=00****
XOR: AR_AR*AC0,AD/XOR,EXIT
=
.DCODE
434: R-PF, AC, J/IOR
I-PF, AC, J/IOR
RPW, M, J/IOR
RPW, B, J/IOR
.UCODE
=00****
IOR: AR_AR*AC0,AD/OR,EXIT
=
.DCODE
440: R-PF, AC, J/ANDCB
I-PF, AC, J/ANDCB
RPW, M, J/ANDCB
RPW, B, J/ANDCB
.UCODE
=00****
ANDCB: AR_AR*AC0,AD/ANDC,EXIT
=
.DCODE
444: R-PF, AC, J/EQV
I-PF, AC, J/EQV
RPW, M, J/EQV
RPW, B, J/EQV
.UCODE
=00****
EQV: AR_AR*AC0,AD/EQV,EXIT
=
.DCODE
450: I-PF, AC, J/SETCA
I-PF, AC, J/SETCA
IW, M, J/SETCA
IW, B, J/SETCA
.UCODE
=00****
SETCA: AR_AR*AC0,AD/SETCB,EXIT
=
.DCODE
454: R-PF, AC, J/ORCA
I-PF, AC, J/ORCA
RPW, M, J/ORCA
RPW, B, J/ORCA
.UCODE
=00****
ORCA: AR_AR*AC0,AD/ORCB,EXIT
=
.DCODE
460: R-PF, AC, J/SETCM
I-PF, AC, J/SETCM
RPW, M, J/SETCM
RPW, B, J/SETCM
.UCODE
=00****
SETCM: ADA/AR,AD/SETCA,AR/AD,EXIT
=
.DCODE
464: R-PF, AC, J/ORCM
I-PF, AC, J/ORCM
RPW, M, J/ORCM
RPW, B, J/ORCM
.UCODE
=00****
ORCM: AR_AR*AC0,AD/ORCA,EXIT
=
.DCODE
470: R-PF, AC, J/ORCB
I-PF, AC, J/ORCB
RPW, M, J/ORCB
RPW, B, J/ORCB
.UCODE
=00****
ORCB: AR_AR*AC0,AD/ORC,EXIT
=
.DCODE
474: I-PF, AC, J/SETO
I-PF, AC, J/SETO
IW, M, J/SETO
IW, B, J/SETO
.UCODE
=00****
SETO: AR_1S,EXIT
=