Last active
December 14, 2015 11:29
-
-
Save Blecki/5079218 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 M35FD_HARDWARE_ID[2] = { 0x4FD5, 0x24C5 }; | |
| ; static M35FD_MANUFACTURER_ID[2] = { 0x1eb3, 0x7e91 }; | |
| ; 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 L45initialize_memory_page | |
| ADD SP, 0x2 | |
| ; local lem_device = detect_lem(); | |
| JSR L80detect_lem | |
| ADD SP, 0x0 | |
| SET PUSH, A | |
| ; local video_memory = allocate_memory(LEM_VRAM_SIZE, allocatable_memory); | |
| SET PUSH, [0xFFFF+J] | |
| SET PUSH, 0x180 | |
| JSR L47allocate_memory | |
| ADD SP, 0x2 | |
| SET PUSH, A | |
| ; initialize_lem(lem_device, video_memory); | |
| SET PUSH, [0xFFFD+J] | |
| SET PUSH, [0xFFFE+J] | |
| JSR L82initialize_lem | |
| ADD SP, 0x2 | |
| ; static console:Console[sizeof(Console)]; | |
| ; console_initialize(console, video_memory); | |
| SET PUSH, [0xFFFD+J] | |
| SET PUSH, L105_STATIC_console | |
| JSR L84console_initialize | |
| ADD SP, 0x2 | |
| ; local keyboard = find_keyboard(); | |
| JSR L101find_keyboard | |
| ADD SP, 0x0 | |
| SET PUSH, A | |
| ; static printf = &__printf; | |
| ; local err = 0x0000; | |
| SET PUSH, 0x0 | |
| ; local disc = 0; | |
| SET PUSH, 0x0 | |
| ; local drives_found = m35fd_enumerate(&disc, 1); | |
| SET PUSH, 0x1 | |
| SET PUSH, J | |
| ADD PEEK, 0xFFFA | |
| JSR L5m35fd_enumerate | |
| ADD SP, 0x2 | |
| SET PUSH, A | |
| ; printf("Found % m35fd devices.\n", drives_found); | |
| SET PUSH, [0xFFF9+J] | |
| SET PUSH, L109_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| ; if (drives_found == 0) | |
| SET B, [0xFFF9+J] | |
| IFE B, 0x0 | |
| SET PC, L139THEN | |
| SET PC, L140END | |
| :L139THEN | |
| ; Entering blocknode emit | |
| ; printf("No drive found.\n"); | |
| SET PUSH, L110_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L140END | |
| ; printf("Detected disc with id %\n", disc); | |
| SET PUSH, [0xFFFA+J] | |
| SET PUSH, L111_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| ; local raw_buff[512]; | |
| SUB SP, 0x200 | |
| ; local i = 0; | |
| SET PUSH, 0x0 | |
| ; while (i < 512) | |
| :L141BEGIN_WHILE | |
| SET B, [0xFDF8+J] | |
| IFL B, 0x200 | |
| SET PC, L142YES | |
| SET PC, L143END_WHILE | |
| :L142YES | |
| ; Entering blocknode emit | |
| ; raw_buff[i] = i; | |
| SET C, [0xFDF8+J] | |
| SET X, J | |
| ADD X, 0xFDF9 | |
| ADD C, X | |
| SET [C], [0xFDF8+J] | |
| ; i += 1; | |
| ADD [0xFDF8+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L141BEGIN_WHILE | |
| :L143END_WHILE | |
| ; err = m35fd_blocking_write(disc, 0, raw_buff); | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| SET PUSH, 0x0 | |
| SET PUSH, [0xFFFA+J] | |
| JSR L17m35fd_blocking_write | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET [0xFFFB+J], B | |
| ; if (err != 0) | |
| SET B, [0xFFFB+J] | |
| IFN B, 0x0 | |
| SET PC, L144THEN | |
| SET PC, L145END | |
| :L144THEN | |
| ; Entering blocknode emit | |
| ; printf("Raw write failed."); | |
| SET PUSH, L112_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L113_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L145END | |
| ; local file_system:bfs512_SYSTEM_HEADER = allocate_memory(sizeof(bfs512_SYSTEM_HEADER), allocatable_memory); | |
| SET PUSH, [0xFFFF+J] | |
| SET PUSH, 0x600 | |
| JSR L47allocate_memory | |
| ADD SP, 0x2 | |
| SET PUSH, A | |
| ; local file:bfs512_FILE = allocate_memory(sizeof(bfs512_FILE), allocatable_memory); | |
| SET PUSH, [0xFFFF+J] | |
| SET PUSH, 0x205 | |
| JSR L47allocate_memory | |
| ADD SP, 0x2 | |
| SET PUSH, A | |
| ; local directory:bfs512_OPEN_DIRECTORY = allocate_memory(sizeof(bfs512_OPEN_DIRECTORY), allocatable_memory); | |
| SET PUSH, [0xFFFF+J] | |
| SET PUSH, 0x206 | |
| JSR L47allocate_memory | |
| ADD SP, 0x2 | |
| SET PUSH, A | |
| ; local entry:bfs512_DIRECTORY_ENTRY = allocate_memory(sizeof(bfs512_DIRECTORY_ENTRY), allocatable_memory); | |
| SET PUSH, [0xFFFF+J] | |
| SET PUSH, 0xA | |
| JSR L47allocate_memory | |
| ADD SP, 0x2 | |
| SET PUSH, A | |
| ; if ((file_system == 0) | (file == 0) | (directory == 0) | (entry == 0) | |
| SET B, 0x0 | |
| IFE [0xFDF7+J], 0x0 | |
| SET B, 0x1 | |
| SET C, 0x0 | |
| IFE [0xFDF6+J], 0x0 | |
| SET C, 0x1 | |
| BOR B, C | |
| SET C, 0x0 | |
| IFE [0xFDF5+J], 0x0 | |
| SET C, 0x1 | |
| BOR B, C | |
| SET C, 0x0 | |
| IFE [0xFDF4+J], 0x0 | |
| SET C, 0x1 | |
| BOR B, C | |
| IFN B, 0x0 | |
| SET PC, L146THEN | |
| SET PC, L147END | |
| :L146THEN | |
| ; Entering blocknode emit | |
| ; printf("Error allocating memory.\n"); | |
| SET PUSH, L114_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf("%, %, %, %\n", file_system, file, directory, entry); | |
| SET PUSH, [0xFDF4+J] | |
| SET PUSH, [0xFDF5+J] | |
| SET PUSH, [0xFDF6+J] | |
| SET PUSH, [0xFDF7+J] | |
| SET PUSH, L115_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x5 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L147END | |
| ; local sp = 0; | |
| SET PUSH, 0x0 | |
| ; A = &sp) | |
| SET A, J | |
| ADD A, 0xFDF3 | |
| SET [A], SP | |
| ; printf("Memory used: % words\n", entry + sizeof(bfs512_DIRECTORY_ENTRY) + (0xFFFF - sp)); | |
| SET PUSH, [0xFDF4+J] | |
| ADD PEEK, 0xA | |
| SET A, 0xFFFF | |
| SUB A, [0xFDF3+J] | |
| ADD PEEK, A | |
| SET PUSH, L116_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| ; bfs512_format_header(file_system); | |
| SET PUSH, [0xFDF7+J] | |
| JSR L25bfs512_format_header | |
| ADD SP, 0x1 | |
| ; file_system[6 + ( 3 / 16)] &= !(1 << ( 3 % 16) | |
| SET A, 0x6 | |
| SET B, 0x3 | |
| DIV B, 0x10 | |
| ADD A, B | |
| ADD A, [0xFDF7+J] | |
| AND [A], 0xFFF7 | |
| ; err = bfs512_create_directory(file_system, disc, 3); | |
| SET PUSH, 0x3 | |
| SET PUSH, [0xFFFA+J] | |
| SET PUSH, [0xFDF7+J] | |
| JSR L69bfs512_create_directory | |
| ADD SP, 0x3 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L148THEN | |
| SET PC, L149END | |
| :L148THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail create root"); | |
| SET PUSH, L117_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L118_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L149END | |
| ; err = bfs512_save_header(disc, file_system); | |
| SET PUSH, [0xFDF7+J] | |
| SET PUSH, [0xFFFA+J] | |
| JSR L23bfs512_save_header | |
| ADD SP, 0x2 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L150THEN | |
| SET PC, L151END | |
| :L150THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail save header"); | |
| SET PUSH, L119_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L120_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L151END | |
| ; err = bfs512_create_write(file, file_system, disc); | |
| SET PUSH, [0xFFFA+J] | |
| SET PUSH, [0xFDF7+J] | |
| SET PUSH, [0xFDF6+J] | |
| JSR L31bfs512_create_write | |
| ADD SP, 0x3 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L152THEN | |
| SET PC, L153END | |
| :L152THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail create file"); | |
| SET PUSH, L121_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L122_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L153END | |
| ; local _data = "Hello World!"; | |
| SET PUSH, L123_STRING | |
| ; err = bfs512_write(file, _data, (1 + _data[0])); | |
| SET PUSH, 0x1 | |
| SET B, 0x0 | |
| ADD B, [0xFDF2+J] | |
| SET B, [B] | |
| ADD PEEK, B | |
| SET PUSH, [0xFDF2+J] | |
| SET PUSH, [0xFDF6+J] | |
| JSR L37bfs512_write | |
| ADD SP, 0x3 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L154THEN | |
| SET PC, L155END | |
| :L154THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail write file"); | |
| SET PUSH, L124_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L125_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L155END | |
| ; err = bfs512_flush(file); | |
| SET PUSH, [0xFDF6+J] | |
| JSR L41bfs512_flush | |
| ADD SP, 0x1 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L156THEN | |
| SET PC, L157END | |
| :L156THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail flush file"); | |
| SET PUSH, L126_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L127_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L157END | |
| ; entry.type = 1; | |
| SET A, [0xFDF4+J] | |
| SET [A], 0x1 | |
| ; entry.sector = file.sector; | |
| SET A, [0xFDF6+J] | |
| SET A, [0x2+A] | |
| SET B, [0xFDF4+J] | |
| SET [0x1+B], A | |
| ; bfs512_pack_filename("helloworld!00000" + 1, entry.name); | |
| SET PUSH, [0xFDF4+J] | |
| ADD PEEK, 0x2 | |
| SET PUSH, L128_STRING | |
| ADD PEEK, 0x1 | |
| JSR L61bfs512_pack_filename | |
| ADD SP, 0x2 | |
| ; err = bfs512_append_to_directory(file_system, disc, 3, entry); | |
| SET PUSH, [0xFDF4+J] | |
| SET PUSH, 0x3 | |
| SET PUSH, [0xFFFA+J] | |
| SET PUSH, [0xFDF7+J] | |
| JSR L73bfs512_append_to_directory | |
| ADD SP, 0x4 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L158THEN | |
| SET PC, L159END | |
| :L158THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail add to dir"); | |
| SET PUSH, L129_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L130_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L159END | |
| ; err = bfs512_open_directory(file_system, disc, 3, directory); | |
| SET PUSH, [0xFDF5+J] | |
| SET PUSH, 0x3 | |
| SET PUSH, [0xFFFA+J] | |
| SET PUSH, [0xFDF7+J] | |
| JSR L67bfs512_open_directory | |
| ADD SP, 0x4 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L160THEN | |
| SET PC, L161END | |
| :L160THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail open dir"); | |
| SET PUSH, L131_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L132_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L161END | |
| ; printf("Root Children: %\n", directory.children_left); | |
| SET A, [0xFDF5+J] | |
| SET PUSH, [A] | |
| SET PUSH, L133_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| ; while (directory.children_left > 0) | |
| :L162BEGIN_WHILE | |
| SET A, [0xFDF5+J] | |
| SET A, [A] | |
| IFG A, 0x0 | |
| SET PC, L163YES | |
| SET PC, L164END_WHILE | |
| :L163YES | |
| ; Entering blocknode emit | |
| ; err = bfs512_read_directory_entry(directory, entry); | |
| SET PUSH, [0xFDF4+J] | |
| SET PUSH, [0xFDF5+J] | |
| JSR L71bfs512_read_directory_entry | |
| ADD SP, 0x2 | |
| SET [0xFFFB+J], A | |
| ; if (err != 0) | |
| SET A, [0xFFFB+J] | |
| IFN A, 0x0 | |
| SET PC, L165THEN | |
| SET PC, L166END | |
| :L165THEN | |
| ; Entering blocknode emit | |
| ; printf("Fail read entry"); | |
| SET PUSH, L134_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf(": EC %\n", err); | |
| SET PUSH, [0xFFFB+J] | |
| SET PUSH, L135_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x2 | |
| SET PC, L138_ERROR | |
| ; Leaving blocknode emit | |
| :L166END | |
| ; local _buff[17]; | |
| SUB SP, 0x11 | |
| ; bfs512_unpack_filename(entry.name, _buff + 1); | |
| SET PUSH, J | |
| ADD PEEK, 0xFDE1 | |
| ADD PEEK, 0x1 | |
| SET PUSH, [0xFDF4+J] | |
| ADD PEEK, 0x2 | |
| JSR L63bfs512_unpack_filename | |
| ADD SP, 0x2 | |
| ; _buff[0] = 16; | |
| SET A, 0x0 | |
| SET B, J | |
| ADD B, 0xFDE1 | |
| ADD A, B | |
| SET [A], 0x10 | |
| ; printf(_buff); | |
| SET PUSH, J | |
| ADD PEEK, 0xFDE1 | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ; printf("\n"); | |
| SET PUSH, L136_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| ADD SP, 0x11 | |
| ; Leaving blocknode emit | |
| SET PC, L162BEGIN_WHILE | |
| :L164END_WHILE | |
| ; printf("Finished tests.\n"); | |
| SET PUSH, L137_STRING | |
| JSR [L106_STATIC_printf] | |
| ADD SP, 0x1 | |
| :L138_ERROR | |
| ; Leaving blocknode emit | |
| :L0main_footer | |
| SET PC, L0main_footer | |
| ;DCPUB 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 A, [0x3+J] | |
| SET B, [A] | |
| SET A, [0x2+J] | |
| SET C, [A] | |
| IFN C, B | |
| SET PC, L167THEN | |
| SET PC, L168END | |
| :L167THEN | |
| ; Entering blocknode emit | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L2compare32_footer | |
| ; Leaving blocknode emit | |
| :L168END | |
| ; if (a.low != b.low) | |
| SET A, [0x3+J] | |
| SET B, [0x1+A] | |
| SET A, [0x2+J] | |
| SET C, [0x1+A] | |
| IFN C, B | |
| SET PC, L169THEN | |
| SET PC, L170END | |
| :L169THEN | |
| ; Entering blocknode emit | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L2compare32_footer | |
| ; Leaving blocknode emit | |
| :L170END | |
| ; return 1; | |
| SET B, 0x1 | |
| SET A, B | |
| SET PC, L2compare32_footer | |
| ; Leaving blocknode emit | |
| :L2compare32_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION m35fd_enumerate L5m35fd_enumerate 2 | |
| ; function m35fd_enumerate(m35fd_drives /*Pointer to at least max_drives words*/, max_drives) | |
| :L5m35fd_enumerate | |
| ; 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, 0x0 | |
| ; local drives_found = 0; | |
| SET PUSH, 0x0 | |
| ; B = &num_hardware | |
| SET B, J | |
| ADD B, 0xFFFC | |
| HWN [B] | |
| ; local n = 0; | |
| SET PUSH, 0x0 | |
| ; while ( n < num_hardware | |
| :L171BEGIN_WHILE | |
| SET C, [0xFFFA+J] | |
| IFL C, [0xFFFC+J] | |
| SET PC, L172YES | |
| SET PC, L173END_WHILE | |
| :L172YES | |
| ; Entering blocknode emit | |
| ; local hardware_id[2]; | |
| SUB SP, 0x2 | |
| ; A = n; | |
| SET A, [0xFFFA+J] | |
| ; I = hardware_id | |
| SET I, J | |
| ADD I, 0xFFF8 | |
| HWQ A | |
| SET [0x1+I], A | |
| SET [I], B | |
| ; if ( compare32(hardware_id, M35FD_HARDWARE_ID) != 0 | |
| SET PUSH, L3_STATIC_M35FD_HARDWARE_ID | |
| SET PUSH, J | |
| ADD PEEK, 0xFFF8 | |
| JSR L1compare32 | |
| ADD SP, 0x2 | |
| IFN A, 0x0 | |
| SET PC, L176THEN | |
| SET PC, L177END | |
| :L176THEN | |
| ; Entering blocknode emit | |
| ; m35fd_drives[drives_found] = n; | |
| SET B, [0xFFFB+J] | |
| ADD B, [0x2+J] | |
| SET [B], [0xFFFA+J] | |
| ; drives_found += 1; | |
| ADD [0xFFFB+J], 0x1 | |
| ; if (drives_found == max_drives) | |
| SET B, [0xFFFB+J] | |
| IFE B, [0x3+J] | |
| SET PC, L174THEN | |
| SET PC, L175END | |
| :L174THEN | |
| ; Entering blocknode emit | |
| ; return drives_found; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L6m35fd_enumerate_footer | |
| ; Leaving blocknode emit | |
| :L175END | |
| ; Leaving blocknode emit | |
| :L177END | |
| ; n += 1; | |
| ADD [0xFFFA+J], 0x1 | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| SET PC, L171BEGIN_WHILE | |
| :L173END_WHILE | |
| ; return drives_found; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L6m35fd_enumerate_footer | |
| ; Leaving blocknode emit | |
| :L6m35fd_enumerate_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET I, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION m35fd_poll_state L7m35fd_poll_state 1 | |
| ; function m35fd_poll_state(hardware_id) | |
| :L7m35fd_poll_state | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| SET PUSH, Y | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; Y = hardware_id; | |
| SET Y, [0x2+J] | |
| ; B; | |
| ; C; | |
| ; A = 0) | |
| SET A, 0x0 | |
| HWI Y | |
| SET A, B | |
| ; Leaving blocknode emit | |
| :L8m35fd_poll_state_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET Y, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION m35fd_poll_error L9m35fd_poll_error 1 | |
| ; function m35fd_poll_error(hardware_id) | |
| :L9m35fd_poll_error | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| SET PUSH, Y | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; Y = hardware_id; | |
| SET Y, [0x2+J] | |
| ; B; | |
| ; C; | |
| ; A = 0) | |
| SET A, 0x0 | |
| HWI Y | |
| SET A, C | |
| ; Leaving blocknode emit | |
| :L10m35fd_poll_error_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET Y, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION m35fd_read L11m35fd_read 3 | |
| ; function m35fd_read(hardware_id, sector, buffer) | |
| :L11m35fd_read | |
| ; 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 | |
| ; local result = 1; | |
| SET PUSH, 0x1 | |
| ; A = 2; | |
| SET A, 0x2 | |
| ; B = hardware_id; | |
| SET B, [0x2+J] | |
| ; C = &result; | |
| SET C, J | |
| ADD C, 0xFFFB | |
| ; X = sector; | |
| SET X, [0x3+J] | |
| ; Y = buffer) | |
| SET Y, [0x4+J] | |
| HWI B | |
| SET [C], B | |
| ; return result; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L12m35fd_read_footer | |
| ; Leaving blocknode emit | |
| :L12m35fd_read_footer | |
| SET SP, J | |
| SUB SP, 0x4 | |
| SET Y, POP | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION m35fd_write L13m35fd_write 3 | |
| ; function m35fd_write(hardware_id, sector, buffer) | |
| :L13m35fd_write | |
| ; 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 | |
| ; local result = 1; | |
| SET PUSH, 0x1 | |
| ; A = 3; | |
| SET A, 0x3 | |
| ; B = hardware_id; | |
| SET B, [0x2+J] | |
| ; C = &result; | |
| SET C, J | |
| ADD C, 0xFFFB | |
| ; X = sector; | |
| SET X, [0x3+J] | |
| ; Y = buffer) | |
| SET Y, [0x4+J] | |
| HWI B | |
| SET [C], B | |
| ; return result; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L14m35fd_write_footer | |
| ; Leaving blocknode emit | |
| :L14m35fd_write_footer | |
| SET SP, J | |
| SUB SP, 0x4 | |
| SET Y, POP | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION m35fd_blocking_read L15m35fd_blocking_read 3 | |
| ; function m35fd_blocking_read(drive, sector, into /* Pointer to 512 words of memory*/) | |
| :L15m35fd_blocking_read | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; if (m35fd_read(drive, sector, into) != 1) | |
| SET PUSH, [0x4+J] | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| JSR L11m35fd_read | |
| ADD SP, 0x3 | |
| SET B, A | |
| IFN B, 0x1 | |
| SET PC, L181THEN | |
| ; Entering blocknode emit | |
| ; while (m35fd_poll_state(drive) == 0x0003) | |
| :L178BEGIN_WHILE | |
| SET PUSH, [0x2+J] | |
| JSR L7m35fd_poll_state | |
| ADD SP, 0x1 | |
| SET B, A | |
| IFE B, 0x3 | |
| SET PC, L179YES | |
| SET PC, L180END_WHILE | |
| :L179YES | |
| ; Entering blocknode emit | |
| ; Leaving blocknode emit | |
| SET PC, L178BEGIN_WHILE | |
| :L180END_WHILE | |
| ; return 0x0000; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L16m35fd_blocking_read_footer | |
| ; Leaving blocknode emit | |
| SET PC, L182END | |
| :L181THEN | |
| ; Entering blocknode emit | |
| ; return m35fd_poll_error(drive); | |
| SET PUSH, [0x2+J] | |
| JSR L9m35fd_poll_error | |
| ADD SP, 0x1 | |
| SET B, A | |
| SET A, B | |
| SET PC, L16m35fd_blocking_read_footer | |
| ; Leaving blocknode emit | |
| :L182END | |
| ; Leaving blocknode emit | |
| :L16m35fd_blocking_read_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION m35fd_blocking_write L17m35fd_blocking_write 3 | |
| ; function m35fd_blocking_write(drive, sector, from /* Pointer to 512 words of memory*/) | |
| :L17m35fd_blocking_write | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; if (m35fd_write(drive, sector, from) != 1) | |
| SET PUSH, [0x4+J] | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| JSR L13m35fd_write | |
| ADD SP, 0x3 | |
| SET B, A | |
| IFN B, 0x1 | |
| SET PC, L186THEN | |
| ; Entering blocknode emit | |
| ; while (m35fd_poll_state(drive) == 0x0003) | |
| :L183BEGIN_WHILE | |
| SET PUSH, [0x2+J] | |
| JSR L7m35fd_poll_state | |
| ADD SP, 0x1 | |
| SET B, A | |
| IFE B, 0x3 | |
| SET PC, L184YES | |
| SET PC, L185END_WHILE | |
| :L184YES | |
| ; Entering blocknode emit | |
| ; Leaving blocknode emit | |
| SET PC, L183BEGIN_WHILE | |
| :L185END_WHILE | |
| ; return 0x0000; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L18m35fd_blocking_write_footer | |
| ; Leaving blocknode emit | |
| SET PC, L187END | |
| :L186THEN | |
| ; Entering blocknode emit | |
| ; return m35fd_poll_error(drive); | |
| SET PUSH, [0x2+J] | |
| JSR L9m35fd_poll_error | |
| ADD SP, 0x1 | |
| SET B, A | |
| SET A, B | |
| SET PC, L18m35fd_blocking_write_footer | |
| ; Leaving blocknode emit | |
| :L187END | |
| ; return 0x0000; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L18m35fd_blocking_write_footer | |
| ; Leaving blocknode emit | |
| :L18m35fd_blocking_write_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_load_disc L19bfs512_load_disc 2 | |
| ; function bfs512_load_disc(device, header:bfs512_SYSTEM_HEADER | |
| :L19bfs512_load_disc | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; m35fd_blocking_read(device, 0, header); | |
| SET PUSH, [0x3+J] | |
| SET PUSH, 0x0 | |
| SET PUSH, [0x2+J] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| ; m35fd_blocking_read(device, 1, header + 512); | |
| SET PUSH, [0x3+J] | |
| ADD PEEK, 0x200 | |
| SET PUSH, 0x1 | |
| SET PUSH, [0x2+J] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| ; m35fd_blocking_read(device, 2, header + (1440 * 2)); | |
| SET PUSH, [0x3+J] | |
| SET B, 0x5A0 | |
| MUL B, 0x2 | |
| ADD PEEK, B | |
| SET PUSH, 0x2 | |
| SET PUSH, [0x2+J] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| ; Leaving blocknode emit | |
| :L20bfs512_load_disc_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_find_free_sector L21bfs512_find_free_sector 1 | |
| ; function bfs512_find_free_sector(header:bfs512_SYSTEM_HEADER) | |
| :L21bfs512_find_free_sector | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local word = 0; | |
| SET PUSH, 0x0 | |
| ; while (word < (1440 / 16) | |
| :L188BEGIN_WHILE | |
| SET B, [0xFFFD+J] | |
| IFL B, 0x5A | |
| SET PC, L189YES | |
| SET PC, L190END_WHILE | |
| :L189YES | |
| ; Entering blocknode emit | |
| ; if (header.free_mask[word] != 0) | |
| SET B, [0xFFFD+J] | |
| SET C, [0x2+J] | |
| ADD C, 0x6 | |
| ADD B, C | |
| SET B, [B] | |
| IFN B, 0x0 | |
| SET PC, L196THEN | |
| SET PC, L197END | |
| :L196THEN | |
| ; Entering blocknode emit | |
| ; local bit = 0; | |
| SET PUSH, 0x0 | |
| ; while (bit < 8) | |
| :L191BEGIN_WHILE | |
| SET B, [0xFFFC+J] | |
| IFL B, 0x8 | |
| SET PC, L192YES | |
| SET PC, L193END_WHILE | |
| :L192YES | |
| ; Entering blocknode emit | |
| ; local mask = 1 << bit; | |
| SET PUSH, 0x1 | |
| SHL PEEK, [0xFFFC+J] | |
| ; if ((header.free_mask[word] & mask) > 1) | |
| SET B, [0xFFFD+J] | |
| SET C, [0x2+J] | |
| ADD C, 0x6 | |
| ADD B, C | |
| SET B, [B] | |
| AND B, [0xFFFB+J] | |
| IFG B, 0x1 | |
| SET PC, L194THEN | |
| SET PC, L195END | |
| :L194THEN | |
| ; Entering blocknode emit | |
| ; return (word * 16) + bit; | |
| SET B, [0xFFFD+J] | |
| MUL B, 0x10 | |
| ADD B, [0xFFFC+J] | |
| SET A, B | |
| SET PC, L22bfs512_find_free_sector_footer | |
| ; Leaving blocknode emit | |
| :L195END | |
| ; bit += 1; | |
| ADD [0xFFFC+J], 0x1 | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L191BEGIN_WHILE | |
| :L193END_WHILE | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| :L197END | |
| ; word += 1; | |
| ADD [0xFFFD+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L188BEGIN_WHILE | |
| :L190END_WHILE | |
| ; return 0xFFFF; | |
| SET B, 0xFFFF | |
| SET A, B | |
| SET PC, L22bfs512_find_free_sector_footer | |
| ; Leaving blocknode emit | |
| :L22bfs512_find_free_sector_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_save_header L23bfs512_save_header 2 | |
| ; function bfs512_save_header(device, header) | |
| :L23bfs512_save_header | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; m35fd_blocking_write(device, 0, header); | |
| SET PUSH, [0x3+J] | |
| SET PUSH, 0x0 | |
| SET PUSH, [0x2+J] | |
| JSR L17m35fd_blocking_write | |
| ADD SP, 0x3 | |
| ; m35fd_blocking_write(device, 1, header + 512); | |
| SET PUSH, [0x3+J] | |
| ADD PEEK, 0x200 | |
| SET PUSH, 0x1 | |
| SET PUSH, [0x2+J] | |
| JSR L17m35fd_blocking_write | |
| ADD SP, 0x3 | |
| ; m35fd_blocking_write(device, 2, header + (512 * 2)); | |
| SET PUSH, [0x3+J] | |
| SET B, 0x200 | |
| MUL B, 0x2 | |
| ADD PEEK, B | |
| SET PUSH, 0x2 | |
| SET PUSH, [0x2+J] | |
| JSR L17m35fd_blocking_write | |
| ADD SP, 0x3 | |
| ; Leaving blocknode emit | |
| :L24bfs512_save_header_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_format_header L25bfs512_format_header 1 | |
| ; function bfs512_format_header(header) | |
| :L25bfs512_format_header | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; header[0] = 0xBF55; | |
| SET B, 0x0 | |
| ADD B, [0x2+J] | |
| SET [B], 0xBF55 | |
| ; local i = 1; | |
| SET PUSH, 0x1 | |
| ; while (i < 6) | |
| :L198BEGIN_WHILE | |
| SET B, [0xFFFE+J] | |
| IFL B, 0x6 | |
| SET PC, L199YES | |
| SET PC, L200END_WHILE | |
| :L199YES | |
| ; Entering blocknode emit | |
| ; header[i] = 0x0000; | |
| SET B, [0xFFFE+J] | |
| ADD B, [0x2+J] | |
| SET [B], 0x0 | |
| ; i += 1; | |
| ADD [0xFFFE+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L198BEGIN_WHILE | |
| :L200END_WHILE | |
| ; header[i] = 0b1111111111111000; | |
| SET B, [0xFFFE+J] | |
| ADD B, [0x2+J] | |
| SET [B], 0xFFF8 | |
| ; i += 1; | |
| ADD [0xFFFE+J], 0x1 | |
| ; while (i < (6 + (1440 / 16) | |
| :L201BEGIN_WHILE | |
| SET B, [0xFFFE+J] | |
| IFL B, 0x60 | |
| SET PC, L202YES | |
| SET PC, L203END_WHILE | |
| :L202YES | |
| ; Entering blocknode emit | |
| ; header[i] = 0xFFFF; | |
| SET B, [0xFFFE+J] | |
| ADD B, [0x2+J] | |
| SET [B], 0xFFFF | |
| ; i += 1; | |
| ADD [0xFFFE+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L201BEGIN_WHILE | |
| :L203END_WHILE | |
| ; while (i < (512 * 3) | |
| :L204BEGIN_WHILE | |
| SET B, [0xFFFE+J] | |
| IFL B, 0x600 | |
| SET PC, L205YES | |
| SET PC, L206END_WHILE | |
| :L205YES | |
| ; Entering blocknode emit | |
| ; header[i] = 0xFFFF; | |
| SET B, [0xFFFE+J] | |
| ADD B, [0x2+J] | |
| SET [B], 0xFFFF | |
| ; i += 1; | |
| ADD [0xFFFE+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L204BEGIN_WHILE | |
| :L206END_WHILE | |
| ; Leaving blocknode emit | |
| :L26bfs512_format_header_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_open_read L27bfs512_open_read 4 | |
| ; function bfs512_open_read(file:bfs512_FILE, file_system:bfs512_SYSTEM_HEADER, device, sector) | |
| :L27bfs512_open_read | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; file.device = device; | |
| SET C, [0x2+J] | |
| SET [C], [0x4+J] | |
| ; file.file_system = file_system; | |
| SET C, [0x2+J] | |
| SET [0x1+C], [0x3+J] | |
| ; file.sector = sector; | |
| SET C, [0x2+J] | |
| SET [0x2+C], [0x5+J] | |
| ; file.offset = 0; | |
| SET B, [0x2+J] | |
| SET [0x3+B], 0x0 | |
| ; file.mode = 1; | |
| SET B, [0x2+J] | |
| SET [0x4+B], 0x1 | |
| ; return m35fd_blocking_read(device, sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET PUSH, [0x5+J] | |
| SET PUSH, [0x4+J] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET A, B | |
| SET PC, L28bfs512_open_read_footer | |
| ; Leaving blocknode emit | |
| :L28bfs512_open_read_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_read L29bfs512_read 3 | |
| ; function bfs512_read(file:bfs512_FILE, into, size) | |
| :L29bfs512_read | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; if ((file.mode & 1) == 0) | |
| SET A, [0x2+J] | |
| SET B, [0x4+A] | |
| AND B, 0x1 | |
| IFE B, 0x0 | |
| SET PC, L207THEN | |
| SET PC, L208END | |
| :L207THEN | |
| ; Entering blocknode emit | |
| ; return 0x0006; | |
| SET B, 0x6 | |
| SET A, B | |
| SET PC, L30bfs512_read_footer | |
| ; Leaving blocknode emit | |
| :L208END | |
| ; local i = 0; | |
| SET PUSH, 0x0 | |
| ; while (i < size) | |
| :L209BEGIN_WHILE | |
| SET C, [0xFFFD+J] | |
| IFL C, [0x4+J] | |
| SET PC, L210YES | |
| SET PC, L211END_WHILE | |
| :L210YES | |
| ; Entering blocknode emit | |
| ; if (file.offset == 512) | |
| SET A, [0x2+J] | |
| SET B, [0x3+A] | |
| IFE B, 0x200 | |
| SET PC, L216THEN | |
| SET PC, L217END | |
| :L216THEN | |
| ; Entering blocknode emit | |
| ; local next_sector = file.file_system.link_table[file.sector]; | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET B, [0x1+A] | |
| ADD B, 0x60 | |
| ADD PEEK, B | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| ; if (next_sector == 0xFFFF) | |
| SET B, [0xFFFC+J] | |
| IFE B, 0xFFFF | |
| SET PC, L212THEN | |
| SET PC, L213END | |
| :L212THEN | |
| ; Entering blocknode emit | |
| ; return 0x0008; | |
| SET B, 0x8 | |
| SET A, B | |
| SET PC, L30bfs512_read_footer | |
| ; Leaving blocknode emit | |
| :L213END | |
| ; file.sector = next_sector; | |
| SET C, [0x2+J] | |
| SET [0x2+C], [0xFFFC+J] | |
| ; file.offset = 0; | |
| SET B, [0x2+J] | |
| SET [0x3+B], 0x0 | |
| ; local err = m35fd_blocking_read(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| SET PUSH, A | |
| ; if (err != 0) | |
| SET B, [0xFFFB+J] | |
| IFN B, 0x0 | |
| SET PC, L214THEN | |
| SET PC, L215END | |
| :L214THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L30bfs512_read_footer | |
| ; Leaving blocknode emit | |
| :L215END | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| :L217END | |
| ; into[i] = file.buffer[file.offset]; | |
| SET A, [0x2+J] | |
| SET B, [0x3+A] | |
| SET C, [0x2+J] | |
| ADD C, 0x5 | |
| ADD B, C | |
| SET B, [B] | |
| SET C, [0xFFFD+J] | |
| ADD C, [0x3+J] | |
| SET [C], B | |
| ; i += 1; | |
| ADD [0xFFFD+J], 0x1 | |
| ; file.offset += 1; | |
| SET B, [0x2+J] | |
| ADD [0x3+B], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L209BEGIN_WHILE | |
| :L211END_WHILE | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L30bfs512_read_footer | |
| ; Leaving blocknode emit | |
| :L30bfs512_read_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_create_write L31bfs512_create_write 3 | |
| ; function bfs512_create_write(file:bfs512_FILE, file_system:bfs512_SYSTEM_HEADER, device) | |
| :L31bfs512_create_write | |
| ; 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 first_sector = bfs512_find_free_sector(file_system); | |
| SET PUSH, [0x3+J] | |
| JSR L21bfs512_find_free_sector | |
| ADD SP, 0x1 | |
| SET PUSH, A | |
| ; if (first_sector == 0xFFFF) | |
| SET B, [0xFFFC+J] | |
| IFE B, 0xFFFF | |
| SET PC, L218THEN | |
| SET PC, L219END | |
| :L218THEN | |
| ; Entering blocknode emit | |
| ; return 0x0007; | |
| SET B, 0x7 | |
| SET A, B | |
| SET PC, L32bfs512_create_write_footer | |
| ; Leaving blocknode emit | |
| :L219END | |
| ; file_system[6 + ( first_sector / 16)] &= !(1 << ( first_sector % 16) | |
| SET B, 0x1 | |
| SET C, [0xFFFC+J] | |
| MOD C, 0x10 | |
| SHL B, C | |
| XOR B, 0xFFFF | |
| SET C, 0x6 | |
| SET X, [0xFFFC+J] | |
| DIV X, 0x10 | |
| ADD C, X | |
| ADD C, [0x3+J] | |
| AND [C], B | |
| ; file_system.link_table[first_sector] = 0xFFFF; | |
| SET B, [0xFFFC+J] | |
| SET C, [0x3+J] | |
| ADD C, 0x60 | |
| ADD B, C | |
| SET [B], 0xFFFF | |
| ; bfs512_save_header(device, file_system); | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x4+J] | |
| JSR L23bfs512_save_header | |
| ADD SP, 0x2 | |
| ; file.device = device; | |
| SET C, [0x2+J] | |
| SET [C], [0x4+J] | |
| ; file.file_system = file_system; | |
| SET C, [0x2+J] | |
| SET [0x1+C], [0x3+J] | |
| ; file.sector = first_sector; | |
| SET C, [0x2+J] | |
| SET [0x2+C], [0xFFFC+J] | |
| ; file.offset = 0; | |
| SET B, [0x2+J] | |
| SET [0x3+B], 0x0 | |
| ; file.mode = 2; | |
| SET B, [0x2+J] | |
| SET [0x4+B], 0x2 | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L32bfs512_create_write_footer | |
| ; Leaving blocknode emit | |
| :L32bfs512_create_write_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_open_write L33bfs512_open_write 4 | |
| ; function bfs512_open_write(file:bfs512_FILE, file_system:bfs512_SYSTEM_HEADER, device, sector) | |
| :L33bfs512_open_write | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; file.device = device; | |
| SET C, [0x2+J] | |
| SET [C], [0x4+J] | |
| ; file.file_system = file_system; | |
| SET C, [0x2+J] | |
| SET [0x1+C], [0x3+J] | |
| ; file.sector = sector; | |
| SET C, [0x2+J] | |
| SET [0x2+C], [0x5+J] | |
| ; file.offset = 0; | |
| SET B, [0x2+J] | |
| SET [0x3+B], 0x0 | |
| ; file.mode = 2; | |
| SET B, [0x2+J] | |
| SET [0x4+B], 0x2 | |
| ; return m35fd_blocking_read(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET A, B | |
| SET PC, L34bfs512_open_write_footer | |
| ; Leaving blocknode emit | |
| :L34bfs512_open_write_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_open_read_write L35bfs512_open_read_write 4 | |
| ; function bfs512_open_read_write(file:bfs512_FILE, file_system:bfs512_SYSTEM_HEADER, device, sector) | |
| :L35bfs512_open_read_write | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; file.device = device; | |
| SET C, [0x2+J] | |
| SET [C], [0x4+J] | |
| ; file.file_system = file_system; | |
| SET C, [0x2+J] | |
| SET [0x1+C], [0x3+J] | |
| ; file.sector = sector; | |
| SET C, [0x2+J] | |
| SET [0x2+C], [0x5+J] | |
| ; file.offset = 0; | |
| SET B, [0x2+J] | |
| SET [0x3+B], 0x0 | |
| ; file.mode = 2 | 1; | |
| SET B, [0x2+J] | |
| SET [0x4+B], 0x3 | |
| ; return m35fd_blocking_read(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET A, B | |
| SET PC, L36bfs512_open_read_write_footer | |
| ; Leaving blocknode emit | |
| :L36bfs512_open_read_write_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_write L37bfs512_write 3 | |
| ; function bfs512_write(file:bfs512_FILE, what, size) | |
| :L37bfs512_write | |
| ; 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 ((file.mode & 2) != 2) | |
| SET A, [0x2+J] | |
| SET B, [0x4+A] | |
| AND B, 0x2 | |
| IFN B, 0x2 | |
| SET PC, L220THEN | |
| SET PC, L221END | |
| :L220THEN | |
| ; Entering blocknode emit | |
| ; return 0x0006; | |
| SET B, 0x6 | |
| SET A, B | |
| SET PC, L38bfs512_write_footer | |
| ; Leaving blocknode emit | |
| :L221END | |
| ; local i = 0; | |
| SET PUSH, 0x0 | |
| ; while (i < size) | |
| :L222BEGIN_WHILE | |
| SET C, [0xFFFC+J] | |
| IFL C, [0x4+J] | |
| SET PC, L223YES | |
| SET PC, L224END_WHILE | |
| :L223YES | |
| ; Entering blocknode emit | |
| ; if (file.offset == 512) | |
| SET A, [0x2+J] | |
| SET B, [0x3+A] | |
| IFE B, 0x200 | |
| SET PC, L235THEN | |
| SET PC, L236END | |
| :L235THEN | |
| ; Entering blocknode emit | |
| ; local err = m35fd_blocking_write(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L17m35fd_blocking_write | |
| ADD SP, 0x3 | |
| SET PUSH, A | |
| ; if (err != 0) | |
| SET B, [0xFFFB+J] | |
| IFN B, 0x0 | |
| SET PC, L225THEN | |
| SET PC, L226END | |
| :L225THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L38bfs512_write_footer | |
| ; Leaving blocknode emit | |
| :L226END | |
| ; local next_sector = file.file_system.link_table[file.sector]; | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET B, [0x1+A] | |
| ADD B, 0x60 | |
| ADD PEEK, B | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| ; if (next_sector == 0xFFFF) | |
| SET B, [0xFFFA+J] | |
| IFE B, 0xFFFF | |
| SET PC, L233THEN | |
| ; Entering blocknode emit | |
| ; err = m35fd_blocking_read(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET [0xFFFB+J], B | |
| ; if (err != 0) | |
| SET B, [0xFFFB+J] | |
| IFN B, 0x0 | |
| SET PC, L231THEN | |
| SET PC, L232END | |
| :L231THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L38bfs512_write_footer | |
| ; Leaving blocknode emit | |
| :L232END | |
| ; Leaving blocknode emit | |
| SET PC, L234END | |
| :L233THEN | |
| ; Entering blocknode emit | |
| ; next_sector = bfs512_find_free_sector(file.file_system); | |
| SET A, [0x2+J] | |
| SET PUSH, [0x1+A] | |
| JSR L21bfs512_find_free_sector | |
| ADD SP, 0x1 | |
| SET B, A | |
| SET [0xFFFA+J], B | |
| ; if (next_sector == 0xFFFF) | |
| SET B, [0xFFFA+J] | |
| IFE B, 0xFFFF | |
| SET PC, L227THEN | |
| SET PC, L228END | |
| :L227THEN | |
| ; Entering blocknode emit | |
| ; return 0x0007; | |
| SET B, 0x7 | |
| SET A, B | |
| SET PC, L38bfs512_write_footer | |
| ; Leaving blocknode emit | |
| :L228END | |
| ; file.file_system[6 + ( next_sector / 16)] &= !(1 << ( next_sector % 16) | |
| SET B, 0x1 | |
| SET C, [0xFFFA+J] | |
| MOD C, 0x10 | |
| SHL B, C | |
| XOR B, 0xFFFF | |
| SET C, 0x6 | |
| SET X, [0xFFFA+J] | |
| DIV X, 0x10 | |
| ADD C, X | |
| SET A, [0x2+J] | |
| SET X, [0x1+A] | |
| ADD C, X | |
| AND [C], B | |
| ; file.file_system.link_table[file.sector] = next_sector; | |
| SET A, [0x2+J] | |
| SET C, [0x2+A] | |
| SET A, [0x2+J] | |
| SET X, [0x1+A] | |
| ADD X, 0x60 | |
| ADD C, X | |
| SET [C], [0xFFFA+J] | |
| ; file.file_system.link_table[next_sector] = 0xFFFF; | |
| SET B, [0xFFFA+J] | |
| SET A, [0x2+J] | |
| SET C, [0x1+A] | |
| ADD C, 0x60 | |
| ADD B, C | |
| SET [B], 0xFFFF | |
| ; err = bfs512_save_header(file.device, file.file_system); | |
| SET A, [0x2+J] | |
| SET PUSH, [0x1+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L23bfs512_save_header | |
| ADD SP, 0x2 | |
| SET B, A | |
| SET [0xFFFB+J], B | |
| ; if (err != 0) | |
| SET B, [0xFFFB+J] | |
| IFN B, 0x0 | |
| SET PC, L229THEN | |
| SET PC, L230END | |
| :L229THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L38bfs512_write_footer | |
| ; Leaving blocknode emit | |
| :L230END | |
| ; Leaving blocknode emit | |
| :L234END | |
| ; file.sector = next_sector; | |
| SET C, [0x2+J] | |
| SET [0x2+C], [0xFFFA+J] | |
| ; file.offset =0; | |
| SET B, [0x2+J] | |
| SET [0x3+B], 0x0 | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| :L236END | |
| ; file.buffer[file.offset] = what[i]; | |
| SET B, [0xFFFC+J] | |
| ADD B, [0x3+J] | |
| SET B, [B] | |
| SET A, [0x2+J] | |
| SET C, [0x3+A] | |
| SET X, [0x2+J] | |
| ADD X, 0x5 | |
| ADD C, X | |
| SET [C], B | |
| ; i += 1; | |
| ADD [0xFFFC+J], 0x1 | |
| ; file.offset += 1; | |
| SET B, [0x2+J] | |
| ADD [0x3+B], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L222BEGIN_WHILE | |
| :L224END_WHILE | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L38bfs512_write_footer | |
| ; Leaving blocknode emit | |
| :L38bfs512_write_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_seek L39bfs512_seek 2 | |
| ; function bfs512_seek(file:bfs512_FILE, distance) | |
| :L39bfs512_seek | |
| ; 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 crossed_sector = 0; | |
| SET PUSH, 0x0 | |
| ; while ((file.offset + distance) > 512) | |
| :L237BEGIN_WHILE | |
| SET A, [0x2+J] | |
| SET B, [0x3+A] | |
| ADD B, [0x3+J] | |
| IFG B, 0x200 | |
| SET PC, L238YES | |
| SET PC, L239END_WHILE | |
| :L238YES | |
| ; Entering blocknode emit | |
| ; if ( (crossed_sector == 0) & ( (file.mode & 2) != 0) | |
| SET B, 0x0 | |
| IFE [0xFFFC+J], 0x0 | |
| SET B, 0x1 | |
| SET C, 0x0 | |
| SET A, [0x2+J] | |
| SET X, [0x4+A] | |
| AND X, 0x2 | |
| IFN X, 0x0 | |
| SET C, 0x1 | |
| AND B, C | |
| IFN B, 0x0 | |
| SET PC, L242THEN | |
| SET PC, L243END | |
| :L242THEN | |
| ; Entering blocknode emit | |
| ; local err = m35fd_blocking_write(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L17m35fd_blocking_write | |
| ADD SP, 0x3 | |
| SET PUSH, A | |
| ; if (err != 0) | |
| SET B, [0xFFFB+J] | |
| IFN B, 0x0 | |
| SET PC, L240THEN | |
| SET PC, L241END | |
| :L240THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L40bfs512_seek_footer | |
| ; Leaving blocknode emit | |
| :L241END | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| :L243END | |
| ; local next_sector = file.file_system.link_table[file.sector]; | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET B, [0x1+A] | |
| ADD B, 0x60 | |
| ADD PEEK, B | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| ; if (next_sector == 0xFFFF) | |
| SET B, [0xFFFB+J] | |
| IFE B, 0xFFFF | |
| SET PC, L244THEN | |
| SET PC, L245END | |
| :L244THEN | |
| ; Entering blocknode emit | |
| ; return 0x0008; | |
| SET B, 0x8 | |
| SET A, B | |
| SET PC, L40bfs512_seek_footer | |
| ; Leaving blocknode emit | |
| :L245END | |
| ; file.sector = next_sector; | |
| SET C, [0x2+J] | |
| SET [0x2+C], [0xFFFB+J] | |
| ; distance -= 512; | |
| SUB [0x3+J], 0x200 | |
| ; crossed_sector = 1; | |
| SET [0xFFFC+J], 0x1 | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L237BEGIN_WHILE | |
| :L239END_WHILE | |
| ; file.offset += distance; | |
| SET C, [0x2+J] | |
| ADD [0x3+C], [0x3+J] | |
| ; if (crossed_sector == 1) | |
| SET B, [0xFFFC+J] | |
| IFE B, 0x1 | |
| SET PC, L246THEN | |
| SET PC, L247END | |
| :L246THEN | |
| ; Entering blocknode emit | |
| ; return m35fd_blocking_read(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L15m35fd_blocking_read | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET A, B | |
| SET PC, L40bfs512_seek_footer | |
| ; Leaving blocknode emit | |
| :L247END | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L40bfs512_seek_footer | |
| ; Leaving blocknode emit | |
| :L40bfs512_seek_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_flush L41bfs512_flush 1 | |
| ; function bfs512_flush(file:bfs512_FILE) | |
| :L41bfs512_flush | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; if ((file.mode & 2) == 0) | |
| SET A, [0x2+J] | |
| SET B, [0x4+A] | |
| AND B, 0x2 | |
| IFE B, 0x0 | |
| SET PC, L248THEN | |
| SET PC, L249END | |
| :L248THEN | |
| ; Entering blocknode emit | |
| ; return 0x0006; | |
| SET B, 0x6 | |
| SET A, B | |
| SET PC, L42bfs512_flush_footer | |
| ; Leaving blocknode emit | |
| :L249END | |
| ; return m35fd_blocking_write(file.device, file.sector, file.buffer); | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x5 | |
| SET A, [0x2+J] | |
| SET PUSH, [0x2+A] | |
| SET A, [0x2+J] | |
| SET PUSH, [A] | |
| JSR L17m35fd_blocking_write | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET A, B | |
| SET PC, L42bfs512_flush_footer | |
| ; Leaving blocknode emit | |
| :L42bfs512_flush_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_free_file_chain L43bfs512_free_file_chain 3 | |
| ; function bfs512_free_file_chain(file_system:bfs512_SYSTEM_HEADER, device, sector) | |
| :L43bfs512_free_file_chain | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| SET PUSH, X | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; while (sector != 0xFFFF) | |
| :L250BEGIN_WHILE | |
| SET B, [0x4+J] | |
| IFN B, 0xFFFF | |
| SET PC, L251YES | |
| SET PC, L252END_WHILE | |
| :L251YES | |
| ; Entering blocknode emit | |
| ; file_system[6 + ( sector / 16)] |= (1 << ( sector % 16) | |
| SET B, 0x1 | |
| SET C, [0x4+J] | |
| MOD C, 0x10 | |
| SHL B, C | |
| SET C, 0x6 | |
| SET X, [0x4+J] | |
| DIV X, 0x10 | |
| ADD C, X | |
| ADD C, [0x2+J] | |
| BOR [C], B | |
| ; local next_sector = file_system.link_table[sector]; | |
| SET PUSH, [0x4+J] | |
| SET B, [0x2+J] | |
| ADD B, 0x60 | |
| ADD PEEK, B | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| ; file_system.link_table[sector] = 0xFFFF; | |
| SET B, [0x4+J] | |
| SET C, [0x2+J] | |
| ADD C, 0x60 | |
| ADD B, C | |
| SET [B], 0xFFFF | |
| ; sector = next_sector; | |
| SET [0x4+J], [0xFFFC+J] | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L250BEGIN_WHILE | |
| :L252END_WHILE | |
| ; return bfs512_save_header(device, file_system); | |
| SET PUSH, [0x2+J] | |
| SET PUSH, [0x3+J] | |
| JSR L23bfs512_save_header | |
| ADD SP, 0x2 | |
| SET B, A | |
| SET A, B | |
| SET PC, L44bfs512_free_file_chain_footer | |
| ; Leaving blocknode emit | |
| :L44bfs512_free_file_chain_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION initialize_memory_page L45initialize_memory_page 2 | |
| ; function initialize_memory_page(start, size) | |
| :L45initialize_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, [0x2+J] | |
| ADD PEEK, 0x1 | |
| ; *start = start + 1; | |
| SET B, [0x2+J] | |
| ADD B, 0x1 | |
| SET C, [0x2+J] | |
| SET [C], B | |
| ; free_list_head.size = size - 1; | |
| SET B, [0x3+J] | |
| SUB B, 0x1 | |
| SET C, [0xFFFD+J] | |
| SET [C], B | |
| ; free_list_head.next_free_block = 0; | |
| SET B, [0xFFFD+J] | |
| SET [0x1+B], 0x0 | |
| ; Leaving blocknode emit | |
| :L46initialize_memory_page_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION allocate_memory L47allocate_memory 2 | |
| ; function allocate_memory(size, page) | |
| :L47allocate_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, [0x2+J] | |
| IFE B, 0x0 | |
| SET PC, L253THEN | |
| SET PC, L254END | |
| :L253THEN | |
| ; Entering blocknode emit | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L48allocate_memory_footer | |
| ; Leaving blocknode emit | |
| :L254END | |
| ; local current_block:free_block = *page; | |
| SET PUSH, [0x3+J] | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| ; local previous_block:free_block = 0; | |
| SET PUSH, 0x0 | |
| ; local final_size = size + 1; | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x1 | |
| ; while ((current_block != 0) & (current_block.size < final_size) | |
| :L255BEGIN_WHILE | |
| SET B, 0x0 | |
| IFN [0xFFFC+J], 0x0 | |
| SET B, 0x1 | |
| SET C, 0x0 | |
| SET A, [0xFFFC+J] | |
| SET X, [A] | |
| IFL X, [0xFFFA+J] | |
| SET C, 0x1 | |
| AND B, C | |
| IFN B, 0x0 | |
| SET PC, L256YES | |
| SET PC, L257END_WHILE | |
| :L256YES | |
| ; Entering blocknode emit | |
| ; previous_block = current_block; | |
| SET [0xFFFB+J], [0xFFFC+J] | |
| ; current_block = current_block.next_free_block; | |
| SET A, [0xFFFC+J] | |
| SET B, [0x1+A] | |
| SET [0xFFFC+J], B | |
| ; Leaving blocknode emit | |
| SET PC, L255BEGIN_WHILE | |
| :L257END_WHILE | |
| ; if (current_block == 0) | |
| SET B, [0xFFFC+J] | |
| IFE B, 0x0 | |
| SET PC, L258THEN | |
| SET PC, L259END | |
| :L258THEN | |
| ; Entering blocknode emit | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L48allocate_memory_footer | |
| ; Leaving blocknode emit | |
| :L259END | |
| ; if (current_block.size < (final_size + 2) | |
| SET B, [0xFFFA+J] | |
| ADD B, 0x2 | |
| SET A, [0xFFFC+J] | |
| SET C, [A] | |
| IFL C, B | |
| SET PC, L262THEN | |
| SET PC, L263END | |
| :L262THEN | |
| ; Entering blocknode emit | |
| ; if (previous_block == 0) | |
| SET B, [0xFFFB+J] | |
| IFE B, 0x0 | |
| SET PC, L260THEN | |
| ; Entering blocknode emit | |
| ; previous_block.next_free_block = current_block.next_free_block; | |
| SET A, [0xFFFC+J] | |
| SET B, [0x1+A] | |
| SET C, [0xFFFB+J] | |
| SET [0x1+C], B | |
| ; Leaving blocknode emit | |
| SET PC, L261END | |
| :L260THEN | |
| ; Entering blocknode emit | |
| ; *page = current_block.next_free_block; | |
| SET A, [0xFFFC+J] | |
| SET B, [0x1+A] | |
| SET C, [0x3+J] | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| :L261END | |
| ; return current_block + 1; | |
| SET B, [0xFFFC+J] | |
| ADD B, 0x1 | |
| SET A, B | |
| SET PC, L48allocate_memory_footer | |
| ; Leaving blocknode emit | |
| :L263END | |
| ; 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 A, [0xFFFC+J] | |
| SET B, [A] | |
| SUB B, [0xFFFA+J] | |
| SET C, [0xFFF9+J] | |
| SET [C], B | |
| ; new_free_block.next_free_block = current_block.next_free_block; | |
| SET A, [0xFFFC+J] | |
| SET B, [0x1+A] | |
| SET C, [0xFFF9+J] | |
| SET [0x1+C], B | |
| ; if (previous_block == 0) | |
| SET B, [0xFFFB+J] | |
| IFE B, 0x0 | |
| SET PC, L264THEN | |
| ; Entering blocknode emit | |
| ; previous_block.next_free_block = new_free_block; | |
| SET C, [0xFFFB+J] | |
| SET [0x1+C], [0xFFF9+J] | |
| ; Leaving blocknode emit | |
| SET PC, L265END | |
| :L264THEN | |
| ; Entering blocknode emit | |
| ; *page = new_free_block; | |
| SET C, [0x3+J] | |
| SET [C], [0xFFF9+J] | |
| ; Leaving blocknode emit | |
| :L265END | |
| ; current_block.size = final_size; | |
| SET C, [0xFFFC+J] | |
| SET [C], [0xFFFA+J] | |
| ; return current_block + 1; | |
| SET B, [0xFFFC+J] | |
| ADD B, 0x1 | |
| SET A, B | |
| SET PC, L48allocate_memory_footer | |
| ; Leaving blocknode emit | |
| :L48allocate_memory_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION free_memory L49free_memory 2 | |
| ; function free_memory(block, page) | |
| :L49free_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, [0x2+J] | |
| SUB PEEK, 0x1 | |
| ; memory_block.next_free_block = *page; | |
| SET B, [0x3+J] | |
| SET B, [B] | |
| SET C, [0xFFFD+J] | |
| SET [0x1+C], B | |
| ; *page = memory_block; | |
| SET C, [0x3+J] | |
| SET [C], [0xFFFD+J] | |
| ; Leaving blocknode emit | |
| :L50free_memory_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION veclen L51veclen 1 | |
| ; function veclen(string:vec) | |
| :L51veclen | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; return string.header & 0x00FF; | |
| SET A, [0x2+J] | |
| SET B, [A] | |
| AND B, 0xFF | |
| SET A, B | |
| SET PC, L52veclen_footer | |
| ; Leaving blocknode emit | |
| :L52veclen_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION veccap L53veccap 1 | |
| ; function veccap(string:vec) | |
| :L53veccap | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; return (string.header & 0xFF00) >> 8; | |
| SET A, [0x2+J] | |
| SET B, [A] | |
| AND B, 0xFF00 | |
| SHR B, 0x8 | |
| SET A, B | |
| SET PC, L54veccap_footer | |
| ; Leaving blocknode emit | |
| :L54veccap_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION veccpy L55veccpy 2 | |
| ; function veccpy(from:vec, to:vec) | |
| :L55veccpy | |
| ; 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, 0x1 | |
| ; while (i < veccap(to) && i < veclen(from)) | |
| :L266BEGIN_WHILE | |
| SET B, 0x0 | |
| SET PUSH, [0x2+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET X, A | |
| SET PUSH, [0x3+J] | |
| JSR L53veccap | |
| ADD SP, 0x1 | |
| SET C, A | |
| SET X, J | |
| ADD X, 0xFFFC | |
| AND C, X | |
| IFL C, C | |
| SET B, 0x1 | |
| SET C, [0xFFFC+J] | |
| IFL C, B | |
| SET PC, L267YES | |
| SET PC, L268END_WHILE | |
| :L267YES | |
| ; Entering blocknode emit | |
| ; to[1 + i] = from[1 + i]; | |
| SET B, 0x1 | |
| ADD B, [0xFFFC+J] | |
| ADD B, [0x2+J] | |
| SET B, [B] | |
| SET C, 0x1 | |
| ADD C, [0xFFFC+J] | |
| ADD C, [0x3+J] | |
| SET [C], B | |
| ; i += 1; | |
| ADD [0xFFFC+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L266BEGIN_WHILE | |
| :L268END_WHILE | |
| ; local to_cap = veccap(to); | |
| SET PUSH, [0x3+J] | |
| JSR L53veccap | |
| ADD SP, 0x1 | |
| SET PUSH, A | |
| ; if (veclen(from) > to_cap) | |
| SET PUSH, [0x2+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET C, A | |
| IFG C, [0xFFFB+J] | |
| SET PC, L269THEN | |
| ; Entering blocknode emit | |
| ; to.header = ((to_cap & 0x00FF) << 8) + (veclen(from) & 0x00FF) | |
| SET B, [0xFFFB+J] | |
| AND B, 0xFF | |
| SHL B, 0x8 | |
| SET PUSH, [0x2+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET C, A | |
| AND C, 0xFF | |
| ADD B, C | |
| SET C, [0x3+J] | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| SET PC, L270END | |
| :L269THEN | |
| ; Entering blocknode emit | |
| ; to.header = ((to_cap & 0x00FF) << 8) + (to_cap & 0x00FF) | |
| SET B, [0xFFFB+J] | |
| AND B, 0xFF | |
| SHL B, 0x8 | |
| SET C, [0xFFFB+J] | |
| AND C, 0xFF | |
| ADD B, C | |
| SET C, [0x3+J] | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| :L270END | |
| ; Leaving blocknode emit | |
| :L56veccpy_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION veccat L57veccat 2 | |
| ; function veccat(from:vec, to:vec) | |
| :L57veccat | |
| ; 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, [0x2+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET PUSH, A | |
| SET PUSH, [0x3+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET B, A | |
| ADD PEEK, B | |
| ; local i = 0; | |
| SET PUSH, 0x0 | |
| ; while (i + veclen(to) < veccap(to) && i < veclen(from)) | |
| :L271BEGIN_WHILE | |
| SET B, 0x0 | |
| SET PUSH, [0x2+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET X, A | |
| SET PUSH, [0x3+J] | |
| JSR L53veccap | |
| ADD SP, 0x1 | |
| SET C, A | |
| SET X, J | |
| ADD X, 0xFFFB | |
| AND C, X | |
| IFL C, C | |
| SET B, 0x1 | |
| SET C, [0xFFFB+J] | |
| SET PUSH, [0x3+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET X, A | |
| ADD C, X | |
| IFL C, B | |
| SET PC, L272YES | |
| SET PC, L273END_WHILE | |
| :L272YES | |
| ; Entering blocknode emit | |
| ; to[1 + veclen(to) + i] = from[1 + i]; | |
| SET B, 0x1 | |
| ADD B, [0xFFFB+J] | |
| ADD B, [0x2+J] | |
| SET B, [B] | |
| SET C, 0x1 | |
| SET PUSH, [0x3+J] | |
| JSR L51veclen | |
| ADD SP, 0x1 | |
| SET X, A | |
| ADD C, X | |
| ADD C, [0xFFFB+J] | |
| ADD C, [0x3+J] | |
| SET [C], B | |
| ; i += 1; | |
| ADD [0xFFFB+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L271BEGIN_WHILE | |
| :L273END_WHILE | |
| ; local to_cap = veccap(to); | |
| SET PUSH, [0x3+J] | |
| JSR L53veccap | |
| ADD SP, 0x1 | |
| SET PUSH, A | |
| ; if (total_length > to_cap) | |
| SET C, [0xFFFC+J] | |
| IFG C, [0xFFFA+J] | |
| SET PC, L274THEN | |
| ; Entering blocknode emit | |
| ; to.header = ((to_cap & 0x00FF) << 8) + (total_length & 0x00FF) | |
| SET B, [0xFFFA+J] | |
| AND B, 0xFF | |
| SHL B, 0x8 | |
| SET C, [0xFFFC+J] | |
| AND C, 0xFF | |
| ADD B, C | |
| SET C, [0x3+J] | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| SET PC, L275END | |
| :L274THEN | |
| ; Entering blocknode emit | |
| ; to.header = ((to_cap & 0x00FF) << 8) + (to_cap & 0x00FF) | |
| SET B, [0xFFFA+J] | |
| AND B, 0xFF | |
| SHL B, 0x8 | |
| SET C, [0xFFFA+J] | |
| AND C, 0xFF | |
| ADD B, C | |
| SET C, [0x3+J] | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| :L275END | |
| ; Leaving blocknode emit | |
| :L58veccat_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION vecalo L59vecalo 2 | |
| ; function vecalo(capacity, page) | |
| :L59vecalo | |
| ; 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, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x1 | |
| JSR L47allocate_memory | |
| ADD SP, 0x2 | |
| SET PUSH, A | |
| ; if (mem_block != 0) | |
| SET B, [0xFFFD+J] | |
| IFN B, 0x0 | |
| SET PC, L276THEN | |
| SET PC, L277END | |
| :L276THEN | |
| ; Entering blocknode emit | |
| ; mem_block.header = (capacity & 0x00FF) << 8; | |
| SET B, [0x2+J] | |
| AND B, 0xFF | |
| SHL B, 0x8 | |
| SET C, [0xFFFD+J] | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| :L277END | |
| ; return mem_block; | |
| SET B, [0xFFFD+J] | |
| SET A, B | |
| SET PC, L60vecalo_footer | |
| ; Leaving blocknode emit | |
| :L60vecalo_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_pack_filename L61bfs512_pack_filename 2 | |
| ; function bfs512_pack_filename(filename, into) | |
| :L61bfs512_pack_filename | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local fi = 0; | |
| SET PUSH, 0x0 | |
| ; while (fi < 8) | |
| :L278BEGIN_WHILE | |
| SET B, [0xFFFD+J] | |
| IFL B, 0x8 | |
| SET PC, L279YES | |
| SET PC, L280END_WHILE | |
| :L279YES | |
| ; Entering blocknode emit | |
| ; into[fi] = ((filename[fi * 2] & 0x00FF) << 8) + (filename[(fi * 2) + 1] & 0x00FF) | |
| SET B, [0xFFFD+J] | |
| MUL B, 0x2 | |
| ADD B, [0x2+J] | |
| SET B, [B] | |
| AND B, 0xFF | |
| SHL B, 0x8 | |
| SET C, [0xFFFD+J] | |
| MUL C, 0x2 | |
| ADD C, 0x1 | |
| ADD C, [0x2+J] | |
| SET C, [C] | |
| AND C, 0xFF | |
| ADD B, C | |
| SET C, [0xFFFD+J] | |
| ADD C, [0x3+J] | |
| SET [C], B | |
| ; fi += 1; | |
| ADD [0xFFFD+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L278BEGIN_WHILE | |
| :L280END_WHILE | |
| ; Leaving blocknode emit | |
| :L62bfs512_pack_filename_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_unpack_filename L63bfs512_unpack_filename 2 | |
| ; function bfs512_unpack_filename(filename, into) | |
| :L63bfs512_unpack_filename | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local fi = 0; | |
| SET PUSH, 0x0 | |
| ; while (fi < 8) | |
| :L281BEGIN_WHILE | |
| SET B, [0xFFFD+J] | |
| IFL B, 0x8 | |
| SET PC, L282YES | |
| SET PC, L283END_WHILE | |
| :L282YES | |
| ; Entering blocknode emit | |
| ; into[fi * 2] = filename[fi] >> 8; | |
| SET B, [0xFFFD+J] | |
| ADD B, [0x2+J] | |
| SET B, [B] | |
| SHR B, 0x8 | |
| SET C, [0xFFFD+J] | |
| MUL C, 0x2 | |
| ADD C, [0x3+J] | |
| SET [C], B | |
| ; into[(fi * 2) + 1] = filename[fi] & 0x00FF; | |
| SET B, [0xFFFD+J] | |
| ADD B, [0x2+J] | |
| SET B, [B] | |
| AND B, 0xFF | |
| SET C, [0xFFFD+J] | |
| MUL C, 0x2 | |
| ADD C, 0x1 | |
| ADD C, [0x3+J] | |
| SET [C], B | |
| ; fi += 1; | |
| ADD [0xFFFD+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L281BEGIN_WHILE | |
| :L283END_WHILE | |
| ; Leaving blocknode emit | |
| :L64bfs512_unpack_filename_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_compare_filenames L65bfs512_compare_filenames 2 | |
| ; function bfs512_compare_filenames(d, f) | |
| :L65bfs512_compare_filenames | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local i = 0; | |
| SET PUSH, 0x0 | |
| ; while (i < 8) | |
| :L284BEGIN_WHILE | |
| SET B, [0xFFFD+J] | |
| IFL B, 0x8 | |
| SET PC, L285YES | |
| SET PC, L286END_WHILE | |
| :L285YES | |
| ; Entering blocknode emit | |
| ; if (d[i] != d[i]) | |
| SET B, [0xFFFD+J] | |
| ADD B, [0x2+J] | |
| SET B, [B] | |
| SET C, [0xFFFD+J] | |
| ADD C, [0x2+J] | |
| SET C, [C] | |
| IFN C, B | |
| SET PC, L287THEN | |
| SET PC, L288END | |
| :L287THEN | |
| ; Entering blocknode emit | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L66bfs512_compare_filenames_footer | |
| ; Leaving blocknode emit | |
| :L288END | |
| ; i += 1; | |
| ADD [0xFFFD+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L284BEGIN_WHILE | |
| :L286END_WHILE | |
| ; return 1; | |
| SET B, 0x1 | |
| SET A, B | |
| SET PC, L66bfs512_compare_filenames_footer | |
| ; Leaving blocknode emit | |
| :L66bfs512_compare_filenames_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_open_directory L67bfs512_open_directory 4 | |
| ; function bfs512_open_directory(file_system:bfs512_SYSTEM_HEADER, drive, sector, out:bfs512_OPEN_DIRECTORY) | |
| :L67bfs512_open_directory | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local err = bfs512_open_read(out.file, file_system, drive, sector); | |
| SET PUSH, [0x4+J] | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| SET PUSH, [0x5+J] | |
| ADD PEEK, 0x1 | |
| JSR L27bfs512_open_read | |
| ADD SP, 0x4 | |
| SET PUSH, A | |
| ; if (err != 0) | |
| SET B, [0xFFFD+J] | |
| IFN B, 0x0 | |
| SET PC, L289THEN | |
| SET PC, L290END | |
| :L289THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFFFD+J] | |
| SET A, B | |
| SET PC, L68bfs512_open_directory_footer | |
| ; Leaving blocknode emit | |
| :L290END | |
| ; local header:bfs512_DIRECTORY_HEADER[sizeof(bfs512_DIRECTORY_HEADER)]; | |
| SUB SP, 0x2 | |
| ; bfs512_read(out.file, header, sizeof(bfs512_DIRECTORY_HEADER)); | |
| SET PUSH, 0x2 | |
| SET PUSH, J | |
| ADD PEEK, 0xFFFB | |
| SET PUSH, [0x5+J] | |
| ADD PEEK, 0x1 | |
| JSR L29bfs512_read | |
| ADD SP, 0x3 | |
| ; out.children_left = header.child_count; | |
| SET A, J | |
| ADD A, 0xFFFB | |
| SET B, [0x1+A] | |
| SET C, [0x5+J] | |
| SET [C], B | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L68bfs512_open_directory_footer | |
| ; Leaving blocknode emit | |
| :L68bfs512_open_directory_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_create_directory L69bfs512_create_directory 3 | |
| ; function bfs512_create_directory(file_system:bfs512_SYSTEM_HEADER, drive, sector) | |
| :L69bfs512_create_directory | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local _file:bfs512_FILE[sizeof(bfs512_FILE)]; | |
| SUB SP, 0x205 | |
| ; local err = bfs512_open_write(_file, file_system, drive, sector); | |
| SET PUSH, [0x4+J] | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| JSR L33bfs512_open_write | |
| ADD SP, 0x4 | |
| SET PUSH, A | |
| ; if (err != 0) | |
| SET B, [0xFDF9+J] | |
| IFN B, 0x0 | |
| SET PC, L291THEN | |
| SET PC, L292END | |
| :L291THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFDF9+J] | |
| SET A, B | |
| SET PC, L70bfs512_create_directory_footer | |
| ; Leaving blocknode emit | |
| :L292END | |
| ; local header:bfs512_DIRECTORY_HEADER[sizeof(bfs512_DIRECTORY_HEADER)]; | |
| SUB SP, 0x2 | |
| ; header.child_count = 0; | |
| SET B, J | |
| ADD B, 0xFDF7 | |
| SET [0x1+B], 0x0 | |
| ; err = bfs512_write(_file, header, sizeof(bfs512_DIRECTORY_HEADER)); | |
| SET PUSH, 0x2 | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF7 | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| JSR L37bfs512_write | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET [0xFDF9+J], B | |
| ; if (err != 0) | |
| SET B, [0xFDF9+J] | |
| IFN B, 0x0 | |
| SET PC, L293THEN | |
| SET PC, L294END | |
| :L293THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFDF9+J] | |
| SET A, B | |
| SET PC, L70bfs512_create_directory_footer | |
| ; Leaving blocknode emit | |
| :L294END | |
| ; err = bfs512_flush(_file); | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| JSR L41bfs512_flush | |
| ADD SP, 0x1 | |
| SET B, A | |
| SET [0xFDF9+J], B | |
| ; if (err != 0) | |
| SET B, [0xFDF9+J] | |
| IFN B, 0x0 | |
| SET PC, L295THEN | |
| SET PC, L296END | |
| :L295THEN | |
| ; Entering blocknode emit | |
| ; return err; | |
| SET B, [0xFDF9+J] | |
| SET A, B | |
| SET PC, L70bfs512_create_directory_footer | |
| ; Leaving blocknode emit | |
| :L296END | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L70bfs512_create_directory_footer | |
| ; Leaving blocknode emit | |
| :L70bfs512_create_directory_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_read_directory_entry L71bfs512_read_directory_entry 2 | |
| ; function bfs512_read_directory_entry(directory:bfs512_OPEN_DIRECTORY, out:bfs512_DIRECTORY_ENTRY) | |
| :L71bfs512_read_directory_entry | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; if (directory.children_left == 0) | |
| SET A, [0x2+J] | |
| SET B, [A] | |
| IFE B, 0x0 | |
| SET PC, L297THEN | |
| SET PC, L298END | |
| :L297THEN | |
| ; Entering blocknode emit | |
| ; return 0x0008; | |
| SET B, 0x8 | |
| SET A, B | |
| SET PC, L72bfs512_read_directory_entry_footer | |
| ; Leaving blocknode emit | |
| :L298END | |
| ; directory.children_left -= 1; | |
| SET B, [0x2+J] | |
| SUB [B], 0x1 | |
| ; return bfs512_read(directory.file, out, sizeof(bfs512_DIRECTORY_ENTRY)); | |
| SET PUSH, 0xA | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| ADD PEEK, 0x1 | |
| JSR L29bfs512_read | |
| ADD SP, 0x3 | |
| SET B, A | |
| SET A, B | |
| SET PC, L72bfs512_read_directory_entry_footer | |
| ; Leaving blocknode emit | |
| :L72bfs512_read_directory_entry_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_append_to_directory L73bfs512_append_to_directory 4 | |
| ; function bfs512_append_to_directory(file_system:bfs512_SYSTEM_HEADER, drive, sector, what:bfs512_DIRECTORY_ENTRY) | |
| :L73bfs512_append_to_directory | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local _file:bfs512_FILE[sizeof(bfs512_FILE)]; | |
| SUB SP, 0x205 | |
| ; bfs512_open_read_write(_file, file_system, drive, sector); | |
| SET PUSH, [0x4+J] | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| JSR L35bfs512_open_read_write | |
| ADD SP, 0x4 | |
| ; local child_count = (_file.buffer):bfs512_DIRECTORY_HEADER.child_count; | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| ADD PEEK, 0x5 | |
| SET A, POP | |
| SET PUSH, [0x1+A] | |
| ; _file.buffer):bfs512_DIRECTORY_HEADER.child_count += 1; | |
| SET B, J | |
| ADD B, 0xFDFA | |
| ADD B, 0x5 | |
| ADD [0x1+B], 0x1 | |
| ; bfs512_seek(_file, (sizeof(bfs512_DIRECTORY_HEADER)) + (sizeof(bfs512_DIRECTORY_ENTRY) * child_count)); | |
| SET PUSH, 0x2 | |
| SET B, 0xA | |
| MUL B, [0xFDF9+J] | |
| ADD PEEK, B | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| JSR L39bfs512_seek | |
| ADD SP, 0x2 | |
| ; bfs512_write(_file, what, sizeof(bfs512_DIRECTORY_ENTRY)); | |
| SET PUSH, 0xA | |
| SET PUSH, [0x5+J] | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| JSR L37bfs512_write | |
| ADD SP, 0x3 | |
| ; bfs512_flush(_file); | |
| SET PUSH, J | |
| ADD PEEK, 0xFDFA | |
| JSR L41bfs512_flush | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| :L74bfs512_append_to_directory_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION bfs512_remove_from_directory L75bfs512_remove_from_directory 4 | |
| ; function bfs512_remove_from_directory(file_system:bfs512_SYSTEM_HEADER, drive, sector, entry_index) | |
| :L75bfs512_remove_from_directory | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; local _file:bfs512_FILE[sizeof(bfs512_FILE)]; | |
| SUB SP, 0x205 | |
| ; local temp_entry:bfs512_DIRECTORY_ENTRY[sizeof(bfs512_DIRECTORY_ENTRY)]; | |
| SUB SP, 0xA | |
| ; bfs512_open_read_write(_file, file_system, drive, sector); | |
| SET PUSH, [0x4+J] | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L35bfs512_open_read_write | |
| ADD SP, 0x4 | |
| ; local child_count = (_file.buffer):bfs512_DIRECTORY_HEADER.child_count; | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| ADD PEEK, 0x5 | |
| SET A, POP | |
| SET PUSH, [0x1+A] | |
| ; _file.buffer):bfs512_DIRECTORY_HEADER.child_count -= 1; | |
| SET B, J | |
| ADD B, 0xFDF9 | |
| ADD B, 0x5 | |
| SUB [0x1+B], 0x1 | |
| ; bfs512_seek(_file, sizeof(bfs512_DIRECTORY_HEADER) + (sizeof(bfs512_DIRECTORY_ENTRY) * (child_count - 1))); | |
| SET PUSH, 0x2 | |
| SET B, 0xA | |
| SET C, [0xFDEE+J] | |
| SUB C, 0x1 | |
| MUL B, C | |
| ADD PEEK, B | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L39bfs512_seek | |
| ADD SP, 0x2 | |
| ; bfs512_read(_file, temp_entry, sizeof(bfs512_DIRECTORY_ENTRY)); | |
| SET PUSH, 0xA | |
| SET PUSH, J | |
| ADD PEEK, 0xFDEF | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L29bfs512_read | |
| ADD SP, 0x3 | |
| ; if (child_count > (((512 - sizeof(bfs512_DIRECTORY_HEADER)) / sizeof(bfs512_DIRECTORY_ENTRY)) | |
| SET B, [0xFDEE+J] | |
| IFG B, 0x33 | |
| SET PC, L299THEN | |
| SET PC, L300END | |
| :L299THEN | |
| ; Entering blocknode emit | |
| ; bfs512_flush(_file); | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L41bfs512_flush | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| :L300END | |
| ; bfs512_open_write(_file, file_system, drive, sector); | |
| SET PUSH, [0x4+J] | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L33bfs512_open_write | |
| ADD SP, 0x4 | |
| ; bfs512_seek(_file, sizeof(bfs512_DIRECTORY_HEADER) + (sizeof(bfs512_DIRECTORY_ENTRY) * entry_index)); | |
| SET PUSH, 0x2 | |
| SET B, 0xA | |
| MUL B, [0x5+J] | |
| ADD PEEK, B | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L39bfs512_seek | |
| ADD SP, 0x2 | |
| ; bfs512_write(_file, temp_entry, sizeof(bfs512_DIRECTORY_ENTRY)); | |
| SET PUSH, 0xA | |
| SET PUSH, J | |
| ADD PEEK, 0xFDEF | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L37bfs512_write | |
| ADD SP, 0x3 | |
| ; bfs512_flush(_file); | |
| SET PUSH, J | |
| ADD PEEK, 0xFDF9 | |
| JSR L41bfs512_flush | |
| ADD SP, 0x1 | |
| ; local original_size = (sizeof(bfs512_DIRECTORY_HEADER) + (sizeof(bfs512_DIRECTORY_ENTRY) * child_count)) | |
| ; / 512; | |
| SET PUSH, 0x2 | |
| SET B, 0xA | |
| MUL B, [0xFDEE+J] | |
| ADD PEEK, B | |
| DIV PEEK, 0x200 | |
| ; local new_size = (sizeof(bfs512_DIRECTORY_HEADER) + (sizeof(bfs512_DIRECTORY_ENTRY) * (child_count - 1))) | |
| ; / 512; | |
| SET PUSH, 0x2 | |
| SET B, 0xA | |
| SET C, [0xFDEE+J] | |
| SUB C, 0x1 | |
| MUL B, C | |
| ADD PEEK, B | |
| DIV PEEK, 0x200 | |
| ; if (new_size < original_size) | |
| SET C, [0xFDEC+J] | |
| IFL C, [0xFDED+J] | |
| SET PC, L306THEN | |
| SET PC, L307END | |
| :L306THEN | |
| ; Entering blocknode emit | |
| ; local previous_sector = sector; | |
| SET PUSH, [0x4+J] | |
| ; local current_sector = sector; | |
| SET PUSH, [0x4+J] | |
| ; while (current_sector != 0xFFFF) | |
| :L301BEGIN_WHILE | |
| SET B, [0xFDEA+J] | |
| IFN B, 0xFFFF | |
| SET PC, L302YES | |
| SET PC, L303END_WHILE | |
| :L302YES | |
| ; Entering blocknode emit | |
| ; local next_sector = file_system.link_table[current_sector]; | |
| SET PUSH, [0xFDEA+J] | |
| SET B, [0x2+J] | |
| ADD B, 0x60 | |
| ADD PEEK, B | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| ; if (next_sector == 0xFFFF) | |
| SET B, [0xFDE9+J] | |
| IFE B, 0xFFFF | |
| SET PC, L304THEN | |
| SET PC, L305END | |
| :L304THEN | |
| ; Entering blocknode emit | |
| ; file_system.link_table[previous_sector] = 0xFFFF; | |
| SET B, [0xFDEB+J] | |
| SET C, [0x2+J] | |
| ADD C, 0x60 | |
| ADD B, C | |
| SET [B], 0xFFFF | |
| ; Leaving blocknode emit | |
| :L305END | |
| ; previous_sector = current_sector; | |
| SET [0xFDEB+J], [0xFDEA+J] | |
| ; current_sector = next_sector; | |
| SET [0xFDEA+J], [0xFDE9+J] | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L301BEGIN_WHILE | |
| :L303END_WHILE | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| :L307END | |
| ; Leaving blocknode emit | |
| :L76bfs512_remove_from_directory_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION detect_hardware L77detect_hardware 1 | |
| ; function detect_hardware( id:num32 | |
| :L77detect_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, 0x0 | |
| ; B = &num_hardware | |
| SET B, J | |
| ADD B, 0xFFFC | |
| HWN [B] | |
| ; local n = 0; | |
| SET PUSH, 0x0 | |
| ; while ( n < num_hardware | |
| :L308BEGIN_WHILE | |
| SET C, [0xFFFB+J] | |
| IFL C, [0xFFFC+J] | |
| SET PC, L309YES | |
| SET PC, L310END_WHILE | |
| :L309YES | |
| ; Entering blocknode emit | |
| ; local hardware_id[2]; | |
| SUB SP, 0x2 | |
| ; A = n; | |
| SET A, [0xFFFB+J] | |
| ; I = hardware_id | |
| SET I, J | |
| ADD I, 0xFFF9 | |
| HWQ A | |
| SET [0x1+I], A | |
| SET [I], B | |
| ; if ( compare32(hardware_id, id) != 0 | |
| SET PUSH, [0x2+J] | |
| SET PUSH, J | |
| ADD PEEK, 0xFFF9 | |
| JSR L1compare32 | |
| ADD SP, 0x2 | |
| IFN A, 0x0 | |
| SET PC, L311THEN | |
| SET PC, L312END | |
| :L311THEN | |
| ; Entering blocknode emit | |
| ; return n; | |
| SET B, [0xFFFB+J] | |
| SET A, B | |
| SET PC, L78detect_hardware_footer | |
| ; Leaving blocknode emit | |
| :L312END | |
| ; n += 1; | |
| ADD [0xFFFB+J], 0x1 | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| SET PC, L308BEGIN_WHILE | |
| :L310END_WHILE | |
| ; return -1; | |
| SET B, 0xFFFF | |
| SET A, B | |
| SET PC, L78detect_hardware_footer | |
| ; Leaving blocknode emit | |
| :L78detect_hardware_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET I, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION detect_lem L80detect_lem 0 | |
| ; function detect_lem() | |
| :L80detect_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, L79_STATIC_LEM_HARDWARE_ID | |
| JSR L77detect_hardware | |
| ADD SP, 0x1 | |
| SET B, A | |
| SET A, B | |
| SET PC, L81detect_lem_footer | |
| ; Leaving blocknode emit | |
| :L81detect_lem_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION initialize_lem L82initialize_lem 2 | |
| ; function initialize_lem(id, vram) | |
| :L82initialize_lem | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| SET PUSH, C | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; A = 0; | |
| SET A, 0x0 | |
| ; B = vram; | |
| SET B, [0x3+J] | |
| ; C = id) | |
| SET C, [0x2+J] | |
| HWI C | |
| ; Leaving blocknode emit | |
| :L83initialize_lem_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION console_initialize L84console_initialize 2 | |
| ; function console_initialize( | |
| ; console:Console /* A pointer to sizeof(Console) words of memory */, | |
| ; vram /* A pointer to 384 words of memory */) | |
| :L84console_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 C, [0x2+J] | |
| SET [C], [0x3+J] | |
| ; console.cursor_position = 0; | |
| SET B, [0x2+J] | |
| SET [0x1+B], 0x0 | |
| ; console.color = 0xF000; | |
| SET B, [0x2+J] | |
| SET [0x2+B], 0xF000 | |
| ; console.backspace_point = 0; | |
| SET B, [0x2+J] | |
| SET [0x3+B], 0x0 | |
| ; Leaving blocknode emit | |
| :L85console_initialize_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION console_setcursor L86console_setcursor 2 | |
| ; function console_setcursor(console:Console, cursor_position) | |
| :L86console_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 C, [0x2+J] | |
| SET [0x1+C], [0x3+J] | |
| ; Leaving blocknode emit | |
| :L87console_setcursor_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION console_scroll L88console_scroll 2 | |
| ; function console_scroll(console:Console, lines) | |
| :L88console_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, [0x3+J] | |
| MUL PEEK, 0x20 | |
| ; if (chars > CONSOLE_SIZE) | |
| SET B, [0xFFFC+J] | |
| IFG B, 0x180 | |
| ; Entering blocknode emit | |
| ; chars = CONSOLE_SIZE; | |
| SET [0xFFFC+J], 0x180 | |
| ; Leaving blocknode emit | |
| ; local place = 0; | |
| SET PUSH, 0x0 | |
| ; local copy_maximum = CONSOLE_SIZE - chars; | |
| SET PUSH, 0x180 | |
| SUB PEEK, [0xFFFC+J] | |
| ; while (place < copy_maximum) | |
| :L313BEGIN_WHILE | |
| SET C, [0xFFFB+J] | |
| IFL C, [0xFFFA+J] | |
| SET PC, L314YES | |
| SET PC, L315END_WHILE | |
| :L314YES | |
| ; Entering blocknode emit | |
| ; console.buffer[place] = console.buffer[place + chars]; | |
| SET B, [0xFFFB+J] | |
| ADD B, [0xFFFC+J] | |
| SET A, [0x2+J] | |
| SET C, [A] | |
| ADD B, C | |
| SET B, [B] | |
| SET C, [0xFFFB+J] | |
| SET A, [0x2+J] | |
| SET X, [A] | |
| ADD C, X | |
| SET [C], B | |
| ; place += 1; | |
| ADD [0xFFFB+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L313BEGIN_WHILE | |
| :L315END_WHILE | |
| ; while (place < CONSOLE_SIZE) | |
| :L316BEGIN_WHILE | |
| SET B, [0xFFFB+J] | |
| IFL B, 0x180 | |
| SET PC, L317YES | |
| SET PC, L318END_WHILE | |
| :L317YES | |
| ; Entering blocknode emit | |
| ; console.buffer[place] = console.color; | |
| SET A, [0x2+J] | |
| SET B, [0x2+A] | |
| SET C, [0xFFFB+J] | |
| SET A, [0x2+J] | |
| SET X, [A] | |
| ADD C, X | |
| SET [C], B | |
| ; place += 1; | |
| ADD [0xFFFB+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L316BEGIN_WHILE | |
| :L318END_WHILE | |
| ; console.cursor_position -= chars; | |
| SET C, [0x2+J] | |
| SUB [0x1+C], [0xFFFC+J] | |
| ; Leaving blocknode emit | |
| :L89console_scroll_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION console_charout L90console_charout 2 | |
| ; function console_charout(console:Console, char) | |
| :L90console_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 A, [0x2+J] | |
| SET B, [0x2+A] | |
| BOR B, [0x3+J] | |
| SET A, [0x2+J] | |
| SET C, [0x1+A] | |
| SET A, [0x2+J] | |
| SET X, [A] | |
| ADD C, X | |
| SET [C], B | |
| ; console.cursor_position += 1; | |
| SET B, [0x2+J] | |
| ADD [0x1+B], 0x1 | |
| ; if (console.cursor_position > (CONSOLE_SIZE - 1) | |
| SET A, [0x2+J] | |
| SET B, [0x1+A] | |
| IFG B, 0x17F | |
| SET PC, L319THEN | |
| SET PC, L320END | |
| :L319THEN | |
| ; Entering blocknode emit | |
| ; console_scroll(console, 1); | |
| SET PUSH, 0x1 | |
| SET PUSH, [0x2+J] | |
| JSR L88console_scroll | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| :L320END | |
| ; Leaving blocknode emit | |
| :L91console_charout_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION console_stringout L92console_stringout 2 | |
| ; function console_stringout(console:Console, string /* A pointer to string data. */) | |
| :L92console_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, [0x3+J] | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| AND PEEK, 0xFF | |
| ; if ((console.cursor_position + strlen) > (CONSOLE_SIZE - 1) | |
| SET A, [0x2+J] | |
| SET B, [0x1+A] | |
| ADD B, [0xFFFC+J] | |
| IFG B, 0x17F | |
| SET PC, L321THEN | |
| SET PC, L322END | |
| :L321THEN | |
| ; Entering blocknode emit | |
| ; console_scroll(console, strlen / CONSOLE_WIDTH); | |
| SET PUSH, [0xFFFC+J] | |
| DIV PEEK, 0x20 | |
| SET PUSH, [0x2+J] | |
| JSR L88console_scroll | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| :L322END | |
| ; local place = 0; | |
| SET PUSH, 0x0 | |
| ; while (place < strlen) | |
| :L323BEGIN_WHILE | |
| SET C, [0xFFFB+J] | |
| IFL C, [0xFFFC+J] | |
| SET PC, L324YES | |
| SET PC, L325END_WHILE | |
| :L324YES | |
| ; Entering blocknode emit | |
| ; console.buffer[console.cursor_position] = console.color | string[place + 1]; | |
| SET A, [0x2+J] | |
| SET B, [0x2+A] | |
| SET C, [0xFFFB+J] | |
| ADD C, 0x1 | |
| ADD C, [0x3+J] | |
| SET C, [C] | |
| BOR B, C | |
| SET A, [0x2+J] | |
| SET C, [0x1+A] | |
| SET A, [0x2+J] | |
| SET X, [A] | |
| ADD C, X | |
| SET [C], B | |
| ; console.cursor_position += 1; | |
| SET B, [0x2+J] | |
| ADD [0x1+B], 0x1 | |
| ; place += 1; | |
| ADD [0xFFFB+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L323BEGIN_WHILE | |
| :L325END_WHILE | |
| ; Leaving blocknode emit | |
| :L93console_stringout_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION console_backspace L94console_backspace 1 | |
| ; function console_backspace(console:Console) | |
| :L94console_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 A, [0x2+J] | |
| SET B, [0x3+A] | |
| SET A, [0x2+J] | |
| SET C, [0x1+A] | |
| IFE C, B | |
| SET PC, L326THEN | |
| SET PC, L327END | |
| :L326THEN | |
| ; Entering blocknode emit | |
| ; return 0; | |
| SET B, 0x0 | |
| SET A, B | |
| SET PC, L95console_backspace_footer | |
| ; Leaving blocknode emit | |
| :L327END | |
| ; console.cursor_position -= 1; | |
| SET B, [0x2+J] | |
| SUB [0x1+B], 0x1 | |
| ; console.buffer[console.cursor_position] = console.color; | |
| SET A, [0x2+J] | |
| SET B, [0x2+A] | |
| SET A, [0x2+J] | |
| SET C, [0x1+A] | |
| SET A, [0x2+J] | |
| SET X, [A] | |
| ADD C, X | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| :L95console_backspace_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION __itoa L96__itoa 2 | |
| ; function __itoa(number, buffer) | |
| :L96__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, [0x2+J] | |
| IFG B, 0x9 | |
| SET PC, L328THEN | |
| SET PC, L329END | |
| :L328THEN | |
| ; Entering blocknode emit | |
| ; __itoa(number / 10, buffer); | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| DIV PEEK, 0xA | |
| JSR L96__itoa | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| :L329END | |
| ; buffer[0] += 1; | |
| SET B, 0x0 | |
| ADD B, [0x3+J] | |
| ADD [B], 0x1 | |
| ; buffer[buffer[0]] = '0' + (number % 10) | |
| SET B, 0x30 | |
| SET C, [0x2+J] | |
| MOD C, 0xA | |
| ADD B, C | |
| SET C, 0x0 | |
| ADD C, [0x3+J] | |
| SET C, [C] | |
| ADD C, [0x3+J] | |
| SET [C], B | |
| ; Leaving blocknode emit | |
| :L97__itoa_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION itoa L98itoa 2 | |
| ; function itoa(number, buffer) | |
| :L98itoa | |
| ; Save frame pointer in J | |
| SET PUSH, J | |
| SET J, SP | |
| SET PUSH, B | |
| ; Entering blocknode emit | |
| ; bypassed | |
| ; buffer[0] = 0; | |
| SET B, 0x0 | |
| ADD B, [0x3+J] | |
| SET [B], 0x0 | |
| ; __itoa(number, buffer); | |
| SET PUSH, [0x3+J] | |
| SET PUSH, [0x2+J] | |
| JSR L96__itoa | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| :L99itoa_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION find_keyboard L101find_keyboard 0 | |
| ; function find_keyboard() | |
| :L101find_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, L100_STATIC_generic_keyboard_id | |
| JSR L77detect_hardware | |
| ADD SP, 0x1 | |
| SET B, A | |
| SET A, B | |
| SET PC, L102find_keyboard_footer | |
| ; Leaving blocknode emit | |
| :L102find_keyboard_footer | |
| SET SP, J | |
| SUB SP, 0x1 | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION kb_getkey L103kb_getkey 1 | |
| ; function kb_getkey(id) | |
| :L103kb_getkey | |
| ; 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 r; | |
| SUB SP, 0x1 | |
| ; B = id; | |
| SET B, [0x2+J] | |
| ; X = &r; | |
| SET X, J | |
| ADD X, 0xFFFC | |
| ; C = 0) | |
| SET C, 0x0 | |
| SET A, 0x1 | |
| HWI B | |
| SET [X], C | |
| ; return r; | |
| SET B, [0xFFFC+J] | |
| SET A, B | |
| SET PC, L104kb_getkey_footer | |
| ; Leaving blocknode emit | |
| :L104kb_getkey_footer | |
| SET SP, J | |
| SUB SP, 0x3 | |
| SET X, POP | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| ;DCPUB FUNCTION __printf L107__printf 1 | |
| ; function __printf(string /* Followed by some number of arguments */) | |
| :L107__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, 0x0 | |
| ; local strlen = *string; | |
| SET PUSH, [0x2+J] | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| ; local parameter_index = 3; | |
| SET PUSH, 0x3 | |
| ; local number_buffer[32]; | |
| SUB SP, 0x20 | |
| ; while (index < strlen) | |
| :L330BEGIN_WHILE | |
| SET C, [0xFFFD+J] | |
| IFL C, [0xFFFC+J] | |
| SET PC, L331YES | |
| SET PC, L332END_WHILE | |
| :L331YES | |
| ; Entering blocknode emit | |
| ; if (string[index + 1] == '%') | |
| SET B, [0xFFFD+J] | |
| ADD B, 0x1 | |
| ADD B, [0x2+J] | |
| SET B, [B] | |
| IFE B, 0x25 | |
| SET PC, L338THEN | |
| ; Entering blocknode emit | |
| ; if (string[index + 1] == '\n') | |
| SET A, [0xFFFD+J] | |
| ADD A, 0x1 | |
| ADD A, [0x2+J] | |
| SET A, [A] | |
| IFE A, 0xA | |
| SET PC, L336THEN | |
| ; Entering blocknode emit | |
| ; console_charout(console, string[index + 1]); | |
| SET PUSH, [0xFFFD+J] | |
| ADD PEEK, 0x1 | |
| ADD PEEK, [0x2+J] | |
| SET A, PEEK | |
| SET PEEK, [A] | |
| SET PUSH, L105_STATIC_console | |
| JSR L90console_charout | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| SET PC, L337END | |
| :L336THEN | |
| ; Entering blocknode emit | |
| ; while ((console.cursor_position % 32) != 0) | |
| :L333BEGIN_WHILE | |
| SET A, L105_STATIC_console | |
| SET A, [0x1+A] | |
| MOD A, 0x20 | |
| IFN A, 0x0 | |
| SET PC, L334YES | |
| SET PC, L335END_WHILE | |
| :L334YES | |
| ; Entering blocknode emit | |
| ; console_charout(console, ' '); | |
| SET PUSH, 0x20 | |
| SET PUSH, L105_STATIC_console | |
| JSR L90console_charout | |
| ADD SP, 0x2 | |
| ; Leaving blocknode emit | |
| SET PC, L333BEGIN_WHILE | |
| :L335END_WHILE | |
| ; Leaving blocknode emit | |
| :L337END | |
| ; Leaving blocknode emit | |
| SET PC, L339END | |
| :L338THEN | |
| ; Entering blocknode emit | |
| ; local parameter = 0; | |
| SET PUSH, 0x0 | |
| ; A = parameter_index; | |
| SET A, [0xFFFB+J] | |
| ; B = & parameter; | |
| SET B, J | |
| ADD B, 0xFFDA | |
| ; C = 0) | |
| SET C, 0x0 | |
| SET C, J | |
| ADD C, A | |
| SET [B], [C] | |
| ; parameter_index += 1; | |
| ADD [0xFFFB+J], 0x1 | |
| ; itoa(parameter, number_buffer); | |
| SET PUSH, J | |
| ADD PEEK, 0xFFDB | |
| SET PUSH, [0xFFDA+J] | |
| JSR L98itoa | |
| ADD SP, 0x2 | |
| ; console_stringout(console, number_buffer); | |
| SET PUSH, J | |
| ADD PEEK, 0xFFDB | |
| SET PUSH, L105_STATIC_console | |
| JSR L92console_stringout | |
| ADD SP, 0x2 | |
| ADD SP, 0x1 | |
| ; Leaving blocknode emit | |
| :L339END | |
| ; index += 1; | |
| ADD [0xFFFD+J], 0x1 | |
| ; Leaving blocknode emit | |
| SET PC, L330BEGIN_WHILE | |
| :L332END_WHILE | |
| ; Leaving blocknode emit | |
| :L108__printf_footer | |
| SET SP, J | |
| SUB SP, 0x2 | |
| SET C, POP | |
| SET B, POP | |
| SET J, POP | |
| SET PC, POP | |
| ;END FUNCTION | |
| :L109_STRING DAT 0x17 0x46 0x6F 0x75 0x6E 0x64 0x20 0x25 0x20 0x6D 0x33 0x35 0x66 0x64 0x20 0x64 0x65 0x76 0x69 0x63 0x65 0x73 0x2E 0xA | |
| :L110_STRING DAT 0x10 0x4E 0x6F 0x20 0x64 0x72 0x69 0x76 0x65 0x20 0x66 0x6F 0x75 0x6E 0x64 0x2E 0xA | |
| :L111_STRING DAT 0x18 0x44 0x65 0x74 0x65 0x63 0x74 0x65 0x64 0x20 0x64 0x69 0x73 0x63 0x20 0x77 0x69 0x74 0x68 0x20 0x69 0x64 0x20 0x25 0xA | |
| :L112_STRING DAT 0x11 0x52 0x61 0x77 0x20 0x77 0x72 0x69 0x74 0x65 0x20 0x66 0x61 0x69 0x6C 0x65 0x64 0x2E | |
| :L113_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L114_STRING DAT 0x19 0x45 0x72 0x72 0x6F 0x72 0x20 0x61 0x6C 0x6C 0x6F 0x63 0x61 0x74 0x69 0x6E 0x67 0x20 0x6D 0x65 0x6D 0x6F 0x72 0x79 0x2E 0xA | |
| :L115_STRING DAT 0xB 0x25 0x2C 0x20 0x25 0x2C 0x20 0x25 0x2C 0x20 0x25 0xA | |
| :L116_STRING DAT 0x15 0x4D 0x65 0x6D 0x6F 0x72 0x79 0x20 0x75 0x73 0x65 0x64 0x3A 0x20 0x25 0x20 0x77 0x6F 0x72 0x64 0x73 0xA | |
| :L117_STRING DAT 0x10 0x46 0x61 0x69 0x6C 0x20 0x63 0x72 0x65 0x61 0x74 0x65 0x20 0x72 0x6F 0x6F 0x74 | |
| :L118_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L119_STRING DAT 0x10 0x46 0x61 0x69 0x6C 0x20 0x73 0x61 0x76 0x65 0x20 0x68 0x65 0x61 0x64 0x65 0x72 | |
| :L120_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L121_STRING DAT 0x10 0x46 0x61 0x69 0x6C 0x20 0x63 0x72 0x65 0x61 0x74 0x65 0x20 0x66 0x69 0x6C 0x65 | |
| :L122_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L123_STRING DAT 0xC 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x21 | |
| :L124_STRING DAT 0xF 0x46 0x61 0x69 0x6C 0x20 0x77 0x72 0x69 0x74 0x65 0x20 0x66 0x69 0x6C 0x65 | |
| :L125_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L126_STRING DAT 0xF 0x46 0x61 0x69 0x6C 0x20 0x66 0x6C 0x75 0x73 0x68 0x20 0x66 0x69 0x6C 0x65 | |
| :L127_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L128_STRING DAT 0x10 0x68 0x65 0x6C 0x6C 0x6F 0x77 0x6F 0x72 0x6C 0x64 0x21 0x30 0x30 0x30 0x30 0x30 | |
| :L129_STRING DAT 0xF 0x46 0x61 0x69 0x6C 0x20 0x61 0x64 0x64 0x20 0x74 0x6F 0x20 0x64 0x69 0x72 | |
| :L130_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L131_STRING DAT 0xD 0x46 0x61 0x69 0x6C 0x20 0x6F 0x70 0x65 0x6E 0x20 0x64 0x69 0x72 | |
| :L132_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L133_STRING DAT 0x11 0x52 0x6F 0x6F 0x74 0x20 0x43 0x68 0x69 0x6C 0x64 0x72 0x65 0x6E 0x3A 0x20 0x25 0xA | |
| :L134_STRING DAT 0xF 0x46 0x61 0x69 0x6C 0x20 0x72 0x65 0x61 0x64 0x20 0x65 0x6E 0x74 0x72 0x79 | |
| :L135_STRING DAT 0x7 0x3A 0x20 0x45 0x43 0x20 0x25 0xA | |
| :L136_STRING DAT 0x1 0xA | |
| :L137_STRING DAT 0x10 0x46 0x69 0x6E 0x69 0x73 0x68 0x65 0x64 0x20 0x74 0x65 0x73 0x74 0x73 0x2E 0xA | |
| :L3_STATIC_M35FD_HARDWARE_ID DAT 0x4FD5 0x24C5 | |
| :L4_STATIC_M35FD_MANUFACTURER_ID DAT 0x1EB3 0x7E91 | |
| :L79_STATIC_LEM_HARDWARE_ID DAT 0x7349 0xF615 | |
| :L100_STATIC_generic_keyboard_id DAT 0x30CF 0x7406 | |
| :L105_STATIC_console DAT 0x0 0x0 0x0 0x0 | |
| :L106_STATIC_printf DAT L107__printf | |
| :ENDOFPROGRAM |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment