URL
https://opencores.org/ocsvn/eco32/eco32/trunk
Subversion Repositories eco32
[/] [eco32/] [trunk/] [fp/] [implementation/] [mmix/] [sim.mms] - Rev 15
Compare with Previous | Blame | View Log
% Stripped-Down Simulator for MMIX, derived from MMIX-SIM
% To run it on a program like "foo bar"
% first say "mmix -Dfoo.mmb foo bar"
% then "mmix <options> sim foo.mmb"
% I apologize for lack of comments; they're in the book though
t IS $255
lring_size IS 256 % octabytes in the local register ring
LOC Data_Segment
Global LOC @+8*256
g GREG Global % base of 256 global registers
Local LOC @+8*lring_size
l GREG Local % base of lring_size local registers
GREG @
IOArgs OCTA 0,BinaryRead
Chunk0 IS @
LOC #100
PREFIX :Mem:
head GREG % address of first chunk
curkey GREG % KEY(head)
alloc GREG % address of next chunk to allocate
Chunk IS #1000 bytes per chunk, is power of 2
addr IS $0
key IS $1
test IS $2
newlink IS $3
p IS $4 % LINK(p)=head
t IS :t
KEY IS 0
LINK IS 8
DATA IS 16
nodesize GREG Chunk+3*8 pad with 8 zero bytes
mask GREG Chunk-1
:MemFind ANDN key,addr,mask
CMPU t,key,curkey
PBZ t,4F
BN addr,:Error
SET newlink,head
1H SET p,head
LDOU head,p,LINK
PBNZ head,2F
SET head,alloc
STOU key,head,KEY
ADDU alloc,alloc,nodesize
JMP 3F
2H LDOU test,head,KEY
CMPU t,test,key
BNZ t,1B
3H LDOU t,head,LINK
STOU newlink,head,LINK
SET curkey,key
STOU t,p,LINK
4H SUBU t,addr,key
LDA $0,head,DATA
ADDU $0,t,$0
POP 1,0
PREFIX :
res IS $2
arg IS res+1
ss GREG % rS
oo GREG % rO
ll GREG % 8*rL
gg GREG % 8*rG
aa GREG % rA
ii GREG % rI
uu GREG % rU
cc GREG % rC
lring_mask GREG 8*lring_size-1
:GetReg CMPU t,$0,gg
BN t,1F
LDOU $0,g,$0
POP 1,0
1H CMPU t,$0,ll
ADDU $0,$0,oo
AND $0,$0,lring_mask
LDOU $0,l,$0
CSNN $0,t,0
POP 1,0
:StackStore GET $0,rJ
AND t,ss,lring_mask \S82
LDOU $1,l,t
SET arg,ss
PUSHJ res,MemFind
STOU $1,res,0 M[rS]<-l[rS]
ADDU ss,ss,8
PUT rJ,$0
POP
:StackLoad GET $0,rJ
SUBU ss,ss,8 \S83
SET arg,ss
PUSHJ res,MemFind
LDOU $1,res,0
AND t,ss,lring_mask
STOU $1,l,t
PUT rJ,$0
POP
:StackRoom SUBU t,ss,oo idiom in \S81,\S101,\S102
SUBU t,t,ll
AND t,t,lring_mask
PBNZ t,1F
GET $0,rJ
PUSHJ res,StackStore
PUT rJ,$0
1H POP
* The main loop
loc GREG % where the simulator is at
inst_ptr GREG % where the simulator will be next
inst GREG % the current instruction being simulated
resuming GREG % are we resuming an instruction in rX?
Fetch PBZ resuming,1F \S60 (main simulation loop)
SUBU loc,inst_ptr,4
LDTU inst,g,8*rX+4
JMP 2F
1H SET loc,inst_ptr
SET arg,loc
PUSHJ res,MemFind
LDTU inst,res,0
ADDU inst_ptr,loc,4
2H CMPU t,loc,g
BNN t,Error loc>=Data_Segment
op GREG % opcode of the current instruction
xx GREG % X field of the current instruction
yy GREG % Y field of the current instruction
zz GREG % Z field of the current instruction
yz GREG % YZ field of the current instruction
f GREG % packed information about the current op
xxx GREG % X field times 8
x GREG % result, or X operand
y GREG % Y operand
z GREG % Z operand
xptr GREG % location where x should be stored
exc GREG % arithmetic exceptions
Z_is_immed_bit IS #1
Z_is_source_bit IS #2
Y_is_immed_bit IS #4
Y_is_source_bit IS #8
X_is_source_bit IS #10
X_is_dest_bit IS #20
Rel_addr_bit IS #40
Mem_bit IS #80
Info IS #1000
Done IS Info+8*256
info GREG Info % base address for master info table
c255 GREG 8*255
c256 GREG 8*256
MOR op,inst,#8
MOR xx,inst,#4
MOR yy,inst,#2
MOR zz,inst,#1
0H GREG -#10000
ANDN yz,inst,0B
SLU xxx,xx,3
SLU t,op,3
LDOU f,info,t
SET x,0
SET y,0
SET z,0
SET exc,0
AND t,f,Rel_addr_bit
PBZ t,1F
PBEV f,2F Convert rel to abs, \S70
9H GREG -#1000000
ANDN yz,inst,9B xyz
ADDU t,yz,9B
JMP 3F
2H ADDU t,yz,0B
3H CSOD yz,op,t
SL t,yz,2
ADDU yz,loc,t
1H PBNN resuming,Install_X Install operands \S71
LDOU y,g,8*rY Install special operands \S127
LDOU z,g,8*rZ
BOD resuming,Install_Y
0H GREG #C1<<56+(x-$0)<<48+(z-$0)<<40+1<<16+X_is_dest_bit
SET f,0B Change to ORI instruction
LDOU exc,g,8*rX
MOR exc,exc,#20
JMP XDest
Install_X AND t,f,X_is_source_bit
PBZ t,1F
SET arg,xxx
PUSHJ res,GetReg
SET x,res
1H SRU t,f,5
AND t,t,#f8
PBZ t,Install_Z
LDOU x,g,t Set x from third op, \S79
Install_Z AND t,f,Z_is_source_bit
PBZ t,1F
SLU arg,zz,3
PUSHJ res,GetReg
SET z,res
JMP Install_Y
1H CSOD z,f,zz Z_is_immed_bit
AND t,op,#f0
CMPU t,t,#e0
PBNZ t,Install_Y
AND t,op,#3 Set z as immediate wyde, \S78
NEG t,3,t
SLU t,t,4
SLU z,yz,t
SET y,x
Install_Y AND t,f,Y_is_immed_bit
PBZ t,1F
SET y,yy
SLU t,yy,40
ADDU f,f,t
1H AND t,f,Y_is_source_bit
BZ t,1F
SLU arg,yy,3
PUSHJ res,GetReg
SET y,res (end of \S71)
1H AND t,f,X_is_dest_bit
BZ t,1F
XDest CMPU t,xxx,gg Install X as dest, \S80
BN t,3F
LDA xptr,g,xxx
JMP 1F
2H ADDU t,oo,ll
AND t,t,lring_mask
STCO 0,l,t
INCL ll,8
PUSHJ res,StackRoom
3H CMPU t,xxx,ll
BNN t,2B
ADD t,xxx,oo
AND t,t,lring_mask
LDA xptr,l,t
1H AND t,f,Mem_bit
PBZ t,1F
ADDU arg,y,z
CMPU t,op,#A0
BN t,2F
CMPU t,arg,g
BN t,Error
2H PUSHJ res,MemFind
1H SRU t,f,32
PUT rX,t
PUT rM,x
PUT rE,x
0H GREG #30000
AND t,aa,0B
ORL t,U_BIT<<8 enable underflow trip
PUT rA,t
0H GREG Done
PUT rW,0B
RESUME
MulU MULU x,y,z
GET t,rH
STOU t,g,8*rH
JMP XDone
Div DIV x,y,z
JMP 1F
DivU PUT rD,x
DIVU x,y,z
1H GET t,rR
STO t,g,8*rR
JMP XDone
Cswap LDOU z,g,8*rP
LDOU y,res,0
CMPU t,y,z
BNZ t,1F
STOU x,res,0
JMP 2F
1H STOU y,g,8*rP
2H ZSZ x,t,1
JMP XDone
BTaken ADDU cc,cc,4
PBTaken SUBU cc,cc,2
SET inst_ptr,yz
JMP Update
Go SET x,inst_ptr
ADDU inst_ptr,y,z
JMP XDone
PushGo ADDU yz,y,z
PushJ SET inst_ptr,yz
CMPU t,xxx,gg
PBN t,1F
SET xxx,ll
SRU xx,xxx,3
INCL ll,8
PUSHJ 0,StackRoom
1H ADDU t,xxx,oo
AND t,t,lring_mask
STOU xx,l,t
ADDU t,loc,4
STOU t,g,8*rJ
INCL xxx,8
SUBU ll,ll,xxx
ADDU oo,oo,xxx
JMP Update
Pop SUBU oo,oo,8
BZ xx,1F
CMPU t,ll,xxx
BN t,1F
ADDU t,xxx,oo
AND t,t,lring_mask
LDOU y,l,t
1H CMPU t,oo,ss
PBNN t,1F
PUSHJ 0,StackLoad
1H AND t,oo,lring_mask
LDOU z,l,t
AND z,z,#ff
SLU z,z,3
1H SUBU t,oo,ss
CMPU t,t,z
PBNN t,1F
PUSHJ 0,StackLoad actually gamma=beta possible here!
JMP 1B
1H ADDU ll,ll,8
CMPU t,xxx,ll
CSN ll,t,xxx
ADDU ll,ll,z
CMPU t,gg,ll
CSN ll,t,gg
CMPU t,z,ll
BNN t,1F
AND t,oo,lring_mask
STOU y,l,t
1H LDOU y,g,8*rJ
SUBU oo,oo,z
4ADDU inst_ptr,yz,y
JMP Update
Save BNZ yz,Error \S102
CMPU t,xxx,gg
BN t,Error
ADDU t,oo,ll
AND t,t,lring_mask
SRU y,ll,3
STOU y,l,t
INCL ll,8
PUSHJ 0,StackRoom
ADDU oo,oo,ll
SET ll,0
1H PUSHJ 0,StackStore
CMPU t,ss,oo
PBNZ t,1B
SUBU y,gg,8
4H ADDU y,y,8
1H SET arg,ss \S103
PUSHJ res,MemFind
CMPU t,y,8*(rZ+1)
LDOU z,g,y
PBNZ t,2F
SLU z,gg,56-3
ADDU z,z,aa
2H STOU z,res,0
INCL ss,8
BNZ t,1F
CMPU t,y,c255
BZ t,2F
CMPU t,y,8*rR
PBNZ t,4B
SET y,8*rP
JMP 1B
2H SET y,8*rB
JMP 1B
1H SET oo,ss
SUBU x,oo,8
JMP XDone
Unsave BNZ xx,Error \S104
BNZ yy,Error
ANDNL z,#7
ADDU ss,z,8
SET y,8*(rZ+2)
1H SUBU y,y,8
4H SUBU ss,ss,8 \S105
SET arg,ss
PUSHJ res,MemFind
LDOU x,res,0
CMPU t,y,8*(rZ+1)
PBNZ t,2F
SRU gg,x,56-3
SLU aa,x,64-18
SRU aa,aa,64-18
JMP 1B
2H STOU x,g,y
3H CMPU t,y,8*rP
CSZ y,t,8*(rR+1)
CSZ y,y,c256
CMPU t,y,gg
PBNZ t,1B
PUSHJ 0,StackLoad
AND t,ss,lring_mask
LDOU x,l,t
AND x,x,#ff
BZ x,1F
SET y,x
2H PUSHJ 0,StackLoad
SUBU y,y,1
PBNZ y,2B
SLU x,x,3
1H SET ll,x
CMPU t,gg,x
CSN ll,t,gg
SET oo,ss
PBNZ uu,Update
BZ resuming,Update
JMP AllDone
Get CMPU t,yz,32
BNN t,Error
STOU ii,g,8*rI
STOU cc,g,8*rC
STOU oo,g,8*rO
STOU ss,g,8*rS
STOU uu,g,8*rU
STOU aa,g,8*rA
SR t,ll,3
STOU t,g,8*rL
SR t,gg,3
STOU t,g,8*rG
SLU t,zz,3
LDOU x,g,t
JMP XDone
Put BNZ yy,Error
CMPU t,xx,32
BNN t,Error
CMPU t,xx,rC
BN t,PutOK
CMPU t,xx,rF
BN t,1F
PutOK STOU z,g,xxx
JMP Update
1H CMPU t,xx,rG
BN t,Error
SUB t,xx,rL
PBP t,PutA
BN t,PutG
PutL SLU z,z,3 \S98, PUT rL
CMPU t,z,ll
CSN ll,t,z
JMP Update
0H GREG #40000
PutA CMPU t,z,0B \S100, PUT rA
BNN t,Error
SET aa,z
JMP Update
PutG SRU t,z,8
BNZ t,Error
CMPU t,z,32
BN t,Error
SLU z,z,3
CMPU t,z,ll
BN t,Error
JMP 2F
1H SUBU gg,gg,8
STCO 0,g,gg
2H CMPU t,z,gg
PBN t,1B
SET gg,z
JMP Update
Resume SLU t,inst,40 \S125
BNZ t,Error
LDOU inst_ptr,g,8*rW
LDOU x,g,8*rX
BN x,Update
SRU xx,x,56
SUBU t,xx,2
BNN t,1F
PBZ xx,2F
SRU y,x,28 rop=1 (RESUME_CONT)
AND y,y,#f
SET z,1
SLU z,z,y
ANDNL z,#70cf
BNZ z,Error
1H BP t,Error
SRU t,x,13
AND t,t,c255
CMPU y,t,ll
BN y,2F
CMPU y,t,gg
BN y,Error
2H MOR t,x,#8
CMPU t,t,#F9 RESUME
BZ t,Error
NEG resuming,xx
CSNN resuming,resuming,1
JMP Update
Sync BNZ xx,Error
CMPU t,yz,4
BNN t,Error
JMP Update
Trip SET xx,0
JMP TakeTrip
Trap STOU inst_ptr,g,8*rWW
0H GREG #8000000000000000
ADDU t,inst,0B
STOU t,g,8*rXX
STOU y,g,8*rYY
STOU z,g,8*rZZ
SRU y,inst,6
CMPU t,y,4*11
BNN t,Error
LDOU t,g,c255
0H GREG @+4
GO y,0B,y
JMP SimHalt
JMP SimFopen
JMP SimFclose
JMP SimFread
JMP SimFgets
JMP SimFgetws
JMP SimFwrite
JMP SimFputs
JMP SimFputws
JMP SimFseek
JMP SimFtell
:GetArgs GET $0,rJ
SET y,t
SET arg,t
PUSHJ res,MemFind
LDOU z,res,0 z = virtual address of buffer
SET arg,z
PUSHJ res,MemFind
SET x,res x = physical address of buffer
STO x,IOArgs
SET xx,Mem:Chunk
AND zz,x,Mem:mask
SUB xx,xx,zz xx = bytes from x to chunk end
ADDU arg,y,8
PUSHJ res,MemFind
LDOU zz,res,0 zz = size of buffer
STOU zz,IOArgs+8
PUT rJ,$0
POP
GREG @
:SimInst LDA t,IOArgs
JMP DoInst
SimFinish LDA t,IOArgs
SimFclose GETA $0,TrapDone
:DoInst PUT rW,$0
PUT rX,inst
RESUME
SimFopen PUSHJ 0,GetArgs
ADDU xx,Mem:alloc,Mem:nodesize
STOU xx,IOArgs % we'll copy the file name here
SET x,xx
1H SET arg,z
PUSHJ res,MemFind
LDBU t,res,0
STBU t,x,0
INCL x,1
INCL z,1
PBNZ t,1B
GO $0,SimInst
3H STCO 0,x,0 % clean up the copied string
CMPU z,xx,x
SUB x,x,8
PBN z,3B
JMP TrapDone
TrapDone STO t,g,8*rBB "RESUME 1" works this way
STO t,g,c255
JMP Update
SimFread PUSHJ 0,GetArgs
SET y,zz number of bytes to read
1H CMP t,xx,y
PBNN t,SimFinish
STO xx,IOArgs+8 oops, we must cross chunk bdry
SUB y,y,xx
GO $0,SimInst
BN t,1F
ADD z,z,xx
SET arg,z
PUSHJ res,MemFind
STOU res,IOArgs
STO y,IOArgs+8
ADD xx,Mem:mask,1
JMP 1B
1H SUB t,t,y
JMP TrapDone
SimFgets PUSHJ 0,GetArgs
CMP t,xx,zz
PBNN t,SimFinish easy if all in one chunk
SET y,zz remaining buf size
SET yy,0 bytes successfully read so far
1H ADD t,xx,1
STO t,IOArgs+8 null character spills off end
GO $0,SimInst
BN t,TrapDone
ADD yy,yy,t
CMP $0,t,xx
SET t,yy
PBNZ $0,TrapDone
ADDU z,z,xx
SET arg,z
PUSHJ res,MemFind
SUBU x,x,1
LDBU t,x,xx look at last byte read
CMP t,t,#0a is it newline?
BZ t,1F
SUB y,y,xx
SET x,res
STOU x,IOArgs
STO y,IOArgs+8
ADD xx,Mem:mask,1
CMP t,xx,y
BN t,1B
GO $0,SimInst
BN t,TrapDone
2H ADD t,yy,t
JMP TrapDone
1H SET t,0
STBU t,res,0
JMP 2B
SimFgetws PUSHJ 0,GetArgs
ADD y,zz,zz remaining buf size (bytes)
CMP t,xx,y
PBNN t,SimFinish easy if all in one chunk
SET yy,0 wydes successfully read so far
1H ADD zz,xx,3
SR zz,zz,1 wydes in current chunk, plus 1
STO zz,IOArgs+8 null character spills off end
GO $0,SimInst
BN t,TrapDone
ADDU yy,yy,t
SUB zz,zz,1
CMP $0,t,zz
SET t,yy
PBNZ $0,TrapDone
ADD z,z,xx
SET arg,z
PUSHJ res,MemFind
SUBU x,x,2
LDWU t,x,xx look at last wyde read
CMP t,t,#0a is it newline?
BZ t,1F
SUB y,y,xx
SET x,res
STOU x,IOArgs
SR t,y,1
STO t,IOArgs+8
ADD xx,Mem:mask,1
ANDN y,y,1
CMP t,xx,y
BN t,1B
GO $0,SimInst
BN t,TrapDone
2H ADD t,yy,t
JMP TrapDone
1H SET t,0
STWU t,res,0
JMP 2B
SimFwrite IS SimFread yes it works!
SimFputs SET xx,0 this many bytes written
SET z,t virtual address of string
1H SET arg,z
PUSHJ res,MemFind
SET t,res physical address of string
GO $0,DoInst
BN t,TrapDone
BZ t,1F
ADD xx,xx,t
ADDU z,z,t
AND t,z,Mem:mask
BZ t,1B
1H SET t,xx
JMP TrapDone
SimFputws SET xx,0 this many wydes written
SET z,t virtual address of string
1H SET arg,z
PUSHJ res,MemFind
SET t,res physical address of string
GO $0,DoInst
BN t,TrapDone
BZ t,1F
ADD xx,xx,t
2ADDU z,t,z
AND t,z,Mem:mask
BZ t,1B
1H SET t,xx
JMP TrapDone
SimFseek IS SimFclose
SimFtell IS SimFclose
GREG @
1H BYTE "Warning: ",0
2H BYTE " at location ",0
3H BYTE #a,0
T0 BYTE "TRIP",0
T1 BYTE "integer divide check",0
T2 BYTE "integer overflow",0
T3 BYTE "float-to-fix overflow",0
T4 BYTE "invalid floating point operation",0
T5 BYTE "floating point overflow",0
T6 BYTE "floating point underflow",0
T7 BYTE "floating point division by zero",0
T8 BYTE "floating point inexact",0
TripType OCTA T0,T1,T2,T3,T4,T5,T6,T7,T8
SimHalt CMP t,zz,1
BZ inst,Exit t=0 on normal exit
BNZ t,Error
CMPU t,loc,#90
BNN t,Error Halt 1 from loc<#90 gives warning
LDA t,1B
TRAP 0,Fputs,StdErr
SR x,loc,1
LDA t,TripType
LDOU t,t,x
TRAP 0,Fputs,StdErr
LDA t,2B
TRAP 0,Fputs,StdErr
LDOU x,g,8*rW
SUBU x,x,4
SRU arg,x,32
PUSHJ res,OutTetra
SET arg,x
PUSHJ res,OutTetra
LDA t,3B
TRAP 0,Fputs,StdErr
LDOU t,g,c255
JMP TrapDone
Error NEG t,22 catch-22
Exit TRAP 0,Halt,0
s IS $1
0H GREG #0008000400020001
:OutTetra MOR t,$0,0B
SLU s,t,4
XOR t,s,t
0H GREG #0f0f0f0f0f0f0f0f
AND t,t,0B
0H GREG #0606060606060606
ADDU t,t,0B
0H GREG #0000002700000000
MOR s,0B,t
0H GREG #2a2a2a2a2a2a2a2a
ADDU t,t,0B
ADDU s,t,s
STOU s,g,c255
GETA t,OctaArgs
TRAP 0,Fwrite,StdErr
POP 0
O IS Done-4
LOC Info
JMP Trap+@-O; BYTE 0,5,0,#0a TRAP
FCMP x,y,z; BYTE 0,1,0,#2a FCMP
FUN x,y,z; BYTE 0,1,0,#2a FUN
FEQL x,y,z; BYTE 0,1,0,#2a FEQL
FADD x,y,z; BYTE 0,4,0,#2a FADD
FIX x,0,z; BYTE 0,4,0,#26 FIX
FSUB x,y,z; BYTE 0,4,0,#2a FSUB
FIXU x,0,z; BYTE 0,4,0,#26 FIXU
FLOT x,0,z; BYTE 0,4,0,#26 FLOT
FLOT x,0,z; BYTE 0,4,0,#25 FLOTI
FLOTU x,0,z; BYTE 0,4,0,#26 FLOTU
FLOTU x,0,z; BYTE 0,4,0,#25 FLOTUI
SFLOT x,0,z; BYTE 0,4,0,#26 SFLOT
SFLOT x,0,z; BYTE 0,4,0,#25 SFLOTI
SFLOTU x,0,z; BYTE 0,4,0,#26 SFLOTU
SFLOTU x,0,z; BYTE 0,4,0,#25 SFLOTUI
FMUL x,y,z; BYTE 0,4,0,#2a FMUL
FCMPE x,y,z; BYTE 0,4,rE,#2a FCMPE
FUNE x,y,z; BYTE 0,1,rE,#2a FUNE
FEQLE x,y,z; BYTE 0,4,rE,#2a FEQLE
FDIV x,y,z; BYTE 0,40,0,#2a FDIV
FSQRT x,0,z; BYTE 0,40,0,#26 FSQRT
FREM x,y,z; BYTE 0,4,0,#2a FREM
FINT x,0,z; BYTE 0,4,0,#26 FINT
MUL x,y,z; BYTE 0,10,0,#2a MUL
MUL x,y,z; BYTE 0,10,0,#29 MULI
JMP MulU+@-O; BYTE 0,10,0,#2a MULU
JMP MulU+@-O; BYTE 0,10,0,#29 MULUI
JMP Div+@-O; BYTE 0,60,0,#2a DIV
JMP Div+@-O; BYTE 0,60,0,#29 DIVI
JMP DivU+@-O; BYTE 0,60,rD,#2a DIVU
JMP DivU+@-O; BYTE 0,60,rD,#29 DIVUI
ADD x,y,z; BYTE 0,1,0,#2a ADD
ADD x,y,z; BYTE 0,1,0,#29 ADDI
ADDU x,y,z; BYTE 0,1,0,#2a ADDU
ADDU x,y,z; BYTE 0,1,0,#29 ADDUI
SUB x,y,z; BYTE 0,1,0,#2a SUB
SUB x,y,z; BYTE 0,1,0,#29 SUBI
SUBU x,y,z; BYTE 0,1,0,#2a SUBU
SUBU x,y,z; BYTE 0,1,0,#29 SUBUI
2ADDU x,y,z; BYTE 0,1,0,#2a 2ADDU
2ADDU x,y,z; BYTE 0,1,0,#29 2ADDUI
4ADDU x,y,z; BYTE 0,1,0,#2a 4ADDU
4ADDU x,y,z; BYTE 0,1,0,#29 4ADDUI
8ADDU x,y,z; BYTE 0,1,0,#2a 8ADDU
8ADDU x,y,z; BYTE 0,1,0,#29 8ADDUI
16ADDU x,y,z; BYTE 0,1,0,#2a 16ADDU
16ADDU x,y,z; BYTE 0,1,0,#29 16ADDUI
CMP x,y,z; BYTE 0,1,0,#2a CMP
CMP x,y,z; BYTE 0,1,0,#29 CMPI
CMPU x,y,z; BYTE 0,1,0,#2a CMPU
CMPU x,y,z; BYTE 0,1,0,#29 CMPUI
NEG x,0,z; BYTE 0,1,0,#26 NEG
NEG x,0,z; BYTE 0,1,0,#25 NEGI
NEGU x,0,z; BYTE 0,1,0,#26 NEGU
NEGU x,0,z; BYTE 0,1,0,#25 NEGUI
SL x,y,z; BYTE 0,1,0,#2a SL
SL x,y,z; BYTE 0,1,0,#29 SLI
SLU x,y,z; BYTE 0,1,0,#2a SLU
SLU x,y,z; BYTE 0,1,0,#29 SLUI
SR x,y,z; BYTE 0,1,0,#2a SR
SR x,y,z; BYTE 0,1,0,#29 SRI
SRU x,y,z; BYTE 0,1,0,#2a SRU
SRU x,y,z; BYTE 0,1,0,#29 SRUI
BN x,BTaken+@-O; BYTE 0,1,0,#50 BN
BN x,BTaken+@-O; BYTE 0,1,0,#50 BNB
BZ x,BTaken+@-O; BYTE 0,1,0,#50 BZ
BZ x,BTaken+@-O; BYTE 0,1,0,#50 BZB
BP x,BTaken+@-O; BYTE 0,1,0,#50 BP
BP x,BTaken+@-O; BYTE 0,1,0,#50 BPB
BOD x,BTaken+@-O; BYTE 0,1,0,#50 BOD
BOD x,BTaken+@-O; BYTE 0,1,0,#50 BODB
BNN x,BTaken+@-O; BYTE 0,1,0,#50 BNN
BNN x,BTaken+@-O; BYTE 0,1,0,#50 BNNB
BNZ x,BTaken+@-O; BYTE 0,1,0,#50 BNZ
BNZ x,BTaken+@-O; BYTE 0,1,0,#50 BNZB
BNP x,BTaken+@-O; BYTE 0,1,0,#50 BNP
BNP x,BTaken+@-O; BYTE 0,1,0,#50 BNPB
BEV x,BTaken+@-O; BYTE 0,1,0,#50 BEV
BEV x,BTaken+@-O; BYTE 0,1,0,#50 BEVB
PBN x,PBTaken+@-O; BYTE 0,3,0,#50 PBN
PBN x,PBTaken+@-O; BYTE 0,3,0,#50 PBNB
PBZ x,PBTaken+@-O; BYTE 0,3,0,#50 PBZ
PBZ x,PBTaken+@-O; BYTE 0,3,0,#50 PBZB
PBP x,PBTaken+@-O; BYTE 0,3,0,#50 PBP
PBP x,PBTaken+@-O; BYTE 0,3,0,#50 PBPB
PBOD x,PBTaken+@-O; BYTE 0,3,0,#50 PBOD
PBOD x,PBTaken+@-O; BYTE 0,3,0,#50 PBODB
PBNN x,PBTaken+@-O; BYTE 0,3,0,#50 PBNN
PBNN x,PBTaken+@-O; BYTE 0,3,0,#50 PBNNB
PBNZ x,PBTaken+@-O; BYTE 0,3,0,#50 PBNZ
PBNZ x,PBTaken+@-O; BYTE 0,3,0,#50 PBNZB
PBNP x,PBTaken+@-O; BYTE 0,3,0,#50 PBNP
PBNP x,PBTaken+@-O; BYTE 0,3,0,#50 PBNPB
PBEV x,PBTaken+@-O; BYTE 0,3,0,#50 PBEV
PBEV x,PBTaken+@-O; BYTE 0,3,0,#50 PBEVB
CSN x,y,z; BYTE 0,1,0,#3a CSN
CSN x,y,z; BYTE 0,1,0,#39 CSNI
CSZ x,y,z; BYTE 0,1,0,#3a CSZ
CSZ x,y,z; BYTE 0,1,0,#39 CSZI
CSP x,y,z; BYTE 0,1,0,#3a CSP
CSP x,y,z; BYTE 0,1,0,#39 CSPI
CSOD x,y,z; BYTE 0,1,0,#3a CSOD
CSOD x,y,z; BYTE 0,1,0,#39 CSODI
CSNN x,y,z; BYTE 0,1,0,#3a CSNN
CSNN x,y,z; BYTE 0,1,0,#39 CSNNI
CSNZ x,y,z; BYTE 0,1,0,#3a CSNZ
CSNZ x,y,z; BYTE 0,1,0,#39 CSNZI
CSNP x,y,z; BYTE 0,1,0,#3a CSNP
CSNP x,y,z; BYTE 0,1,0,#39 CSNPI
CSEV x,y,z; BYTE 0,1,0,#3a CSEV
CSEV x,y,z; BYTE 0,1,0,#39 CSEVI
ZSN x,y,z; BYTE 0,1,0,#2a ZSN
ZSN x,y,z; BYTE 0,1,0,#29 ZSNI
ZSZ x,y,z; BYTE 0,1,0,#2a ZSZ
ZSZ x,y,z; BYTE 0,1,0,#29 ZSZI
ZSP x,y,z; BYTE 0,1,0,#2a ZSP
ZSP x,y,z; BYTE 0,1,0,#29 ZSPI
ZSOD x,y,z; BYTE 0,1,0,#2a ZSOD
ZSOD x,y,z; BYTE 0,1,0,#29 ZSODI
ZSNN x,y,z; BYTE 0,1,0,#2a ZSNN
ZSNN x,y,z; BYTE 0,1,0,#29 ZSNNI
ZSNZ x,y,z; BYTE 0,1,0,#2a ZSNZ
ZSNZ x,y,z; BYTE 0,1,0,#29 ZSNZI
ZSNP x,y,z; BYTE 0,1,0,#2a ZSNP
ZSNP x,y,z; BYTE 0,1,0,#29 ZSNPI
ZSEV x,y,z; BYTE 0,1,0,#2a ZSEV
ZSEV x,y,z; BYTE 0,1,0,#29 ZSEVI
LDB x,res,0; BYTE 1,1,0,#aa LDB
LDB x,res,0; BYTE 1,1,0,#a9 LDBI
LDBU x,res,0; BYTE 1,1,0,#aa LDBU
LDBU x,res,0; BYTE 1,1,0,#a9 LDBUI
LDW x,res,0; BYTE 1,1,0,#aa LDW
LDW x,res,0; BYTE 1,1,0,#a9 LDWI
LDWU x,res,0; BYTE 1,1,0,#aa LDWU
LDWU x,res,0; BYTE 1,1,0,#a9 LDWUI
LDT x,res,0; BYTE 1,1,0,#aa LDT
LDT x,res,0; BYTE 1,1,0,#a9 LDTI
LDTU x,res,0; BYTE 1,1,0,#aa LDTU
LDTU x,res,0; BYTE 1,1,0,#a9 LDTUI
LDO x,res,0; BYTE 1,1,0,#aa LDO
LDO x,res,0; BYTE 1,1,0,#a9 LDOI
LDOU x,res,0; BYTE 1,1,0,#aa LDOU
LDOU x,res,0; BYTE 1,1,0,#a9 LDOUI
LDSF x,res,0; BYTE 1,1,0,#aa LDSF
LDSF x,res,0; BYTE 1,1,0,#a9 LDSFI
LDHT x,res,0; BYTE 1,1,0,#aa LDHT
LDHT x,res,0; BYTE 1,1,0,#a9 LDHTI
JMP Cswap+@-O; BYTE 2,2,0,#ba CSWAP
JMP Cswap+@-O; BYTE 2,2,0,#b9 CSWAPI
LDUNC x,res,0; BYTE 1,1,0,#aa LDUNC
LDUNC x,res,0; BYTE 1,1,0,#a9 LDUNCI
JMP Error+@-O; BYTE 0,1,0,#2a LDVTS
JMP Error+@-O; BYTE 0,1,0,#29 LDVTSI
SWYM 0; BYTE 0,1,0,#0a PRELD
SWYM 0; BYTE 0,1,0,#09 PRELDI
SWYM 0; BYTE 0,1,0,#0a PREGO
SWYM 0; BYTE 0,1,0,#09 PREGOI
JMP Go+@-O; BYTE 0,3,0,#2a GO
JMP Go+@-O; BYTE 0,3,0,#29 GOI
STB x,res,0; BYTE 1,1,0,#9a STB
STB x,res,0; BYTE 1,1,0,#99 STBI
STBU x,res,0; BYTE 1,1,0,#9a STBU
STBU x,res,0; BYTE 1,1,0,#99 STBUI
STW x,res,0; BYTE 1,1,0,#9a STW
STW x,res,0; BYTE 1,1,0,#99 STWI
STWU x,res,0; BYTE 1,1,0,#9a STWU
STWU x,res,0; BYTE 1,1,0,#99 STWUI
STT x,res,0; BYTE 1,1,0,#9a STT
STT x,res,0; BYTE 1,1,0,#99 STTI
STTU x,res,0; BYTE 1,1,0,#9a STTU
STTU x,res,0; BYTE 1,1,0,#99 STTUI
STO x,res,0; BYTE 1,1,0,#9a STO
STO x,res,0; BYTE 1,1,0,#99 STOI
STOU x,res,0; BYTE 1,1,0,#9a STOU
STOU x,res,0; BYTE 1,1,0,#99 STOUI
STSF x,res,0; BYTE 1,1,0,#9a STSF
STSF x,res,0; BYTE 1,1,0,#99 STSFI
STHT x,res,0; BYTE 1,1,0,#9a STHT
STHT x,res,0; BYTE 1,1,0,#99 STHTI
STO xx,res,0; BYTE 1,1,0,#8a STCO
STO xx,res,0; BYTE 1,1,0,#89 STCOI
STUNC x,res,0; BYTE 1,1,0,#9a STUNC
STUNC x,res,0; BYTE 1,1,0,#99 STUNCI
SWYM 0; BYTE 0,1,0,#0a SYNCD
SWYM 0; BYTE 0,1,0,#09 SYNCDI
SWYM 0; BYTE 0,1,0,#0a PREST
SWYM 0; BYTE 0,1,0,#09 PRESTI
SWYM 0; BYTE 0,1,0,#0a SYNCID
SWYM 0; BYTE 0,1,0,#09 SYNCIDI
JMP PushGo+@-O; BYTE 0,3,0,#2a PUSHGO
JMP PushGo+@-O; BYTE 0,3,0,#29 PUSHGOI
OR x,y,z; BYTE 0,1,0,#2a OR
OR x,y,z; BYTE 0,1,0,#29 ORI
ORN x,y,z; BYTE 0,1,0,#2a ORN
ORN x,y,z; BYTE 0,1,0,#29 ORNI
NOR x,y,z; BYTE 0,1,0,#2a NOR
NOR x,y,z; BYTE 0,1,0,#29 NORI
XOR x,y,z; BYTE 0,1,0,#2a XOR
XOR x,y,z; BYTE 0,1,0,#29 XORI
AND x,y,z; BYTE 0,1,0,#2a AND
AND x,y,z; BYTE 0,1,0,#29 ANDI
ANDN x,y,z; BYTE 0,1,0,#2a ANDN
ANDN x,y,z; BYTE 0,1,0,#29 ANDNI
NAND x,y,z; BYTE 0,1,0,#2a NAND
NAND x,y,z; BYTE 0,1,0,#29 NANDI
NXOR x,y,z; BYTE 0,1,0,#2a NXOR
NXOR x,y,z; BYTE 0,1,0,#29 NXORI
BDIF x,y,z; BYTE 0,1,0,#2a BDIF
BDIF x,y,z; BYTE 0,1,0,#29 BDIFI
WDIF x,y,z; BYTE 0,1,0,#2a WDIF
WDIF x,y,z; BYTE 0,1,0,#29 WDIFI
TDIF x,y,z; BYTE 0,1,0,#2a TDIF
TDIF x,y,z; BYTE 0,1,0,#29 TDIFI
ODIF x,y,z; BYTE 0,1,0,#2a ODIF
ODIF x,y,z; BYTE 0,1,0,#29 ODIFI
MUX x,y,z; BYTE 0,1,rM,#2a MUX
MUX x,y,z; BYTE 0,1,rM,#29 MUXI
SADD x,y,z; BYTE 0,1,0,#2a SADD
SADD x,y,z; BYTE 0,1,0,#29 SADDI
MOR x,y,z; BYTE 0,1,0,#2a MOR
MOR x,y,z; BYTE 0,1,0,#29 MORI
MXOR x,y,z; BYTE 0,1,0,#2a MXOR
MXOR x,y,z; BYTE 0,1,0,#29 MXORI
SET x,z; BYTE 0,1,0,#20 SETH
SET x,z; BYTE 0,1,0,#20 SETMH
SET x,z; BYTE 0,1,0,#20 SETML
SET x,z; BYTE 0,1,0,#20 SETL
ADDU x,x,z; BYTE 0,1,0,#30 INCH
ADDU x,x,z; BYTE 0,1,0,#30 INCMH
ADDU x,x,z; BYTE 0,1,0,#30 INCML
ADDU x,x,z; BYTE 0,1,0,#30 INCL
OR x,x,z; BYTE 0,1,0,#30 ORH
OR x,x,z; BYTE 0,1,0,#30 ORMH
OR x,x,z; BYTE 0,1,0,#30 ORML
OR x,x,z; BYTE 0,1,0,#30 ORL
ANDN x,x,z; BYTE 0,1,0,#30 ANDNH
ANDN x,x,z; BYTE 0,1,0,#30 ANDNMH
ANDN x,x,z; BYTE 0,1,0,#30 ANDNML
ANDN x,x,z; BYTE 0,1,0,#30 ANDNL
SET inst_ptr,yz; BYTE 0,1,0,#41 JMP
SET inst_ptr,yz; BYTE 0,1,0,#41 JMPB
JMP PushJ+@-O; BYTE 0,1,0,#60 PUSHJ
JMP PushJ+@-O; BYTE 0,1,0,#60 PUSHJB
SET x,yz; BYTE 0,1,0,#60 GETA
SET x,yz; BYTE 0,1,0,#60 GETAB
JMP Put+@-O; BYTE 0,1,0,#02 PUT
JMP Put+@-O; BYTE 0,1,0,#01 PUTI
JMP Pop+@-O; BYTE 0,3,rJ,#00 POP
JMP Resume+@-O; BYTE 0,5,0,#00 RESUME
JMP Save+@-O; BYTE 20,1,0,#20 SAVE
JMP Unsave+@-O; BYTE 20,1,0,#02 UNSAVE
JMP Sync+@-O; BYTE 0,1,0,#01 SYNC
SWYM x,y,z; BYTE 0,1,0,#00 SWYM
JMP Get+@-O; BYTE 0,1,0,#20 GET
JMP Trip+@-O; BYTE 0,5,0,#0a TRIP
Done AND t,f,X_is_dest_bit % doubly defined but OK
BZ t,1F
XDone STOU x,xptr,0
1H GET t,rA
AND t,t,#ff
OR exc,exc,t
AND t,exc,U_BIT+X_BIT Check for trip, \S123
CMPU t,t,U_BIT
PBNZ t,1F branch unless underflow is exact
0H GREG U_BIT<<8
AND t,aa,0B
BNZ t,1F branch if underflow is enabled
ANDNL exc,U_BIT ignore U if exact and not enabled
1H PBZ exc,Update
SRU t,aa,8
AND t,t,exc
PBZ t,4F
SET xx,0 Initiate a trip, \S124
SLU t,t,55
2H INCL xx,1
SLU t,t,1
PBNN t,2B
SET t,#100
SRU t,t,xx
ANDN exc,exc,t
TakeTrip STOU inst_ptr,g,8*rW
SLU inst_ptr,xx,4
INCH inst,#8000
STOU inst,g,8*rX
AND t,f,Mem_bit
PBZ t,1F
ADDU y,y,z
SET z,x
1H STOU y,g,8*rY
STOU z,g,8*rZ
LDOU t,g,c255
STOU t,g,8*rB
LDOU t,g,8*rJ
STOU t,g,c255
4H OR aa,aa,exc
0H GREG #0000000800000004 Update the clocks, \S128
Update MOR t,f,0B $2^{32}$mems + oops
ADDU cc,cc,t
ADDU uu,uu,1
SUBU ii,ii,1
AllDone PBZ resuming,Fetch
CMPU t,op,#F9 RESUME
CSNZ resuming,t,0
JMP Fetch
OctaArgs OCTA Global+8*255,8
Infile IS 3
Main LDA Mem:head,Chunk0
ADDU Mem:alloc,Mem:head,Mem:nodesize
GET t,rN
INCL t,1
STOU t,g,8*rN
LDOU t,$1,8 argv[1]
STOU t,IOArgs
LDA t,IOArgs
TRAP 0,Fopen,Infile
BN t,Error
1H GETA t,OctaArgs
TRAP 0,Fread,Infile
BN t,9F
LDOU loc,g,c255
2H GETA t,OctaArgs
TRAP 0,Fread,Infile
LDOU x,g,c255
BN t,Error
SET arg,loc
BZ x,1B
PUSHJ res,MemFind
STOU x,res,0
INCL loc,8
JMP 2B
9H TRAP 0,Fclose,Infile
SUBU loc,loc,8
STOU loc,g,c255 place to UNSAVE
SUBU arg,loc,8*13
PUSHJ res,MemFind
LDOU inst_ptr,res,0 Main
SET arg,#90 Get ready to UNSAVE, \S162
PUSHJ res,MemFind
LDTU x,res,0
SET resuming,1 RESUME_AGAIN
CSNZ inst_ptr,x,#90
0H GREG #FB<<24+255 UNSAVE $255
STOU 0B,g,8*rX
SET gg,c255
JMP Fetch
LOC Global+8*rK; OCTA -1
LOC Global+8*rT; OCTA #8000000500000000
LOC Global+8*rTT; OCTA #8000000600000000
LOC Global+8*rV; OCTA #369c200400000000
LOC U_Handler
ORL exc,U_BIT
JMP Done