.sub _main _set_machine_info() _read_memory() _setup() _main2() end .end .sub _setup print "Setting up the Z-machine\n" .end .sub _global_var noop # for now .end ############################################# # Global macros .macro signed_word (VAL) # changes 0..65535 -> 0..32767, -32768..-1 if .VAL < 0x8000 goto .$LOOP .VAL -= 0x10000 .local $LOOP: .endm .macro loadb_indexed (RESULT, ARR, BYTE_INDEX) $I0 = .ARR $I1 = .BYTE_INDEX $I0 += $I1 $I0 &= 0xffff # in case 65535 is represented as -1 .RESULT = memory[$I0] .endm .macro loadw_indexed (RESULT, ARR, WORD_INDEX) $I0 = .ARR $I1 = .WORD_INDEX $I1 *= 2 $I0 += $I1 $I0 &= 0xffff # index $I2 = memory[$I0] $I2 *= 0x100 inc $I0 $I3 = memory[$I0] $I2 += $I3 .RESULT = $I2 .endm .macro storeb_indexed (VALUE, ARR, BYTE_INDEX) $I0 = .ARR $I1 = .BYTE_INDEX $I0 += $I1 $I0 &= 0xffff # in case 65535 is represented as -1 $I2 = .VALUE $I2 &= 0xff memory[$I0] = $I2 .endm .macro storew_indexed (VALUE, ARR, WORD_INDEX) $I0 = .ARR $I1 = .WORD_INDEX $I1 *= 2 $I0 += $I1 $I0 &= 0xffff # in case 65535 is represented as -1 $I2 = .VALUE $I3 = $I2 >> 8 memory[$I0] = $I3 $I3 = $I2 % 0x100 inc $I0 memory[$I0] = $I3 .endm ############################################# # Add 16 numbers to memory, from a string like " 01 a3 ..." # Parrot has no 'hex'? .macro get_hexnum $S1 = str[strpos] $I1 = ord $S1 $I1 -= 48 if $I1 < 10 goto .$LOOP $I1 -= 39 .local $LOOP: .endm .sub _mem_add .param int mempos # where are we currently in memory? .param string str .local int val .local int strpos .local pmc mem .local int len strpos = 1 # skip first space mem = global "_Z_Memory" len = length str Lstart: .get_hexnum # sets $I1 to "tens" digit inc strpos val = $I1 * 0x10 .get_hexnum val += $I1 strpos += 2 mem[mempos] = val inc mempos if strpos < len goto Lstart global "_Z_Memory" = mem .end