From 02fc2869ff89d24f69d7d11c9d6aaf9acc31edbf Mon Sep 17 00:00:00 2001 From: Eric Carr Date: Tue, 30 Dec 2025 18:29:20 -0600 Subject: [PATCH] [msdos] add appkey support --- Changelog.md | 2 ++ msdos/src/fn_fuji/fuji_read_appkey.c | 38 +++++++++++++++++++++++++-- msdos/src/fn_fuji/fuji_write_appkey.c | 28 ++++++++++++++++++-- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/Changelog.md b/Changelog.md index f0af3b7..601f7b3 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,8 @@ ## [Unreleased] +- [msdos] Add appkey support [Eric Carr] + ## [4.9.0] 2025-11-23 - [coco] Implemented fuji_copy_file (Rich Stephens) diff --git a/msdos/src/fn_fuji/fuji_read_appkey.c b/msdos/src/fn_fuji/fuji_read_appkey.c index e388eee..2f7fc83 100644 --- a/msdos/src/fn_fuji/fuji_read_appkey.c +++ b/msdos/src/fn_fuji/fuji_read_appkey.c @@ -3,8 +3,42 @@ #include "fujinet-fuji.h" #include "fujinet-fuji-msdos.h" +typedef struct _appkey +{ + unsigned short creator_id; + unsigned char app_id; + unsigned char key_id; + unsigned char open_mode; + unsigned char reserved; +} Appkey; + +extern uint16_t ak_creator_id; +extern uint8_t ak_app_id; +extern uint8_t ak_appkey_size; +Appkey appkey; + bool fuji_read_appkey(uint8_t key_id, uint16_t *count, uint8_t *data) { - // FIXME Implement. - return true; + short result; + + // Setup full appkey identifier + appkey.creator_id = ak_creator_id; + appkey.app_id = ak_app_id; + appkey.key_id = key_id; + appkey.open_mode = 0; // read + appkey.reserved = 0; + + // Open app key + int_f5_write(0x70,FUJICMD_OPEN_APPKEY,0,0,&appkey,sizeof(appkey)); + + // Read app key data + if (int_f5_read(0x70,FUJICMD_READ_APPKEY,0,0,data,66)) { + *count = *(uint16_t*)data; + memcpy(data,data+2, 64); + return true; + } else { + count=0; + } + return false; + } diff --git a/msdos/src/fn_fuji/fuji_write_appkey.c b/msdos/src/fn_fuji/fuji_write_appkey.c index 3aee32a..b4f597f 100644 --- a/msdos/src/fn_fuji/fuji_write_appkey.c +++ b/msdos/src/fn_fuji/fuji_write_appkey.c @@ -3,8 +3,32 @@ #include "fujinet-fuji.h" #include "fujinet-fuji-msdos.h" +typedef struct _appkey +{ + unsigned short creator_id; + unsigned char app_id; + unsigned char key_id; + unsigned char open_mode; + unsigned char reserved; +} Appkey; + +extern uint16_t ak_creator_id; +extern uint8_t ak_app_id; +extern uint8_t ak_appkey_size; +extern Appkey appkey; + bool fuji_write_appkey(uint8_t key_id, uint16_t count, uint8_t *data) { - // not implemented. - return true; + // Setup full appkey identifier + appkey.creator_id = ak_creator_id; + appkey.app_id = ak_app_id; + appkey.key_id = key_id; + appkey.open_mode = 1; // write + appkey.reserved = 0; + + // Open app key + int_f5_write(0x70,FUJICMD_OPEN_APPKEY,0,0,&appkey,sizeof(appkey)); + + // Write data to app key + return int_f5_write(0x70,FUJICMD_WRITE_APPKEY,64,0,data,64) > 0; }