--- hatari/src/falcon/videl.c 2019/04/09 08:54:34 1.1.1.10 +++ hatari/src/falcon/videl.c 2019/04/09 08:55:47 1.1.1.11 @@ -120,7 +120,6 @@ Uint16 vfc_counter; /* counter for VFC static void VIDEL_memset_uint32(Uint32 *addr, Uint32 color, int count); static void VIDEL_memset_uint16(Uint16 *addr, Uint16 color, int count); static void VIDEL_memset_uint8(Uint8 *addr, Uint8 color, int count); -static void Videl_ColorReg_WriteWord(void); /** @@ -148,7 +147,7 @@ void VIDEL_reset(void) videl.save_scrWidth = 640; videl.save_scrHeight = 480; videl.save_scrBpp = ConfigureParams.Screen.nForceBpp; - HostScreen_setWindowSize(videl.save_scrWidth, videl.save_scrHeight, videl.save_scrBpp); + HostScreen_setWindowSize(videl.save_scrWidth, videl.save_scrHeight, videl.save_scrBpp, false); /* Reset IO register (some are not initialized by TOS) */ IoMem_WriteWord(0xff820e, 0); /* Line offset */ @@ -888,10 +887,12 @@ static void VIDEL_updateColors(void) } -void VIDEL_ZoomModeChanged(void) +void VIDEL_ZoomModeChanged(bool bForceChange) { /* User selected another zoom mode, so set a new screen resolution now */ - HostScreen_setWindowSize(videl.save_scrWidth, videl.save_scrHeight, videl.save_scrBpp == 16 ? 16 : ConfigureParams.Screen.nForceBpp); + HostScreen_setWindowSize(videl.save_scrWidth, videl.save_scrHeight, + videl.save_scrBpp == 16 ? 16 : ConfigureParams.Screen.nForceBpp, + bForceChange); } @@ -927,7 +928,7 @@ bool VIDEL_renderScreen(void) } if (change) { LOG_TRACE(TRACE_VIDEL, "Videl : video mode change to %dx%d@%d\n", videl.save_scrWidth, videl.save_scrHeight, videl.save_scrBpp); - HostScreen_setWindowSize(videl.save_scrWidth, videl.save_scrHeight, videl.save_scrBpp == 16 ? 16 : ConfigureParams.Screen.nForceBpp); + HostScreen_setWindowSize(videl.save_scrWidth, videl.save_scrHeight, videl.save_scrBpp == 16 ? 16 : ConfigureParams.Screen.nForceBpp, false); } if (!HostScreen_renderBegin()) @@ -951,9 +952,10 @@ bool VIDEL_renderScreen(void) */ nextline = linewidth + lineoffset; - if ((vw<32) || (vh<32)) + if ((vw < 32) || (vh < 32)) { + LOG_TRACE(TRACE_VIDEL, "Videl : %dx%d screen size, not drawing\n", vw, vh); return false; - + } if (videl.save_scrBpp < 16 && videl.hostColorsSync == 0) VIDEL_updateColors(); @@ -1142,8 +1144,8 @@ void VIDEL_ConvertScreenNoZoom(int vw, i if (vh>scrheight) vh_clip = scrheight; /* If emulated computer is the FALCON, we must take : - * vw = X area display size and not all the X screen with the borders into account - * vh = Y area display size and not all the Y screen with the borders into account + * vw = display width without borders + * vh = display height without borders */ if (ConfigureParams.System.nMachineType == MACHINE_FALCON) { vw = videl.XSize; @@ -1586,10 +1588,16 @@ void VIDEL_ConvertScreenZoom(int vw, int /* We reuse the following values to compute the display area size in zoom mode */ /* scrwidth must not change */ if (ConfigureParams.System.nMachineType == MACHINE_FALCON) { + /* get values without borders */ vw = videl.XSize; vh = videl.YSize; scrheight = vh * coefy; } + if (vw < 16) { + Log_Printf(LOG_WARN, "ERROR: Videl <16 screen width (%dx%d without borders)\nIf this happens at TOS boot, remove hatari.nvram,\nNVRAM video settings in it are corrupted.\n", vw, vh); + /* prevent memory corruption */ + return; + } if (vbpp<16) { Uint8 color[16]; @@ -2043,7 +2051,7 @@ static void VIDEL_memset_uint8(Uint8 *ad * move.b #$55,$ff8241 -> color 0 is now $555 ! * move.b #$71,$ff8240 -> color 0 is now $171 (bytes are first copied, then masked) */ -void Videl_ColorReg_WriteWord(void) +static void Videl_ColorReg_WriteWord(void) { Uint16 col; Uint32 addr = IoAccessCurrentAddress; @@ -2161,54 +2169,54 @@ void Videl_Color15_WriteWord(void) /** * display Videl registers values (for debugger info command) */ -void Videl_Info(Uint32 dummy) +void Videl_Info(FILE *fp, Uint32 dummy) { if (ConfigureParams.System.nMachineType != MACHINE_FALCON) { - fprintf(stderr, "Not Falcon - no Videl!\n"); + fprintf(fp, "Not Falcon - no Videl!\n"); return; } - fprintf(stderr, "$FF8006.b : monitor type : %02x\n", IoMem_ReadByte(0xff8006)); - fprintf(stderr, "$FF8201.b : Video Base Hi : %02x\n", IoMem_ReadByte(0xff8201)); - fprintf(stderr, "$FF8203.b : Video Base Mi : %02x\n", IoMem_ReadByte(0xff8203)); - fprintf(stderr, "$FF8205.b : Video Count Hi : %02x\n", IoMem_ReadByte(0xff8205)); - fprintf(stderr, "$FF8207.b : Video Count Mi : %02x\n", IoMem_ReadByte(0xff8207)); - fprintf(stderr, "$FF8209.b : Video Count Lo : %02x\n", IoMem_ReadByte(0xff8209)); - fprintf(stderr, "$FF820A.b : Sync mode : %02x\n", IoMem_ReadByte(0xff820a)); - fprintf(stderr, "$FF820D.b : Video Base Lo : %02x\n", IoMem_ReadByte(0xff820d)); - fprintf(stderr, "$FF820E.w : offset to next line : %04x\n", IoMem_ReadWord(0xff820e)); - fprintf(stderr, "$FF8210.w : VWRAP - line width : %04x\n", IoMem_ReadWord(0xff8210)); - fprintf(stderr, "$FF8260.b : ST shift mode : %02x\n", IoMem_ReadByte(0xff8260)); - fprintf(stderr, "$FF8264.w : Horizontal scroll register : %04x\n", IoMem_ReadWord(0xff8264)); - fprintf(stderr, "$FF8266.w : Falcon shift mode : %04x\n", IoMem_ReadWord(0xff8266)); - fprintf(stderr, "\n"); - fprintf(stderr, "$FF8280.w : HHC - Horizontal Hold Counter : %04x\n", IoMem_ReadWord(0xff8280)); - fprintf(stderr, "$FF8282.w : HHT - Horizontal Hold Timer : %04x\n", IoMem_ReadWord(0xff8282)); - fprintf(stderr, "$FF8284.w : HBB - Horizontal Border Begin : %04x\n", IoMem_ReadWord(0xff8284)); - fprintf(stderr, "$FF8286.w : HBE - Horizontal Border End : %04x\n", IoMem_ReadWord(0xff8286)); - fprintf(stderr, "$FF8288.w : HDB - Horizontal Display Begin : %04x\n", IoMem_ReadWord(0xff8288)); - fprintf(stderr, "$FF828A.w : HDE - Horizontal Display End : %04x\n", IoMem_ReadWord(0xff828a)); - fprintf(stderr, "$FF828C.w : HSS - Horizontal SS : %04x\n", IoMem_ReadWord(0xff828c)); - fprintf(stderr, "$FF828E.w : HFS - Horizontal FS : %04x\n", IoMem_ReadWord(0xff828e)); - fprintf(stderr, "$FF8290.w : HEE - Horizontal EE : %04x\n", IoMem_ReadWord(0xff8290)); - fprintf(stderr, "\n"); - fprintf(stderr, "$FF82A0.w : VFC - Vertical Frequency Counter : %04x\n", IoMem_ReadWord(0xff82a0)); - fprintf(stderr, "$FF82A2.w : VFT - Vertical Frequency Timer : %04x\n", IoMem_ReadWord(0xff82a2)); - fprintf(stderr, "$FF82A4.w : VBB - Vertical Border Begin : %04x\n", IoMem_ReadWord(0xff82a4)); - fprintf(stderr, "$FF82A6.w : VBE - Vertical Border End : %04x\n", IoMem_ReadWord(0xff82a6)); - fprintf(stderr, "$FF82A8.w : VDB - Vertical Display Begin : %04x\n", IoMem_ReadWord(0xff82a8)); - fprintf(stderr, "$FF82AA.w : VDE - Vertical Display End : %04x\n", IoMem_ReadWord(0xff82aa)); - fprintf(stderr, "$FF82AC.w : VSS - Vertical SS : %04x\n", IoMem_ReadWord(0xff82ac)); - fprintf(stderr, "\n"); - fprintf(stderr, "$FF82C0.w : VCO - Video control : %04x\n", IoMem_ReadWord(0xff82c0)); - fprintf(stderr, "$FF82C2.w : VMD - Video mode : %04x\n", IoMem_ReadWord(0xff82c2)); - fprintf(stderr, "\n-------------------------\n"); + fprintf(fp, "$FF8006.b : monitor type : %02x\n", IoMem_ReadByte(0xff8006)); + fprintf(fp, "$FF8201.b : Video Base Hi : %02x\n", IoMem_ReadByte(0xff8201)); + fprintf(fp, "$FF8203.b : Video Base Mi : %02x\n", IoMem_ReadByte(0xff8203)); + fprintf(fp, "$FF8205.b : Video Count Hi : %02x\n", IoMem_ReadByte(0xff8205)); + fprintf(fp, "$FF8207.b : Video Count Mi : %02x\n", IoMem_ReadByte(0xff8207)); + fprintf(fp, "$FF8209.b : Video Count Lo : %02x\n", IoMem_ReadByte(0xff8209)); + fprintf(fp, "$FF820A.b : Sync mode : %02x\n", IoMem_ReadByte(0xff820a)); + fprintf(fp, "$FF820D.b : Video Base Lo : %02x\n", IoMem_ReadByte(0xff820d)); + fprintf(fp, "$FF820E.w : offset to next line : %04x\n", IoMem_ReadWord(0xff820e)); + fprintf(fp, "$FF8210.w : VWRAP - line width : %04x\n", IoMem_ReadWord(0xff8210)); + fprintf(fp, "$FF8260.b : ST shift mode : %02x\n", IoMem_ReadByte(0xff8260)); + fprintf(fp, "$FF8264.w : Horizontal scroll register : %04x\n", IoMem_ReadWord(0xff8264)); + fprintf(fp, "$FF8266.w : Falcon shift mode : %04x\n", IoMem_ReadWord(0xff8266)); + fprintf(fp, "\n"); + fprintf(fp, "$FF8280.w : HHC - Horizontal Hold Counter : %04x\n", IoMem_ReadWord(0xff8280)); + fprintf(fp, "$FF8282.w : HHT - Horizontal Hold Timer : %04x\n", IoMem_ReadWord(0xff8282)); + fprintf(fp, "$FF8284.w : HBB - Horizontal Border Begin : %04x\n", IoMem_ReadWord(0xff8284)); + fprintf(fp, "$FF8286.w : HBE - Horizontal Border End : %04x\n", IoMem_ReadWord(0xff8286)); + fprintf(fp, "$FF8288.w : HDB - Horizontal Display Begin : %04x\n", IoMem_ReadWord(0xff8288)); + fprintf(fp, "$FF828A.w : HDE - Horizontal Display End : %04x\n", IoMem_ReadWord(0xff828a)); + fprintf(fp, "$FF828C.w : HSS - Horizontal SS : %04x\n", IoMem_ReadWord(0xff828c)); + fprintf(fp, "$FF828E.w : HFS - Horizontal FS : %04x\n", IoMem_ReadWord(0xff828e)); + fprintf(fp, "$FF8290.w : HEE - Horizontal EE : %04x\n", IoMem_ReadWord(0xff8290)); + fprintf(fp, "\n"); + fprintf(fp, "$FF82A0.w : VFC - Vertical Frequency Counter : %04x\n", IoMem_ReadWord(0xff82a0)); + fprintf(fp, "$FF82A2.w : VFT - Vertical Frequency Timer : %04x\n", IoMem_ReadWord(0xff82a2)); + fprintf(fp, "$FF82A4.w : VBB - Vertical Border Begin : %04x\n", IoMem_ReadWord(0xff82a4)); + fprintf(fp, "$FF82A6.w : VBE - Vertical Border End : %04x\n", IoMem_ReadWord(0xff82a6)); + fprintf(fp, "$FF82A8.w : VDB - Vertical Display Begin : %04x\n", IoMem_ReadWord(0xff82a8)); + fprintf(fp, "$FF82AA.w : VDE - Vertical Display End : %04x\n", IoMem_ReadWord(0xff82aa)); + fprintf(fp, "$FF82AC.w : VSS - Vertical SS : %04x\n", IoMem_ReadWord(0xff82ac)); + fprintf(fp, "\n"); + fprintf(fp, "$FF82C0.w : VCO - Video control : %04x\n", IoMem_ReadWord(0xff82c0)); + fprintf(fp, "$FF82C2.w : VMD - Video mode : %04x\n", IoMem_ReadWord(0xff82c2)); + fprintf(fp, "\n-------------------------\n"); - fprintf(stderr, "Video base : %08x\n", + fprintf(fp, "Video base : %08x\n", (IoMem_ReadByte(0xff8201)<<16) + (IoMem_ReadByte(0xff8203)<<8) + IoMem_ReadByte(0xff820d)); - fprintf(stderr, "Video count : %08x\n", + fprintf(fp, "Video count : %08x\n", (IoMem_ReadByte(0xff8205)<<16) + (IoMem_ReadByte(0xff8207)<<8) + IoMem_ReadByte(0xff8209));