CDROM image loader now ignores empty/comment lines in cue sheets.

MDA video card is now cloneable. Yes, that is a really weird word.
This commit is contained in:
waltje
2019-03-11 16:19:30 -04:00
parent 538f65f443
commit 648f8da55d
6 changed files with 184 additions and 97 deletions

View File

@@ -15,7 +15,7 @@
* **NOTE** This code will very soon be replaced with a C variant, so * **NOTE** This code will very soon be replaced with a C variant, so
* no more changes will be done. * no more changes will be done.
* *
* Version: @(#)cdrom_dosbox.cpp 1.0.12 2019/03/07 * Version: @(#)cdrom_dosbox.cpp 1.0.13 2019/03/11
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -516,7 +516,8 @@ CDROM_Interface_Image::CueGetNumber(int &arg, char **line)
if (success) if (success)
success = (sscanf(temp, "%i", &num) == 1); success = (sscanf(temp, "%i", &num) == 1);
arg = num; if (success)
arg = num;
return success; return success;
} }
@@ -534,7 +535,8 @@ CDROM_Interface_Image::CueGetFrame(uint64_t &arg, char **line)
if (success) if (success)
success = (sscanf(temp, "%d:%d:%d", &min, &sec, &fr) == 3); success = (sscanf(temp, "%d:%d:%d", &min, &sec, &fr) == 3);
arg = MSF_TO_FRAMES(min, sec, fr); if (success)
arg = MSF_TO_FRAMES(min, sec, fr);
return success; return success;
} }
@@ -545,6 +547,9 @@ CDROM_Interface_Image::CueLoadSheet(const wchar_t *cuefile)
{ {
Track track = {0, 0, 0, 0, 0, 0, 0, 0, false, NULL}; Track track = {0, 0, 0, 0, 0, 0, 0, 0, false, NULL};
wchar_t pathname[MAX_FILENAME_LENGTH]; wchar_t pathname[MAX_FILENAME_LENGTH];
wchar_t filename[MAX_FILENAME_LENGTH];
wchar_t temp[MAX_FILENAME_LENGTH];
char ansi[MAX_FILENAME_LENGTH];
char buf[MAX_LINE_LENGTH], *line; char buf[MAX_LINE_LENGTH], *line;
uint64_t shift = 0; uint64_t shift = 0;
uint64_t currPregap = 0; uint64_t currPregap = 0;
@@ -577,6 +582,9 @@ CDROM_Interface_Image::CueLoadSheet(const wchar_t *cuefile)
break; break;
buf[strlen(line) - 1] = '\0'; /* nuke trailing newline */ buf[strlen(line) - 1] = '\0'; /* nuke trailing newline */
/* Ignore empty lines, and 'comment' lines. */
if (*line == '\0' || *line == '#' || *line == ';') continue;
success = CueGetKeyword(command, &line); success = CueGetKeyword(command, &line);
if (command == "TRACK") { if (command == "TRACK") {
@@ -675,11 +683,9 @@ CDROM_Interface_Image::CueLoadSheet(const wchar_t *cuefile)
canAddTrack = false; canAddTrack = false;
char ansi[MAX_FILENAME_LENGTH];
wchar_t filename[MAX_FILENAME_LENGTH];
success = CueGetBuffer(ansi, &line, false); success = CueGetBuffer(ansi, &line, false);
if (! success) break; if (! success) break;
success = CueGetKeyword(type, &line); success = CueGetKeyword(type, &line);
if (! success) break; if (! success) break;
@@ -687,9 +693,9 @@ CDROM_Interface_Image::CueLoadSheet(const wchar_t *cuefile)
bool error = true; bool error = true;
if (type == "BINARY") { if (type == "BINARY") {
wchar_t temp[MAX_FILENAME_LENGTH];
mbstowcs(temp, ansi, sizeof_w(temp)); mbstowcs(temp, ansi, sizeof_w(temp));
memset(filename, 0x00, sizeof(filename));
plat_append_filename(filename, pathname, temp); plat_append_filename(filename, pathname, temp);
track.file = new BinaryFile(filename, error); track.file = new BinaryFile(filename, error);
} }
@@ -705,9 +711,9 @@ CDROM_Interface_Image::CueLoadSheet(const wchar_t *cuefile)
else if (command == "CATALOG") { else if (command == "CATALOG") {
success = CueGetString(mcn, &line); success = CueGetString(mcn, &line);
// ignored commands // ignored commands
} else if (command == "CDTEXTFILE" || command == "FLAGS" || command == "ISRC" } else if (command == "CDTEXTFILE" || command == "FLAGS" || command == "ISRC" ||
|| command == "PERFORMER" || command == "POSTGAP" || command == "REM" command == "PERFORMER" || command == "POSTGAP" || command == "REM" ||
|| command == "SONGWRITER" || command == "TITLE" || command == "") success = true; command == "SONGWRITER" || command == "TITLE" || command == "") success = true;
// failure // failure
else { else {
ERRLOG("CUE: unsupported command '%s' in cue sheet!\n", ERRLOG("CUE: unsupported command '%s' in cue sheet!\n",

View File

@@ -8,7 +8,7 @@
* *
* MDA emulation. * MDA emulation.
* *
* Version: @(#)vid_mda.c 1.0.10 2019/03/07 * Version: @(#)vid_mda.c 1.0.11 2019/03/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -50,37 +50,14 @@
#include "../system/pit.h" #include "../system/pit.h"
#include "../ports/parallel.h" #include "../ports/parallel.h"
#include "video.h" #include "video.h"
#include "vid_mda.h"
typedef struct { static const video_timings_t mda_timings = { VID_ISA,8,16,32,8,16,32 };
mem_map_t mapping;
uint8_t crtc[32];
int crtcreg;
uint8_t ctrl, stat;
int64_t dispontime, dispofftime;
int64_t vidtime;
int firstline, lastline;
int linepos, displine;
int vc, sc;
uint16_t ma, maback;
int con, coff, cursoron;
int dispon, blink;
int64_t vsynctime;
int vadj;
uint8_t cols[256][2][2];
uint8_t *vram;
} mda_t;
static void void
recalc_timings(mda_t *dev) mda_recalctimings(mda_t *dev)
{ {
double _dispontime, _dispofftime, disptime; double _dispontime, _dispofftime, disptime;
@@ -95,23 +72,23 @@ recalc_timings(mda_t *dev)
} }
static void void
mda_out(uint16_t port, uint8_t val, void *priv) mda_out(uint16_t port, uint8_t val, void *priv)
{ {
mda_t *dev = (mda_t *)priv; mda_t *dev = (mda_t *)priv;
switch (port) { switch (port) {
case 0x3b0: case 0x03b0:
case 0x3b2: case 0x03b2:
case 0x3b4: case 0x03b4:
case 0x3b6: case 0x03b6:
dev->crtcreg = val & 31; dev->crtcreg = val & 31;
break; break;
case 0x3b1: case 0x03b1:
case 0x3b3: case 0x03b3:
case 0x3b5: case 0x03b5:
case 0x3b7: case 0x03b7:
dev->crtc[dev->crtcreg] = val; dev->crtc[dev->crtcreg] = val;
if (dev->crtc[10] == 6 && dev->crtc[11] == 7) { if (dev->crtc[10] == 6 && dev->crtc[11] == 7) {
/*Fix for Generic Turbo XT BIOS, /*Fix for Generic Turbo XT BIOS,
@@ -119,38 +96,38 @@ mda_out(uint16_t port, uint8_t val, void *priv)
dev->crtc[10] = 0xb; dev->crtc[10] = 0xb;
dev->crtc[11] = 0xc; dev->crtc[11] = 0xc;
} }
recalc_timings(dev); mda_recalctimings(dev);
break; break;
case 0x3b8: case 0x03b8:
dev->ctrl = val; dev->ctrl = val;
break; break;
} }
} }
static uint8_t uint8_t
mda_in(uint16_t port, void *priv) mda_in(uint16_t port, void *priv)
{ {
mda_t *dev = (mda_t *)priv; mda_t *dev = (mda_t *)priv;
uint8_t ret = 0xff; uint8_t ret = 0xff;
switch (port) { switch (port) {
case 0x3b0: case 0x03b0:
case 0x3b2: case 0x03b2:
case 0x3b4: case 0x03b4:
case 0x3b6: case 0x03b6:
ret = dev->crtcreg; ret = dev->crtcreg;
break; break;
case 0x3b1: case 0x03b1:
case 0x3b3: case 0x03b3:
case 0x3b5: case 0x03b5:
case 0x3b7: case 0x03b7:
ret = dev->crtc[dev->crtcreg]; ret = dev->crtc[dev->crtcreg];
break; break;
case 0x3ba: case 0x03ba:
ret = dev->stat | 0xF0; ret = dev->stat | 0xF0;
break; break;
@@ -162,7 +139,7 @@ mda_in(uint16_t port, void *priv)
} }
static void void
mda_write(uint32_t addr, uint8_t val, void *priv) mda_write(uint32_t addr, uint8_t val, void *priv)
{ {
mda_t *dev = (mda_t *)priv; mda_t *dev = (mda_t *)priv;
@@ -171,7 +148,7 @@ mda_write(uint32_t addr, uint8_t val, void *priv)
} }
static uint8_t uint8_t
mda_read(uint32_t addr, void *priv) mda_read(uint32_t addr, void *priv)
{ {
mda_t *dev = (mda_t *)priv; mda_t *dev = (mda_t *)priv;
@@ -180,7 +157,7 @@ mda_read(uint32_t addr, void *priv)
} }
static void void
mda_poll(void *priv) mda_poll(void *priv)
{ {
mda_t *dev = (mda_t *)priv; mda_t *dev = (mda_t *)priv;
@@ -312,6 +289,7 @@ mda_poll(void *priv)
video_res_y = dev->crtc[6]; video_res_y = dev->crtc[6];
video_bpp = 0; video_bpp = 0;
} }
dev->firstline = 1000; dev->firstline = 1000;
dev->lastline = 0; dev->lastline = 0;
dev->blink++; dev->blink++;
@@ -329,26 +307,11 @@ mda_poll(void *priv)
} }
static void * void
mda_init(const device_t *info) mda_init(mda_t *dev)
{ {
mda_t *dev;
int c; int c;
dev = (mda_t *)mem_alloc(sizeof(mda_t));
memset(dev, 0x00, sizeof(mda_t));
dev->vram = (uint8_t *)mem_alloc(0x1000);
timer_add(mda_poll, &dev->vidtime, TIMER_ALWAYS_ENABLED, dev);
mem_map_add(&dev->mapping, 0xb0000, 0x08000,
mda_read,NULL,NULL, mda_write,NULL,NULL,
NULL, MEM_MAPPING_EXTERNAL, dev);
io_sethandler(0x03b0, 16,
mda_in,NULL,NULL, mda_out,NULL,NULL, dev);
for (c = 0; c < 256; c++) { for (c = 0; c < 256; c++) {
dev->cols[c][0][0] = dev->cols[c][1][0] = dev->cols[c][1][1] = 16; dev->cols[c][0][0] = dev->cols[c][1][0] = dev->cols[c][1][1] = 16;
if (c & 8) if (c & 8)
@@ -380,13 +343,37 @@ mda_init(const device_t *info)
cga_palette = 0; cga_palette = 0;
video_palette_rebuild(); video_palette_rebuild();
video_inform(VID_TYPE_MDA, info->vid_timing); timer_add(mda_poll, &dev->vidtime, TIMER_ALWAYS_ENABLED, dev);
mem_map_add(&dev->mapping, 0xb0000, 0x08000,
mda_read,NULL,NULL, mda_write,NULL,NULL,
NULL, MEM_MAPPING_EXTERNAL, dev);
io_sethandler(0x03b0, 16,
mda_in,NULL,NULL, mda_out,NULL,NULL, dev);
video_inform(VID_TYPE_MDA, &mda_timings);
}
static void *
mda_standalone_init(const device_t *info)
{
mda_t *dev;
dev = (mda_t *)mem_alloc(sizeof(mda_t));
memset(dev, 0x00, sizeof(mda_t));
dev->type = info->local;
dev->vram = (uint8_t *)mem_alloc(0x1000);
mda_init(dev);
/* Force the LPT3 port to be enabled. */ /* Force the LPT3 port to be enabled. */
parallel_enabled[2] = 1; parallel_enabled[2] = 1;
parallel_setup(2, 0x03bc); parallel_setup(2, 0x03bc);
return dev; return(dev);
} }
@@ -396,6 +383,7 @@ mda_close(void *priv)
mda_t *dev = (mda_t *)priv; mda_t *dev = (mda_t *)priv;
free(dev->vram); free(dev->vram);
free(dev); free(dev);
} }
@@ -404,12 +392,12 @@ static void
speed_changed(void *priv) speed_changed(void *priv)
{ {
mda_t *dev = (mda_t *)priv; mda_t *dev = (mda_t *)priv;
recalc_timings(dev); mda_recalctimings(dev);
} }
static const device_config_t mda_config[] = { const device_config_t mda_config[] = {
{ {
"rgb_type", "Display type", CONFIG_SELECTION, "", 0, "rgb_type", "Display type", CONFIG_SELECTION, "", 0,
{ {
@@ -435,16 +423,21 @@ static const device_config_t mda_config[] = {
} }
}; };
static const video_timings_t mda_timings = { VID_ISA,8,16,32,8,16,32 };
const device_t mda_device = { const device_t mda_device = {
"MDA", "MDA",
DEVICE_ISA, DEVICE_ISA,
0, 0,
mda_init, mda_close, NULL, mda_standalone_init, mda_close, NULL,
NULL, NULL,
speed_changed, speed_changed,
NULL, NULL,
&mda_timings, NULL,
mda_config mda_config
}; };
void
mda_setcol(mda_t *dev, int chr, int blink, int fg, uint8_t cga_ink)
{
dev->cols[chr][blink][fg] = pal_lookup[cga_ink];
}

View File

@@ -0,0 +1,86 @@
/*
* VARCem Virtual ARchaeological Computer EMulator.
* An emulator of (mostly) x86-based PC systems and devices,
* using the ISA,EISA,VLB,MCA and PCI system buses, roughly
* spanning the era between 1981 and 1995.
*
* This file is part of the VARCem Project.
*
* Definitions for the MDA driver.
*
* Version: @(#)vid_mda.h 1.0.1 2019/03/09
*
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
*
* Copyright 2017-2019 Fred N. van Kempen.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the:
*
* Free Software Foundation, Inc.
* 59 Temple Place - Suite 330
* Boston, MA 02111-1307
* USA.
*/
#ifndef VIDEO_MDA_H
# define VIDEO_MDA_H
#define MDA_FONT_ROM_PATH L"video/ibm/mda/mda.rom"
typedef struct {
int type;
mem_map_t mapping;
uint8_t crtc[32];
int crtcreg;
uint8_t ctrl, stat;
int64_t dispontime, dispofftime;
int64_t vidtime;
int firstline, lastline;
int linepos, displine;
int vc, sc;
uint16_t ma, maback;
int con, coff, cursoron;
int dispon, blink;
int64_t vsynctime;
int vadj;
uint8_t cols[256][2][2];
uint8_t *vram;
} mda_t;
#ifdef EMU_DEVICE_H
extern const device_config_t mda_config[];
#endif
extern void mda_init(mda_t *);
extern void mda_out(uint16_t port, uint8_t val, void *priv);
extern uint8_t mda_in(uint16_t port, void *priv);
extern void mda_write(uint32_t addr, uint8_t val, void *priv);
extern uint8_t mda_read(uint32_t addr, void *priv);
extern void mda_recalctimings(mda_t *);
extern void mda_poll(void *priv);
extern void mda_setcol(mda_t *, int chr, int blink, int fg, uint8_t ink);
#endif /*VIDEO_MDA_H*/

View File

@@ -8,7 +8,7 @@
* *
* Main video-rendering module. * Main video-rendering module.
* *
* Version: @(#)video.c 1.0.26 2019/03/07 * Version: @(#)video.c 1.0.27 2019/03/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -61,8 +61,8 @@ int video_do_log = ENABLE_VIDEO_LOG;
#endif #endif
/* These will go away soon. */ /* These will go away soon. */
uint8_t fontdat[1024][8]; /* IBM CGA font */ uint8_t fontdat[2048][8]; /* IBM CGA font */
uint8_t fontdatm[1024][16]; /* IBM MDA font */ uint8_t fontdatm[2048][16]; /* IBM MDA font */
dbcs_font_t *fontdatk = NULL, /* Korean KSC-5601 font */ dbcs_font_t *fontdatk = NULL, /* Korean KSC-5601 font */
*fontdatk_user = NULL; /* Korean KSC-5601 font (user)*/ *fontdatk_user = NULL; /* Korean KSC-5601 font (user)*/
@@ -71,6 +71,7 @@ bitmap_t *screen = NULL;
uint32_t *video_6to8 = NULL, uint32_t *video_6to8 = NULL,
*video_15to32 = NULL, *video_15to32 = NULL,
*video_16to32 = NULL; *video_16to32 = NULL;
uint32_t pal_lookup[256];
uint8_t edatlookup[4][4]; uint8_t edatlookup[4][4];
int xsize = 1, int xsize = 1,
ysize = 1; ysize = 1;
@@ -372,7 +373,6 @@ static const uint32_t shade[5][256] = {
} }
}; };
static uint32_t cga_2_table[16]; static uint32_t cga_2_table[16];
static uint32_t pal_lookup[256];
static uint8_t rotatevga[8][256]; static uint8_t rotatevga[8][256];
static int video_force_resize; static int video_force_resize;
static int video_card_type; static int video_card_type;

View File

@@ -8,7 +8,7 @@
* *
* Definitions for the video controller module. * Definitions for the video controller module.
* *
* Version: @(#)video.h 1.0.29 2019/03/08 * Version: @(#)video.h 1.0.30 2019/03/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -119,8 +119,8 @@ typedef struct {
extern int changeframecount; extern int changeframecount;
/* These will go away soon. */ /* These will go away soon. */
extern uint8_t fontdat[1024][8]; /* 1024 characters */ extern uint8_t fontdat[2048][8]; /* 2048!! characters */
extern uint8_t fontdatm[1024][16]; /* 1024 characters */ extern uint8_t fontdatm[2048][16]; /* 2048!! characters */
extern dbcs_font_t *fontdatk, extern dbcs_font_t *fontdatk,
*fontdatk_user; *fontdatk_user;
@@ -128,6 +128,7 @@ extern bitmap_t *screen;
extern uint32_t *video_6to8, extern uint32_t *video_6to8,
*video_15to32, *video_15to32,
*video_16to32; *video_16to32;
extern uint32_t pal_lookup[256];
extern int fullchange; extern int fullchange;
extern int xsize,ysize; extern int xsize,ysize;
extern int update_overscan; extern int update_overscan;

View File

@@ -12,7 +12,7 @@
* "extern" reference to its device into the video.h file, * "extern" reference to its device into the video.h file,
* and add an entry for it into the table here. * and add an entry for it into the table here.
* *
* Version: @(#)video_dev.c 1.0.34 2019/03/07 * Version: @(#)video_dev.c 1.0.35 2019/03/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -51,6 +51,7 @@
#include "../../device.h" #include "../../device.h"
#include "../../plat.h" #include "../../plat.h"
#include "video.h" #include "video.h"
#include "vid_mda.h"
#ifdef ENABLE_VIDEO_DEV_LOG #ifdef ENABLE_VIDEO_DEV_LOG
@@ -216,7 +217,7 @@ video_reset(void)
video_reset_font(); video_reset_font();
/* Initialize the video font tables. */ /* Initialize the video font tables. */
video_load_font(L"video/ibm/mda/mda.rom", FONT_MDA); video_load_font(MDA_FONT_ROM_PATH, FONT_MDA);
/* Do not initialize internal cards here. */ /* Do not initialize internal cards here. */
if ((video_card == VID_NONE) || \ if ((video_card == VID_NONE) || \