mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-26 19:38:06 +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
|
||||
+02 CURRENT +57 readln's variables
|
||||
+04 HERE +59 blk's variables
|
||||
+06 C<? +5b z80a's variables
|
||||
+08 C<* override +5d adev's variables
|
||||
+0a NLPTR +5f FUTURE USES
|
||||
+0c C<* +70 DRIVERS
|
||||
+0e WORDBUF +80 RAMEND
|
||||
+2e BOOT C< PTR
|
||||
+30 FUTURE USES
|
||||
+4e INTJUMP
|
||||
+51 CURRENTPTR
|
||||
+53 (emit) override
|
||||
|
||||
|
||||
|
||||
RAMSTART FUTURE USES +3c BLK(*
|
||||
+02 CURRENT +3e FUTURE USES
|
||||
+04 HERE
|
||||
+06 C<? +51 CURRENTPTR
|
||||
+08 C<* override +53 (emit) override
|
||||
+0a NLPTR +55 (key) override
|
||||
+0c C<* +57 FUTURE USES
|
||||
+0e WORDBUF
|
||||
+2e BOOT C< PTR +5d adev's variables
|
||||
+30 IN> +5f FUTURE USES
|
||||
+32 IN(* +70 DRIVERS
|
||||
+34 BLK@* +80 RAMEND
|
||||
+36 BLK!*
|
||||
+38 BLK>
|
||||
+3a BLKDTY
|
||||
(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
|
||||
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.)
|
||||
|
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
|
||||
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.)
|
||||
|
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,
|
||||
CRLF).
|
||||
|
||||
BLK* see B416.
|
||||
|
||||
FUTURE USES section is unused for now.
|
||||
|
||||
DRIVERS section is reserved for recipe-specific
|
||||
drivers. Here is a list of known usages:
|
||||
|
||||
* 0x70-0x78: ACIA buffer pointers in RC2014 recipes.
|
||||
DRIVERS section is reserved for recipe-specific drivers.
|
||||
|
||||
|
9
blk/213
9
blk/213
@ -1,9 +1,6 @@
|
||||
: Z80AMEM+ 0x5b RAM+ @ + ;
|
||||
: ORG 0 Z80AMEM+ ;
|
||||
: BIN( 2 Z80AMEM+ ;
|
||||
: L1 4 Z80AMEM+ ; : L2 6 Z80AMEM+ ;
|
||||
: L3 8 Z80AMEM+ ; : L4 10 Z80AMEM+ ;
|
||||
: Z80A$ H@ 0x5b RAM+ ! 12 ALLOT 0 BIN( ! ;
|
||||
VARIABLE ORG
|
||||
VARIABLE BIN( 0 BIN( !
|
||||
VARIABLE L1 VARIABLE L2 VARIABLE L3 VARIABLE L4
|
||||
: A 7 ; : B 0 ; : C 1 ; : D 2 ;
|
||||
: E 3 ; : H 4 ; : L 5 ; : (HL) 6 ;
|
||||
: 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 )
|
||||
NOP, NOP, ( 20, numberWord ) NOP, NOP, ( 22, litWord )
|
||||
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 )
|
||||
RAMSTART 0x4e + JPnn, ( RST 30 )
|
||||
0 JPnn, ( RST 30 )
|
||||
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( )
|
||||
: BLK@* 0 BLKMEM+ ;
|
||||
: BLK@* 0x34 RAM+ ;
|
||||
( n -- Write back BLK( to storage at block n )
|
||||
: BLK!* 2 BLKMEM+ ;
|
||||
: BLK!* 0x36 RAM+ ;
|
||||
( Current blk pointer in ( )
|
||||
: BLK> 4 BLKMEM+ ;
|
||||
: BLK> 0x38 RAM+ ;
|
||||
( Whether buffer is dirty )
|
||||
: BLKDTY 6 BLKMEM+ ;
|
||||
: BLK( 8 BLKMEM+ ;
|
||||
: BLKDTY 0x3a RAM+ ;
|
||||
: BLK( 0x3c RAM+ @ ;
|
||||
: BLK) BLK( 1024 + ;
|
||||
|
||||
|
||||
|
5
blk/417
5
blk/417
@ -1,7 +1,6 @@
|
||||
: BLK$
|
||||
H@ 0x59 RAM+ !
|
||||
( 1024 for the block, 8 for variables )
|
||||
1032 ALLOT
|
||||
H@ 0x3c ( BLK(* ) RAM+ !
|
||||
1024 ALLOT
|
||||
( LOAD detects end of block with ASCII EOT. This is why
|
||||
we write it there. EOT == 0x04 )
|
||||
4 C,
|
||||
|
7
blk/426
7
blk/426
@ -1,10 +1,9 @@
|
||||
: RDLNMEM+ 0x57 RAM+ @ + ;
|
||||
( current position in INBUF )
|
||||
: IN> 0 RDLNMEM+ ;
|
||||
: IN> 0x30 RAM+ ;
|
||||
( points to INBUF )
|
||||
: IN( 2 RDLNMEM+ ;
|
||||
: IN( 0x32 RAM+ @ ;
|
||||
( points to INBUF's end )
|
||||
: IN) 0x40 ( buffer size ) 2+ RDLNMEM+ ;
|
||||
: IN) 0x40 ( buffer size ) IN( + ;
|
||||
|
||||
( flush input buffer )
|
||||
( set IN> to IN( and set IN> @ to null )
|
||||
|
5
blk/430
5
blk/430
@ -1,10 +1,9 @@
|
||||
( Initializes the readln subsystem )
|
||||
: RDLN$
|
||||
( 57 == rdln's memory )
|
||||
H@ 0x57 RAM+ !
|
||||
H@ 0x32 ( IN(* ) RAM+ !
|
||||
( plus 2 for extra bytes after buffer: 1 for
|
||||
the last typed 0x0a and one for the following NULL. )
|
||||
IN) IN> - 2+ ALLOT
|
||||
IN) IN( - ALLOT
|
||||
(infl)
|
||||
['] RDLN< 0x0c RAM+ !
|
||||
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,
|
||||
HL PUSHqq,
|
||||
DE PUSHqq,
|
||||
|
3
blk/588
3
blk/588
@ -9,8 +9,5 @@
|
||||
CR4:2 (101) - 8 bits + 1 stop bit
|
||||
CR1:0 (10) - Counter divide: 64 )
|
||||
0b10010110 [ ACIA_CTL LITN ] PC!
|
||||
( setup interrupt )
|
||||
0xc3 0x4e RAM+ C! ( c3==JP, 4e==INTJUMP )
|
||||
~ACIA 0x4f RAM+ !
|
||||
(im1) ;
|
||||
|
||||
|
2
blk/618
2
blk/618
@ -1,5 +1,5 @@
|
||||
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
|
||||
4 CONSTANT SDC_SPI
|
||||
5 CONSTANT SDC_CSLOW 6 CONSTANT SDC_CSHIGH
|
||||
|
@ -53,6 +53,7 @@ Machine* emul_init()
|
||||
memset(m.mem, 0, 0x10000);
|
||||
m.ramstart = 0;
|
||||
m.minsp = 0xffff;
|
||||
m.maxix = 0;
|
||||
for (int i=0; i<0x100; i++) {
|
||||
m.iord[i] = NULL;
|
||||
m.iowr[i] = NULL;
|
||||
@ -74,6 +75,9 @@ bool emul_step()
|
||||
if (newsp != 0 && newsp < m.minsp) {
|
||||
m.minsp = newsp;
|
||||
}
|
||||
if (m.cpu.R1.wr.IX > m.maxix) {
|
||||
m.maxix = m.cpu.R1.wr.IX;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@ -116,4 +120,5 @@ void emul_memdump()
|
||||
void emul_printdebug()
|
||||
{
|
||||
fprintf(stderr, "Min SP: %04x\n", m.minsp);
|
||||
fprintf(stderr, "Max IX: %04x\n", m.maxix);
|
||||
}
|
||||
|
@ -14,6 +14,8 @@ typedef struct {
|
||||
ushort ramstart;
|
||||
// The minimum value reached by SP at any point during execution.
|
||||
ushort minsp;
|
||||
// same principle for IX
|
||||
ushort maxix;
|
||||
// Array of 0x100 function pointers to IO read and write routines. Leave to
|
||||
// NULL when IO port is unhandled.
|
||||
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 STDIO_PORT 0x00
|
||||
// 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)
|
||||
{
|
||||
// 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)
|
||||
@ -101,12 +92,11 @@ int main(int argc, char *argv[])
|
||||
|
||||
while (running && emul_step());
|
||||
|
||||
#ifndef DEBUG
|
||||
// We're done, now let's spit dict data
|
||||
for (int i=start_here; i<end_here; i++) {
|
||||
putchar(m->mem[i]);
|
||||
}
|
||||
#endif
|
||||
emul_printdebug();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
0xe800 CONSTANT RAMSTART
|
||||
0xf000 CONSTANT RS_ADDR
|
||||
0xff00 CONSTANT RS_ADDR
|
||||
0xfffa CONSTANT PS_ADDR
|
||||
212 LOAD ( z80 assembler )
|
||||
262 LOAD ( xcomp )
|
||||
|
@ -1,5 +1,5 @@
|
||||
0x8000 CONSTANT RAMSTART
|
||||
0xb000 CONSTANT RS_ADDR
|
||||
0xbf00 CONSTANT RS_ADDR
|
||||
0xbffa CONSTANT PS_ADDR
|
||||
RAMSTART 0x70 + CONSTANT LCD_MEM
|
||||
RAMSTART 0x72 + CONSTANT KBD_MEM
|
||||
|
@ -1,4 +1,4 @@
|
||||
0xf000 CONSTANT RS_ADDR
|
||||
0xff00 CONSTANT RS_ADDR
|
||||
0xfffa CONSTANT PS_ADDR
|
||||
RS_ADDR 0x80 - CONSTANT RAMSTART
|
||||
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 update
|
||||
@ -7,6 +7,8 @@ git clean -fxd
|
||||
make -C emul
|
||||
make -C tests
|
||||
|
||||
# let's try again with an updated boot bin
|
||||
make -C emul updatebootstrap all
|
||||
make -C tests
|
||||
# verify that forth.bin is stable
|
||||
cp emul/forth.bin ref.bin
|
||||
make -C emul updatebootstrap
|
||||
cmp emul/forth.bin ref.bin
|
||||
rm ref.bin
|
||||
|
Loading…
Reference in New Issue
Block a user