Skip to content

Instantly share code, notes, and snippets.

@Blecki
Last active December 14, 2015 11:29
Show Gist options
  • Select an option

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

Select an option

Save Blecki/5079218 to your computer and use it in GitHub Desktop.
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