mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-26 17:28:05 +11:00
Compare commits
No commits in common. "05c38424c7639cd245699804c9de57cf2dd1c761" and "79527976abaefc8daee6f3715ea0d0bbe694b599" have entirely different histories.
05c38424c7
...
79527976ab
10
drv/acia.fs
10
drv/acia.fs
@ -36,15 +36,11 @@ ACIA_MEM: Address in memory that can be used variables shared
|
|||||||
;
|
;
|
||||||
|
|
||||||
: KEY
|
: KEY
|
||||||
( inc then fetch )
|
|
||||||
ACIAR> @ 1 + DUP ACIA) @ = IF
|
|
||||||
DROP ACIA( @
|
|
||||||
THEN
|
|
||||||
|
|
||||||
( As long as R> == W>-1, it means that buffer is empty )
|
( As long as R> == W>-1, it means that buffer is empty )
|
||||||
BEGIN DUP ACIAW> @ = NOT UNTIL
|
BEGIN ACIAR> @ 1 + ACIAW> @ = NOT UNTIL
|
||||||
|
|
||||||
ACIAR> !
|
( inc then fetch )
|
||||||
|
1 ACIAR> +!
|
||||||
ACIAR> @ C@
|
ACIAR> @ C@
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -39,11 +39,11 @@ ACIA_IO
|
|||||||
( advance W> )
|
( advance W> )
|
||||||
HL INCss,
|
HL INCss,
|
||||||
ACIAW> LD(nn)HL,
|
ACIAW> LD(nn)HL,
|
||||||
DE ACIA) LDdd(nn),
|
DE ACIA) @ LDdd(nn),
|
||||||
DE SUBHLss,
|
DE SUBHLss,
|
||||||
JRNZ, L4 FWR ( skip )
|
JRNZ, L4 FWR ( skip )
|
||||||
( end of buffer reached )
|
( end of buffer reached )
|
||||||
ACIA( LDHL(nn),
|
ACIA( @ LDHL(nn),
|
||||||
ACIAW> LD(nn)HL,
|
ACIAW> LD(nn)HL,
|
||||||
L4 FSET ( skip )
|
L4 FSET ( skip )
|
||||||
L3 FSET L2 FSET ( end )
|
L3 FSET L2 FSET ( end )
|
||||||
|
@ -236,46 +236,7 @@ But how do we know that it really works? Because we can write in ROM!
|
|||||||
:30 205b 2049 4e54 4552 [ INTER
|
:30 205b 2049 4e54 4552 [ INTER
|
||||||
:38 5052 4554 2031 2046 PRET 1 F
|
:38 5052 4554 2031 2046 PRET 1 F
|
||||||
|
|
||||||
We're now ready for a re-bootstrap. Here's what we're gonna do:
|
TODO: continue
|
||||||
|
|
||||||
1. Bring `CURRENT` and `HERE` back to `0x98f`.
|
|
||||||
2. Set `CINPTR` to `icore`'s `(c<)`.
|
|
||||||
|
|
||||||
`(c<)` word is the main input of the interpreter. Right now, your `(c<)` comes
|
|
||||||
from the `readln` unit, which makes the main `INTERPRET` loop wait for your
|
|
||||||
keystrokes before interpreting your words.
|
|
||||||
|
|
||||||
But this can be changed. At the moment where we change `CINPTR`, the interpret
|
|
||||||
loop will start reading from it, so we'll lose control. That is why we must
|
|
||||||
prepare things carefully before that. We'll re-gain control at the end of the
|
|
||||||
bootstrap source, in `run.fs`, where `(c<)` is set to `readln`'s `(c<)`
|
|
||||||
|
|
||||||
`(c<)` word is the main input of the interpreter. Right now, your `(c<)` comes
|
|
||||||
from the `readln` unit, which makes the main `INTERPRET` loop wait for your
|
|
||||||
keystrokes before interpreting your words.
|
|
||||||
|
|
||||||
But this can be changed. At the moment where we change `CINPTR`, the interpret
|
|
||||||
loop will start reading from it, so we'll lose control. That is why we must
|
|
||||||
prepare things carefully before that. We'll re-gain control at the end of the
|
|
||||||
bootstrap source, in `run.fs`, where `(c<)` is set to `readln`'s `(c<)`.
|
|
||||||
|
|
||||||
At this moment, `icore`'s `(c<)` is shadowed by `readln`, but at the moment
|
|
||||||
`CURRENT` changes, it will be accessible again. However, this all has to change
|
|
||||||
in one shot, so we need to prepare a compiled word for it if we don't want to
|
|
||||||
lose access to our interpret loop in the middle of our operation.
|
|
||||||
|
|
||||||
> : KAWABUNGA!
|
|
||||||
( 60 == (c<) pointer )
|
|
||||||
0x9a0 0x60 RAM+ !
|
|
||||||
0x98f CURRENT !
|
|
||||||
0x98f HERE !
|
|
||||||
( 0c == CINPTR )
|
|
||||||
(find) (c<) DROP 0x0c RAM+ !
|
|
||||||
;
|
|
||||||
|
|
||||||
Ready? Set? KAWABUNGA!
|
|
||||||
|
|
||||||
TODO: make this work...
|
|
||||||
|
|
||||||
[rc2014]: https://rc2014.co.uk
|
[rc2014]: https://rc2014.co.uk
|
||||||
[romwrite]: https://github.com/hsoft/romwrite
|
[romwrite]: https://github.com/hsoft/romwrite
|
||||||
|
Loading…
Reference in New Issue
Block a user