sms: fix cursor mis-display in text mode
In CURSOR!, I was using a write commande to read from VRAM and the emulator didn't properly behave and did as if everything was fine. The result on a real SMS was that the cursor would contain the inverted glyph of the contents of the *old* cursor position.
This commit is contained in:
parent
c8be290b88
commit
57fd14b0b3
11
blk.fs
11
blk.fs
@ -2769,7 +2769,8 @@ CODE TICKS 1 chkPS, ( n=100us )
|
|||||||
( ----- 470 )
|
( ----- 470 )
|
||||||
( Z80 driver for TMS9918. Implements grid protocol. Requires
|
( Z80 driver for TMS9918. Implements grid protocol. Requires
|
||||||
TMS_CTLPORT, TMS_DATAPORT and ~FNT from the Font compiler at
|
TMS_CTLPORT, TMS_DATAPORT and ~FNT from the Font compiler at
|
||||||
B520. Load range B470-472 )
|
B520. Patterns are at addr 0x0000, Names are at 0x3800.
|
||||||
|
Load range B470-472 )
|
||||||
CODE _ctl ( a -- sends LSB then MSB )
|
CODE _ctl ( a -- sends LSB then MSB )
|
||||||
HL POP, chkPS,
|
HL POP, chkPS,
|
||||||
A L LDrr, TMS_CTLPORT OUTiA,
|
A L LDrr, TMS_CTLPORT OUTiA,
|
||||||
@ -2795,10 +2796,10 @@ them. We insert a blank one at the end of those 7. )
|
|||||||
0x20 - ( glyph ) 0x5e MOD _data ;
|
0x20 - ( glyph ) 0x5e MOD _data ;
|
||||||
( ----- 472 )
|
( ----- 472 )
|
||||||
: CURSOR! ( new old -- )
|
: CURSOR! ( new old -- )
|
||||||
0x7800 OR DUP _ctl [ TMS_DATAPORT LITN ] PC@
|
DUP 0x3800 OR _ctl [ TMS_DATAPORT LITN ] PC@
|
||||||
0x7f AND ( new cmd glyph ) SWAP _ctl _data
|
0x7f AND ( new old glyph ) SWAP 0x7800 OR _ctl _data
|
||||||
0x7800 OR DUP _ctl [ TMS_DATAPORT LITN ] PC@
|
DUP 0x3800 OR _ctl [ TMS_DATAPORT LITN ] PC@
|
||||||
0x80 OR ( cmd glyph ) SWAP _ctl _data ;
|
0x80 OR ( new glyph ) SWAP 0x7800 OR _ctl _data ;
|
||||||
: COLS 40 ; : LINES 24 ;
|
: COLS 40 ; : LINES 24 ;
|
||||||
: TMS$
|
: TMS$
|
||||||
0x8100 _ctl ( blank screen )
|
0x8100 _ctl ( blank screen )
|
||||||
|
@ -27,6 +27,7 @@ void tms_init(TMS9918 *tms)
|
|||||||
memset(tms->regs, 0, 0x10);
|
memset(tms->regs, 0, 0x10);
|
||||||
tms->has_cmdlsb = false;
|
tms->has_cmdlsb = false;
|
||||||
tms->curaddr = 0;
|
tms->curaddr = 0;
|
||||||
|
tms->databuf = 0;
|
||||||
tms->width = 40*6;
|
tms->width = 40*6;
|
||||||
tms->height = 24*8;
|
tms->height = 24*8;
|
||||||
}
|
}
|
||||||
@ -50,20 +51,20 @@ void tms_cmd_wr(TMS9918 *tms, uint8_t val)
|
|||||||
} else {
|
} else {
|
||||||
// VRAM
|
// VRAM
|
||||||
tms->curaddr = ((val&0x3f) << 8) + tms->cmdlsb;
|
tms->curaddr = ((val&0x3f) << 8) + tms->cmdlsb;
|
||||||
|
if ((val & 0x40) == 0) { // reading VRAM
|
||||||
|
tms->databuf = tms->vram[tms->curaddr];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t tms_data_rd(TMS9918 *tms)
|
uint8_t tms_data_rd(TMS9918 *tms)
|
||||||
{
|
{
|
||||||
if (tms->curaddr < TMS_VRAM_SIZE) {
|
return tms->databuf;
|
||||||
return tms->vram[tms->curaddr++];
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tms_data_wr(TMS9918 *tms, uint8_t val)
|
void tms_data_wr(TMS9918 *tms, uint8_t val)
|
||||||
{
|
{
|
||||||
|
tms->databuf = val;
|
||||||
if (tms->curaddr < TMS_VRAM_SIZE) {
|
if (tms->curaddr < TMS_VRAM_SIZE) {
|
||||||
tms->vram[tms->curaddr++] = val;
|
tms->vram[tms->curaddr++] = val;
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ typedef struct {
|
|||||||
uint8_t cmdlsb;
|
uint8_t cmdlsb;
|
||||||
bool has_cmdlsb;
|
bool has_cmdlsb;
|
||||||
uint16_t curaddr;
|
uint16_t curaddr;
|
||||||
|
uint8_t databuf;
|
||||||
uint16_t width; // in pixels
|
uint16_t width; // in pixels
|
||||||
uint16_t height; // in pixels
|
uint16_t height; // in pixels
|
||||||
} TMS9918;
|
} TMS9918;
|
||||||
|
Loading…
Reference in New Issue
Block a user