summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/orao_cas.cpp
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2020-12-06 19:04:05 +0100
committer Miodrag Milanovic <mmicko@gmail.com>2020-12-06 19:04:05 +0100
commit5e23dc37a8c3b454d7880967751cad748ee6828f (patch)
tree0056b6bf0dc8f3146c44ab3f781a650a34ae9cec /src/lib/formats/orao_cas.cpp
parentbb9f9d297d92906817ee5d00f4b3804a499a1577 (diff)
orao103: Support new TAP format and format now done properly
Diffstat (limited to 'src/lib/formats/orao_cas.cpp')
-rw-r--r--src/lib/formats/orao_cas.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/lib/formats/orao_cas.cpp b/src/lib/formats/orao_cas.cpp
index a9c3f7473d4..a6930e18d1f 100644
--- a/src/lib/formats/orao_cas.cpp
+++ b/src/lib/formats/orao_cas.cpp
@@ -11,16 +11,18 @@
#define ORAO_WAV_FREQUENCY 44100
-#define WAVE_HIGH -32768
-#define WAVE_LOW 0
+#define WAVE_HIGH -24576
+#define WAVE_LOW 24576
-#define ORAO_WAVE_ONE 24
-#define ORAO_WAVE_ZERO 11
+#define ORAO_WAVE_ONE 17
+#define ORAO_WAVE_ZERO 9
#define ORAO_HEADER_SIZE 360
static int16_t wave_data; // FIXME: global variables prevent multiple instances
-static int len;
+static int len;
+static int startpos;
+static bool newformat;
static void orao_output_wave( int16_t **buffer, int length ) {
if ( buffer == nullptr ) {
@@ -41,7 +43,13 @@ static int orao_cas_to_wav_size( const uint8_t *casdata, int caslen ) {
return -1;
}
size = 0;
- for (i=ORAO_HEADER_SIZE;i<caslen-ORAO_HEADER_SIZE;i++) {
+ startpos = 0;
+ newformat = true;
+ if (casdata[0]==0x68 && casdata[1]==0x01 && casdata[2]==0x00) {
+ startpos = ORAO_HEADER_SIZE;
+ newformat = false;
+ }
+ for (i=startpos;i<caslen-startpos;i++) {
for (j=0;j<8;j++) {
b = (casdata[i] >> j) & 1;
if (b==0) {
@@ -56,13 +64,14 @@ static int orao_cas_to_wav_size( const uint8_t *casdata, int caslen ) {
}
static int orao_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) {
- int i,j,size;
+ int i,j,size,k;
uint8_t b;
size = 0;
if (bytes == nullptr) return -1;
- for (i=ORAO_HEADER_SIZE;i<len-ORAO_HEADER_SIZE;i++) {
+ for (i=startpos;i<len-startpos;i++) {
for (j=0;j<8;j++) {
- b = (bytes[i] >> j) & 1;
+ k = newformat ? (7-j) : j;
+ b = (bytes[i] >> k) & 1;
if (b==0) {
wave_data = WAVE_LOW;
orao_output_wave(&buffer,ORAO_WAVE_ZERO);