mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-02 08:20:57 +11:00
Compare commits
9 Commits
db9885b8cf
...
f2817870aa
Author | SHA1 | Date | |
---|---|---|---|
|
f2817870aa | ||
|
7ceff6144c | ||
|
b6c039589f | ||
|
aad713c477 | ||
|
fdea069544 | ||
|
ebc70be8e8 | ||
|
852c775b5b | ||
|
f9a8e6f180 | ||
|
1597f1e131 |
4
blk/081
4
blk/081
@ -1,6 +1,6 @@
|
|||||||
RAMSTART FUTURE USES +3c BLK(*
|
RAMSTART FUTURE USES +3c BLK(*
|
||||||
+02 CURRENT +3e XYPOS
|
+02 CURRENT +3e FUTURE USES
|
||||||
+04 HERE +40 FUTURE USES
|
+04 HERE
|
||||||
+06 C<? +51 CURRENTPTR
|
+06 C<? +51 CURRENTPTR
|
||||||
+08 C<* override +53 (emit) override
|
+08 C<* override +53 (emit) override
|
||||||
+0a NLPTR +55 (key) override
|
+0a NLPTR +55 (key) override
|
||||||
|
4
blk/083
4
blk/083
@ -7,8 +7,8 @@ WORDBUF is the buffer used by WORD
|
|||||||
BOOT C< PTR is used when Forth boots from in-memory
|
BOOT C< PTR is used when Forth boots from in-memory
|
||||||
source. See "Initialization sequence" below.
|
source. See "Initialization sequence" below.
|
||||||
|
|
||||||
XYPOS Current position of the cursor on screen. The meaning of
|
|
||||||
the pos in terms of row and cols is driver-dependent.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1
blk/393
1
blk/393
@ -3,7 +3,6 @@
|
|||||||
: HERE 0x04 RAM+ ;
|
: HERE 0x04 RAM+ ;
|
||||||
: CURRENT* 0x51 RAM+ ;
|
: CURRENT* 0x51 RAM+ ;
|
||||||
: CURRENT CURRENT* @ ;
|
: CURRENT CURRENT* @ ;
|
||||||
: XYPOS 0x40 RAM+ ;
|
|
||||||
|
|
||||||
( w -- a f )
|
( w -- a f )
|
||||||
: FIND CURRENT @ SWAP _find ;
|
: FIND CURRENT @ SWAP _find ;
|
||||||
|
4
blk/427
4
blk/427
@ -1,10 +1,10 @@
|
|||||||
( handle backspace: go back one char in IN>, if possible, then
|
( handle backspace: go back one char in IN>, if possible, then
|
||||||
emit SPC + BS )
|
emit BS + SPC + BS )
|
||||||
: (inbs)
|
: (inbs)
|
||||||
( already at IN( ? )
|
( already at IN( ? )
|
||||||
IN> @ IN( = IF EXIT THEN
|
IN> @ IN( = IF EXIT THEN
|
||||||
IN> @ 1- IN> !
|
IN> @ 1- IN> !
|
||||||
SPC BS
|
BS SPC BS
|
||||||
;
|
;
|
||||||
|
|
||||||
: KEY
|
: KEY
|
||||||
|
6
blk/428
6
blk/428
@ -1,12 +1,12 @@
|
|||||||
: (rdlnc) ( -- f )
|
: (rdlnc) ( -- c )
|
||||||
( buffer overflow? same as if we typed a newline )
|
( buffer overflow? same as if we typed a newline )
|
||||||
IN> @ IN) = IF 0x0a ELSE KEY THEN ( c )
|
IN> @ IN) = IF 0x0a ELSE KEY THEN ( c )
|
||||||
DUP 0x7f = IF DROP 0x8 THEN ( del? same as backspace )
|
DUP 0x7f = IF DROP 0x8 THEN ( del? same as backspace )
|
||||||
DUP 0x0a = IF DROP 0xd THEN ( lf? same as cr )
|
DUP 0x0a = IF DROP 0xd THEN ( lf? same as cr )
|
||||||
( echo back )
|
|
||||||
DUP EMIT ( c )
|
|
||||||
( bacspace? handle and exit )
|
( bacspace? handle and exit )
|
||||||
DUP 0x8 = IF (inbs) EXIT THEN
|
DUP 0x8 = IF (inbs) EXIT THEN
|
||||||
|
( echo back )
|
||||||
|
DUP EMIT ( c )
|
||||||
( write and advance )
|
( write and advance )
|
||||||
DUP ( keep as result ) ( c c )
|
DUP ( keep as result ) ( c c )
|
||||||
( We take advantage of the fact that c's MSB is always zero and
|
( We take advantage of the fact that c's MSB is always zero and
|
||||||
|
2
blk/620
2
blk/620
@ -1,3 +1,3 @@
|
|||||||
Sega Master System Recipe
|
Sega Master System Recipe
|
||||||
|
|
||||||
622 VDP
|
622 VDP 630 PAD
|
||||||
|
2
blk/622
2
blk/622
@ -13,4 +13,4 @@ the screen is reached, we wrap up to the top.
|
|||||||
When reaching a new line, we clear that line and the next to
|
When reaching a new line, we clear that line and the next to
|
||||||
help readability.
|
help readability.
|
||||||
|
|
||||||
Load range: 623-623
|
Load range: 623-628
|
||||||
|
1
blk/623
1
blk/623
@ -1,3 +1,4 @@
|
|||||||
|
: XYPOS [ VDP_MEM LITN ] ;
|
||||||
CODE _ctl ( a -- sends LSB then MSB )
|
CODE _ctl ( a -- sends LSB then MSB )
|
||||||
HL POPqq, chkPS,
|
HL POPqq, chkPS,
|
||||||
A L LDrr, VDP_CTLPORT OUTnA,
|
A L LDrr, VDP_CTLPORT OUTnA,
|
||||||
|
17
blk/627
17
blk/627
@ -1,6 +1,15 @@
|
|||||||
|
: _cell! ( tilenum pos )
|
||||||
|
2 * 0x7800 OR _ctl ( tilenum ) _data 1 _zero ;
|
||||||
|
: _spc! 0 ( blank ) XYPOS @ _cell! ;
|
||||||
|
: _lf
|
||||||
|
_spc! XYPOS @ [ VDP_COLS LITN ] / 1+ [ VDP_ROWS LITN ] MOD
|
||||||
|
[ VDP_COLS LITN ] * XYPOS ! ;
|
||||||
|
: _bs _spc! XYPOS @ 1-
|
||||||
|
[ VDP_COLS VDP_ROWS * LITN ] MOD XYPOS ! ;
|
||||||
: (emit)
|
: (emit)
|
||||||
XYPOS @ 2 * 0x7800 OR _ctl
|
DUP 0x08 = IF DROP _bs EXIT THEN
|
||||||
0x20 - 0x5e MIN ( tilenum ) _data 1 _zero
|
DUP 0x0d = IF DROP _lf EXIT THEN
|
||||||
|
0x20 - DUP 0< IF DROP EXIT THEN
|
||||||
|
0x5e MIN ( tilenum ) XYPOS @ _cell!
|
||||||
XYPOS @ 1+ DUP [ VDP_COLS VDP_ROWS * LITN ]
|
XYPOS @ 1+ DUP [ VDP_COLS VDP_ROWS * LITN ]
|
||||||
= IF DROP 0 THEN XYPOS !
|
= IF DROP 0 THEN XYPOS ! ;
|
||||||
;
|
|
||||||
|
1
blk/628
1
blk/628
@ -6,4 +6,5 @@
|
|||||||
( sprite, inverted colors ) 0x3f _data 15 _zero
|
( sprite, inverted colors ) 0x3f _data 15 _zero
|
||||||
0x4000 _ctl 0x5e 0 DO ~FNT I 7 * + _sfont LOOP
|
0x4000 _ctl 0x5e 0 DO ~FNT I 7 * + _sfont LOOP
|
||||||
0 XYPOS !
|
0 XYPOS !
|
||||||
|
( bit 6, enable display, bit 7, ?? ) 0x81c0 _ctl
|
||||||
;
|
;
|
||||||
|
16
blk/630
Normal file
16
blk/630
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Pad driver - read input from MD controller
|
||||||
|
|
||||||
|
Conveniently expose an API to read the status of a MD pad A.
|
||||||
|
Moreover, implement a mechanism to input arbitrary characters
|
||||||
|
from it. It goes as follow:
|
||||||
|
|
||||||
|
* Direction pad select characters. Up/Down move by one,
|
||||||
|
Left/Right move by 5
|
||||||
|
* Start acts like Return
|
||||||
|
* A acts like Backspace
|
||||||
|
* B changes "character class": lowercase, uppercase, numbers,
|
||||||
|
special chars. The space character is the first among special
|
||||||
|
chars.
|
||||||
|
* C confirms letter selection
|
||||||
|
|
||||||
|
(cont.)
|
6
blk/631
Normal file
6
blk/631
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
This module is currently hard-wired to VDP driver, that is, it
|
||||||
|
calls vdp's routines during (key) to update character
|
||||||
|
selection.
|
||||||
|
|
||||||
|
Load range: 632-637
|
||||||
|
|
12
blk/632
Normal file
12
blk/632
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
: _prevstat [ PAD_MEM LITN ] ;
|
||||||
|
: _sel [ PAD_MEM 1+ LITN ] ;
|
||||||
|
: _next [ PAD_MEM 2+ LITN ] ;
|
||||||
|
|
||||||
|
( Put status for port A in register A. Bits, from MSB to LSB:
|
||||||
|
Start - A - C - B - Right - Left - Down - Up
|
||||||
|
Each bit is high when button is unpressed and low if button is
|
||||||
|
pressed. When no button is pressed, 0xff is returned.
|
||||||
|
This logic below is for the Genesis controller, which is modal.
|
||||||
|
TH is an output pin that swiches the meaning of TL and TR. When
|
||||||
|
TH is high (unselected), TL = Button B and TR = Button C. When
|
||||||
|
TH is low (selected), TL = Button A and TR = Start. )
|
15
blk/633
Normal file
15
blk/633
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
CODE _status
|
||||||
|
A 0b11111101 LDrn, ( TH output, unselected )
|
||||||
|
PAD_CTLPORT OUTnA,
|
||||||
|
PAD_D1PORT INAn,
|
||||||
|
0x3f ANDn, ( low 6 bits are good )
|
||||||
|
B A LDrr, ( let's store them )
|
||||||
|
( Start and A are returned when TH is selected, in bits 5 and
|
||||||
|
4. Well get them, left-shift them and integrate them to B. )
|
||||||
|
A 0b11011101 LDrn, ( TH output, selected )
|
||||||
|
PAD_CTLPORT OUTnA,
|
||||||
|
PAD_D1PORT INAn,
|
||||||
|
0b00110000 ANDn,
|
||||||
|
A SLAr, A SLAr, B ORr,
|
||||||
|
PUSHA,
|
||||||
|
;CODE
|
8
blk/634
Normal file
8
blk/634
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
: _chk ( c --, check _sel range )
|
||||||
|
_sel C@ DUP 0x7f > IF 0x20 _sel C! THEN
|
||||||
|
0x20 < IF 0x7f _sel C! THEN ;
|
||||||
|
CREATE _ '0' C, ':' C, 'A' C, '[' C, 'a' C, 0xff C,
|
||||||
|
: _nxtcls
|
||||||
|
_sel @ _ BEGIN ( c a ) C@+ 2 PICK > UNTIL ( c a )
|
||||||
|
1- C@ SWAP DROP _sel !
|
||||||
|
;
|
13
blk/635
Normal file
13
blk/635
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
: _updsel ( -- f, has an action button been pressed? )
|
||||||
|
_status _prevstat C@ OVER = IF DROP 0 EXIT THEN
|
||||||
|
DUP _prevstat C! ( changed, update ) ( s )
|
||||||
|
0x01 ( UP ) OVER AND NOT IF 1 _sel +! THEN
|
||||||
|
0x02 ( DOWN ) OVER AND NOT IF -1 _sel +! THEN
|
||||||
|
0x04 ( LEFT ) OVER AND NOT IF -5 _sel +! THEN
|
||||||
|
0x08 ( RIGHT ) OVER AND NOT IF 5 _sel +! THEN
|
||||||
|
0x10 ( BUTB ) OVER AND NOT IF _nxtcls THEN
|
||||||
|
( update sel in VDP )
|
||||||
|
_chk _sel C@ (emit) -1 XYPOS +!
|
||||||
|
( return whether any of the high 3 bits is low )
|
||||||
|
0xe0 AND 0xe0 <
|
||||||
|
;
|
9
blk/636
Normal file
9
blk/636
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
: (key)
|
||||||
|
_next C@ IF _next C@ 0 _next C! EXIT THEN
|
||||||
|
BEGIN _updsel UNTIL
|
||||||
|
_prevstat C@
|
||||||
|
0x20 ( BUTC ) OVER AND NOT IF DROP _sel C@ EXIT THEN
|
||||||
|
0x40 ( BUTA ) AND NOT IF 0x8 ( BS ) EXIT THEN
|
||||||
|
( If not BUTC or BUTA, it has to be START )
|
||||||
|
0xd _next C! _sel C@
|
||||||
|
;
|
BIN
emul/forth.bin
BIN
emul/forth.bin
Binary file not shown.
@ -7,6 +7,9 @@ all: $(TARGET)
|
|||||||
$(TARGET): xcomp.fs $(STAGE)
|
$(TARGET): xcomp.fs $(STAGE)
|
||||||
cat xcomp.fs | $(STAGE) > $@
|
cat xcomp.fs | $(STAGE) > $@
|
||||||
|
|
||||||
|
os.sms: $(TARGET)
|
||||||
|
dd if=$(TARGET) bs=32752 conv=sync | cat - sega.bin > $@
|
||||||
|
|
||||||
$(EMUL):
|
$(EMUL):
|
||||||
$(MAKE) -C ${@:%/sms=%}
|
$(MAKE) -C ${@:%/sms=%}
|
||||||
|
|
||||||
|
BIN
recipes/sms/sega.bin
Normal file
BIN
recipes/sms/sega.bin
Normal file
Binary file not shown.
@ -3,10 +3,14 @@
|
|||||||
0xdd00 CONSTANT RS_ADDR
|
0xdd00 CONSTANT RS_ADDR
|
||||||
( Memory register at the end of RAM. Must not overwrite )
|
( Memory register at the end of RAM. Must not overwrite )
|
||||||
0xddca CONSTANT PS_ADDR
|
0xddca CONSTANT PS_ADDR
|
||||||
|
RAMSTART 0x70 + CONSTANT VDP_MEM
|
||||||
0xbf CONSTANT VDP_CTLPORT
|
0xbf CONSTANT VDP_CTLPORT
|
||||||
0xbe CONSTANT VDP_DATAPORT
|
0xbe CONSTANT VDP_DATAPORT
|
||||||
32 CONSTANT VDP_COLS
|
32 CONSTANT VDP_COLS
|
||||||
24 CONSTANT VDP_ROWS
|
24 CONSTANT VDP_ROWS
|
||||||
|
RAMSTART 0x72 + CONSTANT PAD_MEM
|
||||||
|
0x3f CONSTANT PAD_CTLPORT
|
||||||
|
0xdc CONSTANT PAD_D1PORT
|
||||||
212 LOAD ( z80 assembler )
|
212 LOAD ( z80 assembler )
|
||||||
: ZFILL, ( u ) 0 DO 0 A, LOOP ;
|
: ZFILL, ( u ) 0 DO 0 A, LOOP ;
|
||||||
262 LOAD ( xcomp )
|
262 LOAD ( xcomp )
|
||||||
@ -22,11 +26,11 @@ CURRENT @ XCURRENT !
|
|||||||
393 LOAD ( xcomp core low )
|
393 LOAD ( xcomp core low )
|
||||||
CREATE ~FNT CPFNT7x7
|
CREATE ~FNT CPFNT7x7
|
||||||
623 628 LOADR ( VDP )
|
623 628 LOADR ( VDP )
|
||||||
: (key) 4 ;
|
632 637 LOADR ( PAD )
|
||||||
420 LOAD ( xcomp core high )
|
420 LOAD ( xcomp core high )
|
||||||
(entry) _
|
(entry) _
|
||||||
( Update LATEST )
|
( Update LATEST )
|
||||||
PC ORG @ 8 + !
|
PC ORG @ 8 + !
|
||||||
," VDP$ " EOT,
|
," VDP$ PAD$ " EOT,
|
||||||
ORG @ 0x100 - 256 /MOD 2 PC! 2 PC!
|
ORG @ 0x100 - 256 /MOD 2 PC! 2 PC!
|
||||||
H@ 256 /MOD 2 PC! 2 PC!
|
H@ 256 /MOD 2 PC! 2 PC!
|
||||||
|
@ -19,8 +19,7 @@ emul: $(EMUL) $(TARGET)
|
|||||||
$(EMUL) $(TARGET)
|
$(EMUL) $(TARGET)
|
||||||
|
|
||||||
os.rom: $(TARGET)
|
os.rom: $(TARGET)
|
||||||
cp $(TARGET) $@
|
dd if=$(TARGET) bs=1M of=$@ conv=sync
|
||||||
truncate -s 1M $@
|
|
||||||
|
|
||||||
os.8xu: os.rom
|
os.8xu: os.rom
|
||||||
$(MKTIUPGRADE) -p -k keys/0A.key -d TI-84+ os.rom $@ 00
|
$(MKTIUPGRADE) -p -k keys/0A.key -d TI-84+ os.rom $@ 00
|
||||||
|
Loading…
Reference in New Issue
Block a user