Skip to content

Instantly share code, notes, and snippets.

@Blecki
Created February 4, 2013 02:48
Show Gist options
  • Select an option

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

Select an option

Save Blecki/4704753 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;
; constant CONSOLE_HEIGHT = 12;
; static generic_keyboard_id[2] = { 0x30cf, 0x7406 };
; local allocatable_memory = __endofprogram;
SET PUSH, ENDOFPROGRAM
; initialize_memory_page(allocatable_memory, 0x8000);
SET PUSH, 0x8000
SET PUSH, [0xFFFF+J]
JSR L10initialize_memory_page
ADD SP, 0x0002
; local lem_device = detect_lem();
JSR L6detect_lem
ADD SP, 0x0000
SET PUSH, A
; local video_memory = allocate_memory(LEM_VRAM_SIZE, allocatable_memory);
SET PUSH, [0xFFFF+J]
SET PUSH, 0x0180
JSR L12allocate_memory
ADD SP, 0x0002
SET PUSH, A
; initialize_lem(lem_device, video_memory);
SET PUSH, [0xFFFD+J]
SET PUSH, [0xFFFE+J]
JSR L8initialize_lem
ADD SP, 0x0002
; static console:Console[sizeof(Console)];
; console_initialize(console, video_memory);
SET PUSH, [0xFFFD+J]
SET PUSH, L47_STATIC_console
JSR L26console_initialize
ADD SP, 0x0002
; local keyboard = find_keyboard();
JSR L43find_keyboard
ADD SP, 0x0000
SET PUSH, A
; local printf = &__printf;
SET PUSH, L48__printf
; printf("Hello world!");
SET PUSH, L50_STRING
JSR [0xFFFB+J]
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, L51THEN
SET PC, L52END
:L51THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L2compare32_footer
; Leaving blocknode emit
:L52END
; 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, L53THEN
SET PC, L54END
:L53THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L2compare32_footer
; Leaving blocknode emit
:L54END
; 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
:L55BEGIN_WHILE
SET C, [0xFFFB+J]
IFL C, [0xFFFC+J]
SET PC, L56YES
SET PC, L57END_WHILE
:L56YES
; 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, L58THEN
SET PC, L59END
:L58THEN
; Entering blocknode emit
; return n;
SET B, [0xFFFB+J]
SET A, B
SET PC, L4detect_hardware_footer
; Leaving blocknode emit
:L59END
; n += 1;
SET B, 0x0001
ADD [0xFFFB+J], B
ADD SP, 0x0002
; Leaving blocknode emit
SET PC, L55BEGIN_WHILE
:L57END_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
; Entering blocknode emit
; bypassed
; if (size == 0)
SET B, [0x0002+J]
IFE B, 0x0000
SET PC, L60THEN
SET PC, L61END
:L60THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L61END
; 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
; local final_size = size + 1;
SET PUSH, [0x0002+J]
ADD PEEK, 0x0001
; while ((current_block != 0) & (current_block.size < final_size)
:L62BEGIN_WHILE
SET B, 0x0000
IFN [0xFFFC+J], 0x0000
SET B, 0x0001
SET C, 0x0000
SET X, [0xFFFC+J]
SET X, [X]
IFL X, [0xFFFA+J]
SET C, 0x0001
AND B, C
IFN B, 0x0000
SET PC, L63YES
SET PC, L64END_WHILE
:L63YES
; Entering blocknode emit
; previous_block = current_block;
SET B, [0xFFFC+J]
SET [0xFFFB+J], B
; current_block = current_block.next_free_block;
SET B, [0xFFFC+J]
SET B, [0x0001+B]
SET [0xFFFC+J], B
; Leaving blocknode emit
SET PC, L62BEGIN_WHILE
:L64END_WHILE
; if (current_block == 0)
SET B, [0xFFFC+J]
IFE B, 0x0000
SET PC, L65THEN
SET PC, L66END
:L65THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L66END
; if (current_block.size < (final_size + 2)
SET B, [0xFFFA+J]
ADD B, 0x0002
SET C, [0xFFFC+J]
SET C, [C]
IFL C, B
SET PC, L69THEN
SET PC, L70END
:L69THEN
; Entering blocknode emit
; if (previous_block == 0)
SET B, [0xFFFB+J]
IFE B, 0x0000
SET PC, L67THEN
; Entering blocknode emit
; previous_block.next_free_block = current_block.next_free_block;
SET B, [0xFFFC+J]
SET B, [0x0001+B]
SET C, [0xFFFB+J]
SET [0x0001+C], B
; Leaving blocknode emit
SET PC, L68END
:L67THEN
; Entering blocknode emit
; *page = current_block.next_free_block;
SET B, [0xFFFC+J]
SET B, [0x0001+B]
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L68END
; return current_block + 1;
SET B, [0xFFFC+J]
ADD B, 0x0001
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L70END
; local new_free_block:free_block = current_block + final_size;
SET PUSH, [0xFFFC+J]
ADD PEEK, [0xFFFA+J]
; new_free_block.size = current_block.size - final_size;
SET B, [0xFFFC+J]
SET B, [B]
SUB B, [0xFFFA+J]
SET C, [0xFFF9+J]
SET [C], B
; new_free_block.next_free_block = current_block.next_free_block;
SET B, [0xFFFC+J]
SET B, [0x0001+B]
SET C, [0xFFF9+J]
SET [0x0001+C], B
; if (previous_block == 0)
SET B, [0xFFFB+J]
IFE B, 0x0000
SET PC, L71THEN
; Entering blocknode emit
; previous_block.next_free_block = new_free_block;
SET B, [0xFFF9+J]
SET C, [0xFFFB+J]
SET [0x0001+C], B
; Leaving blocknode emit
SET PC, L72END
:L71THEN
; Entering blocknode emit
; *page = new_free_block;
SET B, [0xFFF9+J]
SET C, [0x0003+J]
SET [C], B
; Leaving blocknode emit
:L72END
; current_block.size = final_size;
SET B, [0xFFFA+J]
SET C, [0xFFFC+J]
SET [C], B
; return current_block + 1;
SET B, [0xFFFC+J]
ADD B, 0x0001
SET A, B
SET PC, L13allocate_memory_footer
; Leaving blocknode emit
:L13allocate_memory_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 free_memory L14free_memory 2
; function free_memory(block, page)
:L14free_memory
; 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_memory_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))
:L73BEGIN_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, L74YES
SET PC, L75END_WHILE
:L74YES
; 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, L73BEGIN_WHILE
:L75END_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, L76THEN
; 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, L77END
:L76THEN
; 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
:L77END
; 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))
:L78BEGIN_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, L79YES
SET PC, L80END_WHILE
:L79YES
; 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, L78BEGIN_WHILE
:L80END_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, L81THEN
; 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, L82END
:L81THEN
; 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
:L82END
; 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, L83THEN
SET PC, L84END
:L83THEN
; 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
:L84END
; 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_initialize L26console_initialize 2
; function console_initialize(
; console:Console /* A pointer to sizeof(Console) words of memory */,
; vram /* A pointer to 384 words of memory */)
:L26console_initialize
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; 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
; console.backspace_point = 0;
SET B, 0x0000
SET C, [0x0002+J]
SET [0x0003+C], B
; Leaving blocknode emit
:L27console_initialize_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION console_setcursor L28console_setcursor 2
; function console_setcursor(console:Console, cursor_position)
:L28console_setcursor
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
; Entering blocknode emit
; bypassed
; console.cursor_position = cursor_position;
SET B, [0x0003+J]
SET C, [0x0002+J]
SET [0x0001+C], B
; Leaving blocknode emit
:L29console_setcursor_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 L30console_scroll 2
; function console_scroll(console:Console, lines)
:L30console_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, L85THEN
SET PC, L86END
:L85THEN
; Entering blocknode emit
; chars = CONSOLE_SIZE;
SET B, 0x0180
SET [0xFFFC+J], B
; Leaving blocknode emit
:L86END
; local place = 0;
SET PUSH, 0x0000
; local copy_maximum = CONSOLE_SIZE - chars;
SET PUSH, 0x0180
SUB PEEK, [0xFFFC+J]
; while (place < copy_maximum)
:L87BEGIN_WHILE
SET C, [0xFFFB+J]
IFL C, [0xFFFA+J]
SET PC, L88YES
SET PC, L89END_WHILE
:L88YES
; Entering blocknode emit
; console.buffer[place] = 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, L87BEGIN_WHILE
:L89END_WHILE
; while (place < CONSOLE_SIZE)
:L90BEGIN_WHILE
SET B, [0xFFFB+J]
IFL B, 0x0180
SET PC, L91YES
SET PC, L92END_WHILE
:L91YES
; Entering blocknode emit
; console.buffer[place] = console.color;
SET B, [0x0002+J]
SET B, [0x0002+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, L90BEGIN_WHILE
:L92END_WHILE
; console.cursor_position -= chars;
SET B, [0xFFFC+J]
SET C, [0x0002+J]
SUB [0x0001+C], B
; Leaving blocknode emit
:L31console_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 L32console_charout 2
; function console_charout(console:Console, char)
:L32console_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.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, L93THEN
SET PC, L94END
:L93THEN
; Entering blocknode emit
; console_scroll(console, 1);
SET PUSH, 0x0001
SET PUSH, [0x0002+J]
JSR L30console_scroll
ADD SP, 0x0002
; Leaving blocknode emit
:L94END
; Leaving blocknode emit
:L33console_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 L34console_stringout 2
; function console_stringout(console:Console, string /* A pointer to string data. */)
:L34console_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 = *string & 0x00FF;
SET PUSH, [0x0003+J]
AND PEEK, 0x00FF
SET A, PEEK
SET PEEK, [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, L95THEN
SET PC, L96END
:L95THEN
; Entering blocknode emit
; console_scroll(console, strlen / CONSOLE_WIDTH);
SET PUSH, [0xFFFC+J]
DIV PEEK, 0x0020
SET PUSH, [0x0002+J]
JSR L30console_scroll
ADD SP, 0x0002
; Leaving blocknode emit
:L96END
; local place = 0;
SET PUSH, 0x0000
; while (place < strlen)
:L97BEGIN_WHILE
SET C, [0xFFFB+J]
IFL C, [0xFFFC+J]
SET PC, L98YES
SET PC, L99END_WHILE
:L98YES
; Entering blocknode emit
; 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, L97BEGIN_WHILE
:L99END_WHILE
; Leaving blocknode emit
:L35console_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 console_backspace L36console_backspace 1
; function console_backspace(console:Console)
:L36console_backspace
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, C
SET PUSH, X
; Entering blocknode emit
; bypassed
; if (console.cursor_position == console.backspace_point)
SET B, [0x0002+J]
SET B, [0x0003+B]
SET C, [0x0002+J]
SET C, [0x0001+C]
IFE C, B
SET PC, L100THEN
SET PC, L101END
:L100THEN
; Entering blocknode emit
; return 0;
SET B, 0x0000
SET A, B
SET PC, L37console_backspace_footer
; Leaving blocknode emit
:L101END
; console.cursor_position -= 1;
SET B, 0x0001
SET C, [0x0002+J]
SUB [0x0001+C], B
; console.buffer[console.cursor_position] = console.color;
SET B, [0x0002+J]
SET B, [0x0002+B]
SET C, [0x0002+J]
SET C, [0x0001+C]
SET X, [0x0002+J]
SET X, [X]
ADD C, X
SET [C], B
; Leaving blocknode emit
:L37console_backspace_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 L38__itoa 2
; function __itoa(number, buffer)
:L38__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, L102THEN
SET PC, L103END
:L102THEN
; Entering blocknode emit
; __itoa(number / 10, buffer);
SET PUSH, [0x0003+J]
SET PUSH, [0x0002+J]
DIV PEEK, 0x000A
JSR L38__itoa
ADD SP, 0x0002
; Leaving blocknode emit
:L103END
; 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
:L39__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 L40itoa 2
; function itoa(number, buffer)
:L40itoa
; 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 L38__itoa
ADD SP, 0x0002
; Leaving blocknode emit
:L41itoa_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION find_keyboard L43find_keyboard 0
; function find_keyboard()
:L43find_keyboard
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
; Entering blocknode emit
; bypassed
; return detect_hardware(generic_keyboard_id);
SET PUSH, L42_STATIC_generic_keyboard_id
JSR L3detect_hardware
ADD SP, 0x0001
SET B, A
SET A, B
SET PC, L44find_keyboard_footer
; Leaving blocknode emit
:L44find_keyboard_footer
SET SP, J
SUB SP, 0x0001
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION kb_getkey L45kb_getkey 1
; function kb_getkey(id)
:L45kb_getkey
; Save frame pointer in J
SET PUSH, J
SET J, SP
SET PUSH, B
SET PUSH, X
; Entering blocknode emit
; bypassed
; local r;
SUB SP, 0x0001
; Inline assembly
SET B, [0x0002+J]
; Inline assembly
SET X, J
ADD X, 0xFFFD
SET A, 0x0001
HWI B
SET [X], C
; return r;
SET B, [0xFFFD+J]
SET A, B
SET PC, L46kb_getkey_footer
; Leaving blocknode emit
:L46kb_getkey_footer
SET SP, J
SUB SP, 0x0002
SET X, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
;DCPUC FUNCTION __printf L48__printf 1
; function __printf(string /* Followed by some number of arguments */)
:L48__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 = *string;
SET PUSH, [0x0002+J]
SET A, PEEK
SET PEEK, [A]
; local parameter_index = 4;
SET PUSH, 0x0004
; local number_buffer[32];
SUB SP, 0x0020
; while (index < strlen)
:L104BEGIN_WHILE
SET C, [0xFFFD+J]
IFL C, [0xFFFC+J]
SET PC, L105YES
SET PC, L106END_WHILE
:L105YES
; 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, L107THEN
; 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, L47_STATIC_console
JSR L32console_charout
ADD SP, 0x0002
; Leaving blocknode emit
SET PC, L108END
:L107THEN
; 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 L40itoa
ADD SP, 0x0002
; console_stringout(console, number_buffer);
SET PUSH, J
ADD PEEK, 0xFFDB
SET PUSH, L47_STATIC_console
JSR L34console_stringout
ADD SP, 0x0002
ADD SP, 0x0001
; Leaving blocknode emit
:L108END
; index += 1;
SET B, 0x0001
ADD [0xFFFD+J], B
; Leaving blocknode emit
SET PC, L104BEGIN_WHILE
:L106END_WHILE
; Leaving blocknode emit
:L49__printf_footer
SET SP, J
SUB SP, 0x0002
SET C, POP
SET B, POP
SET J, POP
SET PC, POP
;END FUNCTION
:L50_STRING DAT 0x000C 0x0048 0x0065 0x006C 0x006C 0x006F 0x0020 0x0077 0x006F 0x0072 0x006C 0x0064 0x0021
:L5_STATIC_LEM_HARDWARE_ID DAT 0x7349 0xF615
:L42_STATIC_generic_keyboard_id DAT 0x30CF 0x7406
:L47_STATIC_console DAT 0x0000 0x0000 0x0000 0x0000
:ENDOFPROGRAM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment