This version of spinsim supports about two-thirds of the opcodes in the P2 instruction set. The list of implemented opcodes is shown below, along with the list of opcodes that have not been implemented yet. Spinsim runs in the P1 mode by default. It can be set to run in the P2 mode with the -t parameter.
In the P2 mode, spinsim will load a P2 OBJ file into hub RAM, and start cog 0 with the code located at $E00. A simulated serial port is supported by using the -b option. The default baud rate is 115,200, but other rates can be used by specifying it with -b, such as -b9600. The serial port uses pin 31 and 30, just like with P1.
Spinsim is built using the Makefile, and typing make. I have successfully built and run it under Cygwin and Ubuntu Linux.
The sample program, pfth.spin can be run by building it with the PNut P2 assembler. PNut is contained in the Terasic_Prop2_Emulation zip file, which can be downloaded from the first post in the “HUB EXEC Update Here” thread in the Propeller 2 forum.
There are two demo programs, which are the pfth Forth interpreter and the p1spin Spin interpreter that runs P1 Spin binaries on the P2 processor. The pfth program is run under spinsim as follows:
./spinsim -t -b pfth.obj
p1spin runs at a baud rate of 57600, so it is run as follows:
./spinsim -t -b57600 p1spin.obj
Spinsim supports execution from cog memory and hub execution, but it does not support multi-tasking. Only the core processor is supported, and none of the counters, video hardware or cordic hardware is simulated. Support for multi- tasking, peripheral hardware and cordic instructions will be added later.
Spinsim contains a simple debugger, which is enabled with the -d command-line option. The debugger prints the prompt “DEBUG>” to indicate that it is ready to accept a command. The “help” command will print the following:
Debug Commands help - Print command list exit - Exit spinsim step - Run one cycle stepx - Run next executed instruction run - Run continuously verbose # - Set verbosity level reboot - Reboot the Prop setbr cog addr - Set breakpoint for cog to addr state cog - Dump cog state
The “step” command will run one cycle, and the “stepx” command will run any non-executing cycles until it encounters an instruction that is executed. The previous command can be executed again by just pushing the enter key. This is useful for stepping where the “step” command is typed once, and the enter key can then be used to step again.
The “run” command will run until a breakpoint is encountered or ^] is typed. ^] is typed by holding down the control key and pressing the “]” key. While running, spinsim will print out the results of each cycle as controlled by the verbosity level, which is set by the “verbose” command. The verbosity level can also be set with the command-line parameter “-v#”.
The verbosity levels are as follows:
0 - Disable printing 1 - Print only the executed instructions 2 - Print only the executed instructions, and show the execution results 3 - Print executed and instruction not executed due to condition code 4 - Also print instructions invalidated in the pipeline due to jumps 5 - Also print instructions that include hub and hardware waits 6 - Also print instructions that include icache waits 7 - Also print instructions waiting for a pin state 8 - Print all cycles, including waitcnt waits
The verbosity level is entered as a hexadecimal number. If the verbosity level is entered as a single digit it will apply to all cogs. If more than one digit is entered each digit will be used for each cog, starting with cog 0 for the right-most digit. As an example, a value of 456 will cause 6 to be used for cog 0, 5 for cog 1, and 4 for cog 2. All other cogs will use 0.
abs add addabs addptra addptrb addptrx addptry adds addsx addx and andn augd augs bingry blmask call calla callad callb callbd calld callx callxd cally callyd chkptrx chkptry clkset clracca clraccb clraccs clrb clrp cmp cmpcnt cmps cmpsub cmpsx cmpx cogid coginit cognew cogstop dcachex decd decds decmod decod2 decod3 decod4 decod5 div32 div32u div64 div64d div64u djnz djnzd djz djzd encod fixinda fixindb fixindx frac getacah getacal getacbh getacbl getbyte getcnt getdivq getdivr getmulh getmull getnib getnp getp getptra getptrb getptrx getptry getsqrt getword icachen icachep icachex ijnz ijnzd ijz ijzd incd incds incmod isob jmp jmpd jmpsw jmpswd jnp jnpd jnz jnzd jp jpd jz jzd locbase locbyte lockclr locknew lockret lockset loclong locptra locptrb locword maca macb max maxs mergew min mins mov mul mul32 mul32u muxc muxnc muxnz muxz neg negc negnc negnz negz not notb notp offp onecnt or pop popzc push pushzc rcl rcr rdaux rdauxr rdbyte rdbytec rdlong rdlongc rdwide rdwidec rdword rdwordc repd reps ret reta retad retb retbd retd retx retxd rety retyd rev rol ror sar saracca saraccb saraccs setacca setaccb setb setbc setbnc setbnz setbyte setbz setd seti setindb setindx setnib setp setpc setpnc setpnz setptra setptrb setptrx setptry setpz sets setwide setwidz setword setzc seussf seussr shl shr splitw sqrt32 sqrt64 sub subabs subcnt subptra subptrb subptrx subptry subr subs subsx subx sumc sumnc sumnz sumz test testn wait waitcnt waitpeq waitpne wraux wrauxr wrbyte wrlong wrwide wrword xor zercnt
addphsa addphsb addphss addpix bcdbin binbcd blnpix capctra capctrb capctrs cfgdac0 cfgdac1 cfgdac2 cfgdac3 cfgdacs cfgpins cmpr decpat eswap4 eswap8 getcntx getcosa getcosb getlfsr getphsa getphsb getphza getphzb getpix getqx getqy getqz getsina getsinb grybin incpat jmplist jmptask locinst mergeb mixpix movbyts mulpix packrgb passcnt polctra polctrb polvid qartan qexp qlog qrotate qsincos rolbyte rolnib rolword scl serina serinb serouta seroutb setbyts setctra setctrb setctrs setdac0 setdac1 setdac2 setdac3 setdacs setfrqa setfrqb setfrqs setmap setmix setphsa setphsb setphss setpix setpixa setpixb setpixg setpixr setpixu setpixv setpixw setpixz setpora setporb setporc setpord setqi setqz setrace setsera setserb settask setvid setvidi setvidq setvidy setwava setwavb setwavs setwrds setx setxch setxft splitb subphsa subphsb subphss synctra synctrb taskid testb unpkrgb waitpf waitpr waitpx waitvid