Cycles:
0

Registers:

PC:
0
SP:
0
IA:
0
EX:
0
A:
0
B:
0
C:
0
X:
0
Y:
0
Z:
0
I:
0
J:
0

Memory dump:

    ; Try some basic stuff
                  SET A, 0x30              ; 7c01 0030
                  SET [0x1000], 0x20       ; 7de1 1000 0020
                  SUB A, [0x1000]          ; 7803 1000
                  IFN A, 0x10              ; c00d
                     SET PC, crash         ; 7dc1 001a [*]

    ; Do a loopy thing
                  SET I, 10                ; a861
                  SET A, 0x2000            ; 7c01 2000
    :loop         SET [0x2000+I], [A]      ; 2161 2000
                  SUB I, 1                 ; 8463
                  IFN I, 0                 ; 806d
                     SET PC, loop          ; 7dc1 000d [*]

    ; Call a subroutine
                  SET X, 0x4               ; 9031
                  JSR testsub              ; 7c10 0018 [*]
                  SET PC, crash            ; 7dc1 001a [*]

    :testsub      SHL X, 4                 ; 9037
                  SET PC, POP              ; 61c1

    ; Hang forever. X should now be 0x40 if everything went right.
    :crash        SET PC, crash            ; 7dc1 001a [*]

    ; [*]: Note that these can be one word shorter and one cycle faster by using the short form (0x00-0x1f) of literals,
    ;      but my assembler doesn't support short form labels yet.