add VGA support to teensyuae41

This commit is contained in:
jean-marcharvengt 2020-08-16 21:26:22 +02:00
parent 53115a9e26
commit 685294c420
16 changed files with 2921 additions and 1807 deletions

View file

@ -64,6 +64,28 @@ void AUDxDAT(int nr, uae_u16 v)
#endif
}
void AUDxLCH(int nr, uae_u16 v) { audio_channel[nr].lc = (audio_channel[nr].lc & 0xffff) | ((uae_u32)v << 16); }
void AUDxLCL(int nr, uae_u16 v) { audio_channel[nr].lc = (audio_channel[nr].lc & ~0xffff) | (v & 0xFFFE); }
void AUDxPER(int nr, uae_u16 v)
{
if (v <= 0) {
#if 0 /* v == 0 is rather common, and harmless, and the value isn't signed anyway */
static int warned = 0;
if (!warned)
write_log ("Broken program accessing the sound hardware\n"), warned++;
#endif
v = 65535;
}
if (v < maxhpos/2 && currprefs.produce_sound < 3)
v = maxhpos/2;
audio_channel[nr].per = v;
}
void AUDxVOL(int nr, uae_u16 v) { audio_channel[nr].vol = v & 64 ? 63 : v & 63; }
void AUDxLEN(int nr, uae_u16 v) { audio_channel[nr].len = v; }
/* Templates! I want templates! */
void sample16_handler(void)
{

View file

@ -10,6 +10,7 @@ extern struct audio_channel_data {
uaecptr lc, pt, dmaen;
int data_written, snum, state, intreq2, wper, wlen;
uae_u16 dat, nextdat, vol, per, len;
unsigned long adk_mask;
int current_sample;
} audio_channel[4];
@ -21,4 +22,9 @@ extern void aud3_handler(void);
#endif
extern void AUDxDAT(int nr, uae_u16 value);
extern void AUDxVOL(int nr, uae_u16 value);
extern void AUDxPER(int nr, uae_u16 value);
extern void AUDxLCH(int nr, uae_u16 value);
extern void AUDxLCL(int nr, uae_u16 value);
extern void AUDxLEN(int nr, uae_u16 value);

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@
*
* Floppy disk emulation
*
* (c) 1995 Bernd Schmidt, Hannu Rummukainen
* Copyright 1995 Bernd Schmidt, Hannu Rummukainen
*/
#include <stdio.h>
@ -11,29 +11,30 @@
#include "shared.h"
#include "memory.h"
#include "gensound.h"
#include "sounddep/sound.h"
#include "events.h"
#include "custom.h"
#include "ersatz.h"
#include "disk.h"
#include "gui.h"
//#include "zfile.h"
#include "zfile.h"
#include "autoconf.h"
#include "readcpu.h"
#include "newcpu.h"
#include "xwin.h"
//#include "osemu.h"
#include "execlib.h"
#define NB_DRIVE 1
#define STATIC_INLINE static
#define FLOPPY_GAP_LEN 360
#define FLOPPY_SPEED 3
#define FLOPPY_SPEED 50
//JMH: uae_u16* mfmwrite;
//JMH: static uae_u16 mfmwrbuffer[16384]; /* space for maximum disk DMA transfer */
#ifdef HAS_FLOPPYWRITE
uae_u16* mfmwrite;
static uae_u16 mfmwrbuffer[16384]; /* space for maximum disk DMA transfer */
#endif
static int side, direction, step;
static uae_u8 selected = 15;
@ -58,6 +59,7 @@ typedef struct {
int motoroff;
int wrprot;
uae_u16 bigmfmbuf[0x4000];
int mfmbufpos;
int tracklen;
unsigned long last_cycles;
int mfmpos;
@ -75,27 +77,50 @@ typedef struct {
drive floppy[NB_DRIVE];
static void drive_fill_bigbuf(drive *drv);
static void drive_fill_bigbuf (drive *drv);
#ifdef unused
FILE *DISK_validate_filename (const char *fname, int leave_open, int *wrprot)
{
FILE *f = fopen (fname, "r+b");
if (f) {
if (wrprot)
*wrprot = 0;
} else {
if (wrprot)
*wrprot = 1;
f = fopen (fname, "rb");
}
if (!leave_open)
fclose (f);
return f;
}
#endif
static int drive_insert(drive *drv, int dnum, const char *fname)
static int drive_insert (drive *drv, int dnum, const char *fname)
{
unsigned char buffer[10];
drv->diskfile = emu_FileOpen(fname);
if (drv->diskfile == 0)
return 0;
strncpy (currprefs.df[dnum], fname, MAX_FILENAME-1);
currprefs.df[dnum][MAX_FILENAME-1] = 0;
strncpy (changed_prefs.df[dnum], fname, MAX_FILENAME-1);
changed_prefs.df[dnum][MAX_FILENAME-1] = 0;
emu_printf("flop:");
emu_printf("insert");
emu_printf(fname);
#ifdef unused
drv->diskfile = DISK_validate_filename (fname, 1, &drv->wrprot);
#endif
drv->diskfile = emu_FileOpen(fname);
if (drv->diskfile == 0) {
drv->tracklen = 2000;
return 0;
}
strncpy (currprefs.df[dnum], fname, 255);
currprefs.df[dnum][255] = 0;
strncpy (changed_prefs.df[dnum], fname, 255);
changed_prefs.df[dnum][255] = 0;
//gui_filename(dnum, fname);
emu_FileRead(buffer, 8);
if (strncmp((char *)buffer,"UAE--ADF",8) == 0) {
emu_printf("UAE--ADF");
int offs = 160*4+8;
int i;
@ -111,14 +136,14 @@ static int drive_insert(drive *drv, int dnum, const char *fname)
drv->trackdata[i].offs = offs;
offs += drv->trackdata[i].len;
}
}
else {
} else {
unsigned int i;
emu_printf("NORMAL");
drv->filetype = ADF_NORMAL;
i = emu_FileSize(fname);
drv->diskfile = emu_FileOpen(fname);
emu_FileOpen(fname);
/* High-density disk? */
if (i >= 160*22*512)
drv->num_tracks = i / (512*(drv->num_secs = 22));
@ -126,7 +151,7 @@ static int drive_insert(drive *drv, int dnum, const char *fname)
drv->num_tracks = i / (512*(drv->num_secs = 11));
if (drv->num_tracks > MAX_TRACKS)
emu_printf("Your diskfile is too big!\n");
write_log ("Your diskfile is too big!\n");
for(i = 0; i < drv->num_tracks; i++) {
drv->trackdata[i].len = 512 * drv->num_secs;
drv->trackdata[i].sync = 0;
@ -134,21 +159,21 @@ static int drive_insert(drive *drv, int dnum, const char *fname)
}
}
drv->buffered_side = 2; /* will force read */
drive_fill_bigbuf (drv);
return 1;
}
static int drive_empty(drive *drv)
static int drive_empty (drive *drv)
{
return drv->diskfile == 0;
}
static void drive_step(drive *drv)
static void drive_step (drive *drv)
{
if (!drive_empty(drv))
drv->dskchange = 0;
else if (drv->dskchange > 1) {
/* emu_printf("Stepping...\n");
/* printf("Stepping...\n");
drv->dskchange--;*/
}
if (direction) {
@ -159,22 +184,22 @@ static void drive_step(drive *drv)
}
static int drive_track0(drive *drv)
static int drive_track0 (drive *drv)
{
return drv->cyl == 0;
}
static int drive_writeprotected(drive *drv)
static int drive_writeprotected (drive *drv)
{
return drv->wrprot || drv->diskfile == NULL;
}
static int drive_running(drive *drv)
static int drive_running (drive *drv)
{
return !drv->motoroff;
}
static void drive_motor(drive *drv, int off)
static void drive_motor (drive *drv, int off)
{
if (drv->motoroff && !off) {
drv->last_cycles = cycles;
@ -188,7 +213,7 @@ static void drive_motor(drive *drv, int off)
} else if (off)
eventtab[ev_diskindex].active = 0;
drv->motoroff = off;
events_schedule();
events_schedule ();
}
static void drive_fill_bigbuf(drive *drv)
@ -196,21 +221,24 @@ static void drive_fill_bigbuf(drive *drv)
int tr = drv->cyl*2 + side;
if (!drv->diskfile) {
drv->tracklen = 10;
drv->tracklen = 2000;
memset (drv->bigmfmbuf,0xaa,drv->tracklen*2);
return;
}
if (drv->buffered_cyl == drv->cyl && drv->buffered_side == side)
return;
/* if (drv->num_tracks <= tr) {
write_log ("Access beyond end of floppy image!\n");
}*/
if (drv->trackdata[tr].sync == 0) {
/* Normal AmigaDOS format track */
unsigned int sec;
drv->tracklen = drv->num_secs*544 + FLOPPY_GAP_LEN;
memset(drv->bigmfmbuf,0xaa,FLOPPY_GAP_LEN*2);
memset (drv->bigmfmbuf,0xaa,FLOPPY_GAP_LEN*2);
for (sec = 0; sec < drv->num_secs; sec++)
{
for (sec = 0; sec < drv->num_secs; sec++) {
uae_u8 secbuf[544];
int i;
uae_u16 *mfmbuf = drv->bigmfmbuf + 544*sec + FLOPPY_GAP_LEN;
@ -227,9 +255,9 @@ static void drive_fill_bigbuf(drive *drv)
for(i = 8; i < 24; i++)
secbuf[i] = 0;
emu_FileSeek(drv->trackdata[tr].offs + sec*512,
emu_FileSeek (drv->trackdata[tr].offs + sec*512,
SEEK_SET);
emu_FileRead(&secbuf[32],512);
emu_FileRead (&secbuf[32],512);
mfmbuf[0] = mfmbuf[1] = 0xaaaa;
mfmbuf[2] = mfmbuf[3] = 0x4489;
@ -245,16 +273,16 @@ static void drive_fill_bigbuf(drive *drv)
mfmbuf[7] = deven;
for (i = 8; i < 48; i++)
mfmbuf[i] = 0;
mfmbuf[i] = 0xaaaa;
for (i = 0; i < 512; i += 4){
deven = ((secbuf[i+32] << 24) | (secbuf[i+33] << 16)
| (secbuf[i+34] << 8) | (secbuf[i+35]));
dodd = deven >> 1;
deven &= 0x55555555; dodd &= 0x55555555;
mfmbuf[(i>>1)+32] = dodd >> 16;
mfmbuf[(i>>1)+33] = dodd;
mfmbuf[(i>>1)+256+32] = deven >> 16;
mfmbuf[(i>>1)+256+33] = deven;
mfmbuf[(i>>1) + 32] = dodd >> 16;
mfmbuf[(i>>1) + 33] = dodd;
mfmbuf[(i>>1) + 256 + 32] = deven >> 16;
mfmbuf[(i>>1) + 256 + 33] = deven;
}
for(i = 4; i < 24; i += 2)
@ -262,21 +290,21 @@ static void drive_fill_bigbuf(drive *drv)
deven = dodd = hck; dodd >>= 1;
mfmbuf[24] = dodd >> 16; mfmbuf[25] = dodd;
mfmbuf[26] = deven>> 16; mfmbuf[27] = deven;
mfmbuf[26] = deven >> 16; mfmbuf[27] = deven;
for(i = 32; i < 544; i += 2)
dck ^= (mfmbuf[i] << 16) | mfmbuf[i+1];
deven = dodd = dck; dodd >>= 1;
mfmbuf[28] = dodd >> 16; mfmbuf[29] = dodd;
mfmbuf[30] = deven>> 16; mfmbuf[31] = deven;
mfmbuf[30] = deven >> 16; mfmbuf[31] = deven;
}
} else {
int i;
drv->tracklen = drv->trackdata[tr].len/2 + 1;
drv->bigmfmbuf[0] = drv->trackdata[tr].sync;
emu_FileSeek(drv->trackdata[tr].offs, SEEK_SET);
emu_FileRead(drv->bigmfmbuf+1, drv->trackdata[tr].len);
emu_FileRead((char *)(drv->bigmfmbuf + 1), drv->trackdata[tr].len);
for (i = 0; i < drv->trackdata[tr].len/2; i++) {
uae_u16 *mfm = drv->bigmfmbuf + i + 1;
uae_u8 *data = (uae_u8 *)mfm;
@ -290,73 +318,110 @@ static void drive_fill_bigbuf(drive *drv)
drv->mfmpos = 0;
}
static int drive_get_data(drive *drv, uae_u16 *mfm, uae_u16 *byt)
/* Perform DMA for the time interval since the last call. */
static int drive_update_reads (drive *drv, uaecptr *ptr, int *length, int *syncfound, int sync)
{
int offset,mfmpos;
unsigned long maxbytes = (cycles - drv->last_cycles) * 2 / FLOPPY_SPEED;
unsigned long maxcount = maxbytes >> 1;
drv->last_cycles += maxcount * FLOPPY_SPEED;
drive_fill_bigbuf(drv);
offset = (cycles - drv->last_cycles) / FLOPPY_SPEED;
mfmpos = (drv->mfmpos + offset) % drv->tracklen;
drv->last_cycles += offset*FLOPPY_SPEED;
drv->mfmpos = mfmpos;
*mfm = drv->bigmfmbuf[mfmpos];
return offset > 0;
if (! ptr) {
if (! drv->motoroff)
drv->mfmpos += maxcount;
drv->mfmpos %= drv->tracklen;
} else {
while (maxcount-- > 0 && *length > 0) {
unsigned int word;
if (drv->mfmpos > drv->tracklen) {
write_log ("Bug in disk code - mfmpos too large\n");
drv->mfmpos = 0;
}
word = drv->bigmfmbuf[drv->mfmpos];
if (*syncfound) {
put_word (*ptr, word);
(*ptr) += 2;
(*length)--;
}
if (word == sync)
*syncfound = 1;
if (! drv->motoroff)
drv->mfmpos++;
if (drv->mfmpos > drv->tracklen)
drv->mfmpos = 0;
}
}
return ! drv->motoroff && maxbytes >= 1;
}
/* We assume that drive_update_reads has already been called. */
static void drive_get_data (drive *drv, uae_u16 *mfm, uae_u16 *byt)
{
*mfm = drv->bigmfmbuf[drv->mfmpos];
if (cycles - drv->last_cycles > (FLOPPY_SPEED / 2))
*byt = *mfm & 0xff;
else
*byt = (*mfm >> 8) & 0xff;
}
#define MFMMASK 0x55555555
static __inline__ uae_u32 getmfmlong(uae_u16* mbuf)
STATIC_INLINE uae_u32 getmfmlong (uae_u16* mbuf)
{
return ((*mbuf << 16) | *(mbuf + 1)) & MFMMASK;
}
static void drive_write_data(drive *drv, uae_u16 *mbuf, int length)
static void drive_write_data (drive *drv, uae_u16 *mbuf, int length)
{
#ifdef HAS_FLOPPYWRITE
int i, secwritten = 0;
uae_u32 odd, even, chksum, id, dlong;
uae_u8* secdata;
uae_u8 secbuf[544];
uae_u16 *mend = mbuf + length;
if (drive_writeprotected(drv))
if (drive_writeprotected (drv))
return;
drive_fill_bigbuf(drv);
drive_fill_bigbuf (drv);
mend -= (4 + 16 + 8 + 512);
while (length > 0) {
int trackoffs;
do {
while (*mbuf++ != 0x4489) {
if (mbuf >= mend) return;
if (mbuf >= mend)
return;
}
} while (*mbuf++ != 0x4489);
odd = getmfmlong(mbuf);
even = getmfmlong(mbuf+2);
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 2);
mbuf += 4;
id = (odd << 1) | even;
trackoffs = (id & 0xff00) >> 8;
if (trackoffs > 10) {
emu_printf("Disk write: weird sector number:");
emu_printi(trackoffs);
//write_log ("Disk write: weird sector number %d\n", trackoffs);
continue;
}
chksum = odd ^ even;
for (i=0; i<4; i++) {
for (i = 0; i < 4; i++) {
odd = getmfmlong(mbuf);
even = getmfmlong(mbuf+8);
mbuf += 2;
dlong = (odd << 1) | even;
if (dlong) secwritten = -200;
if (dlong)
secwritten = -200;
chksum ^= odd ^ even;
} /* could check here if the label is nonstandard */
mbuf += 8;
odd = getmfmlong(mbuf); even = getmfmlong(mbuf+2); mbuf += 4;
if ((((odd << 1) | even) != chksum) ||
(((id & 0x00ff0000) >> 16) != drv->cyl*2 + side)) {
emu_printf("Disk write: checksum error on sector header\n");
odd = getmfmlong (mbuf); even = getmfmlong (mbuf+2); mbuf += 4;
if (((odd << 1) | even) != chksum
|| ((id & 0x00ff0000) >> 16) != drv->cyl*2 + side)
{
write_log ("Disk write: checksum error on sector header\n");
continue;
}
odd = getmfmlong(mbuf); even = getmfmlong(mbuf+2); mbuf += 4;
@ -371,31 +436,32 @@ static void drive_write_data(drive *drv, uae_u16 *mbuf, int length)
}
mbuf += 256;
if (chksum) {
emu_printf("Disk write: data checksum error\n");
write_log ("Disk write: data checksum error\n");
continue;
}
secwritten++;
emu_FileSeek(drv->trackdata[drv->cyl*2 + side].offs + trackoffs*512,
emu_FileSeek (drv->trackdata[drv->cyl*2 + side].offs + trackoffs*512,
SEEK_SET);
// JMH fwrite(secbuf+32, sizeof(uae_u8), 512, drv->diskfile);
emu_FileRead (secbuf+32, 512);
}
drv->buffered_side = 2; /* will force read */
if (secwritten == 0)
emu_printf("Disk write in unsupported format\n");
write_log ("Disk write in unsupported format\n");
if (secwritten < 0)
emu_printf("Disk write: sector labels ignored\n");
write_log ("Disk write: sector labels ignored\n");
#endif
}
static void drive_eject(drive *drv)
static void drive_eject (drive *drv)
{
if (!drive_empty(drv))
if (! drive_empty (drv))
emu_FileClose();
drv->dskchange = 4;
drv->dskchange_time = 20;
/* emu_printf("setting changed bit %d\n", drv-floppy);*/
/* printf("setting changed bit %d\n", drv-floppy);*/
drv->diskfile = 0;
}
@ -403,24 +469,223 @@ static void drive_eject(drive *drv)
* No error checking - we trust our luck. */
void DISK_ersatz_read (int tr, int sec, uaecptr dest)
{
int i;
uae_u8 *dptr = get_real_address(dest);
emu_FileSeek(floppy[0].trackdata[tr].offs + sec*512, SEEK_SET);
emu_FileRead(dptr, 512);
emu_FileSeek (floppy[0].trackdata[tr].offs + sec*512, SEEK_SET);
emu_FileRead (dptr, 512);
}
void disk_eject(int num)
void disk_eject (int num)
{
//gui_filename(num, "");
drive_eject(floppy + num);
//*currprefs.df[num] = *changed_prefs.df[num] = 0;
*currprefs.df[num] = *changed_prefs.df[num] = 0;
}
void disk_insert(int num, const char *name)
void disk_insert (int num, const char *name)
{
/* just to be sure */
drive_eject(floppy + num);
drive_insert(floppy + num, num, name);
drive_eject (floppy + num);
drive_insert (floppy + num, num, name);
}
void DISK_check_change (void)
{
int i;
static int count = 0;
count++;
for (i = 0; i < NB_DRIVE; i++) {
if (strcmp (currprefs.df[i], changed_prefs.df[i]) != 0) {
if (currprefs.df[i][0] != '\0') {
drive_eject(floppy + i);
currprefs.df[i][0] = '\0';
//gui_filename(i, "");
} else if (floppy[i].dskchange == 1) {
/* In theory, it should work without the dskchange test.
* In practice, it doesn't. */
drive_insert (floppy + i, i, changed_prefs.df[i]);
} else if (floppy[i].dskchange > 1 && floppy[i].dskchange_time > 0) {
/* Force the dskchange bit to go to 1 after a given timeout */
if (--floppy[i].dskchange_time == 0) {
floppy[i].dskchange = 1;
}
}
}
}
}
int disk_empty (int num)
{
return drive_empty (floppy + num);
}
void DISK_init (void)
{
int i;
for (i = 0; i < NB_DRIVE; i++)
if (!drive_insert (floppy+i, i, currprefs.df[i]))
disk_eject (i);
if (disk_empty (0))
write_log ("No disk in drive 0.\n");
}
static int ledstate[] = { 0,0,0,0 };
void DISK_select (uae_u8 data)
{
int step_pulse;
int dr;
if (selected != ((data >> 3) & 15))
dskready = 0;
selected = (data >> 3) & 15;
side = 1 - ((data >> 2) & 1);
direction = (data >> 1) & 1;
step_pulse = data & 1;
if (step != step_pulse) {
step = step_pulse;
if (step == 0){
for (dr = 0; dr < NB_DRIVE; dr++){
if (!(selected & (1 << dr))) {
drive_step (floppy + dr);
}
}
}
}
for (dr = 0; dr < NB_DRIVE; dr++){
if (!(selected & (1<<dr))) {
drive_motor(floppy + dr, data >> 7);
}
}
for (dr = 0; dr < NB_DRIVE; dr++) {
int state = (!(selected & (1<<dr))) | !floppy[dr].motoroff;
if (state == ledstate[dr])
continue;
//gui_led (dr + 1, state);
//ledstate[dr] = state;
//gui_ledstate &= ~(1 << (dr + 1));
//gui_ledstate |= state << (dr + 1);
}
}
uae_u8 DISK_status (void)
{
uae_u8 st = 0x3c;
int dr;
for (dr = 0; dr < NB_DRIVE; dr++){
drive *drv = floppy + dr;
if (!(selected & (1 << dr))) {
if (drive_running(drv)){
if (dskready) st &= ~0x20;
dskready = 1;
} else {
st &= ~0x20; /* report drive ID */
}
if (drive_track0 (drv)) { st &= ~0x10; }
if (drive_writeprotected (drv)) { st &= ~8; }
if (drv->dskchange) {
/*printf("changed bit set: %d\n",dr); */
st &= ~0x4;
if (drv->dskchange > 1)
drv->dskchange--;
}
}
}
return st;
}
void DISK_GetData (uae_u16 *mfm, uae_u16 *byt)
{
int dr;
for (dr = 0; dr < NB_DRIVE; dr++){
if (!(selected & (1<<dr))) {
drive_get_data (floppy + dr, mfm, byt);
}
}
}
void DISK_InitWrite (void)
{
#ifdef HAS_FLOPPYWRITE
mfmwrite = mfmwrbuffer;
#endif
}
int DISK_update_reads (uaecptr *ptr, int *length, int *syncfound, int sync)
{
int dr;
for (dr = 0; dr < NB_DRIVE; dr++) {
if (!(selected & (1<<dr))) {
return drive_update_reads (floppy + dr, ptr, length, syncfound, sync);
}
}
return 0;
}
void DISK_WriteData (int length)
{
#ifdef HAS_FLOPPYWRITE
int dr;
for (dr = 0; dr < NB_DRIVE; dr++) {
if (!(selected & (1<<dr))) {
drive_write_data(floppy + dr, mfmwrbuffer, length);
}
}
#endif
}
void DISK_search_sync (int cycle_limit, unsigned int sync)
{
int dr;
for (dr = 0; dr < NB_DRIVE; dr++) {
if (!(selected & (1 << dr))) {
drive *drv = floppy + dr;
unsigned long offs = drv->mfmpos;
unsigned long missing = FLOPPY_SPEED - (cycles - drv->last_cycles);
unsigned long count = 0;
if (missing == 0) {
write_log ("bug in disk code: missing == 0\n");
return;
}
while (missing < cycle_limit) {
count += missing;
cycle_limit -= missing;
missing = FLOPPY_SPEED;
if (drv->bigmfmbuf[offs] == sync) {
eventtab[ev_disksync].active = 1;
eventtab[ev_disksync].oldcycles = cycles;
eventtab[ev_disksync].evtime = cycles + count;
events_schedule ();
}
offs++;
}
}
}
}
/* Called when DMA gets restarted, so that we don't do DMA for the
parts of the track that went past us while DMA was off. */
void DISK_reset_cycles (void)
{
int dr;
for (dr = 0; dr < NB_DRIVE; dr++) {
drive *drv = floppy + dr;
unsigned long count = (cycles - drv->last_cycles) / FLOPPY_SPEED;
drv->mfmpos += count;
drv->mfmpos %= drv->tracklen;
drv->last_cycles += count * FLOPPY_SPEED;
}
}
void DISK_StartRead ()
{
DISK_reset_cycles ();
}
static int first = 0;
@ -441,209 +706,4 @@ void disk_swap(const char * disk0, const char * disk1)
emu_printf(disk1);
drive_insert(floppy + 0, 0, disk1);
}
emu_printf("done");
delay(100);
}
void DISK_check_change (void)
{
int i;
static int count = 0;
count++;
for (i = 0; i < NB_DRIVE; i++) {
if (strcmp (currprefs.df[i], changed_prefs.df[i]) != 0) {
if (currprefs.df[i][0] != '\0') {
drive_eject(floppy + i);
currprefs.df[i][0] = '\0';
/*emu_printf("Ejecting %d at %d\n", i, count);*/
} else if (floppy[i].dskchange == 1) {
/* In theory, it should work without the dskchange test.
* In practice, it doesn't. */
drive_insert (floppy + i, i, changed_prefs.df[i]);
/*emu_printf("Inserting %d at %d\n", i, count);*/
} else if (floppy[i].dskchange > 1 && floppy[i].dskchange_time > 0) {
/* Force the dskchange bit to go to 1 after a given timeout */
/*emu_printf("Countdown %d at %d\n", i, count);*/
if (--floppy[i].dskchange_time == 0) {
/*emu_printf("Timeout %d at %d\n", i, count);*/
floppy[i].dskchange = 1;
}
}
}
}
}
int disk_empty(int num)
{
return drive_empty(floppy + num);
}
void DISK_init()
{
int i;
for (i = 0; i < NB_DRIVE; i++)
if (!drive_insert (floppy+i, i, currprefs.df[i])) {
emu_printf("eject");
disk_eject (i);
}
if (disk_empty (0))
emu_printf("No disk in drive 0.\n");
}
static int ledstate[] = { 0,0,0,0 };
void DISK_select(uae_u8 data)
{
int step_pulse;
int dr;
if (selected != ((data >> 3) & 15))
dskready = 0;
selected = (data >> 3) & 15;
side = 1 - ((data >> 2) & 1);
direction = (data >> 1) & 1;
step_pulse = data & 1;
if (step != step_pulse) {
step = step_pulse;
if (step == 0){
for (dr = 0; dr < NB_DRIVE; dr++){
if (!(selected & (1 << dr))) {
drive_step(floppy + dr);
}
}
}
}
for (dr = 0; dr < NB_DRIVE; dr++){
if (!(selected & (1<<dr))) {
drive_motor(floppy + dr, data >> 7);
}
}
for (dr = 0; dr < NB_DRIVE; dr++) {
int state = (!(selected & (1<<dr))) | !floppy[dr].motoroff;
if (state != ledstate[dr])
gui_led (dr+1, state);
ledstate[dr] = state;
}
}
uae_u8 DISK_status()
{
uae_u8 st = 0x3c;
int dr;
for (dr = 0; dr < NB_DRIVE; dr++){
drive *drv = floppy + dr;
if (!(selected & (1 << dr))) {
if (drive_running(drv)){
if (dskready) st &= ~0x20;
dskready = 1;
} else {
st &= ~0x20; /* report drive ID */
}
if (drive_track0 (drv)) { st &= ~0x10; }
if (drive_writeprotected (drv)) { st &= ~8; }
if (drv->dskchange) {
/*emu_printf("changed bit set: %d\n",dr); */
st &= ~0x4;
if (drv->dskchange > 1)
drv->dskchange--;
}
}
}
return st;
}
int DISK_GetData(uae_u16 *mfm,uae_u16 *byt)
{
int dr;
for (dr = 0; dr < NB_DRIVE; dr++){
if (!(selected & (1<<dr))) {
return drive_get_data (floppy + dr, mfm, byt);
}
}
return 0;
}
static uae_u16 mfm_read_buffer[0x4000];
static int mfm_read_length;
int DISK_PrepareReadMFM(int length, uae_u16 sync, int use_sync)
{
int dr;
mfm_read_length = 0;
for (dr = 0; dr < NB_DRIVE; dr++) {
if (!(selected & (1<<dr))) {
int time = 0;
uae_u16 *mfmp = mfm_read_buffer;
drive *drv = floppy + dr;
int offset,mfmpos;
drive_fill_bigbuf(drv);
offset = (cycles - drv->last_cycles) / FLOPPY_SPEED;
mfmpos = (drv->mfmpos + offset) % drv->tracklen;
drv->last_cycles += offset*FLOPPY_SPEED;
drv->mfmpos = mfmpos;
mfmpos++; mfmpos %= drv->tracklen;
while (drv->bigmfmbuf[mfmpos] != sync && mfmpos != drv->mfmpos && use_sync)
mfmpos = (mfmpos + 1) % drv->tracklen, time++;
if (drv->bigmfmbuf[mfmpos] != sync && use_sync) {
write_log ("warning: sync not found on disk read\n");
return 0;
} else
mfmpos++;
mfm_read_length = length;
while (length--) {
*mfmp++ = drv->bigmfmbuf[mfmpos];
mfmpos = (mfmpos + 1) % drv->tracklen;
time++;
}
return time*FLOPPY_SPEED;
}
}
return 0;
}
int DISK_ReadMFM(uaecptr target)
{
int i;
uae_u8 *mfmp = get_real_address(target);
if (!chipmem_bank.check(target, mfm_read_length * 2)) {
emu_printf("warning: Bad disk DMA read pointer\n");
return 0;
}
for (i = 0; i < mfm_read_length; i++) {
*mfmp++ = mfm_read_buffer[i] >> 8;
*mfmp++ = mfm_read_buffer[i];
}
return 1;
}
void DISK_InitWrite()
{
//JMH: mfmwrite = mfmwrbuffer;
}
void DISK_WriteData(int length)
{
int dr;
for (dr=0;dr<NB_DRIVE;dr++){
if (!(selected & (1<<dr))) {
// JMH: drive_write_data(floppy + dr, mfmwrbuffer, length);
}
}
}
void trackdisk_install(void)
{
}

View file

@ -6,7 +6,7 @@
* (c) 1995 Bernd Schmidt
*/
/*
extern void DISK_init (void);
extern void DISK_select (uae_u8 data);
extern uae_u8 DISK_status (void);
@ -20,5 +20,28 @@ extern void disk_swap(const char * disk0, const char * disk1);
extern int DISK_ReadMFM (uaecptr);
extern int DISK_PrepareReadMFM (int, uae_u16, int);
extern void DISK_check_change (void);
*/
// JMH: extern uae_u16* mfmwrite;
extern void DISK_init (void);
extern void DISK_select (uae_u8 data);
extern uae_u8 DISK_status (void);
extern void DISK_GetData (uae_u16 *mfm, uae_u16 *byt);
extern void DISK_InitWrite (void);
extern void DISK_WriteData (int);
extern void disk_eject (int num);
extern int disk_empty (int num);
extern void disk_insert (int num, const char *name);
extern int DISK_ReadMFM (uaecptr);
extern int DISK_PrepareReadMFM (int, uae_u16, int);
extern void DISK_check_change (void);
extern FILE *DISK_validate_filename (const char *, int, int *);
extern void DISK_hsync_handler (void);
extern int DISK_update_reads (uaecptr *, int *, int *, int);
extern void DISK_reset_cycles (void);
extern void DISK_StartRead (void);
extern void DISK_search_sync (int, unsigned int);
extern void disk_swap(const char * disk0, const char * disk1);
extern uae_u16* mfmwrite;

View file

@ -31,7 +31,7 @@ typedef ULONG uaecptr;
#define SOUND_PRESENT 1
#define M68K_SPEED 4
#define M68K_SPEED 8
//#define HAS_BOGOMEM 1
//#define HAS_MEMDISK 1
#define HAS_EXPANMEM 1

View file

@ -5,8 +5,20 @@ extern "C" {
#include "iopins.h"
}
#ifdef HAS_T4_VGA
#include "vga_t_dma.h"
const vga_pixel deflogo[] = {
0,0
};
static const vga_pixel * logo = deflogo;
#else
#include "tft_t_dma.h"
#include "logo.h"
const uint16_t deflogo[] = {
0,0
};
static const uint16_t * logo = deflogo;
#endif
#include "bmpjoy.h"
#include "bmpvbar.h"
#ifdef OLD_LAYOUT
@ -93,7 +105,7 @@ static File file;
#define MENU_FILE_YOFFSET (2*TEXT_HEIGHT)
#define MENU_FILE_W (MAX_FILENAME_SIZE*TEXT_WIDTH)
#define MENU_FILE_H (MAX_MENULINES*TEXT_HEIGHT)
#define MENU_FILE_BGCOLOR RGBVAL16(0x00,0x00,0x20)
#define MENU_FILE_BGCOLOR RGBVAL16(0x00,0x00,0x40)
#define MENU_JOYS_YOFFSET (12*TEXT_HEIGHT)
#define MENU_VBAR_XOFFSET (0*TEXT_WIDTH)
#define MENU_VBAR_YOFFSET (MENU_FILE_YOFFSET)
@ -115,10 +127,6 @@ static bool menuRedraw=true;
static int16_t calMinX=-1,calMinY=-1,calMaxX=-1,calMaxY=-1;
static bool i2cKeyboardPresent = false;
//const uint16_t deflogo[] = {
// 0x0000,0x0000
//};
//static const uint16_t * logo = deflogo;
static unsigned short * keys;
static int keyMap;
@ -592,7 +600,7 @@ bool virtualkeyboardIsActive(void) {
void toggleVirtualkeyboard(bool keepOn) {
if (keepOn) {
tft.drawSpriteNoDma(0,0,(uint16_t*)logo);
tft.drawSpriteNoDma(0,0,logo);
//prev_zt = 0;
vkbKeepOn = true;
vkbActive = true;
@ -609,7 +617,7 @@ void toggleVirtualkeyboard(bool keepOn) {
}
else {
tft.stopDMA();
tft.drawSpriteNoDma(0,0,(uint16_t*)logo);
tft.drawSpriteNoDma(0,0,logo);
//prev_zt = 0;
vkbActive = true;
exitVkbd = false;
@ -654,7 +662,7 @@ void handleVirtualkeyboard() {
if (vkeyRefresh) {
vkeyRefresh = false;
tft.drawSpriteNoDma(0,0,(uint16_t*)logo, rx, ry, rw, rh);
tft.drawSpriteNoDma(0,0,logo, rx, ry, rw, rh);
}
if ( (exitVkbd) && (vkbActive) ) {
@ -668,35 +676,35 @@ void handleVirtualkeyboard() {
}
int emu_setKeymap(int index) {
int xoff = 16;
if (keyMap == 1) {
keyMap = 0;
keys = key_map1;
tft.drawText(0, 0+16, " 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 I 10I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(0,16+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(0,24+16, " q I w I e I r I t I y I u I i I o I p I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(0,40+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(0,48+16, " a I s I d I f I g I h I j I k I l IRTNI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(0,64+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(0,72+16, " z I x I c I v I b I n I m I , IDELISPCI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(0,88+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(0,96+16,"mouse mode ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x00), false);
tft.drawText(xoff, 0+16, " 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 I 10I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(xoff,16+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(xoff,24+16, " q I w I e I r I t I y I u I i I o I p I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(xoff,40+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(xoff,48+16, " a I s I d I f I g I h I j I k I l IRTNI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(xoff,64+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(xoff,72+16, " z I x I c I v I b I n I m I , IDELISPCI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(xoff,88+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(xoff,96+16, "mouse mode ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x00), false);
delay(200);
}
else if (keyMap == 0) {
keyMap = 1;
keys = key_map2;
tft.drawText(0, 0+16, "F1 IF2 IF3 IF4 IF5 IF6 IF7 IF8 IF9 IF10I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(0,16+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(0,24+16, "PRNIDELIDELI r I t I y I u I i I o I p I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(0,40+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(0,48+16, " a I s I d I f I g I h I j I k I l IRTNI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(0,64+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(0,72+16, " z I x I c I v I b I n I m I , IDELISPCI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(0,88+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(0,96+16,"joystick mode ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x00), false);
tft.drawText(xoff, 0+16, "F1 IF2 IF3 IF4 IF5 IF6 IF7 IF8 IF9 IF10I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(xoff,16+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(xoff,24+16, "PRNIDELIDELI r I t I y I u I i I o I p I", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(xoff,40+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(xoff,48+16, " a I s I d I f I g I h I j I k I l IRTNI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawText(xoff,64+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
tft.drawText(xoff,72+16, " z I x I c I v I b I n I m I , IDELISPCI", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), true);
tft.drawText(xoff,88+16, "--- --- --- --- --- --- --- --- --- --- ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x80), false);
tft.drawText(xoff,96+16, "joystick mode ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0x00), false);
delay(200);
}
}
@ -768,10 +776,12 @@ void backgroundMenu(void) {
menuRedraw=true;
tft.fillScreenNoDma(RGBVAL16(0x00,0x00,0x00));
tft.drawTextNoDma(0,0, TITLE, RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true);
tft.drawSpriteNoDma(MENU_VBAR_XOFFSET,MENU_VBAR_YOFFSET,(uint16_t*)bmpvbar);
#ifndef HAS_T4_VGA
tft.drawSpriteNoDma(MENU_VBAR_XOFFSET,MENU_VBAR_YOFFSET,bmpvbar);
#endif
#ifdef OLD_LAYOUT
tft.drawSpriteNoDma(MENU_TFT_XOFFSET,MENU_TFT_YOFFSET,(uint16_t*)bmptft);
tft.drawSpriteNoDma(MENU_VGA_XOFFSET,MENU_VGA_YOFFSET,(uint16_t*)bmpvga);
tft.drawSpriteNoDma(MENU_TFT_XOFFSET,MENU_TFT_YOFFSET,bmptft);
tft.drawSpriteNoDma(MENU_VGA_XOFFSET,MENU_VGA_YOFFSET,bmpvga);
#endif
}
@ -881,7 +891,7 @@ int handleMenu(uint16_t bClick)
strcpy(selection,filename);
}
else {
tft.drawTextNoDma(MENU_FILE_XOFFSET,i*TEXT_HEIGHT+MENU_FILE_YOFFSET, filename, 0xFFFF, 0x0000, true);
tft.drawTextNoDma(MENU_FILE_XOFFSET,i*TEXT_HEIGHT+MENU_FILE_YOFFSET, filename, RGBVAL16(0xff,0xff,0xff), MENU_FILE_BGCOLOR, true);
}
}
i++;
@ -889,8 +899,10 @@ int handleMenu(uint16_t bClick)
fileIndex++;
}
#ifndef HAS_T4_VGA
tft.drawSpriteNoDma(0,MENU_JOYS_YOFFSET,(uint16_t*)bmpjoy);
tft.drawTextNoDma(48,MENU_JOYS_YOFFSET+8, (emu_SwapJoysticks(1)?(char*)"SWAP=1":(char*)"SWAP=0"), RGBVAL16(0x00,0xff,0xff), RGBVAL16(0xff,0x00,0x00), false);
#endif
tft.drawTextNoDma(48,MENU_JOYS_YOFFSET+8, (emu_SwapJoysticks(1)?(char*)"SWAP=1":(char*)"SWAP=0"), RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false);
menuRedraw=false;
}
@ -1459,5 +1471,3 @@ void emu_init(void)
keys = key_map1;
keyMap = 0;
}

View file

@ -1,9 +1,8 @@
#ifndef EMUAPI_H
#define EMUAPI_H
//#define INVX 1
//#define INVY 1
#define HAS_SND 1
#include "platform_config.h"
#define CUSTOM_SND 1
#define HAS_I2CKBD 1
//#define TIMER_REND 1
@ -135,6 +134,7 @@ extern void emu_SetPaletteEntry(unsigned char r, unsigned char g, unsigned char
extern void emu_DrawScreen(unsigned char * VBuf, int width, int height, int stride);
extern void emu_DrawLine(unsigned char * VBuf, int width, int height, int line);
extern void emu_DrawLine16(unsigned short * VBuf, int width, int height, int line);
extern void emu_DrawLine8(unsigned char * VBuf, int width, int height, int line);
extern void emu_DrawVsync(void);
extern int emu_FrameSkip(void);
extern void * emu_LineBuffer(int line);

View file

@ -22,7 +22,7 @@ struct ev
enum {
ev_hsync, ev_copper, ev_cia,
ev_blitter, ev_diskblk, ev_diskindex,
ev_blitter, ev_diskblk, ev_diskindex, ev_disksync,
#ifndef DONT_WANT_SOUND
ev_aud0, ev_aud1, ev_aud2, ev_aud3,
ev_sample,

View file

@ -35,6 +35,13 @@
#define I2C_SDA_IO 18
// Analog joystick (primary) for JOY2 and 5 extra buttons
#ifdef HAS_T4_VGA
#define PIN_JOY2_A1X A3
#define PIN_JOY2_A2Y A2
#define PIN_JOY2_BTN 14
#define PIN_KEY_USER1 5
#define PIN_KEY_USER2 6
#else
#define PIN_JOY2_A1X A1
#define PIN_JOY2_A2Y A2
#define PIN_JOY2_BTN 17
@ -49,6 +56,7 @@
#define PIN_JOY1_2 7 // DOWN
#define PIN_JOY1_3 6 // RIGHT
#define PIN_JOY1_4 5 // LEFT
#endif
#else
// OLD LAYOUT!!!!
@ -87,8 +95,3 @@
#endif
#endif

View file

@ -2,8 +2,13 @@
#define _PLATFORM_CONFIG_H_
//#define OLD_LAYOUT 1
#define HAS_T4_VGA 1
#define ILI9341 1
//#define INVX 1
//#define INVY 1
//#define HAS_SND 1
//#define ILI9341 1
//#define ST7789 1
//#define SWAP_JOYSTICK 1
//#define LOHRES 1
@ -18,4 +23,3 @@
//#define SDFSDEV "1:"
#endif

View file

@ -2,7 +2,6 @@
#include "emuapi.h"
#include "keyboard_osd.h"
#include "tft_t_dma.h"
//extern "C" {
#include "uae.h"
@ -35,7 +34,13 @@ uVGA uvga;
uint8_t * VGA_frame_buffer;
#endif
#ifdef HAS_T4_VGA
#include "vga_t_dma.h"
TFT_T_DMA tft;
#else
#include "tft_t_dma.h"
TFT_T_DMA tft = TFT_T_DMA(TFT_CS, TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK, TFT_MISO, TFT_TOUCH_CS, TFT_TOUCH_INT);
#endif
bool vgaMode = false;
@ -71,7 +76,11 @@ void emu_DrawVsync(void)
skip += 1;
skip &= VID_FRAME_SKIP;
if (!vgaMode) {
#ifdef HAS_T4_VGA
tft.waitSync();
#else
while (vbl==vb) {};
#endif
}
#ifdef HAS_VGA
else {
@ -83,7 +92,11 @@ void emu_DrawVsync(void)
void emu_DrawLine(unsigned char * VBuf, int width, int height, int line)
{
if (!vgaMode) {
#ifdef HAS_T4_VGA
tft.writeLine(width,1,line, VBuf, palette8);
#else
tft.writeLine(width,1,line, VBuf, palette16);
#endif
}
#ifdef HAS_VGA
else {
@ -101,11 +114,26 @@ void emu_DrawLine(unsigned char * VBuf, int width, int height, int line)
#endif
}
void emu_DrawLine8(unsigned char * VBuf, int width, int height, int line)
{
if (!vgaMode) {
if (skip==0) {
#ifdef HAS_T4_VGA
tft.writeLine(width,height,line, VBuf);
#endif
}
}
#ifdef HAS_VGA
#endif
}
void emu_DrawLine16(unsigned short * VBuf, int width, int height, int line)
{
if (!vgaMode) {
if (skip==0) {
#ifndef HAS_T4_VGA
tft.writeLine(width,height,line, VBuf);
#endif
}
}
#ifdef HAS_VGA
@ -116,7 +144,11 @@ void emu_DrawScreen(unsigned char * VBuf, int width, int height, int stride)
{
if (!vgaMode) {
if (skip==0) {
#ifdef HAS_T4_VGA
tft.writeScreen(width,height-TFT_VBUFFER_YCROP,stride, VBuf+(TFT_VBUFFER_YCROP/2)*stride, palette8);
#else
tft.writeScreen(width,height-TFT_VBUFFER_YCROP,stride, VBuf+(TFT_VBUFFER_YCROP/2)*stride, palette16);
#endif
}
}
#ifdef HAS_VGA
@ -168,7 +200,12 @@ void * emu_LineBuffer(int line)
// ****************************************************
void setup() {
#ifdef HAS_T4_VGA
tft.begin(VGA_MODE_352x240);
NVIC_SET_PRIORITY(IRQ_QTIMER3, 0);
#else
tft.begin();
#endif
emu_init();
@ -239,8 +276,15 @@ void loop(void)
AudioPlaySystem mymixer;
#if defined(__IMXRT1052__) || defined(__IMXRT1062__)
#ifdef HAS_T4_VGA
AudioOutputI2S i2s1;
AudioConnection patchCord8(mymixer, 0, i2s1, 0);
AudioConnection patchCord9(mymixer, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1;
#else
AudioOutputMQS mqs;
AudioConnection patchCord9(mymixer, 0, mqs, 1);
#endif
#else
AudioOutputAnalog dac1;
AudioConnection patchCord1(mymixer, dac1);
@ -273,4 +317,3 @@ void emu_sndPlayBuzz(int size, int val) {
//Serial.println(size);
}
#endif

View file

@ -3,6 +3,9 @@
*/
#include "TFT_T_DMA.h"
#ifndef HAS_T4_VGA
#include "font8x8.h"
@ -1231,8 +1234,7 @@ void TFT_T_DMA::drawSprite(int16_t x, int16_t y, const uint16_t *bitmap, uint16_
l++;
}
}
#endif

View file

@ -1,7 +1,11 @@
#include <string.h>
#include "emuapi.h"
#ifdef HAS_T4_VGA
#include "vga_t_dma.h"
#else
#include "tft_t_dma.h"
#endif
#include "iopins.h"
extern "C" {
@ -79,8 +83,11 @@ char romfile[MAX_FILENAME] = "./kick13.rom";
char prtname[MAX_FILENAME] = "lpr ";
char sername[MAX_FILENAME] = "";
char warning_buffer[256];
static char slinebuf[800];
#ifdef HAS_T4_VGA
static char slinebuf[WIN_W];
#else
static char slinebuf[WIN_W*2];
#endif
#define MOUSE_STEP 3
static int prev_hk = 0;
@ -214,7 +221,11 @@ void write_log (const char *buf) { /*fprintf (stderr, buf); */ }
void flush_line(int y)
{
if(y >= 0 && y < WIN_H) {
#ifdef HAS_T4_VGA
emu_DrawLine8((unsigned char *)slinebuf, WIN_W , 1, y);
#else
emu_DrawLine16((unsigned short *)slinebuf, WIN_W , 1, y);
#endif
}
}
@ -285,12 +296,19 @@ static int hddfound=0;
void uae_Init(void)
{
emu_printf("Init");
#ifdef HAS_T4_VGA
gfxvidinfo.rowbytes = WIN_W;
gfxvidinfo.pixbytes = 1;
#else
gfxvidinfo.rowbytes = WIN_W*2;
gfxvidinfo.pixbytes = 2;
#endif
gfxvidinfo.maxlinetoscr = WIN_W;
gfxvidinfo.maxline = WIN_H;
gfxvidinfo.linemem = slinebuf;
gfxvidinfo.maxblocklines = 0;
gfxvidinfo.width = WIN_W;
gfxvidinfo.height = WIN_H;
buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
lastmx = lastmy = 0;
@ -407,35 +425,5 @@ void uae_Start(char * floppy1, char * floppy2)
}
void uae_Step(void) {
/*
JoyState = 0;
if (k & MASK_JOY2_DOWN) JoyState|=0x02;
if (k & MASK_JOY2_UP) JoyState|=0x01;
if (k & MASK_JOY2_LEFT) JoyState|=0x04;
if (k & MASK_JOY2_RIGHT) JoyState|=0x08;
if (k & MASK_JOY2_BTN) JoyState|=0x10;
if (k & MASK_KEY_USER2) JoyState|=0x20;
*/
/*
if (hk != 0) {
emu_printh(hk);
KeyMap[Keys[hk-1].Pos] &=~ Keys[hk-1].Mask;
}
else {
memset(KeyMap,0xFF,16);
}
*/
//emu_DrawVsync();
// not reached!
}

View file

@ -0,0 +1,53 @@
/*
Wrapping class to extend VGA_T4 to TFT_T_DMA
*/
#ifndef _VGA_T_DMAH_
#define _VGA_T_DMAH_
#ifdef __cplusplus
#include <VGA_t4.h>
#endif
#define RGBVAL16(r,g,b) ( (((r>>5)&0x07)<<5) | (((g>>5)&0x07)<<2) | (((b>>6)&0x3)<<0) )
#define RGBVAL8(r,g,b) ( (((r>>5)&0x07)<<5) | (((g>>5)&0x07)<<2) | (((b>>6)&0x3)<<0) )
#define TFT_WIDTH 320 //640 //320
#define TFT_REALWIDTH 320 //640 //320
#define TFT_HEIGHT 240
#define TFT_REALHEIGHT 240
#ifdef __cplusplus
class TFT_T_DMA: public VGA_T4
{
public:
// Fake touch screen functions
bool isTouching(void) { return false; }
void readRaw(uint16_t * oX, uint16_t * oY, uint16_t * oZ) { }
void readCal(uint16_t * oX, uint16_t * oY, uint16_t * oZ) { };
void callibrateTouch(uint16_t xMin,uint16_t yMin,uint16_t xMax,uint16_t yMax) { }
// fake DMA functions
void startDMA(void) { };
void stopDMA(void) { };
// fake no DMA functions
void writeScreenNoDma(const vga_pixel *pcolors) { writeScreen(pcolors); }
void fillScreenNoDma(vga_pixel color) { clear(color); }
void drawTextNoDma(int16_t x, int16_t y, const char * text, vga_pixel fgcolor, vga_pixel bgcolor, bool doublesize) { drawText(x,y,text,fgcolor,bgcolor,doublesize); }
void drawRectNoDma(int16_t x, int16_t y, int16_t w, int16_t h, vga_pixel color) { drawRect(x, y, w, h, color); }
void drawSpriteNoDma(int16_t x, int16_t y, const vga_pixel *bitmap) { drawSprite(x, y, bitmap); }
void drawSpriteNoDma(int16_t x, int16_t y, const vga_pixel *bitmap, uint16_t croparx, uint16_t cropary, uint16_t croparw, uint16_t croparh) { drawSprite(x, y, bitmap, croparx, cropary, croparw, croparh); }
};
#endif
#endif

View file

@ -6,7 +6,14 @@
* Copyright 1995-1997 Bernd Schmidt
*/
#include "platform_config.h"
#ifdef HAS_T4_VGA
typedef unsigned char xcolnr;
#else
typedef unsigned short xcolnr;
#endif
typedef int (*allocfunc_type)(int, int, int, xcolnr *);
@ -55,6 +62,8 @@ struct vidbuf_description
* value than maxline here). */
int can_double; /* Set if the high part of each entry in xcolors contains the same value
* as the low part, so that two pixels can be drawn at once. */
int width;
int height;
};
extern struct vidbuf_description gfxvidinfo;