summaryrefslogtreecommitdiffstatshomepage
path: root/src/tools/castool.cpp
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2015-11-08 12:56:12 +0100
committer Miodrag Milanovic <mmicko@gmail.com>2015-11-08 12:56:12 +0100
commit7c19aac60e12d6f5ea301bdb34d7826a01e0b06f (patch)
treef310d86aa2c6bfc19d115307dedde4eb0cd52dad /src/tools/castool.cpp
parenta57b46ae933badd7441ce1644711dbb851e2b504 (diff)
Rename *.c -> *.cpp in our source (nw)
Diffstat (limited to 'src/tools/castool.cpp')
-rw-r--r--src/tools/castool.cpp217
1 files changed, 217 insertions, 0 deletions
diff --git a/src/tools/castool.cpp b/src/tools/castool.cpp
new file mode 100644
index 00000000000..22564dcdf78
--- /dev/null
+++ b/src/tools/castool.cpp
@@ -0,0 +1,217 @@
+// license:BSD-3-Clause
+// copyright-holders:Miodrag Milanovic
+/***************************************************************************
+
+ main.c
+
+ Castool command line front end
+
+ 27/03/2009 Initial version by Miodrag Milanovic
+
+***************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <time.h>
+#include <assert.h>
+
+#include "corestr.h"
+
+#include "formats/a26_cas.h"
+#include "formats/ace_tap.h"
+#include "formats/adam_cas.h"
+#include "formats/apf_apt.h"
+#include "formats/cbm_tap.h"
+#include "formats/cgen_cas.h"
+#include "formats/coco_cas.h"
+#include "formats/csw_cas.h"
+#include "formats/fm7_cas.h"
+#include "formats/fmsx_cas.h"
+#include "formats/gtp_cas.h"
+#include "formats/hect_tap.h"
+#include "formats/kc_cas.h"
+#include "formats/kim1_cas.h"
+#include "formats/lviv_lvt.h"
+#include "formats/mz_cas.h"
+#include "formats/orao_cas.h"
+#include "formats/oric_tap.h"
+#include "formats/p6001_cas.h"
+#include "formats/phc25_cas.h"
+#include "formats/pmd_cas.h"
+#include "formats/primoptp.h"
+#include "formats/rk_cas.h"
+#include "formats/sc3000_bit.h"
+#include "formats/sol_cas.h"
+#include "formats/sorc_cas.h"
+#include "formats/sord_cas.h"
+#include "formats/spc1000_cas.h"
+#include "formats/svi_cas.h"
+#include "formats/thom_cas.h"
+#include "formats/trs_cas.h"
+#include "formats/tvc_cas.h"
+#include "formats/tzx_cas.h"
+#include "formats/uef_cas.h"
+#include "formats/vg5k_cas.h"
+#include "formats/vt_cas.h"
+#include "formats/x07_cas.h"
+#include "formats/x1_tap.h"
+#include "formats/zx81_p.h"
+
+struct SupportedCassetteFormats
+{
+ const char *name;
+ const struct CassetteFormat * const *formats;
+ const char *desc;
+};
+
+const struct SupportedCassetteFormats formats[] = {
+ {"a26", a26_cassette_formats ,"Atari 2600 SuperCharger"},
+ {"apf", apf_cassette_formats ,"APF Imagination Machine"},
+ {"bbc", bbc_cassette_formats ,"Acorn BBC & Electron"},
+ {"cbm", cbm_cassette_formats ,"Commodore 8-bit series"},
+ {"cdt", cdt_cassette_formats ,"Amstrad CPC"},
+ {"cgenie", cgenie_cassette_formats ,"EACA Colour Genie"},
+ {"coco", coco_cassette_formats ,"Tandy Radio Shack Color Computer"},
+ {"csw", csw_cassette_formats ,"Compressed Square Wave"},
+ {"ddp", coleco_adam_cassette_formats ,"Coleco ADAM"},
+ {"fm7", fm7_cassette_formats ,"Fujitsu FM-7"},
+ {"fmsx", fmsx_cassette_formats ,"MSX"},
+ {"gtp", gtp_cassette_formats ,"Elektronika inzenjering Galaksija"},
+ {"hector", hector_cassette_formats ,"Micronique Hector & Interact Family Computer"},
+ {"jupiter", ace_cassette_formats ,"Jupiter Cantab Jupiter Ace"},
+ {"kc85", kc_cassette_formats ,"VEB Mikroelektronik KC 85"},
+ {"kim1", kim1_cassette_formats ,"MOS KIM-1"},
+ {"lviv", lviv_lvt_format ,"PK-01 Lviv"},
+ {"mo5", mo5_cassette_formats ,"Thomson MO-series"},
+ {"mz", mz700_cassette_formats ,"Sharp MZ-700"},
+ {"orao", orao_cassette_formats ,"PEL Varazdin Orao"},
+ {"oric", oric_cassette_formats ,"Tangerine Oric"},
+ {"pc6001", pc6001_cassette_formats ,"NEC PC-6001"},
+ {"phc25", phc25_cassette_formats ,"Sanyo PHC-25"},
+ {"pmd85", pmd85_cassette_formats ,"Tesla PMD-85"},
+ {"primo", primo_ptp_format ,"Microkey Primo"},
+ {"rku", rku_cassette_formats ,"UT-88"},
+ {"rk8", rk8_cassette_formats ,"Mikro-80"},
+ {"rks", rks_cassette_formats ,"Specialist"},
+ {"rko", rko_cassette_formats ,"Orion"},
+ {"rkr", rkr_cassette_formats ,"Radio-86RK"},
+ {"rka", rka_cassette_formats ,"Zavod BRA Apogee BK-01"},
+ {"rkm", rkm_cassette_formats ,"Mikrosha"},
+ {"rkp", rkp_cassette_formats ,"SAM SKB VM Partner-01.01"},
+ {"sc3000", sc3000_cassette_formats ,"Sega SC-3000"},
+ {"sol20", sol20_cassette_formats ,"PTC SOL-20"},
+ {"sorcerer", sorcerer_cassette_formats ,"Exidy Sorcerer"},
+ {"sordm5", sordm5_cassette_formats ,"Sord M5"},
+ {"spc1000", spc1000_cassette_formats ,"Samsung SPC-1000"},
+ {"svi", svi_cassette_formats ,"Spectravideo SVI-318 & SVI-328"},
+ {"to7", to7_cassette_formats ,"Thomson TO-series"},
+ {"trs80l2", trs80l2_cassette_formats ,"TRS-80 Level 2"},
+ {"tvc64", tvc64_cassette_formats ,"Videoton TVC 64"},
+ {"tzx", tzx_cassette_formats ,"Sinclair ZX Spectrum"},
+ {"uef", uef_cassette_formats ,"Acorn Electron"},
+ {"vg5k", vg5k_cassette_formats ,"Philips VG 5000"},
+ {"vtech1", vtech1_cassette_formats ,"Video Technology Laser 110-310"},
+ {"vtech2", vtech2_cassette_formats ,"Video Technology Laser 350-700"},
+ {"x07", x07_cassette_formats ,"Canon X-07"},
+ {"x1", x1_cassette_formats ,"Sharp X1"},
+ {"zx80_o", zx80_o_format ,"Sinclair ZX80"},
+ {"zx81_p", zx81_p_format ,"Sinclair ZX81"},
+
+
+
+ {NULL,NULL,NULL}
+};
+
+
+static const char *get_extension(const char *name)
+{
+ const char *s;
+ s = name;
+ if (s != NULL)
+ s = strrchr(s, '.');
+ return s ? s+1 : NULL;
+}
+
+static void display_usage(void)
+{
+ fprintf(stderr, "Usage: \n");
+ fprintf(stderr, " castool.exe convert <format> <inputfile> <outputfile.wav>\n");
+}
+
+static void display_formats(void)
+{
+ int i,j;
+ fprintf(stderr, "Supported formats:\n\n");
+ for (i = 0; formats[i].name; i++) {
+ fprintf(stderr, "%10s - %s\n",formats[i].name,formats[i].desc);
+ for (j = 1; formats[i].formats[j]; j++) {
+ fprintf(stderr, "%15s %s\n","",formats[i].formats[j]->extensions);
+ }
+ }
+}
+
+int CLIB_DECL main(int argc, char *argv[])
+{
+ int i;
+ int found =0;
+ const struct CassetteFormat * const *selected_formats = NULL;
+ cassette_image *cassette;
+ FILE *f;
+
+ if (argc > 1)
+ {
+ if (!core_stricmp("convert", argv[1]))
+ {
+ // convert command
+ if (argc!=5) {
+ fprintf(stderr, "Wrong parameter number.\n\n");
+ display_usage();
+ return -1;
+ } else {
+ for (i = 0; formats[i].name; i++) {
+ if (core_stricmp(formats[i].name,argv[2])==0) {
+ selected_formats = formats[i].formats;
+ found = 1;
+ }
+ }
+ if (found==0) {
+ fprintf(stderr, "Wrong format name.\n\n");
+ display_usage();
+ fprintf(stderr, "\n");
+ display_formats();
+ return -1;
+ }
+
+ f = fopen(argv[3], "rb");
+ if (!f) {
+ fprintf(stderr, "File %s not found.\n",argv[3]);
+ return -1;
+ }
+
+ if (cassette_open_choices(f, &stdio_ioprocs, get_extension(argv[3]), selected_formats, CASSETTE_FLAG_READONLY, &cassette)) {
+ fprintf(stderr, "Invalid format of input file.\n");
+ fclose(f);
+ return -1;
+ }
+
+ cassette_dump(cassette,argv[4]);
+ cassette_close(cassette);
+ fclose(f);
+ goto theend;
+ }
+ }
+ }
+
+ /* Usage */
+ fprintf(stderr, "castool - Generic cassette manipulation tool for use with MESS\n\n");
+ display_usage();
+ fprintf(stderr, "\n");
+ display_formats();
+ fprintf(stderr, "\nExample usage:\n");
+ fprintf(stderr, " castool.exe convert tzx game.tzx game.wav\n\n");
+
+theend :
+ return 0;
+}