commit 52598bdad71d5d37f0de18744124e15b15e6f18a
parent 6980abacfca50ed8058a31462b781e6801fa8082
Author: Andrew Alderwick <andrew@alderwick.co.uk>
Date: Sun, 2 Jan 2022 23:05:28 +0000
Remove uxn-fast.c since new reference core is almost as fast.
Diffstat:
M | build.sh | | | 2 | +- |
D | etc/mkuxn-fast.lua | | | 389 | ------------------------------------------------------------------------------- |
D | etc/mkuxn-fast.moon | | | 280 | ------------------------------------------------------------------------------- |
D | src/uxn-fast.c | | | 4041 | ------------------------------------------------------------------------------- |
4 files changed, 1 insertion(+), 4711 deletions(-)
diff --git a/build.sh b/build.sh
@@ -57,7 +57,7 @@ then
CORE='src/uxn.c'
else
CFLAGS="${CFLAGS} -DNDEBUG -Os -g0 -s"
- CORE='src/uxn-fast.c'
+ CORE='src/uxn.c'
fi
echo "Building.."
diff --git a/etc/mkuxn-fast.lua b/etc/mkuxn-fast.lua
@@ -1,389 +0,0 @@
-local generate_labels = false
-local replacements = {
- op_and16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d & b); push8(u->src, c & a); }',
- op_ora16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d | b); push8(u->src, c | a); }',
- op_eor16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d ^ b); push8(u->src, c ^ a); }',
- op_lit16 = '{ push8(u->src, peek8(u->ram.dat, u->ram.ptr++)); push8(u->src, peek8(u->ram.dat, u->ram.ptr++)); }',
- op_swp16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, b); push8(u->src, a); push8(u->src, d); push8(u->src, c); }',
- op_ovr16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d); push8(u->src, c); push8(u->src, b); push8(u->src, a); push8(u->src, d); push8(u->src, c); }',
- op_dup16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b); push8(u->src, a); push8(u->src, b); push8(u->src, a); }',
- op_rot16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src), e = pop8(u->src), f = pop8(u->src); push8(u->src, d); push8(u->src, c); push8(u->src, b); push8(u->src, a); push8(u->src, f); push8(u->src, e); }',
- op_sth16 = '{ Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->dst, b); push8(u->dst, a); }'
-}
-local top, bottom, pushtop
-local offset
-offset = function(n, s)
- if s == nil then
- s = ''
- end
- if n < 0 then
- return (' -%s %d'):format(s, -n)
- elseif n > 0 then
- return (' +%s %d'):format(s, n)
- elseif s ~= '' then
- return (' +%s 0'):format(s)
- else
- return ''
- end
-end
-local pop_push
-pop_push = function(k, n, s)
- local _exp_0 = k
- if 'pop' == _exp_0 then
- s = s:match('^%((%S+)%)$')
- assert(s == 'src')
- local _exp_1 = n
- if '8' == _exp_1 then
- top[s] = top[s] - 1
- if bottom[s] > top[s] then
- bottom[s] = top[s]
- end
- return ('%s.dat[%s.ptr%s]'):format(s, s, offset(top[s]))
- elseif '16' == _exp_1 then
- top[s] = top[s] - 2
- if bottom[s] > top[s] then
- bottom[s] = top[s]
- end
- return ('(%s.dat[%s.ptr%s] | (%s.dat[%s.ptr%s] << 8))'):format(s, s, offset(top[s] + 1), s, s, offset(top[s]))
- end
- elseif 'push' == _exp_0 then
- local v
- s, v = s:match('^%((%S+), (.*)%)$')
- assert(s == 'src' or s == 'dst', s)
- local _exp_1 = n
- if '8' == _exp_1 then
- pushtop[s] = pushtop[s] + 1
- return ('%s.dat[%s.ptr%s] = %s'):format(s, s, offset(pushtop[s] - 1), v)
- elseif '16' == _exp_1 then
- if v:match('%+%+') or v:match('%-%-') then
- error('push16 has side effects: ' .. v)
- end
- local peek, args = v:match('^([md]e[mv]peek)16(%b())$')
- if peek then
- args = args:sub(2, -2)
- return pop_push('push', '8', ('(%s, %s8(%s))'):format(s, peek, args)) .. ';\n' .. pop_push('push', '8', ('(%s, %s8(%s + 1))'):format(s, peek, args))
- end
- pushtop[s] = pushtop[s] + 2
- if v:match(' ') then
- v = '(' .. v .. ')'
- end
- return ('%s.dat[%s.ptr%s] = %s >> 8;\n%s.dat[%s.ptr%s] = %s & 0xff'):format(s, s, offset(pushtop[s] - 2), v, s, s, offset(pushtop[s] - 1), v)
- end
- else
- return nil
- end
-end
-local indented_block
-indented_block = function(s)
- s = s:gsub('^%{ *', '{\n'):gsub('\n', '\n\t'):gsub('\t%} *$', '}\n')
- s = s:gsub('\n[^\n]+%.error = [^\n]+', '%0\n#ifndef NO_STACK_CHECKS\n\tgoto error;\n#endif')
- return s
-end
-local process
-process = function(body)
- local out_body = body:gsub('^%{ *', ''):gsub(' *%}$', ''):gsub('; ', ';\n'):gsub('%b{} *', indented_block):gsub('(%a+)(%d+)(%b())', pop_push)
- local in_ifdef = false
- local _list_0 = {
- 'src',
- 'dst'
- }
- for _index_0 = 1, #_list_0 do
- local k = _list_0[_index_0]
- if bottom[k] ~= 0 then
- if not in_ifdef then
- out_body = out_body .. '\n#ifndef NO_STACK_CHECKS'
- in_ifdef = true
- end
- out_body = out_body .. ('\nif(__builtin_expect(%s.ptr < %d, 0)) {\n\t%s.error = 1;\n\tgoto error;\n}'):format(k, -bottom[k], k)
- end
- if pushtop[k] ~= 0 then
- if pushtop[k] > 0 then
- if not in_ifdef then
- out_body = out_body .. '\n#ifndef NO_STACK_CHECKS'
- in_ifdef = true
- end
- out_body = out_body .. ('\nif(__builtin_expect(%s.ptr > %d, 0)) {\n\t%s.error = 2;\n\tgoto error;\n}'):format(k, 255 - pushtop[k], k)
- end
- if in_ifdef then
- out_body = out_body .. '\n#endif'
- in_ifdef = false
- end
- out_body = out_body .. ('\n%s.ptr %s= %d;'):format(k, pushtop[k] < 0 and '-' or '+', math.abs(pushtop[k]))
- end
- end
- if in_ifdef then
- out_body = out_body .. '\n#endif'
- in_ifdef = false
- end
- local t = { }
- out_body:gsub('[^%w_]([a-f]) = (src%.dat%[[^]]+%])[,;]', function(v, k)
- t[k] = v
- end)
- out_body = out_body:gsub('(src%.dat%[[^]]+%]) = ([a-f]);\n', function(k, v)
- if t[k] and t[k] == v then
- return ''
- end
- return nil
- end)
- return out_body
-end
-local ops = { }
-for l in assert(io.lines('src/uxn.c')) do
- local _continue_0 = false
- repeat
- local name, body = l:match('void (op_%S*)%(Uxn %*u%) (%b{})')
- if not name then
- _continue_0 = true
- break
- end
- if replacements[name] then
- body = replacements[name]
- end
- body = body:gsub('u%-%>src%-%>', 'src.')
- body = body:gsub('u%-%>dst%-%>', 'dst.')
- body = body:gsub('u%-%>src', 'src')
- body = body:gsub('u%-%>dst', 'dst')
- top = {
- src = 0,
- dst = 0
- }
- bottom = {
- src = 0,
- dst = 0
- }
- pushtop = top
- ops[name] = process(body)
- top = {
- src = 0,
- dst = 0
- }
- bottom = {
- src = 0,
- dst = 0
- }
- pushtop = {
- src = 0,
- dst = 0
- }
- ops['keep_' .. name] = process(body)
- _continue_0 = true
- until true
- if not _continue_0 then
- break
- end
-end
-local dump
-dump = function(s, src, dst)
- local ret = '\t\t\t{\n'
- for l in s:gmatch('[^\n]+') do
- if not l:match('^%#') then
- ret = ret .. '\t\t\t\t'
- end
- ret = ret .. ('%s\n'):format(l)
- end
- ret = ret .. '\t\t\t}\n\t\t\tbreak;\n'
- return (ret:gsub('src', src):gsub('dst', dst))
-end
-local i = 0
-local allops = { }
-local wanted = false
-for l in assert(io.lines('src/uxn.c')) do
- if l == 'static void (*ops[])(Uxn *u) = {' then
- wanted = true
- elseif l == '};' then
- wanted = false
- elseif wanted then
- l = l:gsub('%/%b**%/', '')
- for op in l:gmatch('[%w_]+') do
- if not ops[op] then
- error('missing ' .. op)
- end
- allops[i + 0x00 + 1] = {
- n = {
- i + 0x00
- },
- body = dump(ops[op], 'u->wst', 'u->rst')
- }
- allops[i + 0x20 + 1] = {
- n = {
- i + 0x20
- },
- body = dump(ops[op], 'u->rst', 'u->wst')
- }
- allops[i + 0x80 + 1] = {
- n = {
- i + 0x80
- },
- body = dump(ops['keep_' .. op], 'u->wst', 'u->rst')
- }
- allops[i + 0xa0 + 1] = {
- n = {
- i + 0xa0
- },
- body = dump(ops['keep_' .. op], 'u->rst', 'u->wst')
- }
- i = i + 1
- if i == 0x20 then
- i = i + 0x20
- end
- end
- end
-end
-i = 0
-wanted = false
-for l in assert(io.lines('src/uxnasm.c')) do
- if l == 'static char ops[][4] = {' then
- wanted = true
- elseif l == '};' then
- wanted = false
- elseif wanted then
- for op in l:gmatch('"(...)"') do
- i = i + 1
- allops[i + 0x00].name = op
- allops[i + 0x20].name = op .. 'r'
- allops[i + 0x40].name = op .. '2'
- allops[i + 0x60].name = op .. '2r'
- allops[i + 0x80].name = op .. 'k'
- allops[i + 0xa0].name = op .. 'kr'
- allops[i + 0xc0].name = op .. '2k'
- allops[i + 0xe0].name = op .. '2kr'
- end
- end
-end
-for i = 1, 256 do
- local _continue_0 = false
- repeat
- if not allops[i] then
- _continue_0 = true
- break
- end
- for j = i + 1, 256 do
- if allops[i].body == allops[j].body then
- table.insert(allops[i].n, (table.remove(allops[j].n)))
- allops[j].body = nil
- end
- end
- _continue_0 = true
- until true
- if not _continue_0 then
- break
- end
-end
-do
- local _with_0 = assert(io.open('src/uxn-fast.c', 'w'))
- local f = assert(io.open('src/uxn.c'))
- while true do
- local l = f:read('*l')
- _with_0:write(('%s\n'):format(l))
- if l == '*/' then
- break
- end
- end
- _with_0:write('\n')
- _with_0:write([[/*
- ^
-/!\ THIS FILE IS AUTOMATICALLY GENERATED
----
-
-Its contents can get overwritten with the processed contents of src/uxn.c.
-See etc/mkuxn-fast.moon for instructions.
-
-*/
-]])
- wanted = true
- while true do
- local _continue_0 = false
- repeat
- local l = f:read('*l')
- if l:match(' push') or l:match('[ *]pop') or l:match('devr16') then
- _continue_0 = true
- break
- end
- if l == '/* Stack */' then
- wanted = false
- end
- if wanted then
- _with_0:write(('%s\n'):format(l))
- end
- if l == '}' then
- _with_0:write('\n')
- break
- end
- _continue_0 = true
- until true
- if not _continue_0 then
- break
- end
- end
- _with_0:write([[/* clang-format on */
-
-#pragma mark - Core
-
-int
-uxn_eval(Uxn *u, Uint16 vec)
-{
- Uint8 instr;
- if(!vec || u->dev[0].dat[0xf])
- return 0;
- u->ram.ptr = vec;
- if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8;
- while((instr = u->ram.dat[u->ram.ptr++])) {
- switch(instr) {
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-value"
-#pragma GCC diagnostic ignored "-Wunused-variable"
-]])
- for i = 1, 256 do
- local _continue_0 = false
- repeat
- if not allops[i].body then
- _continue_0 = true
- break
- end
- local _list_0 = allops[i].n
- for _index_0 = 1, #_list_0 do
- local n = _list_0[_index_0]
- _with_0:write(('\t\tcase 0x%02x: /* %s */\n'):format(n, allops[n + 1].name))
- end
- if generate_labels then
- _with_0:write(('\t\t\t__asm__("evaluxn_%02x_%s:");\n'):format(allops[i].n[1], allops[i].name))
- end
- _with_0:write(allops[i].body)
- _continue_0 = true
- until true
- if not _continue_0 then
- break
- end
- end
- _with_0:write([[#pragma GCC diagnostic pop
- }
- }
- return 1;
-#ifndef NO_STACK_CHECKS
-error:
- if(u->wst.error)
- return uxn_halt(u, u->wst.error, "Working-stack", instr);
- else
- return uxn_halt(u, u->rst.error, "Return-stack", instr);
-#endif
-}
-
-int
-]])
- wanted = false
- while true do
- local l = f:read('*l')
- if not l then
- break
- end
- if l:match('^uxn_boot') then
- wanted = true
- end
- if wanted then
- _with_0:write(('%s\n'):format(l))
- end
- end
- f:close()
- _with_0:close()
- return _with_0
-end
diff --git a/etc/mkuxn-fast.moon b/etc/mkuxn-fast.moon
@@ -1,280 +0,0 @@
---
--- Uxn core unroller script
---
--- This script updates src/uxn-fast.c when Uxn's opcode set changes, so that
--- updates in the human-readable src/uxn.c core can be easily converted into
--- high-performance code.
---
--- To run, you need Lua or LuaJIT, and just run etc/mkuxn-fast.lua from the top
--- directory of Uxn's git repository:
---
--- lua etc/mkuxn-fast.lua
---
--- This file is written in MoonScript, which is a language that compiles to
--- Lua, the same way as e.g. CoffeeScript compiles to JavaScript. Since
--- installing MoonScript has more dependencies than Lua, the compiled
--- etc/mkuxn-fast.lua is kept in Uxn's repository and will be kept updated as
--- this file changes.
---
-
-generate_labels = false -- add labels to each opcode to inspect disassembled code
-
-replacements =
- op_and16: '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d & b); push8(u->src, c & a); }'
- op_ora16: '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d | b); push8(u->src, c | a); }'
- op_eor16: '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d ^ b); push8(u->src, c ^ a); }'
- op_lit16: '{ push8(u->src, peek8(u->ram.dat, u->ram.ptr++)); push8(u->src, peek8(u->ram.dat, u->ram.ptr++)); }'
- op_swp16: '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, b); push8(u->src, a); push8(u->src, d); push8(u->src, c); }'
- op_ovr16: '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src); push8(u->src, d); push8(u->src, c); push8(u->src, b); push8(u->src, a); push8(u->src, d); push8(u->src, c); }'
- op_dup16: '{ Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b); push8(u->src, a); push8(u->src, b); push8(u->src, a); }'
- op_rot16: '{ Uint8 a = pop8(u->src), b = pop8(u->src), c = pop8(u->src), d = pop8(u->src), e = pop8(u->src), f = pop8(u->src); push8(u->src, d); push8(u->src, c); push8(u->src, b); push8(u->src, a); push8(u->src, f); push8(u->src, e); }'
- op_sth16: '{ Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->dst, b); push8(u->dst, a); }'
-
-local top, bottom, pushtop
-
-offset = (n, s = '') ->
- if n < 0
- ' -%s %d'\format s, -n
- elseif n > 0
- ' +%s %d'\format s, n
- elseif s != ''
- ' +%s 0'\format s
- else
- ''
-
-pop_push = (k, n, s) ->
- switch k
- when 'pop'
- s = s\match '^%((%S+)%)$'
- assert s == 'src'
- switch n
- when '8'
- top[s] -= 1
- if bottom[s] > top[s]
- bottom[s] = top[s]
- '%s.dat[%s.ptr%s]'\format s, s, offset(top[s])
- when '16'
- top[s] -= 2
- if bottom[s] > top[s]
- bottom[s] = top[s]
- '(%s.dat[%s.ptr%s] | (%s.dat[%s.ptr%s] << 8))'\format s, s, offset(top[s] + 1), s, s, offset(top[s])
- when 'push'
- s, v = s\match '^%((%S+), (.*)%)$'
- assert s == 'src' or s == 'dst', s
- switch n
- when '8'
- pushtop[s] += 1
- '%s.dat[%s.ptr%s] = %s'\format s, s, offset(pushtop[s] - 1), v
- when '16'
- if v\match'%+%+' or v\match'%-%-'
- error 'push16 has side effects: ' .. v
- peek, args = v\match '^([md]e[mv]peek)16(%b())$'
- if peek
- args = args\sub 2, -2
- return pop_push('push', '8', '(%s, %s8(%s))'\format s, peek, args) .. ';\n' .. pop_push('push', '8', '(%s, %s8(%s + 1))'\format s, peek, args)
- pushtop[s] += 2
- if v\match ' '
- v = '(' .. v .. ')'
- '%s.dat[%s.ptr%s] = %s >> 8;\n%s.dat[%s.ptr%s] = %s & 0xff'\format s, s, offset(pushtop[s] - 2), v, s, s, offset(pushtop[s] - 1), v
- else
- nil
-
-indented_block = (s) ->
- s = s\gsub('^%{ *', '{\n')\gsub('\n', '\n\t')\gsub('\t%} *$', '}\n')
- s = s\gsub('\n[^\n]+%.error = [^\n]+', '%0\n#ifndef NO_STACK_CHECKS\n\tgoto error;\n#endif')
- s
-
-process = (body) ->
- out_body = body\gsub('^%{ *', '')\gsub(' *%}$', '')\gsub('; ', ';\n')\gsub('%b{} *', indented_block)\gsub '(%a+)(%d+)(%b())', pop_push
- in_ifdef = false
- for k in *{'src', 'dst'}
- if bottom[k] != 0
- if not in_ifdef
- out_body ..= '\n#ifndef NO_STACK_CHECKS'
- in_ifdef = true
- out_body ..= '\nif(__builtin_expect(%s.ptr < %d, 0)) {\n\t%s.error = 1;\n\tgoto error;\n}'\format k, -bottom[k], k
- if pushtop[k] != 0
- if pushtop[k] > 0
- if not in_ifdef
- out_body ..= '\n#ifndef NO_STACK_CHECKS'
- in_ifdef = true
- out_body ..= '\nif(__builtin_expect(%s.ptr > %d, 0)) {\n\t%s.error = 2;\n\tgoto error;\n}'\format k, 255 - pushtop[k], k
- if in_ifdef
- out_body ..= '\n#endif'
- in_ifdef = false
- out_body ..= '\n%s.ptr %s= %d;'\format k, pushtop[k] < 0 and '-' or '+', math.abs pushtop[k]
- if in_ifdef
- out_body ..= '\n#endif'
- in_ifdef = false
- t = {}
- out_body\gsub '[^%w_]([a-f]) = (src%.dat%[[^]]+%])[,;]', (v, k) -> t[k] = v
- out_body = out_body\gsub '(src%.dat%[[^]]+%]) = ([a-f]);\n', (k, v) ->
- if t[k] and t[k] == v
- return ''
- return nil
- out_body
-
-ops = {}
-
-for l in assert io.lines 'src/uxn.c'
- name, body = l\match 'void (op_%S*)%(Uxn %*u%) (%b{})'
- if not name
- continue
- if replacements[name]
- body = replacements[name]
- body = body\gsub 'u%-%>src%-%>', 'src.'
- body = body\gsub 'u%-%>dst%-%>', 'dst.'
- body = body\gsub 'u%-%>src', 'src'
- body = body\gsub 'u%-%>dst', 'dst'
- top = { src: 0, dst: 0 }
- bottom = { src: 0, dst: 0 }
- pushtop = top
- ops[name] = process body
- top = { src: 0, dst: 0 }
- bottom = { src: 0, dst: 0 }
- pushtop = { src: 0, dst: 0 }
- ops['keep_' .. name] = process body
-
-dump = (s, src, dst) ->
- ret = '\t\t\t{\n'
- for l in s\gmatch '[^\n]+'
- if not l\match '^%#'
- ret ..= '\t\t\t\t'
- ret ..= '%s\n'\format l
- ret ..= '\t\t\t}\n\t\t\tbreak;\n'
- (ret\gsub('src', src)\gsub('dst', dst))
-
-i = 0
-allops = {}
-wanted = false
-for l in assert io.lines 'src/uxn.c'
- if l == 'static void (*ops[])(Uxn *u) = {'
- wanted = true
- elseif l == '};'
- wanted = false
- elseif wanted
- l = l\gsub '%/%b**%/', ''
- for op in l\gmatch '[%w_]+'
- if not ops[op]
- error 'missing ' .. op
- allops[i + 0x00 + 1] = { n: { i + 0x00 }, body: dump ops[op], 'u->wst', 'u->rst' }
- allops[i + 0x20 + 1] = { n: { i + 0x20 }, body: dump ops[op], 'u->rst', 'u->wst' }
- allops[i + 0x80 + 1] = { n: { i + 0x80 }, body: dump ops['keep_' .. op], 'u->wst', 'u->rst' }
- allops[i + 0xa0 + 1] = { n: { i + 0xa0 }, body: dump ops['keep_' .. op], 'u->rst', 'u->wst' }
- i += 1
- if i == 0x20
- i += 0x20
-
-i = 0
-wanted = false
-for l in assert io.lines 'src/uxnasm.c'
- if l == 'static char ops[][4] = {'
- wanted = true
- elseif l == '};'
- wanted = false
- elseif wanted
- for op in l\gmatch '"(...)"'
- i += 1
- allops[i + 0x00].name = op
- allops[i + 0x20].name = op .. 'r'
- allops[i + 0x40].name = op .. '2'
- allops[i + 0x60].name = op .. '2r'
- allops[i + 0x80].name = op .. 'k'
- allops[i + 0xa0].name = op .. 'kr'
- allops[i + 0xc0].name = op .. '2k'
- allops[i + 0xe0].name = op .. '2kr'
-
-for i = 1, 256
- if not allops[i]
- continue
- for j = i + 1, 256
- if allops[i].body == allops[j].body
- table.insert allops[i].n, (table.remove allops[j].n)
- allops[j].body = nil
-
-with assert io.open 'src/uxn-fast.c', 'w'
- f = assert io.open 'src/uxn.c'
- while true
- l = f\read '*l'
- \write '%s\n'\format l
- if l == '*/'
- break
- \write '\n'
- \write [[
-/*
- ^
-/!\ THIS FILE IS AUTOMATICALLY GENERATED
----
-
-Its contents can get overwritten with the processed contents of src/uxn.c.
-See etc/mkuxn-fast.moon for instructions.
-
-*/
-]]
- wanted = true
- while true
- l = f\read '*l'
- if l\match' push' or l\match'[ *]pop' or l\match'devr16'
- continue
- if l == '/* Stack */'
- wanted = false
- if wanted
- \write '%s\n'\format l
- if l == '}'
- \write '\n'
- break
- \write [[
-/* clang-format on */
-
-#pragma mark - Core
-
-int
-uxn_eval(Uxn *u, Uint16 vec)
-{
- Uint8 instr;
- if(!vec || u->dev[0].dat[0xf])
- return 0;
- u->ram.ptr = vec;
- if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8;
- while((instr = u->ram.dat[u->ram.ptr++])) {
- switch(instr) {
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-value"
-#pragma GCC diagnostic ignored "-Wunused-variable"
-]]
- for i = 1, 256
- if not allops[i].body
- continue
- for n in *allops[i].n
- \write '\t\tcase 0x%02x: /* %s */\n'\format n, allops[n + 1].name
- if generate_labels
- \write '\t\t\t__asm__("evaluxn_%02x_%s:");\n'\format allops[i].n[1], allops[i].name
- \write allops[i].body
- \write [[
-#pragma GCC diagnostic pop
- }
- }
- return 1;
-#ifndef NO_STACK_CHECKS
-error:
- if(u->wst.error)
- return uxn_halt(u, u->wst.error, "Working-stack", instr);
- else
- return uxn_halt(u, u->rst.error, "Return-stack", instr);
-#endif
-}
-
-int
-]]
- wanted = false
- while true
- l = f\read '*l'
- if not l
- break
- if l\match '^uxn_boot'
- wanted = true
- if wanted
- \write '%s\n'\format l
- f\close!
- \close!
-
diff --git a/src/uxn-fast.c b/src/uxn-fast.c
@@ -1,4041 +0,0 @@
-#include "uxn.h"
-
-/*
-Copyright (u) 2021 Devine Lu Linvega
-Copyright (u) 2021 Andrew Alderwick
-
-Permission to use, copy, modify, and distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE.
-*/
-
-/*
- ^
-/!\ THIS FILE IS AUTOMATICALLY GENERATED
----
-
-Its contents can get overwritten with the processed contents of src/uxn.c.
-See etc/mkuxn-fast.moon for instructions.
-
-*/
-
-#define MODE_RETURN 0x40
-#define MODE_KEEP 0x80
-
-#pragma mark - Operations
-
-/* clang-format off */
-static void poke8(Uint8 *m, Uint16 a, Uint8 b) { m[a] = b; }
-static Uint8 peek8(Uint8 *m, Uint16 a) { return m[a]; }
-static void devw8(Device *d, Uint8 a, Uint8 b) { d->dat[a & 0xf] = b; d->deo(d, a & 0x0f); }
-static Uint8 devr8(Device *d, Uint8 a) { return d->dei(d, a & 0x0f); }
-void poke16(Uint8 *m, Uint16 a, Uint16 b) { poke8(m, a, b >> 8); poke8(m, a + 1, b); }
-Uint16 peek16(Uint8 *m, Uint16 a) { return (peek8(m, a) << 8) + peek8(m, a + 1); }
-static void devw16(Device *d, Uint8 a, Uint16 b) { devw8(d, a, b >> 8); devw8(d, a + 1, b); }
-
-/* clang-format on */
-
-#pragma mark - Core
-
-int
-uxn_eval(Uxn *u, Uint16 vec)
-{
- Uint8 instr;
- if(!vec || u->dev[0].dat[0xf])
- return 0;
- u->ram.ptr = vec;
- if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8;
- while((instr = u->ram.dat[u->ram.ptr++])) {
- switch(instr) {
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-value"
-#pragma GCC diagnostic ignored "-Wunused-variable"
- case 0x01: /* INC */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 1] = a + 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x02: /* POP */
- {
- u->wst.dat[u->wst.ptr - 1];
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x03: /* DUP */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x04: /* NIP */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x05: /* SWP */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = a;
- u->wst.dat[u->wst.ptr - 1] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x06: /* OVR */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x07: /* ROT */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3];
- u->wst.dat[u->wst.ptr - 3] = b;
- u->wst.dat[u->wst.ptr - 2] = a;
- u->wst.dat[u->wst.ptr - 1] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x08: /* EQU */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x09: /* NEQ */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x0a: /* GTH */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x0b: /* LTH */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x0c: /* JMP */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x0d: /* JCN */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- if(u->wst.dat[u->wst.ptr - 2]) u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x0e: /* JSR */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8;
- u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0x0f: /* STH */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->rst.dat[u->rst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0x10: /* LDZ */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 1] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x11: /* STZ */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint8 b = u->wst.dat[u->wst.ptr - 2];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x12: /* LDR */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 1] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x13: /* STR */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint8 b = u->wst.dat[u->wst.ptr - 2];
- poke8(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x14: /* LDA */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- u->wst.dat[u->wst.ptr - 2] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x15: /* STA */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- Uint8 b = u->wst.dat[u->wst.ptr - 3];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x16: /* DEI */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 1] = devr8(&u->dev[a >> 4], a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x17: /* DEO */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- devw8(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x18: /* ADD */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b + a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x19: /* SUB */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b - a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x1a: /* MUL */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b * a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x1b: /* DIV */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- if(a == 0) {
- u->wst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->wst.dat[u->wst.ptr - 2] = b / a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x1c: /* AND */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x1d: /* ORA */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x1e: /* EOR */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x1f: /* SFT */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr - 2] = b >> (a & 0x0f) << ((a & 0xf0) >> 4);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x21: /* INC2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- u->wst.dat[u->wst.ptr - 2] = (a + 1) >> 8;
- u->wst.dat[u->wst.ptr - 1] = (a + 1) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x22: /* POP2 */
- {
- (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x23: /* DUP2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b;
- u->wst.dat[u->wst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0x24: /* NIP2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = a >> 8;
- u->wst.dat[u->wst.ptr - 3] = a & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x25: /* SWP2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr - 4] = b;
- u->wst.dat[u->wst.ptr - 3] = a;
- u->wst.dat[u->wst.ptr - 2] = d;
- u->wst.dat[u->wst.ptr - 1] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x26: /* OVR2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr] = d;
- u->wst.dat[u->wst.ptr + 1] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0x27: /* ROT2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4], e = u->wst.dat[u->wst.ptr - 5], f = u->wst.dat[u->wst.ptr - 6];
- u->wst.dat[u->wst.ptr - 6] = d;
- u->wst.dat[u->wst.ptr - 5] = c;
- u->wst.dat[u->wst.ptr - 4] = b;
- u->wst.dat[u->wst.ptr - 3] = a;
- u->wst.dat[u->wst.ptr - 2] = f;
- u->wst.dat[u->wst.ptr - 1] = e;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 6, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x28: /* EQU2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x29: /* NEQ2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x2a: /* GTH2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x2b: /* LTH2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x2c: /* JMP2 */
- {
- u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x2d: /* JCN2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- if(u->wst.dat[u->wst.ptr - 3]) u->ram.ptr = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x2e: /* JSR2 */
- {
- u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8;
- u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0x2f: /* STH2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b;
- u->rst.dat[u->rst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0x30: /* LDZ2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 1] = peek8(u->ram.dat, a);
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x31: /* STZ2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x32: /* LDR2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 1] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x33: /* STR2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- poke16(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x34: /* LDA2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- u->wst.dat[u->wst.ptr - 2] = peek8(u->ram.dat, a);
- u->wst.dat[u->wst.ptr - 1] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x35: /* STA2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- Uint16 b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 4;
- }
- break;
- case 0x36: /* DEI2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 1] = devr8(&u->dev[a >> 4], a);
- u->wst.dat[u->wst.ptr] = devr8(&u->dev[a >> 4], a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x37: /* DEO2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- devw16(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 3;
- }
- break;
- case 0x38: /* ADD2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = (b + a) >> 8;
- u->wst.dat[u->wst.ptr - 3] = (b + a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x39: /* SUB2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = (b - a) >> 8;
- u->wst.dat[u->wst.ptr - 3] = (b - a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x3a: /* MUL2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr - 4] = (b * a) >> 8;
- u->wst.dat[u->wst.ptr - 3] = (b * a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x3b: /* DIV2 */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- if(a == 0) {
- u->wst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->wst.dat[u->wst.ptr - 4] = (b / a) >> 8;
- u->wst.dat[u->wst.ptr - 3] = (b / a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x3c: /* AND2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr - 4] = d & b;
- u->wst.dat[u->wst.ptr - 3] = c & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x3d: /* ORA2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr - 4] = d | b;
- u->wst.dat[u->wst.ptr - 3] = c | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x3e: /* EOR2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr - 4] = d ^ b;
- u->wst.dat[u->wst.ptr - 3] = c ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 2;
- }
- break;
- case 0x3f: /* SFT2 */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- u->wst.dat[u->wst.ptr - 3] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8;
- u->wst.dat[u->wst.ptr - 2] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- u->wst.ptr -= 1;
- }
- break;
- case 0x41: /* INCr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 1] = a + 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x42: /* POPr */
- {
- u->rst.dat[u->rst.ptr - 1];
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x43: /* DUPr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0x44: /* NIPr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x45: /* SWPr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = a;
- u->rst.dat[u->rst.ptr - 1] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x46: /* OVRr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0x47: /* ROTr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3];
- u->rst.dat[u->rst.ptr - 3] = b;
- u->rst.dat[u->rst.ptr - 2] = a;
- u->rst.dat[u->rst.ptr - 1] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x48: /* EQUr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x49: /* NEQr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x4a: /* GTHr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x4b: /* LTHr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x4c: /* JMPr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x4d: /* JCNr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- if(u->rst.dat[u->rst.ptr - 2]) u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x4e: /* JSRr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8;
- u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0x4f: /* STHr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->wst.dat[u->wst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x50: /* LDZr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 1] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x51: /* STZr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint8 b = u->rst.dat[u->rst.ptr - 2];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x52: /* LDRr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 1] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x53: /* STRr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint8 b = u->rst.dat[u->rst.ptr - 2];
- poke8(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x54: /* LDAr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- u->rst.dat[u->rst.ptr - 2] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x55: /* STAr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- Uint8 b = u->rst.dat[u->rst.ptr - 3];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x56: /* DEIr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 1] = devr8(&u->dev[a >> 4], a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x57: /* DEOr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- devw8(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x58: /* ADDr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b + a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x59: /* SUBr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b - a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x5a: /* MULr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b * a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x5b: /* DIVr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- if(a == 0) {
- u->rst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->rst.dat[u->rst.ptr - 2] = b / a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x5c: /* ANDr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x5d: /* ORAr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x5e: /* EORr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x5f: /* SFTr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr - 2] = b >> (a & 0x0f) << ((a & 0xf0) >> 4);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x61: /* INC2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- u->rst.dat[u->rst.ptr - 2] = (a + 1) >> 8;
- u->rst.dat[u->rst.ptr - 1] = (a + 1) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x62: /* POP2r */
- {
- (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x63: /* DUP2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b;
- u->rst.dat[u->rst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0x64: /* NIP2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = a >> 8;
- u->rst.dat[u->rst.ptr - 3] = a & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x65: /* SWP2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr - 4] = b;
- u->rst.dat[u->rst.ptr - 3] = a;
- u->rst.dat[u->rst.ptr - 2] = d;
- u->rst.dat[u->rst.ptr - 1] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x66: /* OVR2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr] = d;
- u->rst.dat[u->rst.ptr + 1] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0x67: /* ROT2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4], e = u->rst.dat[u->rst.ptr - 5], f = u->rst.dat[u->rst.ptr - 6];
- u->rst.dat[u->rst.ptr - 6] = d;
- u->rst.dat[u->rst.ptr - 5] = c;
- u->rst.dat[u->rst.ptr - 4] = b;
- u->rst.dat[u->rst.ptr - 3] = a;
- u->rst.dat[u->rst.ptr - 2] = f;
- u->rst.dat[u->rst.ptr - 1] = e;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 6, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x68: /* EQU2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x69: /* NEQ2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x6a: /* GTH2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x6b: /* LTH2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x6c: /* JMP2r */
- {
- u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x6d: /* JCN2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- if(u->rst.dat[u->rst.ptr - 3]) u->ram.ptr = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x6e: /* JSR2r */
- {
- u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8;
- u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0x6f: /* STH2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b;
- u->wst.dat[u->wst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0x70: /* LDZ2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 1] = peek8(u->ram.dat, a);
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0x71: /* STZ2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x72: /* LDR2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 1] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0x73: /* STR2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- poke16(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x74: /* LDA2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- u->rst.dat[u->rst.ptr - 2] = peek8(u->ram.dat, a);
- u->rst.dat[u->rst.ptr - 1] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x75: /* STA2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- Uint16 b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 4;
- }
- break;
- case 0x76: /* DEI2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 1] = devr8(&u->dev[a >> 4], a);
- u->rst.dat[u->rst.ptr] = devr8(&u->dev[a >> 4], a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0x77: /* DEO2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- devw16(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 3;
- }
- break;
- case 0x78: /* ADD2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = (b + a) >> 8;
- u->rst.dat[u->rst.ptr - 3] = (b + a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x79: /* SUB2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = (b - a) >> 8;
- u->rst.dat[u->rst.ptr - 3] = (b - a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x7a: /* MUL2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr - 4] = (b * a) >> 8;
- u->rst.dat[u->rst.ptr - 3] = (b * a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x7b: /* DIV2r */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- if(a == 0) {
- u->rst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->rst.dat[u->rst.ptr - 4] = (b / a) >> 8;
- u->rst.dat[u->rst.ptr - 3] = (b / a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x7c: /* AND2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr - 4] = d & b;
- u->rst.dat[u->rst.ptr - 3] = c & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x7d: /* ORA2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr - 4] = d | b;
- u->rst.dat[u->rst.ptr - 3] = c | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x7e: /* EOR2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr - 4] = d ^ b;
- u->rst.dat[u->rst.ptr - 3] = c ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 2;
- }
- break;
- case 0x7f: /* SFT2r */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- u->rst.dat[u->rst.ptr - 3] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8;
- u->rst.dat[u->rst.ptr - 2] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- u->rst.ptr -= 1;
- }
- break;
- case 0x80: /* LIT */
- {
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, u->ram.ptr++);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x81: /* INCk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = a + 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x82: /* POPk */
- {
- u->wst.dat[u->wst.ptr - 1];
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x83: /* DUPk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = a;
- u->wst.dat[u->wst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0x84: /* NIPk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x85: /* SWPk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = a;
- u->wst.dat[u->wst.ptr + 1] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0x86: /* OVRk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b;
- u->wst.dat[u->wst.ptr + 1] = a;
- u->wst.dat[u->wst.ptr + 2] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 252, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 3;
- }
- break;
- case 0x87: /* ROTk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3];
- u->wst.dat[u->wst.ptr] = b;
- u->wst.dat[u->wst.ptr + 1] = a;
- u->wst.dat[u->wst.ptr + 2] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 252, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 3;
- }
- break;
- case 0x88: /* EQUk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x89: /* NEQk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x8a: /* GTHk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x8b: /* LTHk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x8c: /* JMPk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x8d: /* JCNk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- if(u->wst.dat[u->wst.ptr - 2]) u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x8e: /* JSRk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8;
- u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0x8f: /* STHk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->rst.dat[u->rst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0x90: /* LDZk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x91: /* STZk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint8 b = u->wst.dat[u->wst.ptr - 2];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x92: /* LDRk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x93: /* STRk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint8 b = u->wst.dat[u->wst.ptr - 2];
- poke8(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x94: /* LDAk */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x95: /* STAk */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- Uint8 b = u->wst.dat[u->wst.ptr - 3];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x96: /* DEIk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = devr8(&u->dev[a >> 4], a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x97: /* DEOk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- devw8(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0x98: /* ADDk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b + a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x99: /* SUBk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b - a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x9a: /* MULk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b * a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x9b: /* DIVk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- if(a == 0) {
- u->wst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->wst.dat[u->wst.ptr] = b / a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x9c: /* ANDk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x9d: /* ORAk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x9e: /* EORk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0x9f: /* SFTk */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b >> (a & 0x0f) << ((a & 0xf0) >> 4);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0xa0: /* LIT2 */
- case 0x20: /* LIT2_deprecated */
- {
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, u->ram.ptr++);
- u->wst.dat[u->wst.ptr + 1] = peek8(u->ram.dat, u->ram.ptr++);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xa1: /* INC2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- u->wst.dat[u->wst.ptr] = (a + 1) >> 8;
- u->wst.dat[u->wst.ptr + 1] = (a + 1) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xa2: /* POP2k */
- {
- (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xa3: /* DUP2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b;
- u->wst.dat[u->wst.ptr + 1] = a;
- u->wst.dat[u->wst.ptr + 2] = b;
- u->wst.dat[u->wst.ptr + 3] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 251, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 4;
- }
- break;
- case 0xa4: /* NIP2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = a >> 8;
- u->wst.dat[u->wst.ptr + 1] = a & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xa5: /* SWP2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr] = b;
- u->wst.dat[u->wst.ptr + 1] = a;
- u->wst.dat[u->wst.ptr + 2] = d;
- u->wst.dat[u->wst.ptr + 3] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 251, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 4;
- }
- break;
- case 0xa6: /* OVR2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr] = d;
- u->wst.dat[u->wst.ptr + 1] = c;
- u->wst.dat[u->wst.ptr + 2] = b;
- u->wst.dat[u->wst.ptr + 3] = a;
- u->wst.dat[u->wst.ptr + 4] = d;
- u->wst.dat[u->wst.ptr + 5] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 249, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 6;
- }
- break;
- case 0xa7: /* ROT2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4], e = u->wst.dat[u->wst.ptr - 5], f = u->wst.dat[u->wst.ptr - 6];
- u->wst.dat[u->wst.ptr] = d;
- u->wst.dat[u->wst.ptr + 1] = c;
- u->wst.dat[u->wst.ptr + 2] = b;
- u->wst.dat[u->wst.ptr + 3] = a;
- u->wst.dat[u->wst.ptr + 4] = f;
- u->wst.dat[u->wst.ptr + 5] = e;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 6, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 249, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 6;
- }
- break;
- case 0xa8: /* EQU2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0xa9: /* NEQ2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0xaa: /* GTH2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0xab: /* LTH2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0xac: /* JMP2k */
- {
- u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xad: /* JCN2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- if(u->wst.dat[u->wst.ptr - 3]) u->ram.ptr = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xae: /* JSR2k */
- {
- u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8;
- u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xaf: /* STH2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b;
- u->rst.dat[u->rst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xb0: /* LDZ2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, a);
- u->wst.dat[u->wst.ptr + 1] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xb1: /* STZ2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xb2: /* LDR2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
- u->wst.dat[u->wst.ptr + 1] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xb3: /* STR2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- poke16(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xb4: /* LDA2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- u->wst.dat[u->wst.ptr] = peek8(u->ram.dat, a);
- u->wst.dat[u->wst.ptr + 1] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 2, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xb5: /* STA2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
- Uint16 b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xb6: /* DEI2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- u->wst.dat[u->wst.ptr] = devr8(&u->dev[a >> 4], a);
- u->wst.dat[u->wst.ptr + 1] = devr8(&u->dev[a >> 4], a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 1, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xb7: /* DEO2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- devw16(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xb8: /* ADD2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = (b + a) >> 8;
- u->wst.dat[u->wst.ptr + 1] = (b + a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xb9: /* SUB2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = (b - a) >> 8;
- u->wst.dat[u->wst.ptr + 1] = (b - a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xba: /* MUL2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- u->wst.dat[u->wst.ptr] = (b * a) >> 8;
- u->wst.dat[u->wst.ptr + 1] = (b * a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xbb: /* DIV2k */
- {
- Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
- if(a == 0) {
- u->wst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->wst.dat[u->wst.ptr] = (b / a) >> 8;
- u->wst.dat[u->wst.ptr + 1] = (b / a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xbc: /* AND2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr] = d & b;
- u->wst.dat[u->wst.ptr + 1] = c & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xbd: /* ORA2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr] = d | b;
- u->wst.dat[u->wst.ptr + 1] = c | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xbe: /* EOR2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4];
- u->wst.dat[u->wst.ptr] = d ^ b;
- u->wst.dat[u->wst.ptr + 1] = c ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 4, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xbf: /* SFT2k */
- {
- Uint8 a = u->wst.dat[u->wst.ptr - 1];
- Uint16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8));
- u->wst.dat[u->wst.ptr] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8;
- u->wst.dat[u->wst.ptr + 1] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->wst.ptr < 3, 0)) {
- u->wst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xc0: /* LITr */
- case 0x40: /* LITr_deprecated */
- {
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, u->ram.ptr++);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xc1: /* INCkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = a + 1;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xc2: /* POPkr */
- {
- u->rst.dat[u->rst.ptr - 1];
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xc3: /* DUPkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = a;
- u->rst.dat[u->rst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xc4: /* NIPkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xc5: /* SWPkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = a;
- u->rst.dat[u->rst.ptr + 1] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xc6: /* OVRkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b;
- u->rst.dat[u->rst.ptr + 1] = a;
- u->rst.dat[u->rst.ptr + 2] = b;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 252, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 3;
- }
- break;
- case 0xc7: /* ROTkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3];
- u->rst.dat[u->rst.ptr] = b;
- u->rst.dat[u->rst.ptr + 1] = a;
- u->rst.dat[u->rst.ptr + 2] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 252, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 3;
- }
- break;
- case 0xc8: /* EQUkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xc9: /* NEQkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xca: /* GTHkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xcb: /* LTHkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xcc: /* JMPkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xcd: /* JCNkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- if(u->rst.dat[u->rst.ptr - 2]) u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xce: /* JSRkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8;
- u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr += (Sint8)a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xcf: /* STHkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->wst.dat[u->wst.ptr] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 254, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 1;
- }
- break;
- case 0xd0: /* LDZkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xd1: /* STZkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint8 b = u->rst.dat[u->rst.ptr - 2];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xd2: /* LDRkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xd3: /* STRkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint8 b = u->rst.dat[u->rst.ptr - 2];
- poke8(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xd4: /* LDAkr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xd5: /* STAkr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- Uint8 b = u->rst.dat[u->rst.ptr - 3];
- poke8(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xd6: /* DEIkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = devr8(&u->dev[a >> 4], a);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xd7: /* DEOkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- devw8(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xd8: /* ADDkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b + a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xd9: /* SUBkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b - a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xda: /* MULkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b * a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xdb: /* DIVkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- if(a == 0) {
- u->rst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->rst.dat[u->rst.ptr] = b / a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xdc: /* ANDkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xdd: /* ORAkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xde: /* EORkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xdf: /* SFTkr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b >> (a & 0x0f) << ((a & 0xf0) >> 4);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xe0: /* LIT2r */
- case 0x60: /* LIT2r_deprecated */
- {
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, u->ram.ptr++);
- u->rst.dat[u->rst.ptr + 1] = peek8(u->ram.dat, u->ram.ptr++);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xe1: /* INC2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- u->rst.dat[u->rst.ptr] = (a + 1) >> 8;
- u->rst.dat[u->rst.ptr + 1] = (a + 1) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xe2: /* POP2kr */
- {
- (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xe3: /* DUP2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->rst.dat[u->rst.ptr] = b;
- u->rst.dat[u->rst.ptr + 1] = a;
- u->rst.dat[u->rst.ptr + 2] = b;
- u->rst.dat[u->rst.ptr + 3] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 251, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 4;
- }
- break;
- case 0xe4: /* NIP2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = a >> 8;
- u->rst.dat[u->rst.ptr + 1] = a & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xe5: /* SWP2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr] = b;
- u->rst.dat[u->rst.ptr + 1] = a;
- u->rst.dat[u->rst.ptr + 2] = d;
- u->rst.dat[u->rst.ptr + 3] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 251, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 4;
- }
- break;
- case 0xe6: /* OVR2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr] = d;
- u->rst.dat[u->rst.ptr + 1] = c;
- u->rst.dat[u->rst.ptr + 2] = b;
- u->rst.dat[u->rst.ptr + 3] = a;
- u->rst.dat[u->rst.ptr + 4] = d;
- u->rst.dat[u->rst.ptr + 5] = c;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 249, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 6;
- }
- break;
- case 0xe7: /* ROT2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4], e = u->rst.dat[u->rst.ptr - 5], f = u->rst.dat[u->rst.ptr - 6];
- u->rst.dat[u->rst.ptr] = d;
- u->rst.dat[u->rst.ptr + 1] = c;
- u->rst.dat[u->rst.ptr + 2] = b;
- u->rst.dat[u->rst.ptr + 3] = a;
- u->rst.dat[u->rst.ptr + 4] = f;
- u->rst.dat[u->rst.ptr + 5] = e;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 6, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 249, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 6;
- }
- break;
- case 0xe8: /* EQU2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = b == a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xe9: /* NEQ2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = b != a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xea: /* GTH2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = b > a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xeb: /* LTH2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = b < a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 254, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 1;
- }
- break;
- case 0xec: /* JMP2kr */
- {
- u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xed: /* JCN2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- if(u->rst.dat[u->rst.ptr - 3]) u->ram.ptr = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xee: /* JSR2kr */
- {
- u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8;
- u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff;
- u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xef: /* STH2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2];
- u->wst.dat[u->wst.ptr] = b;
- u->wst.dat[u->wst.ptr + 1] = a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->wst.ptr > 253, 0)) {
- u->wst.error = 2;
- goto error;
- }
-#endif
- u->wst.ptr += 2;
- }
- break;
- case 0xf0: /* LDZ2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, a);
- u->rst.dat[u->rst.ptr + 1] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xf1: /* STZ2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xf2: /* LDR2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a);
- u->rst.dat[u->rst.ptr + 1] = peek8(u->ram.dat, u->ram.ptr + (Sint8)a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xf3: /* STR2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- poke16(u->ram.dat, u->ram.ptr + (Sint8)a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xf4: /* LDA2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- u->rst.dat[u->rst.ptr] = peek8(u->ram.dat, a);
- u->rst.dat[u->rst.ptr + 1] = peek8(u->ram.dat, a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 2, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xf5: /* STA2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
- Uint16 b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- poke16(u->ram.dat, a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xf6: /* DEI2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- u->rst.dat[u->rst.ptr] = devr8(&u->dev[a >> 4], a);
- u->rst.dat[u->rst.ptr + 1] = devr8(&u->dev[a >> 4], a + 1);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 1, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xf7: /* DEO2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- devw16(&u->dev[a >> 4], a, b);
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
-#endif
- }
- break;
- case 0xf8: /* ADD2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = (b + a) >> 8;
- u->rst.dat[u->rst.ptr + 1] = (b + a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xf9: /* SUB2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = (b - a) >> 8;
- u->rst.dat[u->rst.ptr + 1] = (b - a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xfa: /* MUL2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- u->rst.dat[u->rst.ptr] = (b * a) >> 8;
- u->rst.dat[u->rst.ptr + 1] = (b * a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xfb: /* DIV2kr */
- {
- Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
- if(a == 0) {
- u->rst.error = 3;
-#ifndef NO_STACK_CHECKS
- goto error;
-#endif
- a = 1;
- }
- u->rst.dat[u->rst.ptr] = (b / a) >> 8;
- u->rst.dat[u->rst.ptr + 1] = (b / a) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xfc: /* AND2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr] = d & b;
- u->rst.dat[u->rst.ptr + 1] = c & a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xfd: /* ORA2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr] = d | b;
- u->rst.dat[u->rst.ptr + 1] = c | a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xfe: /* EOR2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4];
- u->rst.dat[u->rst.ptr] = d ^ b;
- u->rst.dat[u->rst.ptr + 1] = c ^ a;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 4, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
- case 0xff: /* SFT2kr */
- {
- Uint8 a = u->rst.dat[u->rst.ptr - 1];
- Uint16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8));
- u->rst.dat[u->rst.ptr] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) >> 8;
- u->rst.dat[u->rst.ptr + 1] = (b >> (a & 0x0f) << ((a & 0xf0) >> 4)) & 0xff;
-#ifndef NO_STACK_CHECKS
- if(__builtin_expect(u->rst.ptr < 3, 0)) {
- u->rst.error = 1;
- goto error;
- }
- if(__builtin_expect(u->rst.ptr > 253, 0)) {
- u->rst.error = 2;
- goto error;
- }
-#endif
- u->rst.ptr += 2;
- }
- break;
-#pragma GCC diagnostic pop
- }
- }
- return 1;
-#ifndef NO_STACK_CHECKS
-error:
- if(u->wst.error)
- return uxn_halt(u, u->wst.error, "Working-stack", instr);
- else
- return uxn_halt(u, u->rst.error, "Return-stack", instr);
-#endif
-}
-
-int
-uxn_boot(Uxn *u, Uint8 *memory)
-{
- unsigned int i;
- char *cptr = (char *)u;
- for(i = 0; i < sizeof(*u); ++i)
- cptr[i] = 0x00;
- u->ram.dat = memory;
- return 1;
-}
-
-Device *
-uxn_port(Uxn *u, Uint8 id, Uint8 (*deifn)(Device *d, Uint8 port), void (*deofn)(Device *d, Uint8 port))
-{
- Device *d = &u->dev[id];
- d->addr = id * 0x10;
- d->u = u;
- d->mem = u->ram.dat;
- d->dei = deifn;
- d->deo = deofn;
- return d;
-}