Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: send_pc1403.h
- Revision:
- 0:07819bc70660
- Child:
- 1:9289febf4ae9
diff -r 000000000000 -r 07819bc70660 send_pc1403.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/send_pc1403.h Tue Feb 15 15:37:06 2022 +0000
@@ -0,0 +1,267 @@
+#ifndef SEND_PC1403
+#define SEND_PC1403
+
+#include "mbed.h"
+#define uchar uint8_t
+#define ushort uint8_t
+#define uint uint16_t
+#define ulong uint32_t
+
+#define PC_ID 1403
+#define TYPE_BIN_ADDR 0xE030
+
+// bit timings
+#define BIT_DURATION 8*250 // us, PC1403
+#define SYNC_DURATION 3 // s
+#define N_SYNC_BITS SYNC_DURATION * 1000000 / BIT_DURATION
+#define MAX_BIT_TIME_ERR 10000 // timing error, per bit: 10ms - UNLIKELY!!
+
+#define argP "" // main NOT using command-line input arguments
+
+////////////////////////////////////////////////////////////////////////////////
+// Excerpts from Pocket-Tools source code below
+// https://www.peil-partner.de/ifhe.de/sharp/
+
+/* Regular Errors such as EOF and recoverable such as End of sync *MUST* have a lower value then ERR_OK */
+#define ERR_NOK -1 /* also normal EOF */
+#define ERR_OK 0
+
+/* Unexpected NOT recoverable error *MUST* have a higher value then ERR_OK */
+#define ERR_SYNT 1 /* arguments missed, syntax error */
+#define ERR_ARG 3 /* arguments problem, pocket not implemented */
+#define ERR_FILE 5 /* File I-O */
+#define ERR_MEM 6 /* Line to long, buffer overflow, too much lines */
+#define ERR_FMT 7 /* Source file format or size */
+#define ERR_SUM 8 /* Constellation will generate a checksum error on PC */
+
+#define TYPE_NOK 0
+#define TYPE_BIN 1
+#define TYPE_IMG 2
+#define TYPE_VAR 3 /* one variable block without file type and name*/
+#define TYPE_DAT 4
+#define TYPE_RSV 5 /* For PC-1500, other re-transfer: IMG-compatible */
+#define TYPE_ASC 6 /* For PC-E/G/1600 ASCII Data */
+#define TYPE_BAS 7 /* For PC-E/G/1600 ASCII Source */
+#define TYPE_TXT 8 /* For GRP_NEW, GRP_EXT and GRP_E text modus Image Data */
+#define TYPE_DEF 9 /* For PC-1500 software, binary image for definable keys */
+#define TYPE_DIM 10 /* For PC-1500 Quick-Tape, binary image of all dimensioned data variables */
+#define TYPE_MEM 0x6E /* Tables and Variables of PC-1150, subtype of TYPE_IMG */
+#define TYPE_CRD 0x6A /* PC-1100 full RAM card, subtype of TYPE_IMG */
+#define TYPE_TEL 0x61 /* Telephone database export */
+#define TYPE_SCD 0x62 /* Scheduler database export */
+#define TYPE_NOT 0x64 /* Notes database export */
+
+#define GRP_OLD 0x20
+#define GRP_NEW 0x70
+#define GRP_EXT 0x72
+#define GRP_DAT 0x74
+#define GRP_16 0x10 /* PC-1600 */
+#define GRP_E 0x05 /* PC-E500 */
+#define GRP_G 0x08 /* PC-G850, E2xx */
+
+#define IDENT_PC1211 0x80
+#define IDENT_PC121_DAT 0x8F /* one variable length block only, not tested */
+
+#define IDENT_PC1500 0xA
+#define IDENT_PC15_BIN 0xA0
+#define IDENT_PC15_BAS 0xA1
+#define IDENT_PC15_RSV 0xA2
+#define IDENT_PC15_DEF 0xA3
+#define IDENT_PC15_DAT 0xA4
+
+#define IDENT_QTAPE 0x0AA0
+#define IDENT_QT_BAS 0x42 // B
+#define IDENT_QT_BIN 0x4D // M
+#define IDENT_QT_RSV 0x52 // R
+#define IDENT_QT_DIM 0x44 // D = V DIM
+#define IDENT_QT_DAT 0x56 /* V NOT implemented, UNSUPPORTED! */
+
+#define IDENT_OLD_BAS 0x20
+#define IDENT_OLD_PAS 0x21
+#define IDENT_OLD_DAT 0x24
+#define IDENT_OLD_BIN 0x26
+
+#define IDENT_NEW_TEL 0x61 // MEMO TEL NEW DB
+#define IDENT_NEW_SCD 0x62 // MEMO SCDL NEW DB
+#define IDENT_NEW_NOT 0x64 // MEMO NOTE NEW DB
+#define IDENT_NEW_CRD 0x6A // BASIC RAM Card IN
+#define IDENT_OLD_MEM 0x6E // MEM OLD DB, all Tables
+
+#define IDENT_NEW_BAS 0x70
+#define IDENT_NEW_PAS 0x71
+#define IDENT_EXT_BAS 0x72
+#define IDENT_EXT_PAS 0x73
+#define IDENT_NEW_DAT 0x74 // IDENT_DATA_VAR 0xEF removed
+#define IDENT_NEW_BIN 0x76
+#define IDENT_NEW_CSL 0x7A // CASL or CAP-X CMT
+#define IDENT_UNKNOWN 0x100
+
+#define IDENT_ST 0x124 /* SuperTape */
+
+#define IDENT_PC16_CAS 0x00 /* PC-1600 ASCII Data or BASIC Image */
+#define IDENT_PC16_DAT 0x08 /* Special binary data format PC-1600 */
+#define IDENT_E_ASC 0x04 /* ASCII Data or Text Modus BASIC/ASM/C Source */
+#define IDENT_E_BAS 0x02 /* Return from Bas2Img also in the format of PC-1475 */
+#define IDENT_E_BIN 0x01 /* Binary Data, use --addr parameter 2nd time for entry address */
+ /* also used for Rsv-Data, but different sub id (mode 2) */
+#define SYNC_E_HEAD 40 /* additional sync for E-series header block */
+#define SYNC_E_DATA 20 /* additional sync for E-series data block */
+
+#define DATA_HEAD_LEN 5 /* length of the header of a data variable element*/
+#define DATA_VARIABLE 0xFE00 /* Header element of standard variable, not length */
+#define DATA_DBL_LEN 14 /* length of a double numeric data variable element */
+#define DATA_STD_LEN 8 /* length of a numeric and standard data variable element*/
+#define DATA_NUM_15 0x88 /* ItemLen = Id of numeric data variable of PC-1500 */
+
+#define DATA_NUM 0x98 /* Internal identity of numeric data variable */
+#define DATA_STR 0xA8 /* Internal identity of a string data variable */
+#define DATA_UNKNOWN 0x00 /* Variable filled with zeros */
+
+#define DATA_STD_STR 0xF5 /* Standard data variable is a string */
+#define DATA_EOF 0x0F /* End of variable Data Block */
+
+#define EOF_ASC 0x1A /* End of ASCII transfered files, also CAS: of newer series */
+#define EOF_15 0x55 /* End of complete file of PC-1500 */
+#define BAS_1500_EOF 0xFF /* one of two bytes */
+#define BAS_NEW_EOF 0xFF /* one of two bytes */
+#define BAS_OLD_EOF 0xF0 /* one byte only */
+
+#define BLK_OLD_SUM 8 /* Transmission Block (plus checksums), old series bas without, data old/new with checksum reset */
+#define BLK_OLD 80 /* Transmission Block (plus checksums) of PC-1500 and old series with checksum reset */
+#define BLK_NEW 120 /* Transmission Block (plus checksum) of new series 1260-1475 */
+#define BLK_E_DAT 256 /* Checksum of series E500 DAT */
+#define BLK_E_HEAD 0x30 /* Length of header1 of series E500, next only after the end of a Transmission Block */
+#define BLK_S_HEAD 25 /* Length of SuperTape Header without checksum */
+
+#define SUPT_HEAD_L 26 /* SuperTape length of header block with low byte of checksum included */
+#define SUPT_SYN_NB 64 /* SuperTape number of synchronisation char */
+#define SUPT_SYNC 0x16 /* SuperTape SYNCHR synchronisation char */
+#define SUPT_HEAD 0x2A /* SuperTape SYNPGM start mark of header block */
+#define SUPT_DATA 0xC5 /* SuperTape SYNDAT start mark of program/data block */
+#define SUPT_END 0x9B /* SuperTape end mark after the checksum of a block */
+#define SUPT_FLAGS 0x00 /* SuperTape flag byte */
+
+#define BGNSAMPLES 44 /* first sample byte */
+
+#define AMP_MID 0x80 /* Sample value for silence (all 8-bit) */
+#define AMP_HIGH 0xDA /* Sample value for amplitude HIGH */
+#define AMP_LOW 0x26 /* Sample value for amplitude LOW */
+#define AMP_HIGH_E 0xFC /* Sample value for amplitude HIGH for E-series */
+#define AMP_LOW_E 0x04 /* Sample value for amplitude LOW for E-series */
+#define AMP_HIGH_121 0xEF /* Sample value for amplitude HIGH for CE-121 */
+#define AMP_LOW_121 0x11 /* Sample value for amplitude LOW for CE-121 */
+
+#define ORDER_STD 0
+#define ORDER_INV 1
+#define ORDER_S 8 /* SuperTape Byte */
+#define ORDER_E 9 /* 1600-Series and newer, no nibbles, a byte */
+#define ORDER_Q 11 /* Quick-Tape PC-1500a byte */
+
+#define BASE_FREQ1 4000
+#define BASE_FREQ2 2500 /* PC-1500 */
+#define BASE_FREQ3 3000 /* PC-E-series and newer */
+#define BASE_FREQ4 5000 /* Quick-Tape */
+#define BASE_FREQS 3600 /* SuperTape */
+
+#define CHAR_SPACE 0x20
+#define CHAR_DOT 0x2E
+#define CHAR_COLON 0x3A
+#ifdef __linux__ /* path separator */
+ #define CHAR_SLASH 0x2F
+//elif defined __APPLE__
+#endif
+#ifdef __APPLE__
+ #define CHAR_SLASH 0x2F
+#endif
+#ifndef CHAR_SLASH /* Windows path separator */
+ #define CHAR_SLASH 0x5C
+#endif
+#define CHAR_UNDERSCORE 0x5F
+
+#define cVL 80 /* Constant value for max. length of a data variable */
+#define cLL 512 /* Constant value for max. length of CFG-TEXT lines and max. CFG line Nb */
+#define cLPF 100 /* Constant value for max. Length of PathFilenames */
+
+#define BAS_EOF_INCL 0x200000 /* debug flag for one included End Mark from Bas2img or Wav2bin */
+#define DATA_W2B150 0x8000 /* debug flag for DAT-IMG from Wav2bin 1.5.0 or older */
+#define NO_FILE_HEAD 0x4000 /* debug flag, write without file type and -name, 2.variable block */
+#define BAS_EXT_FRMT 0x1000 /* debug flag, use FORMAT of BAS_EXT for E-Series */
+#define SYNCL_STD 0x400 /* debug flag, for default sync length like the original */
+#define SYNCL_TRM 0x200 /* debug flag, for sync length like the Technical Reference Manual */
+
+#define MODE_B22 0 /* PC-1500 */
+#define MODE_B21 1
+#define MODE_B20 2
+#define MODE_B19 3 /* Old series */
+#define MODE_B17 4
+#define MODE_B16 5 /* File names of new series an data */
+#define MODE_B15 6 /* Variable data body new series */
+#define MODE_B14 7 /* PC-1403 and newer, reads also B13 */
+#define MODE_B13 8 /* PC-1402 */
+#define MODE_B9 9 /* PC-E series and newer */
+#define MODE_B10 10 /* SuperTape */
+#define MODE_B11 11 /* Quick-Tape */
+
+
+///////////////////////////////////////
+// bin-2-wav typedefs
+typedef struct {
+ // FILE* ptrFd ; /* FILE NOT USED HERE */
+ uint ident ;
+ uchar mode ; /* Bit writing mode and stop bits*/
+ uchar mode_h ; /* Bit writing mode and stop bits for the file header*/
+ ulong nbSync1 ; /* sync bits per second */
+ ulong nbSync ; /* sync bits for intermediate syncs */
+ ulong nbByte ; /* size of bytes to write */
+ ulong total ; /* total bytes written (without checksums) */
+ long total_diff ; /* difference between bytes read and written (without checksums) */
+ ulong count ; /* Counter of bytes in a block for the checksum */
+ ulong sum ; /* Checksum calculated */
+ ulong block_len ; /* Block length for checksum, variable used for E-Series */
+ ulong usedat_len ; /* Length of useful data of the next block 1...(0x50), for Qtape L:0...4F */
+ ulong bitLen ; /* Wave sample blocks per SHARP bit */
+ bool lastSmpHigh; /* for SuperTape phase switching */
+ ulong debug ;
+} FileInfo ;
+
+typedef struct {
+ uint stopb1 ;
+ uint stopb2 ;
+} ModeInfo ;
+
+///////////////////////////////////////
+// static variables
+static ModeInfo Mode[] = { /* stop bits of first and second nibble */
+ { 6, 6 }, { 5, 6 }, { 5, 5 }, { 4, 5 },
+ { 1, 6 }, { 1, 5 }, { 1, 4 }, { 1, 3 }, { 1, 2 }
+} ;
+
+static bool bitMirroring = false ;
+
+static ulong CodeOld[] = {
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x14,0x12,0x15,0x18,0x16,0x1F,0x11, // Pos. 0x24 $ 0x19 -> 0x18, 11/2020
+ 0x30,0x31,0x37,0x35,0x1B,0x36,0x4A,0x38,
+ 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
+ 0x48,0x49,0x1D,0x1C,0x33,0x34,0x32,0x13,
+ 0x1E,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
+ 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
+ 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
+ 0x68,0x69,0x6A,0x11,0x11,0x11,0x39,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x19,0x11,0x1A,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11
+} ;
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// published method
+
+int FileSend ( char* FileName, char* FileStream, uint FileSize, FileInfo* ptrFile );
+
+#endif // SEND_PC1403
\ No newline at end of file