sms: add cursor visual indicator in VDP mode 4
This required the change of CURSOR! signature: we now supply it with both old and new cursor positions. Also, fix broken _bs in Grid subsystem.
This commit is contained in:
parent
74d2a5d722
commit
cf79ceefea
@ -29,8 +29,13 @@ always stay zero. )
|
|||||||
( blank row ) 4 _zero ;
|
( blank row ) 4 _zero ;
|
||||||
: CELL! ( c pos )
|
: CELL! ( c pos )
|
||||||
2 * 0x7800 OR _ctl ( c )
|
2 * 0x7800 OR _ctl ( c )
|
||||||
0x20 - ( glyph ) 0x5e MOD _data 0 _data ;
|
0x20 - ( glyph ) 0x5e MOD _data ;
|
||||||
( ----- 604 )
|
( ----- 604 )
|
||||||
|
: CURSOR! ( new old -- )
|
||||||
|
( unset palette bit in old tile )
|
||||||
|
2 * 1+ 0x7800 OR _ctl 0 _data
|
||||||
|
( set palette bit for at specified pos )
|
||||||
|
2 * 1+ 0x7800 OR _ctl 0x8 _data ;
|
||||||
: VDP$
|
: VDP$
|
||||||
9 0 DO _idat I 2 * + @ _ctl LOOP _blank
|
9 0 DO _idat I 2 * + @ _ctl LOOP _blank
|
||||||
( palettes )
|
( palettes )
|
||||||
@ -40,8 +45,7 @@ always stay zero. )
|
|||||||
0x4000 _ctl 0x5e 0 DO ~FNT I 7 * + _sfont LOOP
|
0x4000 _ctl 0x5e 0 DO ~FNT I 7 * + _sfont LOOP
|
||||||
( bit 6, enable display, bit 7, ?? ) 0x81c0 _ctl ;
|
( bit 6, enable display, bit 7, ?? ) 0x81c0 _ctl ;
|
||||||
|
|
||||||
: COLS 32 ;
|
: COLS 32 ; : LINES 24 ;
|
||||||
: LINES 24 ;
|
|
||||||
( ----- 610 )
|
( ----- 610 )
|
||||||
Pad driver - read input from MD controller
|
Pad driver - read input from MD controller
|
||||||
|
|
||||||
|
8
blk.fs
8
blk.fs
@ -2214,8 +2214,8 @@ See doc/grid.txt.
|
|||||||
Load range: B402-B403
|
Load range: B402-B403
|
||||||
( ----- 402 )
|
( ----- 402 )
|
||||||
: XYPOS [ GRID_MEM LITN ] ; : XYMODE [ GRID_MEM LITN ] 2+ ;
|
: XYPOS [ GRID_MEM LITN ] ; : XYMODE [ GRID_MEM LITN ] 2+ ;
|
||||||
'? CURSOR! NIP NOT [IF] : CURSOR! DROP ; [THEN]
|
'? CURSOR! NIP NOT [IF] : CURSOR! 2DROP ; [THEN]
|
||||||
: XYPOS! COLS LINES * MOD DUP CURSOR! XYPOS ! ;
|
: XYPOS! COLS LINES * MOD DUP XYPOS @ CURSOR! XYPOS ! ;
|
||||||
: AT-XY ( x y -- ) COLS * + XYPOS! ;
|
: AT-XY ( x y -- ) COLS * + XYPOS! ;
|
||||||
'? NEWLN NIP NOT [IF]
|
'? NEWLN NIP NOT [IF]
|
||||||
: NEWLN ( ln -- ) COLS * DUP COLS + SWAP DO 0x20 I CELL! LOOP ;
|
: NEWLN ( ln -- ) COLS * DUP COLS + SWAP DO 0x20 I CELL! LOOP ;
|
||||||
@ -2223,7 +2223,7 @@ Load range: B402-B403
|
|||||||
: _lf XYMODE C@ IF EXIT THEN
|
: _lf XYMODE C@ IF EXIT THEN
|
||||||
XYPOS @ COLS / 1+ LINES MOD DUP NEWLN
|
XYPOS @ COLS / 1+ LINES MOD DUP NEWLN
|
||||||
COLS * XYPOS! ;
|
COLS * XYPOS! ;
|
||||||
: _bs 0 ( blank ) XYPOS @ TUCK CELL! ( pos ) 1- XYPOS! ;
|
: _bs 0x20 ( blank ) XYPOS @ TUCK CELL! ( pos ) 1- XYPOS! ;
|
||||||
( ----- 403 )
|
( ----- 403 )
|
||||||
: (emit)
|
: (emit)
|
||||||
DUP 0x08 = IF DROP _bs EXIT THEN
|
DUP 0x08 = IF DROP _bs EXIT THEN
|
||||||
@ -2231,7 +2231,7 @@ Load range: B402-B403
|
|||||||
DUP 0x20 < IF DROP EXIT THEN
|
DUP 0x20 < IF DROP EXIT THEN
|
||||||
XYPOS @ CELL!
|
XYPOS @ CELL!
|
||||||
XYPOS @ 1+ DUP COLS MOD IF XYPOS! ELSE _lf THEN ;
|
XYPOS @ 1+ DUP COLS MOD IF XYPOS! ELSE _lf THEN ;
|
||||||
: GRID$ 0 XYPOS! 0 XYMODE C! ;
|
: GRID$ 0 XYPOS ! 0 XYMODE C! ;
|
||||||
( ----- 410 )
|
( ----- 410 )
|
||||||
PS/2 keyboard subsystem
|
PS/2 keyboard subsystem
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
: COLS 80 ; : LINES 32 ;
|
: COLS 80 ; : LINES 32 ;
|
||||||
: CURSOR! ( pos -- ) COLS /MOD 6 PC! ( y ) 5 PC! ( x ) ;
|
: CURSOR! ( new old -- )
|
||||||
: CELL! ( c pos -- ) CURSOR! 0 PC! ;
|
DROP COLS /MOD 6 PC! ( y ) 5 PC! ( x ) ;
|
||||||
|
: CELL! ( c pos -- ) 0 CURSOR! 0 PC! ;
|
||||||
: NEWLN ( ln -- ) DROP 0xa 0 PC! ;
|
: NEWLN ( ln -- ) DROP 0xa 0 PC! ;
|
||||||
|
|
||||||
SYSVARS 0x70 + CONSTANT GRID_MEM
|
SYSVARS 0x70 + CONSTANT GRID_MEM
|
||||||
|
@ -42,13 +42,13 @@ previously enabled one.
|
|||||||
A grid is a device that shows as a grid of ASCII characters and
|
A grid is a device that shows as a grid of ASCII characters and
|
||||||
allows random access to it.
|
allows random access to it.
|
||||||
|
|
||||||
COLS -- n Number of columns in the device
|
COLS -- n Number of columns in the device
|
||||||
LINES -- n Number of lines in the device
|
LINES -- n Number of lines in the device
|
||||||
CELL! c pos -- Set character at pos
|
CELL! c pos -- Set character at pos
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
NEWLN ln -- "Enter" line ln
|
NEWLN ln -- "Enter" line ln
|
||||||
CURSOR! pos -- Set cursor's position
|
CURSOR! new old -- Move cursor from old pos to new pos
|
||||||
|
|
||||||
"pos" is a simple number (y * cols) + x. For example, if we
|
"pos" is a simple number (y * cols) + x. For example, if we
|
||||||
have 40 columns per line, the position (x, y) (12, 10) is 412.
|
have 40 columns per line, the position (x, y) (12, 10) is 412.
|
||||||
|
Loading…
Reference in New Issue
Block a user