mirror of
https://github.com/holub/mame
synced 2025-07-01 08:18:59 +03:00
formats/td0_dsk.cpp: Don't swallow bits and bytes at the end of Huffman-encoded images, when the word buffer can no longer be filled
This commit is contained in:
parent
40590f79b9
commit
f7ad1b7474
@ -90,7 +90,7 @@ private:
|
|||||||
uint8_t getlen;
|
uint8_t getlen;
|
||||||
|
|
||||||
int data_read(uint8_t *buf, uint16_t size);
|
int data_read(uint8_t *buf, uint16_t size);
|
||||||
int next_word();
|
int next_word(int needed);
|
||||||
int GetBit();
|
int GetBit();
|
||||||
int GetByte();
|
int GetByte();
|
||||||
void StartHuff();
|
void StartHuff();
|
||||||
@ -412,16 +412,15 @@ static const uint8_t d_len[256] = {
|
|||||||
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
|
||||||
};
|
};
|
||||||
|
|
||||||
int td0dsk_t::next_word()
|
int td0dsk_t::next_word(int needed)
|
||||||
{
|
|
||||||
if(tdctl.ibufndx >= tdctl.ibufcnt)
|
|
||||||
{
|
{
|
||||||
|
while (getlen <= 8) { // typically reads a word at a time
|
||||||
|
if(tdctl.ibufndx >= tdctl.ibufcnt) {
|
||||||
tdctl.ibufndx = 0;
|
tdctl.ibufndx = 0;
|
||||||
tdctl.ibufcnt = data_read(tdctl.inbuf,BUFSZ);
|
tdctl.ibufcnt = data_read(tdctl.inbuf,BUFSZ);
|
||||||
if(tdctl.ibufcnt <= 0)
|
if(tdctl.ibufcnt <= 0)
|
||||||
return(-1);
|
return(getlen >= needed ? 0 : -1);
|
||||||
}
|
}
|
||||||
while (getlen <= 8) { // typically reads a word at a time
|
|
||||||
getbuf |= tdctl.inbuf[tdctl.ibufndx++] << (8 - getlen);
|
getbuf |= tdctl.inbuf[tdctl.ibufndx++] << (8 - getlen);
|
||||||
getlen += 8;
|
getlen += 8;
|
||||||
}
|
}
|
||||||
@ -432,7 +431,7 @@ int td0dsk_t::next_word()
|
|||||||
int td0dsk_t::GetBit() /* get one bit */
|
int td0dsk_t::GetBit() /* get one bit */
|
||||||
{
|
{
|
||||||
int16_t i;
|
int16_t i;
|
||||||
if(next_word() < 0)
|
if(next_word(1) < 0)
|
||||||
return(-1);
|
return(-1);
|
||||||
i = getbuf;
|
i = getbuf;
|
||||||
getbuf <<= 1;
|
getbuf <<= 1;
|
||||||
@ -446,7 +445,7 @@ int td0dsk_t::GetBit() /* get one bit */
|
|||||||
int td0dsk_t::GetByte() /* get a byte */
|
int td0dsk_t::GetByte() /* get a byte */
|
||||||
{
|
{
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
if(next_word() != 0)
|
if(next_word(8) != 0)
|
||||||
return(-1);
|
return(-1);
|
||||||
i = getbuf;
|
i = getbuf;
|
||||||
getbuf <<= 8;
|
getbuf <<= 8;
|
||||||
@ -1031,7 +1030,9 @@ bool td0_format::load(util::random_read &io, uint32_t form_factor, const std::ve
|
|||||||
else
|
else
|
||||||
build_pc_track_mfm(track, head, image, base_cell_count*2, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
|
build_pc_track_mfm(track, head, image, base_cell_count*2, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
|
||||||
|
|
||||||
track_spt = offset < actual ? imagebuf[offset] : 255;
|
if(actual <= offset)
|
||||||
|
return false;
|
||||||
|
track_spt = imagebuf[offset];
|
||||||
}
|
}
|
||||||
if((track_count > 50) && (form_factor == floppy_image::FF_525)) // ?
|
if((track_count > 50) && (form_factor == floppy_image::FF_525)) // ?
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user