Appendix 1. Dragon Instruction Set m = memory word, r = execution unit stack register, a = auxiliary register, c = constants register, S = stack pointer, L = local base pointer, PC = program counter, Procr = processor register, ProcBus = processor bus, FieldDesc = field unit descriptor, FieldOp = field operation FP = floating point (ALU and MULT), fpA = A-FP-operand, fpALen = length of fpA skip, carry, resultCarry, status, IFUStack are self-explanatory, [,] = pair, . = concatenation, ! = Trap m, n = unsigned halfbyte, B = unsigned byte, b = signed byte, H = unsigned halfword, h = signed halfword, W = unsigned word, x, y, z = register (aux, local, const or top of stack), s = r[S] or r[S-1], OI[op:[0..255]] OB[op,lit:[0..255]] ODB[op,lit:CARDINAL] OQB[op,lit:LONG CARDINAL] LR[op:[0..255]] LRB[op:[0..255],disp:[0..255]] LRRB[op,disp:[0..255],reg1,reg2:[0..15]] RR[op:[0..255],cOpt,aOpt,bOpt,aux:[0..1],c,a,b:[0..15]] QR[op:[0..255],bOpt,aux:[0..1],b:[0..15]] JBB[op:[0..255],dist:[-128..127],lit:[0..255]] RJB[op:[0..255],sdd,sd,opt,aux:[0..1],reg:[0..15],dist:[-128..127]] (opt,aux,reg) = (0,0,Loc) (0,1,a) in: (1,*,0-11):c (1,*,12/14):r[S]dS=0/-1 (1,*,13/15):r[S-1]dS=0/-1 out: (1,*,0-11):c (1,*,12):r[S] (1,*,13):r[S-1] (1,*,14/15):r[S+1]dS=0/1) sdd: 0/1:dS=0/-1 sd: 0/1:r[S]/r[S-1] Loads 222B OB(2) LIB B r[S+1] _ B; S _ S+1 322B ODB(3) LIDB H r[S+1] _ H; S _ S+1 062B OQB(5) LIQB W r[S+1] _ W; S _ S+1 110B OI(1) DUP r[S+1] _ r[S]; S _ S+1 140B+n LR(1) LR n r[S+1] _ r[L+n]; S _ S+1 130B+n OI(1) LC n r[S+1] _ c[n]; S _ S+1 230B OB(2) RB B r[S] _ m[r[S]+B] 334B OB(2) IN B r[S] _ m[r[S]+B] (bypassing cache) 202B QR(2) QRX y r[S] _ m[r[S]+y] 232B OB(2) RSB B r[S+1] _ m[r[S]+B]; S _ S+1 240B+n LRB(2) LRI n B r[S+1] _ m[r[L+n]+B]; S _ S+1 102B OI(1) RX r[S-1] _ m[r[S-1]+r[S]]; S _ S-1 320B ODB(3) LGF H r[S+1] _ m[a[0]+H]; S _ S+1 220B OB(2) LIP B r[S+1] _ Procr[B]; S _ S+1 234B OB(2) PIN B r[S] _ ProcBus[B, r[S]] Stores 111B OI(1) DIS S _ S-1 113B OI(1) EXDIS r[S-1] _ r[S]; S _ S-1 160B+n LR(1) SR n r[L+n] _ r[S]; S _ S-1 231B OB(2) WB B m[r[S]+B] _ r[S-1]; S _ S-2 335B OB(2) OUT B m[r[S]+B] _ r[S-1]; S _ S-2 (bypassing cache) 233B OB(2) WSB B m[r[S-1]+B] _ r[S]; S _ S-2 237B OB(2) PSB B m[r[S-1]+B] _ r[S]; S _ S-1 260B+n LRB(2) SRI n B m[r[L+n]+B] _ r[S]; S _ S-1 221B OB(2) SIP B Procr[B] _ r[S]; S _ S-1 235B OB(2) POUT B ProcBus[B] _ r[S] Moves 112B OI(1) EXCH [ r[S-1], r[S] ] <=> [ r[S], r[S-1] ] 330B LRRB(3) RAI B m n r[L+m] _ m[a[n]+B] 332B LRRB(3) RRI B m n r[L+m] _ m[r[L+n]+B] 331B LRRB(3) WAI B m n m[a[n]+B] _ r[L+m] 333B LRRB(3) WRI B m n m[r[L+n]+B] _ r[L+m] 302B RR(3) RRX z x y z _ m[x+y] Field operations 373B ODB(3) FSDB H FieldDesc _ r[S] + H; S _ S-1 370B ODB(3) SHL H r[S] _ FieldOp[r[S], 0, H] 371B ODB(3) SHR H r[S] _ FieldOp[r[S], r[S], H] 372B ODB(3) SHD H r[S-1] _ FieldOp[r[S-1], r[S], H]; S _ S-1 312B RR(3) RFU z x y z _ FieldOp[x, y, FieldDesc] Logic operations 301B RR(3) RAND z x y z _ x AND y 201B QR(2) QAND y r[S] _ r[S] AND y 300B RR(3) ROR z x y z _ x OR y 200B QR(2) QOR y r[S] _ r[S] OR y 310B RR(3) RXOR z x y z _ x XOR y ? QR(2) QXOR y r[S] _ r[S] XOR y Arithmetic operations 211B OB(2) AL B L _ L + B 210B OB(2) ALS B L _ S + B 213B OB(2) AS B S _ S + B 212B OB(2) ASL B S _ L + B 304B RR(3) RADD z x y z _ x + y + carry; carry _ 0 (! int ov) 204B QR(2) QADD y r[S] _ r[S] + y + carry; carry _ 0 (! int ov) 104B OI(1) ADD r[S-1] _ r[S-1] + r[S] + carry; carry _ 0; S _ S-1 (! int ov) 224B OB(2) ADDB B r[S] _ r[S] + B + carry; carry _ 0 (! int ov) 324B ODB(3) ADDDB H r[S] _ r[S] + H + carry; carry _ 0 (! int ov) 316B RR(3) RUADD z x y z _ x + y + carry; carry _ resultCarry (no !) 314B RR(3) RVADD z x y z _ x + y (no !) 306B RR(3) RLADD z x y z _ x + y; carry _ 0 (Lisp Add) 206B QR(2) QLADD y r[S] _ r[S] + y; carry _ 0 (Lisp Add) 106B OI(1) LADD r[S-1] _ r[S-1] + r[S]; carry _ 0; S _ S-1 (Lisp Add) 305B RR(3) RSUB z x y z _ x - y - carry; carry _ 0 (! int ov) 205B QR(2) QSUB y r[S] _ r[S] - y - carry; carry _ 0 (! int ov) 105B OI(1) SUB r[S-1] _ r[S-1] - r[S] - carry; carry _ 0; S _ S-1 (! int ov) 225B OB(2) SUBB B r[S] _ r[S] - B - carry; carry _ 0 (! int ov) 325B ODB(3) SUBDB H r[S] _ r[S] - H - carry; carry _ 0 (! int ov) 317B RR(3) RUSUB z x y z _ x - y - carry; carry _ resultCarry (no !) 315B RR(3) RVSUB z x y z _ x - y (no !) 307B RR(3) RLSUB z x y z _ x - y; carry _ 0 (Lisp Subtract) 207B QR(2) QLSUB y r[S] _ r[S] - y; carry _ 0 (Lisp Subtract) 107B OI(1) LSUB r[S-1] _ r[S-1] - r[S]; carry _ 0; S _ S-1 (Lisp Subtract) 121B OI(1) SMUL r[S-1].r[S] _ r[S-1] * r[S] 122B OI(1) UDIV [ r[S-2], r[S-1] ] _ r[S-2].r[S-1] DIV, MOD r[S]; S _ S-1 223B OB(2) SFP B set FP-status or FP-operand fpA depending on control bits B; S _ S-fpALen 374B ODB(3) FLIP H fpA _ fpA op (r[S-1].)r[S] (op, type and length spex in H) 375B ODB(3) FLOP H r[S] _ fpA op (r[S-1].)r[S] (op, type and length spex in H) Jumps/Checks (j = jump predicted) 126B OI(1) J1 skip 226B OB(2) J2 B skip 326B ODB(3) J3 H skip 066B OQB(5) J5 W skip 227B OB(2) JB b PC _ PC + b 327B ODB(3) JDB h PC _ PC + h 067B OQB(5) DJ W PC _ W 127B OI(1) SJ PC _ PC + r[S]; S _ S-1 341B(355B) RJB(3) RJEB(j) s y b IF s = y THEN PC _ PC + b 345B(351B) RJB(3) RJNEB(j) s y b IF s # y THEN PC _ PC + b 347B(353B) RJB(3) RJGB(j) s y b IF s > y THEN PC _ PC + b 346B(352B) RJB(3) RJGEB(j) s y b IF s >= y THEN PC _ PC + b 342B(356B) RJB(3) RJLB(j) s y b IF s < y THEN PC _ PC + b 343B(357B) RJB(3) RJLEB(j) s y b IF s <= y THEN PC _ PC + b 360B(362B) JBB(3) JEBB(j) b B IF r[S] = B THEN PC _ PC + b; S _ S-1 361B(363B) JBB(3) JNEBB(j) b B IF r[S] # B THEN PC _ PC + b; S _ S-1 103B OI(1) BC IF NOT (0<= r[S-1]< r[S]) THEN !; S _ S-1 303B RR(3) RBC z x y IF NOT (0<= x< y) THEN !; z _ x 203B QR(2) QBC y IF NOT 0<= r[S]< y THEN ! 214B OB(2) CST B r[S+1] _ m[Loc[S-2]+B]; IF r[S+1]= r[S] THEN m[r[S-2]+B] _ r[S-1]; S _ S+1 Procedure calls/Returns 321B ODB(3) LFC h call proc: PC _ PC + h 061B OQB(5) DFC W call proc: PC _ W 114B OI(1) SFC call proc: IFUStack _ [PC, L]; PC _ r[S]; S _ S-1 115B OI(1) SFCI call proc: IFUStack _ [PC, L]; PC _ m[r[S]] 124B OI(1) KFC r[S+1] _ status; S _ S+1; set kernel mode; ! 116B OI(1) RETN return via [PC, L] from IFUStack 216B OB(2) RET B return via [PC, L] from IFUStack; S _ L + B 217B OB(2) RETK B status _ r[S]; return via [PC, L] from IFUStack; S _ L + B ÊÖ˜J˜#J˜J˜ÎJ˜J˜ÈJ˜Jšœ1Ïkœœœ˜UJšœZ˜ZJšœ7˜7JšœY˜YJšœC˜CJ˜J˜!J˜BJ˜IJšœ$˜$J˜J˜J˜%J˜'J˜'J˜(J˜+Jšœ)˜)J˜#J˜4J˜"J˜-J˜3J˜1J˜.J˜-J˜)J˜J˜J˜J˜(J˜)J˜-J˜?J˜.J˜-J˜1J˜*J˜$J˜J˜J˜7J˜)J˜,J˜)J˜+J˜J˜J˜J˜1J˜-J˜0J˜=J˜1J˜J˜J˜!J˜$J˜J˜"J˜!J˜"J˜J˜J˜J˜J˜J˜J˜=J˜@J˜NJ˜@J˜BJ˜DJ˜'J˜6J˜9J˜GJ˜=J˜@J˜NJ˜@J˜BJ˜DJ˜'J˜;J˜>J˜LJ˜-J˜KJ˜NJ˜J˜NJ˜OJ˜J˜!J˜J˜J˜J˜J˜J˜J˜J˜'J˜:J˜:J˜:J˜;J˜:J˜;J˜DJ˜EJ˜9J˜4J˜+J˜)J˜8J˜J˜J˜)J˜$J˜BJ˜=J˜=J˜2J˜=J˜MJ˜—…—B