~rabbits/nasu

5b350ca88693f0c2317c61c8095ac972e8af9e7c — neauoire 1 year, 9 months ago f24167c
Removed old file
1 files changed, 0 insertions(+), 1100 deletions(-)

D nasu.usm
D nasu.usm => nasu.usm +0 -1100
@@ 1,1100 0,0 @@
(
	app/nasu : spritesheet editor

	arrows - move selection
	enter     - insert tile
	backspace - delete tile
	left-click  - add pixel
	right-click - remove pixel
	1 2 3 - select color
	q w e - select tool
)

%+  { ADD } %-   { SUB }  %*  { MUL } %/   { DIV }
%<  { LTH } %>   { GTH }  %=  { EQU } %!   { NEQ }
%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 }
%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }

%HOR    { #20 }              %VER    { #10 }
%WIDTH  { HOR TOS #0008 ** } %HEIGHT { VER TOS #0008 ** }
%LENGTH { HOR TOS VER TOS ** #0010 ** }

%RTN { JMP2r }
%STEP8 { #33 SFT2 }
%MOD { DUP2 / * - }
%MOD2 { OVR2 OVR2 // ** -- }
%MOD8 { #07 AND }
%ROL { DUP #07 SFT SWP #10 SFT + }
%ROR { DUP #70 SFT SWP #01 SFT + }
%SFL { #40 SFT SFT }
%TOB { SWP POP } %TOS { #00 SWP }
%INCR { SWP #01 + SWP }
%INCR2 { SWP2 #0001 ++ SWP2 }
%DECR2 { SWP2 #0001 -- SWP2 }
%TOGGLE { DUP LDZ #00 = SWP STZ }
%GET-ITERATORS { SWP2k POP SWP POP } 

%DEBUG  { .Console/byte DEO #0a .Console/char DEO }
%DEBUG2 { .Console/short DEO2 #0a .Console/char DEO }

%BANK { #2000 }
%GET-COLOR     { .settings/color LDZ STHk #02 / + DEI #01 STHr #01 AND - #04 * SFT #0f AND }
%GET-POSITION  { .settings/focus LDZ2 BANK -- DUP2 #0002 // WIDTH MOD2 SWP2 WIDTH #0002 ** // #0008 ** }
%ADD-POSITIONS { ROT2 ++ ROT2 ROT2 ++ SWP2 }
%RELEASE-MOUSE { #00 .Mouse/state DEO }

%SIZE-TO-RECT {
	STH2 STH2 OVR2 STH2r ++ OVR2 STH2r ++
} ( x y w h -- x1 y1 x2 y2 )

%SET-RECT {
	DUP2 ROT2 SWP2 #0006 ++ STA2
	DUP2 ROT2 SWP2 #0004 ++ STA2
	DUP2 ROT2 SWP2 #0002 ++ STA2
	DUP2 ROT2 SWP2 STA2
	POP2
} ( x1 y1 x2 y2 addr -- )

( devices )

|00 @System     [ &vector $2 &pad     $6 &r      $2 &g     $2 &b     $2 ]
|10 @Console    [ &vector $2 &pad     $6 &char   $1 &byte  $1 &short $2 &string $2 ]
|20 @Screen     [ &vector $2 &width   $2 &height $2 &pad   $2 &x     $2 &y $2 &addr $2 &color $1 ]
|80 @Controller [ &vector $2 &button  $1 &key    $1 ]
|90 @Mouse      [ &vector $2 &x       $2 &y      $2 &state $1 &chord $1 ]
|a0 @File       [ &vector $2 &success $2 &offset $2 &pad   $2 &name  $2 &length $2 &load $2 &save $2 ]

( variables )

|0000

@state
	&timer $1
	&trap $1
	&blink $1

@settings
	&depth $1
	&color $1
	&blending $1 
	&ratio $1
	&tool $1
	&focus $2
	&zoom $1
	
@frame [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 &width $2 &height $2 ]

( interface )
@toolview  [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
@colorview [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
@blendview [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
@dataview  [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
@preview   [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
@tileview  [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
@zoomview  [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 ]
@pointer   [ &x $2 &y $2 ]

@path 
	&length $1
	&name $20

( program )

|0100 ( -> )

	( theme ) 
	#0a6f .System/r DEO2 
	#05cf .System/g DEO2 
	#0caf .System/b DEO2

	( vectors )
	;on-button   .Controller/vector DEO2
	;on-mouse    .Mouse/vector DEO2
	;on-transfer .File/vector DEO2
	;on-frame    .Screen/vector DEO2

	( set defaults )
	HOR TOS #0008 ** .frame/width STZ2
	VER TOS #0008 ** #0040 ++ .frame/height STZ2
	#01 .settings/depth STZ
	#01 .settings/color STZ
	#01 .settings/blending STZ
	#32 .settings/ratio STZ
	#01 .settings/tool STZ
	BANK .settings/focus STZ2

	.Screen/width DEI2 #01 SFT2 .frame/width LDZ2 #01 SFT2 --
	.Screen/height DEI2 #01 SFT2 .frame/height LDZ2 #01 SFT2 --
	.frame/width LDZ2 .frame/height LDZ2
	SIZE-TO-RECT ;frame SET-RECT

	.frame/x1 LDZ2 .frame/y1 LDZ2 #0030 ++ HOR TOS #0008 ** VER TOS #0008 ** SIZE-TO-RECT ;tileview SET-RECT
	.tileview/x1 LDZ2 .tileview/y2 LDZ2 #0008 ++ HOR TOS #0008 ** #0008 SIZE-TO-RECT ;toolview SET-RECT

	.frame/x1 LDZ2 .frame/y1 LDZ2 #0020 #0020 SIZE-TO-RECT ;blendview SET-RECT
	.frame/x1 LDZ2 #0030 ++ .frame/y1 LDZ2 #0020 #0020 SIZE-TO-RECT ;preview SET-RECT
	.frame/x1 LDZ2 #0060 ++ .frame/y1 LDZ2 #0020 #0020 SIZE-TO-RECT ;colorview SET-RECT
	.frame/x1 LDZ2 #0090 ++ .frame/y1 LDZ2 #0020 #0028 SIZE-TO-RECT ;zoomview SET-RECT
	.frame/x1 LDZ2 #00c0 ++ .frame/y1 LDZ2 #0048 #0020 SIZE-TO-RECT ;dataview SET-RECT

	;untitled-txt ;new-file JSR2
	;redraw JSR2

BRK

@on-frame ( -> )
	
	.state/trap LDZ #00 ! #01 JCN [ BRK ]

	( incr ) .state/timer LDZ #01 + DUP .state/timer STZ 

	#08 ! ,&no-toggle JCN
		.state/blink TOGGLE
		#23 .state/blink LDZ #09 * + ;draw-filepath JSR2
		#00 .state/timer STZ 
	&no-toggle
	
BRK

@on-transfer ( -> )
	
	;redraw JSR2
	
BRK

@on-button ( -> )
	
	.Controller/key DEI .Controller/button DEI #0000 !! #01 JCN [ BRK ]

	.Controller/key DEI #00 ! .state/trap LDZ #0101 == ;on-button-trap JCN2

	.Controller/key DEI 
		DUP #31 ! ,&no-1 JCN
			( color ) #00 .settings/color STZ ;draw-toolview JSR2 &no-1
		DUP #32 ! ,&no-2 JCN
			( color ) #01 .settings/color STZ ;draw-toolview JSR2 &no-2
		DUP #33 ! ,&no-3 JCN
			( color ) #02 .settings/color STZ ;draw-toolview JSR2 &no-3
		DUP #34 ! ,&no-4 JCN
			( color ) #03 .settings/color STZ ;draw-toolview JSR2 &no-4
		DUP #08 ! ,&no-delete JCN
			( delete ) .settings/focus LDZ2 ;op-shift-memory-left JSR2 ;redraw JSR2 &no-delete
		DUP #0d ! ,&no-insert JCN
			( insert ) .settings/focus LDZ2 ;op-shift-memory-right JSR2 ;redraw JSR2 &no-insert
		DUP #20 ! ,&no-zoom JCN
			( zoom ) .settings/zoom TOGGLE ;redraw JSR2 &no-zoom
		DUP #71 ! ,&no-tool0 JCN
			( tool ) #00 .settings/tool STZ ;redraw JSR2 &no-tool0
		DUP #77 ! ,&no-tool1 JCN
			( tool ) #01 .settings/tool STZ ;redraw JSR2 &no-tool1
		DUP #65 ! ,&no-tool2 JCN
			( tool ) #02 .settings/tool STZ ;redraw JSR2 &no-tool2
	POP

	( release ) #00 .Controller/key DEO

	.Controller/button DEI #f0 AND
		DUP #04 SFT #01 AND #01 ! ,&no-up JCN
			( clamp ) .settings/focus LDZ2 BANK HOR TOS #0010 ** ++ << ,&no-up JCN
			( up )    .settings/focus LDZ2 #0010 HOR TOS ** -- .settings/focus STZ2 &no-up
		DUP #05 SFT #01 AND #01 ! ,&no-down JCN
			( clamp ) .settings/focus LDZ2 BANK LENGTH HOR TOS #0010 ** -- ++ >> ,&no-down JCN
			( down )  .settings/focus LDZ2 #0010 HOR TOS ** ++ .settings/focus STZ2 &no-down
		DUP #06 SFT #01 AND #01 ! ,&no-left JCN
			( clamp ) .settings/focus LDZ2 BANK #0001 ++ << ,&no-left JCN
			( left )  .settings/focus LDZ2 #0010 -- .settings/focus STZ2 &no-left
		DUP #07 SFT #01 AND #01 ! ,&no-right JCN
			( clamp ) .settings/focus LDZ2 BANK LENGTH #0020 -- ++ >> ,&no-right JCN
			( right ) .settings/focus LDZ2 #0010 ++ .settings/focus STZ2 &no-right
	POP

	;redraw JSR2 

BRK

@on-button-trap ( -> )

	( enter )
	.Controller/key DEI #0d ! ,&no-edit-enter JCN
		#00 .state/trap STZ
		#23 ;draw-filepath JSR2
		BRK
		&no-edit-enter
	( backspace )
	.Controller/key DEI #08 ! ,&no-edit-backspace JCN
		.path/length LDZ #00 = ,&edit-end JCN
		.path/length LDZ #01 - .path/length STZ
		#00 .path/name .path/length LDZ + STZ
		#23 ;draw-filepath JSR2
		BRK
		&no-edit-backspace
	( default )
	.path/length LDZ #1f = ,&edit-end JCN
		.Controller/key DEI .path/name .path/length LDZ + STZ
		.path/length LDZ #01 + .path/length STZ
	&edit-end
	#00 .path/name .path/length LDZ + STZ

BRK

@on-mouse ( -> )
	
	;draw-cursor JSR2

	( skip ) .Mouse/state DEI #00 ! #01 JCN [ BRK ]

	.Mouse/x DEI2 .Mouse/y DEI2 .tileview ;within-rect JSR2
		;on-touch-tileview JCN2
	.Mouse/x DEI2 .Mouse/y DEI2 .toolview ;within-rect JSR2
		;on-touch-toolview JCN2
	.Mouse/x DEI2 .Mouse/y DEI2 .blendview ;within-rect JSR2
		;on-touch-blendview JCN2
	.Mouse/x DEI2 .Mouse/y DEI2 .colorview ;within-rect JSR2
		;on-touch-colorview JCN2
	.Mouse/x DEI2 .Mouse/y DEI2 .preview ;within-rect JSR2
		;on-touch-preview JCN2
	.Mouse/x DEI2 .Mouse/y DEI2 .zoomview ;within-rect JSR2
		;on-touch-zoomview JCN2

BRK

@on-touch-tileview ( -> )
	
	.Mouse/x DEI2 .tileview/x1 LDZ2 -- 
	.Mouse/y DEI2 .tileview/y1 LDZ2 -- 

	.settings/zoom LDZ #01 ! ,&no-zoom JCN
		#0008 // SWP2 #0008 // SWP2
		GET-POSITION ADD-POSITIONS
		#00 .Mouse/state DEI #10 = ,&do-erase-zoom JCN 
			POP .settings/color LDZ &do-erase-zoom 
			;put-pixel JSR2
			;redraw JSR2
		BRK
	&no-zoom

	.settings/tool LDZ
	DUP #00 ! ,&no-brush JCN
		POP
		#00 .Mouse/state DEI #10 = ,&do-erase JCN 
			POP .settings/color LDZ &do-erase 
		;put-pixel JSR2
		;draw-tileview JSR2 
		;draw-preview JSR2
		BRK &no-brush
	DUP #01 ! ,&no-selector JCN
		POP
		;get-tile-addr JSR2 .settings/focus STZ2
		;redraw JSR2
		BRK &no-selector
	DUP #02 ! ,&no-copy JCN
		POP
		;get-tile-addr JSR2
		.settings/focus LDZ2 SWP2
		;op-copy-tile JSR2
		;redraw JSR2
		RELEASE-MOUSE
		BRK &no-copy
	POP
	POP2 POP2

BRK

@on-touch-toolview ( -> )
	
	.Mouse/x DEI2 .toolview/x1 LDZ2 -- #0008 // TOB
	
	DUP HOR SWP - #01 ! ,&no-save JCN
		;save-file JSR2
		&no-save
	DUP HOR SWP - #03 ! ,&no-load JCN
		;load-file JSR2
		;redraw JSR22
		&no-load
	DUP HOR SWP - #04 ! ,&no-name JCN
		#20 ;draw-filepath JSR2
		;blank-txt ;new-file JSR2
		;redraw JSR2
		&no-name
	DUP #07 ! ,&no-zoom JCN
		.settings/zoom TOGGLE
		;draw-tileview JSR2
		;draw-toolview JSR2
		&no-zoom
	DUP #08 > OVR HOR SWP - #05 > #0101 !! ,&no-rename JCN
		.state/trap TOGGLE
		#00 .state/blink STZ 
		#23 ;draw-filepath JSR2
		&no-rename
	DUP #01 + .settings/color LDZ ! ,&no-eraser JCN
		#00 .settings/color STZ
		;draw-colorview JSR2
		;draw-toolview JSR2 
		POP RELEASE-MOUSE BRK
		&no-eraser
	DUP #02 > ,&no-color JCN
		DUP #01 + .settings/color STZ
		;draw-colorview JSR2
		;draw-toolview JSR2 
		POP RELEASE-MOUSE BRK
		&no-color
	DUP #06 > ,&no-tool JCN
		DUP #03 = ,&end JCN
		DUP #04 - .settings/tool STZ
		;draw-toolview JSR2 
		POP RELEASE-MOUSE BRK
		&no-tool
	POP
	&end

	RELEASE-MOUSE

BRK

@on-touch-zoomview ( -> )
	
	.Mouse/y DEI2 .zoomview/y1 LDZ2 -- #0008 // TOB #04 ! ;&no-mod JCN2
		.Mouse/x DEI2 .zoomview/x1 LDZ2 -- #0008 // TOB 
		DUP #00 = .Mouse/state DEI #01 = #0101 !! ,&no-shiftup JCN
			.settings/focus LDZ2 
			DUP2 ;op-shift-tile-up JSR2
			#0008 ++ ;op-shift-tile-up JSR2 &no-shiftup
		DUP #00 = .Mouse/state DEI #10 = #0101 !! ,&no-shiftdown JCN
			.settings/focus LDZ2 
			DUP2 ;op-shift-tile-down JSR2
			#0008 ++ ;op-shift-tile-down JSR2 &no-shiftdown
		DUP #01 = .Mouse/state DEI #01 = #0101 !! ,&no-shiftright JCN
			.settings/focus LDZ2 
			DUP2 ;op-shift-tile-right JSR2
			#0008 ++ ;op-shift-tile-right JSR2 &no-shiftright
		DUP #01 = .Mouse/state DEI #10 = #0101 !! ,&no-shiftleft JCN
			.settings/focus LDZ2 
			DUP2 ;op-shift-tile-left JSR2
			#0008 ++ ;op-shift-tile-left JSR2 &no-shiftleft
		POP
		RELEASE-MOUSE
		,&finish JMP
	&no-mod

	( paint )
	.Mouse/x DEI2 .zoomview/x1 LDZ2 -- #0004 //
	.Mouse/y DEI2 .zoomview/y1 LDZ2 -- #0004 // 
	.settings/focus LDZ2 ++
	( detect erase )
	#00 .Mouse/state DEI #10 = ,&do-erase JCN 
		POP .settings/color LDZ &do-erase 
	STH
	OVR2 OVR2
		STHkr #00 ;toggle-pixel JSR2
	#0008 ++ 
		STHr #01 ;toggle-pixel JSR2

	&finish

	;redraw JSR2

BRK

@on-touch-blendview ( -> )

	.Mouse/x DEI2 .blendview/x1 LDZ2 -- #0008 // TOB
	.Mouse/y DEI2 .blendview/y1 LDZ2 -- #0008 // TOB #04 * +
	.settings/blending STZ

	;redraw JSR2

	RELEASE-MOUSE

BRK

@on-touch-colorview ( -> )
	
	.Mouse/y DEI2 .colorview/y1 LDZ2 -- #0008 // TOB

	DUP #00 ! ,&no-r JCN
		.System/r STHk ,&set-color JSR 
		STHr [ .settings/color LDZ #02 / + ] DEO
		&no-r
	DUP #01 ! ,&no-g JCN
		.System/g STHk ,&set-color JSR 
		STHr [ .settings/color LDZ #02 / + ] DEO
		&no-g
	DUP #02 ! ,&no-b JCN
		.System/b STHk ,&set-color JSR 
		STHr [ .settings/color LDZ #02 / + ] DEO
		&no-b
	POP

	;redraw JSR2 

	BRK

	&set-color
		.settings/color LDZ STHk #02 / + DEI 
		STHr #02 MOD STHk 
		#0f SWP [ #40 * SFT ] AND 
		STHr #00 = 
		.Mouse/x DEI2 .colorview/x1 LDZ2 -- #0002 // TOB 
		( clamp to #0f ) DUP #10 = #01 * - 
		SWP [ #40 * SFT ] +
	RTN

BRK

@on-touch-preview ( -> )

	( y ) .Mouse/y DEI2 .preview/y1 LDZ2 -- #0008 // TOB
	( x ) .Mouse/x DEI2 .preview/x1 LDZ2 -- #0008 // TOB

	#40 SFT + #11 +
	.settings/ratio STZ

	;redraw JSR2

	RELEASE-MOUSE

BRK

( operations )

@op-clear ( addr* length* -- )
	
	OVR2 ++
	&loop
		OVR2 #00 ROT ROT STA
		INCR2
		NEQ2k ,&loop JCN
	POP2 POP2

RTN

@op-shift-memory-left ( addr* -- )

	DUP2 LENGTH ++
	&loop
		OVR2 #0010 ++ LDA STH
		OVR2 STHr ROT ROT STA
		INCR2
		NEQ2k ,&loop JCN
	POP2 POP2
	
RTN

@op-shift-memory-right ( addr* -- )

	DUP2 LENGTH ++ SWP2 #0001 --
	&loop
		OVR2 LDA STH
		OVR2 #0010 ++ STHr ROT ROT STA
		DECR2
		NEQ2k ,&loop JCN
	POP2 POP2
	
RTN

@op-shift-tile-up ( addr* -- )
	
	STH2
	STH2kr LDA
	STH2kr #0001 ++ LDA STH2kr STA
	STH2kr #0002 ++ LDA STH2kr #0001 ++ STA
	STH2kr #0003 ++ LDA STH2kr #0002 ++ STA
	STH2kr #0004 ++ LDA STH2kr #0003 ++ STA
	STH2kr #0005 ++ LDA STH2kr #0004 ++ STA
	STH2kr #0006 ++ LDA STH2kr #0005 ++ STA
	STH2kr #0007 ++ LDA STH2kr #0006 ++ STA
	STH2r #0007 ++ STA

RTN

@op-shift-tile-down ( addr* -- )
	
	STH2
	STH2kr #0007 ++ LDA
	STH2kr #0006 ++ LDA STH2kr #0007 ++ STA
	STH2kr #0005 ++ LDA STH2kr #0006 ++ STA
	STH2kr #0004 ++ LDA STH2kr #0005 ++ STA
	STH2kr #0003 ++ LDA STH2kr #0004 ++ STA
	STH2kr #0002 ++ LDA STH2kr #0003 ++ STA
	STH2kr #0001 ++ LDA STH2kr #0002 ++ STA
	STH2kr LDA STH2kr #0001 ++ STA
	STH2r STA

RTN

@op-shift-tile-left ( addr* -- )
	
	STH2
	#00 #08
	&loop
		OVR TOS STH2kr ++ DUP2
		LDA [ ROL ] ROT ROT STA
		INCR
		LTHk ,&loop JCN
	POP2
	POP2r

RTN

@op-shift-tile-right ( addr* -- )
	
	STH2
	#00 #08
	&loop
		OVR TOS STH2kr ++ DUP2
		LDA [ ROR ] ROT ROT STA
		INCR
		LTHk ,&loop JCN
	POP2
	POP2r

RTN

@op-copy-tile ( from* to* -- )
	
	STH2 STH2
	#00 #10
	&loop
		( get )
		OVR TOS DUP2 STH2kr ++ LDA 
		( put )
		ROT ROT SWP2r STH2kr SWP2r ++ STA
		INCR
		LTHk ,&loop JCN
	POP2
	POP2r POP2r

RTN

@redraw ( -- )
	
	;draw-toolview JSR2 
	;draw-blendview JSR2
	;draw-colorview JSR2
	;draw-dataview JSR2
	;draw-preview JSR2
	;draw-tileview JSR2
	;draw-zoomview JSR2

RTN

@draw-tileview ( -- )
	
	.settings/zoom LDZ ;draw-tileview-zoom JCN2

	#00 VER
	&ver
		OVR DUP #08 * TOS .tileview/y1 LDZ2 ++ .Screen/y DEO2 STH
		#00 HOR
		&hor
			OVR DUP #08 * TOS .tileview/x1 LDZ2 ++ .Screen/x DEO2 STHkr
			TOS ROT TOS SWP2
			HOR TOS ** ++ #0010 **
			BANK ++ [ DUP2 ] .Screen/addr DEO2
			.settings/focus LDZ2 == ( TODO: Highlight full range )
			.settings/blending LDZ +
			.settings/depth LDZ #20 * +
			#20 + .Screen/color DEO
			INCR
			LTHk ,&hor JCN
		POP2
		POPr
		INCR
		LTHk ,&ver JCN
	POP2

RTN

@draw-tileview-zoom ( -- )
	
	( find focus ) GET-POSITION STH2 STH2
	;pixel-icn .Screen/addr DEO2
	#00 VER
	&ver
		OVR #08 * TOS .tileview/y1 LDZ2 ++ .Screen/y DEO2
		#00 HOR
		&hor
			OVR #08 * TOS .tileview/x1 LDZ2 ++ .Screen/x DEO2
			( get pixel offset ) GET-ITERATORS SWP TOS ROT TOS
			( add focus ) STH2kr SWP2r STH2kr SWP2r ADD-POSITIONS
			,get-pixel JSR #20 + .Screen/color DEO
			INCR
			LTHk ,&hor JCN
		POP2
		INCR
		LTHk ,&ver JCN
	POP2
	POP2r POP2r

RTN

@get-pixel ( x* y* -- color )
	
	( channel 1 )
	OVR2 SWP2 ,get-addr JSR [ STH2k ] LDA
	ROT ROT TOB MOD8 [ STHk ]
	#07 SWP - SFT #01 AND
	( channel 2 )
	[ STHr ] [ STH2r ] #0008 ++ LDA SWP 
	#07 SWP - SFT #01 AND
	#02 * 
	+

RTN

@get-addr ( x* y* -- addr* )
	
	( get row )
	DUP2 #0008 MOD2 
	( get tile )
	SWP2 #0008 // WIDTH #0002 ** ** ++
	SWP2 STEP8 #0002 ** ++ 
	BANK ++

RTN

@put-pixel ( x* y* color -- )

	STH
	OVR2 SWP2 ,get-addr JSR 
	( ch1 )
	OVR2 OVR2
		STHkr #00 ,toggle-pixel JSR
	( ch2 )
	#0008 ++ 
		STHr #01 ,toggle-pixel JSR

RTN

@toggle-pixel ( x* addr* color* -- )
	
	STH2
	DUP2 LDA
	STH SWP2 TOB
	STHr SWP 
	STH2r SFT #01 AND ,&do-set JCN
		( mask ) #01 #07 ROT MOD8 - SFL #ff EOR AND
		( save ) ROT ROT STA
		RTN
	&do-set
		( mask ) #01 #07 ROT MOD8 - SFL ORA
		( save ) ROT ROT STA

RTN

@get-tile-addr ( x* y* -- addr* )
	
	STEP8 WIDTH ** #0004 // SWP2
	STEP8 #0002 ** ++
	BANK ++

RTN

@draw-toolview ( -- )
		
	.toolview/y1 LDZ2 .Screen/y DEO2
	.toolview/x1 LDZ2 .Screen/x DEO2

	( colors )
	;circle-icns [ .settings/color LDZ #01 = TOS #0008 ** ] ++ .Screen/addr DEO2
	#21 .Screen/color DEO
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;circle-icns [ .settings/color LDZ #02 = TOS #0008 ** ] ++ .Screen/addr DEO2
	#22 .Screen/color DEO
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;circle-icns [ .settings/color LDZ #03 = TOS #0008 ** ] ++ .Screen/addr DEO2
	#23 .Screen/color DEO

	( tools )
	.Screen/x DEI2 #0010 ++ .Screen/x DEO2
	;brush-icn .Screen/addr DEO2
	#21 .settings/tool LDZ #00 = + .Screen/color DEO
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;tool-selector .Screen/addr DEO2
	#21 .settings/tool LDZ #01 = + .Screen/color DEO
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;tool-hand .Screen/addr DEO2
	#21 .settings/tool LDZ #02 = + .Screen/color DEO

	( misc )
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;zoom-icns [ .settings/zoom LDZ TOS #0008 ** ++ ] .Screen/addr DEO2
	#21 .Screen/color DEO

	( file i/o )
	.toolview/x2 LDZ2 #0008 -- .Screen/x DEO2
	;save-icn .Screen/addr DEO2
	#21 .Screen/color DEO
	.Screen/x DEI2 #0010 -- .Screen/x DEO2
	;load-icn .Screen/addr DEO2
	#21 .Screen/color DEO
	.Screen/x DEI2 #0008 -- .Screen/x DEO2
	;make-icn .Screen/addr DEO2
	#21 .Screen/color DEO

	( filepath )
	#23 ;draw-filepath JSR2

RTN

@draw-blendview ( -- )
	
	( value )
	.blendview/x1 LDZ2 .Screen/x DEO2
	.blendview/y2 LDZ2 #0001 ++ .Screen/y DEO2
	( get blending ) .settings/blending LDZ
	( get depth ) .settings/depth LDZ #20 *
	( draw ) #20 + + #21 ;draw-byte JSR2

	.settings/focus LDZ2 .Screen/addr DEO2
	#00 #10
	&loop
		OVR #04 MOD #00 SWP #0008 ** .blendview/x1 LDZ2 ++ .Screen/x DEO2
		OVR #04 / #00 SWP #0008 ** .blendview/y1 LDZ2 ++ .Screen/y DEO2
		#20 .Screen/color DEO
		OVR #20 + .settings/depth LDZ #20 * + .Screen/color DEO
		INCR
		LTHk ,&loop JCN
	POP2

RTN

@draw-filepath ( color -- )
	
	STH
	.toolview/x1 LDZ2 #0048 ++ .Screen/x DEO2
	.toolview/y1 LDZ2 .Screen/y DEO2
	;path/name
	&loop
		DUP2 LDA DUP #00 ! #20 * - TOS #0008 ** ;font ++ .Screen/addr DEO2 
		STHkr .Screen/color DEO
		.Screen/x DEI2 #0008 ++ .Screen/x DEO2
		#0001 ++
		LDAk #00 ! ,&loop JCN
	POP2
	POPr
	( clear last ) 
	#20 .Screen/color DEO

RTN

@draw-preview ( -- )

	( value )
	.preview/x1 LDZ2 .Screen/x DEO2
	.preview/y2 LDZ2 #0001 ++ .Screen/y DEO2
	.settings/ratio LDZ #22 ;draw-byte JSR2

	( stash address )
	.settings/focus LDZ2 STH2k .Screen/addr DEO2
	#00 #04
	&ver
		OVR #08 * TOS .preview/y1 LDZ2 ++ .Screen/y DEO2
		#00 #04
		&hor
			OVR #08 * TOS .preview/x1 LDZ2 ++ .Screen/x DEO2
			( get x,y )
			GET-ITERATORS
			( check if within ratio )
			.settings/ratio LDZ #0f AND < STH
			.settings/ratio LDZ #04 SFT < STHr
			#0101 !! ,&outside JCN 
				( get tile ) STH2kr .Screen/addr DEO2
				( get blending ) .settings/blending LDZ
				( get depth ) .settings/depth LDZ #20 *
				( draw ) #20 + + .Screen/color DEO
				( incr ) STH2r #0008 [ .settings/depth LDZ #08 * TOS ++ ] ++ STH2
				,&resume JMP
			&outside
			;halftone-icn .Screen/addr DEO2
			#23 .Screen/color DEO
			&resume
			( incr ) INCR
			LTHk ,&hor JCN
		POP2
		( incr ) INCR
		LTHk ;&ver JCN2
	POP2
	POP2r

RTN

@draw-colorview ( -- )
	
	.colorview/y2 LDZ2 #0001 ++ .Screen/y DEO2
	.colorview/x1 LDZ2 .Screen/x DEO2
	;font-hex [ .System/r GET-COLOR ] TOS #0008 ** ++ .Screen/addr DEO2
	#20 .settings/color LDZ + .Screen/color DEO
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;font-hex [ .System/g GET-COLOR ] TOS #0008 ** ++ .Screen/addr DEO2
	#20 .settings/color LDZ + .Screen/color DEO
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;font-hex [ .System/b GET-COLOR ] TOS #0008 ** ++ .Screen/addr DEO2
	#20 .settings/color LDZ + .Screen/color DEO

	.colorview/x1 LDZ2 .colorview/y1 LDZ2 
		[ .System/r GET-COLOR ] ,draw-slider JSR
	.colorview/x1 LDZ2 .colorview/y1 LDZ2 #0008 ++
		[ .System/g GET-COLOR ] ,draw-slider JSR
	.colorview/x1 LDZ2 .colorview/y1 LDZ2 #0010 ++
		[ .System/b GET-COLOR ] ,draw-slider JSR

RTN

@draw-slider ( x* y* value -- )
	
	STH
	.Screen/y DEO2
	.Screen/x DEO2
	#00 #10
	&loop
		OVR STHkr > #08 * TOS ;slider-icns ++ .Screen/addr DEO2
		#22 .Screen/color DEO
		.Screen/x DEI2 #0002 ++ .Screen/x DEO2
		INCR
		LTHk ,&loop JCN
	POP2
	POPr

RTN

@draw-dataview ( -- )
	
	( position )
	.dataview/x1 LDZ2 .Screen/x DEO2
	.dataview/y2 LDZ2 #0001 ++ .Screen/y DEO2
	.settings/focus LDZ2 BANK -- #22 ;draw-short JSR2

	( depth1 )
	#00 #04
	&loop
		.dataview/x1 LDZ2 .Screen/x DEO2
		OVR #08 * TOS .dataview/y1 LDZ2 ++ .Screen/y DEO2
		OVR #02 * TOS .settings/focus LDZ2 ++ LDA2 #23 ;draw-short JSR2
		.dataview/x1 LDZ2 #0020 ++ .Screen/x DEO2
		OVR #02 * TOS .settings/focus LDZ2 ++ #0008 ++ LDA2 #23 ;draw-short JSR2
		INCR
		LTHk ,&loop JCN
	POP2

RTN

@draw-zoomview ( -- )

	;bigpixel-icn .Screen/addr DEO2
	#00 #08
	&ver
		OVR #04 * TOS .zoomview/y1 LDZ2 ++ .Screen/y DEO2
		#00 #08
		&hor
			OVR #04 * TOS .zoomview/x1 LDZ2 ++ .Screen/x DEO2
			( get pixel )
			GET-ITERATORS
			( ch 1 )
			TOS .settings/focus LDZ2 ++ [ STH2k ] LDA
			SWP [ STHk ] #07 SWP - SFT #01 AND
			( ch2 )
			[ STHr ] [ STH2r ] #0008 ++ LDA SWP 
			#07 SWP - SFT #01 AND
			#02 * +
			#20 + .Screen/color DEO
			INCR
			LTHk ,&hor JCN
		POP2
		INCR
		LTHk ,&ver JCN
	POP2

	( effects )
	.zoomview/y1 LDZ2 #0021 ++ .Screen/y DEO2
	.zoomview/x1 LDZ2 .Screen/x DEO2
	;opshift-icn .Screen/addr DEO2
	#21 .Screen/color DEO

	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;oproll-icn .Screen/addr DEO2
	#21 .Screen/color DEO

RTN

@draw-cursor ( -- )

	( clear last cursor )
	.pointer/x LDZ2 .Screen/x DEO2
	.pointer/y LDZ2 .Screen/y DEO2
	#30 .Screen/color DEO

	( record mouse positions )
	.Mouse/x DEI2 .pointer/x STZ2
	.Mouse/y DEI2 .pointer/y STZ2

	( draw new cursor )
	.pointer/x LDZ2 .Screen/x DEO2
	.pointer/y LDZ2 .Screen/y DEO2
	;brush-icn #00 .settings/tool LDZ #08 * ++ .Screen/addr DEO2
	#32 .Mouse/state DEI #00 ! + .Screen/color DEO

RTN

@draw-byte ( byte color -- )
	
	STH STH
	;font-hex #00 STHkr #f0 AND #04 SFT #08 * ++ .Screen/addr DEO2
	( draw ) OVRr STHr .Screen/color DEO
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	;font-hex #00 STHr #0f AND #08 * ++ .Screen/addr DEO2
	( draw ) STHr .Screen/color DEO

RTN

@draw-short ( short* color -- )

	STH SWP 
	DUP #04 SFT TOS #0008 ** ;font-hex ++ .Screen/addr DEO2
	( draw ) STHkr .Screen/color DEO
	#0f AND TOS #0008 ** ;font-hex ++ .Screen/addr DEO2
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	( draw ) STHkr .Screen/color DEO
	DUP #04 SFT TOS #0008 ** ;font-hex ++ .Screen/addr DEO2
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	( draw ) STHkr .Screen/color DEO
	#0f AND TOS #0008 ** ;font-hex ++ .Screen/addr DEO2
	.Screen/x DEI2 #0008 ++ .Screen/x DEO2
	( draw ) STHr .Screen/color DEO

RTN

@new-file ( default* -- )
	
	BANK LENGTH ;op-clear JSR2
	STH2
	#00 #0c
	&loop
		OVR DUP TOS STH2kr ++ LDA
		SWP .path/name + STZ
		INCR
		LTHk ,&loop JCN
	.path/length STZ POP 
	POP2r
	;load-file JSR2

RTN

@load-file ( -- )

	BANK LENGTH ;op-clear JSR2
	;path/name .File/name DEO2 
	#2000 .File/length DEO2 
	BANK .File/load DEO2

RTN

@save-file ( -- )

	;path/name .File/name DEO2 
	#2000 .File/length DEO2 
	BANK .File/save DEO2

RTN

@within-rect ( x* y* rect -- flag )
	
	STH
	( y < rect.y1 ) DUP2 STHkr #02 ADD LDZ2 LTH2 ,&skip JCN
	( y > rect.y2 ) DUP2 STHkr #06 ADD LDZ2 GTH2 ,&skip JCN
	SWP2
	( x < rect.x1 ) DUP2 STHkr LDZ2 LTH2 ,&skip JCN
	( x > rect.x2 ) DUP2 STHkr #04 ADD LDZ2 GTH2 ,&skip JCN
	POP2 POP2 POPr
	#01 
RTN
	&skip
	POP2 POP2 POPr
	#00

RTN

@brush-icn     8040 e070 381c 0c00
@tool-selector 80c0 e0f0 f8e0 1000
@tool-hand     2020 20b8 7c7c 3838
@halftone-icn  aa55 aa55 aa55 aa55
@pixel-icn     7cfe fefe fefe 7c00
@bigpixel-icn  f0f0 f0f0 0000 0000

@opshift-icn   0010 387c fe10 1000
@oproll-icn    0008 0c0e 7f0e 0c08

@save-icn      1054 28c6 2854 1000 
@make-icn      fe82 8282 848a f400 
@load-icn      feaa d6aa d4aa f400 

@untitled-txt  "untitled.chr $1
@blank-txt     "blank.chr $1

@slider-icns
	f0f0 f0f0 f0f0 f000 ( full )
	50a0 50a0 50a0 5000 ( empty )
@circle-icns
	3844 8282 8244 3800 ( full )
	387c fefe fe7c 3800 ( line )
@zoom-icns
	3048 8484 4834 0200 ( in )
	3245 8284 4834 0200 ( out )
@font-hex
	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 
@font ( specter8-frag font )
	0000 0000 0000 0000 0008 0808 0800 0800
	0014 1400 0000 0000 0024 7e24 247e 2400
	0008 1e28 1c0a 3c08 0000 2204 0810 2200
	0030 4832 4c44 3a00 0008 1000 0000 0000
	0004 0808 0808 0400 0020 1010 1010 2000
	0000 2214 0814 2200 0000 0808 3e08 0800
	0000 0000 0000 0810 0000 0000 3e00 0000
	0000 0000 0000 0800 0000 0204 0810 2000
	003c 464a 5262 3c00 0018 0808 0808 1c00
	003c 4202 3c40 7e00 003c 421c 0242 3c00
	000c 1424 447e 0400 007e 407c 0242 3c00
	003c 407c 4242 3c00 007e 0204 0810 1000
	003c 423c 4242 3c00 003c 4242 3e02 3c00
	0000 0010 0000 1000 0000 1000 0010 1020
	0000 0810 2010 0800 0000 003e 003e 0000
	0000 1008 0408 1000 003c 420c 1000 1000
	003c 4232 4a42 3c00 003c 4242 7e42 4200
	007c 427c 4242 7c00 003c 4240 4042 3c00
	007c 4242 4242 7c00 007e 4078 4040 7e00
	007e 4078 4040 4000 003c 4240 4642 3c00
	0042 427e 4242 4200 001c 0808 0808 1c00
	007e 0202 0242 3c00 0042 4478 4442 4200
	0040 4040 4040 7e00 0042 665a 4242 4200
	0042 6252 4a46 4200 003c 4242 4242 3c00
	007c 4242 7c40 4000 003c 4242 4244 3a00
	007c 4242 7c44 4200 003e 403c 0242 3c00
	007e 0808 0808 1000 0042 4242 4244 3a00
	0042 4242 4224 1800 0042 4242 5a66 4200
	0042 423c 4242 4200 0042 423e 0242 3c00
	007e 020c 3040 7e00 000c 0808 0808 0c00
	0040 2010 0804 0200 0030 1010 1010 3000
	0008 1400 0000 0000 0000 0000 0000 7e00
	0008 0400 0000 0000 0000 3c02 3e42 3a00
	0040 407c 4242 7c00 0000 3c42 4042 3c00
	0002 023e 4242 3e00 0000 3c42 7e40 3e00
	0000 3e40 7840 4000 0000 3c42 3e02 3c00
	0040 405c 6242 4200 0008 0018 0808 0400
	0008 0018 0808 4830 0040 4244 7844 4200
	0010 1010 1010 0c00 0000 6c52 5252 5200
	0000 5c62 4242 4200 0000 3c42 4242 3c00
	0000 7c42 427c 4040 0000 3e42 423e 0202
	0000 5c62 4040 4000 0000 3e40 3c02 7c00
	0008 7e08 0808 1000 0000 4242 4244 3a00
	0000 4242 4224 1800 0000 5252 5252 2e00
	0000 4224 1824 4200 0000 4242 3e02 7c00
	0000 7e02 3c40 7e00 000c 0810 1008 0c00
	0008 0808 0808 0800 0030 1008 0810 3000
	0000 0032 4c00 0000 3c42 99a1 a199 423c