From 852bfb6e64da97b3481c3e6f77799522f358e4a8 Mon Sep 17 00:00:00 2001 From: beeanyew Date: Sun, 25 Apr 2021 07:48:24 +0200 Subject: [PATCH] Add Pi->Amiga file transfer to PiStorm interaction device --- .../amiga/pistorm-dev/pistorm-dev-enums.h | 12 ++- platforms/amiga/pistorm-dev/pistorm-dev.c | 89 +++++++++++++++++- .../pistorm-dev/pistorm_dev_amiga/PiSimple | Bin 14368 -> 17152 bytes .../pistorm_dev_amiga/pistorm_dev.c | 16 ++++ .../pistorm_dev_amiga/pistorm_dev.h | 3 + .../pistorm_dev_amiga/simple_interact.c | 42 ++++++++- 6 files changed, 154 insertions(+), 8 deletions(-) diff --git a/platforms/amiga/pistorm-dev/pistorm-dev-enums.h b/platforms/amiga/pistorm-dev/pistorm-dev-enums.h index 1778674..a67eda4 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev-enums.h +++ b/platforms/amiga/pistorm-dev/pistorm-dev-enums.h @@ -22,6 +22,10 @@ enum pistorm_dev_cmds { PI_CMD_HWREV = 0x10, // [R] Check the PiStorm hardware version/revision PI_CMD_SWREV = 0x12, // [R] Check the PiStorm software version/revision + PI_CMD_FILESIZE = 0x0100, // [R] Get the file size for file on the Pi side using the path + // at PI_STR1, if it exists. + PI_CMD_TRANSFERFILE = 0x0104, // [W] Transfer over a file from the Pi to Amiga RAM. + PI_CMD_QBASIC = 0x0FFC, // QBasic PI_CMD_NIBBLES = 0x0FFE, // Nibbles @@ -34,7 +38,7 @@ enum pistorm_dev_cmds { PI_DBG_VAL6 = 0x1024, // [RW] PI_DBG_VAL7 = 0x1028, // [RW] PI_DBG_VAL8 = 0x102C, // [RW] - PI_DBG_STR1 = 0x1030, // [W] Pointers to debug strings (typically in "Amiga RAM") + PI_DBG_STR1 = 0x1030, // [W] Pointers to debug strings (typically in Amiga RAM) PI_DBG_STR2 = 0x1034, // [W] PI_DBG_STR3 = 0x1038, // [W] PI_DBG_STR4 = 0x103C, // [W] @@ -58,10 +62,14 @@ enum pistorm_dev_cmds { PI_LONGWORD2 = 0x2014, // [RW] PI_LONGWORD3 = 0x2018, // [RW] PI_LONGWORD4 = 0x201C, // [RW] - PI_STR1 = 0x2020, // [W] Pointers to strings (typically in "Amiga RAM") + PI_STR1 = 0x2020, // [W] Pointers to strings (typically in Amiga RAM) PI_STR2 = 0x2024, // [W] PI_STR3 = 0x2028, // [W] PI_STR4 = 0x202C, // [W] + PI_PTR1 = 0x2030, // [W] Pointers to allocated memory in Amiga RAM. + PI_PTR2 = 0x2034, // [W] For instance for loading large files to Amiga RAM or + PI_PTR3 = 0x2038, // [W] transferring over files from the Pi side of things. + PI_PTR4 = 0x203C, // [W] PI_CMDRESULT = 0x2100, // [R] Check the result of any command that provides a "return value". }; diff --git a/platforms/amiga/pistorm-dev/pistorm-dev.c b/platforms/amiga/pistorm-dev/pistorm-dev.c index 5ca3488..7a16174 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev.c +++ b/platforms/amiga/pistorm-dev/pistorm-dev.c @@ -47,6 +47,7 @@ static uint8_t pi_byte[8]; static uint16_t pi_word[4]; static uint32_t pi_longword[4]; static uint32_t pi_string[4]; +static uint32_t pi_ptr[4]; static uint32_t pi_dbg_val[4]; static uint32_t pi_dbg_string[4]; @@ -79,6 +80,36 @@ int32_t grab_amiga_string(uint32_t addr, uint8_t *dest, uint32_t str_max_len) { return (int32_t)strlen((const char*)dest); } +int32_t amiga_transfer_file(uint32_t addr, char *filename) { + FILE *in = fopen(filename, "rb"); + if (in == NULL) { + DEBUG("[AMIGA_TRANSFER_FILE] Failed to open file %s for reading.\n", filename); + return -1; + } + fseek(in, 0, SEEK_END); + + int32_t r = get_mapped_item_by_address(cfg, addr); + uint32_t filesize = ftell(in); + + fseek(in, 0, SEEK_SET); + if (r == -1) { + DEBUG("[GRAB_AMIGA_STRING] No mapped range found for address $%.8X. Transferring file data over the bus.\n", addr); + uint8_t tmp_read = 0; + + for (uint32_t i = 0; i < filesize; i++) { + tmp_read = (uint8_t)fgetc(in); + write8(addr + i, tmp_read); + } + } else { + uint8_t *dst = cfg->map_data[r] + (addr - cfg->map_offset[r]); + fread(dst, filesize, 1, in); + } + fclose(in); + DEBUG("[AMIGA_TRANSFER_FILE] Copied %d bytes to address $%.8X.\n", filesize, addr); + + return 0; +} + char *get_pistorm_devcfg_filename() { return cfg_filename; } @@ -121,6 +152,29 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { DEBUG("[PISTORM-DEV] Set STRING POINTER %d to $%.8X\n", (addr - PI_STR1) / 4, val); pi_string[(addr - PI_STR1) / 4] = val; break; + case PI_PTR1: case PI_PTR2: case PI_PTR3: case PI_PTR4: + DEBUG("[PISTORM-DEV] Set DATA POINTER %d to $%.8X\n", (addr - PI_PTR1) / 4, val); + pi_ptr[(addr - PI_PTR1) / 4] = val; + break; + + case PI_CMD_TRANSFERFILE: + DEBUG("[PISTORM-DEV] Write to TRANSFERFILE.\n"); + if (pi_string[0] == 0 || grab_amiga_string(pi_string[0], (uint8_t *)tmp_string, 255) == -1) { + printf("[PISTORM-DEV] No or invalid filename for TRANSFERFILE. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else if (pi_ptr[0] == 0) { + printf("[PISTORM-DEV] Null pointer specified for TRANSFERFILE destination. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else { + if (amiga_transfer_file(pi_ptr[0], tmp_string) == -1) { + pi_cmd_result = PI_RES_FAILED; + } else { + pi_cmd_result = PI_RES_OK; + } + } + pi_string[0] = 0; + pi_ptr[0] = 0; + break; case PI_CMD_RTGSTATUS: DEBUG("[PISTORM-DEV] Write to RTGSTATUS: %d\n", val); @@ -190,11 +244,11 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { } else { FILE *tmp = fopen(tmp_string, "rb"); if (tmp == NULL) { - printf("[PISTORM-DEV] Failed to open file %s for PISCSI drive mapping. Aborting.\n", cfg_filename); + printf("[PISTORM-DEV] Failed to open file %s for PISCSI drive mapping. Aborting.\n", tmp_string); pi_cmd_result = PI_RES_FILENOTFOUND; } else { fclose(tmp); - printf("[PISTORM-DEV] Attempting to map file %s as PISCSI drive %d...\n", cfg_filename, pi_word[0]); + printf("[PISTORM-DEV] Attempting to map file %s as PISCSI drive %d...\n", tmp_string, pi_word[0]); piscsi_unmap_drive(pi_word[0]); piscsi_map_drive(tmp_string, pi_word[0]); pi_cmd_result = PI_RES_OK; @@ -240,7 +294,7 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { } else { FILE *tmp = fopen(tmp_string, "rb"); if (tmp == NULL) { - printf("[PISTORM-DEV] Failed to open file %s for KICKROM mapping. Aborting.\n", cfg_filename); + printf("[PISTORM-DEV] Failed to open file %s for KICKROM mapping. Aborting.\n", tmp_string); pi_cmd_result = PI_RES_FILENOTFOUND; } else { fclose(tmp); @@ -270,7 +324,7 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { } else { FILE *tmp = fopen(tmp_string, "rb"); if (tmp == NULL) { - printf("[PISTORM-DEV] Failed to open file %s for EXTROM mapping. Aborting.\n", cfg_filename); + printf("[PISTORM-DEV] Failed to open file %s for EXTROM mapping. Aborting.\n", tmp_string); pi_cmd_result = PI_RES_FILENOTFOUND; } else { fclose(tmp); @@ -363,6 +417,31 @@ uint32_t handle_pistorm_dev_read(uint32_t addr_, uint8_t type) { uint32_t addr = (addr_ & 0xFFFF); switch((addr)) { + case PI_CMD_FILESIZE: + DEBUG("[PISTORM-DEV] %s read from FILESIZE.\n", op_type_names[type]); + if (pi_string[0] == 0 || grab_amiga_string(pi_string[0], (uint8_t *)tmp_string, 255) == -1) { + DEBUG("[PISTORM-DEV] Failed to grab string for FILESIZE command. Aborting.\n"); + pi_cmd_result = PI_RES_FAILED; + pi_longword[0] = 0; + return 0; + } else { + FILE *tmp = fopen(tmp_string, "rb"); + if (tmp == NULL) { + DEBUG("[PISTORM-DEV] Failed to open file %s for FILESIZE command. Aborting.\n", tmp_string); + pi_longword[0] = 0; + pi_cmd_result = PI_RES_FILENOTFOUND; + } else { + fseek(tmp, 0, SEEK_END); + pi_longword[0] = ftell(tmp); + DEBUG("[PISTORM-DEV] Returning file size for file %s: %d bytes.\n", tmp_string, pi_longword[0]); + fclose(tmp); + pi_cmd_result = PI_RES_OK; + } + } + pi_string[0] = 0; + return pi_longword[0]; + break; + case PI_CMD_HWREV: // Probably replace this with some read from the CPLD to get a simple hardware revision. DEBUG("[PISTORM-DEV] %s Read from HWREV\n", op_type_names[type]); @@ -406,7 +485,7 @@ uint32_t handle_pistorm_dev_read(uint32_t addr_, uint8_t type) { break; case PI_CMDRESULT: - DEBUG("[PISTORM-DEV] %s Read from CMDRESULT\n", op_type_names[type]); + DEBUG("[PISTORM-DEV] %s Read from CMDRESULT: %d\n", op_type_names[type], pi_cmd_result); return pi_cmd_result; break; diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiSimple b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiSimple index b4f8d8b03ae56a2be375fe617833ab3fd647561d..9cc89dcc1e536c322b1a370f8b784e06700413b4 100644 GIT binary patch delta 7335 zcmZu$4{TFMnxFUVrp9rC35oO1aVC!A^@hZD0s+e9y2gc&W>eQ2+A6KOI8I`}m^$&3 z|3E-d?YLcfSIT}oc zWAV|1tI%?e(8O5qxlkhQ9MO|5$YxWhUwrw%x50a^p7;r?Qj=! zBS|RT85<2HM;N&`G?t_zv3NW(7~Mzr#$)IkPQ}>}vy+Qj(X@AP-F*hfojmI~2$?j-ue78mK>|Gj<3cZ8Uye2Vw?xh4O!EG}fhe*iLW z$YrceP8za=2-+|a%Vmu!U)%%vx<|gsF}Z0XTsL@#1|r|Jx8{~y8m6pz&PMvD(Ra$F z>E3_uWuL;PSiNjaH29}`JP>HY$fvGmVqm?dIS28x8E?U`aU!@hE|E(zxU}q9wwZBq zX&?KP$N!g@omtjzt@QU#dnc*T`<20*yXpI-FV($&X)hZxFK+)1_49;6i%j~Zai7A; z5k{t$;(2nyH_L?S;AEHx58FC1?^Bpu%?xH3mYV z=SPpI?g?Y}jdl1G|NT~`VP?-h=+K7s2s)MxVXt8^@@9+=q5lD1%W3&&8dN3~B z?<}IC?cV=afjd0K#{APOq3FqmJKbVjJP8fq-C~B2T#j+3g%K*Quyyah`w17Y$OQD? zCqNbd{jg8@v1snyX9FZxRA}A1!lQR#fZRKac{(Q1G@&Z(pJtRWGBAZm9rC3?m>1O* zR2LAFEbyaWHN#bg_OJOm8wSYt$z=~0`=|d_lra0UY6e@VyMI>0jow*i2xh;46wjXP!NuCea)GRGD4omr+n0(DxstZRJwUzYnA z$BAW%ar|?E3YS??9D-MI=dOtf978KA9crvqBn)Dsv6b8(7-O2EHdI6^pf5thlK3 zSl9h@+;<|EwG-%WLF*JE?L-c>uvDq^dykVAt0r<UK-05KNLA4yuO7g-e;n_gT+|Op}*rWueJKbop?Is$$4= z#2>(1F|It+*jQdYr|#@*!xb!f%C$P0N9^?i56%<_OB6VSs^H5p6FDMf>7V~Z@=VN@-wyAk3RM@@85Bz7%uK z_p1DjBJiyvbdshgQcp0M_C2F4D z+w3tyF%uT7-p@(^$LL}YyK3CF7UTQ#vb6?*#L@Z~&%IJ9zJs8SLWkLxav)EO1mij) z7!We_&*M3W=Novglak%zLe8aC?+&##yGQkLG)>4Mofg*=i+eXIrSd=UTvOM@ibC*a z_Xu$Ov>TTU(UYD5FOjswlOY`*Tsw-Hxg|Gw#TFr~0x@*_9CBD#V3fRcJ|l}$nSm@b zPh3?n59KqAwrId=tOF4q_{2d_bKATbbz(sPTj0$P+g-%r(Db@C6Vif6xv56-AX>J^ z5N-3ZNAX=tD9*E(+ooA~Au8GkE+)mUGT+>P%>LtXqWjOYuVEt{ zI+wXW>ap4 zy2zQganT|F^>Sv?nkL;_y<5>RT*}g|IsqG_evK!W+nL=t$!S5-wRv*)p3FWuWfi}C zS+cfxaOM*yu_DZN&(6v2YcIur@#oxK@7A4@!?)x0=O!KE=ZBsM6F9I$zK z>ASt!o|nR2DxR5?ww?VImH&PLoK@ojejQIqH~HPl-S{D!jk0gYVMu*5{nL#f@E#_W zOOQ^pbki>3XPQ>}MxCY7EY4L6Zxb56fTCW73#=bP9J~@QC>!X8S-h%gyQK^`8gQS; zI!4oj5XwH!;&$>B?lN0|9$+_cfRI%f$0d!d+5_Ci>9$D7gL;giU6Mq59C#Ht3Y-97 z>MFGLUEnDK?7%Ys_;lDQR^0&1z%1}0_PJH6?HXv>(UxM`&yD6C6CNL6<>RnG@}AF@6Eh1B6u60ElYEH`uBn*Yq3U zUEp&ZeU(sF`7l-iL8ux4;6-&a00p%p04A7WgxLqo1Gj*?_{r1~@F< zjRGfu&j9c?JOLcSHq!;b0p}6mIB*`gjHBO;iS926X~X2UKN3QA07zsK20Um&pa6@7 za{wYD+`%c1A<+oHGZFnF`bG3>v_K268GykWL`5S5F9L4>{|cOe4CoRL0%=$xT)<>2 zfGCKAKo&R(pkD(e0+bXXbfw^3qepl@!1BP*)$nrlWrQC*#@zsf8!>0i>)^qhvM3>I z%Ykm-3E&VRxuvyLPvp(hztXiv_W|r z6p&XH-MSrVaEa{zW{G=%H-Yzn%P`#nz#R?xHBhU03xLTQNDwej=tOoM2Cm?KY({z> z0se>#yapHG%31^5gk`0$qSO!9x`26%iNFEi6w-Iib@=%W7%pP)b3A_oI*W;mXx9L2 z65?uvfYJ{z2`-j_Z_NZ^_Y9OE!`2=KFu%MXad85jz%cqCs~qjM$MD2rRFY26L*v#1m^&eH>5l)w~J7ks3sx=3}I9%^9Et46v+LkHr%KC^o}@+7ozg z#uH<8GBArefp7~HTe851gw#V|13a?=?j8URxlaS&aUTWt1BjmcRRG~{>jDr(_R%P- zTPsDpM02!So~Z;A5d(>29Pe7uY`e8gk3u)zap3ELfE)?nO-LY~l)xHHrV{8Snu+_z z#xQ>0*o-pYS}B}SPPJ|lo>dlGYsy6U1XY1hGBnOqwG+kcbP4lHud_CN4IP?5B(ZmV zI3h*ZFmWmIEPQE2VY_UuUWYjcH>XG>ATR zE?#1Xqd`gKEiL1`Fk(ECOeBXRxKx&%!9s%>KH|;yU^EnfD_|oUhqC0XNozKs4OxM) zSpEfgG%^MqYneY99+!MS%A$t%1p-5IYG@=h^c={FBlr^GTQHg2hi1u5PKSrt3u81( znOkBYPhs6{pjXT(4zaMKi)d`hjLWpE<~`0I4@MHO0_)q3ujM5g8XXSALy1&Wb>S4} z4YPO9jJeu?uOjAZ0?QQ+VJYLG`yPu)Z=qj__qL!ah2+x(RjzuB9Kjz^ccWU;8%Bg}W2Z8nzVR<5dklUbXIg z?l69qcX|G`n{)VphAs{~Nb-@#eOp{E<;MC&lZSQS+mn(v5ueM{&}$@wkE?E5U~Wdb@q`J|HgX! zW|B9q6RMQM8-G^40llmekZ3He@DCqn#GBGP8y^>BW!t7l1h+D^DTZ0!ZgTuTZ|jmL delta 4588 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 o-Lnb4^G-$6u #include #include @@ -23,6 +28,7 @@ #include #include #include +#endif #include #include @@ -31,7 +37,7 @@ #define LOADLIB(a, b) if ((a = (struct a*)OpenLibrary(b,0L))==NULL) { \ printf("Failed to load %s.\n", b); \ return 1; \ - } \ + } void print_usage(char *exe); int get_command(char *cmd); @@ -89,6 +95,37 @@ int __stdargs main (int argc, char *argv[]) { } pi_handle_config(cmd_arg, argv[2]); break; + case PI_CMD_TRANSFERFILE: + if (argc < 4) { + printf ("Please specify a source and destination filename in addition to the command.\n"); + printf ("Example: %s --transfer platforms/platform.h snakes.h\n", argv[0]); + } + if (pi_get_filesize(argv[2], &tmpvalue) == PI_RES_FILENOTFOUND) { + printf ("File %s not found on the Pi side.\n", argv[2]); + } else { + unsigned int filesize = tmpvalue; + unsigned char *dest = malloc(filesize); + + if (dest == NULL) { + printf ("Failed to allocate memory buffer for file. Aborting file transfer.\n"); + } else { + printf ("Found a %d byte file on the Pi side. Eating it.\n", filesize); + if (pi_transfer_file(argv[2], dest) != PI_RES_OK) { + printf ("Something went horribly wrong during the file transfer.\n"); + } else { + FILE *out = fopen(argv[3], "wb+"); + if (out == NULL) { + printf ("Failed to open output file %s for writing.\n", argv[3]); + } else { + fwrite(dest, filesize, 1, out); + fclose(out); + printf ("%d bytes transferred to file %s.\n", filesize, argv[3]); + } + } + free(dest); + } + } + break; default: printf ("Unhandled command %s.\n", argv[1]); return 1; @@ -117,6 +154,9 @@ int get_command(char *cmd) { cmd_arg = PICFG_DEFAULT; return PI_CMD_SWITCHCONFIG; } + if (strcmp(cmd, "--transfer-file") == 0 || strcmp(cmd, "--transfer") == 0 || strcmp(cmd, "--getfile") == 0) { + return PI_CMD_TRANSFERFILE; + } return -1; } -- 2.39.2