add cga lightpen functionality (hal)
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3437
This commit is contained in:
parent
26e4b50da0
commit
6624a00d18
3 changed files with 33 additions and 15 deletions
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* $Id: vga.h,v 1.46 2009-03-15 11:28:34 c2woody Exp $ */
|
||||
/* $Id: vga.h,v 1.47 2009-06-29 18:43:33 c2woody Exp $ */
|
||||
|
||||
#ifndef DOSBOX_VGA_H
|
||||
#define DOSBOX_VGA_H
|
||||
|
@ -222,7 +222,8 @@ typedef struct {
|
|||
Bit8u vsyncp;
|
||||
Bit8u vsyncw;
|
||||
Bit8u max_scanline;
|
||||
Bit8u lpen_low, lpen_high;
|
||||
Bit16u lightpen;
|
||||
bool lightpen_triggered;
|
||||
Bit8u cursor_start;
|
||||
Bit8u cursor_end;
|
||||
} VGA_OTHER;
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* $Id: vga_draw.cpp,v 1.108 2009-06-28 14:56:14 c2woody Exp $ */
|
||||
/* $Id: vga_draw.cpp,v 1.109 2009-06-29 18:43:33 c2woody Exp $ */
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
@ -1044,6 +1044,7 @@ void VGA_SetupDrawing(Bitu /*val*/) {
|
|||
clock = 14318180;
|
||||
break;
|
||||
}
|
||||
vga.draw.delay.hdend = hdend*1000.0/clock; //in milliseconds
|
||||
}
|
||||
#if C_DEBUG
|
||||
LOG(LOG_VGA,LOG_NORMAL)("h total %d end %d blank (%d/%d) retrace (%d/%d)",
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* $Id: vga_other.cpp,v 1.26 2009-06-28 14:56:14 c2woody Exp $ */
|
||||
/* $Id: vga_other.cpp,v 1.27 2009-06-29 18:43:33 c2woody Exp $ */
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
@ -88,17 +88,19 @@ static void write_crtc_data_other(Bitu /*port*/,Bitu val,Bitu /*iolen*/) {
|
|||
break;
|
||||
case 0x0E: /*Cursor Location High Register */
|
||||
vga.config.cursor_start&=0x00ff;
|
||||
vga.config.cursor_start|=(Bit8u)(val << 8);
|
||||
vga.config.cursor_start|=((Bit8u)val) << 8;
|
||||
break;
|
||||
case 0x0F: /* Cursor Location Low Register */
|
||||
vga.config.cursor_start&=0xff00;
|
||||
vga.config.cursor_start|=(Bit8u)val;
|
||||
break;
|
||||
case 0x10: /* Light Pen High */
|
||||
vga.other.lpen_high = (Bit8u)(val & 0x1f); //only 6 bits
|
||||
vga.other.lightpen &= 0xff;
|
||||
vga.other.lightpen |= (val & 0x3f)<<8; // only 6 bits
|
||||
break;
|
||||
case 0x11: /* Light Pen Low */
|
||||
vga.other.lpen_low = (Bit8u)val;
|
||||
vga.other.lightpen &= 0xff00;
|
||||
vga.other.lightpen |= (Bit8u)val;
|
||||
break;
|
||||
default:
|
||||
LOG(LOG_VGAMISC,LOG_NORMAL)("MC6845:Write %X to illegal index %x",val,vga.other.index);
|
||||
|
@ -129,17 +131,17 @@ static Bitu read_crtc_data_other(Bitu /*port*/,Bitu /*iolen*/) {
|
|||
case 0x0B: /* Cursor End Register */
|
||||
return vga.other.cursor_end;
|
||||
case 0x0C: /* Start Address High Register */
|
||||
return vga.config.display_start >> 8;
|
||||
return (Bit8u)(vga.config.display_start >> 8);
|
||||
case 0x0D: /* Start Address Low Register */
|
||||
return vga.config.display_start;
|
||||
return (Bit8u)(vga.config.display_start & 0xff);
|
||||
case 0x0E: /*Cursor Location High Register */
|
||||
return vga.config.cursor_start>>8;
|
||||
return (Bit8u)(vga.config.cursor_start >> 8);
|
||||
case 0x0F: /* Cursor Location Low Register */
|
||||
return vga.config.cursor_start;
|
||||
return (Bit8u)(vga.config.cursor_start & 0xff);
|
||||
case 0x10: /* Light Pen High */
|
||||
return vga.other.lpen_high;
|
||||
return (Bit8u)(vga.other.lightpen >> 8);
|
||||
case 0x11: /* Light Pen Low */
|
||||
return vga.other.lpen_low;
|
||||
return (Bit8u)(vga.other.lightpen & 0xff);
|
||||
default:
|
||||
LOG(LOG_VGAMISC,LOG_NORMAL)("MC6845:Read from illegal index %x",vga.other.index);
|
||||
}
|
||||
|
@ -390,9 +392,21 @@ static void write_tandy(Bitu port,Bitu val,Bitu /*iolen*/) {
|
|||
case 0x3da:
|
||||
vga.tandy.reg_index=(Bit8u)val;
|
||||
break;
|
||||
// case 0x3db: //Clear lightpen latch
|
||||
case 0x3db: // Clear lightpen latch
|
||||
vga.other.lightpen_triggered = false;
|
||||
break;
|
||||
// case 0x3dc: //Preset lightpen latch
|
||||
case 0x3dc: // Preset lightpen latch
|
||||
if (!vga.other.lightpen_triggered) {
|
||||
vga.other.lightpen_triggered = true; // TODO: this shows at port 3ba/3da bit 1
|
||||
|
||||
double timeInFrame = PIC_FullIndex()-vga.draw.delay.framestart;
|
||||
double timeInLine = fmod(timeInFrame,vga.draw.delay.htotal);
|
||||
Bitu current_scanline = (Bitu)(timeInFrame / vga.draw.delay.htotal);
|
||||
|
||||
vga.other.lightpen = (Bit16u)((vga.draw.address_add/2) * (current_scanline/2));
|
||||
vga.other.lightpen += (Bit16u)((timeInLine / vga.draw.delay.hdend) *
|
||||
((float)(vga.draw.address_add/2)));
|
||||
}
|
||||
break;
|
||||
// case 0x3dd: //Extended ram page address register:
|
||||
break;
|
||||
|
@ -529,6 +543,8 @@ void VGA_SetupOther(void) {
|
|||
if (machine==MCH_CGA) {
|
||||
IO_RegisterWriteHandler(0x3d8,write_cga,IO_MB);
|
||||
IO_RegisterWriteHandler(0x3d9,write_cga,IO_MB);
|
||||
IO_RegisterWriteHandler(0x3db,write_tandy,IO_MB);
|
||||
IO_RegisterWriteHandler(0x3dc,write_tandy,IO_MB);
|
||||
MAPPER_AddHandler(IncreaseHue,MK_f11,MMOD2,"inchue","Inc Hue");
|
||||
MAPPER_AddHandler(DecreaseHue,MK_f11,0,"dechue","Dec Hue");
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue