.version 9 .org 0x8000 start: mov sp, 0xf000 mov.b [0x70], 0 mov.b [0x71], 40 mov.b [0x72], 32 mov.b [0x73], 112 mov.b [0x70], 255 mov.b [0x71], 216 mov.b [0x72], 208 mov.b [0x73], 255 mov.w [0x10], 0x101 mov.w [0x32], trapped mov.w [0x34], 0xf000 mov.b [0x36], 3 mov.w [0x65c], 0xcffe mov.b [0x662], 15 mov.w [cursor], 0xd000 mov.w [next], 0x1000 mov p, 0xd000 clear: mov.b [p], 32 inc p cmp p, 0xd400 bnz clear mov p, welcome call puts mov a, monitor_end-start call decimal_print mov p, memory_message call puts movzx a, [0x37] cmp a, 0 bz prompt mov.b [0x37], 0 mov p, load_failed call puts bra prompt trapped: movzx a, [0x662] mov.b [0x30], a.lo mov p, registers call puts mov p, 0x650 mov r, 8 show_regs: push p push r mov a, [p] call hex mov a, 32 call putc pop r pop p add p, 2 dec r bz registers_done cmp r, 4 bnz show_regs push p push r call newline mov p, registers_low call puts pop r pop p bra show_regs registers_done: call newline prompt: call clear_row mov a, [next] call hex mov a, 62 call putc mov a, 32 call putc call draw poll: mov x, 8 scan: mov p, x shr p, 3 add p, 0x420 mov a, x and a, 7 mov b, 1 shl b, a movzx y, [p] and y, b bnz key inc x cmp x, 127 bnz scan sleep 60000 bra poll key: mov.b [p], b.lo cmp x, 13 bz enter cmp x, 8 bz backspace cmp x, 16 bz cursor_left cmp x, 17 bz cursor_right cmp x, 18 bz cursor_up cmp x, 19 bz cursor_down cmp x, 32 blo poll mov a, x call putc call draw_edit bra poll cursor_left: mov a, [cursor] sub a, 1 bra move_cursor cursor_right: mov a, [cursor] add a, 1 bra move_cursor cursor_up: mov a, [cursor] sub a, 32 bra move_cursor cursor_down: mov a, [cursor] add a, 32 cmp a, 0xd400 blo move_cursor call scroll mov a, [cursor] move_cursor: sub a, 0xd000 and a, 0x3ff add a, 0xd000 mov.w [cursor], a call draw_edit bra poll backspace: mov a, [cursor] sub a, 1 sub a, 0xd000 and a, 0x3ff add a, 0xd000 mov.w [cursor], a mov.b [a], 32 call draw_edit bra poll enter: mov p, [cursor] and p, 0xffe0 mov x, input mov r, 32 copy_line: movzx a, [p] cmp a, 59 bz trim_line mov.b [x], a.lo inc p inc x dec r bnz copy_line trim_line: cmp x, input bz trim_empty dec x movzx a, [x] cmp a, 32 bz trim_line inc x bra trim_done trim_empty: mov x, input trim_done: mov.b [x], 0 mov p, [cursor] and p, 0xffe0 add p, 32 cmp p, 0xd400 blo enter_position call scroll enter_position: mov.w [cursor], p mov p, input movzx a, [p+4] cmp a, 62 bnz enter_parse add p, 5 enter_parse: call spaces cmp a, 0 bz prompt mov.w [width], 0 mov x, table find: movzx a, [x] cmp a, 0 bz error mov y, 0 compare_name: mov r, x add r, y movzx a, [r] mov r, p add r, y movzx b, [r] cmp a, 0 bz name_end cmp a, b bnz skip inc y bra compare_name name_end: cmp b, 0 bz found cmp b, 32 bz found cmp b, 46 bz sized_name skip: add x, 12 bra find sized_name: movzx b, [r+1] cmp b, 98 bz byte_name cmp b, 119 bnz skip mov b, 2 bra size_name byte_name: mov b, 1 size_name: mov.w [width], b add y, 2 found: add p, y movzx a, [x+10] mov.w [opcode], a movzx a, [x+11] mov.w [kind], a call spaces mov a, [kind] cmp a, 20 bhs command mov y, [next] mov.w [begin], y cmp y, 0x7ff0 bhs error mov a, [kind] cmp a, 0 bz single cmp a, 3 bz branch_operand cmp a, 5 bz sleep_operand cmp a, 6 bz system_operand call operand mov.w [dest], a mov.w [dest_ext], b mov a, [kind] cmp a, 2 bz stack_operand cmp a, 4 bz call_operand cmp a, 8 bz increment_operand cmp a, 9 bz increment_operand cmp a, 14 bz jump_operand cmp a, 7 bnz binary_operand mov a, [opcode] cmp a, 36 bz absolute_operand binary_operand: call comma call operand mov.w [source], a mov.w [source_ext], b mov a, [kind] cmp a, 7 bz math_operand cmp a, 15 bz store_byte_alias cmp a, 12 bz load_alias cmp a, 13 bz store_alias cmp a, 10 bz lea_operand cmp a, 11 bz widening_operand bra alu_operand jump_operand: mov a, [dest] mov.w [source], a mov a, [dest_ext] mov.w [source_ext], a mov.w [dest], 7 mov.w [width], 2 bra alu_operand load_alias: mov a, [source] cmp a, 8 blo load_register_address cmp a, 65 bnz load_alias_ready mov.w [source], 64 bra load_alias_ready load_register_address: add a, 32 mov.w [source], a load_alias_ready: mov a, [opcode] cmp a, 110 bz widening_operand mov.w [width], 2 bra alu_operand store_alias: mov a, [dest] cmp a, 8 blo store_register_address cmp a, 65 bnz store_alias_ready mov.w [dest], 64 bra store_alias_ready store_register_address: add a, 32 mov.w [dest], a store_alias_ready: mov a, [opcode] cmp a, 112 bz store_byte_alias mov.w [width], 2 bra alu_operand store_byte_alias: mov.w [opcode], 96 mov.w [width], 1 bra alu_operand increment_operand: mov a, [dest] cmp a, 8 bhs increment_general mov b, [width] cmp b, 0 bnz increment_general add a, [opcode] call emit bra finish increment_general: mov a, [kind] add a, 89 mov.w [opcode], a mov.w [source], 65 mov.w [source_ext], 1 alu_operand: mov a, [width] cmp a, 0 bnz width_ready mov a, [dest] call register_width cmp b, 0 bnz width_inferred mov a, [source] call register_width cmp b, 0 bz error width_inferred: mov.w [width], b width_ready: mov a, [dest] call size_register mov.w [dest], a mov a, [source] call size_register mov.w [source], a mov a, [dest] cmp a, 65 bz error mov b, [opcode] cmp b, 96 bz validate_move cmp b, 108 bz validate_out cmp b, 109 bz validate_in cmp a, 24 bhs error bra emit_alu validate_move: cmp a, 32 blo emit_alu mov a, [source] cmp a, 32 blo emit_alu cmp a, 65 bnz error bra emit_alu validate_out: cmp a, 32 blo error mov a, [source] bra validate_io_register validate_in: mov b, [source] cmp b, 32 blo error cmp b, 65 bz error validate_io_register: cmp a, 8 blo error cmp a, 24 bhs error mov a, [width] cmp a, 1 bnz error emit_alu: mov a, [opcode] cmp a, 96 bnz packed_alu mov a, [width] cmp a, 2 bnz packed_alu mov a, [dest] cmp a, 8 bhs emit_classic mov b, [source] cmp b, 8 bhs compact_immediate shl a, 3 or a, b or a, 64 call emit bra finish compact_immediate: cmp b, 65 bnz packed_alu add a, 8 call emit mov a, [source_ext] call emit_word bra finish packed_alu: mov a, [dest] cmp a, 16 bhs emit_classic cmp a, 8 blo packed_destination sub a, 8 packed_destination: mov.w [descriptor], a mov a, [source] cmp a, 8 blo packed_register cmp a, 16 blo packed_low cmp a, 32 blo emit_classic mov a, [opcode] cmp a, 126 bnz packed_operation mov a, 110 packed_operation: add a, 128 mov b, [width] cmp b, 1 bnz packed_opcode add a, 16 packed_opcode: call emit mov a, [source] cmp a, 65 bz packed_immediate cmp a, 64 bz packed_absolute cmp a, 40 blo packed_displacement cmp a, 48 blo packed_post cmp a, 56 blo packed_pre packed_displacement: and a, 7 shl a, 3 or a, 128 or a, [descriptor] call emit mov a, [source_ext] call emit bra finish packed_post: mov a, 208 bra packed_update packed_pre: mov a, 216 packed_update: or a, [descriptor] call emit mov a, [source] and a, 7 call emit bra finish packed_absolute: mov a, 200 or a, [descriptor] call emit mov a, [source_ext] call emit_word bra finish packed_immediate: mov a, [source_ext] cmp a, 255 bls packed_small mov a, [width] cmp a, 1 bz packed_small mov a, 224 or a, [descriptor] call emit mov a, [source_ext] call emit_word bra finish packed_small: mov a, 64 or a, [descriptor] call emit mov a, [source_ext] cmp a, 255 bls packed_byte_value cmp a, 0xff80 blo error packed_byte_value: call emit bra finish packed_low: sub a, 8 packed_register: shl a, 3 or a, [descriptor] mov.w [descriptor], a mov a, [opcode] cmp a, 126 bnz packed_register_operation mov a, 110 packed_register_operation: add a, 128 mov b, [width] cmp b, 1 bnz packed_register_opcode add a, 16 packed_register_opcode: call emit mov a, [descriptor] call emit bra finish emit_classic: mov a, 255 call emit mov a, [opcode] mov b, [width] cmp b, 1 bnz emit_classic_opcode cmp a, 126 bnz byte_opcode mov a, 111 byte_opcode: add a, 16 emit_classic_opcode: call emit mov a, [dest] mov b, [dest_ext] call emit_operand mov a, [source] mov b, [source_ext] call emit_operand bra finish widening_operand: mov a, [dest] cmp a, 7 bhs error mov a, [source] cmp a, 8 blo error mov.w [width], 1 mov a, 255 call emit mov a, [opcode] call emit mov a, [dest] call emit mov a, [source] mov b, [source_ext] call emit_operand bra finish lea_operand: mov a, [dest] cmp a, 8 bhs error mov a, [source] cmp a, 32 blo error cmp a, 40 blo lea_register cmp a, 56 blo error cmp a, 64 bhi error bz lea_absolute sub a, 24 lea_register: and a, 7 shl a, 3 or a, 128 bra lea_descriptor lea_absolute: mov a, 200 lea_descriptor: or a, [dest] push a mov a, 236 call emit pop a call emit mov a, [source_ext] mov b, [source] cmp b, 64 bz lea_word call emit bra finish lea_word: call emit_word bra finish absolute_operand: mov.w [source], 0 math_operand: mov a, [dest] cmp a, 7 bhs error mov a, [source] cmp a, 8 bhs error mov a, 63 call emit mov a, [opcode] call emit mov a, [source] shl a, 3 or a, [dest] call emit mov a, [opcode] cmp a, 32 bnz finish call comma call number cmp b, 0 bz error cmp a, 31 bhi error call emit bra finish stack_operand: mov a, [dest] cmp a, 24 bhs error cmp a, 8 bhs stack_byte mov a, 63 call emit mov a, [opcode] or a, [dest] call emit bra finish stack_byte: mov.w [width], 1 mov a, [dest] mov.w [source], a mov.w [source_ext], 0 mov a, [opcode] cmp a, 8 bnz pop_byte mov.w [dest], 54 bra stack_general pop_byte: mov.w [source], 46 stack_general: mov.w [opcode], 96 bra alu_operand call_operand: mov a, [dest] cmp a, 65 bz call_immediate cmp a, 8 blo call_indirect cmp a, 32 blo error call_indirect: mov a, 255 call emit mov a, 4 call emit mov a, [dest] mov b, [dest_ext] call emit_operand bra finish call_immediate: mov a, 3 call emit mov a, [dest_ext] call emit_word bra finish branch_operand: call number cmp b, 0 bz error mov.w [value], a mov b, [width] cmp b, 2 bz long_branch sub a, y sub a, 2 mov b, a add b, 128 cmp b, 255 bls short_branch mov b, [width] cmp b, 1 bz error long_branch: mov a, [opcode] call emit mov a, [value] call emit_word bra finish short_branch: push a mov a, [opcode] sub a, 16 call emit pop a call emit bra finish sleep_operand: call number cmp b, 0 bz error push a mov a, 5 call emit pop a call emit_word bra finish system_operand: mov a, [p] cmp a, 0x6f6c bz system_load cmp a, 0x7270 bnz error mov a, [p+2] cmp a, 0x7365 bnz error mov a, [p+4] cmp a, 0x6e65 bnz error movzx a, [p+6] cmp a, 116 bnz error add p, 7 mov b, 3 bra system_emit system_load: mov a, [p+2] cmp a, 0x6461 bnz error add p, 4 movzx a, [p] cmp a, 56 bz system_rom cmp a, 110 bnz system_wide inc p mov b, 5 bra system_emit system_wide: mov b, 2 mov a, [p] cmp a, 0x3631 bz system_load16 cmp a, 0x3233 bnz system_emit add p, 2 bra system_emit system_load16: add p, 2 mov b, 1 system_emit: mov a, 0 call emit mov a, b call emit bra finish system_rom: inc p call operand cmp a, 65 bnz error cmp b, 255 bhi error mov.w [source_ext], b call comma call operand cmp a, 65 bnz error mov a, 0 call emit call emit mov a, [source_ext] call emit mov a, b call emit_word bra finish single: mov a, [opcode] call emit finish: call spaces cmp a, 0 bnz error bra execute register_width: mov b, 0 cmp a, 24 bhs register_width_done mov b, 1 cmp a, 8 bhs register_width_done mov b, 2 register_width_done: ret size_register: cmp a, 24 bhs size_register_done mov b, [width] cmp b, 1 bnz size_word cmp a, 8 bhs size_register_done add a, 8 ret size_word: cmp a, 8 bhs error size_register_done: ret comma: call spaces cmp a, 44 bnz error inc p call spaces ret emit: mov.b [y], a.lo inc y ret emit_word: mov.w [y], a add y, 2 ret emit_operand: cmp a, 65 bz emit_immediate call emit cmp a, 56 blo operand_emitted cmp a, 64 bz emit_address mov a, b bra emit emit_address: mov a, b bra emit_word emit_immediate: mov a, 47 call emit mov a, [width] cmp a, 1 bnz emit_address mov a, b cmp a, 255 bls emit cmp a, 0xff80 blo error bra emit operand_emitted: ret operand: mov.w [memory_syntax], 0 mov.w [operand_ext], 0 call spaces cmp a, 42 bz operand_star cmp a, 91 bnz operand_value mov.w [memory_syntax], 2 inc p bra operand_value operand_star: mov.w [memory_syntax], 1 inc p operand_value: call spaces cmp a, 45 bnz operand_register movzx a, [p+1] cmp a, 45 bnz operand_register mov a, [memory_syntax] cmp a, 0 bz error add p, 2 call spaces call reg cmp a, 7 bhs error add a, 48 bra operand_close operand_register: push p call reg cmp a, 24 bhs operand_number pop b mov b, [memory_syntax] cmp b, 0 bz operand_result cmp a, 8 bhs error mov.w [operand_code], a call spaces cmp a, 43 bz operand_plus cmp a, 45 bz operand_displacement mov a, [operand_code] add a, 32 bra operand_close operand_plus: movzx a, [p+1] cmp a, 43 bnz operand_displacement add p, 2 mov a, [operand_code] cmp a, 7 bz error add a, 40 bra operand_close operand_displacement: call number cmp b, 0 bz error mov b, a add b, 128 cmp b, 255 bhi error mov.w [operand_ext], a mov a, [operand_code] add a, 56 bra operand_close operand_number: pop p call number cmp b, 0 bz error mov.w [operand_ext], a mov a, [memory_syntax] cmp a, 0 bz operand_immediate mov a, 64 bra operand_close operand_immediate: mov a, 65 bra operand_result operand_close: push a call spaces mov b, [memory_syntax] cmp b, 2 bnz operand_closed cmp a, 93 bnz error inc p operand_closed: pop a operand_result: mov b, [operand_ext] ret execute: mov.b [y], 7 mov.w [next], y mov a, [opcode] cmp a, 2 bz prompt mov a, [begin] mov.w [0x65e], a mov.b [0x36], 5 hcf command: cmp a, 21 bz more_command bhi load_command mov x, 0xf100 dir_copy: movzx a, [p] mov.b [x], a.lo inc p inc x cmp a, 0 bnz dir_copy mov.w [find_offset], 0 bra find_request more_command: mov a, [0xf208] cmp a, 0xffff bz prompt mov.w [find_offset], a find_request: mov.w [0xf200], 1 mov x, 0xf100 mov y, 0xf200 mov r, 1040 mov p, [find_offset] sys find find_wait: sleep 60000 mov a, [0xf200] cmp a, 1 bz find_wait cmp a, 0 bz find_done mov p, find_failed call puts bra prompt find_done: call clear_row mov p, comment_tag call puts mov a, [0xf204] call decimal_print mov p, binaries_message call puts mov.w [record], 0xf210 mov a, [0xf202] mov.w [remaining], a list_entry: mov a, [remaining] cmp a, 0 bz list_done dec a mov.w [remaining], a call clear_row mov p, load_tag call puts mov p, [record] mov a, [p+2] cmp a, 0 bz low_id call hex low_id: mov p, [record] mov a, [p] call hex mov p, [record] movzx a, [p+8] mov p, name_tag cmp a, 9 bz tagged mov p, other_tag tagged: call puts mov y, [record] add y, 12 list_name: movzx a, [y] cmp a, 0 bz name_done inc y push y call putc pop y mov a, [cursor] and a, 31 cmp a, 0 bnz list_name bra next_entry name_done: call newline next_entry: mov a, [record] add a, 64 mov.w [record], a bra list_entry list_done: mov a, [0xf208] cmp a, 0xffff bz list_end call clear_row mov p, more_message call puts list_end: call clear_row mov a, [0xf202] mov b, [0xf208] cmp b, 0xffff bz list_rows inc a list_rows: shl a, 5 mov p, [cursor] sub p, a mov.w [cursor], p call draw bra poll load_command: movzx a, [p] cmp a, 36 bnz load_digits inc p load_digits: mov a, 0 mov b, 0 mov x, 0 load_digit: movzx r, [p] cmp r, 48 blo load_end cmp r, 57 bls load_decimal or r, 32 cmp r, 97 blo load_end cmp r, 102 bhi load_end sub r, 87 bra load_shift load_decimal: sub r, 48 load_shift: shl b, 4 mov y, a shr y, 12 or b, y shl a, 4 or a, r inc p inc x bra load_digit load_end: cmp x, 0 bz error cmp x, 8 bhi error mov.w [load_id], a mov.w [load_id+2], b call spaces cmp a, 0 bnz error call clear_row mov p, loading_message call puts call draw mov.b [0x37], 0 mov a, [load_id] mov b, [load_id+2] jmp load_stub clear_row: mov p, [cursor] mov a, p and a, 31 mov r, 32 sub r, a clear_row_loop: mov.b [p], 32 inc p dec r bnz clear_row_loop ret error: mov sp, 0xf000 mov p, bad call puts bra prompt spaces: movzx a, [p] cmp a, 32 bnz spaces_end inc p bra spaces spaces_end: ret reg: movzx a, [p] mov x, names mov b, 0 reg_loop: movzx r, [x] cmp a, r bz reg_found inc x inc b cmp b, 6 bnz reg_loop cmp a, 115 bnz reg_bad movzx r, [p+1] cmp r, 112 bnz reg_bad inc p mov b, 6 bra reg_found reg_bad: mov a, 255 ret reg_found: cmp b, 4 bnz reg_end movzx r, [p+1] cmp r, 99 bnz reg_end inc p mov b, 7 reg_end: inc p movzx a, [p] cmp a, 46 bnz reg_return mov a, [p+1] cmp a, 0x6f6c bz reg_low cmp a, 0x6968 bnz reg_bad add b, 8 reg_low: add b, 8 add p, 3 reg_return: mov a, b ret number: mov.w [negative], 0 movzx a, [p] cmp a, 45 bnz positive_number mov.w [negative], 1 inc p bra unsigned_number positive_number: cmp a, 43 bnz unsigned_number inc p unsigned_number: call spaces mov x, 10 mov r, 0 mov b, 0 movzx a, [p] cmp a, 36 bz dollar cmp a, 48 bnz digits movzx a, [p+1] cmp a, 120 bnz digits inc p dollar: inc p mov x, 16 digits: movzx a, [p] cmp a, 48 blo number_end cmp a, 57 bls decimal cmp a, 97 blo number_end cmp a, 102 bhi number_end sub a, 87 bra digit decimal: sub a, 48 digit: cmp a, x bhs number_end cmp x, 16 bz hex_bound cmp r, 6553 bhi number_bad blo multiply_digit cmp a, 5 bhi number_bad bra multiply_digit hex_bound: cmp r, 4095 bhi number_bad multiply_digit: mul r, x add r, a inc p inc b bra digits number_bad: mov b, 0 number_end: mov a, r mov r, [negative] cmp r, 0 bz number_return mov r, 0 sub r, a mov a, r number_return: ret decimal_print: mov x, 10000 mov r, a mov b, 0 decimal_loop: mov a, r div a, x mod r, x cmp a, 0 bnz decimal_output cmp b, 0 bnz decimal_output cmp x, 1 bnz decimal_next decimal_output: add a, 48 push x push r call putc pop r pop x mov b, 1 decimal_next: div x, 10 cmp x, 0 bnz decimal_loop ret newline: mov a, 10 bra putc puts: movzx a, [p] cmp a, 0 bz puts_end inc p push p call putc pop p bra puts puts_end: ret hex: mov x, a mov r, 4 hex_loop: mov a, x shr a, 12 add a, 48 cmp a, 57 bls hex_digit add a, 7 hex_digit: push x push r call putc pop r pop x shl x, 4 dec r bnz hex_loop ret putc: mov p, [cursor] cmp a, 10 bz line mov.b [p], a.lo inc p bra overflow line: add p, 32 and p, 0xffe0 overflow: cmp p, 0xd400 blo position call scroll position: mov.w [cursor], p ret scroll: mov p, 0xd000 scroll_copy: mov a, [p+32] mov.w [p], a add p, 2 cmp p, 0xd3e0 bnz scroll_copy scroll_clear: mov.w [p], 0x2020 add p, 2 cmp p, 0xd400 bnz scroll_clear mov.b [scrolled], 1 mov p, 0xd3e0 ret draw: mov.b [scrolled], 0 mov p, 0xd000 cell: call draw_cell inc p cmp p, 0xd400 bnz cell bra draw_done draw_edit: movzx a, [scrolled] cmp a, 0 bnz draw mov p, [old_cursor] call draw_cell mov p, [cursor] call draw_cell draw_done: mov p, [cursor] mov.w [old_cursor], p sys present ret draw_cell: movzx y, [p] shl y, 3 add y, 0xe000 mov x, p sub x, 0xd000 mov a, x and a, 31 shl a, 3 and x, 0x3e0 shl x, 6 add x, a mov r, 8 row: movzx a, [y] mov b, [cursor] cmp p, b bnz normal_row xor a, 255 normal_row: mov b, 8 pixel: push b mov b, a and b, 1 mul b, 255 out.b [x], b.lo pop b shr a, 1 inc x dec b bnz pixel add x, 248 inc y dec r bnz row ret welcome: .byte "\n **** FANCO-16 V9 ****\n\n", " ASMODEUS\n\n", "64K RAM 28K PROGRAM AREA\n", 0 memory_message: .byte " BYTES ASMODEUS\n", "DIR [TEXT] MORE LOAD ID\n\nREADY.\n", 0 find_failed: .byte "? DIR FAILED\n", 0 binaries_message: .byte " BINARIES\n", 0 comment_tag: .byte "; ", 0 load_tag: .byte "load ", 0 name_tag: .byte " ; ", 0 other_tag: .byte " ;!", 0 more_message: .byte "more ; enter here for more\n", 0 loading_message: .byte "LOADING\n", 0 load_failed: .byte "? LOAD FAILED\n", 0 find_offset: .word 0 record: .word 0 remaining: .word 0 load_id: .word 0, 0 registers: .byte "A B X Y\n", 0 registers_low: .byte "P R SP PC\n", 0 bad: .byte "? SYNTAX / FULL\n", 0 names: .byte "abxypr" cursor: .word 0 scrolled: .byte 0 old_cursor: .word 0 next: .word 0 opcode: .word 0 kind: .word 0 dest: .word 0 value: .word 0 source: .word 0 dest_ext: .word 0 descriptor: .word 0 source_ext: .word 0 operand_code: .word 0 operand_ext: .word 0 width: .word 0 negative: .word 0 memory_syntax: .word 0 begin: .word 0 input: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 table: .byte "mov", 0, 0, 0, 0, 0, 0, 0, 96, 1 .byte "movb", 0, 0, 0, 0, 0, 0, 112, 15 .byte "ldw", 0, 0, 0, 0, 0, 0, 0, 96, 12 .byte "ldb", 0, 0, 0, 0, 0, 0, 0, 110, 12 .byte "stw", 0, 0, 0, 0, 0, 0, 0, 96, 13 .byte "stb", 0, 0, 0, 0, 0, 0, 0, 112, 13 .byte "add", 0, 0, 0, 0, 0, 0, 0, 97, 1 .byte "sub", 0, 0, 0, 0, 0, 0, 0, 98, 1 .byte "and", 0, 0, 0, 0, 0, 0, 0, 99, 1 .byte "or", 0, 0, 0, 0, 0, 0, 0, 0, 100, 1 .byte "xor", 0, 0, 0, 0, 0, 0, 0, 101, 1 .byte "cmp", 0, 0, 0, 0, 0, 0, 0, 102, 1 .byte "shl", 0, 0, 0, 0, 0, 0, 0, 103, 1 .byte "shr", 0, 0, 0, 0, 0, 0, 0, 104, 1 .byte "sar", 0, 0, 0, 0, 0, 0, 0, 105, 1 .byte "mul", 0, 0, 0, 0, 0, 0, 0, 106, 1 .byte "div", 0, 0, 0, 0, 0, 0, 0, 107, 1 .byte "out", 0, 0, 0, 0, 0, 0, 0, 108, 1 .byte "in", 0, 0, 0, 0, 0, 0, 0, 0, 109, 1 .byte "mod", 0, 0, 0, 0, 0, 0, 0, 126, 1 .byte "lea", 0, 0, 0, 0, 0, 0, 0, 236, 10 .byte "movzx", 0, 0, 0, 0, 0, 110, 11 .byte "movsx", 0, 0, 0, 0, 0, 111, 11 .byte "push", 0, 0, 0, 0, 0, 0, 8, 2 .byte "pop", 0, 0, 0, 0, 0, 0, 0, 16, 2 .byte "inc", 0, 0, 0, 0, 0, 0, 0, 16, 8 .byte "dec", 0, 0, 0, 0, 0, 0, 0, 24, 9 .byte "nop", 0, 0, 0, 0, 0, 0, 0, 64, 0 .byte "hcf", 0, 0, 0, 0, 0, 0, 0, 7, 0 .byte "hlt", 0, 0, 0, 0, 0, 0, 0, 31, 0 .byte "ret", 0, 0, 0, 0, 0, 0, 0, 47, 0 .byte "reti", 0, 0, 0, 0, 0, 0, 2, 0 .byte "blit", 0, 0, 0, 0, 0, 0, 6, 0 .byte "sys", 0, 0, 0, 0, 0, 0, 0, 7, 6 .byte "sleep", 0, 0, 0, 0, 0, 5, 5 .byte "bra", 0, 0, 0, 0, 0, 0, 0, 48, 3 .byte "bz", 0, 0, 0, 0, 0, 0, 0, 0, 49, 3 .byte "bnz", 0, 0, 0, 0, 0, 0, 0, 50, 3 .byte "blt", 0, 0, 0, 0, 0, 0, 0, 51, 3 .byte "bge", 0, 0, 0, 0, 0, 0, 0, 52, 3 .byte "blo", 0, 0, 0, 0, 0, 0, 0, 53, 3 .byte "bhs", 0, 0, 0, 0, 0, 0, 0, 54, 3 .byte "ble", 0, 0, 0, 0, 0, 0, 0, 55, 3 .byte "bgt", 0, 0, 0, 0, 0, 0, 0, 56, 3 .byte "bls", 0, 0, 0, 0, 0, 0, 0, 57, 3 .byte "bhi", 0, 0, 0, 0, 0, 0, 0, 58, 3 .byte "bmi", 0, 0, 0, 0, 0, 0, 0, 59, 3 .byte "bpl", 0, 0, 0, 0, 0, 0, 0, 60, 3 .byte "bvs", 0, 0, 0, 0, 0, 0, 0, 61, 3 .byte "bvc", 0, 0, 0, 0, 0, 0, 0, 62, 3 .byte "call", 0, 0, 0, 0, 0, 0, 3, 4 .byte "jmp", 0, 0, 0, 0, 0, 0, 0, 96, 14 .byte "smulshift", 0, 32, 7 .byte "umulhi", 0, 0, 0, 0, 33, 7 .byte "adc", 0, 0, 0, 0, 0, 0, 0, 34, 7 .byte "sbc", 0, 0, 0, 0, 0, 0, 0, 35, 7 .byte "abs", 0, 0, 0, 0, 0, 0, 0, 36, 7 .byte "smin", 0, 0, 0, 0, 0, 0, 37, 7 .byte "smax", 0, 0, 0, 0, 0, 0, 38, 7 .byte "dir", 0, 0, 0, 0, 0, 0, 0, 0, 20 .byte "more", 0, 0, 0, 0, 0, 0, 0, 21 .byte "load", 0, 0, 0, 0, 0, 0, 0, 22 .byte 0 monitor_end: ; Loads run from page zero, which ordinary apps leave alone, so a failed or ; partial load cannot strand the CPU inside overwritten ASMODEUS code. When the ; object ends without a JUMP, the stub reloads ASMODEUS, which reports 0037. .org 0xc0 load_stub: sys load32 load_wait: sleep 60000 mov a, [0x38] cmp a, 0 bnz load_wait mov a, 0x101 mov b, 0 sys load32 reload_wait: sleep 60000 mov a, [0x38] cmp a, 0 bnz reload_wait hcf