mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-02 10:20:55 +11:00
Compare commits
No commits in common. "f2817870aa4fa9cc215da15a852614d3e027a8b9" and "db9885b8cf51b302e3b4935a93f05690de0c9fa8" have entirely different histories.
f2817870aa
...
db9885b8cf
4
blk/081
4
blk/081
@ -1,6 +1,6 @@
|
|||||||
RAMSTART FUTURE USES +3c BLK(*
|
RAMSTART FUTURE USES +3c BLK(*
|
||||||
+02 CURRENT +3e FUTURE USES
|
+02 CURRENT +3e XYPOS
|
||||||
+04 HERE
|
+04 HERE +40 FUTURE USES
|
||||||
+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,6 +3,7 @@
|
|||||||
: 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 BS + SPC + BS )
|
emit 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> !
|
||||||
BS SPC BS
|
SPC BS
|
||||||
;
|
;
|
||||||
|
|
||||||
: KEY
|
: KEY
|
||||||
|
12
blk/428
12
blk/428
@ -1,16 +1,16 @@
|
|||||||
: (rdlnc) ( -- c )
|
: (rdlnc) ( -- f )
|
||||||
( 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
|
||||||
thus ! automatically null-terminates our string )
|
thus ! automatically null-terminates our string )
|
||||||
IN> @ ! 1 IN> +! ( c )
|
IN> @ ! 1 IN> +! ( c )
|
||||||
( if newline, replace with zero to indicate EOL )
|
( if newline, replace with zero to indicate EOL )
|
||||||
DUP 0xd = IF DROP 0 THEN ;
|
DUP 0xd = IF DROP 0 THEN ;
|
||||||
|
2
blk/620
2
blk/620
@ -1,3 +1,3 @@
|
|||||||
Sega Master System Recipe
|
Sega Master System Recipe
|
||||||
|
|
||||||
622 VDP 630 PAD
|
622 VDP
|
||||||
|
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-628
|
Load range: 623-623
|
||||||
|
1
blk/623
1
blk/623
@ -1,4 +1,3 @@
|
|||||||
: 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,15 +1,6 @@
|
|||||||
: _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)
|
||||||
DUP 0x08 = IF DROP _bs EXIT THEN
|
XYPOS @ 2 * 0x7800 OR _ctl
|
||||||
DUP 0x0d = IF DROP _lf EXIT THEN
|
0x20 - 0x5e MIN ( tilenum ) _data 1 _zero
|
||||||
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,5 +6,4 @@
|
|||||||
( 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
16
blk/630
@ -1,16 +0,0 @@
|
|||||||
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
6
blk/631
@ -1,6 +0,0 @@
|
|||||||
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
12
blk/632
@ -1,12 +0,0 @@
|
|||||||
: _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
15
blk/633
@ -1,15 +0,0 @@
|
|||||||
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
8
blk/634
@ -1,8 +0,0 @@
|
|||||||
: _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
13
blk/635
@ -1,13 +0,0 @@
|
|||||||
: _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
9
blk/636
@ -1,9 +0,0 @@
|
|||||||
: (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,9 +7,6 @@ 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=%}
|
||||||
|
|
||||||
|
Binary file not shown.
@ -3,14 +3,10 @@
|
|||||||
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 )
|
||||||
@ -26,11 +22,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 )
|
||||||
632 637 LOADR ( PAD )
|
: (key) 4 ;
|
||||||
420 LOAD ( xcomp core high )
|
420 LOAD ( xcomp core high )
|
||||||
(entry) _
|
(entry) _
|
||||||
( Update LATEST )
|
( Update LATEST )
|
||||||
PC ORG @ 8 + !
|
PC ORG @ 8 + !
|
||||||
," VDP$ PAD$ " EOT,
|
," VDP$ " 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,7 +19,8 @@ emul: $(EMUL) $(TARGET)
|
|||||||
$(EMUL) $(TARGET)
|
$(EMUL) $(TARGET)
|
||||||
|
|
||||||
os.rom: $(TARGET)
|
os.rom: $(TARGET)
|
||||||
dd if=$(TARGET) bs=1M of=$@ conv=sync
|
cp $(TARGET) $@
|
||||||
|
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