sms: WIP !
This commit is contained in:
parent
faa2576f83
commit
43eabf566b
2
blk/001
2
blk/001
@ -8,7 +8,7 @@ MASTER INDEX
|
||||
280 Z80 boot code 390 Cross-compiled core
|
||||
490 TRS-80 Recipe 520 Fonts
|
||||
550 TI-84+ Recipe 580 RC2014 Recipe
|
||||
|
||||
620 Sega Master System Recipe
|
||||
|
||||
|
||||
|
||||
|
2
blk/209
2
blk/209
@ -8,4 +8,4 @@ JP [nn, (HL), (IX), (IY)]
|
||||
JR [, Z, NZ, C, NC]
|
||||
|
||||
DI EI EXDEHL EXX HALT
|
||||
NOP RET SCF
|
||||
NOP RET RETI RETN SCF
|
||||
|
3
blk/224
3
blk/224
@ -5,4 +5,5 @@
|
||||
0xed5e OP2 IM2,
|
||||
0xeda0 OP2 LDI, 0xedb0 OP2 LDIR,
|
||||
0xeda8 OP2 LDD, 0xedb8 OP2 LDDR,
|
||||
0xed44 OP2 NEG, 0xed4d OP2 RETI,
|
||||
0xed44 OP2 NEG,
|
||||
0xed4d OP2 RETI, 0xed45 OP2 RETN,
|
||||
|
16
blk/622
Normal file
16
blk/622
Normal file
@ -0,0 +1,16 @@
|
||||
VDP Driver
|
||||
|
||||
Implement (emit) on the console. Characters start at the top
|
||||
left. Every (emit) call converts the ASCII char received to its
|
||||
internal font, then put that char on screen, advancing the
|
||||
cursor by one. When reaching the end of the line (33rd char),
|
||||
wrap to the next.
|
||||
|
||||
In the future, there's going to be a scrolling mechanism when
|
||||
we reach the bottom of the screen, but for now, when the end of
|
||||
the screen is reached, we wrap up to the top.
|
||||
|
||||
When reaching a new line, we clear that line and the next to
|
||||
help readability.
|
||||
|
||||
Load range: 623-623
|
9
blk/623
Normal file
9
blk/623
Normal file
@ -0,0 +1,9 @@
|
||||
CODE _ctl ( a -- sends LSB then MSB )
|
||||
HL POPqq, chkPS,
|
||||
A L LDrr, VDP_CTLPORT OUTnA,
|
||||
A H LDrr, VDP_CTLPORT OUTnA,
|
||||
;CODE
|
||||
CODE _data
|
||||
HL POPqq, chkPS,
|
||||
A L LDrr, VDP_DATAPORT OUTnA,
|
||||
;CODE
|
10
blk/624
Normal file
10
blk/624
Normal file
@ -0,0 +1,10 @@
|
||||
CODE _blank ( this is way too slow in Forth )
|
||||
A XORr, VDP_CTLPORT OUTnA,
|
||||
A 0x40 LDrn, VDP_CTLPORT OUTnA,
|
||||
HL 0x4000 LDddnn,
|
||||
BEGIN,
|
||||
A XORr, VDP_DATAPORT OUTnA,
|
||||
HL DECss, HLZ,
|
||||
JRNZ, AGAIN,
|
||||
;CODE
|
||||
|
10
blk/625
Normal file
10
blk/625
Normal file
@ -0,0 +1,10 @@
|
||||
CREATE _idat
|
||||
0b00000100 C, 0x80 C, ( Bit 2: Select mode 4 )
|
||||
0b00000000 C, 0x81 C,
|
||||
0b11111111 C, 0x82 C, ( Name table: 0x3800 )
|
||||
0b11111111 C, 0x85 C, ( Sprite table: 0x3f00 )
|
||||
0b11111111 C, 0x86 C, ( sprite use tiles from 0x2000 )
|
||||
0b11111111 C, 0x87 C, ( Border uses palette 0xf )
|
||||
0b00000000 C, 0x88 C, ( BG X scroll )
|
||||
0b00000000 C, 0x89 C, ( BG Y scroll )
|
||||
0b11111111 C, 0x8a C, ( Line counter (why have this?) )
|
12
blk/626
Normal file
12
blk/626
Normal file
@ -0,0 +1,12 @@
|
||||
: _zero ( x -- send 0 _data x times )
|
||||
( x ) 0 DO 0 _data LOOP ;
|
||||
|
||||
( Each row in ~FNT is a row of the glyph and there is 7 of
|
||||
them. We insert a blank one at the end of those 7. For each
|
||||
row we set, we need to send 3 zero-bytes because each pixel in
|
||||
the tile is actually 4 bits because it can select among 16
|
||||
palettes. We use only 2 of them, which is why those bytes
|
||||
always stay zero. )
|
||||
: _sfont ( a -- Send font to VDP )
|
||||
7 0 DO C@+ _data 3 _zero LOOP DROP
|
||||
( blank row ) 4 _zero ;
|
14
blk/627
Normal file
14
blk/627
Normal file
@ -0,0 +1,14 @@
|
||||
: _set ( row col tilenum -- )
|
||||
ROT 5 LSHIFT ROT OR 0x7800 OR _ctl
|
||||
_data 1 _zero
|
||||
;
|
||||
: VDP$
|
||||
9 0 DO _idat I 2 * + @ _ctl LOOP _blank
|
||||
( palettes )
|
||||
0xc000 _ctl
|
||||
( BG ) 1 _zero 0x3f _data 14 _zero
|
||||
( sprite, inverted colors ) 0x3f _data 15 _zero
|
||||
0x4000 _ctl 0x5e 0 DO ~FNT I 7 * + _sfont LOOP
|
||||
0 0 1 _set
|
||||
;
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <xcb/xcb.h>
|
||||
|
||||
@ -155,7 +156,11 @@ void draw_pixels()
|
||||
void event_loop()
|
||||
{
|
||||
while (1) {
|
||||
emul_step();
|
||||
if (!emul_step()) {
|
||||
fprintf(stderr, "CPU halted, quitting\n");
|
||||
usleep(1000 * 1000);
|
||||
break;
|
||||
}
|
||||
if (vdp_changed) {
|
||||
// To avoid overdrawing, we'll let the CPU run a bit to finish its
|
||||
// drawing operation.
|
||||
|
@ -1,10 +1,16 @@
|
||||
TARGET = os.sms
|
||||
BASEDIR = ../..
|
||||
ZASM = $(BASEDIR)/emul/zasm/zasm
|
||||
KERNEL = $(BASEDIR)/kernel
|
||||
APPS = $(BASEDIR)/apps
|
||||
TARGET = os.bin
|
||||
STAGE = ../../emul/stage
|
||||
EMUL = ../../emul/hw/sms/sms
|
||||
|
||||
.PHONY: all
|
||||
all: $(TARGET)
|
||||
$(TARGET): glue.asm
|
||||
$(ZASM) $(KERNEL) $(APPS) < glue.asm > $@
|
||||
all: $(TARGET)
|
||||
$(TARGET): xcomp.fs $(STAGE)
|
||||
cat xcomp.fs | $(STAGE) > $@
|
||||
|
||||
$(EMUL):
|
||||
$(MAKE) -C ${@:%/sms=%}
|
||||
|
||||
.PHONY: emul
|
||||
emul: $(EMUL) $(TARGET)
|
||||
$(EMUL) $(TARGET)
|
||||
|
||||
|
32
recipes/sms/xcomp.fs
Normal file
32
recipes/sms/xcomp.fs
Normal file
@ -0,0 +1,32 @@
|
||||
( 8K of onboard RAM )
|
||||
0xc000 CONSTANT RAMSTART
|
||||
0xdd00 CONSTANT RS_ADDR
|
||||
( Memory register at the end of RAM. Must not overwrite )
|
||||
0xddca CONSTANT PS_ADDR
|
||||
0xbf CONSTANT VDP_CTLPORT
|
||||
0xbe CONSTANT VDP_DATAPORT
|
||||
32 CONSTANT VDP_COLS
|
||||
24 CONSTANT VDP_ROWS
|
||||
212 LOAD ( z80 assembler )
|
||||
: ZFILL, ( u ) 0 DO 0 A, LOOP ;
|
||||
262 LOAD ( xcomp )
|
||||
524 LOAD ( font compiler )
|
||||
270 LOAD ( xcomp overrides )
|
||||
|
||||
0x100 JPnn, 0x63 ZFILL, ( 0x66 )
|
||||
RETN, 0x98 ZFILL, ( 0x100 )
|
||||
( All set, carry on! )
|
||||
CURRENT @ XCURRENT !
|
||||
0x100 BIN( !
|
||||
282 LOAD ( boot.z80 )
|
||||
393 LOAD ( xcomp core low )
|
||||
CREATE ~FNT CPFNT7x7
|
||||
623 627 LOADR ( VDP )
|
||||
: (key) 0 ; : (emit) DROP ;
|
||||
420 LOAD ( xcomp core high )
|
||||
(entry) _
|
||||
( Update LATEST )
|
||||
PC ORG @ 8 + !
|
||||
," VDP$ BYE "
|
||||
ORG @ 0x100 - 256 /MOD 2 PC! 2 PC!
|
||||
H@ 256 /MOD 2 PC! 2 PC!
|
Loading…
Reference in New Issue
Block a user