mirror of https://git.sr.ht/~rabbits/uxn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
1.9 KiB
82 lines
1.9 KiB
@load-rom ( filename* -- ) |
|
( |
|
Attempts to load the ROM from filename* and executes it. If the file exists |
|
and has non-zero length, this function does not return, because the new ROM |
|
is executing in its place. |
|
|
|
The screen and both stacks are cleared and all the device vectors are |
|
written to zero as a convenience. All other device bytes are left |
|
untouched, so they could introduce a device state to the next ROM that |
|
it's not expecting. |
|
) |
|
|
|
.File/name DEO2 |
|
|
|
( clear wst ) |
|
#ab |
|
&wst-loop |
|
POP |
|
.System/wst STH DEIr STHr ,&wst-loop JCN |
|
|
|
( clear rst ) |
|
LITr ab |
|
&rst-loop |
|
POPr |
|
.System/rst DEI ,&rst-loop JCN |
|
|
|
( clear screen ) |
|
#0000 DUP2 .Screen/x DEO2 .Screen/y DEO2 |
|
#80 .Screen/pixel DEO |
|
#c0 .Screen/pixel DEO |
|
|
|
( reset device vectors ) |
|
LIT2r 0000 #00 |
|
&device-vector-loop |
|
DUP2r STHk DEO2r |
|
#10 ADD |
|
DUP ,&device-vector-loop JCN |
|
POP POP2r |
|
|
|
( copy the zero-page-loader into f0-ff ) |
|
;&zero-page-loader LITr f0 |
|
©-loop |
|
LDAk STHkr STZ |
|
INC2 INCr |
|
STHkr ,©-loop JCN |
|
POP2 ( leave 00 on return stack ) |
|
|
|
( prepare the stack for the zero-page-loader ) |
|
( the more we prepare here in advance, the less we'll have to overwrite ) |
|
STHkr #00fe ( arguments for STZ2 at ff ) |
|
STHkr ( argument for JMP at fe (carry on) ) |
|
DUPk #fcfe ( arguments for STZ2 at fd and JMP (repeat) ) |
|
OVR2 #fafe ( arguments for STZ2 at fd and JMP (repeat) ) |
|
OVR2 #f8fe ( arguments for STZ2 at fd and JMP (repeat) ) |
|
OVR2 #f6fe ( arguments for STZ2 at fd and JMP (repeat) ) |
|
OVR2 #f401 ( arguments for STZ2 at fd, plus an extra 01 ) |
|
STHkr ( first argument for ADD2 ) |
|
.File/success ( argument for DEI2 ) |
|
#0100 .File/read ( arguments for DEO2 ) |
|
#ff00 .File/length DEO2 |
|
#00f0 JMP2 |
|
|
|
&zero-page-loader |
|
( f0 ) DEO2 |
|
( f1 ) DEI2 |
|
( f2 ) ADD2 |
|
( f3 ) &loop DUPr |
|
( f4 ) STH2k |
|
( f5 ) STAr |
|
( f6 ) INC2 |
|
( f7 ) NEQ2k |
|
( f8 ) ,&loop |
|
( f9 ) |
|
( fa ) JCN |
|
( fb ) POPr |
|
( fc ) POP2 |
|
( fd ) STZ2 ( deletes f4-fd through looping ) |
|
( fe ) JMP |
|
( ff ) STZ2 ( deletes fe-ff ) |
|
|
|
&tmp $1 |
|
|
|
|