From 73bf9275bc4451642e698260248e82b93fc0b535 Mon Sep 17 00:00:00 2001 From: Ry Date: Thu, 13 Jul 2023 00:11:02 -0700 Subject: [PATCH] Fetcher: View and launch FXF binaries --- applications/fetcher/Browser.okm | 203 +++++++++++++++++++++++++++---- applications/fetcher/Desktop.okm | 4 +- applications/fetcher/OS.okm | 3 +- applications/fetcher/start.asm | 33 +++++ 4 files changed, 218 insertions(+), 25 deletions(-) diff --git a/applications/fetcher/Browser.okm b/applications/fetcher/Browser.okm index 8d9bb2f..056322e 100644 --- a/applications/fetcher/Browser.okm +++ b/applications/fetcher/Browser.okm @@ -3,17 +3,41 @@ MODULE Browser; VAR browserRunning: CHAR; browserWindow: ARRAY 36 OF CHAR; - browserIcons: ARRAY 31 OF Fox32OSButtonWidget; + browserIcons: ARRAY 12 OF Fox32OSButtonWidget; + browserPage: INT; + browserNumberOfPages: INT; + browserNextPageButton: Fox32OSButtonWidget; + browserPrevPageButton: Fox32OSButtonWidget; + browserDiskId: INT; + browserFileList: ARRAY 341 OF CHAR; + + EXTERN browserFileListFriendly: ARRAY 12 OF POINTER TO CHAR; PROCEDURE BrowserMain(diskId, iconX, iconY: INT; desktopWin: PTR;); - VAR i, x, y, w, h: INT; BEGIN - browserRunning := 1; + (* first, before we do anything, check to make sure the selected disk is available *) + IF diskId >| 4 THEN + new_messagebox(0, "Invalid disk ID!", 0, 128, 128, 144); + end_current_task(); + ELSIF diskId = 4 THEN + IF IsRomDiskAvailable() = 0 THEN + new_messagebox(0, "ROM disk not available!", 0, 128, 128, 200); + end_current_task(); + END; + ELSE + IF PortIn(080001000H OR diskId) = 0 THEN + new_messagebox(0, "Disk not inserted!", 0, 128, 128, 160); + end_current_task(); + END; + END; - (* create the window and fill it with white *) + browserRunning := 1; + browserPage := 0; + browserDiskId := diskId; + + (* create the window and draw its initial contents *) new_window(PTROF(browserWindow), "Fetcher", 384, 192, 64, 64, 0, PTROF(browserIcons)); - fill_window(0FFFFFFFFH, PTROF(browserWindow)); - (*draw_widgets_to_window(PTROF(browserWindow));*) + DrawBrowserWindow(); WHILE browserRunning DO GetNextWindowEvent(PTROF(browserWindow)); @@ -23,21 +47,7 @@ MODULE Browser; IF (eventArgs[1] <| 8) & (eventArgs[2] <| 16) THEN destroy_window(PTROF(browserWindow)); browserRunning := 0; - IF desktopWin # 0 THEN - (* draw the retracting box animation *) - i := 0; - WHILE i < 16 DO - x := RSH(GETSHORT(PTROF(browserWindow) + 20) *| (16 - i) + iconX *| i, 4); - y := RSH(GETSHORT(PTROF(browserWindow) + 22) *| (16 - i) + iconY *| i, 4); - w := RSH(384 *| (16 - i) + 32 *| i,4); - h := RSH(192 *| (16 - i) + 32 *| i,4); - DrawWireframeBox(get_window_overlay_number(desktopWin), x, y, w, h, 020F0F0F0H); - Eep(5); - draw_filled_rectangle_to_overlay(x, y, w, h, 0, get_window_overlay_number(desktopWin)); - i := i + 1; - END; - DrawDesktopIcons(desktopWin); - END; + QuitAnimation(iconX, iconY, desktopWin); ELSIF eventArgs[2] <| 16 THEN start_dragging_window(PTROF(browserWindow)); END; @@ -54,6 +64,155 @@ MODULE Browser; PROCEDURE HandleIconClick(buttonId: INT;); BEGIN - (* TODO *) + IF buttonId = 128 THEN + (* next page button *) + IncrementBrowserPage(); + ELSIF buttonId = 129 THEN + (* previous page button *) + DecrementBrowserPage(); + ELSE + LaunchFromIcon(buttonId); + END; + END; + + PROCEDURE DrawBrowserWindow(); + BEGIN + fill_window(0FFFFFFFFH, PTROF(browserWindow)); + SetupBrowserIconStructs(); + draw_widgets_to_window(PTROF(browserWindow)); + END; + + PROCEDURE SetupBrowserIconStructs(); + VAR i, x, y, numberOfFiles: INT; + icon: POINTER TO Fox32OSButtonWidget; + BEGIN + (* get a list of files *) + numberOfFiles := ryfs_get_file_list(PTROF(browserFileList), browserDiskId); + browserNumberOfPages := numberOfFiles / 12; + ConvertFileNames(numberOfFiles); + + i := 0; + WHILE i <| 12 DO + x := ((i MOD 4) * 96) + 32; + y := ((i / 4) * 64) + 24; + icon := PTROF(browserIcons[i]); + + icon^.type := WIDGET_TYPE_BUTTON; + IF i = 11 THEN icon^.next := PTROF(browserNextPageButton); + ELSE icon^.next := PTROF(browserIcons[i + 1]); END; + icon^.id := i; + icon^.text := browserFileListFriendly[i]; + icon^.fgColor := 0FF000000H; + icon^.bgColor := 0FFDDDDDDH; + icon^.width := 32; + icon^.height := 32 + 16; + icon^.x := x; + icon^.y := y; + + i := i + 1; + END; + + browserNextPageButton.type := WIDGET_TYPE_BUTTON; + browserNextPageButton.next := PTROF(browserPrevPageButton); + browserNextPageButton.id := 128; + browserNextPageButton.text := ">"; + browserNextPageButton.fgColor := 0FF000000H; + browserNextPageButton.bgColor := 0FFDDDDDDH; + browserNextPageButton.width := 16; + browserNextPageButton.height := 16; + browserNextPageButton.x := 368; + browserNextPageButton.y := 16; + + browserPrevPageButton.type := WIDGET_TYPE_BUTTON; + browserPrevPageButton.next := 0; + browserPrevPageButton.id := 129; + browserPrevPageButton.text := "<"; + browserPrevPageButton.fgColor := 0FF000000H; + browserPrevPageButton.bgColor := 0FFDDDDDDH; + browserPrevPageButton.width := 16; + browserPrevPageButton.height := 16; + browserPrevPageButton.x := 0; + browserPrevPageButton.y := 16; + END; + + PROCEDURE IncrementBrowserPage(); + BEGIN + IF browserPage <| browserNumberOfPages THEN + browserPage := browserPage + 1; + END; + DrawBrowserWindow(); + END; + + PROCEDURE DecrementBrowserPage(); + BEGIN + IF browserPage >| 0 THEN + browserPage := browserPage - 1; + END; + DrawBrowserWindow(); + END; + + PROCEDURE LaunchFromIcon(buttonId: INT;); + VAR icon: POINTER TO Fox32OSButtonWidget; + BEGIN + icon := PTROF(browserIcons[buttonId]); + launch_fxf_from_disk(icon^.text, browserDiskId, 0, 0, 0, 0, 0); + END; + + PROCEDURE ConvertFileNames(numberOfFiles: INT;); + VAR i, j, numberOfFilesLeft: INT; + BEGIN + (* fill all filenames with "", 0, 0, 0, 0, 0 *) + i := 12; + WHILE i DO + copy_memory_bytes("\0\0\0\0\0", browserFileListFriendly[i - 1], 12); + i := i - 1; + END; + + i := 0; + numberOfFilesLeft := numberOfFiles - (browserPage * 12); + IF numberOfFilesLeft >| 12 THEN + numberOfFilesLeft := 12; + END; + WHILE i <| numberOfFilesLeft DO + (* copy the first 8 characters (the actual name of the file) *) + copy_memory_bytes(PTROF(browserFileList) + (browserPage * 11 * 12) + (i * 11), browserFileListFriendly[i], 8); + + (* find the first space in the name *) + j := 7; + WHILE j DO + IF GETCHAR(PTROF(browserFileList) + (i * 11) + j) # 32 THEN + BREAK(); + END; + j := j - 1; + END; + j := j + 1; + + (* j now equals the index of where the file name ends and the extension begins *) + PUTCHAR(browserFileListFriendly[i] + j, 46); + copy_memory_bytes(PTROF(browserFileList) + (i * 11) + 8, browserFileListFriendly[i] + j + 1, 3); + PUTCHAR(browserFileListFriendly[i] + j + 4, 0); + + i := i + 1; + END; + END; + + PROCEDURE QuitAnimation(iconX, iconY: INT; desktopWin: PTR;); + VAR i, x, y, w, h: INT; + BEGIN + IF desktopWin # 0 THEN + (* draw the retracting box animation *) + i := 0; + WHILE i < 16 DO + x := RSH(GETSHORT(PTROF(browserWindow) + 20) *| (16 - i) + iconX *| i, 4); + y := RSH(GETSHORT(PTROF(browserWindow) + 22) *| (16 - i) + iconY *| i, 4); + w := RSH(384 *| (16 - i) + 32 *| i, 4); + h := RSH(192 *| (16 - i) + 32 *| i, 4); + DrawWireframeBox(get_window_overlay_number(desktopWin), x, y, w, h, 020F0F0F0H); + Eep(10); + draw_filled_rectangle_to_overlay(x, y, w, h, 0, get_window_overlay_number(desktopWin)); + i := i + 1; + END; + DrawDesktopIcons(desktopWin); + END; END; END. diff --git a/applications/fetcher/Desktop.okm b/applications/fetcher/Desktop.okm index 69aa574..d651dec 100644 --- a/applications/fetcher/Desktop.okm +++ b/applications/fetcher/Desktop.okm @@ -43,13 +43,13 @@ MODULE Desktop; (* draw the expanding box animation *) i := 0; icon := PTROF(desktopIcons[buttonId]); - WHILE i < 16 DO + WHILE i <| 16 DO x := RSH(icon^.x *| (16 - i) + 64 *| i, 4); y := RSH(icon^.y *| (16 - i) + 64 *| i, 4); w := RSH(32 *| (16 - i) + 384 *| i, 4); h := RSH(32 *| (16 - i) + 192 *| i, 4); DrawWireframeBox(get_window_overlay_number(PTROF(desktopWindow)), x, y, w, h, 020F0F0F0H); - Eep(5); + Eep(10); draw_filled_rectangle_to_overlay(x, y, w, h, 0, get_window_overlay_number(PTROF(desktopWindow))); i := i + 1; END; diff --git a/applications/fetcher/OS.okm b/applications/fetcher/OS.okm index 53f231d..738b8be 100644 --- a/applications/fetcher/OS.okm +++ b/applications/fetcher/OS.okm @@ -3,7 +3,8 @@ MODULE OS; draw_widgets_to_window, draw_filled_rectangle_to_overlay, GetNextWindowEvent, DrawPixel, save_state_and_yield_task, start_dragging_window, handle_widget_click, fill_window, fill_overlay, set_window_flags, menu_update_event, menu_bar_click_event, close_menu, new_messagebox, - launch_fxf_from_disk, get_boot_disk_id, string_to_int, set_tilemap, draw_tile_to_overlay: INT; + launch_fxf_from_disk, get_boot_disk_id, string_to_int, set_tilemap, draw_tile_to_overlay, + ryfs_get_file_list, copy_memory_bytes, IsRomDiskAvailable, end_current_task: INT; EXTERN PROCEDURE brk: INT; diff --git a/applications/fetcher/start.asm b/applications/fetcher/start.asm index 6276008..266dd2c 100644 --- a/applications/fetcher/start.asm +++ b/applications/fetcher/start.asm @@ -29,6 +29,12 @@ GetNextWindowEvent: pop r8 ret +IsRomDiskAvailable: + call is_romdisk_available + ifz mov r0, 1 + ifnz mov r0, 0 + ret + brk: brk ret @@ -44,6 +50,33 @@ arg1Ptr: data.32 0 arg2Ptr: data.32 0 arg3Ptr: data.32 0 +browserFileListFriendly: + data.32 browserFile0 + data.32 browserFile1 + data.32 browserFile2 + data.32 browserFile3 + data.32 browserFile4 + data.32 browserFile5 + data.32 browserFile6 + data.32 browserFile7 + data.32 browserFile8 + data.32 browserFile9 + data.32 browserFile10 + data.32 browserFile11 + +browserFile0: data.fill 0, 13 +browserFile1: data.fill 0, 13 +browserFile2: data.fill 0, 13 +browserFile3: data.fill 0, 13 +browserFile4: data.fill 0, 13 +browserFile5: data.fill 0, 13 +browserFile6: data.fill 0, 13 +browserFile7: data.fill 0, 13 +browserFile8: data.fill 0, 13 +browserFile9: data.fill 0, 13 +browserFile10: data.fill 0, 13 +browserFile11: data.fill 0, 13 + diskIcon: #include "icons/disk.inc"