uxn/projects/library/load-rom.tal

83 lines
1.9 KiB
Tal
Raw Permalink Normal View History

@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.
2021-09-22 11:41:25 -04:00
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
2021-09-22 19:15:40 -04:00
.System/wst STH DEIr STHr ,&wst-loop JCN
( clear rst )
LITr ab
&rst-loop
POPr
.System/rst DEI ,&rst-loop JCN
2021-09-22 11:41:25 -04:00
( clear screen )
#0000 DUP2 .Screen/x DEO2 .Screen/y DEO2
#80 .Screen/pixel DEO
#c0 .Screen/pixel DEO
2021-09-22 11:41:25 -04:00
( 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
&copy-loop
LDAk STHkr STZ
INC2 INCr
STHkr ,&copy-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 )
2021-11-07 14:10:30 -05:00
#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