kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
add USB mouse + HIRES mode for Amiga/ST emulation
rodzic
e55ba9e02b
commit
4ab3342f6c
|
@ -50,7 +50,7 @@ typedef unsigned long uint32;
|
|||
*/
|
||||
#define MEMBASE 0x00000000L
|
||||
#ifndef MEMSIZE
|
||||
#define MEMSIZE 0x00100000L /* default memsize 1 Mb */
|
||||
#define MEMSIZE 0x00400000L /* default memsize 4 Mb */
|
||||
//#define MEMSIZE 0x00080000L /* default memsize 512 Kb */
|
||||
#endif
|
||||
#define CARBASE 0x00fa0000L
|
||||
|
|
|
@ -31,8 +31,13 @@ static const uint16_t * logo = deflogo;
|
|||
#ifdef HAS_USBKEY
|
||||
#include "USBHost_t36.h" // Read this header first for key info
|
||||
USBHost myusb;
|
||||
//USBHub hub1(myusb);
|
||||
KeyboardController keyboard1(myusb);
|
||||
USBHIDParser hid1(myusb);
|
||||
MouseController mouse1(myusb);
|
||||
#endif
|
||||
static bool mouseDetected = false;
|
||||
static bool keyboardDetected = false;
|
||||
static uint8_t usbnavpad=0;
|
||||
|
||||
#ifdef USE_SDFS
|
||||
|
@ -934,6 +939,151 @@ char * menuSelection(void)
|
|||
return (selection);
|
||||
}
|
||||
|
||||
int emu_GetMouse(int *x, int *y, int *buts) {
|
||||
#ifdef HAS_USBKEY
|
||||
if (mouse1.available()) {
|
||||
*buts = mouse1.getButtons();
|
||||
*x = mouse1.getMouseX();
|
||||
*y = mouse1.getMouseY();
|
||||
mouse1.mouseDataClear();
|
||||
mouseDetected = true;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAS_USBKEY
|
||||
void OnPress(auto key)
|
||||
{
|
||||
keyboardDetected = true;
|
||||
uint8_t keymodifier = keyboard1.getModifiers();
|
||||
|
||||
if(keymodifier == 0x40){
|
||||
// ALTGR Key modifier FR Keyboard
|
||||
switch (key) {
|
||||
#ifdef LAYOUT_FRENCH
|
||||
case 233 : key = '~' ; break;
|
||||
case 34 : key = '#' ; break;
|
||||
case 39 : key = '{' ; break;
|
||||
case 40 : key = '[' ; break;
|
||||
case 45 : key = '|' ; break;
|
||||
case 232 : key = '`' ; break;
|
||||
case 95 : key = 92 ; break;
|
||||
case 231 : key = '^' ; break;
|
||||
case 224 : key = '@' ; break;
|
||||
case 41 : key = ']' ; break;
|
||||
case 61 : key = '}' ; break;
|
||||
#endif
|
||||
#ifdef LAYOUT_FRENCH_BELGIAN
|
||||
case 38 : key = '|' ; break; //1
|
||||
case 233 : key = '@' ; break; //2
|
||||
case 34 : key = '#' ; break; //3
|
||||
case 167 : key = '^' ; break; //6
|
||||
case 231 : key = '{' ; break; //9
|
||||
case 224 : key = '}' ; break; //0
|
||||
case 36 : key = ']' ; break; //$
|
||||
case 61 : key = '~' ; break; //=
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (menuActive())
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case 217:
|
||||
usbnavpad |= MASK_JOY2_DOWN;
|
||||
break;
|
||||
case 218:
|
||||
usbnavpad |= MASK_JOY2_UP;
|
||||
break;
|
||||
case 216:
|
||||
usbnavpad |= MASK_JOY2_LEFT;
|
||||
break;
|
||||
case 215:
|
||||
usbnavpad |= MASK_JOY2_RIGHT;
|
||||
break;
|
||||
case 10:
|
||||
usbnavpad |= MASK_JOY2_BTN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
emu_KeyboardOnDown(keymodifier, key);
|
||||
}
|
||||
}
|
||||
|
||||
void OnRelease(int key)
|
||||
{
|
||||
keyboardDetected = true;
|
||||
uint8_t keymodifier = keyboard1.getModifiers();
|
||||
|
||||
if(keymodifier == 0x40){
|
||||
// ALTGR Key modifier FR Keyboard
|
||||
switch (key) {
|
||||
#ifdef LAYOUT_FRENCH
|
||||
case 233 : key = '~' ; break;
|
||||
case 34 : key = '#' ; break;
|
||||
case 39 : key = '{' ; break;
|
||||
case 40 : key = '[' ; break;
|
||||
case 45 : key = '|' ; break;
|
||||
case 232 : key = '`' ; break;
|
||||
case 95 : key = 92 ; break;
|
||||
case 231 : key = '^' ; break;
|
||||
case 224 : key = '@' ; break;
|
||||
case 41 : key = ']' ; break;
|
||||
case 61 : key = '}' ; break;
|
||||
#endif
|
||||
#ifdef LAYOUT_FRENCH_BELGIAN
|
||||
case 38 : key = '|' ; break; //1
|
||||
case 233 : key = '@' ; break; //2
|
||||
case 34 : key = '#' ; break; //3
|
||||
case 167 : key = '^' ; break; //6
|
||||
case 231 : key = '{' ; break; //9
|
||||
case 224 : key = '}' ; break; //0
|
||||
case 36 : key = ']' ; break; //$
|
||||
case 61 : key = '~' ; break; //=
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (menuActive())
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case 217:
|
||||
usbnavpad &= ~MASK_JOY2_DOWN;
|
||||
break;
|
||||
case 218:
|
||||
usbnavpad &= ~MASK_JOY2_UP;
|
||||
break;
|
||||
case 216:
|
||||
usbnavpad &= ~MASK_JOY2_LEFT;
|
||||
break;
|
||||
case 215:
|
||||
usbnavpad &= ~MASK_JOY2_RIGHT;
|
||||
break;
|
||||
case 10:
|
||||
usbnavpad &= ~MASK_JOY2_BTN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
emu_KeyboardOnUp(keymodifier, key);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int emu_MouseDetected(void) {
|
||||
return (mouseDetected?1:0);
|
||||
}
|
||||
|
||||
int emu_KeyboardDetected(void) {
|
||||
return (keyboardDetected?1:0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1397,128 +1547,6 @@ void emu_FileTempWrite(int addr, unsigned char val)
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAS_USBKEY
|
||||
void OnPress(auto key)
|
||||
{
|
||||
uint8_t keymodifier = keyboard1.getModifiers();
|
||||
|
||||
if(keymodifier == 0x40){
|
||||
// ALTGR Key modifier FR Keyboard
|
||||
switch (key) {
|
||||
#ifdef LAYOUT_FRENCH
|
||||
case 233 : key = '~' ; break;
|
||||
case 34 : key = '#' ; break;
|
||||
case 39 : key = '{' ; break;
|
||||
case 40 : key = '[' ; break;
|
||||
case 45 : key = '|' ; break;
|
||||
case 232 : key = '`' ; break;
|
||||
case 95 : key = 92 ; break;
|
||||
case 231 : key = '^' ; break;
|
||||
case 224 : key = '@' ; break;
|
||||
case 41 : key = ']' ; break;
|
||||
case 61 : key = '}' ; break;
|
||||
#endif
|
||||
#ifdef LAYOUT_FRENCH_BELGIAN
|
||||
case 38 : key = '|' ; break; //1
|
||||
case 233 : key = '@' ; break; //2
|
||||
case 34 : key = '#' ; break; //3
|
||||
case 167 : key = '^' ; break; //6
|
||||
case 231 : key = '{' ; break; //9
|
||||
case 224 : key = '}' ; break; //0
|
||||
case 36 : key = ']' ; break; //$
|
||||
case 61 : key = '~' ; break; //=
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (menuActive())
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case 217:
|
||||
usbnavpad |= MASK_JOY2_DOWN;
|
||||
break;
|
||||
case 218:
|
||||
usbnavpad |= MASK_JOY2_UP;
|
||||
break;
|
||||
case 216:
|
||||
usbnavpad |= MASK_JOY2_LEFT;
|
||||
break;
|
||||
case 215:
|
||||
usbnavpad |= MASK_JOY2_RIGHT;
|
||||
break;
|
||||
case 10:
|
||||
usbnavpad |= MASK_JOY2_BTN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
emu_KeyboardOnDown(keymodifier, key);
|
||||
}
|
||||
}
|
||||
|
||||
void OnRelease(int key)
|
||||
{
|
||||
uint8_t keymodifier = keyboard1.getModifiers();
|
||||
|
||||
if(keymodifier == 0x40){
|
||||
// ALTGR Key modifier FR Keyboard
|
||||
switch (key) {
|
||||
#ifdef LAYOUT_FRENCH
|
||||
case 233 : key = '~' ; break;
|
||||
case 34 : key = '#' ; break;
|
||||
case 39 : key = '{' ; break;
|
||||
case 40 : key = '[' ; break;
|
||||
case 45 : key = '|' ; break;
|
||||
case 232 : key = '`' ; break;
|
||||
case 95 : key = 92 ; break;
|
||||
case 231 : key = '^' ; break;
|
||||
case 224 : key = '@' ; break;
|
||||
case 41 : key = ']' ; break;
|
||||
case 61 : key = '}' ; break;
|
||||
#endif
|
||||
#ifdef LAYOUT_FRENCH_BELGIAN
|
||||
case 38 : key = '|' ; break; //1
|
||||
case 233 : key = '@' ; break; //2
|
||||
case 34 : key = '#' ; break; //3
|
||||
case 167 : key = '^' ; break; //6
|
||||
case 231 : key = '{' ; break; //9
|
||||
case 224 : key = '}' ; break; //0
|
||||
case 36 : key = ']' ; break; //$
|
||||
case 61 : key = '~' ; break; //=
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (menuActive())
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case 217:
|
||||
usbnavpad &= ~MASK_JOY2_DOWN;
|
||||
break;
|
||||
case 218:
|
||||
usbnavpad &= ~MASK_JOY2_UP;
|
||||
break;
|
||||
case 216:
|
||||
usbnavpad &= ~MASK_JOY2_LEFT;
|
||||
break;
|
||||
case 215:
|
||||
usbnavpad &= ~MASK_JOY2_RIGHT;
|
||||
break;
|
||||
case 10:
|
||||
usbnavpad &= ~MASK_JOY2_BTN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
emu_KeyboardOnUp(keymodifier, key);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void emu_init(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
|
|
|
@ -6,13 +6,13 @@
|
|||
#define CUSTOM_SND 1
|
||||
//#define TIMER_REND 1
|
||||
|
||||
#define EXTRA_HEAP 0x10
|
||||
#define EXTRA_HEAP 0x10000
|
||||
|
||||
// Title: < >
|
||||
#define TITLE " AtariST Emulator "
|
||||
#define ROMSDIR "/st"
|
||||
|
||||
#define emu_Init(ROM) {ast_Init(); ast_Start(ROM);}
|
||||
#define emu_Init(ROM,MODE) {ast_Init(); ast_Start(ROM,MODE);}
|
||||
#define emu_Step(x) {ast_Step();}
|
||||
#define emu_Input(x) {ast_Input(x);}
|
||||
|
||||
|
@ -134,7 +134,9 @@ extern void emu_DrawScreen(unsigned char * VBuf, int width, int height, int stri
|
|||
extern void emu_DrawLine(unsigned char * VBuf, int width, int height, int line);
|
||||
extern void emu_DrawLine8(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_CopyLine(int width, int height, int ysrc, int ydst);
|
||||
extern void emu_DrawVsync(void);
|
||||
extern void emu_DrawWaitLine(int line);
|
||||
extern int emu_FrameSkip(void);
|
||||
extern void * emu_LineBuffer(int line);
|
||||
|
||||
|
@ -143,6 +145,9 @@ extern int emu_SwapJoysticks(int statusOnly);
|
|||
extern unsigned short emu_DebounceLocalKeys(void);
|
||||
extern int emu_ReadKeys(void);
|
||||
extern int emu_GetPad(void);
|
||||
extern int emu_GetMouse(int *x, int *y, int *buts);
|
||||
extern int emu_MouseDetected(void);
|
||||
extern int emu_KeyboardDetected(void);
|
||||
extern int emu_ReadAnalogJoyX(int min, int max);
|
||||
extern int emu_ReadAnalogJoyY(int min, int max);
|
||||
extern int emu_ReadI2CKeyboard(void);
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
#define _PLATFORM_CONFIG_H_
|
||||
|
||||
//#define OLD_LAYOUT 1
|
||||
#define HAS_T41 1
|
||||
#define HAS_T4_VGA 1
|
||||
#define HIRES 1
|
||||
|
||||
#define HAS_SND 1
|
||||
//#define INVX 1
|
||||
|
|
|
@ -616,4 +616,3 @@ PROGMEM uint32 DoIORL(uint32 address)
|
|||
{
|
||||
return (((uint32)DoIORW(address))<<16)+DoIORW(address+2);
|
||||
}
|
||||
|
||||
|
|
|
@ -86,6 +86,24 @@ void emu_DrawVsync(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
void emu_DrawWaitLine(int line)
|
||||
{
|
||||
volatile boolean vb=vbl;
|
||||
skip += 1;
|
||||
skip &= VID_FRAME_SKIP;
|
||||
if (!vgaMode) {
|
||||
#ifdef HAS_T4_VGA
|
||||
tft.waitLine(line);
|
||||
#else
|
||||
while (vbl==vb) {};
|
||||
#endif
|
||||
}
|
||||
#ifdef HAS_VGA
|
||||
else {
|
||||
while (vbl==vb) {};
|
||||
}
|
||||
#endif
|
||||
}
|
||||
void emu_DrawLine(unsigned char * VBuf, int width, int height, int line)
|
||||
{
|
||||
if (!vgaMode) {
|
||||
|
@ -174,6 +192,13 @@ void emu_DrawScreen(unsigned char * VBuf, int width, int height, int stride)
|
|||
#endif
|
||||
}
|
||||
|
||||
void emu_CopyLine(int width, int height, int ysrc, int ydst)
|
||||
{
|
||||
#ifdef HAS_T4_VGA
|
||||
tft.copyLine(width,height,ysrc,ydst);
|
||||
#endif
|
||||
}
|
||||
|
||||
int emu_FrameSkip(void)
|
||||
{
|
||||
return skip;
|
||||
|
@ -199,11 +224,15 @@ void * emu_LineBuffer(int line)
|
|||
void setup() {
|
||||
|
||||
#ifdef HAS_T4_VGA
|
||||
#ifdef HIRES
|
||||
tft.begin(VGA_MODE_640x480);
|
||||
#else
|
||||
tft.begin(VGA_MODE_320x240);
|
||||
// NVIC_SET_PRIORITY(IRQ_QTIMER3, 0);
|
||||
#endif
|
||||
#else
|
||||
tft.begin();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
emu_init();
|
||||
|
||||
myTimer.begin(vblCount, 20000); //to run every 20ms
|
||||
|
@ -212,6 +241,7 @@ void setup() {
|
|||
// ****************************************************
|
||||
// the loop() method runs continuously
|
||||
// ****************************************************
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
if (menuActive()) {
|
||||
|
@ -222,30 +252,17 @@ void loop(void)
|
|||
toggleMenu(false);
|
||||
vgaMode = false;
|
||||
emu_start();
|
||||
emu_Init(filename);
|
||||
//digitalWrite(TFT_CS, 1);
|
||||
//digitalWrite(SD_CS, 1);
|
||||
emu_Init(filename,0);
|
||||
tft.fillScreenNoDma( RGBVAL16(0x00,0x00,0x00) );
|
||||
tft.startDMA();
|
||||
}
|
||||
else if (action == ACTION_RUNVGA) {
|
||||
#ifdef HAS_VGA
|
||||
else if (action == ACTION_RUNVGA) {
|
||||
toggleMenu(false);
|
||||
vgaMode = true;
|
||||
VGA_frame_buffer = (uint8_t *)malloc((UVGA_YRES*(UVGA_XRES+UVGA_XRES_EXTRA))*sizeof(uint8_t));
|
||||
uvga.set_static_framebuffer(VGA_frame_buffer);
|
||||
emu_start();
|
||||
emu_Init(filename);
|
||||
int retvga = uvga.begin(&modeline);
|
||||
Serial.println(retvga);
|
||||
Serial.print("VGA init: ");
|
||||
Serial.println(retvga);
|
||||
uvga.clear(0x00);
|
||||
vgaMode = false;
|
||||
emu_start();
|
||||
emu_Init(filename,1);
|
||||
tft.fillScreenNoDma( RGBVAL16(0x00,0x00,0x00) );
|
||||
// In VGA mode, we show the keyboard on TFT
|
||||
toggleVirtualkeyboard(true); // keepOn
|
||||
Serial.println("Starting");
|
||||
#endif
|
||||
tft.startDMA();
|
||||
}
|
||||
delay(20);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#include <string.h>
|
||||
|
||||
#include "emuapi.h"
|
||||
//#include "tft_t_dma.h"
|
||||
|
||||
#include "dcastaway.h"
|
||||
#include "st.h"
|
||||
|
@ -9,6 +8,9 @@
|
|||
#include "m68k_intrf.h"
|
||||
#include "iopins.h"
|
||||
|
||||
#ifdef HAS_T4_VGA
|
||||
#include "vga_t_dma.h"
|
||||
#endif
|
||||
|
||||
#ifndef NO_SOUND
|
||||
#include "sound.h"
|
||||
|
@ -42,21 +44,37 @@ extern unsigned char fdc_motor;
|
|||
|
||||
#define XRES 320
|
||||
#define YRES 200
|
||||
|
||||
|
||||
#ifdef HAS_T4_VGA
|
||||
#define DOUBLE_BUFFERING 1
|
||||
|
||||
#ifdef DOUBLE_BUFFERING
|
||||
#ifdef HIRES
|
||||
static vga_pixel line[XRES*2];
|
||||
#else
|
||||
static vga_pixel line[XRES];
|
||||
#endif
|
||||
#else
|
||||
#ifdef HIRES
|
||||
static unsigned short line[XRES*2];
|
||||
#else
|
||||
static unsigned short line[XRES];
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
static unsigned short line[XRES];
|
||||
#endif
|
||||
|
||||
#define PALMULT8(x) ((x)<<5)
|
||||
#define RGBVAL16(r,g,b) ( (((r>>3)&0x1f)<<11) | (((g>>2)&0x3f)<<5) | (((b>>3)&0x1f)<<0) )
|
||||
|
||||
|
||||
void Redraw16 ( int row, int vid_adr ) {
|
||||
|
||||
#ifndef DOUBLE_BUFFERING
|
||||
void Redraw16 ( int row, int vid_adr )
|
||||
{
|
||||
static unsigned short palmap [ 16 ];
|
||||
//Source address
|
||||
register unsigned short *line_i;
|
||||
line_i = (unsigned short *)(&membase[vid_adr]);
|
||||
register unsigned short *line_o= &line[0];
|
||||
//Build paletter
|
||||
if (vid_flag) {
|
||||
unsigned char i, r, g, b;
|
||||
for (i = 0; i < 16; i++) {
|
||||
|
@ -79,16 +97,20 @@ void Redraw16 ( int row, int vid_adr ) {
|
|||
*line_o++ = palmap [ ind ];
|
||||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row*2);
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row*2+1);
|
||||
#else
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Redraw16_med ( int row, int vid_adr ) {
|
||||
void Redraw16_med ( int row, int vid_adr )
|
||||
{
|
||||
static unsigned short palmap [ 4 ];
|
||||
//Source address
|
||||
register unsigned short *line_i;
|
||||
line_i = (unsigned short *)(&membase[vid_adr]);
|
||||
register unsigned short *line_o= &line[0];
|
||||
//Build paletter
|
||||
if (vid_flag) {
|
||||
unsigned char i, r, g, b;
|
||||
for (i = 0; i < 4; i++) {
|
||||
|
@ -97,7 +119,6 @@ void Redraw16_med ( int row, int vid_adr ) {
|
|||
r = PALMULT8 ( ((vid_col[i] >> 8) & 0x7) );
|
||||
palmap [ i ] = RGBVAL16(r,g,b);
|
||||
}
|
||||
//palmap [ 0 ] = RGBVAL16(0xff,0xff,0xff);
|
||||
vid_flag=0;
|
||||
}
|
||||
register int col;
|
||||
|
@ -107,13 +128,63 @@ void Redraw16_med ( int row, int vid_adr ) {
|
|||
for (bit=15;bit>=0;bit--) {
|
||||
int ind = (pl0 >> bit) & 0x1;
|
||||
ind += ((pl1 >> bit) & 0x1)<<1;
|
||||
#ifdef HIRES
|
||||
*line_o++ = palmap [ ind ];
|
||||
#else
|
||||
if (bit & 0x01)
|
||||
*line_o++ = palmap [ ind ];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2);
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2+1);
|
||||
#else
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Redraw16_hi ( int row, int vid_adr )
|
||||
{
|
||||
static unsigned short palmap [ 2 ];
|
||||
register unsigned short *line_i;
|
||||
line_i = (unsigned short *)(&membase[vid_adr]);
|
||||
register unsigned short *line_o= &line[0];
|
||||
if (vid_flag) {
|
||||
palmap [ 0 ] = RGBVAL16(0xff,0xff,0xff);
|
||||
palmap [ 1 ] = RGBVAL16(0x00,0x00,0x00);
|
||||
vid_flag=0;
|
||||
}
|
||||
register int col;
|
||||
register int bit;
|
||||
for (col=0; col<40; col++) {
|
||||
register unsigned short pl0=*line_i++;
|
||||
for (bit=15;bit>=0;bit--) {
|
||||
int ind = (pl0 >> bit) & 0x1;
|
||||
#ifdef HIRES
|
||||
*line_o++ = palmap [ ind ];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2);
|
||||
#endif
|
||||
line_o= &line[0];
|
||||
for (col=0; col<40; col++) {
|
||||
register unsigned short pl0=*line_i++;
|
||||
for (bit=15;bit>=0;bit--) {
|
||||
int ind = (pl0 >> bit) & 0x1;
|
||||
#ifdef HIRES
|
||||
*line_o++ = palmap [ ind ];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2+1);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static uint8 disk0[256];
|
||||
static uint8 disk1[256];
|
||||
|
@ -140,6 +211,9 @@ void ast_Init(void)
|
|||
|
||||
static int mouse_x = XRES/2;
|
||||
static int mouse_y = 100;
|
||||
static int prev_mouse_x = XRES/2;
|
||||
static int prev_mouse_y = 100;
|
||||
|
||||
static int prev_key = 0;
|
||||
static int prev_j = 0;
|
||||
static int prev_mouseb = 0;
|
||||
|
@ -354,42 +428,62 @@ static void do_events(void)
|
|||
{
|
||||
int bClick = k & ~prev_k;
|
||||
prev_k = k;
|
||||
|
||||
int mouseb=0;
|
||||
|
||||
// Toggle mouse/joystick
|
||||
if (bClick & MASK_KEY_USER1) {
|
||||
if (isMouse) isMouse = false;
|
||||
else isMouse = true;
|
||||
|
||||
}
|
||||
// Toggle keymap
|
||||
if (bClick & MASK_KEY_USER2) {
|
||||
#ifndef HAS_T4_VGA
|
||||
emu_setKeymap(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// force joystick mode if mouse detected
|
||||
if (emu_MouseDetected() ) isMouse = false;
|
||||
|
||||
if (hk != prev_hk) {
|
||||
prev_hk = hk;
|
||||
if ( (hk != 0) && (hk != prev_key) ) {
|
||||
prev_key = hk;
|
||||
IkbdKeyPress ( hk );
|
||||
//if (hk == 68) {
|
||||
// if (isMouse) isMouse = false;
|
||||
// else isMouse = true;
|
||||
//}
|
||||
//IkbdLoop();
|
||||
//Serial.print("press ");
|
||||
//Serial.println(hk);
|
||||
}
|
||||
}
|
||||
if ( (hk == 0) && (prev_key) ) {
|
||||
IkbdKeyRelease ( prev_key | 0x80 );
|
||||
//IkbdLoop();
|
||||
//Serial.print("release ");
|
||||
//Serial.println(hk);
|
||||
prev_key = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int buts,dx,dy;
|
||||
int mouseEvent = emu_GetMouse(&dx,&dy,&buts);
|
||||
if (mouseEvent){
|
||||
mouse_x += dx;
|
||||
#ifdef HIRES
|
||||
if (vid_shiftmode==COL2) {
|
||||
if ( mouse_x >= XRES*2 ) {
|
||||
mouse_x = XRES*2-1;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if ( mouse_x >= XRES ) {
|
||||
mouse_x = XRES-1;
|
||||
}
|
||||
else if ( mouse_x < 0 ) {
|
||||
mouse_x = 0;
|
||||
}
|
||||
mouse_y += dy;
|
||||
if ( mouse_y >= YRES ) {
|
||||
mouse_y = YRES-1;
|
||||
}
|
||||
else if ( mouse_y < 0 ) {
|
||||
mouse_y = 0;
|
||||
}
|
||||
if (buts & 0x1) mouseb=1;;
|
||||
}
|
||||
|
||||
|
||||
if (!isMouse)
|
||||
|
@ -417,52 +511,202 @@ static void do_events(void)
|
|||
}
|
||||
else {
|
||||
if (( k & MASK_JOY1_RIGHT) || ( k & MASK_JOY2_RIGHT)) {
|
||||
if ( mouse_x < XRES ) {
|
||||
mouse_x += 1;
|
||||
//Serial.print("r");
|
||||
IkbdMouseMotion ( mouse_x, mouse_y );
|
||||
IkbdLoop();
|
||||
mouse_x += 1;
|
||||
#ifdef HIRES
|
||||
if (vid_shiftmode==COL2) {
|
||||
if ( mouse_x >= XRES*2 ) {
|
||||
mouse_x = XRES*2-1;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if ( mouse_x >= XRES ) {
|
||||
mouse_x = XRES-1;
|
||||
}
|
||||
}
|
||||
else if (( k & MASK_JOY1_LEFT) || ( k & MASK_JOY2_LEFT)) {
|
||||
if ( mouse_x > 1 ) {
|
||||
mouse_x -= 1;
|
||||
//Serial.print("l");
|
||||
IkbdMouseMotion ( mouse_x, mouse_y );
|
||||
IkbdLoop();
|
||||
mouse_x -= 1;
|
||||
if ( mouse_x < 0 ) {
|
||||
mouse_x = 0;
|
||||
}
|
||||
}
|
||||
else if (( k & MASK_JOY1_UP) || ( k & MASK_JOY2_UP)) {
|
||||
if ( mouse_y > 1 ) {
|
||||
mouse_y -= 1;
|
||||
//Serial.print("u");
|
||||
IkbdMouseMotion ( mouse_x, mouse_y );
|
||||
IkbdLoop();
|
||||
mouse_y -= 1;
|
||||
if ( mouse_y < 0 ) {
|
||||
mouse_y = 0;
|
||||
}
|
||||
}
|
||||
else if (( k & MASK_JOY1_DOWN) || ( k & MASK_JOY2_DOWN)) {
|
||||
if ( mouse_y < YRES ) {
|
||||
mouse_y += 1;
|
||||
//Serial.print("d");
|
||||
IkbdMouseMotion ( mouse_x, mouse_y );
|
||||
IkbdLoop();
|
||||
}
|
||||
mouse_y += 1;
|
||||
if ( mouse_y >= YRES ) {
|
||||
mouse_y = YRES-1;
|
||||
}
|
||||
}
|
||||
|
||||
int mouseb=0;
|
||||
if (( k & MASK_JOY1_BTN) || ( k & MASK_JOY2_BTN)) {
|
||||
mouseb=1;
|
||||
}
|
||||
if ( (mouseb != prev_mouseb) ){
|
||||
if (mouseb) IkbdMousePress(2);
|
||||
else IkbdMouseRelease(2);
|
||||
//Serial.println("btoggle");
|
||||
IkbdLoop();
|
||||
prev_mouseb = mouseb;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( (prev_mouse_x != mouse_x) | (prev_mouse_y != mouse_y) ) {
|
||||
IkbdMouseMotion ( mouse_x, mouse_y );
|
||||
IkbdLoop();
|
||||
prev_mouse_x = mouse_x;
|
||||
prev_mouse_y = mouse_y;
|
||||
}
|
||||
if ( (mouseb != prev_mouseb) ){
|
||||
if (mouseb) IkbdMousePress(2);
|
||||
else IkbdMouseRelease(2);
|
||||
IkbdLoop();
|
||||
prev_mouseb = mouseb;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DOUBLE_BUFFERING
|
||||
static unsigned short lines[200*80];
|
||||
#ifdef HAS_T4_VGA
|
||||
static unsigned char palettes[200*16];
|
||||
#else
|
||||
static unsigned short palettes[200*16];
|
||||
#endif
|
||||
static unsigned char modes[200];
|
||||
|
||||
static void renderScreen(void) {
|
||||
register int col;
|
||||
register int bit;
|
||||
int row;
|
||||
for (row=0; row<200; row++) {
|
||||
int mode= modes[row];
|
||||
unsigned short * line_i = &lines[80*row];
|
||||
#ifdef HAS_T4_VGA
|
||||
vga_pixel * palmap = &palettes[row*16];
|
||||
register vga_pixel *line_o= (unsigned char *)&line[0];
|
||||
#else
|
||||
unsigned short * palmap = &palettes[row*16];
|
||||
register unsigned short *line_o= &line[0];
|
||||
#endif
|
||||
if (mode==MONO) {
|
||||
#ifdef HIRES
|
||||
for (col=0; col<40; col++) {
|
||||
register unsigned short pl0=*line_i++;
|
||||
for (bit=15;bit>=0;bit--) {
|
||||
int ind = (pl0 >> bit) & 0x1;
|
||||
*line_o++ = palmap [ ind ];
|
||||
}
|
||||
}
|
||||
emu_DrawLine8((vga_pixel*)&line[0], XRES*2, YRES, row*2);
|
||||
line_o= (vga_pixel *)&line[0];
|
||||
for (col=0; col<40; col++) {
|
||||
register unsigned short pl0=*line_i++;
|
||||
for (bit=15;bit>=0;bit--) {
|
||||
int ind = (pl0 >> bit) & 0x1;
|
||||
*line_o++ = palmap [ ind ];
|
||||
}
|
||||
}
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES*2, YRES, row*2+1);
|
||||
#endif
|
||||
}
|
||||
else if (mode==COL2) {
|
||||
for (col=0; col<40; col++) {
|
||||
register unsigned short pl0=*line_i++,pl1=*line_i++;
|
||||
for (bit=15;bit>=0;bit--) {
|
||||
int ind = (pl0 >> bit) & 0x1;
|
||||
ind += ((pl1 >> bit) & 0x1)<<1;
|
||||
#ifdef HIRES
|
||||
*line_o++ = palmap [ ind ];
|
||||
#else
|
||||
if (bit & 0x01)
|
||||
*line_o++ = palmap [ ind ];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef HAS_T4_VGA
|
||||
#ifdef HIRES
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES*2, YRES, row*2);
|
||||
emu_CopyLine(XRES*2, YRES, row*2, row*2+1);
|
||||
#else
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
#else
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
for (col=0; col<20; col++) {
|
||||
register unsigned short pl0=*line_i++,pl1=*line_i++,pl2=*line_i++,pl3=*line_i++;
|
||||
for (bit=15;bit>=0;bit--) {
|
||||
int ind = (pl0 >> bit) & 0x1;
|
||||
ind += ((pl1 >> bit) & 0x1)<<1;
|
||||
ind += ((pl2 >> bit) & 0x1)<<2;
|
||||
ind += ((pl3 >> bit) & 0x1)<<3;
|
||||
*line_o++ = palmap [ ind ];
|
||||
}
|
||||
}
|
||||
#ifdef HAS_T4_VGA
|
||||
#ifdef HIRES
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES, YRES, row*2);
|
||||
emu_CopyLine(XRES*2, YRES, row*2, row*2+1);
|
||||
#else
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
#else
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static copyLine(int row, int vid_adr, int mode)
|
||||
{
|
||||
#ifdef HAS_T4_VGA
|
||||
vga_pixel * palmap=&palettes[row*16];
|
||||
#else
|
||||
unsigned short * palmap=&palettes[row*16];
|
||||
#endif
|
||||
unsigned char i, r, g, b;
|
||||
modes[row] = mode;
|
||||
if (vid_flag) {
|
||||
vid_flag=0;
|
||||
}
|
||||
if (mode==MONO) {
|
||||
#ifdef HAS_T4_VGA
|
||||
palmap [ 0 ] = VGA_RGB(0xff,0xff,0xff);
|
||||
palmap [ 1 ] = VGA_RGB(0x00,0x00,0x00);
|
||||
#else
|
||||
palmap [ 0 ] = RGBVAL16(0xff,0xff,0xff);
|
||||
palmap [ 1 ] = RGBVAL16(0x00,0x00,0x00);
|
||||
#endif
|
||||
}
|
||||
else if (mode==COL2) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
b = PALMULT8 ( (vid_col[i] & 0x7) );
|
||||
g = PALMULT8 ( ((vid_col[i] >> 4) & 0x7) );
|
||||
r = PALMULT8 ( ((vid_col[i] >> 8) & 0x7) );
|
||||
#ifdef HAS_T4_VGA
|
||||
palmap [ i ] = VGA_RGB(r,g,b);
|
||||
#else
|
||||
palmap [ i ] = RGBVAL16(r,g,b);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < 16; i++) {
|
||||
b = PALMULT8 ( (vid_col[i] & 0x7) );
|
||||
g = PALMULT8 ( ((vid_col[i] >> 4) & 0x7) );
|
||||
r = PALMULT8 ( ((vid_col[i] >> 8) & 0x7) );
|
||||
#ifdef HAS_T4_VGA
|
||||
palmap [ i ] = VGA_RGB(r,g,b);
|
||||
#else
|
||||
palmap [ i ] = RGBVAL16(r,g,b);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
memcpy(&lines[row*80], &membase[vid_adr], 160);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void ast_Step(void)
|
||||
{
|
||||
int delay_fdc_motor=0;
|
||||
|
@ -592,15 +836,21 @@ void ast_Step(void)
|
|||
|
||||
|
||||
if (emu_FrameSkip() == 0 ) {
|
||||
//Update video address
|
||||
//Update video address and draw screen line
|
||||
vid_adr=(vid_baseh<<16)+(vid_basem<<8)+(hbl-64)*160;
|
||||
|
||||
//Draw screen line
|
||||
if (vid_shiftmode==COL2) {
|
||||
Redraw16_med ( hbl - 64, vid_adr );
|
||||
#ifdef DOUBLE_BUFFERING
|
||||
copyLine(hbl - 64, vid_adr,vid_shiftmode);
|
||||
#else
|
||||
|
||||
if (vid_shiftmode==MONO) {
|
||||
Redraw16_hi( hbl - 64, vid_adr );
|
||||
}
|
||||
else if (vid_shiftmode==COL2) {
|
||||
Redraw16_med( hbl - 64, vid_adr );
|
||||
} else {
|
||||
Redraw16 ( hbl - 64, vid_adr );
|
||||
}
|
||||
Redraw16( hbl - 64, vid_adr );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//Timer-A event count mode
|
||||
|
@ -629,8 +879,19 @@ void ast_Step(void)
|
|||
//Vertical blank?
|
||||
else if (hbl>=313)
|
||||
{
|
||||
//delay(15);
|
||||
#ifdef DOUBLE_BUFFERING
|
||||
if (vid_shiftmode==MONO) {
|
||||
emu_DrawWaitLine(325);
|
||||
}
|
||||
else if (vid_shiftmode==COL2) {
|
||||
emu_DrawWaitLine(360);
|
||||
} else {
|
||||
emu_DrawWaitLine(360);
|
||||
}
|
||||
renderScreen();
|
||||
#else
|
||||
emu_DrawVsync();
|
||||
#endif
|
||||
do_events();
|
||||
#ifndef NO_SOUND
|
||||
Sound_Update_VBL();
|
||||
|
@ -726,8 +987,10 @@ int disk_Seek(int seek) {
|
|||
}
|
||||
|
||||
|
||||
void ast_Start(char * filename)
|
||||
void ast_Start(char * filename, int mode)
|
||||
{
|
||||
if (mode) display_mode = MONO;
|
||||
|
||||
emu_printf("init started");
|
||||
strncpy (disk[0].name, filename, sizeof(disk[0].name));
|
||||
initialize_memmap();
|
||||
|
@ -744,6 +1007,7 @@ void ast_Start(char * filename)
|
|||
Sound_Init();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
HWReset(); /* CPU Reset */
|
||||
|
||||
emu_printf("init done");
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
extern void ast_Init(void);
|
||||
extern void ast_Step(void);
|
||||
extern void ast_Start(char * filename);
|
||||
extern void ast_Start(char * filename, int mode);
|
||||
extern void ast_Input(int click);
|
||||
|
||||
|
|
|
@ -16,14 +16,18 @@
|
|||
|
||||
|
||||
|
||||
#ifdef HIRES
|
||||
#define TFT_WIDTH 640
|
||||
#define TFT_REALWIDTH 640
|
||||
#else
|
||||
#define TFT_WIDTH 320
|
||||
#define TFT_REALWIDTH 320
|
||||
#endif
|
||||
|
||||
#define TFT_HEIGHT 240
|
||||
#define TFT_REALHEIGHT 240
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
class TFT_T_DMA: public VGA_T4
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
//#define OLD_LAYOUT 1
|
||||
#define HAS_T4_VGA 1
|
||||
//#define HIRES 1
|
||||
#define HIRES 1
|
||||
|
||||
//#define INVX 1
|
||||
#define INVY 1
|
||||
|
|
|
@ -310,6 +310,7 @@ void uae_Input(int bClick) {
|
|||
|
||||
// force joystick mode if mouse detected
|
||||
if (emu_MouseDetected() ) isMouse = false;
|
||||
|
||||
int buts,dx,dy;
|
||||
int mouseEvent = emu_GetMouse(&dx,&dy,&buts);
|
||||
if (mouseEvent){
|
||||
|
|
Ładowanie…
Reference in New Issue