Created
February 4, 2013 02:48
-
-
Save Blecki/4704753 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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