0
0
Fork 0
mirror of https://git.sr.ht/~rabbits/uxn synced 2024-11-08 23:35:05 +00:00
uxn/projects/software/nasu.usm
2021-03-27 11:30:23 +00:00

524 lines
13 KiB
Text

(
app/nasu : spritesheet editor
arrows - move selection
left-click - add pixel
right-click - remove pixel
1 2 3 - select brush
)
%RTN { JMP2r }
%RTN? { #00 EQU #02 JNZ STH2r JMP2 }
%STEP8 { #0033 SFT2 }
%++ { #0001 ADD2 }
%2/ { #0001 SFT2 } %2* { #0010 SFT2 }
%8/ { #0003 SFT2 } %8* { #0030 SFT2 }
%8- { #0008 SUB2 } %8+ { #0008 ADD2 }
%SFL { #40 SFT SFT }
( variables )
;bankview { x 2 y 2 mode 1 addr 2 }
;tileview { x 2 y 2 addr 2 }
;rect { x1 2 y1 2 x2 2 y2 2 }
;mouse { x 2 y 2 }
;color { byte 1 }
;i { byte 1 }
;pt { x 1 y 1 }
;addr { short 2 }
;pos { x 2 y 2 }
( devices )
|0110 ;Screen { width 2 height 2 pad 4 x 2 y 2 color 1 }
|0120 ;Sprite { pad 8 x 2 y 2 addr 2 color 1 }
|0130 ;Controller { buttons 1 }
|0140 ;Keys { key 1 }
|0150 ;Mouse { x 2 y 2 state 1 chord 1 change 1 }
|0160 ;File { pad 8 name 2 length 2 load 2 save 2 }
|01F0 .RESET .FRAME .ERROR ( vectors )
|01F8 [ e0fc 30cc 30ac ] ( palette )
( program )
|0200 @RESET
~Screen.width 2/ #008a SUB2 =bankview.x
~Screen.height 2/ #003f SUB2 =bankview.y
,bank =bankview.addr
~Screen.width 2/ #0002 ADD2 =tileview.x
~Screen.height 2/ #003f SUB2 =tileview.y
,bank #0448 ADD2 =tileview.addr
,filepath ,load-file JSR2
,redraw JSR2
BRK
@FRAME
( keyboard controls )
~Keys #00 EQU ^$no-key JNZ
~Keys #31 LTH ^$no-key JNZ
~Keys #33 GTH ^$no-key JNZ
( select ) ~Keys #31 SUB =bankview.mode
( release ) #00 =Keys
,redraw JSR2
$no-key
~Controller.buttons #00 EQU ^$no-ctrl JNZ
~Controller.buttons
DUP #10 EQU ^$no-ctrl-up JNZ
~tileview.addr #0080 ADD2 =tileview.addr $no-ctrl-up
DUP #20 EQU ^$no-ctrl-down JNZ
~tileview.addr #0080 SUB2 =tileview.addr $no-ctrl-down
DUP #40 EQU ^$no-ctrl-left JNZ
~tileview.addr 8+ =tileview.addr $no-ctrl-left
DUP #80 EQU ^$no-ctrl-right JNZ
~tileview.addr 8- =tileview.addr $no-ctrl-right
POP
~tileview.addr #0800 DIV2 #0800 MUL2 =bankview.addr
,redraw JSR2
$no-ctrl
( mouse controls )
~Mouse.state #00 EQU ,$click-end JNZ2
( toolbar )
~Mouse.y ~bankview.y #0010 SUB2 SUB2 8/ #0000 NEQ2 ,$no-toolbar-click JNZ2
( brush )
~Mouse.x ~bankview.x SUB2 8/ #000d LTH2 ^$no-brush-click JNZ
~Mouse.x ~bankview.x SUB2 8/ #000f GTH2 ^$no-brush-click JNZ
( select ) ~mouse.x ~bankview.x SUB2 8/ #000d SUB2 SWP POP =bankview.mode
( release ) #00 =Mouse.state
,redraw JSR2 ,$click-end JMP2
$no-brush-click
~Mouse.x ~tileview.x SUB2 8/ #000e NEQ2 ^$no-load-click JNZ
( load ) ,filepath =File.name #0800 =File.length ~bankview.addr =File.load
( release ) #00 =Mouse.state
,redraw JSR2 ,$click-end JMP2
$no-load-click
~Mouse.x ~tileview.x SUB2 8/ #000f NEQ2 ^$no-save-click JNZ
( save ) ,filepath =File.name #0800 =File.length ~bankview.addr =File.save
( release ) #00 =Mouse.state
,redraw JSR2 ,$click-end JMP2
$no-save-click
$no-toolbar-click
( bankview )
~Mouse.x ~bankview.x GTH2 ~Mouse.x ~bankview.x #0080 ADD2 LTH2 #0101 EQU2
~Mouse.y ~bankview.y GTH2 ~Mouse.y ~bankview.y #0080 ADD2 LTH2 #0101 EQU2
#0101 NEQ2 ,$no-bank-click JNZ2
~bankview.mode #01 NEQ ^$not-copy-mode JNZ
#00 =i
$copy-loop
( load ) ~tileview.addr ~i ADD PEK2
( get touch addr )
~Mouse.x ~bankview.x SUB2 STEP8
~Mouse.y ~bankview.y SUB2 STEP8 #0010 MUL2 ADD2
~bankview.addr ADD2 #00 ~i ADD2 POK2
( incr ) ~i #01 ADD =i
~i #08 LTH ^$copy-loop JNZ
,redraw JSR2 ,$click-end JMP2
$not-copy-mode
~bankview.mode #02 NEQ ^$not-erase-mode JNZ
#00 =i
$erase-loop
#00
( get touch addr )
~Mouse.x ~bankview.x SUB2 STEP8
~Mouse.y ~bankview.y SUB2 STEP8 #0010 MUL2 ADD2
~bankview.addr ADD2 #00 ~i ADD2 POK2
( incr ) ~i #01 ADD =i
~i #08 LTH ^$erase-loop JNZ
,redraw JSR2 ,$click-end JMP2
$not-erase-mode
~Mouse.x ~bankview.x SUB2 STEP8
~Mouse.y ~bankview.y SUB2 STEP8 #0010 MUL2 ADD2
~bankview.addr ADD2 =tileview.addr
,redraw JSR2 ,$click-end JMP2
$no-bank-click
( tileview )
~Mouse.x ~tileview.x GTH2 ~Mouse.x ~tileview.x #0080 ADD2 LTH2 #0101 EQU2
~Mouse.y ~tileview.y GTH2 ~Mouse.y ~tileview.y #0080 ADD2 LTH2 #0101 EQU2
#0101 NEQ2 ,$no-tile-click JNZ2
~Mouse.x ~tileview.x SUB2 STEP8 #0040 DIV2
~Mouse.y ~tileview.y SUB2 STEP8 #0040 DIV2 2* ADD2
8*
~tileview.addr ADD2 =addr ( addr offset )
~Mouse.x ~tileview.x SUB2 ~Mouse.x ~tileview.x SUB2 #0040 DIV2 #0040 MUL2 SUB2 =pos.x
~Mouse.y ~tileview.y SUB2 ~Mouse.y ~tileview.y SUB2 #0040 DIV2 #0040 MUL2 SUB2 =pos.y
~Mouse.state #10 NEQ ^$no-erase-mode JNZ
( load ) ~addr ~pos.y 8/ ADD2 PEK2
( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SFL
#ff EOR AND
( save ) ~addr ~pos.y 8/ ADD2 POK2
,redraw JSR2 ,$click-end JMP2
$no-erase-mode
( load ) ~addr ~pos.y 8/ ADD2 PEK2
( mask ) #01 #07 ~pos.x 8/ SWP POP SUB SFL
ORA
( save ) ~addr ~pos.y 8/ ADD2 POK2
,redraw JSR2 ,$click-end JMP2
$no-tile-click
( operations )
~Mouse.y ~tileview.y SUB2 8/ #000c NEQ2 ,$no-operations JNZ2
~Mouse.x ~tileview.x SUB2 8/ #0011 NEQ2 ^$no-move-up JNZ
,op_shiftup JSR2
( release ) #00 =Mouse.state
,redraw JSR2 ,$click-end JMP2
$no-move-up
~Mouse.x ~tileview.x SUB2 8/ #0012 NEQ2 ^$no-move-down JNZ
,op_shiftdown JSR2
( release ) #00 =Mouse.state
,redraw JSR2 ,$click-end JMP2
$no-move-down
$no-operations
$click-end
,draw-cursor JSR2
BRK
@load-file ( path )
=File.name #0800 =File.length ,bank =File.load
RTN
@op_shiftup
~tileview.addr PEK2
~tileview.addr #0001 ADD2 PEK2 ~tileview.addr POK2
~tileview.addr #0002 ADD2 PEK2 ~tileview.addr #0001 ADD2 POK2
~tileview.addr #0003 ADD2 PEK2 ~tileview.addr #0002 ADD2 POK2
~tileview.addr #0004 ADD2 PEK2 ~tileview.addr #0003 ADD2 POK2
~tileview.addr #0005 ADD2 PEK2 ~tileview.addr #0004 ADD2 POK2
~tileview.addr #0006 ADD2 PEK2 ~tileview.addr #0005 ADD2 POK2
~tileview.addr #0007 ADD2 PEK2 ~tileview.addr #0006 ADD2 POK2
~tileview.addr #0007 ADD2 POK2
RTN
@op_shiftdown
~tileview.addr #0007 ADD2 PEK2
~tileview.addr #0006 ADD2 PEK2 ~tileview.addr #0007 ADD2 POK2
~tileview.addr #0005 ADD2 PEK2 ~tileview.addr #0006 ADD2 POK2
~tileview.addr #0004 ADD2 PEK2 ~tileview.addr #0005 ADD2 POK2
~tileview.addr #0003 ADD2 PEK2 ~tileview.addr #0004 ADD2 POK2
~tileview.addr #0002 ADD2 PEK2 ~tileview.addr #0003 ADD2 POK2
~tileview.addr #0001 ADD2 PEK2 ~tileview.addr #0002 ADD2 POK2
~tileview.addr PEK2 ~tileview.addr #0001 ADD2 POK2
~tileview.addr POK2
RTN
@redraw
,draw-bankview JSR2
,draw-tileview JSR2
RTN
@draw-bankview
~bankview.x #0002 SUB2 ~bankview.y #0002 SUB2 ~bankview.x #0081 ADD2 ~bankview.y #0081 ADD2 #03 ,line-rect JSR2
( position )
~bankview.x =Sprite.x
~bankview.y #0010 SUB2 =Sprite.y
~bankview.addr ,draw-short JSR2
( toolbar )
~bankview.x #0068 ADD2 =Sprite.x
~bankview.y #0010 SUB2 =Sprite.y
,tool_selector =Sprite.addr
#01 ~bankview.mode #00 EQU ADD =Sprite.color
~Sprite.x 8+ =Sprite.x
,tool_hand =Sprite.addr
#01 ~bankview.mode #01 EQU ADD =Sprite.color
~Sprite.x 8+ =Sprite.x
,tool_eraser =Sprite.addr
#01 ~bankview.mode #02 EQU ADD =Sprite.color
~tileview.x #0070 ADD2 =Sprite.x
,load_icn =Sprite.addr
#01 =Sprite.color
~tileview.x #0078 ADD2 =Sprite.x
,save_icn =Sprite.addr
#01 =Sprite.color
( guides )
#00 =i ,font_hex =Sprite.addr
$guides
~bankview.x #0010 SUB2 =Sprite.x
~bankview.y #00 ~i #08 MUL ADD2 =Sprite.y
( draw ) #02 =Sprite.color
~bankview.x #00 ~i #08 MUL ADD2 =Sprite.x
~bankview.y #0088 ADD2 =Sprite.y
( draw ) #02 =Sprite.color
~Sprite.addr 8+ =Sprite.addr
( incr ) ~i #01 ADD =i
~i #10 LTH ^$guides JNZ
( body )
~bankview.x =Sprite.x ~bankview.y =Sprite.y
#00 =pt.x #00 =pt.y ~bankview.addr =Sprite.addr
$ver
#00 =pt.x
~bankview.x =Sprite.x
$hor
( draw ) #01
~Sprite.addr ~tileview.addr LTH2
~Sprite.addr ~tileview.addr #0018 ADD2 GTH2
#0000 EQU2 #06 MUL ADD =Sprite.color
( incr ) ~Sprite.x 8+ =Sprite.x
( incr ) ~Sprite.addr 8+ =Sprite.addr
( incr ) ~pt.x #01 ADD =pt.x
~pt.x #10 LTH ,$hor JNZ2
( incr ) ~pt.y #01 ADD =pt.y
( incr ) ~Sprite.y 8+ =Sprite.y
~pt.y #10 LTH ,$ver JNZ2
RTN
@draw-tileview
~tileview.x #0002 SUB2 ~tileview.y #0002 SUB2 ~tileview.x #0080 ADD2 ~tileview.y #0081 ADD2 #03 ,line-rect JSR2
~tileview.x #0028 ADD2 =Sprite.x
~tileview.y #0010 SUB2 =Sprite.y
~tileview.addr =Sprite.addr
#03 =Sprite.color
( position )
~tileview.x =Sprite.x
~tileview.y #0010 SUB2 =Sprite.y
~tileview.addr ,draw-short JSR2
( body )
~tileview.x =Sprite.x
~tileview.y =Sprite.y
~tileview.addr =tileview.addr
,draw-tileview-icn JSR2
~tileview.x #0040 ADD2 =Sprite.x
~tileview.y =Sprite.y
~tileview.addr 8+ =tileview.addr
,draw-tileview-icn JSR2
~tileview.x =Sprite.x
~tileview.y #0040 ADD2 =Sprite.y
~tileview.addr 8+ =tileview.addr
,draw-tileview-icn JSR2
~tileview.x #0040 ADD2 =Sprite.x
~tileview.y #0040 ADD2 =Sprite.y
~tileview.addr 8+ =tileview.addr
,draw-tileview-icn JSR2
( line hor )
~tileview.y #003f ADD2 =Screen.y
~tileview.x =Screen.x
$line-hor
( draw ) #03 =Screen.color
( incr ) ~Screen.x #0002 ADD2 =Screen.x
~Screen.x ~tileview.x #0082 ADD2 LTH2 ^$line-hor JNZ
( line ver )
~tileview.y =Screen.y
~tileview.x #003f ADD2 =Screen.x
$line-ver
( draw ) #03 =Screen.color
( incr ) ~Screen.y #0002 ADD2 =Screen.y
~Screen.y ~tileview.y #0081 ADD2 LTH2 ^$line-ver JNZ
( rewind ) ~tileview.addr #0018 SUB2 =tileview.addr
( bytes )
~tileview.y #0018 ADD2 =Sprite.y
#00 =i
$bytes
~tileview.x #0088 ADD2 =Sprite.x
,font_hex #00 ~tileview.addr #00 ~i ADD2 PEK2 #f0 AND #04 SFT #08 MUL ADD2 =Sprite.addr
( draw ) #02 =Sprite.color
~Sprite.x 8+ =Sprite.x
,font_hex #00 ~tileview.addr #00 ~i ADD2 PEK2 #0f AND #08 MUL ADD2 =Sprite.addr
( draw ) #02 =Sprite.color
( incr ) ~i #01 ADD =i
( incr ) ~Sprite.y 8+ =Sprite.y
~i #08 LTH ,$bytes JNZ2
( operations )
~Sprite.y 8+ =Sprite.y
,movedown_icn =Sprite.addr
#01 =Sprite.color
~Sprite.x 8- =Sprite.x
,moveup_icn =Sprite.addr
#01 =Sprite.color
( draw tiles )
~tileview.y =Sprite.y
#00 =pt.x #00 =pt.y ~tileview.addr =Sprite.addr
$tiles-ver
#00 =pt.x
~tileview.x #0088 ADD2 =Sprite.x
$tiles-hor
( draw ) #03 =Sprite.color
( incr ) ~Sprite.x 8+ =Sprite.x
( incr ) ~Sprite.addr 8+ =Sprite.addr
( incr ) ~pt.x #01 ADD =pt.x
~pt.x #02 LTH ,$tiles-hor JNZ2
( incr ) ~pt.y #01 ADD =pt.y
( incr ) ~Sprite.y 8+ =Sprite.y
~pt.y #02 LTH ,$tiles-ver JNZ2
RTN
@draw-tileview-icn
#00 =pt.x #00 =pt.y
$ver
#00 =pt.x
$hor
( get bit )
,blank_icn #00
~tileview.addr #00 ~pt.y ADD2 PEK2 #07 ~pt.x SUB SFT #01 AND ( get bit )
8* ADD2 =Sprite.addr ( add *8 )
( draw ) #01 =Sprite.color
( incr ) ~Sprite.x 8+ =Sprite.x
( incr ) ~pt.x #01 ADD =pt.x
~pt.x #08 LTH ,$hor JNZ2
( incr ) ~Sprite.y 8+ =Sprite.y
( incr ) ~pt.y #01 ADD =pt.y
~Sprite.x #0040 SUB2 =Sprite.x
~pt.y #08 LTH ,$ver JNZ2
RTN
@draw-cursor
~mouse.x ~Mouse.x NEQ2
~mouse.y ~Mouse.y NEQ2
#0000 EQU2 RTN? ( Return if unchanged )
( clear last cursor )
~mouse.x =Sprite.x
~mouse.y =Sprite.y
,blank_icn =Sprite.addr
#10 =Sprite.color
( record mouse positions )
~Mouse.x =mouse.x
~Mouse.y =mouse.y
( draw new cursor )
~mouse.x =Sprite.x
~mouse.y =Sprite.y
,tool_selector #00 ~bankview.mode #08 MUL ADD2 =Sprite.addr
#12 =Sprite.color
RTN
@draw-short ( short )
=addr
,font_hex #00 ,addr PEK2 #f0 AND #04 SFT #08 MUL ADD2 =Sprite.addr
( draw ) #02 =Sprite.color
~Sprite.x 8+ =Sprite.x
,font_hex #00 ,addr PEK2 #0f AND #08 MUL ADD2 =Sprite.addr
( draw ) #02 =Sprite.color
~Sprite.x 8+ =Sprite.x
,font_hex #00 ,addr ++ PEK2 #f0 AND #04 SFT #08 MUL ADD2 =Sprite.addr
( draw ) #02 =Sprite.color
~Sprite.x 8+ =Sprite.x
,font_hex #00 ,addr ++ PEK2 #0f AND #08 MUL ADD2 =Sprite.addr
( draw ) #02 =Sprite.color
RTN
( Utils )
@line-rect ( x1 y1 x2 y2 color )
( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1
$hor
( incr ) ~Screen.x ++ =Screen.x
( draw ) ~rect.y1 =Screen.y ~color =Screen.color
( draw ) ~rect.y2 =Screen.y ~color =Screen.color
~Screen.x ~rect.x2 LTH2 ^$hor JNZ
~rect.y1 =Screen.y
$ver
( draw ) ~rect.x1 =Screen.x ~color =Screen.color
( draw ) ~rect.x2 =Screen.x ~color =Screen.color
( incr ) ~Screen.y ++ =Screen.y
~Screen.y ~rect.y2 ++ LTH2 ^$ver JNZ
RTN
@tool_selector [ 80c0 e0f0 f8e0 1000 ]
@tool_hand [ 4040 4070 f8f8 f870 ]
@tool_eraser [ 2050 b87c 3e1c 0800 ]
@blank_icn [ 0000 0000 0000 0000 ]
@cell1_icn [ 7cfe fefe fefe 7c00 ]
@load_icn [ feaa d6aa d4aa f400 ]
@save_icn [ fe82 8282 848a f400 ]
@moveup_icn [ 0010 387c fe10 1000 ]
@movedown_icn [ 0010 1010 fe7c 3810 ]
@filepath [ projects/fonts/specter8.bit 00 ]
@font_hex ( 0-F )
[
007c 8282 8282 827c 0030 1010 1010 1010
007c 8202 7c80 80fe 007c 8202 1c02 827c
000c 1424 4484 fe04 00fe 8080 7c02 827c
007c 8280 fc82 827c 007c 8202 1e02 0202
007c 8282 7c82 827c 007c 8282 7e02 827c
007c 8202 7e82 827e 00fc 8282 fc82 82fc
007c 8280 8080 827c 00fc 8282 8282 82fc
007c 8280 f080 827c 007c 8280 f080 8080
]
@ERROR BRK
|2000 @bank [ ]