diff --git a/adam/src/fn_fuji/fuji_get_host_prefix.c b/adam/src/fn_fuji/fuji_get_host_prefix.c index 671e701..4301dc5 100644 --- a/adam/src/fn_fuji/fuji_get_host_prefix.c +++ b/adam/src/fn_fuji/fuji_get_host_prefix.c @@ -1,8 +1,30 @@ #include #include #include "fujinet-fuji.h" +#include +#include + +extern unsigned char response[1024]; bool fuji_get_host_prefix(uint8_t hs, char *prefix) { - return true; + struct _ghp + { + unsigned char cmd; + unsigned char hs; + } ghp; + + memset(response,0,sizeof(response)); + ghp.cmd = 0xE0; + ghp.hs = hs; + + if (eos_write_character_device(0x0f,ghp,sizeof(ghp)) != 0x80) + return false; + + if (eos_read_character_device(0x0f,response,sizeof(response)) != 0x80) + return false; + + strcpy(prefix,response); + + return true; } diff --git a/adam/src/fn_fuji/fuji_set_host_prefix.c b/adam/src/fn_fuji/fuji_set_host_prefix.c index c9edf98..9a0adad 100644 --- a/adam/src/fn_fuji/fuji_set_host_prefix.c +++ b/adam/src/fn_fuji/fuji_set_host_prefix.c @@ -1,8 +1,23 @@ #include #include #include "fujinet-fuji.h" +#include +#include bool fuji_set_host_prefix(uint8_t hs, char *prefix) { - return true; + struct _shp + { + unsigned char cmd; + unsigned char hs; + unsigned char prefix[256]; + } shp; + + shp.cmd = FUJICMD_SET_HOST_PREFIX; + shp.hs = hs; + strcpy(shp.prefix,prefix); + + eos_write_character_device(0x0f,&shp,sizeof(shp)); + + return true; } diff --git a/apple2/src/fn_fuji/fuji_get_host_prefix.c b/apple2/src/fn_fuji/fuji_get_host_prefix.c index 53d9b39..75d3b00 100644 --- a/apple2/src/fn_fuji/fuji_get_host_prefix.c +++ b/apple2/src/fn_fuji/fuji_get_host_prefix.c @@ -1,8 +1,20 @@ #include +#include #include "fujinet-fuji.h" +#include "fujinet-bus-apple2.h" +// A8 to AF are now being allocated as get host prefix for slots 0 to 7. bool fuji_get_host_prefix(uint8_t hs, char *prefix) { - // Not implemented in A2 - return false; + uint8_t stat = hs + 0xA8; + + if (sp_get_fuji_id() == 0) { + return false; + } + + sp_error = sp_status(sp_fuji_id, stat); + if (sp_error == 0) { + memcpy(prefix, &sp_payload[0], 256); + } + return sp_error == 0; } diff --git a/apple2/src/fn_fuji/fuji_set_host_prefix.c b/apple2/src/fn_fuji/fuji_set_host_prefix.c index d7fe97b..5abb1b7 100644 --- a/apple2/src/fn_fuji/fuji_set_host_prefix.c +++ b/apple2/src/fn_fuji/fuji_set_host_prefix.c @@ -1,8 +1,29 @@ #include +#include #include "fujinet-fuji.h" +#include "fujinet-bus-apple2.h" bool fuji_set_host_prefix(uint8_t hs, char *prefix) { - // Not implemented in A2 - return false; + // Not implemented in A2 + size_t filename_len = strlen(prefix); + if (filename_len >= 254) + { + return false; + } + + sp_error = sp_get_fuji_id(); + if (sp_error <= 0) + { + return false; + } + + sp_payload[0] = (filename_len + 1) & 0xFF; + sp_payload[1] = 0; + sp_payload[2] = hs; + strcpy((char *) &sp_payload[3], prefix); + + sp_error = sp_control(sp_fuji_id, FUJICMD_SET_HOST_PREFIX); + + return sp_error == 0; } diff --git a/coco/src/fn_fuji/fuji_get_host_prefix.c b/coco/src/fn_fuji/fuji_get_host_prefix.c index 8169430..b5d3b98 100644 --- a/coco/src/fn_fuji/fuji_get_host_prefix.c +++ b/coco/src/fn_fuji/fuji_get_host_prefix.c @@ -1,9 +1,27 @@ #include #include +#include +#include #include "fujinet-fuji.h" bool fuji_get_host_prefix(uint8_t hs, char *prefix) { - // TODO: not implemented in firmware. - return true; + struct _ghp + { + uint8_t opcode; + uint8_t cmd; + uint8_t hs; + } ghp; + + ghp.opcode = OP_FUJI; + ghp.cmd = FUJICMD_GET_HOST_PREFIX; + ghp.hs = hs; + + bus_ready(); + + dwwrite((uint8_t *)&ghp, sizeof(ghp)); + if (fuji_get_error()) + return false; + + return fuji_get_response((uint8_t *)prefix, 256); } diff --git a/coco/src/fn_fuji/fuji_set_host_prefix.c b/coco/src/fn_fuji/fuji_set_host_prefix.c index 22848dc..98f5092 100644 --- a/coco/src/fn_fuji/fuji_set_host_prefix.c +++ b/coco/src/fn_fuji/fuji_set_host_prefix.c @@ -1,9 +1,26 @@ #include #include #include "fujinet-fuji.h" +#include +#include bool fuji_set_host_prefix(uint8_t hs, char *prefix) { - // Not implemented anywhere yet. - return true; + struct _shp + { + uint8_t opcode; + uint8_t cmd; + uint8_t hs; + char filename[256]; + } shp; + + shp.opcode = OP_FUJI; + shp.cmd = FUJICMD_SET_HOST_PREFIX; + shp.hs = hs; + strcpy(shp.filename,prefix); + + bus_ready(); + dwwrite((uint8_t *)&shp, sizeof(shp)); + + return !fuji_get_error(); } diff --git a/commodore/src/fn_fuji/fuji_get_host_prefix.c b/commodore/src/fn_fuji/fuji_get_host_prefix.c index 2ce31c5..b22af90 100644 --- a/commodore/src/fn_fuji/fuji_get_host_prefix.c +++ b/commodore/src/fn_fuji/fuji_get_host_prefix.c @@ -1,10 +1,26 @@ #include #include +#include +#include #include "fujinet-fuji.h" #include "fujinet-fuji-cbm.h" bool fuji_get_host_prefix(uint8_t hs, char *prefix) { - // not implemented on CBM - return false; + uint8_t *filename; + bool is_success; + int bytes_read; + + filename = malloc(256); + if (filename == NULL) { + return false; + } + memset(filename, 0, 256); + + is_success = open_read_close_data_1(FUJICMD_GET_HOST_PREFIX, &bytes_read, hs, 256, (uint8_t *) filename); + if (is_success) { + strcpy(prefix, (char *)filename); + } + free(filename); + return is_success; } diff --git a/commodore/src/fn_fuji/fuji_set_host_prefix.c b/commodore/src/fn_fuji/fuji_set_host_prefix.c index a31980f..72acec4 100644 --- a/commodore/src/fn_fuji/fuji_set_host_prefix.c +++ b/commodore/src/fn_fuji/fuji_set_host_prefix.c @@ -1,10 +1,29 @@ #include #include +#include +#include #include "fujinet-fuji.h" #include "fujinet-fuji-cbm.h" bool fuji_set_host_prefix(uint8_t hs, char *prefix) { - // Not implemented in IEM fuji firmware - return false; + uint8_t *pl; + uint16_t pl_len; + bool ret; + + pl_len = strlen(prefix) + 3 + 1; // add 1 for the null string terminator, although technically not required as we go by lengths + + pl = malloc(pl_len); + if (pl == NULL) { + status_error(ERROR_MALLOC_FAILED, FUJICMD_SET_HOST_PREFIX); + return false; + } + + pl[0] = hs; + strcpy((char *) &pl[1], prefix); + pl[pl_len - 1] = '\0'; + + ret = open_close_data(FUJICMD_SET_HOST_PREFIX, true, pl_len, pl); + free(pl); + return ret; } diff --git a/fujinet-fuji.h b/fujinet-fuji.h index 14437d3..1733c92 100644 --- a/fujinet-fuji.h +++ b/fujinet-fuji.h @@ -67,6 +67,8 @@ #define FUJICMD_GET_DIRECTORY_POSITION 0xE5 #define FUJICMD_SET_DIRECTORY_POSITION 0xE4 #define FUJICMD_SET_DEVICE_FULLPATH 0xE2 +#define FUJICMD_SET_HOST_PREFIX 0xE1 +#define FUJICMD_GET_HOST_PREFIX 0xE0 #define FUJICMD_WRITE_APPKEY 0xDE #define FUJICMD_READ_APPKEY 0xDD #define FUJICMD_OPEN_APPKEY 0xDC diff --git a/pmd85/src/fn_fuji/fuji_get_host_prefix.c b/pmd85/src/fn_fuji/fuji_get_host_prefix.c index 034e42d..71ec9c9 100644 --- a/pmd85/src/fn_fuji/fuji_get_host_prefix.c +++ b/pmd85/src/fn_fuji/fuji_get_host_prefix.c @@ -2,6 +2,22 @@ bool fuji_get_host_prefix(uint8_t hs, char *prefix) { - // TODO: not implemented in firmware. - return true; + struct _ghp + { + uint8_t opcode; + uint8_t cmd; + uint8_t hs; + } ghp; + + ghp.opcode = OP_FUJI; + ghp.cmd = FUJICMD_GET_HOST_PREFIX; + ghp.hs = hs; + + bus_ready(); + + dwwrite((uint8_t *)&ghp, sizeof(ghp)); + if (fuji_get_error()) + return false; + + return fuji_get_response((uint8_t *)prefix, 256); } diff --git a/pmd85/src/fn_fuji/fuji_set_host_prefix.c b/pmd85/src/fn_fuji/fuji_set_host_prefix.c index 8de7f96..edaa38f 100644 --- a/pmd85/src/fn_fuji/fuji_set_host_prefix.c +++ b/pmd85/src/fn_fuji/fuji_set_host_prefix.c @@ -1,7 +1,25 @@ +#include +#include +#include #include "fujinet-fuji.h" bool fuji_set_host_prefix(uint8_t hs, char *prefix) { - // Not implemented anywhere yet. - return true; + struct _shp + { + uint8_t opcode; + uint8_t cmd; + uint8_t hs; + char filename[256]; + } shp; + + shp.opcode = OP_FUJI; + shp.cmd = FUJICMD_SET_HOST_PREFIX; + shp.hs = hs; + strcpy(shp.filename,prefix); + + bus_ready(); + dwwrite((uint8_t *)&shp, sizeof(shp)); + + return !fuji_get_error(); }