Fabio Fumi / Mbed 2 deprecated send_to_sharp

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers send_pc1403.h Source File

send_pc1403.h

00001 #ifndef SEND_PC1403
00002 #define SEND_PC1403
00003 
00004 #include "mbed.h" 
00005 
00006 #include "serial_file.h" // file-over-serial
00007 #ifndef FILE_BUF_SIZE 
00008 #include "bin_file.h"  // hardcoded file stream
00009 #endif
00010 
00011 #include "bit_send.h"
00012 
00013 // remapping to MBed types
00014 #define uchar  uint8_t
00015 #define ushort uint16_t
00016 #define uint   uint32_t
00017 #define ulong  uint32_t
00018 
00019 #define  PC_ID          1403 
00020 #define  TYPE_BIN_ADDR  0xE030 
00021 
00022 //  bit timings
00023 #define BIT_DURATION       (8*250) // us, PC1403
00024 #define SYNC_DURATION      1       // seconds
00025 #define N_SYNC_BITS        SYNC_DURATION * 1000000 / BIT_DURATION  
00026 #define MAX_BIT_TIME_ERR   50000 // timing error, per bit: 50ms - UNLIKELY!!
00027 
00028 #define argP "" // main NOT using command-line input arguments
00029 
00030 ////////////////////////////////////////////////////////////////////////////////
00031 // Excerpts from Pocket-Tools source code below
00032 // https://www.peil-partner.de/ifhe.de/sharp/
00033 
00034 /* Regular Errors such as EOF and recoverable such as End of sync *MUST* have a lower value then ERR_OK */
00035 #define ERR_NOK        -1   /* also normal EOF */
00036 #define ERR_OK          0
00037 
00038 /* Unexpected NOT recoverable error *MUST* have a higher value then ERR_OK */
00039 #define ERR_SYNT        1   /* arguments missed, syntax error */
00040 #define ERR_ARG         3   /* arguments problem, pocket not implemented */
00041 #define ERR_FILE        5   /* File I-O */
00042 #define ERR_MEM         6   /* Line to long, buffer overflow, too much lines */
00043 #define ERR_FMT         7   /* Source file format or size */
00044 #define ERR_SUM         8   /* Constellation will generate a checksum error on PC */
00045 
00046 #define TYPE_NOK        0
00047 #define TYPE_BIN        1
00048 #define TYPE_IMG        2
00049 #define TYPE_VAR        3   /* one variable block without file type and name*/
00050 #define TYPE_DAT        4
00051 #define TYPE_RSV        5   /* For PC-1500, other re-transfer: IMG-compatible */
00052 #define TYPE_ASC        6   /* For PC-E/G/1600 ASCII Data */
00053 #define TYPE_BAS        7   /* For PC-E/G/1600 ASCII Source */
00054 #define TYPE_TXT        8   /* For GRP_NEW, GRP_EXT and GRP_E text modus Image Data */
00055 #define TYPE_DEF        9   /* For PC-1500 software, binary image for definable keys */
00056 #define TYPE_DIM        10  /* For PC-1500 Quick-Tape, binary image of all dimensioned data variables */
00057 #define TYPE_MEM        0x6E    /* Tables and Variables of PC-1150, subtype of TYPE_IMG */
00058 #define TYPE_CRD        0x6A    /* PC-1100 full RAM card, subtype of TYPE_IMG */
00059 #define TYPE_TEL        0x61    /* Telephone database export */
00060 #define TYPE_SCD        0x62    /* Scheduler database export  */
00061 #define TYPE_NOT        0x64    /* Notes database export */
00062 
00063 #define GRP_OLD         0x20
00064 #define GRP_NEW         0x70
00065 #define GRP_EXT         0x72
00066 #define GRP_DAT         0x74
00067 #define GRP_16          0x10    /* PC-1600 */
00068 #define GRP_E           0x05    /* PC-E500 */
00069 #define GRP_G           0x08    /* PC-G850, E2xx */
00070 
00071 #define IDENT_PC1211    0x80
00072 #define IDENT_PC121_DAT 0x8F    /* one variable length block only, not tested */
00073 
00074 #define IDENT_PC1500    0xA
00075 #define IDENT_PC15_BIN  0xA0
00076 #define IDENT_PC15_BAS  0xA1
00077 #define IDENT_PC15_RSV  0xA2
00078 #define IDENT_PC15_DEF  0xA3
00079 #define IDENT_PC15_DAT  0xA4
00080 
00081 #define IDENT_QTAPE     0x0AA0
00082 #define IDENT_QT_BAS    0x42    // B
00083 #define IDENT_QT_BIN    0x4D    // M
00084 #define IDENT_QT_RSV    0x52    // R
00085 #define IDENT_QT_DIM    0x44    // D = V DIM
00086 #define IDENT_QT_DAT    0x56    /* V NOT implemented, UNSUPPORTED! */
00087 
00088 #define IDENT_OLD_BAS   0x20
00089 #define IDENT_OLD_PAS   0x21
00090 #define IDENT_OLD_DAT   0x24
00091 #define IDENT_OLD_BIN   0x26
00092 
00093 #define IDENT_NEW_TEL   0x61    // MEMO  TEL  NEW DB
00094 #define IDENT_NEW_SCD   0x62    // MEMO  SCDL NEW DB
00095 #define IDENT_NEW_NOT   0x64    // MEMO  NOTE NEW DB
00096 #define IDENT_NEW_CRD   0x6A    // BASIC RAM Card IN
00097 #define IDENT_OLD_MEM   0x6E    // MEM OLD DB, all Tables
00098 
00099 #define IDENT_NEW_BAS   0x70
00100 #define IDENT_NEW_PAS   0x71
00101 #define IDENT_EXT_BAS   0x72
00102 #define IDENT_EXT_PAS   0x73
00103 #define IDENT_NEW_DAT   0x74    // IDENT_DATA_VAR 0xEF removed
00104 #define IDENT_NEW_BIN   0x76
00105 #define IDENT_NEW_CSL   0x7A    // CASL or CAP-X CMT
00106 #define IDENT_UNKNOWN   0x100
00107 
00108 #define IDENT_ST        0x124   /* SuperTape */
00109 
00110 #define IDENT_PC16_CAS  0x00    /* PC-1600 ASCII Data or BASIC Image */
00111 #define IDENT_PC16_DAT  0x08    /* Special binary data format PC-1600 */
00112 #define IDENT_E_ASC     0x04    /* ASCII Data or Text Modus BASIC/ASM/C Source */
00113 #define IDENT_E_BAS     0x02    /* Return from Bas2Img also in the format of PC-1475 */
00114 #define IDENT_E_BIN     0x01    /* Binary Data, use --addr parameter 2nd time for entry address */
00115                                 /* also used for Rsv-Data, but different sub id (mode 2) */
00116 #define SYNC_E_HEAD     40      /* additional sync for E-series header block */
00117 #define SYNC_E_DATA     20      /* additional sync for E-series data block */
00118 
00119 #define DATA_HEAD_LEN   5       /* length of the header of a data variable element*/
00120 #define DATA_VARIABLE   0xFE00  /* Header element of standard variable, not length */
00121 #define DATA_DBL_LEN    14      /* length of a double numeric data variable element */
00122 #define DATA_STD_LEN    8       /* length of a numeric and standard data variable element*/
00123 #define DATA_NUM_15     0x88    /* ItemLen = Id of numeric data variable of PC-1500 */
00124 
00125 #define DATA_NUM        0x98    /* Internal identity of numeric data variable */
00126 #define DATA_STR        0xA8    /* Internal identity of a string data variable */
00127 #define DATA_UNKNOWN    0x00    /* Variable filled with zeros */
00128 
00129 #define DATA_STD_STR    0xF5    /* Standard data variable is a string */
00130 #define DATA_EOF        0x0F    /* End of variable Data Block */
00131 
00132 #define EOF_ASC         0x1A    /* End of ASCII transfered files, also CAS: of newer series */
00133 #define EOF_15          0x55    /* End of complete file of PC-1500 */
00134 #define BAS_1500_EOF    0xFF    /* one of two bytes */
00135 #define BAS_NEW_EOF     0xFF    /* one of two bytes */
00136 #define BAS_OLD_EOF     0xF0    /* one byte only */
00137 
00138 #define BLK_OLD_SUM     8       /* Transmission Block (plus checksums), old series bas without, data old/new with checksum reset */
00139 #define BLK_OLD         80      /* Transmission Block (plus checksums) of PC-1500 and old series with checksum reset */
00140 #define BLK_NEW         120     /* Transmission Block (plus checksum) of new series 1260-1475 */
00141 #define BLK_E_DAT       256     /* Checksum of series E500 DAT */
00142 #define BLK_E_HEAD      0x30    /* Length of header1 of series E500, next only after the end of a Transmission Block */
00143 #define BLK_S_HEAD      25      /* Length of SuperTape Header without checksum */
00144 
00145 #define SUPT_HEAD_L     26      /* SuperTape length of header block with low byte of checksum included */
00146 #define SUPT_SYN_NB     64      /* SuperTape number of synchronisation char */
00147 #define SUPT_SYNC       0x16    /* SuperTape SYNCHR synchronisation char */
00148 #define SUPT_HEAD       0x2A    /* SuperTape SYNPGM start mark of header block */
00149 #define SUPT_DATA       0xC5    /* SuperTape SYNDAT start mark of program/data block */
00150 #define SUPT_END        0x9B    /* SuperTape end mark after the checksum of a block */
00151 #define SUPT_FLAGS      0x00    /* SuperTape flag byte */
00152 
00153 #define BGNSAMPLES      44      /* first sample byte */
00154 
00155 #define AMP_MID         0x80    /* Sample value for silence (all 8-bit) */
00156 #define AMP_HIGH        0xDA    /* Sample value for amplitude HIGH */
00157 #define AMP_LOW         0x26    /* Sample value for amplitude LOW */
00158 #define AMP_HIGH_E      0xFC    /* Sample value for amplitude HIGH for E-series */
00159 #define AMP_LOW_E       0x04    /* Sample value for amplitude LOW for E-series */
00160 #define AMP_HIGH_121    0xEF    /* Sample value for amplitude HIGH for CE-121 */
00161 #define AMP_LOW_121     0x11    /* Sample value for amplitude LOW for CE-121 */
00162 
00163 #define ORDER_STD       0
00164 #define ORDER_INV       1
00165 #define ORDER_S         8       /* SuperTape Byte */
00166 #define ORDER_E         9       /* 1600-Series and newer, no nibbles, a byte */
00167 #define ORDER_Q         11      /* Quick-Tape PC-1500a byte */
00168 
00169 #define BASE_FREQ1      4000
00170 #define BASE_FREQ2      2500    /* PC-1500 */
00171 #define BASE_FREQ3      3000    /* PC-E-series and newer */
00172 #define BASE_FREQ4      5000    /* Quick-Tape */
00173 #define BASE_FREQS      3600    /* SuperTape */
00174 
00175 #define CHAR_SPACE      0x20
00176 #define CHAR_DOT        0x2E
00177 #define CHAR_COLON      0x3A
00178 #ifdef __linux__                /* path separator */
00179    #define CHAR_SLASH   0x2F
00180 //elif defined __APPLE__
00181 #endif
00182 #ifdef __APPLE__
00183    #define CHAR_SLASH   0x2F
00184 #endif
00185 #ifndef CHAR_SLASH              /* Windows path separator */
00186    #define CHAR_SLASH   0x5C
00187 #endif
00188 #define CHAR_UNDERSCORE 0x5F
00189 
00190 #define cVL             80      /* Constant value for max. length of a data variable */
00191 #define cLL             512     /* Constant value for max. length of CFG-TEXT lines and max. CFG line Nb */
00192 #define cLPF            100     /* Constant value for max. Length of PathFilenames */
00193 
00194 #define BAS_EOF_INCL  0x200000 /* debug flag for one included End Mark from Bas2img or Wav2bin */
00195 #define DATA_W2B150     0x8000 /* debug flag for DAT-IMG from Wav2bin 1.5.0 or older */
00196 #define NO_FILE_HEAD    0x4000 /* debug flag, write without file type and -name, 2.variable block */
00197 #define BAS_EXT_FRMT    0x1000 /* debug flag, use FORMAT of BAS_EXT for E-Series */
00198 #define SYNCL_STD       0x400  /* debug flag, for default sync length like the original */
00199 #define SYNCL_TRM       0x200  /* debug flag, for sync length like the Technical Reference Manual */
00200 
00201 #define MODE_B22        0   /* PC-1500 */
00202 #define MODE_B21        1
00203 #define MODE_B20        2
00204 #define MODE_B19        3   /* Old series */
00205 #define MODE_B17        4
00206 #define MODE_B16        5   /* File names of new series an data */
00207 #define MODE_B15        6   /* Variable data body new series */
00208 #define MODE_B14        7   /* PC-1403 and newer, reads also B13 */
00209 #define MODE_B13        8   /* PC-1402 */
00210 #define MODE_B9         9   /* PC-E series and newer */
00211 #define MODE_B10        10  /* SuperTape */
00212 #define MODE_B11        11  /* Quick-Tape */
00213 
00214 
00215 ///////////////////////////////////////
00216 // bin-2-wav typedefs
00217 typedef struct {
00218     // FILE*  ptrFd ;  /* FILE NOT USED HERE */
00219     uint  ident ;
00220     uchar  mode ;       /* Bit writing mode and stop bits*/
00221     uchar  mode_h ;     /* Bit writing mode and stop bits for the file header*/
00222     ulong  nbSync1 ;    /* sync bits per second */
00223     ulong  nbSync ;     /* sync bits for intermediate syncs */
00224     ulong  nbByte ;     /* size of bytes to write */
00225     ulong  total ;      /* total bytes written (without checksums) */
00226     long   total_diff ; /* difference between bytes read and written (without checksums) */
00227     ulong  count ;      /* Counter of bytes in a block for the checksum */
00228     ulong  sum ;        /* Checksum calculated */
00229     ulong  block_len ;  /* Block length for checksum, variable used for E-Series */
00230     ulong  usedat_len ; /* Length of useful data of the next block 1...(0x50), for Qtape L:0...4F */
00231     ulong  bitLen ;     /* Wave sample blocks per SHARP bit */
00232      bool  lastSmpHigh; /* for SuperTape phase switching */
00233     ulong  debug ;
00234 } FileInfo ;  
00235 
00236 typedef struct {
00237     uint  stopb1 ;
00238     uint  stopb2 ;
00239 } ModeInfo ;
00240 
00241 extern FileInfo  fileInfo ; // extern, for other modules too
00242 
00243 ///////////////////////////////////////
00244 // static variables
00245 static ModeInfo Mode[] = { /* stop bits of first and second nibble */
00246     { 6, 6 }, { 5, 6 }, { 5, 5 }, { 4, 5 },
00247     { 1, 6 }, { 1, 5 }, { 1, 4 }, { 1, 3 }, { 1, 2 }
00248 } ;
00249 
00250 static bool bitMirroring = false ;
00251 
00252 const static char CodeOld[] = {
00253     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
00254     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
00255     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
00256     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
00257     0x11,0x14,0x12,0x15,0x18,0x16,0x1F,0x11, // Pos. 0x24 $ 0x19 -> 0x18, 11/2020
00258     0x30,0x31,0x37,0x35,0x1B,0x36,0x4A,0x38,
00259     0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
00260     0x48,0x49,0x1D,0x1C,0x33,0x34,0x32,0x13,
00261     0x1E,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
00262     0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
00263     0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
00264     0x68,0x69,0x6A,0x11,0x11,0x11,0x39,0x11,
00265     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
00266     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
00267     0x19,0x11,0x1A,0x11,0x11,0x11,0x11,0x11,
00268     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11
00269 } ;
00270 
00271 
00272 ////////////////////////////////////////////////////////////////////////////////
00273 // published method
00274 int sharp_fileloop ( FileInfo*  ptrFile ) ;
00275 int FileSend ( void );
00276 
00277 // From Pocket Tools
00278 int WriteSaveNameToWav (char*  ptrName,
00279                         uchar  mode);
00280 int WriteFooterToMemoWav ( void );
00281 int WriteSyncToWav (ulong  nbSync);
00282 int WriteByteSumToWav (ulong  value,
00283                        uchar  order,
00284                        uchar  mode);
00285 int WriteByteSumToWav (ulong  value,
00286                        uchar  order,
00287                        uchar  mode);
00288 
00289 #endif // SEND_PC1403