diff --git a/MCUME_teensy41/teensycastaway41/dcastaway.h b/MCUME_teensy41/teensycastaway41/dcastaway.h index bd8e465..5ed6e30 100644 --- a/MCUME_teensy41/teensycastaway41/dcastaway.h +++ b/MCUME_teensy41/teensycastaway41/dcastaway.h @@ -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 diff --git a/MCUME_teensy41/teensycastaway41/emuapi.cpp b/MCUME_teensy41/teensycastaway41/emuapi.cpp index df70629..30792db 100644 --- a/MCUME_teensy41/teensycastaway41/emuapi.cpp +++ b/MCUME_teensy41/teensycastaway41/emuapi.cpp @@ -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); diff --git a/MCUME_teensy41/teensycastaway41/emuapi.h b/MCUME_teensy41/teensycastaway41/emuapi.h index c52eb61..6c52f6f 100644 --- a/MCUME_teensy41/teensycastaway41/emuapi.h +++ b/MCUME_teensy41/teensycastaway41/emuapi.h @@ -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); diff --git a/MCUME_teensy41/teensycastaway41/platform_config.h b/MCUME_teensy41/teensycastaway41/platform_config.h index e44c797..a4ac248 100644 --- a/MCUME_teensy41/teensycastaway41/platform_config.h +++ b/MCUME_teensy41/teensycastaway41/platform_config.h @@ -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 diff --git a/MCUME_teensy41/teensycastaway41/st.cpp b/MCUME_teensy41/teensycastaway41/st.cpp index 0139db4..4bda39b 100644 --- a/MCUME_teensy41/teensycastaway41/st.cpp +++ b/MCUME_teensy41/teensycastaway41/st.cpp @@ -616,4 +616,3 @@ PROGMEM uint32 DoIORL(uint32 address) { return (((uint32)DoIORW(address))<<16)+DoIORW(address+2); } - diff --git a/MCUME_teensy41/teensycastaway41/teensycastaway41.ino b/MCUME_teensy41/teensycastaway41/teensycastaway41.ino index 63397aa..1a87493 100644 --- a/MCUME_teensy41/teensycastaway41/teensycastaway41.ino +++ b/MCUME_teensy41/teensycastaway41/teensycastaway41.ino @@ -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); } diff --git a/MCUME_teensy41/teensycastaway41/test.cpp b/MCUME_teensy41/teensycastaway41/test.cpp index ba6a003..806f9e7 100644 --- a/MCUME_teensy41/teensycastaway41/test.cpp +++ b/MCUME_teensy41/teensycastaway41/test.cpp @@ -1,7 +1,6 @@ #include #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"); diff --git a/MCUME_teensy41/teensycastaway41/test.h b/MCUME_teensy41/teensycastaway41/test.h index 99e76da..b85caf7 100644 --- a/MCUME_teensy41/teensycastaway41/test.h +++ b/MCUME_teensy41/teensycastaway41/test.h @@ -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); - diff --git a/MCUME_teensy41/teensycastaway41/vga_t_dma.h b/MCUME_teensy41/teensycastaway41/vga_t_dma.h index 22e5382..b14d9d3 100644 --- a/MCUME_teensy41/teensycastaway41/vga_t_dma.h +++ b/MCUME_teensy41/teensycastaway41/vga_t_dma.h @@ -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 diff --git a/MCUME_teensy41/teensyuae41/platform_config.h b/MCUME_teensy41/teensyuae41/platform_config.h index 12c5ad6..ed4deeb 100644 --- a/MCUME_teensy41/teensyuae41/platform_config.h +++ b/MCUME_teensy41/teensyuae41/platform_config.h @@ -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 diff --git a/MCUME_teensy41/teensyuae41/uae.cpp b/MCUME_teensy41/teensyuae41/uae.cpp index 10aa6d4..f07fced 100644 --- a/MCUME_teensy41/teensyuae41/uae.cpp +++ b/MCUME_teensy41/teensyuae41/uae.cpp @@ -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){