mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-26 19:18:07 +11:00
Compare commits
6 Commits
b606dbf9af
...
faa2576f83
Author | SHA1 | Date | |
---|---|---|---|
|
faa2576f83 | ||
|
87b51a6261 | ||
|
bf289b0a67 | ||
|
3fbae082f4 | ||
|
a5269a1c7c | ||
|
eec9549bde |
31
blk/081
31
blk/081
@ -1,17 +1,16 @@
|
|||||||
RAMSTART FUTURE USES +55 (key) override
|
RAMSTART FUTURE USES +3c BLK(*
|
||||||
+02 CURRENT +57 readln's variables
|
+02 CURRENT +3e FUTURE USES
|
||||||
+04 HERE +59 blk's variables
|
+04 HERE
|
||||||
+06 C<? +5b z80a's variables
|
+06 C<? +51 CURRENTPTR
|
||||||
+08 C<* override +5d adev's variables
|
+08 C<* override +53 (emit) override
|
||||||
+0a NLPTR +5f FUTURE USES
|
+0a NLPTR +55 (key) override
|
||||||
+0c C<* +70 DRIVERS
|
+0c C<* +57 FUTURE USES
|
||||||
+0e WORDBUF +80 RAMEND
|
+0e WORDBUF
|
||||||
+2e BOOT C< PTR
|
+2e BOOT C< PTR +5d adev's variables
|
||||||
+30 FUTURE USES
|
+30 IN> +5f FUTURE USES
|
||||||
+4e INTJUMP
|
+32 IN(* +70 DRIVERS
|
||||||
+51 CURRENTPTR
|
+34 BLK@* +80 RAMEND
|
||||||
+53 (emit) override
|
+36 BLK!*
|
||||||
|
+38 BLK>
|
||||||
|
+3a BLKDTY
|
||||||
|
|
||||||
(cont.)
|
(cont.)
|
||||||
|
4
blk/082
4
blk/082
@ -9,8 +9,8 @@ PARSEPTR holds routine address called on (parse)
|
|||||||
C<* holds routine address called on C<. If the C<* override
|
C<* holds routine address called on C<. If the C<* override
|
||||||
at 0x08 is nonzero, this routine is called instead.
|
at 0x08 is nonzero, this routine is called instead.
|
||||||
|
|
||||||
|
IN> is the current position in IN(, which is the input buffer.
|
||||||
|
|
||||||
|
IN(* is a pointer to the input buffer, allocated at runtime.
|
||||||
|
|
||||||
|
|
||||||
(cont.)
|
(cont.)
|
||||||
|
10
blk/083
10
blk/083
@ -7,10 +7,10 @@ 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.
|
||||||
|
|
||||||
INTJUMP All RST offsets (well, not *all* at this moment, I
|
|
||||||
still have to free those slots...) in boot binaries are made to
|
|
||||||
jump to this address. If you use one of those slots for an
|
|
||||||
interrupt, write a jump to the appropriate offset in that RAM
|
|
||||||
location.
|
|
||||||
|
|
||||||
(cont.)
|
(cont.)
|
||||||
|
7
blk/084
7
blk/084
@ -7,10 +7,9 @@ for example), it can point elsewhere.
|
|||||||
NLPTR points to an alternative routine for NL (by default,
|
NLPTR points to an alternative routine for NL (by default,
|
||||||
CRLF).
|
CRLF).
|
||||||
|
|
||||||
|
BLK* see B416.
|
||||||
|
|
||||||
FUTURE USES section is unused for now.
|
FUTURE USES section is unused for now.
|
||||||
|
|
||||||
DRIVERS section is reserved for recipe-specific
|
DRIVERS section is reserved for recipe-specific drivers.
|
||||||
drivers. Here is a list of known usages:
|
|
||||||
|
|
||||||
* 0x70-0x78: ACIA buffer pointers in RC2014 recipes.
|
|
||||||
|
|
||||||
|
9
blk/213
9
blk/213
@ -1,9 +1,6 @@
|
|||||||
: Z80AMEM+ 0x5b RAM+ @ + ;
|
VARIABLE ORG
|
||||||
: ORG 0 Z80AMEM+ ;
|
VARIABLE BIN( 0 BIN( !
|
||||||
: BIN( 2 Z80AMEM+ ;
|
VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4
|
||||||
: L1 4 Z80AMEM+ ; : L2 6 Z80AMEM+ ;
|
|
||||||
: L3 8 Z80AMEM+ ; : L4 10 Z80AMEM+ ;
|
|
||||||
: Z80A$ H@ 0x5b RAM+ ! 12 ALLOT 0 BIN( ! ;
|
|
||||||
: A 7 ; : B 0 ; : C 1 ; : D 2 ;
|
: A 7 ; : B 0 ; : C 1 ; : D 2 ;
|
||||||
: E 3 ; : H 4 ; : L 5 ; : (HL) 6 ;
|
: E 3 ; : H 4 ; : L 5 ; : (HL) 6 ;
|
||||||
: BC 0 ; : DE 1 ; : HL 2 ; : AF 3 ; : SP AF ;
|
: BC 0 ; : DE 1 ; : HL 2 ; : AF 3 ; : SP AF ;
|
||||||
|
6
blk/283
6
blk/283
@ -8,8 +8,8 @@ EXDEHL, JP(HL), NOP, ( 17, nativeWord )
|
|||||||
0 JPnn, ( 1a, next ) 0 JPnn, ( 1d, chkPS )
|
0 JPnn, ( 1a, next ) 0 JPnn, ( 1d, chkPS )
|
||||||
NOP, NOP, ( 20, numberWord ) NOP, NOP, ( 22, litWord )
|
NOP, NOP, ( 20, numberWord ) NOP, NOP, ( 22, litWord )
|
||||||
NOP, NOP, ( 24, addrWord ) NOP, NOP, ( 26, unused )
|
NOP, NOP, ( 24, addrWord ) NOP, NOP, ( 26, unused )
|
||||||
RAMSTART 0x4e + JPnn, ( 28, RST 28 )
|
0 JPnn, ( RST 28 )
|
||||||
0 JPnn, ( 2b, doesWord ) NOP, NOP, ( 2e, unused )
|
0 JPnn, ( 2b, doesWord ) NOP, NOP, ( 2e, unused )
|
||||||
RAMSTART 0x4e + JPnn, ( RST 30 )
|
0 JPnn, ( RST 30 )
|
||||||
0 JPnn, ( 33, execute ) NOP, NOP, ( unused )
|
0 JPnn, ( 33, execute ) NOP, NOP, ( unused )
|
||||||
RAMSTART 0x4e + JPnn, ( RST 38 )
|
0 JPnn, ( RST 38 )
|
||||||
|
11
blk/416
11
blk/416
@ -1,13 +1,12 @@
|
|||||||
: BLKMEM+ 0x59 RAM+ @ + ;
|
|
||||||
( n -- Fetches block n and write it to BLK( )
|
( n -- Fetches block n and write it to BLK( )
|
||||||
: BLK@* 0 BLKMEM+ ;
|
: BLK@* 0x34 RAM+ ;
|
||||||
( n -- Write back BLK( to storage at block n )
|
( n -- Write back BLK( to storage at block n )
|
||||||
: BLK!* 2 BLKMEM+ ;
|
: BLK!* 0x36 RAM+ ;
|
||||||
( Current blk pointer in ( )
|
( Current blk pointer in ( )
|
||||||
: BLK> 4 BLKMEM+ ;
|
: BLK> 0x38 RAM+ ;
|
||||||
( Whether buffer is dirty )
|
( Whether buffer is dirty )
|
||||||
: BLKDTY 6 BLKMEM+ ;
|
: BLKDTY 0x3a RAM+ ;
|
||||||
: BLK( 8 BLKMEM+ ;
|
: BLK( 0x3c RAM+ @ ;
|
||||||
: BLK) BLK( 1024 + ;
|
: BLK) BLK( 1024 + ;
|
||||||
|
|
||||||
|
|
||||||
|
5
blk/417
5
blk/417
@ -1,7 +1,6 @@
|
|||||||
: BLK$
|
: BLK$
|
||||||
H@ 0x59 RAM+ !
|
H@ 0x3c ( BLK(* ) RAM+ !
|
||||||
( 1024 for the block, 8 for variables )
|
1024 ALLOT
|
||||||
1032 ALLOT
|
|
||||||
( LOAD detects end of block with ASCII EOT. This is why
|
( LOAD detects end of block with ASCII EOT. This is why
|
||||||
we write it there. EOT == 0x04 )
|
we write it there. EOT == 0x04 )
|
||||||
4 C,
|
4 C,
|
||||||
|
7
blk/426
7
blk/426
@ -1,10 +1,9 @@
|
|||||||
: RDLNMEM+ 0x57 RAM+ @ + ;
|
|
||||||
( current position in INBUF )
|
( current position in INBUF )
|
||||||
: IN> 0 RDLNMEM+ ;
|
: IN> 0x30 RAM+ ;
|
||||||
( points to INBUF )
|
( points to INBUF )
|
||||||
: IN( 2 RDLNMEM+ ;
|
: IN( 0x32 RAM+ @ ;
|
||||||
( points to INBUF's end )
|
( points to INBUF's end )
|
||||||
: IN) 0x40 ( buffer size ) 2+ RDLNMEM+ ;
|
: IN) 0x40 ( buffer size ) IN( + ;
|
||||||
|
|
||||||
( flush input buffer )
|
( flush input buffer )
|
||||||
( set IN> to IN( and set IN> @ to null )
|
( set IN> to IN( and set IN> @ to null )
|
||||||
|
5
blk/430
5
blk/430
@ -1,10 +1,9 @@
|
|||||||
( Initializes the readln subsystem )
|
( Initializes the readln subsystem )
|
||||||
: RDLN$
|
: RDLN$
|
||||||
( 57 == rdln's memory )
|
H@ 0x32 ( IN(* ) RAM+ !
|
||||||
H@ 0x57 RAM+ !
|
|
||||||
( plus 2 for extra bytes after buffer: 1 for
|
( plus 2 for extra bytes after buffer: 1 for
|
||||||
the last typed 0x0a and one for the following NULL. )
|
the last typed 0x0a and one for the following NULL. )
|
||||||
IN) IN> - 2+ ALLOT
|
IN) IN( - ALLOT
|
||||||
(infl)
|
(infl)
|
||||||
['] RDLN< 0x0c RAM+ !
|
['] RDLN< 0x0c RAM+ !
|
||||||
1 0x06 RAM+ ! ( 06 == C<? )
|
1 0x06 RAM+ ! ( 06 == C<? )
|
||||||
|
2
blk/583
2
blk/583
@ -1,4 +1,4 @@
|
|||||||
CREATE ~ACIA
|
(entry) ~ACIA ( Set RST 38 jump ) PC ORG @ 0x39 + !
|
||||||
AF PUSHqq,
|
AF PUSHqq,
|
||||||
HL PUSHqq,
|
HL PUSHqq,
|
||||||
DE PUSHqq,
|
DE PUSHqq,
|
||||||
|
3
blk/588
3
blk/588
@ -9,8 +9,5 @@
|
|||||||
CR4:2 (101) - 8 bits + 1 stop bit
|
CR4:2 (101) - 8 bits + 1 stop bit
|
||||||
CR1:0 (10) - Counter divide: 64 )
|
CR1:0 (10) - Counter divide: 64 )
|
||||||
0b10010110 [ ACIA_CTL LITN ] PC!
|
0b10010110 [ ACIA_CTL LITN ] PC!
|
||||||
( setup interrupt )
|
|
||||||
0xc3 0x4e RAM+ C! ( c3==JP, 4e==INTJUMP )
|
|
||||||
~ACIA 0x4f RAM+ !
|
|
||||||
(im1) ;
|
(im1) ;
|
||||||
|
|
||||||
|
2
blk/618
2
blk/618
@ -1,5 +1,5 @@
|
|||||||
0x8000 CONSTANT RAMSTART
|
0x8000 CONSTANT RAMSTART
|
||||||
0xf000 CONSTANT RS_ADDR 0xfffa CONSTANT PS_ADDR
|
0xff00 CONSTANT RS_ADDR 0xfffa CONSTANT PS_ADDR
|
||||||
0x80 CONSTANT ACIA_CTL 0x81 CONSTANT ACIA_IO
|
0x80 CONSTANT ACIA_CTL 0x81 CONSTANT ACIA_IO
|
||||||
4 CONSTANT SDC_SPI
|
4 CONSTANT SDC_SPI
|
||||||
5 CONSTANT SDC_CSLOW 6 CONSTANT SDC_CSHIGH
|
5 CONSTANT SDC_CSLOW 6 CONSTANT SDC_CSHIGH
|
||||||
|
@ -53,6 +53,7 @@ Machine* emul_init()
|
|||||||
memset(m.mem, 0, 0x10000);
|
memset(m.mem, 0, 0x10000);
|
||||||
m.ramstart = 0;
|
m.ramstart = 0;
|
||||||
m.minsp = 0xffff;
|
m.minsp = 0xffff;
|
||||||
|
m.maxix = 0;
|
||||||
for (int i=0; i<0x100; i++) {
|
for (int i=0; i<0x100; i++) {
|
||||||
m.iord[i] = NULL;
|
m.iord[i] = NULL;
|
||||||
m.iowr[i] = NULL;
|
m.iowr[i] = NULL;
|
||||||
@ -74,6 +75,9 @@ bool emul_step()
|
|||||||
if (newsp != 0 && newsp < m.minsp) {
|
if (newsp != 0 && newsp < m.minsp) {
|
||||||
m.minsp = newsp;
|
m.minsp = newsp;
|
||||||
}
|
}
|
||||||
|
if (m.cpu.R1.wr.IX > m.maxix) {
|
||||||
|
m.maxix = m.cpu.R1.wr.IX;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@ -116,4 +120,5 @@ void emul_memdump()
|
|||||||
void emul_printdebug()
|
void emul_printdebug()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Min SP: %04x\n", m.minsp);
|
fprintf(stderr, "Min SP: %04x\n", m.minsp);
|
||||||
|
fprintf(stderr, "Max IX: %04x\n", m.maxix);
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,8 @@ typedef struct {
|
|||||||
ushort ramstart;
|
ushort ramstart;
|
||||||
// The minimum value reached by SP at any point during execution.
|
// The minimum value reached by SP at any point during execution.
|
||||||
ushort minsp;
|
ushort minsp;
|
||||||
|
// same principle for IX
|
||||||
|
ushort maxix;
|
||||||
// Array of 0x100 function pointers to IO read and write routines. Leave to
|
// Array of 0x100 function pointers to IO read and write routines. Leave to
|
||||||
// NULL when IO port is unhandled.
|
// NULL when IO port is unhandled.
|
||||||
IORD iord[0x100];
|
IORD iord[0x100];
|
||||||
|
BIN
emul/forth.bin
BIN
emul/forth.bin
Binary file not shown.
12
emul/stage.c
12
emul/stage.c
@ -20,11 +20,6 @@ trouble of compiling defs to binary.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// When DEBUG is set, stage1 is a core-less forth that works interactively.
|
|
||||||
// Useful for... debugging!
|
|
||||||
// By the way: there's a double-echo in stagedbg. It's normal. Don't panic.
|
|
||||||
|
|
||||||
//#define DEBUG
|
|
||||||
#define RAMSTART 0
|
#define RAMSTART 0
|
||||||
#define STDIO_PORT 0x00
|
#define STDIO_PORT 0x00
|
||||||
// To know which part of RAM to dump, we listen to port 2, which at the end of
|
// To know which part of RAM to dump, we listen to port 2, which at the end of
|
||||||
@ -56,10 +51,6 @@ static uint8_t iord_stdio()
|
|||||||
static void iowr_stdio(uint8_t val)
|
static void iowr_stdio(uint8_t val)
|
||||||
{
|
{
|
||||||
// we don't output stdout in stage0
|
// we don't output stdout in stage0
|
||||||
#ifdef DEBUG
|
|
||||||
// ... unless we're in DEBUG mode!
|
|
||||||
putchar(val);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iowr_here(uint8_t val)
|
static void iowr_here(uint8_t val)
|
||||||
@ -101,12 +92,11 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
while (running && emul_step());
|
while (running && emul_step());
|
||||||
|
|
||||||
#ifndef DEBUG
|
|
||||||
// We're done, now let's spit dict data
|
// We're done, now let's spit dict data
|
||||||
for (int i=start_here; i<end_here; i++) {
|
for (int i=start_here; i<end_here; i++) {
|
||||||
putchar(m->mem[i]);
|
putchar(m->mem[i]);
|
||||||
}
|
}
|
||||||
#endif
|
emul_printdebug();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
0xe800 CONSTANT RAMSTART
|
0xe800 CONSTANT RAMSTART
|
||||||
0xf000 CONSTANT RS_ADDR
|
0xff00 CONSTANT RS_ADDR
|
||||||
0xfffa CONSTANT PS_ADDR
|
0xfffa CONSTANT PS_ADDR
|
||||||
212 LOAD ( z80 assembler )
|
212 LOAD ( z80 assembler )
|
||||||
262 LOAD ( xcomp )
|
262 LOAD ( xcomp )
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
0x8000 CONSTANT RAMSTART
|
0x8000 CONSTANT RAMSTART
|
||||||
0xb000 CONSTANT RS_ADDR
|
0xbf00 CONSTANT RS_ADDR
|
||||||
0xbffa CONSTANT PS_ADDR
|
0xbffa CONSTANT PS_ADDR
|
||||||
RAMSTART 0x70 + CONSTANT LCD_MEM
|
RAMSTART 0x70 + CONSTANT LCD_MEM
|
||||||
RAMSTART 0x72 + CONSTANT KBD_MEM
|
RAMSTART 0x72 + CONSTANT KBD_MEM
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
0xf000 CONSTANT RS_ADDR
|
0xff00 CONSTANT RS_ADDR
|
||||||
0xfffa CONSTANT PS_ADDR
|
0xfffa CONSTANT PS_ADDR
|
||||||
RS_ADDR 0x80 - CONSTANT RAMSTART
|
RS_ADDR 0x80 - CONSTANT RAMSTART
|
||||||
212 LOAD ( z80 assembler )
|
212 LOAD ( z80 assembler )
|
||||||
|
10
runtests.sh
10
runtests.sh
@ -1,4 +1,4 @@
|
|||||||
#/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
git submodule init
|
git submodule init
|
||||||
git submodule update
|
git submodule update
|
||||||
@ -7,6 +7,8 @@ git clean -fxd
|
|||||||
make -C emul
|
make -C emul
|
||||||
make -C tests
|
make -C tests
|
||||||
|
|
||||||
# let's try again with an updated boot bin
|
# verify that forth.bin is stable
|
||||||
make -C emul updatebootstrap all
|
cp emul/forth.bin ref.bin
|
||||||
make -C tests
|
make -C emul updatebootstrap
|
||||||
|
cmp emul/forth.bin ref.bin
|
||||||
|
rm ref.bin
|
||||||
|
Loading…
Reference in New Issue
Block a user