diff --git a/src/lib/formats/ace_tap.cpp b/src/lib/formats/ace_tap.cpp index 1d64ca7a027..a2fa9fe8b80 100644 --- a/src/lib/formats/ace_tap.cpp +++ b/src/lib/formats/ace_tap.cpp @@ -12,6 +12,8 @@ For more information see: #include "ace_tap.h" +#include "multibyte.h" + #define SMPLO -32768 #define SILENCE 0 @@ -95,11 +97,8 @@ static int ace_handle_tap(int16_t *buffer, const uint8_t *casdata) while( data_pos < cas_size ) { - uint16_t block_size; - int i; - /* Handle a block of tape data */ - block_size = casdata[data_pos] + ( casdata[data_pos + 1] << 8 ); + uint16_t block_size = get_u16le( &casdata[data_pos] ); data_pos += 2; /* Make sure there are enough bytes left */ @@ -110,7 +109,7 @@ static int ace_handle_tap(int16_t *buffer, const uint8_t *casdata) sample_count += ace_tap_silence( buffer, sample_count, 2 * 44100 ); /* Add pilot tone samples: 4096 for header, 512 for data */ - for( i = ( block_size == 0x001A ) ? 4096 : 512; i; i-- ) + for( int i = ( block_size == 0x001A ) ? 4096 : 512; i; i-- ) sample_count += ace_tap_cycle( buffer, sample_count, 27, 27 ); /* Sync samples */ diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp index b210e3048fa..d342fb1c502 100644 --- a/src/lib/formats/acorn_dsk.cpp +++ b/src/lib/formats/acorn_dsk.cpp @@ -12,6 +12,7 @@ #include "imageutl.h" #include "ioprocs.h" +#include "multibyte.h" #include @@ -77,7 +78,7 @@ int acorn_ssd_format::find_size(util::random_read &io, uint32_t form_factor, con // read sector count from side 0 catalogue io.read_at(0x100, cat, 8, actual); - sectors0 = ((cat[6] & 3) << 8) + cat[7]; + sectors0 = get_u16be(&cat[6]) & 0x3ff; LOG_FORMATS("ssd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : ""); if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) @@ -86,12 +87,12 @@ int acorn_ssd_format::find_size(util::random_read &io, uint32_t form_factor, con { // read sector count from side 2 catalogue io.read_at((uint64_t)compute_track_size(f) * f.track_count + 0x100, cat, 8, actual); // sequential - sectors2 = ((cat[6] & 3) << 8) + cat[7]; + sectors2 = get_u16be(&cat[6]) & 0x3ff; // exception case for Acorn CP/M System Disc 1 io.read_at(0x367ec, cat, 8, actual); if (memcmp(cat, "/M ", 4) == 0) - sectors2 = ((cat[6] & 3) << 8) + cat[7]; + sectors2 = get_u16be(&cat[6]) & 0x3ff; LOG_FORMATS("ssd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : ""); } @@ -222,19 +223,19 @@ int acorn_dsd_format::find_size(util::random_read &io, uint32_t form_factor, con // read sector count from side 0 catalogue io.read_at(0x100, cat, 8, actual); - sectors0 = ((cat[6] & 3) << 8) + cat[7]; + sectors0 = get_u16be(&cat[6]) & 0x3ff; LOG_FORMATS("dsd: sector count 0: %d %s\n", sectors0, sectors0 % 10 != 0 ? "invalid" : ""); if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (sectors0 <= f.track_count * f.sector_count)) { // read sector count from side 2 catalogue io.read_at(0xb00, cat, 8, actual); // interleaved - sectors2 = ((cat[6] & 3) << 8) + cat[7]; + sectors2 = get_u16be(&cat[6]) & 0x3ff; // exception case for Acorn CP/M System Disc 1 io.read_at(0x97ec, cat, 8, actual); if (memcmp(cat, "/M ", 4) == 0) - sectors2 = ((cat[6] & 3) << 8) + cat[7]; + sectors2 = get_u16be(&cat[6]) & 0x3ff; LOG_FORMATS("dsd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : ""); @@ -313,7 +314,7 @@ int opus_ddos_format::find_size(util::random_read &io, uint32_t form_factor, con // read sector count from side 0 catalogue io.read_at(0x1000, cat, 8, actual); - sectors0 = (cat[1] << 8) + cat[2]; + sectors0 = get_u16be(&cat[1]); LOG_FORMATS("ddos: sector count 0: %d %s\n", sectors0, sectors0 % 18 != 0 ? "invalid" : ""); uint64_t size; @@ -335,7 +336,7 @@ int opus_ddos_format::find_size(util::random_read &io, uint32_t form_factor, con { // read sector count from side 2 catalogue io.read_at((uint64_t)compute_track_size(f) * f.track_count + 0x1000, cat, 8, actual); // sequential - sectors2 = (cat[1] << 8) + cat[2]; + sectors2 = get_u16be(&cat[1]); LOG_FORMATS("ddos: sector count 2: %d %s\n", sectors2, sectors2 % 18 != 0 ? "invalid" : ""); } else @@ -419,7 +420,7 @@ int acorn_adfs_old_format::find_size(util::random_read &io, uint32_t form_factor // read sector count from free space map io.read_at(0xfc, map, 3, actual); - sectors = map[0] + (map[1] << 8) + (map[2] << 16); + sectors = get_u24le(map); LOG_FORMATS("adfs_o: sector count %d %s\n", sectors, sectors % 16 != 0 ? "invalid" : ""); // read map identifier diff --git a/src/lib/formats/ap2_dsk.cpp b/src/lib/formats/ap2_dsk.cpp index 192a1dd3252..414f9ebd749 100644 --- a/src/lib/formats/ap2_dsk.cpp +++ b/src/lib/formats/ap2_dsk.cpp @@ -12,6 +12,7 @@ #include "basicdsk.h" #include "ioprocs.h" +#include "multibyte.h" #include #include @@ -347,7 +348,7 @@ bool a2_16sect_format::save(util::random_read_write &io, const std::vector>3] << 8) | data[(pos>>3)+1]) >> (8-(pos & 7)); + return get_u16be(&data[pos>>3]) >> (8-(pos & 7)); } bool a2_edd_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image *image) const diff --git a/src/lib/formats/ap_dsk35.cpp b/src/lib/formats/ap_dsk35.cpp index e899750334d..c786d7fb04a 100644 --- a/src/lib/formats/ap_dsk35.cpp +++ b/src/lib/formats/ap_dsk35.cpp @@ -99,11 +99,14 @@ *********************************************************************/ #include "ap_dsk35.h" -#include "imageutl.h" #include "ioprocs.h" +#include "multibyte.h" #include "opresolv.h" +#include "eminline.h" +#include "osdcore.h" // osd_printf_error + #include #include #include @@ -141,8 +144,8 @@ int dc42_format::identify(util::random_read &io, uint32_t form_factor, const std uint8_t h[0x54]; size_t actual; io.read_at(0, h, 0x54, actual); - uint32_t dsize = (h[0x40] << 24) | (h[0x41] << 16) | (h[0x42] << 8) | h[0x43]; - uint32_t tsize = (h[0x44] << 24) | (h[0x45] << 16) | (h[0x46] << 8) | h[0x47]; + uint32_t dsize = get_u32be(&h[0x40]); + uint32_t tsize = get_u32be(&h[0x44]); uint8_t encoding = h[0x50]; uint8_t format = h[0x51]; @@ -160,8 +163,8 @@ bool dc42_format::load(util::random_read &io, uint32_t form_factor, const std::v size_t actual; uint8_t h[0x54]; io.read_at(0, h, 0x54, actual); - int dsize = (h[0x40] << 24) | (h[0x41] << 16) | (h[0x42] << 8) | h[0x43]; - int tsize = (h[0x44] << 24) | (h[0x45] << 16) | (h[0x46] << 8) | h[0x47]; + int dsize = get_u32be(&h[0x40]); + int tsize = get_u32be(&h[0x44]); uint8_t encoding = h[0x50]; uint8_t format = h[0x51]; @@ -237,8 +240,8 @@ bool dc42_format::load(util::random_read &io, uint32_t form_factor, const std::v void dc42_format::update_chk(const uint8_t *data, int size, uint32_t &chk) { for(int i=0; i> 1) | (chk << 31); + chk += get_u16be(&data[i]); + chk = rotr_32(chk, 1); } } @@ -257,14 +260,8 @@ bool dc42_format::save(util::random_read_write &io, const std::vector int nsect = 16*(12+11+10+9+8)*g_heads; uint32_t dsize = nsect*512; uint32_t tsize = nsect*12; - h[0x40] = dsize >> 24; - h[0x41] = dsize >> 16; - h[0x42] = dsize >> 8; - h[0x43] = dsize; - h[0x44] = tsize >> 24; - h[0x45] = tsize >> 16; - h[0x46] = tsize >> 8; - h[0x47] = tsize; + put_u32be(&h[0x40], dsize); + put_u32be(&h[0x44], tsize); h[0x50] = g_heads == 2 ? 0x01 : 0x00; h[0x51] = g_heads == 2 ? 0x22 : 0x02; h[0x52] = 0x01; @@ -469,8 +466,8 @@ bool apple_2mg_format::load(util::random_read &io, uint32_t form_factor, const s desc_gcr_sector sectors[12]; uint8_t sdata[512*12], header[64]; io.read_at(0, header, 64, actual); - uint32_t blocks = header[0x14] | (header[0x15] << 8) | (header[0x16] << 16) | (header[0x17] << 24); - uint32_t pos_data = header[0x18] | (header[0x19] << 8) | (header[0x1a] << 16) | (header[0x1b] << 24); + uint32_t blocks = get_u32le(&header[0x14]); + uint32_t pos_data = get_u32le(&header[0x18]); if(blocks != 1600 && blocks != 16390) return false; diff --git a/src/lib/formats/apd_dsk.cpp b/src/lib/formats/apd_dsk.cpp index eb65fb3806d..ee20f10ffbe 100644 --- a/src/lib/formats/apd_dsk.cpp +++ b/src/lib/formats/apd_dsk.cpp @@ -63,6 +63,7 @@ #include "formats/apd_dsk.h" #include "ioprocs.h" +#include "multibyte.h" #include "osdcore.h" // osd_printf_*, little_endianize_int32 @@ -148,7 +149,7 @@ bool apd_format::load(util::random_read &io, uint32_t form_factor, const std::ve int err; std::vector gz_ptr; z_stream d_stream; - int inflate_size = (img[size - 1] << 24) | (img[size - 2] << 16) | (img[size - 3] << 8) | img[size - 4]; + int inflate_size = get_u32le(&img[size - 4]); uint8_t *in_ptr = &img[0]; if (!memcmp(&img[0], GZ_HEADER, sizeof(GZ_HEADER))) { diff --git a/src/lib/formats/camplynx_cas.cpp b/src/lib/formats/camplynx_cas.cpp index 7ffad54707e..a6151462911 100644 --- a/src/lib/formats/camplynx_cas.cpp +++ b/src/lib/formats/camplynx_cas.cpp @@ -25,6 +25,8 @@ Each byte is 8 bits (MSB first) with no start or stop bits. #include "camplynx_cas.h" +#include "multibyte.h" + #include "osdcore.h" // osd_printf_* @@ -144,13 +146,13 @@ static int camplynx_handle_cassette(int16_t *buffer, const uint8_t *bytes) switch (file_type) { case 'A': - data_size = 5 + ((bytes[byte_count + 4]) << 8 | bytes[byte_count + 3]) + 12; + data_size = 5 + get_u16le(&bytes[byte_count + 3]) + 12; break; case 'B': - data_size = 3 + ((bytes[byte_count + 2]) << 8 | bytes[byte_count + 1]) + 3; + data_size = 3 + get_u16le(&bytes[byte_count + 1]) + 3; break; case 'M': - data_size = 3 + ((bytes[byte_count + 2]) << 8 | bytes[byte_count + 1]) + 7; + data_size = 3 + get_u16le(&bytes[byte_count + 1]) + 7; break; } diff --git a/src/lib/formats/cbm_tap.cpp b/src/lib/formats/cbm_tap.cpp index eeb1872f28e..743ad4282d2 100644 --- a/src/lib/formats/cbm_tap.cpp +++ b/src/lib/formats/cbm_tap.cpp @@ -97,6 +97,8 @@ below could be not working. FP ] #include "cbm_tap.h" #include "imageutl.h" +#include "multibyte.h" + #define CBM_WAV_FREQUENCY 44100 @@ -281,7 +283,7 @@ static int cbm_tap_do_work( int16_t **buffer, int length, const uint8_t *data ) if (j >= 4) { - over_pulse_length = ((over_pulse_bytes[2] << 16) | (over_pulse_bytes[1] << 8) | over_pulse_bytes[0]) >> 3; + over_pulse_length = get_u24le(over_pulse_bytes) >> 3; byte_samples = tap_data_to_samplecount(over_pulse_length, tap_frequency); /* waveamp_high = WAVE_PAUSE; */ j = 0; diff --git a/src/lib/formats/cqm_dsk.cpp b/src/lib/formats/cqm_dsk.cpp index fdb8ed5042f..b53f0a6f877 100644 --- a/src/lib/formats/cqm_dsk.cpp +++ b/src/lib/formats/cqm_dsk.cpp @@ -12,6 +12,7 @@ #include "flopimg_legacy.h" #include "ioprocs.h" +#include "multibyte.h" #include @@ -185,7 +186,7 @@ FLOPPY_CONSTRUCT( cqm_dsk_construct ) floppy_image_read(floppy, header, 0, CQM_HEADER_SIZE); - tag->sector_size = (header[0x04] << 8) + header[0x03]; + tag->sector_size = get_u16le(&header[0x03]); tag->sector_per_track = header[0x10]; tag->heads = header[0x12]; tag->tracks = header[0x5b]; @@ -274,13 +275,13 @@ bool cqm_format::load(util::random_read &io, uint32_t form_factor, const std::ve uint8_t header[CQM_HEADER_SIZE]; io.read_at(0, header, CQM_HEADER_SIZE, actual); - int sector_size = (header[0x04] << 8) | header[0x03]; - int sector_per_track = (header[0x11] << 8) | header[0x10]; - int heads = (header[0x13] << 8) | header[0x12]; + int sector_size = get_u16le(&header[0x03]); + int sector_per_track = get_u16le(&header[0x10]); + int heads = get_u16le(&header[0x12]); int tracks = header[0x5b]; // int blind = header[0x58]; // 0=DOS, 1=blind, 2=HFS int density = header[0x59]; // 0=DD, 1=HD, 2=ED - int comment_size = (header[0x70] << 8) | header[0x6f]; + int comment_size = get_u16le(&header[0x6f]); int sector_base = header[0x71] + 1; // int interleave = header[0x74]; // TODO // int skew = header[0x75]; // TODO @@ -322,7 +323,7 @@ bool cqm_format::load(util::random_read &io, uint32_t form_factor, const std::ve // decode the RLE data for (int s = 0, pos = CQM_HEADER_SIZE + comment_size; pos < cqm_size; ) { - int16_t len = (cqmbuf[pos + 1] << 8) | cqmbuf[pos]; + int16_t len = get_s16le(&cqmbuf[pos]); pos += 2; if(len < 0) { diff --git a/src/lib/formats/d88_dsk.cpp b/src/lib/formats/d88_dsk.cpp index 9495f5a863d..349665795cb 100644 --- a/src/lib/formats/d88_dsk.cpp +++ b/src/lib/formats/d88_dsk.cpp @@ -33,6 +33,7 @@ #include "imageutl.h" #include "ioprocs.h" +#include "multibyte.h" #define D88_HEADER_LEN 0x2b0 @@ -71,7 +72,7 @@ static int d88_get_sector_id(floppy_image_legacy *floppy, int head, int track, i x=0; while(xsector_size = (1<<(track_info[0x014]+7)); offs = track_offset + 0x100 +sector * get_tag(floppy)->sector_size; } else { - get_tag(floppy)->sector_size = track_info[0x18 + (sector<<3) + 6] + (track_info[0x18+(sector<<3) + 7]<<8); + get_tag(floppy)->sector_size = get_u16le(&track_info[0x18 + (sector<<3) + 6]); offs = track_offset + 0x100; for (i=0;i @@ -2102,7 +2103,7 @@ std::vector> floppy_image_format_t::extract_sectors_from_tr std::vector hpos; - uint32_t hstate = (nib[nib.size() - 2] << 8) | nib[nib.size() - 1]; + uint32_t hstate = get_u16be(&nib[nib.size() - 2]); for(uint32_t pos = 0; pos != nib.size(); pos++) { hstate = ((hstate << 8) | nib[pos]) & 0xffffff; if(hstate == 0xd5aa96) diff --git a/src/lib/formats/fm7_cas.cpp b/src/lib/formats/fm7_cas.cpp index 63032336518..54a5095547a 100644 --- a/src/lib/formats/fm7_cas.cpp +++ b/src/lib/formats/fm7_cas.cpp @@ -6,6 +6,8 @@ #include "fm7_cas.h" +#include "multibyte.h" + #include #define WAVE_HIGH 0x5a9e @@ -13,9 +15,8 @@ static int cas_size; // FIXME: global variable prevents multiple instances -static int fm7_fill_wave(int16_t* buffer, uint8_t high, uint8_t low, int sample_pos) +static int fm7_fill_wave(int16_t* buffer, uint16_t data, int sample_pos) { - uint16_t data = (high << 8) + low; int sample_count = 0; int x = 0; int count = (data & 0x7fff); @@ -51,7 +52,7 @@ static int fm7_handle_t77(int16_t* buffer, const uint8_t* casdata) while(data_pos < cas_size) { - sample_count += fm7_fill_wave(buffer,casdata[data_pos],casdata[data_pos+1],sample_count); + sample_count += fm7_fill_wave(buffer,get_u16be(&casdata[data_pos]),sample_count); data_pos+=2; } diff --git a/src/lib/formats/fs_isis.cpp b/src/lib/formats/fs_isis.cpp index 3803af03180..d50acc8dd15 100644 --- a/src/lib/formats/fs_isis.cpp +++ b/src/lib/formats/fs_isis.cpp @@ -10,7 +10,10 @@ #include "fs_isis.h" #include "img_dsk.h" + +#include "multibyte.h" #include "strformat.h" + #include using namespace fs; @@ -583,7 +586,7 @@ void isis_impl::ensure_dir_loaded() // +11: bytes in last sector auto remainder = i[ 11 ]; // +12..+13: size in sectors - unsigned sectors = i[ 12 ] + (unsigned(i[ 13 ]) << 8); + unsigned sectors = get_u16le(&i[ 12 ]); if (remainder > SECTOR_SIZE) { throw std::runtime_error("Invalid dir. entry"); } diff --git a/src/lib/formats/hxchfe_dsk.cpp b/src/lib/formats/hxchfe_dsk.cpp index 52ed0d2c6ac..57c2bbca64e 100644 --- a/src/lib/formats/hxchfe_dsk.cpp +++ b/src/lib/formats/hxchfe_dsk.cpp @@ -102,6 +102,7 @@ #include "hxchfe_dsk.h" #include "ioprocs.h" +#include "multibyte.h" #include "osdcore.h" // osd_printf_* @@ -201,7 +202,7 @@ bool hfe_format::load(util::random_read &io, uint32_t form_factor, const std::ve return false; } - info.m_bit_rate = (header[12] & 0xff) | ((header[13] & 0xff)<<8); + info.m_bit_rate = get_u16le(&header[12]); if (info.m_bit_rate > 500) { @@ -211,7 +212,7 @@ bool hfe_format::load(util::random_read &io, uint32_t form_factor, const std::ve int samplelength = 500000 / info.m_bit_rate; // Not used in the HxC emulator - info.m_floppy_rpm = (header[14] & 0xff) | ((header[15] & 0xff)<<8); + info.m_floppy_rpm = get_u16le(&header[14]); info.m_interface_mode = (floppymode_t)(header[16] & 0xff); if (info.m_interface_mode > S950_HD_FLOPPYMODE) @@ -228,14 +229,14 @@ bool hfe_format::load(util::random_read &io, uint32_t form_factor, const std::ve info.m_track0s1_encoding = (encoding_t)(header[25] & 0xff); // read track lookup table (multiple of 512) - int table_offset = (header[18] & 0xff) | ((header[19] & 0xff)<<8); + int table_offset = get_u16le(&header[18]); io.read_at(table_offset<<9, track_table, TRACK_TABLE_LENGTH, actual); for (int i=0; i < info.m_cylinders; i++) { - info.m_cyl_offset[i] = (track_table[4*i] & 0xff) | ((track_table[4*i+1] & 0xff)<<8); - info.m_cyl_length[i] = (track_table[4*i+2] & 0xff) | ((track_table[4*i+3] & 0xff)<<8); + info.m_cyl_offset[i] = get_u16le(&track_table[4*i]); + info.m_cyl_length[i] = get_u16le(&track_table[4*i+2]); } // Load the tracks diff --git a/src/lib/formats/ipf_dsk.cpp b/src/lib/formats/ipf_dsk.cpp index 15017546abf..6956a235343 100644 --- a/src/lib/formats/ipf_dsk.cpp +++ b/src/lib/formats/ipf_dsk.cpp @@ -3,6 +3,7 @@ #include "ipf_dsk.h" #include "ioprocs.h" +#include "multibyte.h" #include @@ -54,11 +55,6 @@ bool ipf_format::load(util::random_read &io, uint32_t form_factor, const std::ve return dec.parse(data, image); } -uint32_t ipf_format::ipf_decode::r32(const uint8_t *p) -{ - return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; -} - uint32_t ipf_format::ipf_decode::rb(const uint8_t *&p, int count) { @@ -97,24 +93,24 @@ bool ipf_format::ipf_decode::parse(std::vector &data, floppy_image *ima bool ipf_format::ipf_decode::parse_info(const uint8_t *info) { - type = r32(info+12); + type = get_u32be(info+12); if(type != 1) return false; - encoder_type = r32(info+16); // 1 for CAPS, 2 for SPS - encoder_revision = r32(info+20); // 1 always - release = r32(info+24); - revision = r32(info+28); - origin = r32(info+32); // Original source reference - min_cylinder = r32(info+36); - max_cylinder = r32(info+40); - min_head = r32(info+44); - max_head = r32(info+48); - credit_day = r32(info+52); // year*1e4 + month*1e2 + day - credit_time = r32(info+56); // hour*1e7 + min*1e5 + sec*1e3 + msec + encoder_type = get_u32be(info+16); // 1 for CAPS, 2 for SPS + encoder_revision = get_u32be(info+20); // 1 always + release = get_u32be(info+24); + revision = get_u32be(info+28); + origin = get_u32be(info+32); // Original source reference + min_cylinder = get_u32be(info+36); + max_cylinder = get_u32be(info+40); + min_head = get_u32be(info+44); + max_head = get_u32be(info+48); + credit_day = get_u32be(info+52); // year*1e4 + month*1e2 + day + credit_time = get_u32be(info+56); // hour*1e7 + min*1e5 + sec*1e3 + msec for(int i=0; i<4; i++) - platform[i] = r32(info+60+4*i); + platform[i] = get_u32be(info+60+4*i); for(int i=0; i<5; i++) - extra[i] = r32(info+76+4*i); + extra[i] = get_u32be(info+76+4*i); return true; } @@ -132,50 +128,50 @@ ipf_format::ipf_decode::track_info *ipf_format::ipf_decode::get_index(uint32_t i bool ipf_format::ipf_decode::parse_imge(const uint8_t *imge) { - track_info *t = get_index(r32(imge+64)); + track_info *t = get_index(get_u32be(imge+64)); if(!t) return false; t->info_set = true; - t->cylinder = r32(imge+12); + t->cylinder = get_u32be(imge+12); if(t->cylinder < min_cylinder || t->cylinder > max_cylinder) return false; - t->head = r32(imge+16); + t->head = get_u32be(imge+16); if(t->head < min_head || t->head > max_head) return false; - t->type = r32(imge+20); - t->sigtype = r32(imge+24); // 1 for 2us cells, no other value valid - t->size_bytes = r32(imge+28); - t->index_bytes = r32(imge+32); - t->index_cells = r32(imge+36); - t->datasize_cells = r32(imge+40); - t->gapsize_cells = r32(imge+44); - t->size_cells = r32(imge+48); - t->block_count = r32(imge+52); - t->process = r32(imge+56); // encoder process, always 0 - t->weak_bits = r32(imge+60); - t->reserved[0] = r32(imge+68); - t->reserved[1] = r32(imge+72); - t->reserved[2] = r32(imge+76); + t->type = get_u32be(imge+20); + t->sigtype = get_u32be(imge+24); // 1 for 2us cells, no other value valid + t->size_bytes = get_u32be(imge+28); + t->index_bytes = get_u32be(imge+32); + t->index_cells = get_u32be(imge+36); + t->datasize_cells = get_u32be(imge+40); + t->gapsize_cells = get_u32be(imge+44); + t->size_cells = get_u32be(imge+48); + t->block_count = get_u32be(imge+52); + t->process = get_u32be(imge+56); // encoder process, always 0 + t->weak_bits = get_u32be(imge+60); + t->reserved[0] = get_u32be(imge+68); + t->reserved[1] = get_u32be(imge+72); + t->reserved[2] = get_u32be(imge+76); return true; } bool ipf_format::ipf_decode::parse_data(const uint8_t *data, uint32_t &pos, uint32_t max_extra_size) { - track_info *t = get_index(r32(data+24)); + track_info *t = get_index(get_u32be(data+24)); if(!t) return false; - t->data_size_bits = r32(data+16); + t->data_size_bits = get_u32be(data+16); t->data = data+28; - t->data_size = r32(data+12); + t->data_size = get_u32be(data+12); if(t->data_size > max_extra_size) return false; - if(crc32r(t->data, t->data_size) != r32(data+20)) + if(crc32r(t->data, t->data_size) != get_u32be(data+20)) return false; pos += t->data_size; return true; @@ -186,10 +182,10 @@ bool ipf_format::ipf_decode::scan_one_tag(std::vector &data, uint32_t & if(data.size()-pos < 12) return false; tag = &data[pos]; - tsize = r32(tag+4); + tsize = get_u32be(tag+4); if(data.size()-pos < tsize) return false; - uint32_t crc = r32(tag+8); + uint32_t crc = get_u32be(tag+8); tag[8] = tag[9] = tag[10] = tag[11] = 0; if(crc32r(tag, tsize) != crc) return false; @@ -208,7 +204,7 @@ bool ipf_format::ipf_decode::scan_all_tags(std::vector &data) if(!scan_one_tag(data, pos, tag, tsize)) return false; - switch(r32(tag)) { + switch(get_u32be(tag)) { case 0x43415053: // CAPS if(tsize != 12) return false; @@ -361,7 +357,7 @@ bool ipf_format::ipf_decode::generate_timings(track_info *t, std::vectordata + 32*t->block_count + 12); + uint32_t mask = get_u32be(t->data + 32*t->block_count + 12); for(uint32_t i=1; iblock_count; i++) timing_set(track, data_pos[i], gap_pos[i], mask & (1 << (i-1)) ? 1900 : 2100); break; @@ -666,8 +662,8 @@ bool ipf_format::ipf_decode::generate_block(track_info *t, uint32_t idx, uint32_ const uint8_t *data = t->data; const uint8_t *data_end = t->data + t->data_size; const uint8_t *thead = data + 32*idx; - uint32_t data_cells = r32(thead); - uint32_t gap_cells = r32(thead+4); + uint32_t data_cells = get_u32be(thead); + uint32_t gap_cells = get_u32be(thead+4); if(gap_cells < 8) gap_cells = 0; @@ -684,9 +680,9 @@ bool ipf_format::ipf_decode::generate_block(track_info *t, uint32_t idx, uint32_ pos = gpos + gap_cells; if(pos > t->size_cells) return false; - if(!generate_block_data(data + r32(thead+28), data_end, track.begin()+dpos, track.begin()+gpos, context)) + if(!generate_block_data(data + get_u32be(thead+28), data_end, track.begin()+dpos, track.begin()+gpos, context)) return false; - if(!generate_block_gap(r32(thead+20), gap_cells, r32(thead+24), spos, ipos > gpos ? ipos-gpos : 0, data + r32(thead+8), data_end, track.begin()+gpos, context)) + if(!generate_block_gap(get_u32be(thead+20), gap_cells, get_u32be(thead+24), spos, ipos > gpos ? ipos-gpos : 0, data + get_u32be(thead+8), data_end, track.begin()+gpos, context)) return false; spos += gpos; @@ -698,8 +694,8 @@ uint32_t ipf_format::ipf_decode::block_compute_real_size(track_info *t) uint32_t size = 0; const uint8_t *thead = t->data; for(unsigned int i=0; i != t->block_count; i++) { - uint32_t data_cells = r32(thead); - uint32_t gap_cells = r32(thead+4); + uint32_t data_cells = get_u32be(thead); + uint32_t gap_cells = get_u32be(thead+4); if(gap_cells < 8) gap_cells = 0; diff --git a/src/lib/formats/jfd_dsk.cpp b/src/lib/formats/jfd_dsk.cpp index b9ea2d55fb4..6305fea50bc 100644 --- a/src/lib/formats/jfd_dsk.cpp +++ b/src/lib/formats/jfd_dsk.cpp @@ -161,6 +161,7 @@ #include "formats/jfd_dsk.h" #include "ioprocs.h" +#include "multibyte.h" #include "osdcore.h" // osd_printf_* @@ -244,7 +245,7 @@ bool jfd_format::load(util::random_read &io, uint32_t form_factor, const std::ve int err; std::vector gz_ptr; z_stream d_stream; - int inflate_size = (img[size - 1] << 24) | (img[size - 2] << 16) | (img[size - 3] << 8) | img[size - 4]; + int inflate_size = get_u32le(&img[size - 4]); if (!memcmp(&img[0], GZ_HEADER, sizeof(GZ_HEADER))) { gz_ptr.resize(inflate_size); diff --git a/src/lib/formats/kim1_cas.cpp b/src/lib/formats/kim1_cas.cpp index 8fb89ff4206..933e8cc3818 100644 --- a/src/lib/formats/kim1_cas.cpp +++ b/src/lib/formats/kim1_cas.cpp @@ -2,6 +2,8 @@ // copyright-holders:Wilbert Pol #include "kim1_cas.h" +#include "multibyte.h" + #include #define SMPLO -32768 @@ -87,8 +89,8 @@ static int kim1_handle_kim(int16_t *buffer, const uint8_t *casdata) if ( cas_size < 9 ) return -1; if ( memcmp( casdata, "KIM1", 4 ) ) return -1; - address = casdata[4] | ( casdata[5] << 8 ); - size = casdata[6] | ( casdata[7] << 8 ); + address = get_u16le( &casdata[4] ); + size = get_u16le( &casdata[6] ); file_id = casdata[8]; data_pos = 9; diff --git a/src/lib/formats/mdos_dsk.cpp b/src/lib/formats/mdos_dsk.cpp index 8f54b72aaea..933f17e193d 100644 --- a/src/lib/formats/mdos_dsk.cpp +++ b/src/lib/formats/mdos_dsk.cpp @@ -53,6 +53,7 @@ #include "imageutl.h" #include "ioprocs.h" +#include "multibyte.h" mdos_format::mdos_format() : wd177x_format(formats) @@ -158,9 +159,7 @@ int mdos_format::find_size(util::random_read &io, uint32_t form_factor, const st // 10 words. The area beyond the zero word is not always zero filled, // and is ignored here. Check that it is consistent with this. for (int i = 0; i < 10; i++) { - uint8_t high = info.rib_addr[i * 2]; - uint8_t low = info.rib_addr[i * 2 + 1]; - uint16_t cluster = (high << 8) | low; + uint16_t cluster = get_u16be(&info.rib_addr[i * 2]); if (cluster == 0) break; diff --git a/src/lib/formats/oric_dsk.cpp b/src/lib/formats/oric_dsk.cpp index f845075e67f..aac26d1ae78 100644 --- a/src/lib/formats/oric_dsk.cpp +++ b/src/lib/formats/oric_dsk.cpp @@ -11,6 +11,7 @@ #include "oric_dsk.h" #include "ioprocs.h" +#include "multibyte.h" #include @@ -44,9 +45,9 @@ int oric_dsk_format::identify(util::random_read &io, uint32_t form_factor, const if(memcmp(h, "MFM_DISK", 8)) return 0; - int sides = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8]; - int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12]; - int geom = (h[19] << 24) | (h[18] << 16) | (h[17] << 8) | h[16]; + int sides = get_u32le(&h[ 8]); + int tracks = get_u32le(&h[12]); + int geom = get_u32le(&h[16]); uint64_t size; if(io.length(size)) @@ -66,8 +67,8 @@ bool oric_dsk_format::load(util::random_read &io, uint32_t form_factor, const st t[6250] = t[6251] = t[6252] = 0; io.read_at(0, h, 256, actual); - int sides = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8]; - int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12]; + int sides = get_u32le(&h[ 8]); + int tracks = get_u32le(&h[12]); for(int side=0; side @@ -84,11 +85,11 @@ bool pasti_format::load(util::random_read &io, uint32_t form_factor, const std:: for(int head=0; head < heads; head++) { uint8_t th[16]; io.read_at(pos, th, 16, actual); - int entry_len = th[0] | (th[1] << 8) | (th[2] << 16) | (th[3] << 24); - int fuzz_len = th[4] | (th[5] << 8) | (th[6] << 16) | (th[7] << 24); - int sect = th[8] | (th[9] << 8); - int flags = th[10] | (th[11] << 8); - int track_len = th[12] | (th[13] << 8); + int entry_len = get_u32le(&th[0]); + int fuzz_len = get_u32le(&th[4]); + int sect = get_u16le(&th[8]); + int flags = get_u16le(&th[10]); + int track_len = get_u16le(&th[12]); int track_num = th[14]; int flags2 = th[15]; @@ -102,13 +103,13 @@ bool pasti_format::load(util::random_read &io, uint32_t form_factor, const std:: int syncpos = -1; if(flags & 0x0080) { - syncpos = tdata[0] | (tdata[1] << 8); + syncpos = get_u16le(tdata); tdata += 2; } int tsize = 0; if(flags & 0x0040) { - tsize = tdata[0] | (tdata[1] << 8); + tsize = get_u16le(tdata); tdata += 2; } else tdata = nullptr; @@ -133,10 +134,10 @@ bool pasti_format::load(util::random_read &io, uint32_t form_factor, const std:: for(int s=0; s TOTAL_TRACK_SIZE) return false; if (dam_location[i] > TOTAL_TRACK_SIZE) return false; diff --git a/src/lib/formats/sol_cas.cpp b/src/lib/formats/sol_cas.cpp index 1e54963953b..8c05a756042 100644 --- a/src/lib/formats/sol_cas.cpp +++ b/src/lib/formats/sol_cas.cpp @@ -36,6 +36,8 @@ SVT - The full explanation may be found on the Solace web site, #include "sol_cas.h" +#include "multibyte.h" + #define WAVEENTRY_LOW -32768 #define WAVEENTRY_HIGH 32767 @@ -82,17 +84,16 @@ static int sol20_output_bit(int16_t *buffer, int sample_pos, bool bit) static int sol20_output_byte(int16_t *buffer, int sample_pos, uint8_t byte) { int samples = 0; - uint8_t i; /* start */ samples += sol20_output_bit (buffer, sample_pos + samples, 0); /* data */ - for (i = 0; i<8; i++) + for (uint8_t i = 0; i<8; i++) samples += sol20_output_bit (buffer, sample_pos + samples, (byte >> i) & 1); /* stop */ - for (i = 0; i<2; i++) + for (uint8_t i = 0; i<2; i++) samples += sol20_output_bit (buffer, sample_pos + samples, 1); return samples; @@ -157,11 +158,10 @@ static void sol20_scan_to_hex(const uint8_t *bytes) static int sol20_read_hex(const uint8_t *bytes, uint8_t numdigits) { int data = 0; - uint8_t i,chr; - for (i = 0; i < numdigits; i++) + for (uint8_t i = 0; i < numdigits; i++) { - chr = bytes[sol20_byte_num]; + uint8_t chr = bytes[sol20_byte_num]; if ((chr >= '0') && (chr <= '9')) { data = (data << 4) | (chr-48); @@ -196,7 +196,7 @@ static int sol20_read_dec(const uint8_t *bytes) static int sol20_handle_cassette(int16_t *buffer, const uint8_t *bytes) { uint32_t sample_count = 0; - uint32_t i = 0,t = 0; + uint32_t t = 0; uint16_t cc = 0; sol20_byte_num = 1; bool process_d = 0; @@ -234,7 +234,7 @@ static int sol20_handle_cassette(int16_t *buffer, const uint8_t *bytes) sol20_byte_num+=2; // bump to parameter t = sol20_read_dec(bytes) * 140; // convert 10th of seconds to number of ones - for (i = 0; i < t; i++) + for (uint32_t i = 0; i < t; i++) sample_count += sol20_output_bit(buffer, sample_count, 1); sol20_scan_to_eol(bytes); break; @@ -248,9 +248,9 @@ static int sol20_handle_cassette(int16_t *buffer, const uint8_t *bytes) } sol20_byte_num+=2; // bump to file name - for (i = 0; i < 5; i++) + for (uint32_t i = 0; i < 5; i++) sol20_header[i] = 0x20; - for (i = 0; i < 5; i++) + for (uint32_t i = 0; i < 5; i++) { sol20_header[i] = bytes[sol20_byte_num++]; if (sol20_header[i] == 0x20) @@ -261,29 +261,24 @@ static int sol20_handle_cassette(int16_t *buffer, const uint8_t *bytes) sol20_header[6] = sol20_read_hex(bytes, 2); sol20_scan_to_hex(bytes); // bump to length length = sol20_read_hex(bytes, 4); - sol20_header[7] = length; - sol20_header[8] = length >> 8; + put_u16le(&sol20_header[7], length); sol20_scan_to_hex(bytes); // bump to load-address - i = sol20_read_hex(bytes, 4); - sol20_header[9] = i; - sol20_header[10] = i >> 8; + put_u16le(&sol20_header[9], sol20_read_hex(bytes, 4)); sol20_scan_to_hex(bytes); // bump to exec-address - i = sol20_read_hex(bytes, 4); - sol20_header[11] = i; - sol20_header[12] = i >> 8; + put_u16le(&sol20_header[11], sol20_read_hex(bytes, 4)); sol20_header[13] = 0; sol20_header[14] = 0; sol20_header[15] = 0; sol20_cksm_byte = 0; - for (i = 0; i < 16; i++) + for (uint32_t i = 0; i < 16; i++) sol20_cksm_byte = sol20_calc_cksm(sol20_cksm_byte, sol20_header[i]); // write leader - for (i = 0; i < 100; i++) + for (uint32_t i = 0; i < 100; i++) sample_count += sol20_output_byte(buffer, sample_count, 0); // write SOH sample_count += sol20_output_byte(buffer, sample_count, 1); // write Header - for (i = 0; i < 16; i++) + for (uint32_t i = 0; i < 16; i++) sample_count += sol20_output_byte(buffer, sample_count, sol20_header[i]); // write checksum sample_count += sol20_output_byte(buffer, sample_count, sol20_cksm_byte); diff --git a/src/lib/formats/st_dsk.cpp b/src/lib/formats/st_dsk.cpp index 34c6008aaca..a84ddbdc539 100644 --- a/src/lib/formats/st_dsk.cpp +++ b/src/lib/formats/st_dsk.cpp @@ -11,6 +11,7 @@ #include "formats/st_dsk.h" #include "ioprocs.h" +#include "multibyte.h" #include @@ -153,11 +154,11 @@ void msa_format::read_header(util::random_read &io, uint16_t &sign, uint16_t &se uint8_t h[10]; size_t actual; io.read_at(0, h, 10, actual); - sign = (h[0] << 8) | h[1]; - sect = (h[2] << 8) | h[3]; - head = (h[4] << 8) | h[5]; - strack = (h[6] << 8) | h[7]; - etrack = (h[8] << 8) | h[9]; + sign = get_u16be(&h[0]); + sect = get_u16be(&h[2]); + head = get_u16be(&h[4]); + strack = get_u16be(&h[6]); + etrack = get_u16be(&h[8]); } bool msa_format::uncompress(uint8_t *buffer, int csize, int usize) @@ -170,7 +171,7 @@ bool msa_format::uncompress(uint8_t *buffer, int csize, int usize) if(csize-src < 3) return false; c = buffer[src++]; - int count = (buffer[src] << 8) | buffer[src+1]; + int count = get_u16be(&buffer[src]); src += 2; if(usize-dst < count) return false; @@ -201,8 +202,8 @@ bool msa_format::compress(const uint8_t *buffer, int usize, uint8_t *dest, int & return false; dest[dst++] = 0xe5; dest[dst++] = c; - dest[dst++] = ncopy >> 8; - dest[dst++] = ncopy; + put_u16be(&dest[dst], ncopy); + dst += 2; } else { src -= ncopy-1; dest[dst++] = c; @@ -250,7 +251,7 @@ bool msa_format::load(util::random_read &io, uint32_t form_factor, const std::ve uint8_t th[2]; io.read_at(pos, th, 2, actual); pos += 2; - int tsize = (th[0] << 8) | th[1]; + int tsize = get_u16be(th); io.read_at(pos, sectdata, tsize, actual); pos += tsize; if(tsize < track_size) { @@ -313,14 +314,12 @@ bool msa_format::save(util::random_read_write &io, const std::vector & int csize; if(compress(sectdata, track_size, compdata, csize)) { uint8_t th[2]; - th[0] = csize >> 8; - th[1] = csize; + put_u16be(th, csize); io.write(th, 2, actual); io.write(compdata, csize, actual); } else { uint8_t th[2]; - th[0] = track_size >> 8; - th[1] = track_size; + put_u16be(th, track_size); io.write(th, 2, actual); io.write(sectdata, track_size, actual); } diff --git a/src/lib/formats/td0_dsk.cpp b/src/lib/formats/td0_dsk.cpp index 12200754623..65dd42f47ca 100644 --- a/src/lib/formats/td0_dsk.cpp +++ b/src/lib/formats/td0_dsk.cpp @@ -17,6 +17,7 @@ #include "flopimg_legacy.h" #include "ioprocs.h" +#include "multibyte.h" #include @@ -174,7 +175,7 @@ static floperr_t get_offset(floppy_image_legacy *floppy, int head, int track, in offs+= 6; if ((header[4] & 0x30)==0) { offs+= 2; - offs+= header[6] + (header[7]<<8); + offs+= get_u16le(&header[6]); } } // read size of sector @@ -213,7 +214,7 @@ static floperr_t internal_td0_read_sector(floppy_image_legacy *floppy, int head, offset+=3; // take data size - size = header[6] + (header[7]<<8)-1; + size = get_u16le(&header[6])-1; // take real sector size realsize = 1 << (header[3] + 7); @@ -234,7 +235,7 @@ static floperr_t internal_td0_read_sector(floppy_image_legacy *floppy, int head, // - 2 bytes of data // data is reapeted specified number of times while(buff_postracks = 0; do { @@ -752,7 +753,7 @@ FLOPPY_CONSTRUCT( td0_dsk_construct ) header = tag->data + position; position+=2; // skip sector data - position+= header[0] + (header[1]<<8); + position+= get_u16le(&header[0]); } } tag->tracks++; @@ -854,7 +855,7 @@ bool td0_format::load(util::random_read &io, uint32_t form_factor, const std::ve // skip optional comment section if(header[7] & 0x80) - offset = 10 + imagebuf[2] + (imagebuf[3] << 8); + offset = 10 + get_u16le(&imagebuf[2]); track_spt = imagebuf[offset]; if(track_spt == 255) // Empty file? @@ -969,7 +970,7 @@ bool td0_format::load(util::random_read &io, uint32_t form_factor, const std::ve offset += 4; if(actual < offset) return false; - k = (hs[9] + (hs[10] << 8)) * 2; + k = get_u16le(&hs[9]) * 2; k = (k <= size) ? k : size; for(j = 0; j < k; j += 2) { diff --git a/src/lib/formats/tvc_cas.cpp b/src/lib/formats/tvc_cas.cpp index b512b4008cc..2abde7b9a9b 100644 --- a/src/lib/formats/tvc_cas.cpp +++ b/src/lib/formats/tvc_cas.cpp @@ -10,6 +10,8 @@ #include "tvc_cas.h" +#include "multibyte.h" + #define TVC64_BIT0_FREQ 1812 #define TVC64_BIT1_FREQ 2577 @@ -93,7 +95,7 @@ static cassette_image::error tvc64_cassette_load(cassette_image *cassette) uint8_t header[TVC64_HEADER_BYTES]; cassette->image_read(header, 0, TVC64_HEADER_BYTES); - uint16_t cas_size = (header[0x83]<<8) | header[0x82]; + uint16_t cas_size = get_u16le(&header[0x82]); // tape header tmp_buff[buff_idx++] = 0x00; diff --git a/src/lib/formats/tzx_cas.cpp b/src/lib/formats/tzx_cas.cpp index 7772fd7fc4b..4d14e567453 100644 --- a/src/lib/formats/tzx_cas.cpp +++ b/src/lib/formats/tzx_cas.cpp @@ -30,6 +30,8 @@ TODO: #include "tzx_cas.h" #include "imageutl.h" +#include "multibyte.h" + #include @@ -101,12 +103,12 @@ static void tzx_cas_get_blocks( const uint8_t *casdata, int caslen ) { case 0x10: pos += 2; - datasize = casdata[pos] + (casdata[pos + 1] << 8); + datasize = get_u16le(&casdata[pos]); pos += 2 + datasize; break; case 0x11: pos += 0x0f; - datasize = casdata[pos] + (casdata[pos + 1] << 8) + (casdata[pos + 2] << 16); + datasize = get_u24le(&casdata[pos]); pos += 3 + datasize; break; case 0x12: @@ -118,12 +120,12 @@ static void tzx_cas_get_blocks( const uint8_t *casdata, int caslen ) break; case 0x14: pos += 7; - datasize = casdata[pos] + (casdata[pos + 1] << 8) + (casdata[pos + 2] << 16); + datasize = get_u24le(&casdata[pos]); pos += 3 + datasize; break; case 0x15: pos += 5; - datasize = casdata[pos] + (casdata[pos + 1] << 8) + (casdata[pos + 2] << 16); + datasize = get_u24le(&casdata[pos]); pos += 3 + datasize; break; case 0x20: case 0x23: @@ -131,7 +133,7 @@ static void tzx_cas_get_blocks( const uint8_t *casdata, int caslen ) break; case 0x24: - loopcount = casdata[pos] + (casdata[pos + 1] << 8); + loopcount = get_u16le(&casdata[pos]); pos +=2; loopoffset = pos; break; @@ -152,11 +154,11 @@ static void tzx_cas_get_blocks( const uint8_t *casdata, int caslen ) break; case 0x26: - datasize = casdata[pos] + (casdata[pos + 1] << 8); + datasize = get_u16le(&casdata[pos]); pos += 2 + 2 * datasize; break; case 0x28: case 0x32: - datasize = casdata[pos] + (casdata[pos + 1] << 8); + datasize = get_u16le(&casdata[pos]); pos += 2 + datasize; break; case 0x31: @@ -173,19 +175,19 @@ static void tzx_cas_get_blocks( const uint8_t *casdata, int caslen ) break; case 0x35: pos += 0x10; - datasize = casdata[pos] + (casdata[pos + 1] << 8) + (casdata[pos + 2] << 16) + (casdata[pos + 3] << 24); + datasize = get_u32le(&casdata[pos]); pos += 4 + datasize; break; case 0x40: pos += 1; - datasize = casdata[pos] + (casdata[pos + 1] << 8) + (casdata[pos + 2] << 16); + datasize = get_u24le(&casdata[pos]); pos += 3 + datasize; break; case 0x5A: pos += 9; break; default: - datasize = casdata[pos] + (casdata[pos + 1] << 8) + (casdata[pos + 2] << 16) + (casdata[pos + 3] << 24); + datasize = get_u32le(&casdata[pos]); pos += 4 + datasize; break; } @@ -360,7 +362,7 @@ static inline int tzx_handle_symbol(int16_t **buffer, const uint8_t *symtable, u for (int i = 0; i < maxp; i++) { - uint16_t pulse_length = cursymb[1 + (i*2)] | (cursymb[2 + (i*2)] << 8); + uint16_t pulse_length = get_u16le(&cursymb[1 + (i*2)]); // shorter lists can be terminated with a pulse_length of 0 if (pulse_length != 0) @@ -415,7 +417,7 @@ static int tzx_handle_generalized(int16_t **buffer, const uint8_t *bytes, int pa for (int i = 0; i < totp*3; i+=3) { uint8_t symbol = table2[i + 0]; - uint16_t repetitions = table2[i + 1] + (table2[i + 2] << 8); + uint16_t repetitions = get_u16le(&table2[i + 1]); //printf("symbol %02x repetitions %04x\n", symbol, repetitions); // does 1 mean repeat once, or that it only occurs once? for (int j = 0; j < repetitions; j++) @@ -523,28 +525,28 @@ static int tzx_cas_do_work( int16_t **buffer ) switch (block_type) { case 0x10: /* Standard Speed Data Block (.TAP block) */ - pause_time = cur_block[1] + (cur_block[2] << 8); - data_size = cur_block[3] + (cur_block[4] << 8); + pause_time = get_u16le(&cur_block[1]); + data_size = get_u16le(&cur_block[3]); pilot_length = (cur_block[5] < 128) ? 8063 : 3223; size += tzx_cas_handle_block(buffer, &cur_block[5], pause_time, data_size, 2168, pilot_length, 667, 735, 855, 1710, 8); current_block++; break; case 0x11: /* Turbo Loading Data Block */ - pilot = cur_block[1] + (cur_block[2] << 8); - sync1 = cur_block[3] + (cur_block[4] << 8); - sync2 = cur_block[5] + (cur_block[6] << 8); - bit0 = cur_block[7] + (cur_block[8] << 8); - bit1 = cur_block[9] + (cur_block[10] << 8); - pilot_length = cur_block[11] + (cur_block[12] << 8); + pilot = get_u16le(&cur_block[1]); + sync1 = get_u16le(&cur_block[3]); + sync2 = get_u16le(&cur_block[5]); + bit0 = get_u16le(&cur_block[7]); + bit1 = get_u16le(&cur_block[9]); + pilot_length = get_u16le(&cur_block[11]); bits_in_last_byte = cur_block[13]; - pause_time = cur_block[14] + (cur_block[15] << 8); - data_size = cur_block[16] + (cur_block[17] << 8) + (cur_block[18] << 16); + pause_time = get_u16le(&cur_block[14]); + data_size = get_u24le(&cur_block[16]); size += tzx_cas_handle_block(buffer, &cur_block[19], pause_time, data_size, pilot, pilot_length, sync1, sync2, bit0, bit1, bits_in_last_byte); current_block++; break; case 0x12: /* Pure Tone */ - pilot = cur_block[1] + (cur_block[2] << 8); - pilot_length = cur_block[3] + (cur_block[4] << 8); + pilot = get_u16le(&cur_block[1]); + pilot_length = get_u16le(&cur_block[3]); size += tzx_cas_handle_block(buffer, cur_block, 0, 0, pilot, pilot_length, 0, 0, 0, 0, 0); current_block++; break; @@ -557,16 +559,16 @@ static int tzx_cas_do_work( int16_t **buffer ) current_block++; break; case 0x14: /* Pure Data Block */ - bit0 = cur_block[1] + (cur_block[2] << 8); - bit1 = cur_block[3] + (cur_block[4] << 8); + bit0 = get_u16le(&cur_block[1]); + bit1 = get_u16le(&cur_block[3]); bits_in_last_byte = cur_block[5]; - pause_time = cur_block[6] + (cur_block[7] << 8); - data_size = cur_block[8] + (cur_block[9] << 8) + (cur_block[10] << 16); + pause_time = get_u16le(&cur_block[6]); + data_size = get_u24le(&cur_block[8]); size += tzx_cas_handle_block(buffer, &cur_block[11], pause_time, data_size, 0, 0, 0, 0, bit0, bit1, bits_in_last_byte); current_block++; break; case 0x20: /* Pause (Silence) or 'Stop the Tape' Command */ - pause_time = cur_block[1] + (cur_block[2] << 8); + pause_time = get_u16le(&cur_block[1]); if (pause_time == 0) { /* pause = 0 is used to let an emulator automagically stop the tape @@ -606,7 +608,7 @@ static int tzx_cas_do_work( int16_t **buffer ) break; case 0x32: /* Archive Info */ ascii_block_common_log("Archive Info Block", block_type); - total_size = cur_block[1] + (cur_block[2] << 8); + total_size = get_u16le(&cur_block[1]); text_size = 0; for (data_size = 0; data_size < cur_block[3]; data_size++) // data_size = number of text blocks, in this case { @@ -644,7 +646,7 @@ static int tzx_cas_do_work( int16_t **buffer ) LOG_FORMATS("%c", cur_block[1 + data_size]); } LOG_FORMATS(":\n"); - text_size = cur_block[11] + (cur_block[12] << 8) + (cur_block[13] << 16) + (cur_block[14] << 24); + text_size = get_u32le(&cur_block[11]); for (data_size = 0; data_size < text_size; data_size++) LOG_FORMATS("%c", cur_block[15 + data_size]); LOG_FORMATS("\n"); @@ -656,7 +658,7 @@ static int tzx_cas_do_work( int16_t **buffer ) current_block++; break; case 0x24: /* Loop Start */ - loopcount = cur_block[1] + (cur_block[2] << 8); + loopcount = get_u16le(&cur_block[1]); current_block++; loopoffset = current_block; @@ -690,10 +692,10 @@ static int tzx_cas_do_work( int16_t **buffer ) case 0x15: /* Direct Recording */ // used on 'bombscar' in the cpc_cass list // having this missing is fatal - tstates = cur_block[1] + (cur_block[2] << 8); - pause_time= cur_block[3] + (cur_block[4] << 8); + tstates = get_u16le(&cur_block[1]); + pause_time = get_u16le(&cur_block[3]); bits_in_last_byte = cur_block[5]; - data_size = cur_block[6] + (cur_block[7] << 8) + (cur_block[8] << 16); + data_size = get_u24le(&cur_block[6]); size += tzx_handle_direct(buffer, &cur_block[9], pause_time, data_size, tstates, bits_in_last_byte); current_block++; break; @@ -708,15 +710,15 @@ static int tzx_cas_do_work( int16_t **buffer ) { // having this missing is fatal // used crudely by batmanc in spectrum_cass list (which is just a redundant encoding of batmane ?) - data_size = cur_block[1] + (cur_block[2] << 8) + (cur_block[3] << 16) + (cur_block[4] << 24); - pause_time= cur_block[5] + (cur_block[6] << 8); + data_size = get_u32le(&cur_block[1]); + pause_time = get_u16le(&cur_block[5]); - uint32_t totp = cur_block[7] + (cur_block[8] << 8) + (cur_block[9] << 16) + (cur_block[10] << 24); + uint32_t totp = get_u32le(&cur_block[7]); int npp = cur_block[11]; int asp = cur_block[12]; if (asp == 0 && totp > 0) asp = 256; - uint32_t totd = cur_block[13] + (cur_block[14] << 8) + (cur_block[15] << 16) + (cur_block[16] << 24); + uint32_t totd = get_u32le(&cur_block[13]); int npd = cur_block[17]; int asd = cur_block[18]; if (asd == 0 && totd > 0) asd = 256; @@ -802,7 +804,7 @@ static int tap_cas_to_wav_size( const uint8_t *casdata, int caslen ) while (p < casdata + caslen) { - int data_size = p[0] + (p[1] << 8); + int data_size = get_u16le(&p[0]); int pilot_length = (p[2] == 0x00) ? 8063 : 3223; LOG_FORMATS("tap_cas_to_wav_size: Handling TAP block containing 0x%X bytes", data_size); p += 2; @@ -820,7 +822,7 @@ static int tap_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) while (size < length) { - int data_size = bytes[0] + (bytes[1] << 8); + int data_size = get_u16le(&bytes[0]); int pilot_length = (bytes[2] == 0x00) ? 8063 : 3223; LOG_FORMATS("tap_cas_fill_wave: Handling TAP block containing 0x%X bytes\n", data_size); bytes += 2; diff --git a/src/lib/formats/uef_cas.cpp b/src/lib/formats/uef_cas.cpp index 15638e5f025..cabac3a0ecd 100644 --- a/src/lib/formats/uef_cas.cpp +++ b/src/lib/formats/uef_cas.cpp @@ -20,6 +20,8 @@ Not nice, but it works... #include "uef_cas.h" #include "imageutl.h" +#include "multibyte.h" + #include #include @@ -64,7 +66,7 @@ static const uint8_t* skip_gz_header( const uint8_t *p ) { /* Skip the extra field */ if ( ( flags & EXTRA_FIELD ) != 0 ) { - int len = ( p[1] << 8 ) | p[0]; + int len = get_u16le( &p[0] ); p += 2 + len; } /* Skip the original file name */ @@ -94,13 +96,13 @@ static float get_uef_float( const uint8_t *Float) was the first byte read from the UEF, Float[1] the second, etc */ /* decode mantissa */ - Mantissa = Float[0] | (Float[1] << 8) | ((Float[2]&0x7f)|0x80) << 16; + Mantissa = get_u24be(&Float[0]) | 0x800000; Result = (float)Mantissa; Result = (float)ldexp(Result, -23); /* decode exponent */ - Exponent = ((Float[2]&0x80) >> 7) | (Float[3]&0x7f) << 1; + Exponent = (get_u16be(&Float[2])&0x7f80) >> 7; Exponent -= 127; Result = (float)ldexp(Result, Exponent); @@ -118,7 +120,7 @@ static int uef_cas_to_wav_size( const uint8_t *casdata, int caslen ) { if ( casdata[0] == 0x1f && casdata[1] == 0x8b ) { int err; z_stream d_stream; - int inflate_size = ( casdata[ caslen - 1 ] << 24 ) | ( casdata[ caslen - 2 ] << 16 ) | ( casdata[ caslen - 3 ] << 8 ) | casdata[ caslen - 4 ]; + int inflate_size = get_u32le( &casdata[ caslen - 4 ] ); const uint8_t *in_ptr = skip_gz_header( casdata ); if ( in_ptr == nullptr ) { @@ -166,8 +168,8 @@ static int uef_cas_to_wav_size( const uint8_t *casdata, int caslen ) { size = 0; pos = sizeof(UEF_HEADER) + 2; while( pos < caslen ) { - int chunk_type = ( casdata[pos+1] << 8 ) | casdata[pos]; - int chunk_length = ( casdata[pos+5] << 24 ) | ( casdata[pos+4] << 16 ) | ( casdata[pos+3] << 8 ) | casdata[pos+2]; + int chunk_type = get_u16le( &casdata[pos] ); + int chunk_length = get_u32le( &casdata[pos+2] ); int baud_length; pos += 6; @@ -187,14 +189,14 @@ static int uef_cas_to_wav_size( const uint8_t *casdata, int caslen ) { size += ( chunk_length * 10 ) * 4; break; case 0x0110: /* carrier tone (previously referred to as 'high tone') */ - baud_length = ( casdata[pos+1] << 8 ) | casdata[pos]; + baud_length = get_u16le( &casdata[pos] ); size += baud_length * 2; break; case 0x0111: LOG_FORMATS( "Unsupported chunk type: %04x\n", chunk_type ); break; case 0x0112: /* integer gap */ - baud_length = ( casdata[pos+1] << 8 ) | casdata[pos]; + baud_length = get_u16le( &casdata[pos] ); size += baud_length * 2 ; break; case 0x0116: /* floating point gap */ @@ -259,8 +261,8 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) uint32_t pos = sizeof(UEF_HEADER) + 2; length = length / 2; while( length > 0 ) { - int chunk_type = ( bytes[pos+1] << 8 ) | bytes[pos]; - int chunk_length = ( bytes[pos+5] << 24 ) | ( bytes[pos+4] << 16 ) | ( bytes[pos+3] << 8 ) | bytes[pos+2]; + int chunk_type = get_u16le( &bytes[pos] ); + int chunk_length = get_u32le( &bytes[pos+2] ); uint32_t baud_length, j; uint8_t i, *c; @@ -295,14 +297,14 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) } break; case 0x0110: /* carrier tone (previously referred to as 'high tone') */ - for( baud_length = ( ( bytes[pos+1] << 8 ) | bytes[pos] ) ; baud_length; baud_length-- ) { + for( baud_length = get_u16le( &bytes[pos] ) ; baud_length; baud_length-- ) { *p = WAVE_LOW; p++; *p = WAVE_HIGH; p++; length -= 2; } break; case 0x0112: /* integer gap */ - for( baud_length = ( ( bytes[pos+1] << 8 ) | bytes[pos] ) ; baud_length; baud_length-- ) { + for( baud_length = get_u16le( &bytes[pos] ) ; baud_length; baud_length-- ) { *p = WAVE_NULL; p++; *p = WAVE_NULL; p++; length -= 2; @@ -315,7 +317,7 @@ static int uef_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes ) } break; case 0x0117: /* change baud rate */ - baud_length = ( bytes[pos+1] << 8 ) | bytes[pos]; + baud_length = get_u16le( &bytes[pos] ); // These are the only supported numbers if (baud_length == 300) loops = 4; diff --git a/src/lib/formats/vg5k_cas.cpp b/src/lib/formats/vg5k_cas.cpp index ab6787ab850..fcdb9ba7f02 100644 --- a/src/lib/formats/vg5k_cas.cpp +++ b/src/lib/formats/vg5k_cas.cpp @@ -8,6 +8,8 @@ #include "vg5k_cas.h" +#include "multibyte.h" + #define SMPLO -32768 #define SILENCE 0 @@ -143,7 +145,7 @@ static int vg5k_handle_tap(int16_t *buffer, const uint8_t *casdata) else if (casdata[data_pos] == 0xd6) { /* data block size is defined in head block */ - block_size = (casdata[data_pos - 4] | casdata[data_pos - 3]<<8) + 20; + block_size = get_u16le(&casdata[data_pos - 4]) + 20; /* 10000 samples of silence before the data block */ sample_count += vg5k_cas_silence(buffer, sample_count, 10000); diff --git a/src/lib/formats/vt_dsk.cpp b/src/lib/formats/vt_dsk.cpp index a410d7b4e4f..92f652ba98d 100644 --- a/src/lib/formats/vt_dsk.cpp +++ b/src/lib/formats/vt_dsk.cpp @@ -11,6 +11,7 @@ #include "formats/vt_dsk.h" #include "ioprocs.h" +#include "multibyte.h" #include "osdcomm.h" @@ -401,8 +402,8 @@ bool vtech_dsk_format::save(util::random_read_write &io, const std::vector> 8; + put_u16le(&bdatax[pos], chk); + pos += 2; } } diff --git a/src/lib/formats/x1_tap.cpp b/src/lib/formats/x1_tap.cpp index d4fb5db50ae..1a60bb18330 100644 --- a/src/lib/formats/x1_tap.cpp +++ b/src/lib/formats/x1_tap.cpp @@ -23,6 +23,8 @@ #include "x1_tap.h" #include "imageutl.h" +#include "multibyte.h" + #include @@ -81,7 +83,7 @@ static int x1_cas_to_wav_size (const uint8_t *casdata, int caslen) ret = casdata[0x20] | (casdata[0x21] << 8) | (casdata[0x22] << 16) | (casdata[0x23] << 24); cas_size = ret; - samplerate = casdata[0x1c] | (casdata[0x1d] << 8) | (casdata[0x1e] << 16) | (casdata[0x1f] << 24); + samplerate = get_u32le(&casdata[0x1c]); new_format = 1; } else // old TAP format @@ -89,7 +91,7 @@ static int x1_cas_to_wav_size (const uint8_t *casdata, int caslen) ret = (caslen - 4) * 8; // each byte = 8 samples cas_size = ret; - samplerate = casdata[0x00] | (casdata[0x01] << 8) | (casdata[0x02] << 16) | (casdata[0x03] << 24); + samplerate = get_u32le(&casdata[0x00]); new_format = 0; }