Fabio Fumi
/
send_to_sharp
Renamed
send_pc1403.cpp@5:062962db7a48, 2022-03-29 (annotated)
- 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?
User | Revision | Line number | New 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 |