Renamed

Dependencies:   mbed

Committer:
ffxx68
Date:
Tue Mar 29 10:06:20 2022 +0000
Revision:
5:062962db7a48
Parent:
2:dff96be9617e
Receiving the file through serial port

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ffxx68 0:07819bc70660 1 #include "send_pc1403.h"
ffxx68 0:07819bc70660 2
ffxx68 0:07819bc70660 3 ///////////////////////////////////////////////////////
ffxx68 0:07819bc70660 4 // variables from PocketTools code
ffxx68 0:07819bc70660 5 uint SHCc = 0 , /* Read not from bin, but from Transfile PC plus SHC-format (header included) */
ffxx68 0:07819bc70660 6 SHCe = 0 ; /* End marks are the SHC Basic image included only*/
ffxx68 0:07819bc70660 7 uint QTc = 0 ; /* Write to Quick-Tape wave format */
ffxx68 0:07819bc70660 8 uint STc = 0 ; /* Header of SuperTape or file header of PC-1600 format is in the image included */
ffxx68 0:07819bc70660 9 uint TAPc = 0 ; /* Write not to wave format but to emulator tap format (raw bytes)*/
ffxx68 0:07819bc70660 10 uint Qcnt = 0 ; /* Quiet, minimal output */
ffxx68 0:07819bc70660 11 uint Scnt = 0 ; /* Number of sync parameters or sync and sync spaces was defined */
ffxx68 0:07819bc70660 12 uint Acnt = 0 ; /* Number of address parameters, non standard load or entry addresses */
ffxx68 0:07819bc70660 13 uint Mcnt = 0 ; /* Read header parameter from a file */
ffxx68 0:07819bc70660 14
ffxx68 0:07819bc70660 15 double speed = 1.00 ; /* Used it for modified Pocket Computer with a CPU Speed Up switched on */
ffxx68 0:07819bc70660 16
ffxx68 0:07819bc70660 17 ulong pcId = 1500 ; /* ID number of the pocket computer */
ffxx68 0:07819bc70660 18 ushort pcgrpId = IDENT_UNKNOWN ;
ffxx68 0:07819bc70660 19 // ulong pcAddr = 0 ; /* PC-specific address, used for the end of variable data of PCs with DB-tables */
ffxx68 0:07819bc70660 20 bool cnvstr_upr = false ; /* Convert strings to upper, for Pokecon with SML-key not */
ffxx68 0:07819bc70660 21 bool type_asm = false ; /* Image contains assembler source code (subtype), true for CASL and CAP-X */
ffxx68 0:07819bc70660 22 // TODO (mr#2#): Count all warnings and errors
ffxx68 0:07819bc70660 23 ulong err_cnt = 0 ; /* counts minor errors */
ffxx68 0:07819bc70660 24 ulong wrn_cnt = 0 ; /* counts warnings */
ffxx68 0:07819bc70660 25
ffxx68 5:062962db7a48 26 FileInfo fileInfo ; /* File information */
ffxx68 5:062962db7a48 27
ffxx68 0:07819bc70660 28 ////////////////////////////////////////////////////////////////////////////////
ffxx68 0:07819bc70660 29 // WriteBitToWav replaced from PocketTools version (writing to a WAV file)
ffxx68 0:07819bc70660 30 // Here we send directly signals to OUT lines
ffxx68 5:062962db7a48 31 int WriteBitToWav (int value)
ffxx68 0:07819bc70660 32 {
ffxx68 1:9289febf4ae9 33 // Calling the buffered bit-sending routine
ffxx68 1:9289febf4ae9 34 switch ( value ) {
ffxx68 1:9289febf4ae9 35 case 1:
ffxx68 1:9289febf4ae9 36 if ( bitWaitSend ( value, 0 ) > MAX_BIT_TIME_ERR )
ffxx68 1:9289febf4ae9 37 return ( ERR_NOK ) ;
ffxx68 1:9289febf4ae9 38 break;
ffxx68 1:9289febf4ae9 39 case 0:
ffxx68 1:9289febf4ae9 40 if ( bitWaitSend ( value, 0 ) > MAX_BIT_TIME_ERR )
ffxx68 1:9289febf4ae9 41 return ( ERR_NOK ) ;
ffxx68 1:9289febf4ae9 42 break;
ffxx68 1:9289febf4ae9 43 default:
ffxx68 1:9289febf4ae9 44 break;
ffxx68 1:9289febf4ae9 45 }
ffxx68 1:9289febf4ae9 46
ffxx68 1:9289febf4ae9 47 return ( ERR_OK ) ;
ffxx68 0:07819bc70660 48 }
ffxx68 0:07819bc70660 49
ffxx68 0:07819bc70660 50 ////////////////////////////////////////////////////////////////////////////////
ffxx68 0:07819bc70660 51 // Write* methods taken from Pocket-Tools source code
ffxx68 0:07819bc70660 52 // https://www.peil-partner.de/ifhe.de/sharp/
ffxx68 0:07819bc70660 53 int WriteQuaterToWav (uint value,
ffxx68 5:062962db7a48 54 uint stopBits)
ffxx68 0:07819bc70660 55 {
ffxx68 0:07819bc70660 56 uint tmp ;
ffxx68 0:07819bc70660 57 uint ii ;
ffxx68 0:07819bc70660 58 int error ;
ffxx68 0:07819bc70660 59
ffxx68 5:062962db7a48 60 // if (TAPc > 0) return (WriteQuaterToTap (value )); // no
ffxx68 1:9289febf4ae9 61
ffxx68 0:07819bc70660 62 do {
ffxx68 1:9289febf4ae9 63
ffxx68 5:062962db7a48 64 error = WriteBitToWav (0 ) ;
ffxx68 0:07819bc70660 65 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 66
ffxx68 0:07819bc70660 67 for ( ii = 0 ; ii < 4 ; ++ii ) {
ffxx68 0:07819bc70660 68 tmp = 1 << ii ;
ffxx68 0:07819bc70660 69 if ( (value & tmp) == 0 )
ffxx68 5:062962db7a48 70 error = WriteBitToWav (0 ) ;
ffxx68 0:07819bc70660 71 else
ffxx68 5:062962db7a48 72 error = WriteBitToWav (1 ) ;
ffxx68 0:07819bc70660 73
ffxx68 0:07819bc70660 74 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 75 }
ffxx68 0:07819bc70660 76 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 77
ffxx68 0:07819bc70660 78 for ( ii = 0 ; ii < stopBits ; ++ii ) {
ffxx68 5:062962db7a48 79 error = WriteBitToWav (1 ) ;
ffxx68 0:07819bc70660 80 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 81 }
ffxx68 0:07819bc70660 82 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 83
ffxx68 0:07819bc70660 84 } while (0) ;
ffxx68 0:07819bc70660 85 return (error);
ffxx68 0:07819bc70660 86 }
ffxx68 0:07819bc70660 87
ffxx68 0:07819bc70660 88 int WriteByteToWav (ulong value,
ffxx68 0:07819bc70660 89 uchar order,
ffxx68 5:062962db7a48 90 uchar mode)
ffxx68 0:07819bc70660 91 {
ffxx68 0:07819bc70660 92 uint lsq ;
ffxx68 0:07819bc70660 93 uint msq ;
ffxx68 0:07819bc70660 94 int error ;
ffxx68 0:07819bc70660 95
ffxx68 5:062962db7a48 96 // if (TAPc > 0) return (WriteByteToTap (value, order )) ; // no
ffxx68 0:07819bc70660 97
ffxx68 5:062962db7a48 98 // if (order == ORDER_E) return (WriteByteToEWav (value )) ; // no 1403
ffxx68 0:07819bc70660 99
ffxx68 0:07819bc70660 100 do {
ffxx68 0:07819bc70660 101 lsq = value & 0x0F ;
ffxx68 0:07819bc70660 102 msq = (value >> 4) & 0x0F ;
ffxx68 0:07819bc70660 103 if (order == ORDER_INV) {
ffxx68 5:062962db7a48 104 error = WriteQuaterToWav (lsq, Mode[mode].stopb1 ) ;
ffxx68 0:07819bc70660 105 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 106 error = WriteQuaterToWav (msq, Mode[mode].stopb2 ) ;
ffxx68 0:07819bc70660 107 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 108 }
ffxx68 0:07819bc70660 109 else {
ffxx68 5:062962db7a48 110 error = WriteQuaterToWav (msq, Mode[mode].stopb1 ) ;
ffxx68 0:07819bc70660 111 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 112 error = WriteQuaterToWav (lsq, Mode[mode].stopb2 ) ;
ffxx68 0:07819bc70660 113 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 114 }
ffxx68 0:07819bc70660 115
ffxx68 0:07819bc70660 116 } while (0) ;
ffxx68 0:07819bc70660 117 return (error);
ffxx68 0:07819bc70660 118 }
ffxx68 0:07819bc70660 119
ffxx68 5:062962db7a48 120 int CheckSumB1 ( ulong Byte )
ffxx68 0:07819bc70660 121 {
ffxx68 0:07819bc70660 122 ushort sum ;
ffxx68 0:07819bc70660 123
ffxx68 0:07819bc70660 124 /* Update the checksum */
ffxx68 5:062962db7a48 125 sum = fileInfo.sum + ((Byte & 0xF0) >> 4) ;
ffxx68 0:07819bc70660 126 if (sum > 0xFF) {
ffxx68 0:07819bc70660 127 ++sum ;
ffxx68 0:07819bc70660 128 sum &= 0xFF ;
ffxx68 0:07819bc70660 129 }
ffxx68 5:062962db7a48 130 fileInfo.sum = (sum + (Byte & 0x0F)) & 0xFF ;
ffxx68 0:07819bc70660 131
ffxx68 0:07819bc70660 132 return (0);
ffxx68 0:07819bc70660 133 }
ffxx68 0:07819bc70660 134
ffxx68 0:07819bc70660 135
ffxx68 5:062962db7a48 136 int CheckSumE ( ulong Byte
ffxx68 5:062962db7a48 137 // ulong* ptrSum
ffxx68 5:062962db7a48 138 )
ffxx68 0:07819bc70660 139 {
ffxx68 0:07819bc70660 140 uint tmp, ii ;
ffxx68 0:07819bc70660 141
ffxx68 0:07819bc70660 142 /* Update the checksum */
ffxx68 0:07819bc70660 143 tmp = 0x80 ;
ffxx68 0:07819bc70660 144 for ( ii = 0 ; ii < 8 ; ++ii, tmp >>= 1 )
ffxx68 0:07819bc70660 145 if ( (Byte & tmp) != 0 )
ffxx68 0:07819bc70660 146 // ++ *ptrSum ;
ffxx68 5:062962db7a48 147 ++ fileInfo.sum ;
ffxx68 0:07819bc70660 148
ffxx68 0:07819bc70660 149 return (0);
ffxx68 0:07819bc70660 150 }
ffxx68 0:07819bc70660 151
ffxx68 0:07819bc70660 152
ffxx68 5:062962db7a48 153 int WriteSyncToWav (ulong nbSync )
ffxx68 0:07819bc70660 154 {
ffxx68 0:07819bc70660 155 ulong ii ;
ffxx68 0:07819bc70660 156 int error = ERR_OK ;
ffxx68 0:07819bc70660 157
ffxx68 0:07819bc70660 158 if (TAPc > 0) return (ERR_OK); // no
ffxx68 0:07819bc70660 159
ffxx68 0:07819bc70660 160 do {
ffxx68 0:07819bc70660 161 /* Write the Synchro patern */
ffxx68 0:07819bc70660 162 for ( ii = 0 ; ii < nbSync ; ++ii ) {
ffxx68 5:062962db7a48 163 error = WriteBitToWav (1 ) ;
ffxx68 0:07819bc70660 164 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 165 }
ffxx68 0:07819bc70660 166 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 167
ffxx68 0:07819bc70660 168 } while (0) ;
ffxx68 0:07819bc70660 169 return (error);
ffxx68 0:07819bc70660 170 }
ffxx68 0:07819bc70660 171
ffxx68 1:9289febf4ae9 172 int WriteUsedatLenToQTWav ( uchar order, /* Quick-Tape incomplete blocks with fill data */
ffxx68 5:062962db7a48 173 uchar mode )
ffxx68 1:9289febf4ae9 174 { long tmpL ;
ffxx68 1:9289febf4ae9 175 int error ;
ffxx68 1:9289febf4ae9 176
ffxx68 5:062962db7a48 177 tmpL = fileInfo.nbByte - fileInfo.total_diff - fileInfo.total ; //not for IDENT_QT_DAT: variable block in RAM based
ffxx68 1:9289febf4ae9 178
ffxx68 1:9289febf4ae9 179 if (tmpL > 0) {
ffxx68 1:9289febf4ae9 180 if (tmpL > BLK_OLD) tmpL = BLK_OLD ;
ffxx68 1:9289febf4ae9 181 --tmpL ;
ffxx68 5:062962db7a48 182 if (tmpL < BLK_OLD -1) fileInfo.usedat_len = tmpL + 1 ;
ffxx68 5:062962db7a48 183 else fileInfo.usedat_len = 0 ; /* L:0x4F ignored, no effect */
ffxx68 1:9289febf4ae9 184
ffxx68 5:062962db7a48 185 error = WriteByteToWav (tmpL, order, mode ) ;
ffxx68 1:9289febf4ae9 186 if (error != ERR_OK) return (error) ;
ffxx68 5:062962db7a48 187 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG (L:%02X)", (uint) tmpL);
ffxx68 1:9289febf4ae9 188
ffxx68 5:062962db7a48 189 fileInfo.sum = tmpL ;
ffxx68 1:9289febf4ae9 190 }
ffxx68 1:9289febf4ae9 191 else if (tmpL == 0 ) error = ERR_OK ;
ffxx68 1:9289febf4ae9 192 else {
ffxx68 1:9289febf4ae9 193 printf(" WUsedatLQT: End of file was expected");
ffxx68 1:9289febf4ae9 194 error = ERR_FMT ;
ffxx68 1:9289febf4ae9 195 }
ffxx68 5:062962db7a48 196 fileInfo.count = 0 ;
ffxx68 1:9289febf4ae9 197
ffxx68 1:9289febf4ae9 198 return (error);
ffxx68 1:9289febf4ae9 199 }
ffxx68 1:9289febf4ae9 200
ffxx68 1:9289febf4ae9 201 int WriteByteSumToWav (ulong value,
ffxx68 1:9289febf4ae9 202 uchar order,
ffxx68 5:062962db7a48 203 uchar mode)
ffxx68 1:9289febf4ae9 204 {
ffxx68 1:9289febf4ae9 205 int error ;
ffxx68 1:9289febf4ae9 206 bool writ_full_block = false ;
ffxx68 1:9289febf4ae9 207
ffxx68 1:9289febf4ae9 208 do {
ffxx68 1:9289febf4ae9 209
ffxx68 5:062962db7a48 210 if ( (fileInfo.debug & 0x0040) > 0)
ffxx68 1:9289febf4ae9 211 debug_printf(" %02X", (uchar) value);
ffxx68 5:062962db7a48 212 error = WriteByteToWav (value, order, mode ) ;
ffxx68 1:9289febf4ae9 213 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 214
ffxx68 5:062962db7a48 215 if (mode == MODE_B22 || mode == MODE_B11) fileInfo.sum += value ;
ffxx68 5:062962db7a48 216 else if (mode == MODE_B9 || mode == MODE_B10) CheckSumE (value ) ; //ptrFile
ffxx68 5:062962db7a48 217 else CheckSumB1 (value ) ;
ffxx68 1:9289febf4ae9 218
ffxx68 5:062962db7a48 219 ++fileInfo.count ;
ffxx68 5:062962db7a48 220 if (!writ_full_block) ++fileInfo.total ;
ffxx68 1:9289febf4ae9 221
ffxx68 5:062962db7a48 222 if ( fileInfo.usedat_len > 0) { /* QTape incomplete block */
ffxx68 5:062962db7a48 223 if (--fileInfo.usedat_len == 0) {
ffxx68 5:062962db7a48 224 if ( ( (fileInfo.debug & 0x0040) > 0 ) && (Qcnt == 0) ) debug_printf("DEBUG Fill data:");
ffxx68 1:9289febf4ae9 225 value = 0x00 ;
ffxx68 1:9289febf4ae9 226 writ_full_block = true ;
ffxx68 1:9289febf4ae9 227 }
ffxx68 1:9289febf4ae9 228 }
ffxx68 1:9289febf4ae9 229
ffxx68 1:9289febf4ae9 230 switch (mode) {
ffxx68 1:9289febf4ae9 231 case MODE_B22 :
ffxx68 5:062962db7a48 232 if ( fileInfo.count >= BLK_OLD ) {
ffxx68 1:9289febf4ae9 233
ffxx68 5:062962db7a48 234 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 235 debug_printf(" (%04X)\n\r", (uint) fileInfo.sum);
ffxx68 1:9289febf4ae9 236
ffxx68 1:9289febf4ae9 237 /* Write the checksum */
ffxx68 5:062962db7a48 238 error = WriteByteToWav (fileInfo.sum >> 8 & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 239 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 240 error = WriteByteToWav (fileInfo.sum & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 241 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 242
ffxx68 5:062962db7a48 243 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 244 fileInfo.sum = 0 ;
ffxx68 1:9289febf4ae9 245 }
ffxx68 1:9289febf4ae9 246 break ;
ffxx68 1:9289febf4ae9 247
ffxx68 1:9289febf4ae9 248 case MODE_B21 :
ffxx68 1:9289febf4ae9 249 case MODE_B20 :
ffxx68 1:9289febf4ae9 250 case MODE_B19 :
ffxx68 5:062962db7a48 251 if ( (fileInfo.count % BLK_OLD_SUM) == 0) {
ffxx68 1:9289febf4ae9 252
ffxx68 5:062962db7a48 253 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 254 debug_printf(" (%02X)\n\r", (uchar) fileInfo.sum);
ffxx68 1:9289febf4ae9 255
ffxx68 1:9289febf4ae9 256 /* Write the checksum */
ffxx68 5:062962db7a48 257 error = WriteByteToWav (fileInfo.sum, order, mode ) ;
ffxx68 1:9289febf4ae9 258 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 259
ffxx68 5:062962db7a48 260 if ( fileInfo.count >= BLK_OLD ) {
ffxx68 5:062962db7a48 261 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 262 fileInfo.sum = 0 ;
ffxx68 5:062962db7a48 263 // if (pcgrpId==IDENT_PC1211) error = WriteSyncToWav (1803 ) ; //DATA not
ffxx68 5:062962db7a48 264 if (fileInfo.ident == IDENT_PC1211) /* default 1803 bits, data not */
ffxx68 5:062962db7a48 265 error = WriteSyncToWav (fileInfo.nbSync ) ;
ffxx68 1:9289febf4ae9 266 }
ffxx68 1:9289febf4ae9 267 }
ffxx68 1:9289febf4ae9 268 break ;
ffxx68 1:9289febf4ae9 269
ffxx68 1:9289febf4ae9 270 case MODE_B17 :
ffxx68 1:9289febf4ae9 271 case MODE_B16 :
ffxx68 1:9289febf4ae9 272 case MODE_B15 :
ffxx68 5:062962db7a48 273 if ( fileInfo.count >= BLK_OLD_SUM) {
ffxx68 1:9289febf4ae9 274
ffxx68 5:062962db7a48 275 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 276 debug_printf(" (%02X)\n\r", (uchar) fileInfo.sum);
ffxx68 1:9289febf4ae9 277
ffxx68 1:9289febf4ae9 278 /* Write the checksum */
ffxx68 5:062962db7a48 279 error = WriteByteToWav (fileInfo.sum, order, mode) ;
ffxx68 1:9289febf4ae9 280 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 281
ffxx68 5:062962db7a48 282 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 283 fileInfo.sum = 0 ;
ffxx68 1:9289febf4ae9 284 }
ffxx68 1:9289febf4ae9 285 break ;
ffxx68 1:9289febf4ae9 286
ffxx68 1:9289febf4ae9 287 case MODE_B14 :
ffxx68 1:9289febf4ae9 288 case MODE_B13 :
ffxx68 5:062962db7a48 289 if ( fileInfo.count >= BLK_NEW ) {
ffxx68 1:9289febf4ae9 290
ffxx68 5:062962db7a48 291 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 292 debug_printf(" *(%02X)", (uchar) fileInfo.sum);
ffxx68 1:9289febf4ae9 293
ffxx68 1:9289febf4ae9 294 /* Write the checksum */
ffxx68 5:062962db7a48 295 error = WriteByteToWav (fileInfo.sum, order, mode ) ;
ffxx68 1:9289febf4ae9 296 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 297
ffxx68 5:062962db7a48 298 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 299 fileInfo.sum = 0 ;
ffxx68 1:9289febf4ae9 300 }
ffxx68 1:9289febf4ae9 301 break ;
ffxx68 1:9289febf4ae9 302
ffxx68 1:9289febf4ae9 303 case MODE_B9 : /* PC-E/G/1600 */
ffxx68 5:062962db7a48 304 if ( fileInfo.count >= fileInfo.block_len ) {
ffxx68 1:9289febf4ae9 305
ffxx68 5:062962db7a48 306 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 307 debug_printf(" (%04X)\n\r", (uint) fileInfo.sum & 0xFFFF);
ffxx68 1:9289febf4ae9 308
ffxx68 1:9289febf4ae9 309 /* Write the checksum */
ffxx68 5:062962db7a48 310 error = WriteByteToWav (fileInfo.sum >> 8 & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 311 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 312 error = WriteByteToWav (fileInfo.sum & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 313 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 314
ffxx68 5:062962db7a48 315 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 316 fileInfo.sum = 0 ;
ffxx68 1:9289febf4ae9 317 }
ffxx68 1:9289febf4ae9 318 break ;
ffxx68 1:9289febf4ae9 319
ffxx68 1:9289febf4ae9 320 case MODE_B10 : /* SuperTape */
ffxx68 5:062962db7a48 321 if ( fileInfo.count >= fileInfo.block_len ) {
ffxx68 1:9289febf4ae9 322
ffxx68 5:062962db7a48 323 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 324 debug_printf(" (%04X)", (uint) fileInfo.sum & 0xFFFF);
ffxx68 1:9289febf4ae9 325
ffxx68 1:9289febf4ae9 326 /* Write the checksum */
ffxx68 5:062962db7a48 327 error = WriteByteToWav (fileInfo.sum & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 328 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 329 error = WriteByteToWav (fileInfo.sum >> 8 & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 330 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 331
ffxx68 5:062962db7a48 332 if ( (fileInfo.debug & 0x0040) > 0) debug_printf(" %02X", (uchar) SUPT_END);
ffxx68 5:062962db7a48 333 error = WriteByteToWav (SUPT_END, order, mode ) ;
ffxx68 1:9289febf4ae9 334 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 335
ffxx68 5:062962db7a48 336 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 337 fileInfo.sum = 0 ;
ffxx68 1:9289febf4ae9 338 }
ffxx68 1:9289febf4ae9 339 break ;
ffxx68 1:9289febf4ae9 340
ffxx68 1:9289febf4ae9 341 case MODE_B11 :
ffxx68 5:062962db7a48 342 if ( fileInfo.count >= BLK_OLD ) {
ffxx68 1:9289febf4ae9 343
ffxx68 5:062962db7a48 344 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 345 debug_printf(" (%04X)\n\r", (uint) fileInfo.sum);
ffxx68 1:9289febf4ae9 346 /* Write the checksum */
ffxx68 5:062962db7a48 347 error = WriteByteToWav (fileInfo.sum >> 8 & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 348 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 349 error = WriteByteToWav (fileInfo.sum & 0xFF, order, mode ) ;
ffxx68 1:9289febf4ae9 350 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 351
ffxx68 5:062962db7a48 352 error = WriteByteToWav (EOF_15, order, mode ) ;
ffxx68 1:9289febf4ae9 353 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 354 if ( (fileInfo.debug & 0x0040) > 0) debug_printf(" (E:%02X)", (uint) EOF_15);
ffxx68 1:9289febf4ae9 355 writ_full_block = false ;
ffxx68 1:9289febf4ae9 356
ffxx68 5:062962db7a48 357 error = WriteSyncToWav (50 ) ; /* 0.02 s */
ffxx68 1:9289febf4ae9 358 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 359 error = WriteUsedatLenToQTWav (order, mode ) ;
ffxx68 1:9289febf4ae9 360 }
ffxx68 1:9289febf4ae9 361 break ;
ffxx68 1:9289febf4ae9 362
ffxx68 1:9289febf4ae9 363 default :
ffxx68 1:9289febf4ae9 364 debug_printf ("%s: Unknown Mode\n", argP) ;
ffxx68 1:9289febf4ae9 365 break ;
ffxx68 1:9289febf4ae9 366 }
ffxx68 1:9289febf4ae9 367
ffxx68 1:9289febf4ae9 368 } while (writ_full_block) ;
ffxx68 1:9289febf4ae9 369
ffxx68 1:9289febf4ae9 370 return (error);
ffxx68 1:9289febf4ae9 371 }
ffxx68 1:9289febf4ae9 372
ffxx68 0:07819bc70660 373 ulong SwapByte (ulong byte)
ffxx68 0:07819bc70660 374 {
ffxx68 0:07819bc70660 375 return ( (byte >> 4) + (byte << 4 & 0xF0) );
ffxx68 0:07819bc70660 376 }
ffxx68 0:07819bc70660 377
ffxx68 0:07819bc70660 378 /* File name for New and Old BASIC */
ffxx68 0:07819bc70660 379 int WriteSaveNameToWav (char* ptrName,
ffxx68 5:062962db7a48 380 uchar mode)
ffxx68 0:07819bc70660 381 {
ffxx68 0:07819bc70660 382 uint ii ;
ffxx68 0:07819bc70660 383 uint tmpL ;
ffxx68 0:07819bc70660 384 char byte ;
ffxx68 0:07819bc70660 385 char tmpS[20] ;
ffxx68 0:07819bc70660 386 int error ;
ffxx68 0:07819bc70660 387
ffxx68 5:062962db7a48 388 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG ptrName %s\n\r", ptrName);
ffxx68 0:07819bc70660 389
ffxx68 0:07819bc70660 390 do {
ffxx68 0:07819bc70660 391 /* Uppercase the name is done in main if needed */
ffxx68 0:07819bc70660 392 // tmpL = strlen (ptrName) ;
ffxx68 0:07819bc70660 393 for (ii = 0; ii < cLPF-1 && ptrName[ii] != '\0'; ii++) ;
ffxx68 0:07819bc70660 394 tmpL = ii;
ffxx68 0:07819bc70660 395
ffxx68 0:07819bc70660 396 if (tmpL > 7)
ffxx68 0:07819bc70660 397 tmpL = 7 ;
ffxx68 0:07819bc70660 398
ffxx68 0:07819bc70660 399 for ( ii = 0 ; ii < tmpL ; ++ii )
ffxx68 0:07819bc70660 400 tmpS[ii] = ptrName[ii] ;
ffxx68 0:07819bc70660 401
ffxx68 0:07819bc70660 402 tmpS[tmpL] = 0 ;
ffxx68 1:9289febf4ae9 403 //if (Qcnt == 0) debug_printf ("Save name : %s\n", tmpS) ;
ffxx68 0:07819bc70660 404 // strncpy( ptrName, tmpS, cLPF-1) ;
ffxx68 0:07819bc70660 405 for (ii = 0; ii < cLPF-1 && ptrName[ii] != '\0'; ii++)
ffxx68 0:07819bc70660 406 tmpS[ii] = ptrName[ii];
ffxx68 0:07819bc70660 407 /* crash?
ffxx68 0:07819bc70660 408 for ( ; ii < cLPF-1; ii++)
ffxx68 0:07819bc70660 409 tmpS[ii] = '\0';
ffxx68 0:07819bc70660 410 */
ffxx68 0:07819bc70660 411 tmpL = 7 - tmpL ;
ffxx68 0:07819bc70660 412 for ( ii = 0 ; ii < tmpL ; ++ii )
ffxx68 0:07819bc70660 413 tmpS[ii] = 0 ;
ffxx68 0:07819bc70660 414
ffxx68 5:062962db7a48 415 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG tmpS %s\n\r", tmpS);
ffxx68 0:07819bc70660 416 for ( ii = tmpL ; ii < 7 ; ++ii ) {
ffxx68 0:07819bc70660 417 byte = (ulong) ptrName[6 - ii] ;
ffxx68 0:07819bc70660 418
ffxx68 0:07819bc70660 419 switch (mode) {
ffxx68 0:07819bc70660 420 case MODE_B19 :
ffxx68 0:07819bc70660 421 case MODE_B20 :
ffxx68 0:07819bc70660 422
ffxx68 0:07819bc70660 423 if (byte < 0x80)
ffxx68 5:062962db7a48 424 byte = (char)CodeOld[byte] ;
ffxx68 0:07819bc70660 425 else
ffxx68 5:062962db7a48 426 byte = (char)CodeOld[0] ;
ffxx68 0:07819bc70660 427 break ;
ffxx68 0:07819bc70660 428
ffxx68 0:07819bc70660 429 default :
ffxx68 0:07819bc70660 430
ffxx68 0:07819bc70660 431 if (byte >= 0x80)
ffxx68 0:07819bc70660 432 byte = 0x20 ;
ffxx68 0:07819bc70660 433 break ;
ffxx68 0:07819bc70660 434 }
ffxx68 0:07819bc70660 435 tmpS[ii] = (char) SwapByte(byte) ;
ffxx68 0:07819bc70660 436 }
ffxx68 0:07819bc70660 437 tmpS[7] = 0x5F ;
ffxx68 0:07819bc70660 438
ffxx68 0:07819bc70660 439 /* Write the Name */
ffxx68 5:062962db7a48 440 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 441 fileInfo.sum = 0 ;
ffxx68 0:07819bc70660 442 for ( ii = 0 ; ii < 8 ; ++ii ) {
ffxx68 5:062962db7a48 443 error = WriteByteSumToWav (tmpS[ii], ORDER_STD, mode ) ;
ffxx68 0:07819bc70660 444 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 445 }
ffxx68 0:07819bc70660 446
ffxx68 5:062962db7a48 447 if (fileInfo.ident == IDENT_PC1211)
ffxx68 5:062962db7a48 448 error = WriteSyncToWav (151 ) ;
ffxx68 5:062962db7a48 449 else if (fileInfo.ident == IDENT_PC121_DAT)
ffxx68 5:062962db7a48 450 error = WriteSyncToWav (111 ) ;
ffxx68 0:07819bc70660 451
ffxx68 5:062962db7a48 452 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 453 fileInfo.sum = 0 ;
ffxx68 0:07819bc70660 454
ffxx68 0:07819bc70660 455 } while (0) ;
ffxx68 0:07819bc70660 456 return (error);
ffxx68 0:07819bc70660 457 }
ffxx68 0:07819bc70660 458
ffxx68 0:07819bc70660 459 int DEBUGSaveNameToWav (char* ptrName,
ffxx68 5:062962db7a48 460 uchar mode)
ffxx68 0:07819bc70660 461 {
ffxx68 0:07819bc70660 462 uint ii ;
ffxx68 0:07819bc70660 463 uint i ;
ffxx68 0:07819bc70660 464 ulong byte ;
ffxx68 0:07819bc70660 465 ulong tmpL ;
ffxx68 0:07819bc70660 466 char tmpS[10] ;
ffxx68 0:07819bc70660 467 int error ;
ffxx68 0:07819bc70660 468
ffxx68 0:07819bc70660 469 do {
ffxx68 0:07819bc70660 470 /* Uppercase the name is done in main if needed */
ffxx68 0:07819bc70660 471 tmpL = strlen (ptrName) ;
ffxx68 1:9289febf4ae9 472 debug_printf("DEBUG tmpL %u\n\r", tmpL);
ffxx68 0:07819bc70660 473
ffxx68 0:07819bc70660 474 if (tmpL > 7)
ffxx68 0:07819bc70660 475 tmpL = 7 ;
ffxx68 0:07819bc70660 476
ffxx68 0:07819bc70660 477 for ( ii = 0 ; ii < tmpL ; ++ii ) {
ffxx68 1:9289febf4ae9 478 debug_printf("DEBUG ptrName[ii] %c\n\r", ptrName[ii]);
ffxx68 0:07819bc70660 479 tmpS[ii] = ptrName[ii] ;
ffxx68 0:07819bc70660 480 }
ffxx68 0:07819bc70660 481 tmpS[tmpL] = 0 ;
ffxx68 1:9289febf4ae9 482 //if (Qcnt == 0) debug_printf ("Save name : %s\n", tmpS) ;
ffxx68 1:9289febf4ae9 483 debug_printf("DEBUG ptrName %s\n\r", ptrName);
ffxx68 1:9289febf4ae9 484 debug_printf("DEBUG i 1 ");
ffxx68 0:07819bc70660 485
ffxx68 0:07819bc70660 486 // strncpy( ptrName, tmpS, cLPF-1) ;
ffxx68 0:07819bc70660 487 for (i = 0; i < cLPF-1 && ptrName[i] != '\0'; i++) {
ffxx68 1:9289febf4ae9 488 debug_printf("%u ", i);
ffxx68 0:07819bc70660 489 tmpS[i] = ptrName[i];
ffxx68 0:07819bc70660 490 }
ffxx68 1:9289febf4ae9 491 debug_printf("\n\rDEBUG i 2 ");
ffxx68 0:07819bc70660 492 /* crash?
ffxx68 0:07819bc70660 493 for ( ; i < cLPF-1; i++) {
ffxx68 1:9289febf4ae9 494 debug_printf("%u ", i);
ffxx68 0:07819bc70660 495 tmpS[i] = '\0';
ffxx68 0:07819bc70660 496 }
ffxx68 0:07819bc70660 497 */
ffxx68 1:9289febf4ae9 498 debug_printf("\n\rDEBUG tmpS %s\n\r", tmpS);
ffxx68 0:07819bc70660 499 tmpL = 7 - tmpL ;
ffxx68 0:07819bc70660 500 for ( ii = 0 ; ii < tmpL ; ++ii )
ffxx68 0:07819bc70660 501 tmpS[ii] = 0 ;
ffxx68 1:9289febf4ae9 502 debug_printf("DEBUG tmpS %s\n\r", tmpS);
ffxx68 0:07819bc70660 503
ffxx68 0:07819bc70660 504 /* reverse-order bytes */
ffxx68 0:07819bc70660 505 for ( ii = tmpL ; ii < 7 ; ++ii ) {
ffxx68 0:07819bc70660 506 byte = (ulong) ptrName[6 - ii] ;
ffxx68 1:9289febf4ae9 507 debug_printf("DEBUG byte %u\n\r", byte);
ffxx68 0:07819bc70660 508
ffxx68 0:07819bc70660 509 switch (mode) {
ffxx68 0:07819bc70660 510 case MODE_B19 :
ffxx68 0:07819bc70660 511 case MODE_B20 :
ffxx68 0:07819bc70660 512
ffxx68 0:07819bc70660 513 if (byte < 0x80)
ffxx68 5:062962db7a48 514 byte = (char)CodeOld[byte] ;
ffxx68 0:07819bc70660 515 else
ffxx68 5:062962db7a48 516 byte = (char)CodeOld[0] ;
ffxx68 0:07819bc70660 517 break ;
ffxx68 0:07819bc70660 518
ffxx68 0:07819bc70660 519 default :
ffxx68 0:07819bc70660 520
ffxx68 0:07819bc70660 521 if (byte >= 0x80)
ffxx68 0:07819bc70660 522 byte = 0x20 ;
ffxx68 0:07819bc70660 523 break ;
ffxx68 0:07819bc70660 524 }
ffxx68 0:07819bc70660 525 tmpS[ii] = (char) SwapByte(byte) ;
ffxx68 0:07819bc70660 526 }
ffxx68 0:07819bc70660 527 tmpS[7] = 0x5F ;
ffxx68 1:9289febf4ae9 528 debug_printf("DEBUG ii %u\n\r", ii);
ffxx68 0:07819bc70660 529
ffxx68 0:07819bc70660 530 /* Write the Name */
ffxx68 5:062962db7a48 531 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 532 fileInfo.sum = 0 ;
ffxx68 0:07819bc70660 533 for ( ii = 0 ; ii < 8 ; ++ii ) {
ffxx68 5:062962db7a48 534 error = WriteByteSumToWav (tmpS[ii], ORDER_STD, mode ) ;
ffxx68 0:07819bc70660 535 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 536 }
ffxx68 5:062962db7a48 537 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG Name - Bytes was printed swapped.\n\r");
ffxx68 0:07819bc70660 538
ffxx68 5:062962db7a48 539 if (fileInfo.ident == IDENT_PC1211)
ffxx68 5:062962db7a48 540 error = WriteSyncToWav (151 ) ;
ffxx68 5:062962db7a48 541 else if (fileInfo.ident == IDENT_PC121_DAT)
ffxx68 5:062962db7a48 542 error = WriteSyncToWav (111 ) ;
ffxx68 0:07819bc70660 543
ffxx68 5:062962db7a48 544 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 545 fileInfo.sum = 0 ;
ffxx68 0:07819bc70660 546
ffxx68 0:07819bc70660 547 } while (0) ;
ffxx68 0:07819bc70660 548 return (error);
ffxx68 0:07819bc70660 549 }
ffxx68 0:07819bc70660 550
ffxx68 0:07819bc70660 551 /* Head of Binary Data for New and Old series */
ffxx68 0:07819bc70660 552 int WriteHeadToBinWav (ulong addr,
ffxx68 0:07819bc70660 553 ulong size,
ffxx68 5:062962db7a48 554 uchar mode)
ffxx68 0:07819bc70660 555 {
ffxx68 0:07819bc70660 556 int ii ;
ffxx68 0:07819bc70660 557 ulong len ;
ffxx68 0:07819bc70660 558 ulong tmpL ;
ffxx68 0:07819bc70660 559 int error ;
ffxx68 0:07819bc70660 560
ffxx68 0:07819bc70660 561 do {
ffxx68 0:07819bc70660 562 /* if (Qcnt == 0)
ffxx68 0:07819bc70660 563 {
ffxx68 1:9289febf4ae9 564 debug_printf ("Start Address: 0x%04X\n", (uint) addr);
ffxx68 1:9289febf4ae9 565 debug_printf ("End Address: 0x%04X, Length: %d bytes\n", (uint) (addr + size -1), (uint) size);
ffxx68 0:07819bc70660 566 }
ffxx68 0:07819bc70660 567 */
ffxx68 0:07819bc70660 568
ffxx68 5:062962db7a48 569 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 570 fileInfo.sum = 0 ;
ffxx68 0:07819bc70660 571 for ( ii = 0 ; ii < 4 ; ++ii ) {
ffxx68 5:062962db7a48 572 error = WriteByteSumToWav (0, ORDER_STD, mode ) ;
ffxx68 0:07819bc70660 573 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 574 }
ffxx68 0:07819bc70660 575
ffxx68 0:07819bc70660 576 /* Write the address, this method is necessary because of swapped checksums in the header. */
ffxx68 0:07819bc70660 577 tmpL = ((addr >> 4) & 0xF0) + (addr >> 12) ; /* H swapped */
ffxx68 5:062962db7a48 578 error = WriteByteSumToWav (tmpL, ORDER_STD, mode ) ;
ffxx68 0:07819bc70660 579 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 580
ffxx68 0:07819bc70660 581 tmpL = ((addr << 4) & 0xF0) + ((addr >> 4) & 0x0F) ;/* L swapped */
ffxx68 5:062962db7a48 582 error = WriteByteSumToWav (tmpL, ORDER_STD, mode ) ;
ffxx68 0:07819bc70660 583 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 584
ffxx68 0:07819bc70660 585 /* Write the Length */
ffxx68 0:07819bc70660 586 len = size - 1 ;
ffxx68 0:07819bc70660 587 tmpL = ((len >> 4) & 0xF0) + (len >> 12) ;
ffxx68 5:062962db7a48 588 error = WriteByteSumToWav (tmpL, ORDER_STD, mode ) ;
ffxx68 0:07819bc70660 589 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 590
ffxx68 0:07819bc70660 591 tmpL = ((len << 4) & 0xF0) + ((len >> 4) & 0x0F) ;
ffxx68 5:062962db7a48 592 error = WriteByteSumToWav (tmpL, ORDER_STD, mode ) ;
ffxx68 0:07819bc70660 593 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 594
ffxx68 5:062962db7a48 595 fileInfo.count = 0 ;
ffxx68 5:062962db7a48 596 fileInfo.sum = 0 ;
ffxx68 0:07819bc70660 597
ffxx68 0:07819bc70660 598 } while (0) ;
ffxx68 0:07819bc70660 599 return (error);
ffxx68 0:07819bc70660 600 }
ffxx68 0:07819bc70660 601
ffxx68 5:062962db7a48 602 int WriteFooterToNewWav ( void )
ffxx68 0:07819bc70660 603 {
ffxx68 2:dff96be9617e 604 int error ;
ffxx68 0:07819bc70660 605
ffxx68 0:07819bc70660 606 do {
ffxx68 5:062962db7a48 607 fileInfo.count = 0 ; /* no checksum writing from here until the end */
ffxx68 0:07819bc70660 608
ffxx68 5:062962db7a48 609 error = WriteByteSumToWav(BAS_NEW_EOF, ORDER_STD, fileInfo.mode ) ;
ffxx68 5:062962db7a48 610 // error = WriteByteSumToB13Wav (BAS_NEW_EOF ) ;
ffxx68 0:07819bc70660 611 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 612
ffxx68 5:062962db7a48 613 error = WriteByteToWav(BAS_NEW_EOF, ORDER_STD, fileInfo.mode ) ;
ffxx68 0:07819bc70660 614 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 615
ffxx68 5:062962db7a48 616 if ( (fileInfo.debug & 0x00C0) > 0 )
ffxx68 1:9289febf4ae9 617 debug_printf(" EOF:%02X", (uchar) BAS_NEW_EOF);
ffxx68 0:07819bc70660 618
ffxx68 5:062962db7a48 619 error = WriteByteToWav(fileInfo.sum, ORDER_STD, fileInfo.mode ) ;
ffxx68 0:07819bc70660 620 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 621
ffxx68 5:062962db7a48 622 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 623 debug_printf(" (%02X)", (uchar) fileInfo.sum);
ffxx68 0:07819bc70660 624
ffxx68 0:07819bc70660 625 /* there are 2bits more HIGH at the end of transmission (at least for PC-1402) M. NOSSWITZ */
ffxx68 5:062962db7a48 626 error = WriteBitToWav (1 ) ;
ffxx68 0:07819bc70660 627 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 628
ffxx68 5:062962db7a48 629 error = WriteBitToWav (1 ) ;
ffxx68 0:07819bc70660 630 if (error != ERR_OK) break ;
ffxx68 2:dff96be9617e 631
ffxx68 0:07819bc70660 632 /* This puts 2 bits of silence (or 2 HIGH bits alternatively) to the end of the wave file. */
ffxx68 0:07819bc70660 633 /* CLOAD does not accept any sound, that could be interpreted as a start bit, */
ffxx68 0:07819bc70660 634 /* during post-processing. Original CSAVE switches the signal low ms after the */
ffxx68 0:07819bc70660 635 /* end of transmission, before the motor of the cassette recorder is switched off. */
ffxx68 0:07819bc70660 636 /* This level out is visible in the CSAVE audio signal after the last bit. T. Muecker */
ffxx68 2:dff96be9617e 637 /* not needed for the MBed direct-write version
ffxx68 5:062962db7a48 638 error = WriteBitToWav (3 ) ; 125us High ,
ffxx68 5:062962db7a48 639 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 640 error = WriteBitToWav (2 ) ; 1 ms Midsignal
ffxx68 0:07819bc70660 641 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 642 */
ffxx68 5:062962db7a48 643
ffxx68 5:062962db7a48 644 } while (0) ;
ffxx68 5:062962db7a48 645 return (error);
ffxx68 5:062962db7a48 646 }
ffxx68 5:062962db7a48 647
ffxx68 5:062962db7a48 648 int WriteFooterToMemoWav ( void )
ffxx68 5:062962db7a48 649 {
ffxx68 5:062962db7a48 650 int error ;
ffxx68 5:062962db7a48 651
ffxx68 5:062962db7a48 652 do {
ffxx68 5:062962db7a48 653 error = WriteByteToWav(fileInfo.sum, ORDER_STD, fileInfo.mode ) ;
ffxx68 5:062962db7a48 654 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 655
ffxx68 5:062962db7a48 656 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 657 debug_printf(" (%02X)", (uchar) fileInfo.sum);
ffxx68 5:062962db7a48 658
ffxx68 5:062962db7a48 659 error = WriteBitToWav (1 ) ;
ffxx68 5:062962db7a48 660 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 661
ffxx68 5:062962db7a48 662 error = WriteBitToWav (1 ) ;
ffxx68 5:062962db7a48 663 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 664
ffxx68 5:062962db7a48 665 /* This puts 2 bits of silence (or 2 HIGH bits alternatively) to the end of the wave file. */
ffxx68 5:062962db7a48 666 /* not needed for the MBed send version
ffxx68 5:062962db7a48 667 error = WriteBitToWav (3 ) ;
ffxx68 5:062962db7a48 668 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 669
ffxx68 5:062962db7a48 670 error = WriteBitToWav (2 ) ;
ffxx68 0:07819bc70660 671 if (error != ERR_OK) break ;
ffxx68 1:9289febf4ae9 672 */
ffxx68 0:07819bc70660 673
ffxx68 0:07819bc70660 674 } while (0) ;
ffxx68 0:07819bc70660 675 return (error);
ffxx68 0:07819bc70660 676 }
ffxx68 0:07819bc70660 677
ffxx68 0:07819bc70660 678
ffxx68 5:062962db7a48 679 // File completion check
ffxx68 5:062962db7a48 680 bool isFileSendComplete ( void ) {
ffxx68 5:062962db7a48 681 #ifdef FILE_BUF_SIZE
ffxx68 5:062962db7a48 682 return ( isFilePullComplete() ) ;
ffxx68 5:062962db7a48 683 #else
ffxx68 5:062962db7a48 684 return ( file_pos == BIN_FILE_SIZE - 1 ) ;
ffxx68 5:062962db7a48 685 #endif
ffxx68 5:062962db7a48 686 }
ffxx68 0:07819bc70660 687
ffxx68 5:062962db7a48 688 // Input file data access, depends on build
ffxx68 5:062962db7a48 689 char fileGetNext ( void ) {
ffxx68 5:062962db7a48 690 // byte = fgetc (srcFd) ; // DOS / UNIX file - not applicable here
ffxx68 5:062962db7a48 691 #ifdef FILE_BUF_SIZE
ffxx68 5:062962db7a48 692 return ( filePullData () ) ;
ffxx68 5:062962db7a48 693 #else
ffxx68 5:062962db7a48 694 return ( bin_file_bytes[file_pos++] );
ffxx68 5:062962db7a48 695 #endif
ffxx68 0:07819bc70660 696 }
ffxx68 0:07819bc70660 697
ffxx68 5:062962db7a48 698
ffxx68 0:07819bc70660 699 /////////////////////////////////////////////////////////////////////////////
ffxx68 5:062962db7a48 700 // file-send implementation, largely inspired to Pocket-Tools source code
ffxx68 5:062962db7a48 701 int FileSend ( void )
ffxx68 0:07819bc70660 702 {
ffxx68 5:062962db7a48 703
ffxx68 5:062962db7a48 704 int pcId = PC_ID; // hardcoded for PC-1403 here
ffxx68 5:062962db7a48 705 uint32_t nbSync = N_SYNC_BITS;
ffxx68 5:062962db7a48 706 int ii;
ffxx68 0:07819bc70660 707 uchar type ;
ffxx68 0:07819bc70660 708 uint32_t nbByte;
ffxx68 0:07819bc70660 709 uint32_t addr;
ffxx68 0:07819bc70660 710 int error ;
ffxx68 5:062962db7a48 711 char inVal;
ffxx68 0:07819bc70660 712
ffxx68 5:062962db7a48 713 fileInfo.nbSync = nbSync;
ffxx68 5:062962db7a48 714 #ifndef FILE_BUF_SIZE
ffxx68 5:062962db7a48 715 file_pos = 0;
ffxx68 5:062962db7a48 716 #endif
ffxx68 0:07819bc70660 717
ffxx68 5:062962db7a48 718 switch (fileInfo.ident) {
ffxx68 0:07819bc70660 719 /* . . .*/
ffxx68 0:07819bc70660 720 case IDENT_NEW_BIN :
ffxx68 0:07819bc70660 721 pcgrpId = GRP_NEW ; /*or GRP_EXT */
ffxx68 0:07819bc70660 722 type = TYPE_BIN ;
ffxx68 0:07819bc70660 723 break ;
ffxx68 0:07819bc70660 724 /* . . .*/
ffxx68 0:07819bc70660 725 case IDENT_NEW_BAS :
ffxx68 0:07819bc70660 726 pcgrpId = GRP_NEW ;
ffxx68 0:07819bc70660 727 type = TYPE_IMG ;
ffxx68 0:07819bc70660 728 break ;
ffxx68 0:07819bc70660 729 default :
ffxx68 1:9289febf4ae9 730 debug_printf ("%s: Unknown Ident\n", argP) ;
ffxx68 0:07819bc70660 731 return (ERR_ARG);
ffxx68 0:07819bc70660 732 }
ffxx68 0:07819bc70660 733
ffxx68 0:07819bc70660 734 /* if (pcgrpId == GRP_E || pcgrpId == GRP_G || pcgrpId == GRP_16) {
ffxx68 0:07819bc70660 735 . . .
ffxx68 0:07819bc70660 736 }
ffxx68 0:07819bc70660 737 else { // PC-1211 to PC-1500, QTape
ffxx68 0:07819bc70660 738 */
ffxx68 5:062962db7a48 739 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG WriteSyncToWav\n\r");
ffxx68 5:062962db7a48 740 error = WriteSyncToWav (nbSync ) ;
ffxx68 0:07819bc70660 741 /*
ffxx68 0:07819bc70660 742 . . .
ffxx68 0:07819bc70660 743 */
ffxx68 0:07819bc70660 744 if (error != ERR_OK) return ( error ) ;
ffxx68 0:07819bc70660 745
ffxx68 0:07819bc70660 746 switch (pcId) {
ffxx68 0:07819bc70660 747 /*
ffxx68 0:07819bc70660 748 . . .
ffxx68 0:07819bc70660 749 */
ffxx68 0:07819bc70660 750 case 1403:
ffxx68 0:07819bc70660 751 /* if (type == TYPE_BIN && Acnt==0 && SHCc==0 && addr==0) */ addr = TYPE_BIN_ADDR;
ffxx68 0:07819bc70660 752 /*
ffxx68 0:07819bc70660 753 . . .
ffxx68 0:07819bc70660 754 */
ffxx68 0:07819bc70660 755 break;
ffxx68 0:07819bc70660 756 default :
ffxx68 5:062962db7a48 757 debug_printf ("%s: Sharp PC-%d not implemented\n", argP, pcId) ;
ffxx68 0:07819bc70660 758 // MoreInfo (ERR_ARG);
ffxx68 0:07819bc70660 759 error = ERR_ARG ;
ffxx68 0:07819bc70660 760 // break ;
ffxx68 0:07819bc70660 761 }
ffxx68 0:07819bc70660 762 if (error != ERR_OK) return ( error ) ;
ffxx68 0:07819bc70660 763
ffxx68 0:07819bc70660 764 /* ...
ffxx68 0:07819bc70660 765 else { // PC-121x ... PC-1475
ffxx68 0:07819bc70660 766 */
ffxx68 5:062962db7a48 767 if ( (fileInfo.debug & 0x0040) > 0 )
ffxx68 5:062962db7a48 768 debug_printf("DEBUG set Header Mode (ident %d)\n\r", fileInfo.ident);
ffxx68 5:062962db7a48 769 switch (fileInfo.ident) { /* Header Mode */
ffxx68 0:07819bc70660 770 case IDENT_PC1211 :
ffxx68 5:062962db7a48 771 fileInfo.mode = fileInfo.mode_h = MODE_B20 ;
ffxx68 0:07819bc70660 772 break ;
ffxx68 0:07819bc70660 773
ffxx68 0:07819bc70660 774 case IDENT_PC121_DAT :
ffxx68 0:07819bc70660 775 case IDENT_OLD_BAS :
ffxx68 0:07819bc70660 776 case IDENT_OLD_DAT :
ffxx68 0:07819bc70660 777 case IDENT_OLD_BIN :
ffxx68 0:07819bc70660 778 case IDENT_OLD_MEM :
ffxx68 5:062962db7a48 779 fileInfo.mode = fileInfo.mode_h = MODE_B19 ;
ffxx68 0:07819bc70660 780 break ;
ffxx68 0:07819bc70660 781
ffxx68 0:07819bc70660 782 case IDENT_NEW_TEL :
ffxx68 0:07819bc70660 783 case IDENT_NEW_SCD :
ffxx68 0:07819bc70660 784 case IDENT_NEW_NOT :
ffxx68 0:07819bc70660 785 case IDENT_NEW_CRD :
ffxx68 0:07819bc70660 786
ffxx68 0:07819bc70660 787 case IDENT_NEW_CSL :
ffxx68 0:07819bc70660 788
ffxx68 0:07819bc70660 789 case IDENT_NEW_BAS :
ffxx68 0:07819bc70660 790 case IDENT_EXT_BAS :
ffxx68 0:07819bc70660 791 case IDENT_NEW_DAT :
ffxx68 0:07819bc70660 792 case IDENT_NEW_BIN :
ffxx68 5:062962db7a48 793 fileInfo.mode = fileInfo.mode_h = MODE_B16 ;
ffxx68 0:07819bc70660 794 break ;
ffxx68 0:07819bc70660 795
ffxx68 0:07819bc70660 796 default :
ffxx68 1:9289febf4ae9 797 debug_printf ("%s: Unknown Ident\n", argP) ;
ffxx68 5:062962db7a48 798 fileInfo.mode = fileInfo.mode_h = MODE_B21 ;
ffxx68 0:07819bc70660 799 return (ERR_ARG);
ffxx68 0:07819bc70660 800 }
ffxx68 5:062962db7a48 801 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG Header fileInfo.mode_h %u\n\r",fileInfo.mode_h);
ffxx68 0:07819bc70660 802
ffxx68 0:07819bc70660 803 /* Write the TAPE code */
ffxx68 5:062962db7a48 804 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG Write the TAPE code\n\r");
ffxx68 5:062962db7a48 805 error = WriteByteToWav ( (ulong) fileInfo.ident, ORDER_STD, fileInfo.mode_h ) ;
ffxx68 0:07819bc70660 806 if (error != ERR_OK) return ( error ) ;
ffxx68 0:07819bc70660 807
ffxx68 0:07819bc70660 808 /* Write the Name */
ffxx68 5:062962db7a48 809 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG Writing Name...\n\r");
ffxx68 5:062962db7a48 810 error = WriteSaveNameToWav ( "NONAME", fileInfo.mode_h ) ; // NOT USING FILENAME !!
ffxx68 5:062962db7a48 811 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG error (ERR_OK) %d (%d)\n\r", error, ERR_OK);
ffxx68 0:07819bc70660 812 if (error != ERR_OK) return ( error ) ;
ffxx68 5:062962db7a48 813
ffxx68 5:062962db7a48 814 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG set Body Data Mode\n\r");
ffxx68 5:062962db7a48 815 switch (fileInfo.ident) { /* Body Data Mode */
ffxx68 0:07819bc70660 816 case IDENT_PC1211 :
ffxx68 5:062962db7a48 817 fileInfo.mode = MODE_B20 ;
ffxx68 0:07819bc70660 818 break ;
ffxx68 0:07819bc70660 819
ffxx68 0:07819bc70660 820 case IDENT_PC121_DAT :
ffxx68 0:07819bc70660 821 case IDENT_OLD_BAS :
ffxx68 0:07819bc70660 822 case IDENT_OLD_BIN :
ffxx68 0:07819bc70660 823 case IDENT_OLD_MEM :
ffxx68 5:062962db7a48 824 fileInfo.mode = MODE_B19 ;
ffxx68 0:07819bc70660 825 break ;
ffxx68 0:07819bc70660 826
ffxx68 0:07819bc70660 827 case IDENT_OLD_DAT :
ffxx68 0:07819bc70660 828 case IDENT_NEW_DAT :
ffxx68 5:062962db7a48 829 fileInfo.mode = MODE_B15 ;
ffxx68 0:07819bc70660 830 break ;
ffxx68 0:07819bc70660 831
ffxx68 0:07819bc70660 832 case IDENT_EXT_BAS :
ffxx68 0:07819bc70660 833
ffxx68 0:07819bc70660 834 case IDENT_NEW_BAS :
ffxx68 0:07819bc70660 835 case IDENT_NEW_CSL :
ffxx68 0:07819bc70660 836
ffxx68 0:07819bc70660 837 case IDENT_NEW_TEL :
ffxx68 0:07819bc70660 838 case IDENT_NEW_SCD :
ffxx68 0:07819bc70660 839 case IDENT_NEW_NOT :
ffxx68 0:07819bc70660 840 case IDENT_NEW_CRD :
ffxx68 0:07819bc70660 841 case IDENT_NEW_BIN :
ffxx68 0:07819bc70660 842 // TODO (mr#2#): Check whitch MODE_B13 or _B14
ffxx68 5:062962db7a48 843 if (cnvstr_upr && pcId < 1440) fileInfo.mode = MODE_B13 ; /*older part of new series*/
ffxx68 5:062962db7a48 844 else fileInfo.mode = MODE_B14 ; /*new series and extended series*/
ffxx68 0:07819bc70660 845 break ;
ffxx68 0:07819bc70660 846
ffxx68 0:07819bc70660 847 default :
ffxx68 1:9289febf4ae9 848 debug_printf ("%s: Unknown Ident\n", argP) ;
ffxx68 0:07819bc70660 849 return ( ERR_ARG );
ffxx68 0:07819bc70660 850 }
ffxx68 5:062962db7a48 851 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG Body fileInfo.mode %u\n\r", fileInfo.mode);
ffxx68 0:07819bc70660 852
ffxx68 5:062962db7a48 853 fileInfo.total = 0 ; /* count bytes of body only */
ffxx68 0:07819bc70660 854
ffxx68 5:062962db7a48 855 switch (fileInfo.ident) { /* header was written, write all data now */
ffxx68 0:07819bc70660 856 /* ...
ffxx68 0:07819bc70660 857 case
ffxx68 0:07819bc70660 858 ... */
ffxx68 0:07819bc70660 859 case IDENT_NEW_BAS :
ffxx68 0:07819bc70660 860 case IDENT_NEW_CSL :
ffxx68 0:07819bc70660 861 case IDENT_EXT_BAS :
ffxx68 5:062962db7a48 862 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG Writing data...\n\r");
ffxx68 0:07819bc70660 863 /* Write the datas */
ffxx68 5:062962db7a48 864 // info.mode = MODE_B13 ; /* PC-1403 and newer should be MODE_14 */
ffxx68 0:07819bc70660 865 /* the older simple algorithm seems to work as well, but this is now, what the PC does originally */
ffxx68 5:062962db7a48 866 while ( !isFileSendComplete() ) {
ffxx68 5:062962db7a48 867 inVal = fileGetNext();
ffxx68 5:062962db7a48 868 if ( inVal == EOF ) break ; // ending if
ffxx68 0:07819bc70660 869 if ( inVal == BAS_NEW_EOF ) {
ffxx68 5:062962db7a48 870 if (fileInfo.count + 1 == BLK_NEW && fileInfo.sum == 0xE1) { /* Constellation will generate 2-times BAS_NEW_EOF */
ffxx68 5:062962db7a48 871 printf ("\nERROR %i at %lu. byte, usually the low byte of a BASIC line number\n", ERR_SUM, fileInfo.total) ;
ffxx68 0:07819bc70660 872 printf ("This binary constellation activates the CLOAD bug of this series. The line\n") ;
ffxx68 0:07819bc70660 873 printf ("number must be changed or minor changes done in the BASIC text before.\n") ;
ffxx68 0:07819bc70660 874 /* Seldom Bug in CLOAD, for PC-1402/(01) at known ROM address: 40666 */
ffxx68 5:062962db7a48 875 if ((fileInfo.debug & 0x800) == 0 ) {
ffxx68 0:07819bc70660 876 error = ERR_SUM ;
ffxx68 0:07819bc70660 877 break ;
ffxx68 0:07819bc70660 878 }
ffxx68 0:07819bc70660 879 }
ffxx68 0:07819bc70660 880 }
ffxx68 5:062962db7a48 881 error = WriteByteSumToWav ( (uint) inVal, ORDER_STD, fileInfo.mode ) ;
ffxx68 0:07819bc70660 882 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 883 }
ffxx68 0:07819bc70660 884 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 885 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("\n\rDEBUG ii %u\n\r", ii);
ffxx68 0:07819bc70660 886
ffxx68 5:062962db7a48 887 inVal = fileGetNext(); /* Read the last byte before EOF mark */
ffxx68 5:062962db7a48 888 if (inVal == EOF) break ;
ffxx68 0:07819bc70660 889 if (inVal == BAS_NEW_EOF) {
ffxx68 5:062962db7a48 890 /* EOF mark should not be included for this file type normally*/
ffxx68 5:062962db7a48 891 if (Qcnt == 0) printf ("End of File mark %i should not be included in the image\n", inVal) ;
ffxx68 5:062962db7a48 892 /* if end of block, then an additional checksum would be written, but this does work anyhow */
ffxx68 0:07819bc70660 893 }
ffxx68 0:07819bc70660 894 else {
ffxx68 5:062962db7a48 895 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG last byte: %02X\n\r", (uchar) inVal);
ffxx68 5:062962db7a48 896 error = WriteByteToWav ( (uint) inVal, ORDER_STD, fileInfo.mode ) ;
ffxx68 0:07819bc70660 897 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 898 CheckSumB1 ((uint) inVal ) ; /* never write the checksum before BAS_NEW_EOF */
ffxx68 0:07819bc70660 899
ffxx68 5:062962db7a48 900 ++fileInfo.total ;
ffxx68 5:062962db7a48 901 ++fileInfo.count ; /* for debug purposes only, WriteFooter will reset it */
ffxx68 0:07819bc70660 902 }
ffxx68 0:07819bc70660 903
ffxx68 0:07819bc70660 904 /* Write the END code */
ffxx68 5:062962db7a48 905 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG WriteFooterToNewWav\n\r");
ffxx68 5:062962db7a48 906 error = WriteFooterToNewWav ( ) ;
ffxx68 0:07819bc70660 907
ffxx68 0:07819bc70660 908 break ; // IDENT_NEW_BAS, IDENT_EXT_BAS
ffxx68 0:07819bc70660 909
ffxx68 0:07819bc70660 910 case IDENT_NEW_BIN :
ffxx68 0:07819bc70660 911 /* Write the address and length */
ffxx68 5:062962db7a48 912 error = WriteHeadToBinWav (addr, nbByte, fileInfo.mode_h ) ;
ffxx68 0:07819bc70660 913 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 914 /* no break */
ffxx68 0:07819bc70660 915
ffxx68 0:07819bc70660 916 case IDENT_NEW_TEL :
ffxx68 0:07819bc70660 917 case IDENT_NEW_SCD :
ffxx68 0:07819bc70660 918 case IDENT_NEW_NOT :
ffxx68 0:07819bc70660 919 case IDENT_NEW_CRD :
ffxx68 0:07819bc70660 920
ffxx68 0:07819bc70660 921 /* Write the datas */
ffxx68 5:062962db7a48 922 while ( !isFileSendComplete() ) {
ffxx68 5:062962db7a48 923 inVal = fileGetNext();
ffxx68 5:062962db7a48 924 if (inVal == EOF ) break ; // premature ending shouldn't happen ...
ffxx68 0:07819bc70660 925
ffxx68 5:062962db7a48 926 error = WriteByteSumToWav ( (uint) inVal, ORDER_STD, fileInfo.mode ) ;
ffxx68 0:07819bc70660 927 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 928 }
ffxx68 0:07819bc70660 929 if (error != ERR_OK) break ;
ffxx68 0:07819bc70660 930
ffxx68 5:062962db7a48 931 inVal = fileGetNext();
ffxx68 0:07819bc70660 932 if (inVal == EOF) break ;
ffxx68 0:07819bc70660 933
ffxx68 5:062962db7a48 934 if ( (fileInfo.debug & 0x0040) > 0 ) debug_printf("DEBUG %02X", (uchar) inVal);
ffxx68 5:062962db7a48 935 error = WriteByteToWav ( (uint) inVal, ORDER_STD, fileInfo.mode ) ;
ffxx68 0:07819bc70660 936 if (error != ERR_OK) break ;
ffxx68 5:062962db7a48 937 CheckSumB1 ( (uint) inVal ) ; /* never write the checksum before BAS_NEW_EOF */
ffxx68 5:062962db7a48 938 ++fileInfo.total ;
ffxx68 5:062962db7a48 939 ++fileInfo.count ; /* for debug purposes only, WriteFooter will reset it */
ffxx68 0:07819bc70660 940
ffxx68 0:07819bc70660 941 /* Write the END code */
ffxx68 5:062962db7a48 942 if ( fileInfo.ident == IDENT_NEW_BIN) error = WriteFooterToNewWav ( ) ;
ffxx68 5:062962db7a48 943 else WriteFooterToMemoWav ( ) ;
ffxx68 0:07819bc70660 944
ffxx68 0:07819bc70660 945 break ; // IDENT_NEW_BIN and IDENT_NEW_Memos
ffxx68 0:07819bc70660 946 default:
ffxx68 0:07819bc70660 947 printf ("%s: Unknown Ident\n", argP) ;
ffxx68 0:07819bc70660 948 error = ERR_ARG;
ffxx68 0:07819bc70660 949 break;
ffxx68 0:07819bc70660 950 }
ffxx68 0:07819bc70660 951
ffxx68 0:07819bc70660 952 return (error);
ffxx68 0:07819bc70660 953
ffxx68 5:062962db7a48 954 }
ffxx68 5:062962db7a48 955