Compare commits
3 Commits
c6016cd429
...
b2b556911f
Author | SHA1 | Date | |
---|---|---|---|
|
b2b556911f | ||
|
ab76d8d648 | ||
|
15acf30ca3 |
8
blk/105
8
blk/105
@ -6,7 +6,9 @@
|
|||||||
( user-facing lines are 1-based )
|
( user-facing lines are 1-based )
|
||||||
: T 1- DUP 64 * EDPOS ! _pln ;
|
: T 1- DUP 64 * EDPOS ! _pln ;
|
||||||
: P IBUF _type IBUF EDPOS @ _cpos 64 MOVE BLK!! ;
|
: P IBUF _type IBUF EDPOS @ _cpos 64 MOVE BLK!! ;
|
||||||
: _mvln+ ( ln -- move ln 1 line further )
|
: _mvln+ ( ln -- move ln 1 line down )
|
||||||
DUP 14 > IF DROP EXIT THEN
|
DUP 14 > IF DROP EXIT THEN
|
||||||
_lpos DUP 64 + 64 MOVE
|
_lpos DUP 64 + 64 MOVE ;
|
||||||
;
|
: _mvln- ( ln -- move ln 1 line up )
|
||||||
|
DUP 14 > IF DROP 15 _lpos _zbuf
|
||||||
|
ELSE 1+ _lpos DUP 64 - 64 MOVE THEN ;
|
||||||
|
6
blk/106
6
blk/106
@ -1,5 +1,5 @@
|
|||||||
: U
|
: _U ( U without P, used in VE )
|
||||||
15 EDPOS @ 64 / - 0 DO
|
15 EDPOS @ 64 / - 0 DO
|
||||||
14 I - _mvln+
|
14 I - _mvln+
|
||||||
LOOP P
|
LOOP ;
|
||||||
;
|
: U _U P ;
|
||||||
|
14
blk/122
14
blk/122
@ -6,11 +6,11 @@
|
|||||||
'I', 'F' and 'E' invoke the corresponding command from the
|
'I', 'F' and 'E' invoke the corresponding command from the
|
||||||
Block Editor (B100). Refer to documentation there.
|
Block Editor (B100). Refer to documentation there.
|
||||||
|
|
||||||
'f' puts the contents of your previous cursor movement into the
|
'o' inserts a blank line after the cursor. 'O', before.
|
||||||
find buffer. If that movement was a forward movement, it brings
|
|
||||||
the cursor back where it was. This allows for an efficient
|
|
||||||
combination of movements and 'E'. For example, if you want to
|
|
||||||
delete the next word, you type 'w', then 'f', then check your
|
|
||||||
"F" buffer to be sure, then press 'E'.
|
|
||||||
|
|
||||||
'X' deletes "modifier" characters following cursor. (cont.)
|
'D' deletes "modifier" lines at the cursor.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(cont.)
|
||||||
|
10
blk/123
10
blk/123
@ -1,4 +1,12 @@
|
|||||||
|
'f' puts the contents of your previous cursor movement into the
|
||||||
|
find buffer. If that movement was a forward movement, it brings
|
||||||
|
the cursor back where it was. This allows for an efficient
|
||||||
|
combination of movements and 'E'. For example, if you want to
|
||||||
|
delete the next word, you type 'w', then 'f', then check your
|
||||||
|
"F" buffer to be sure, then press 'E'.
|
||||||
|
|
||||||
|
'X' deletes "modifier" characters following cursor.
|
||||||
|
|
||||||
'R' goes into replace mode at current cursor position.
|
'R' goes into replace mode at current cursor position.
|
||||||
Following keystrokes replace current character and advance
|
Following keystrokes replace current character and advance
|
||||||
cursor. Press return to return to normal mode.
|
cursor. Press return to return to normal mode.
|
||||||
|
|
||||||
|
2
blk/125
2
blk/125
@ -1,3 +1,3 @@
|
|||||||
'? UPPER NOT [IF] 33 LOAD+ [THEN] DROP ( B158 )
|
'? UPPER NOT [IF] 33 LOAD+ [THEN] DROP ( B158 )
|
||||||
-23 LOAD+ ( B102, block editor )
|
-23 LOAD+ ( B102, block editor )
|
||||||
1 5 LOADR+
|
1 6 LOADR+
|
||||||
|
2
blk/126
2
blk/126
@ -11,5 +11,3 @@ VARIABLE PREVPOS
|
|||||||
: contents 3 aty BLK> @ LIST ;
|
: contents 3 aty BLK> @ LIST ;
|
||||||
: selblk BLK@ contents ;
|
: selblk BLK@ contents ;
|
||||||
: mode! ( c -- ) 63 0 AT-XY ;
|
: mode! ( c -- ) 63 0 AT-XY ;
|
||||||
: pos! EDPOS @ PREVPOS !
|
|
||||||
1023 MIN DUP 0< IF DROP 0 THEN EDPOS ! ;
|
|
||||||
|
15
blk/127
15
blk/127
@ -1,14 +1,5 @@
|
|||||||
: setpos EDPOS @ 64 /MOD
|
: pos! ( newpos -- ) EDPOS @ PREVPOS !
|
||||||
|
DUP 0< IF DROP 0 THEN 1023 MIN EDPOS ! ;
|
||||||
|
: setpos ( -- ) EDPOS @ 64 /MOD
|
||||||
3 + ( header ) SWAP 3 + ( gutter ) SWAP AT-XY ;
|
3 + ( header ) SWAP 3 + ( gutter ) SWAP AT-XY ;
|
||||||
: cmv ( n -- , char movement ) acc@ * EDPOS @ + pos! ;
|
: cmv ( n -- , char movement ) acc@ * EDPOS @ + pos! ;
|
||||||
: $; 0acc ;
|
|
||||||
: $g ACC @ selblk 0acc ;
|
|
||||||
: $[ BLK> @ acc@ - selblk ;
|
|
||||||
: $] BLK> @ acc@ + selblk ;
|
|
||||||
: $I mode! 'I' EMIT 3 1 AT-XY _I contents mode! SPC ;
|
|
||||||
: $F mode! 'F' EMIT 3 2 AT-XY _F setpos mode! SPC ;
|
|
||||||
: $E E contents ;
|
|
||||||
: $X acc@ X contents ;
|
|
||||||
: $h -1 cmv ; : $l 1 cmv ; : $k -64 cmv ; : $j 64 cmv ;
|
|
||||||
: $H 0acc EDPOS @ 0x3c0 AND pos! ;
|
|
||||||
: $L 0acc EDPOS @ 0x3f OR pos! ;
|
|
||||||
|
24
blk/128
24
blk/128
@ -1,12 +1,12 @@
|
|||||||
: $w EDPOS @ BLK( + acc@ 0 DO
|
: $; 0acc ;
|
||||||
BEGIN C@+ WS? UNTIL BEGIN C@+ WS? NOT UNTIL LOOP
|
: $g ACC @ selblk 0acc ;
|
||||||
1- BLK( - pos! ;
|
: $[ BLK> @ acc@ - selblk ;
|
||||||
: $W EDPOS @ BLK( + acc@ 0 DO
|
: $] BLK> @ acc@ + selblk ;
|
||||||
1+ BEGIN C@+ WS? NOT UNTIL BEGIN C@+ WS? UNTIL LOOP
|
: $I mode! 'I' EMIT 3 1 AT-XY _I contents mode! SPC ;
|
||||||
2- BLK( - pos! ;
|
: $F mode! 'F' EMIT 3 2 AT-XY _F setpos mode! SPC ;
|
||||||
: $b EDPOS @ BLK( + acc@ 0 DO
|
: $E E contents ;
|
||||||
1- BEGIN C@- WS? NOT UNTIL BEGIN C@- WS? UNTIL LOOP
|
: $X acc@ X contents ;
|
||||||
2+ BLK( - pos! ;
|
: $h -1 cmv ; : $l 1 cmv ; : $k -64 cmv ; : $j 64 cmv ;
|
||||||
: $B EDPOS @ BLK( + acc@ 0 DO
|
: $H 0acc EDPOS @ 0x3c0 AND pos! ;
|
||||||
BEGIN C@- WS? UNTIL BEGIN C@- WS? NOT UNTIL LOOP
|
: $L 0acc EDPOS @ 0x3f OR pos! ;
|
||||||
1+ BLK( - pos! ;
|
|
||||||
|
25
blk/129
25
blk/129
@ -1,13 +1,12 @@
|
|||||||
: $f EDPOS @ PREVPOS @ 2DUP = IF 2DROP EXIT THEN
|
: $w EDPOS @ BLK( + acc@ 0 DO
|
||||||
2DUP > IF DUP pos! SWAP THEN
|
BEGIN C@+ WS? UNTIL BEGIN C@+ WS? NOT UNTIL LOOP
|
||||||
( p1 p2, p1 < p2 ) OVER - 64 MIN ( pos len ) FBUF _zbuf
|
1- BLK( - pos! ;
|
||||||
SWAP _cpos FBUF ( len src dst ) ROT MOVE ;
|
: $W EDPOS @ BLK( + acc@ 0 DO
|
||||||
: $R ( replace mode )
|
1+ BEGIN C@+ WS? NOT UNTIL BEGIN C@+ WS? UNTIL LOOP
|
||||||
mode! 'R' EMIT
|
2- BLK( - pos! ;
|
||||||
BEGIN setpos C< DUP 0xd = NOT IF
|
: $b EDPOS @ BLK( + acc@ 0 DO
|
||||||
EDPOS @ _cpos C! 1 EDPOS +! BLK!! 0
|
1- BEGIN C@- WS? NOT UNTIL BEGIN C@- WS? UNTIL LOOP
|
||||||
THEN UNTIL mode! SPC contents ;
|
2+ BLK( - pos! ;
|
||||||
: handle ( c -- f )
|
: $B EDPOS @ BLK( + acc@ 0 DO
|
||||||
DUP '0' '9' =><= IF num 0 EXIT THEN
|
BEGIN C@- WS? UNTIL BEGIN C@- WS? NOT UNTIL LOOP
|
||||||
DUP CMD 2+ C! CMD FIND IF EXECUTE ELSE DROP THEN
|
1+ BLK( - pos! ;
|
||||||
UPPER 'Q' = ;
|
|
||||||
|
27
blk/130
27
blk/130
@ -1,13 +1,14 @@
|
|||||||
: bufp ( buf -- )
|
: $f EDPOS @ PREVPOS @ 2DUP = IF 2DROP EXIT THEN
|
||||||
DUP 64 + SWAP DO
|
2DUP > IF DUP pos! SWAP THEN
|
||||||
i C@ DUP 0x20 < IF DROP 0x20 THEN EMIT
|
( p1 p2, p1 < p2 ) OVER - 64 MIN ( pos len ) FBUF _zbuf
|
||||||
LOOP ;
|
SWAP _cpos FBUF ( len src dst ) ROT MOVE ;
|
||||||
: bufs
|
: $R ( replace mode )
|
||||||
1 aty ." I: " IBUF bufp
|
mode! 'R' EMIT
|
||||||
2 aty ." F: " FBUF bufp ;
|
BEGIN setpos C< DUP 0xd = NOT IF
|
||||||
: c<over KEY DUP EMIT DUP 0x0a = IF DROP 0x0d THEN ;
|
EDPOS @ _cpos C! 1 EDPOS +! BLK!! 0
|
||||||
: VE ['] c<over 0x08 ( C< override ) RAM+ !
|
THEN UNTIL mode! SPC contents ;
|
||||||
clrscr 0acc 0 EDPOS ! 0 PREVPOS ! contents
|
: $O EDPOS @ 0x3c0 ( 15 * 64 ) >= IF EXIT THEN
|
||||||
BEGIN status bufs setpos KEY handle UNTIL
|
_U EDPOS @ 0x3c0 AND DUP pos! _cpos _zbuf BLK!! contents ;
|
||||||
0 0x08 RAM+ ! 19 aty ;
|
: $o EDPOS @ 64 < IF EXIT THEN EDPOS @ 64 + EDPOS ! $O ;
|
||||||
|
: $D acc@ 0 DO 16 EDPOS @ 64 / DO i _mvln- LOOP LOOP
|
||||||
|
BLK!! contents ;
|
||||||
|
16
blk/131
Normal file
16
blk/131
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
: handle ( c -- f )
|
||||||
|
DUP '0' '9' =><= IF num 0 EXIT THEN
|
||||||
|
DUP CMD 2+ C! CMD FIND IF EXECUTE ELSE DROP THEN
|
||||||
|
UPPER 'Q' = ;
|
||||||
|
: bufp ( buf -- )
|
||||||
|
DUP 64 + SWAP DO
|
||||||
|
i C@ DUP 0x20 < IF DROP 0x20 THEN EMIT
|
||||||
|
LOOP ;
|
||||||
|
: bufs
|
||||||
|
1 aty ." I: " IBUF bufp
|
||||||
|
2 aty ." F: " FBUF bufp ;
|
||||||
|
: c<over KEY DUP EMIT DUP 0x0a = IF DROP 0x0d THEN ;
|
||||||
|
: VE ['] c<over 0x08 ( C< override ) RAM+ !
|
||||||
|
clrscr 0acc 0 EDPOS ! 0 PREVPOS ! contents
|
||||||
|
BEGIN status bufs setpos KEY handle UNTIL
|
||||||
|
0 0x08 RAM+ ! 19 aty ;
|
14
blk/493
14
blk/493
@ -1,16 +1,16 @@
|
|||||||
CODE (key)
|
CODE (key)
|
||||||
A 0x01 LDrn, ( @KEY )
|
A 0x01 LDrn, ( @KEY )
|
||||||
0x28 RSTn,
|
0x28 RSTn,
|
||||||
L A LDrr, H 0 LDrn,
|
PUSHA,
|
||||||
HL PUSHqq,
|
|
||||||
;CODE
|
;CODE
|
||||||
CODE (emit)
|
CODE (emit)
|
||||||
BC POPqq, ( c == @DSP arg )
|
BC POPqq, ( c == @DSP arg ) chkPS,
|
||||||
chkPS,
|
|
||||||
A 0x02 LDrn, ( @DSP )
|
A 0x02 LDrn, ( @DSP )
|
||||||
0x28 RSTn,
|
0x28 RSTn,
|
||||||
;CODE
|
;CODE
|
||||||
CODE BYE
|
CODE AT-XY
|
||||||
HL 0 LDddnn,
|
DE POPqq, H E LDrr, ( Y )
|
||||||
A 0x16 LDrn, ( @EXIT )
|
DE POPqq, L E LDrr, ( X ) chkPS,
|
||||||
|
A 0x0f LDrn, ( @VDCTL ) B 3 LDrn, ( setcur )
|
||||||
0x28 RSTn,
|
0x28 RSTn,
|
||||||
|
;CODE
|
||||||
|
5
blk/494
5
blk/494
@ -1,3 +1,8 @@
|
|||||||
|
: LINES 24 ; : COLS 80 ;
|
||||||
|
CODE BYE
|
||||||
|
HL 0 LDddnn,
|
||||||
|
A 0x16 LDrn, ( @EXIT )
|
||||||
|
0x28 RSTn,
|
||||||
CODE @DCSTAT ( drv -- f )
|
CODE @DCSTAT ( drv -- f )
|
||||||
BC POPqq,
|
BC POPqq,
|
||||||
chkPS,
|
chkPS,
|
||||||
|
@ -212,69 +212,12 @@ session on the other, type a few characters, and try `pingpong` again.
|
|||||||
|
|
||||||
## Saving to disk
|
## Saving to disk
|
||||||
|
|
||||||
If everything went well, you could run Collapse OS with `g3000<return>`. You
|
If everything went well, you could run Collapse OS with `g3000<return>`.
|
||||||
would get a usable Collapse OS prompt. But don't do that just yet. That
|
But instead of doing that, why not save it to disk?
|
||||||
executable bootstraps itself from code and it takes a while to do that every
|
|
||||||
time you launch it. You don't want that right? Let's save a compiled version of
|
|
||||||
it to disk.
|
|
||||||
|
|
||||||
Turn off the debugger (which can mess up some things) and save your sent
|
dump cos/cmd:1 (start=x'5000',end=x'7000',tra='5000')
|
||||||
content as-is by following the instructions you had for the `RECV` program.
|
|
||||||
This way, if you mess up a step below, you can quickly start over. Now you can
|
|
||||||
launch Collapse OS. Then, we need to:
|
|
||||||
|
|
||||||
* Reclaim wasted memory
|
And there we go! A Collapse OS launchable from floppy!
|
||||||
* Create hook entry
|
|
||||||
* Update LATEST
|
|
||||||
* Write down initialization code
|
|
||||||
* Write memory to floppy
|
|
||||||
|
|
||||||
### Reclaim wasted memory
|
|
||||||
|
|
||||||
During initialization, `RDLN$` allocated memory in `HERE` for its input buffer.
|
|
||||||
If you don't reclaim that space, that will be dead space in your binary.
|
|
||||||
|
|
||||||
You can reclaim that space with `FORGET _` which will rewind to before we
|
|
||||||
defined our initialization routine (see xcomp.fs).
|
|
||||||
|
|
||||||
However, that is not enough. If you only do that, there will be a conflict
|
|
||||||
between the rdln input buffer and your `HERE` space! So we need to go put that
|
|
||||||
input buffer somewhere else first. Therefore, your commands will be:
|
|
||||||
|
|
||||||
500 ALLOT RDLN$ FORGET _
|
|
||||||
|
|
||||||
### Create hook entry
|
|
||||||
|
|
||||||
That one is easy:
|
|
||||||
|
|
||||||
(entry) _
|
|
||||||
|
|
||||||
### Update LATEST
|
|
||||||
|
|
||||||
At this point, both `HERE` and `CURRENT` point to your future `LATEST`.
|
|
||||||
|
|
||||||
H@ 0x08 BIN+ !
|
|
||||||
|
|
||||||
Done.
|
|
||||||
|
|
||||||
### Write down initialization code
|
|
||||||
|
|
||||||
You'll do something similar to what we do in xcomp, except you'll have to add
|
|
||||||
"HERE rewinding" code because by default, `HERE` starts at RAMSTART+0x80. So:
|
|
||||||
|
|
||||||
," CURRENT @ HERE ! (ok) RDLN$ "
|
|
||||||
|
|
||||||
As soon as `RDLN$` is called, the `C<` pointer changes and gives control to
|
|
||||||
keyboard, giving us our full forth interpreter.
|
|
||||||
|
|
||||||
### Write memory to floppy
|
|
||||||
|
|
||||||
What you currently have in memory is gold. You want that on floppy. First, run
|
|
||||||
`H@ .X` to know your upper bound (and `0 BIN+ .X` to know your lower one, but
|
|
||||||
you're already supposed to know that one). Then, run `BYE` to return to TRSDOS
|
|
||||||
(the TRSDOS driver overrides `BYE` so that it calls the proper SVC instead of
|
|
||||||
just halting). Then, you can dump memory to floppy as you already did for
|
|
||||||
`RECV`.
|
|
||||||
|
|
||||||
## Sending blkfs to floppy
|
## Sending blkfs to floppy
|
||||||
|
|
||||||
@ -294,7 +237,12 @@ prompt:
|
|||||||
' *CL< 0x55 RAM+ !
|
' *CL< 0x55 RAM+ !
|
||||||
|
|
||||||
See B80 for details about those RAM offsets. Your serial link now has the
|
See B80 for details about those RAM offsets. Your serial link now has the
|
||||||
prompt. Now, you can use `/tools/blkup` to send a disk's contents. First,
|
prompt. You will also have to make your newlines CRLF. The TRS-80 wants CR
|
||||||
|
only, but serial communications (and `blkup`) expect CRLF:
|
||||||
|
|
||||||
|
' CRLF 0x0a RAM+ !
|
||||||
|
|
||||||
|
Now, you can use `/tools/blkup` to send a disk's contents. First,
|
||||||
extract the first 100 blocks from blkfs:
|
extract the first 100 blocks from blkfs:
|
||||||
|
|
||||||
dd if=emul/blkfs bs=1024 count=100 > d1
|
dd if=emul/blkfs bs=1024 count=100 > d1
|
||||||
@ -312,6 +260,14 @@ Making blkfs span multiple disk is a bit problematic with regards to absolute
|
|||||||
block references in the code. You'll need to work a bit to design your very
|
block references in the code. You'll need to work a bit to design your very
|
||||||
own Collapse OS floppy set. See Usage guide (B3) for details.
|
own Collapse OS floppy set. See Usage guide (B3) for details.
|
||||||
|
|
||||||
|
## Coming back to keyboard
|
||||||
|
|
||||||
|
Once you're done, you will want to go back to local control:
|
||||||
|
|
||||||
|
' CR 0x0a RAM+ !
|
||||||
|
0 0x55 RAM+ !
|
||||||
|
0 0x53 RAM+ !
|
||||||
|
|
||||||
## Self-hosting
|
## Self-hosting
|
||||||
|
|
||||||
As it is, your installment of Collapse OS is self-hosting using instructions
|
As it is, your installment of Collapse OS is self-hosting using instructions
|
||||||
|
Loading…
Reference in New Issue
Block a user