Compare commits

...

3 Commits

Author SHA1 Message Date
Virgil Dupras
b2b556911f trs80: implement AT-XY
Also, I've run VE on the TRS-80 for the first time! It doesn't work
well though. Screen is mostly blank all the time.

I removed instructions from the recipe which became obsolete when
Collapse OS became 100% bootstrapped. Also, I've updated instructions
to change the NL override which is necessary for blkup to work.
2020-06-07 11:14:57 -04:00
Virgil Dupras
ab76d8d648 VE: add 'D' 2020-06-07 09:30:31 -04:00
Virgil Dupras
15acf30ca3 VE: add 'o' and 'O' 2020-06-07 07:25:02 -04:00
14 changed files with 112 additions and 136 deletions

View File

@ -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 ;

View File

@ -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
View File

@ -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
View File

@ -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.

View File

@ -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+

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View 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
View File

@ -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

View File

@ -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,

View File

@ -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