Created
February 1, 2013 05:21
-
-
Save Blecki/4689461 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; | |
| ; 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