463 lines
11 KiB
Tal
463 lines
11 KiB
Tal
( utility macros )
|
|
|
|
%INC-X { .Screen/x DEI2 #0008 ADD2 .Screen/x DEO2 } ( -- )
|
|
%INC-Y { .Screen/y DEI2 #0008 ADD2 .Screen/y DEO2 } ( -- )
|
|
|
|
%CENTER-X { .Screen/width DEI2 #01 SFT2 }
|
|
%CENTER-Y { .Screen/height DEI2 #01 SFT2 }
|
|
|
|
%MOD { DIVk MUL SUB }
|
|
%MOD2 { DIV2k MUL2 SUB2 }
|
|
|
|
%2** { #10 SFT2 } %2// { #01 SFT2 }
|
|
%8** { #30 SFT2 } %8// { #03 SFT2 }
|
|
%TOS { #00 SWP } %TOB { SWP POP }
|
|
|
|
|
|
%NEXT-TILE { DUP2 #0010 ADD2 }
|
|
|
|
%RTN { JMP2r }
|
|
|
|
( devices )
|
|
|
|
|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 &debug $1 &halt $1 ]
|
|
|10 @Console [ &vector $2 &read $1 &pad $5 &write $1 &error $1 ]
|
|
|20 @Screen [ &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 ]
|
|
|30 @Audio0 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ]
|
|
|40 @Audio1 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ]
|
|
|50 @Audio2 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ]
|
|
|60 @Audio3 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ]
|
|
|80 @Controller [ &vector $2 &button $1 &key $1 ]
|
|
|90 @Mouse [ &vector $2 &x $2 &y $2 &state $1 &wheel $1 ]
|
|
|a0 @File [ &vector $2 &success $2 &offset-hs $2 &offset-ls $2 &name $2 &length $2 &load $2 &save $2 ]
|
|
|b0 @DateTime [ &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ]
|
|
|
|
( variables )
|
|
|
|
|0000
|
|
|
|
@state $1
|
|
@ticker $1
|
|
@anim-speed $1
|
|
|
|
@logo-coords [
|
|
&x $2
|
|
&y $2
|
|
]
|
|
|
|
@list-len $2
|
|
@list-offset $1
|
|
@list-elem-offset $1
|
|
@list-elem $32
|
|
|
|
|
|
@cart $32
|
|
@realm $32
|
|
|
|
( program )
|
|
|
|
|0100
|
|
@init ( -> )
|
|
|
|
( steppewnolf-dark theme )
|
|
#02c1 .System/r DEO2
|
|
#02cd .System/g DEO2
|
|
#02cb .System/b DEO2
|
|
|
|
( load uxn and xrxs logos from main spritesheet )
|
|
;spritesheet .File/name DEO2
|
|
#0100 .File/length DEO2
|
|
|
|
#0000 .File/offset-ls DEO2
|
|
;uxnlogo .File/load DEO2
|
|
|
|
#0200 .File/offset-ls DEO2
|
|
;xrxslogo .File/load DEO2
|
|
|
|
( load zz font )
|
|
;fontsheet .File/name DEO2
|
|
#0000 .File/offset-ls DEO2
|
|
#0300 .File/length DEO2
|
|
;font .File/load DEO2
|
|
|
|
( initialize state )
|
|
#00 .ticker STZ
|
|
#00 .state STZ
|
|
#20 .anim-speed STZ
|
|
|
|
CENTER-X .logo-coords/x STZ2
|
|
CENTER-Y .logo-coords/y STZ2
|
|
|
|
;on-frame .Screen/vector DEO2
|
|
|
|
BRK
|
|
|
|
@on-frame ( -> )
|
|
|
|
|
|
.ticker LDZ #01 ADD
|
|
DUP .anim-speed LDZ EQU ,&next-render JCN
|
|
.ticker STZ
|
|
BRK
|
|
|
|
&next-render
|
|
POP #00 .ticker STZ
|
|
.state LDZ
|
|
|
|
( draw uxn logo )
|
|
DUP #00 NEQ ,&state1 JCN
|
|
;draw-uxn-logo JSR2
|
|
INC .state STZ
|
|
BRK
|
|
|
|
( draw first syllable of xrxs logo )
|
|
&state1 DUP #01 NEQ ,&state2 JCN
|
|
;draw-xrxs-logo-xr JSR2
|
|
INC .state STZ
|
|
BRK
|
|
|
|
( draw second syllable of xrxs logo )
|
|
&state2 DUP #02 NEQ ,&state3 JCN
|
|
;draw-xrxs-logo-xs JSR2
|
|
|
|
INC .state STZ
|
|
BRK
|
|
|
|
( clear screen )
|
|
&state3
|
|
;clear-screen JSR2
|
|
|
|
( move shove logo into top-left corner )
|
|
DUP #03 NEQ ,&state4 JCN
|
|
#04 .anim-speed STZ
|
|
;scoot-logos JSR2
|
|
;draw-uxn-logo JSR2
|
|
;draw-xrxs-logo-xr JSR2
|
|
;draw-xrxs-logo-xs JSR2
|
|
.logo-coords/x LDZ2 #0020 GTH2 ,&keep-state JCN
|
|
;cartlist .File/name DEO2
|
|
#2000 .File/length DEO2
|
|
;listbuf .File/load DEO2
|
|
.File/success DEI2 .list-len STZ2
|
|
INC .state STZ BRK
|
|
&keep-state POP
|
|
BRK
|
|
|
|
( render the cartridge list interface )
|
|
&state4 DUP #04 NEQ ,&state5 JCN
|
|
;draw-gray-borders JSR2
|
|
;draw-bl-scanlines JSR2
|
|
;draw-tl-scanlines JSR2
|
|
;draw-tr-scanlines JSR2
|
|
;draw-br-scanlines JSR2
|
|
;draw-uxn-logo JSR2
|
|
;draw-xrxs-logo-xr JSR2
|
|
;draw-xrxs-logo-xs JSR2
|
|
[ ;title-loadCart
|
|
CENTER-X OVR2 ;strlen JSR2 #20 SFT2 SUB2
|
|
#0010
|
|
#02 ] ;draw-string JSR2
|
|
;render-cart-list JSR2
|
|
;draw-pointer JSR2
|
|
POP
|
|
BRK
|
|
&state5 POP
|
|
BRK
|
|
|
|
@clear-screen ( -> )
|
|
|
|
.Screen/width DEI2 #0000 &whilex EQU2k ,&endx JCN
|
|
DUP2 ,&x STR2
|
|
.Screen/height DEI2 #0000 &whiley EQU2k ,&endy JCN
|
|
DUP2 ,&y STR2
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 .Screen/y DEO2
|
|
;blank .Screen/addr DEO2
|
|
#10 .Screen/sprite DEO
|
|
#40 .Screen/sprite DEO
|
|
#0008 ADD2 ,&whiley JMP &endy POP2 POP2
|
|
#0008 ADD2 ,&whilex JMP &endx POP2 POP2
|
|
|
|
RTN
|
|
&x $2
|
|
&y $2
|
|
|
|
@scoot-logos ( -> )
|
|
.logo-coords/x LDZ2 #0021 LTH2 ,&no-scoot-x JCN
|
|
.logo-coords/x LDZ2 #01 SFT2
|
|
.logo-coords/x STZ2
|
|
&no-scoot-x
|
|
|
|
.logo-coords/y LDZ2 #0021 LTH2 ,&no-scoot-y JCN
|
|
.logo-coords/y LDZ2 #01 SFT2
|
|
.logo-coords/y STZ2
|
|
&no-scoot-y
|
|
RTN
|
|
|
|
@draw-uxn-logo ( -> )
|
|
|
|
.logo-coords/x LDZ2 #0020 SUB2 .Screen/x DEO2
|
|
.logo-coords/y LDZ2 #0010 SUB2 .Screen/y DEO2
|
|
|
|
#0100 #0000 &while EQU2k ,&end JCN
|
|
DUP2 ;uxnlogo ADD2 .Screen/addr DEO2
|
|
#c1 .Screen/sprite DEO INC-X
|
|
|
|
NEXT-TILE #0030 AND2 #0000 NEQ2 ,&no-inc-y JCN
|
|
.logo-coords/x LDZ2 #0020 SUB2 .Screen/x DEO2
|
|
INC-Y
|
|
&no-inc-y
|
|
#0010 ADD2 ,&while JMP &end POP2 POP2
|
|
|
|
RTN
|
|
|
|
@draw-xrxs-logo-xr ( -> )
|
|
|
|
.logo-coords/x LDZ2 .Screen/x DEO2
|
|
.logo-coords/y LDZ2 #0010 SUB2 .Screen/y DEO2
|
|
|
|
#0080 #0000 &while EQU2k ,&end JCN
|
|
DUP2 ;xrxslogo ADD2 .Screen/addr DEO2
|
|
#c1 .Screen/sprite DEO INC-X
|
|
|
|
NEXT-TILE #0030 AND2 #0000 NEQ2 ,&no-inc-y JCN
|
|
.logo-coords/x LDZ2 .Screen/x DEO2
|
|
INC-Y
|
|
&no-inc-y
|
|
#0010 ADD2 ,&while JMP &end POP2 POP2
|
|
|
|
RTN
|
|
|
|
@draw-xrxs-logo-xs ( -> )
|
|
|
|
.logo-coords/x LDZ2 .Screen/x DEO2
|
|
.logo-coords/y LDZ2 .Screen/y DEO2
|
|
|
|
#0100 #0080 &while EQU2k ,&end JCN
|
|
DUP2 ;xrxslogo ADD2 .Screen/addr DEO2
|
|
#c1 .Screen/sprite DEO INC-X
|
|
|
|
NEXT-TILE #0030 AND2 #0000 NEQ2 ,&no-inc-y JCN
|
|
.logo-coords/x LDZ2 .Screen/x DEO2
|
|
INC-Y
|
|
&no-inc-y
|
|
#0010 ADD2 ,&while JMP &end POP2 POP2
|
|
|
|
RTN
|
|
|
|
@draw-gray-borders ( -> )
|
|
|
|
;blank .Screen/addr DEO2
|
|
#0028 #0000 &whilemtop EQU2k ,&endmtop JCN
|
|
DUP2 .Screen/y DEO2
|
|
.Screen/width DEI2 #0000 &whiletop EQU2k ,&endtop JCN
|
|
DUP2 .Screen/x DEO2
|
|
#84 .Screen/sprite DEO
|
|
#0008 ADD2 ,&whiletop JMP &endtop POP2 POP2
|
|
#0008 ADD2 ,&whilemtop JMP &endmtop POP2 POP2
|
|
|
|
#0040 #0000 &whilemleft EQU2k ,&endmleft JCN
|
|
DUP2 .Screen/x DEO2
|
|
.Screen/height DEI2 #0028 SUB2 #0028 &whileleft EQU2k ,&endleft JCN
|
|
DUP2 .Screen/y DEO2
|
|
#84 .Screen/sprite DEO
|
|
#0008 ADD2 ,&whileleft JMP &endleft POP2 POP2
|
|
#0008 ADD2 ,&whilemleft JMP &endmleft POP2 POP2
|
|
|
|
.Screen/width DEI2 DUP2 #0040 SUB2 &whilemright EQU2k ,&endmright JCN
|
|
DUP2 .Screen/x DEO2
|
|
.Screen/height DEI2 #0028 SUB2 #0028 &whileright EQU2k ,&endright JCN
|
|
DUP2 .Screen/y DEO2
|
|
#84 .Screen/sprite DEO
|
|
#0008 ADD2 ,&whileright JMP &endright POP2 POP2
|
|
#0008 ADD2 ,&whilemright JMP &endmright POP2 POP2
|
|
|
|
.Screen/height DEI2 DUP2 #0028 SUB2 &whilembottom EQU2k ,&endmbottom JCN
|
|
DUP2 .Screen/y DEO2
|
|
.Screen/width DEI2 #0000 &whilebottom EQU2k ,&endbottom JCN
|
|
DUP2 .Screen/x DEO2
|
|
#84 .Screen/sprite DEO
|
|
#0008 ADD2 ,&whilebottom JMP &endbottom POP2 POP2
|
|
#0008 ADD2 ,&whilembottom JMP &endmbottom POP2 POP2
|
|
RTN
|
|
|
|
|
|
( come up with a more elegant way to draw these )
|
|
|
|
@draw-bl-scanlines ( -> )
|
|
CENTER-Y ,&y STR2
|
|
#0008 ,&x STR2
|
|
|
|
&whileld
|
|
,&y LDR2 CENTER-Y SUB2 #04 SFT2 DUP2 ADD2 #0008 ADD2 ,&x STR2
|
|
.Screen/height DEI2 #0028 SUB2 ,&y LDR2 LTH2 ,&endld JCN
|
|
&dlscan #0040 ,&x LDR2 EQU2 ,&enddlscan JCN
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 .Screen/y DEO2
|
|
#03 .Screen/pixel DEO
|
|
,&x LDR2 #0001 ADD2 ,&x STR2 ,&dlscan JMP &enddlscan
|
|
,&y LDR2 #0004 ADD2 ,&y STR2 ,&whileld JMP &endld
|
|
RTN
|
|
&x $2
|
|
&y $2
|
|
|
|
@draw-tl-scanlines
|
|
#0028 ,&y STR2
|
|
#0008 ,&x STR2
|
|
|
|
&whilelu
|
|
CENTER-Y ,&y LDR2 SUB2 #04 SFT2 DUP2 ADD2 #0008 ADD2 ,&x STR2
|
|
CENTER-Y ,&y LDR2 LTH2 ,&endlu JCN
|
|
&ulscan #0040 ,&x LDR2 EQU2 ,&endulscan JCN
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 .Screen/y DEO2
|
|
#03 .Screen/pixel DEO
|
|
,&x LDR2 #0001 ADD2 ,&x STR2 ,&ulscan JMP &endulscan
|
|
,&y LDR2 #0004 ADD2 ,&y STR2 ,&whilelu JMP &endlu
|
|
|
|
RTN
|
|
&x $2
|
|
&y $2
|
|
|
|
@draw-br-scanlines ( -> )
|
|
CENTER-Y ,&y STR2
|
|
.Screen/width DEI2 #0008 SUB2 ,&x STR2
|
|
|
|
&whilerd
|
|
.Screen/width DEI2 #0040 SUB2 ,&x STR2
|
|
.Screen/height DEI2 #0028 SUB2 ,&y LDR2 LTH2 ,&endrd JCN
|
|
&drscan .Screen/width DEI2 #0008 SUB2 ,&y LDR2 CENTER-Y SUB2 #04 SFT2 DUP2 ADD2 SUB2 ,&x LDR2 EQU2 ,&enddrscan JCN
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 .Screen/y DEO2
|
|
#03 .Screen/pixel DEO
|
|
,&x LDR2 #0001 ADD2 ,&x STR2 ,&drscan JMP &enddrscan
|
|
,&y LDR2 #0004 ADD2 ,&y STR2 ,&whilerd JMP &endrd
|
|
RTN
|
|
&x $2
|
|
&y $2
|
|
|
|
@draw-tr-scanlines
|
|
#0028 ,&y STR2
|
|
.Screen/width DEI2 #0008 SUB2 ,&x STR2
|
|
|
|
&whileru
|
|
.Screen/width DEI2 #0040 SUB2 ,&x STR2
|
|
CENTER-Y ,&y LDR2 LTH2 ,&endru JCN
|
|
&urscan .Screen/width DEI2 #0008 SUB2 CENTER-Y ,&y LDR2 SUB2 #04 SFT2 DUP2 ADD2 SUB2 ,&x LDR2 EQU2 ,&endurscan JCN
|
|
,&x LDR2 .Screen/x DEO2
|
|
,&y LDR2 .Screen/y DEO2
|
|
#03 .Screen/pixel DEO
|
|
,&x LDR2 #0001 ADD2 ,&x STR2 ,&urscan JMP &endurscan
|
|
,&y LDR2 #0004 ADD2 ,&y STR2 ,&whileru JMP &endru
|
|
|
|
RTN
|
|
&x $2
|
|
&y $2
|
|
|
|
|
|
@draw-pointer ( -> )
|
|
|
|
;pointer_icn .Screen/addr DEO2
|
|
|
|
.Mouse/x DEI2 .Screen/x DEO2
|
|
.Mouse/y DEI2 .Screen/y DEO2
|
|
|
|
#4a .Screen/sprite DEO
|
|
|
|
RTN
|
|
|
|
@draw-string ( addr x y color -- )
|
|
|
|
STH ( save color )
|
|
.Screen/y DEO2 ( set y )
|
|
.Screen/x DEO2 ( set x )
|
|
|
|
( now the string address is at the top of the stack )
|
|
&loop
|
|
LDAk DUP #00 NEQ #20 MUL SUB TOS 8** ;font ADD2 .Screen/addr DEO2
|
|
STHkr .Screen/sprite DEO
|
|
INC-X
|
|
INC2
|
|
LDAk #00 NEQ ,&loop JCN
|
|
POP2
|
|
POPr
|
|
|
|
RTN
|
|
|
|
@draw-char ( char x y color -- )
|
|
|
|
STH ( save color )
|
|
.Screen/y DEO2 ( set y )
|
|
.Screen/x DEO2 ( set x )
|
|
|
|
#20 MUL SUB TOS 8** ;font ADD2 .Screen/addr DEO2
|
|
STHr .Screen/sprite DEO
|
|
RTN
|
|
|
|
@strlen ( addr -- len )
|
|
|
|
DUP2
|
|
&loop
|
|
INC2 LDAk ,&loop JCN
|
|
SWP2 SUB2
|
|
|
|
RTN
|
|
|
|
@render-cart-list ( -> )
|
|
|
|
#0040 .Screen/x DEO2
|
|
#0028 .Screen/y DEO2
|
|
|
|
#01 .list-offset STZ
|
|
.list-len LDZ2 #0000 &while EQU2k ,&end JCN
|
|
( get a character from the list )
|
|
DUP2 ;listbuf ADD2 LDA
|
|
|
|
( if null byte, terminate loop )
|
|
DUP #00 EQU ,&end JCN
|
|
|
|
( if not newline, store the character and increment the offsets )
|
|
DUP #0a EQU ,&inc-line JCN
|
|
#00 .list-elem-offset LDZ ;word ADD2 STA
|
|
.list-elem-offset LDZ INC .list-elem-offset STZ
|
|
,&continue JMP ( continue looping )
|
|
|
|
( if newline, print the word, increment x, reset y )
|
|
( clear the word and word offsets, increment the buffer offset )
|
|
&inc-line
|
|
#00 .list-elem-offset LDZ ;word ADD2 STA
|
|
[ ;word
|
|
.Screen/x DEI2
|
|
.Screen/y DEI2
|
|
#02 ] ;draw-string JSR2
|
|
#0040 .Screen/x DEO2
|
|
INC-Y
|
|
|
|
#20 #00 &word_clr EQUk ,&end-clr JCN
|
|
#00 OVR SWP DUP ROT ;word ADD2 STA
|
|
INC ,&word_clr JMP &end-clr POP2
|
|
#00 .list-elem-offset STZ
|
|
&continue INC2 ,&while JMP
|
|
&end POP2 POP2
|
|
RTN
|
|
|
|
( constants )
|
|
@spritesheet "xrxs.chr 00
|
|
@fontsheet "zz.chr 00
|
|
@cartlist "n/carts 00
|
|
@title-loadCart "Select 20 "A 20 "Cartridge 00
|
|
|
|
( sprites )
|
|
@blank $16
|
|
@uxnlogo $256
|
|
@xrxslogo $256
|
|
@pointer_icn [ 80c0 e0f0 f8e0 1000 ]
|
|
@font $768
|
|
|
|
( big data )
|
|
@word [ #0000 #0000 #0000 #0000
|
|
#0000 #0000 #0000 #0000
|
|
#0000 #0000 #0000 #0000
|
|
#0000 #0000 #0000 #0000 ]
|
|
@listbuf $8192
|
|
|