Skip to content

Instantly share code, notes, and snippets.

@Blecki
Created February 1, 2013 05:21
Show Gist options
  • Select an option

  • Save Blecki/4689461 to your computer and use it in GitHub Desktop.

Select an option

Save Blecki/4689461 to your computer and use it in GitHub Desktop.
SET J, SP
; Entering blocknode emit
; bypassed
; static lem_hardware_id[2] = { 0x7349, 0xf615 };
; constant lem_vram_size = 384;
; constant console_size = 384;
; constant console_width = 32;
; static lem;
; lem = detect_lem();
JSR L6detect_lem
ADD SP, 0x0000
SET B, A
SET [L38_STATIC_lem], B
; static lem_vram;
; lem_vram = __endofprogram;
SET B, ENDOFPROGRAM
SET [L39_STATIC_lem_vram], B
; initialize_lem(lem, lem_vram);
SET PUSH, [L39_STATIC_lem_vram]
SET PUSH, [L38_STATIC_lem]
JSR L8initialize_lem
ADD SP, 0x0002
; static console[sizeof(console)];
; console_make(console, lem_vram);
SET PUSH, [L39_STATIC_lem_vram]
SET PUSH, L40_STATIC_console
JSR L26console_make
ADD SP, 0x0002
; static printf;
; printf = &__printf;
SET B, L42__printf
SET [L41_STATIC_printf], B
; printf("Hello world!");
SET PUSH, L44_STRING
JSR [L41_STATIC_printf]
ADD SP, 0x0001
; Leaving blocknode emit
:L0main_footer
SET PC, L0main_footer
;DCPUC FUNCTION compare32 L1compare32 2
; function compare32(a:num32, b:num32)
:L1compare32
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; if (a.high != b.high)
SET B, [0x0003+J]
SET B, [B]
SET C, [0x0002+J]
SET C, [C]
IFN C, B
SET PC, L45THEN
SET PC, L46END
:L45THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L2compare32_footer
; Leaving blocknode emit
:L46END
; if (a.low != b.low)
SET B, [0x0003+J]
SET B, [0x0001+B]
SET C, [0x0002+J]
SET C, [0x0001+C]
IFN C, B
SET PC, L47THEN
SET PC, L48END
:L47THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L2compare32_footer
; Leaving blocknode emit
:L48END
; return 1;
SET B, 0x0001
SET A, B
SET PC, L2compare32_footer
; Leaving blocknode emit
:L2compare32_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION detect_hardware L3detect_hardware 1
; function detect_hardware(id:num32)
:L3detect_hardware
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, I
; Entering blocknode emit
; bypassed
; local num_hardware = 0;
SET PUSH, 0x0000
; Inline assembly
SET B, J
ADD B, 0xFFFC
HWN [B]
; local n = 0;
SET PUSH, 0x0000
; while (n < num_hardware)
:L49BEGIN_WHILE
SET C, [0xFFFB+J]
IFL C, [0xFFFC+J]
SET PC, L50YES
SET PC, L51END_WHILE
:L50YES
; Entering blocknode emit
; local hardware_id[2];
SUB SP, 0x0002
; Inline assembly
SET PUSH, A
SET A, [0xFFFB+J]
; Inline assembly
SET I, J
ADD I, 0xFFF9
HWQ A
SET [0x0001+I], A
SET [I], B
SET A, POP
; if (compare32(hardware_id, id) != 0)
SET PUSH, [0x0002+J]
SET PUSH, J
ADD PEEK, 0xFFF9
JSR L1compare32
ADD SP, 0x0002
SET B, A
IFN B, 0x0000
SET PC, L52THEN
SET PC, L53END
:L52THEN
; Entering blocknode emit
; return n;
SET B, [0xFFFB+J]
SET A, B
SET PC, L4detect_hardware_footer
; Leaving blocknode emit
:L53END
; n += 1;
SET B, 0x0001
ADD [0xFFFB+J], B
ADD SP, 0x0002
; Leaving blocknode emit
SET PC, L49BEGIN_WHILE
:L51END_WHILE
; return -1;
SET B, 0xFFFF
SET A, B
SET PC, L4detect_hardware_footer
; Leaving blocknode emit
:L4detect_hardware_footer
SET SP, J
SUB SP, 0x0003
SET I, POP
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION detect_lem L6detect_lem 0
; function detect_lem()
:L6detect_lem
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
; Entering blocknode emit
; bypassed
; return detect_hardware(lem_hardware_id);
SET PUSH, L5_STATIC_lem_hardware_id
JSR L3detect_hardware
ADD SP, 0x0001
SET B, A
SET A, B
SET PC, L7detect_lem_footer
; Leaving blocknode emit
:L7detect_lem_footer
SET SP, J
SUB SP, 0x0001
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION initialize_lem L8initialize_lem 2
; function initialize_lem(id, vram)
:L8initialize_lem
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; Inline assembly
SET PUSH, A
SET A, 0x0000
; Inline assembly
SET B, [0x0003+J]
; Inline assembly
SET C, [0x0002+J]
HWI C
SET A, POP
; Leaving blocknode emit
:L9initialize_lem_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION initialize_memory_page L10initialize_memory_page 2
; function initialize_memory_page(start, size)
:L10initialize_memory_page
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; local free_list_head:free_block = start + 1;
SET PUSH, [0x0002+J]
ADD PEEK, 0x0001
; *start = start + 1;
SET B, [0x0002+J]
ADD B, 0x0001
SET C, [0x0002+J]
SET [C], B
; free_list_head.size = size - 1;
SET B, [0x0003+J]
SUB B, 0x0001
SET C, [0xFFFD+J]
SET [C], B
; free_list_head.next_free_block = 0;
SET B, 0x0000
SET C, [0xFFFD+J]
SET [0x0001+C], B
; Leaving blocknode emit
:L11initialize_memory_page_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION allocate_memory L12allocate_memory 2
; function allocate_memory(size, page)
:L12allocate_memory
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, X
SET PUSH, Y
; Entering blocknode emit
; bypassed
; if (size == 0)
SET B, [0x0002+J]
IFE B, 0x0000
SET PC, L54THEN
SET PC, L55END
:L54THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L55END
; local current_block:free_block = *page;
SET PUSH, [0x0003+J]
SET A, PEEK
SET PEEK, [A]
; local previous_block:free_block = 0;
SET PUSH, 0x0000
; while (current_block != 0 & (current_block.size < (size + 1)
:L56BEGIN_WHILE
SET B, 0x0000
SET C, 0x0000
SET Y, [0x0002+J]
ADD Y, 0x0001
SET X, [0xFFFB+J]
SET X, [X]
IFL X, X
SET C, 0x0001
AND B, C
SET C, [0xFFFB+J]
IFN C, B
SET PC, L57YES
SET PC, L58END_WHILE
:L57YES
; Entering blocknode emit
; previous_block = current_block;
SET B, [0xFFFB+J]
SET [0xFFFA+J], B
; current_block = current_block.next_free_block;
SET B, [0xFFFB+J]
SET B, [0x0001+B]
SET [0xFFFB+J], B
; Leaving blocknode emit
SET PC, L56BEGIN_WHILE
:L58END_WHILE
; if (current_block == 0)
SET B, [0xFFFB+J]
IFE B, 0x0000
SET PC, L59THEN
SET PC, L60END
:L59THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L60END
; local final_size = size + 1;
SET PUSH, [0x0002+J]
ADD PEEK, 0x0001
; if (current_block.size < (final_size + 2)
SET B, [0xFFF9+J]
ADD B, 0x0002
SET C, [0xFFFB+J]
SET C, [C]
IFL C, B
SET PC, L63THEN
SET PC, L64END
:L63THEN
; Entering blocknode emit
; if (previous_block == 0)
SET B, [0xFFFA+J]
IFE B, 0x0000
SET PC, L61THEN
; Entering blocknode emit
; previous_block.next_free_block = current_block.next_free_block;
SET B, [0xFFFB+J]
SET B, [0x0001+B]
SET C, [0xFFFA+J]
SET [0x0001+C], B
; Leaving blocknode emit
SET PC, L62END
:L61THEN
; Entering blocknode emit
; *page = current_block.next_free_block;
SET B, [0xFFFB+J]
SET B, [0x0001+B]
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L62END
; return current_block + 1;
SET B, [0xFFFB+J]
ADD B, 0x0001
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L64END
; local new_free_block:free_block = current_block + final_size;
SET PUSH, [0xFFFB+J]
ADD PEEK, [0xFFF9+J]
; new_free_block.size = current_block.size - final_size;
SET B, [0xFFFB+J]
SET B, [B]
SUB B, [0xFFF9+J]
SET C, [0xFFF8+J]
SET [C], B
; new_free_block.next_free_block = current_block.next_free_block;
SET B, [0xFFFB+J]
SET B, [0x0001+B]
SET C, [0xFFF8+J]
SET [0x0001+C], B
; if (previous_block == 0)
SET B, [0xFFFA+J]
IFE B, 0x0000
SET PC, L65THEN
; Entering blocknode emit
; previous_block.next_free_block = new_free_block;
SET B, [0xFFF8+J]
SET C, [0xFFFA+J]
SET [0x0001+C], B
; Leaving blocknode emit
SET PC, L66END
:L65THEN
; Entering blocknode emit
; *page = new_free_block;
SET B, [0xFFF8+J]
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L66END
; current_block.size = final_size;
SET B, [0xFFF9+J]
SET C, [0xFFFB+J]
SET [C], B
; return current_block + 1;
SET B, [0xFFFB+J]
ADD B, 0x0001
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L13allocate_memory_footer
SET SP, J
SUB SP, 0x0004
SET Y, POP
SET X, POP
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION free L14free 2
; function free(block, page)
:L14free
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; local memory_block:free_block = block - 1;
SET PUSH, [0x0002+J]
SUB PEEK, 0x0001
; memory_block.next_free_block = *page;
SET B, [0x0003+J]
SET B, [B]
SET C, [0xFFFD+J]
SET [0x0001+C], B
; *page = memory_block;
SET B, [0xFFFD+J]
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L15free_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION veclen L16veclen 1
; function veclen(string:vec)
:L16veclen
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
; Entering blocknode emit
; bypassed
; return string.header & 0x00FF;
SET B, [0x0002+J]
SET B, [B]
AND B, 0x00FF
SET A, B
SET PC, L17veclen_footer
; Leaving blocknode emit
:L17veclen_footer
SET SP, J
SUB SP, 0x0001
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION veccap L18veccap 1
; function veccap(string:vec)
:L18veccap
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
; Entering blocknode emit
; bypassed
; return (string.header & 0xFF00) >> 8;
SET B, [0x0002+J]
SET B, [B]
AND B, 0xFF00
SHR B, 0x0008
SET A, B
SET PC, L19veccap_footer
; Leaving blocknode emit
:L19veccap_footer
SET SP, J
SUB SP, 0x0001
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION veccpy L20veccpy 2
; function veccpy(from:vec, to:vec)
:L20veccpy
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, X
; Entering blocknode emit
; bypassed
; local i;
SUB SP, 0x0001
; while (i < veccap(to) && i < veclen(from))
:L67BEGIN_WHILE
SET B, 0x0000
SET PUSH, [0x0002+J]
JSR L16veclen
ADD SP, 0x0001
SET X, A
SET PUSH, [0x0003+J]
JSR L18veccap
ADD SP, 0x0001
SET C, A
SET X, J
ADD X, 0xFFFC
AND C, X
IFL C, C
SET B, 0x0001
SET C, [0xFFFC+J]
IFL C, B
SET PC, L68YES
SET PC, L69END_WHILE
:L68YES
; Entering blocknode emit
; to[1 + i] = from[1 + i];
SET B, 0x0001
ADD B, [0xFFFC+J]
ADD B, [0x0002+J]
SET B, [B]
SET C, 0x0001
ADD C, [0xFFFC+J]
ADD C, [0x0003+J]
SET [C], B
; i += 1;
SET B, 0x0001
ADD [0xFFFC+J], B
; Leaving blocknode emit
SET PC, L67BEGIN_WHILE
:L69END_WHILE
; local to_cap = veccap(to);
SET PUSH, [0x0003+J]
JSR L18veccap
ADD SP, 0x0001
SET PUSH, A
; if (veclen(from) > to_cap)
SET PUSH, [0x0002+J]
JSR L16veclen
ADD SP, 0x0001
SET C, A
IFG C, [0xFFFB+J]
SET PC, L70THEN
; Entering blocknode emit
; to.header = ((to_cap & 0x00FF) << 8) + (veclen(from) & 0x00FF)
SET B, [0xFFFB+J]
AND B, 0x00FF
SHL B, 0x0008
SET PUSH, [0x0002+J]
JSR L16veclen
ADD SP, 0x0001
SET C, A
AND C, 0x00FF
ADD B, C
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
SET PC, L71END
:L70THEN
; Entering blocknode emit
; to.header = ((to_cap & 0x00FF) << 8) + (to_cap & 0x00FF)
SET B, [0xFFFB+J]
AND B, 0x00FF
SHL B, 0x0008
SET C, [0xFFFB+J]
AND C, 0x00FF
ADD B, C
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L71END
; Leaving blocknode emit
:L21veccpy_footer
SET SP, J
SUB SP, 0x0003
SET X, POP
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION veccat L22veccat 2
; function veccat(from:vec, to:vec)
:L22veccat
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, X
; Entering blocknode emit
; bypassed
; local total_length = veclen(from) + veclen(to);
SET PUSH, [0x0002+J]
JSR L16veclen
ADD SP, 0x0001
SET PUSH, A
SET PUSH, [0x0003+J]
JSR L16veclen
ADD SP, 0x0001
SET B, A
ADD PEEK, B
; local i = 0;
SET PUSH, 0x0000
; while (i + veclen(to) < veccap(to) && i < veclen(from))
:L72BEGIN_WHILE
SET B, 0x0000
SET PUSH, [0x0002+J]
JSR L16veclen
ADD SP, 0x0001
SET X, A
SET PUSH, [0x0003+J]
JSR L18veccap
ADD SP, 0x0001
SET C, A
SET X, J
ADD X, 0xFFFB
AND C, X
IFL C, C
SET B, 0x0001
SET C, [0xFFFB+J]
SET PUSH, [0x0003+J]
JSR L16veclen
ADD SP, 0x0001
SET X, A
ADD C, X
IFL C, B
SET PC, L73YES
SET PC, L74END_WHILE
:L73YES
; Entering blocknode emit
; to[1 + veclen(to) + i] = from[1 + i];
SET B, 0x0001
ADD B, [0xFFFB+J]
ADD B, [0x0002+J]
SET B, [B]
SET C, 0x0001
SET PUSH, [0x0003+J]
JSR L16veclen
ADD SP, 0x0001
SET X, A
ADD C, X
ADD C, [0xFFFB+J]
ADD C, [0x0003+J]
SET [C], B
; i += 1;
SET B, 0x0001
ADD [0xFFFB+J], B
; Leaving blocknode emit
SET PC, L72BEGIN_WHILE
:L74END_WHILE
; local to_cap = veccap(to);
SET PUSH, [0x0003+J]
JSR L18veccap
ADD SP, 0x0001
SET PUSH, A
; if (total_length > to_cap)
SET C, [0xFFFC+J]
IFG C, [0xFFFA+J]
SET PC, L75THEN
; Entering blocknode emit
; to.header = ((to_cap & 0x00FF) << 8) + (total_length & 0x00FF)
SET B, [0xFFFA+J]
AND B, 0x00FF
SHL B, 0x0008
SET C, [0xFFFC+J]
AND C, 0x00FF
ADD B, C
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
SET PC, L76END
:L75THEN
; Entering blocknode emit
; to.header = ((to_cap & 0x00FF) << 8) + (to_cap & 0x00FF)
SET B, [0xFFFA+J]
AND B, 0x00FF
SHL B, 0x0008
SET C, [0xFFFA+J]
AND C, 0x00FF
ADD B, C
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L76END
; Leaving blocknode emit
:L23veccat_footer
SET SP, J
SUB SP, 0x0003
SET X, POP
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION vecalo L24vecalo 2
; function vecalo(capacity, page)
:L24vecalo
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; local mem_block:vec = allocate_memory(capacity + 1, page);
SET PUSH, [0x0003+J]
SET PUSH, [0x0002+J]
ADD PEEK, 0x0001
JSR L12allocate_memory
ADD SP, 0x0002
SET PUSH, A
; if (mem_block != 0)
SET B, [0xFFFD+J]
IFN B, 0x0000
SET PC, L77THEN
SET PC, L78END
:L77THEN
; Entering blocknode emit
; mem_block.header = (capacity & 0x00FF) << 8;
SET B, [0x0002+J]
AND B, 0x00FF
SHL B, 0x0008
SET C, [0xFFFD+J]
SET [C], B
; Leaving blocknode emit
:L78END
; return mem_block;
SET B, [0xFFFD+J]
SET A, B
SET PC, L25vecalo_footer
; Leaving blocknode emit
:L25vecalo_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION console_make L26console_make 2
; function console_make(console:console, vram)
:L26console_make
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; console.console_buffer = vram;
SET B, [0x0003+J]
SET C, [0x0002+J]
SET [C], B
; console.cursor_position = 0;
SET B, 0x0000
SET C, [0x0002+J]
SET [0x0001+C], B
; console.color = 0xF000;
SET B, 0xF000
SET C, [0x0002+J]
SET [0x0002+C], B
; Leaving blocknode emit
:L27console_make_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION console_scroll L28console_scroll 2
; function console_scroll(console:console, lines)
:L28console_scroll
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, X
; Entering blocknode emit
; bypassed
; local chars = lines * console_width;
SET PUSH, [0x0003+J]
MUL PEEK, 0x0020
; if (chars > console_size)
SET B, [0xFFFC+J]
IFG B, 0x0180
SET PC, L79THEN
SET PC, L80END
:L79THEN
; Entering blocknode emit
; chars = console_size;
SET B, 0x0180
SET [0xFFFC+J], B
; Leaving blocknode emit
:L80END
; local place = 0;
SET PUSH, 0x0000
; while (place < (console_size - chars)
:L81BEGIN_WHILE
SET B, 0x0180
SUB B, [0xFFFC+J]
SET C, [0xFFFB+J]
IFL C, B
SET PC, L82YES
SET PC, L83END_WHILE
:L82YES
; Entering blocknode emit
; console.console_buffer[place] = console.console_buffer[place + chars];
SET B, [0xFFFB+J]
ADD B, [0xFFFC+J]
SET C, [0x0002+J]
SET C, [C]
ADD B, C
SET B, [B]
SET C, [0xFFFB+J]
SET X, [0x0002+J]
SET X, [X]
ADD C, X
SET [C], B
; place += 1;
SET B, 0x0001
ADD [0xFFFB+J], B
; Leaving blocknode emit
SET PC, L81BEGIN_WHILE
:L83END_WHILE
; while (place < console_size)
:L84BEGIN_WHILE
SET B, [0xFFFB+J]
IFL B, 0x0180
SET PC, L85YES
SET PC, L86END_WHILE
:L85YES
; Entering blocknode emit
; console.console_buffer[place] = 0;
SET B, 0x0000
SET C, [0xFFFB+J]
SET X, [0x0002+J]
SET X, [X]
ADD C, X
SET [C], B
; place += 1;
SET B, 0x0001
ADD [0xFFFB+J], B
; Leaving blocknode emit
SET PC, L84BEGIN_WHILE
:L86END_WHILE
; console.cursor_position -= chars;
SET B, [0xFFFC+J]
SET C, [0x0002+J]
SUB [0x0001+C], B
; Leaving blocknode emit
:L29console_scroll_footer
SET SP, J
SUB SP, 0x0003
SET X, POP
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION console_charout L30console_charout 2
; function console_charout(console:console, char)
:L30console_charout
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, X
; Entering blocknode emit
; bypassed
; console.console_buffer[console.cursor_position] = console.color | char;
SET B, [0x0002+J]
SET B, [0x0002+B]
BOR B, [0x0003+J]
SET C, [0x0002+J]
SET C, [0x0001+C]
SET X, [0x0002+J]
SET X, [X]
ADD C, X
SET [C], B
; console.cursor_position += 1;
SET B, 0x0001
SET C, [0x0002+J]
ADD [0x0001+C], B
; if (console.cursor_position > (console_size - 1)
SET B, [0x0002+J]
SET B, [0x0001+B]
IFG B, 0x017F
SET PC, L87THEN
SET PC, L88END
:L87THEN
; Entering blocknode emit
; console_scroll(console, 1);
SET PUSH, 0x0001
SET PUSH, [0x0002+J]
JSR L28console_scroll
ADD SP, 0x0002
; Leaving blocknode emit
:L88END
; Leaving blocknode emit
:L31console_charout_footer
SET SP, J
SUB SP, 0x0003
SET X, POP
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION console_stringout L32console_stringout 2
; function console_stringout(console:console, string)
:L32console_stringout
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, X
; Entering blocknode emit
; bypassed
; local strlen = veclen(string);
SET PUSH, [0x0003+J]
JSR L16veclen
ADD SP, 0x0001
SET PUSH, A
; if ((console.cursor_position + strlen) > (console_size - 1)
SET B, [0x0002+J]
SET B, [0x0001+B]
ADD B, [0xFFFC+J]
IFG B, 0x017F
SET PC, L89THEN
SET PC, L90END
:L89THEN
; Entering blocknode emit
; console_scroll(console, strlen / console_width);
SET PUSH, [0xFFFC+J]
DIV PEEK, 0x0020
SET PUSH, [0x0002+J]
JSR L28console_scroll
ADD SP, 0x0002
; Leaving blocknode emit
:L90END
; local place = 0;
SET PUSH, 0x0000
; while (place < strlen)
:L91BEGIN_WHILE
SET C, [0xFFFB+J]
IFL C, [0xFFFC+J]
SET PC, L92YES
SET PC, L93END_WHILE
:L92YES
; Entering blocknode emit
; console.console_buffer[console.cursor_position] = console.color | string[place + 1];
SET B, [0x0002+J]
SET B, [0x0002+B]
SET C, [0xFFFB+J]
ADD C, 0x0001
ADD C, [0x0003+J]
SET C, [C]
BOR B, C
SET C, [0x0002+J]
SET C, [0x0001+C]
SET X, [0x0002+J]
SET X, [X]
ADD C, X
SET [C], B
; console.cursor_position += 1;
SET B, 0x0001
SET C, [0x0002+J]
ADD [0x0001+C], B
; place += 1;
SET B, 0x0001
ADD [0xFFFB+J], B
; Leaving blocknode emit
SET PC, L91BEGIN_WHILE
:L93END_WHILE
; Leaving blocknode emit
:L33console_stringout_footer
SET SP, J
SUB SP, 0x0003
SET X, POP
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION __itoa L34__itoa 2
; function __itoa(number, buffer)
:L34__itoa
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; if (number > 9)
SET B, [0x0002+J]
IFG B, 0x0009
SET PC, L94THEN
SET PC, L95END
:L94THEN
; Entering blocknode emit
; __itoa(number / 10, buffer);
SET PUSH, [0x0003+J]
SET PUSH, [0x0002+J]
DIV PEEK, 0x000A
JSR L34__itoa
ADD SP, 0x0002
; Leaving blocknode emit
:L95END
; buffer[0] += 1;
SET B, 0x0001
SET C, 0x0000
ADD C, [0x0003+J]
ADD [C], B
; buffer[buffer[0]] = '0' + (number % 10)
SET B, 0x0030
SET C, [0x0002+J]
MOD C, 0x000A
ADD B, C
SET C, 0x0000
ADD C, [0x0003+J]
SET C, [C]
ADD C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L35__itoa_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION itoa L36itoa 2
; function itoa(number, buffer)
:L36itoa
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; buffer[0] = 0;
SET B, 0x0000
SET C, 0x0000
ADD C, [0x0003+J]
SET [C], B
; __itoa(number, buffer);
SET PUSH, [0x0003+J]
SET PUSH, [0x0002+J]
JSR L34__itoa
ADD SP, 0x0002
; Leaving blocknode emit
:L37itoa_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION __printf L42__printf 1
; function __printf(string)
:L42__printf
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; local index = 0;
SET PUSH, 0x0000
; local strlen = veclen(string);
SET PUSH, [0x0002+J]
JSR L16veclen
ADD SP, 0x0001
SET PUSH, A
; local parameter_index = 4;
SET PUSH, 0x0004
; local number_buffer[32];
SUB SP, 0x0020
; while (index < strlen)
:L96BEGIN_WHILE
SET C, [0xFFFD+J]
IFL C, [0xFFFC+J]
SET PC, L97YES
SET PC, L98END_WHILE
:L97YES
; Entering blocknode emit
; if (string[index + 1] == '%')
SET B, [0xFFFD+J]
ADD B, 0x0001
ADD B, [0x0002+J]
SET B, [B]
IFE B, 0x0025
SET PC, L99THEN
; Entering blocknode emit
; console_charout(console, string[index + 1]);
SET PUSH, [0xFFFD+J]
ADD PEEK, 0x0001
ADD PEEK, [0x0002+J]
SET A, PEEK
SET PEEK, [A]
SET PUSH, L40_STATIC_console
JSR L30console_charout
ADD SP, 0x0002
; Leaving blocknode emit
SET PC, L100END
:L99THEN
; Entering blocknode emit
; local parameter = 0;
SET PUSH, 0x0000
; Inline assembly
SET PUSH, A
SET A, [0xFFFB+J]
; Inline assembly
SET B, J
ADD B, 0xFFDA
; Inline assembly
SET C, 0x0000
SET C, J
ADD C, A
SET [B], [C]
SET A, POP
; parameter_index += 1;
SET B, 0x0001
ADD [0xFFFB+J], B
; itoa(parameter, number_buffer);
SET PUSH, J
ADD PEEK, 0xFFDB
SET PUSH, [0xFFDA+J]
JSR L36itoa
ADD SP, 0x0002
; console_stringout(console, number_buffer);
SET PUSH, J
ADD PEEK, 0xFFDB
SET PUSH, L40_STATIC_console
JSR L32console_stringout
ADD SP, 0x0002
ADD SP, 0x0001
; Leaving blocknode emit
:L100END
; index += 1;
SET B, 0x0001
ADD [0xFFFD+J], B
; Leaving blocknode emit
SET PC, L96BEGIN_WHILE
:L98END_WHILE
; Leaving blocknode emit
:L43__printf_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
:L44_STRING DAT 0x000C 0x0048 0x0065 0x006C 0x006C 0x006F 0x0020 0x0077 0x006F 0x0072 0x006C 0x0064 0x0021
:L5_STATIC_lem_hardware_id DAT 0x7349 0xF615
:L38_STATIC_lem DAT 0x0000
:L39_STATIC_lem_vram DAT 0x0000
:L40_STATIC_console DAT 0x0000 0x0000 0x0000
:L41_STATIC_printf DAT 0x0000
:ENDOFPROGRAM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment