~rabbits/uxn

42aab23dc17679b1eebd29eacd11bdb3e3215e7b — Andrew Alderwick 3 months ago 5eadd76
Remove many macros.
M projects/examples/demos/snake.tal => projects/examples/demos/snake.tal +30 -40
@@ 1,16 1,5 @@
( uxnasm projects/examples/demos/snake.tal bin/snake.rom && uxnemu bin/snake.rom )

%2/  { #01 SFT } %2* { #10 SFT }
%8//  { #03 SFT2 } %8**  { #30 SFT2 }
%MOD { DIVk MUL SUB }
%MAX { LTHk JMP SWP POP }
%RTN { JMP2r }
%TOS { #00 SWP }
%BRK? { #01 JCN BRK }


%DIFFICULTY { #06 }

( devices )

|00 @System     [ &vector $2 &wst      $1 &rst    $1 &pad   $4 &r      $2 &g      $2 &b    $2 &debug  $1 &halt $1 ]


@@ 51,8 40,8 @@
	#0100 .Screen/height DEO2

	( set arena )
	.Screen/width DEI2 8// NIP .arena/w STZ
	.Screen/height DEI2 8// NIP .arena/h STZ
	.Screen/width DEI2 #03 SFT2 NIP .arena/w STZ
	.Screen/height DEI2 #03 SFT2 NIP .arena/h STZ

	;reset JSR2



@@ 61,7 50,8 @@ BRK
@on-frame ( -> )

	.arena/timer LDZ INC DUP .arena/timer STZ
		DIFFICULTY EQU BRK?
		#06 ( difficulty - lower value produces faster gameplay )
		EQU JMP BRK

	( clear ) #00 ;draw-snake JSR2
	( update ) ;move JSR2


@@ 90,8 80,8 @@ BRK
	#00 ;draw-snake JSR2
	#00 ;draw-apple JSR2

	.arena/w LDZ 2/ #01 SUB .snake/x STZ
	.arena/h LDZ 2/ #01 SUB .snake/y STZ
	.arena/w LDZ #01 SFT #01 SUB .snake/x STZ
	.arena/h LDZ #01 SFT #01 SUB .snake/y STZ
	#00 .snake/dead STZ
	#00 .snake/length STZ
	#00 .snake/direction STZ


@@ 99,7 89,7 @@ BRK
	#03 ;draw-snake JSR2
	;add-apple JSR2

RTN
JMP2r

@move ( -- )



@@ 107,33 97,33 @@ RTN
	.snake/x LDZ2 STH2
	.snake/length LDZ #00
	&loop
		( pop ) DUP 2* .snake/tail ADD LDZ2 STH2 SWP2r
		( push ) DUP 2* .snake/tail ADD STH2r ROT STZ2
		( pop ) DUPk ADD .snake/tail ADD LDZ2 STH2 SWP2r
		( push ) DUPk ADD .snake/tail ADD STH2r ROT STZ2
		INC GTHk ,&loop JCN
	POP2
	POP2r

	.snake/dead LDZ #00 EQU JMP RTN
	.snake/dead LDZ #00 EQU JMP JMP2r

	.snake/direction LDZ
	DUP #01 NEQ ,&no-up JCN
		.snake/y LDZ #01 SUB
			.arena/h LDZ MAX
			.arena/h LDZ LTHk JMP SWP POP
			.snake/y STZ
		&no-up
	DUP #02 NEQ ,&no-down JCN
		.snake/y LDZ INC
			.arena/h LDZ MOD
			.arena/h LDZ DIVk MUL SUB
			.snake/y STZ
		&no-down
	DUP #04 NEQ ,&no-left JCN
		.snake/x LDZ #01 SUB
			.arena/w LDZ MAX
			.arena/w LDZ LTHk JMP SWP POP
			.snake/x STZ
		&no-left
	DUP #08 NEQ ,&no-right JCN
		.snake/x LDZ INC 
			.arena/w LDZ MOD
			.arena/w LDZ DIVk MUL SUB
			.snake/x STZ
		&no-right
	POP


@@ 148,7 138,7 @@ RTN

	.snake/length LDZ #01
	&loop-body
		( pop ) DUP 2* .snake/tail ADD LDZ2
		( pop ) DUPk ADD .snake/tail ADD LDZ2
		.snake/x LDZ2 NEQ2 ,&no-collision-body JCN
			#01 .snake/dead STZ
			#03 ;draw-snake JSR2


@@ 156,16 146,16 @@ RTN
		INC GTHk ,&loop-body JCN
	POP2

RTN
JMP2r

@add-apple ( -- )

	.DateTime/hour DEI2 .DateTime/minute DEI2 MUL2 #1234 MUL2 ADD
		.arena/w LDZ MOD .apple/x STZ
		.arena/w LDZ DIVk MUL SUB .apple/x STZ
	.DateTime/hour DEI2 .DateTime/minute DEI2 MUL2 #abcd MUL2 ADD
		.arena/h LDZ MOD .apple/y STZ
		.arena/h LDZ DIVk MUL SUB .apple/y STZ

RTN
JMP2r

@draw-snake ( color -- )



@@ 174,41 164,41 @@ RTN
	;snake-icns .Screen/addr DEO2
	.snake/length LDZ #00
	&loop
		DUP 2* .snake/tail ADD LDZ TOS 8** .Screen/x DEO2
		DUP 2* .snake/tail ADD INC LDZ TOS 8** .Screen/y DEO2
		DUPk ADD .snake/tail ADD LDZ #0005 SFT2 .Screen/x DEO2
		DUPk ADD .snake/tail ADD INC LDZ #0005 SFT2 .Screen/y DEO2
		STHkr .Screen/sprite DEO
		INC GTHk ,&loop JCN
	POP2
	( draw head )
	.snake/x LDZ TOS 8** .Screen/x DEO2
	.snake/y LDZ TOS 8** .Screen/y DEO2
	.snake/x LDZ #0005 SFT2 .Screen/x DEO2
	.snake/y LDZ #0005 SFT2 .Screen/y DEO2
	;snake-icns/face .Screen/addr DEO2
	STHr .Screen/sprite DEO

RTN
JMP2r

@draw-apple ( color -- )

	.apple/x LDZ TOS 8** .Screen/x DEO2
	.apple/y LDZ TOS 8** .Screen/y DEO2
	.apple/x LDZ #0005 SFT2 .Screen/x DEO2
	.apple/y LDZ #0005 SFT2 .Screen/y DEO2
	;apple-chr .Screen/addr DEO2
	.Screen/sprite DEO

RTN
JMP2r

@draw-score ( score color -- )

	STH
	#0010 .Screen/x DEO2
	#0010 .Screen/y DEO2
	DUP #04 SFT TOS 8** ;font-hex ADD2 .Screen/addr DEO2
	DUP #04 SFT #0005 SFT2 ;font-hex ADD2 .Screen/addr DEO2
	.Screen/x DEI2 #0008 ADD2 .Screen/x DEO2
		( draw ) STHkr .Screen/sprite DEO
	#0f AND TOS 8** ;font-hex ADD2 .Screen/addr DEO2
	#0f AND #0005 SFT2 ;font-hex ADD2 .Screen/addr DEO2
	.Screen/x DEI2 #0008 ADD2 .Screen/x DEO2
		( draw ) STHr .Screen/sprite DEO

RTN
JMP2r

( assets )


M projects/examples/devices/audio.channels.tal => projects/examples/devices/audio.channels.tal +1 -3
@@ 1,7 1,5 @@
( dev/audio )

%MOD { DIVk MUL SUB }

( devices )

|00 @System     [ &vector $2 &pad      $6 &r      $2 &g     $2 &b      $2 ]


@@ 57,7 55,7 @@ BRK
	( skip ) .timer LDZ #10 EQU #01 JCN [ BRK ]

	( get note )
	.counter LDZ #18 MOD #30 ADD 
	.counter LDZ #18 DIVk MUL SUB #30 ADD 
		.Audio0/pitch .counter LDZ #03 AND #40 SFT ADD DEO

	.counter LDZ INC .counter STZ

M projects/examples/old/dungeon.tal => projects/examples/old/dungeon.tal +14 -24
@@ 1,15 1,5 @@
( art by @ritualdust )

%8** { #30 SFT2 }
%10** { #40 SFT2 }

%DEBUG  { ;print-hex JSR2 #0a .Console/write DEO }
%DEBUG2 { SWP ;print-hex JSR2 ;print-hex JSR2 #0a .Console/write DEO }

%RTN { JMP2r }
%TOS { #00 SWP }
%DEC { #01 SUB }

%MOUSE { #82 }

( devices )


@@ 65,7 55,7 @@ BRK
	DUP #10 NEQ ,&no-up JCN
		#00 .player/d STZ
		#00 ;draw-mouse JSR2
		.player/y LDZk DEC SWP STZ
		.player/y LDZk #01 SUB SWP STZ
		MOUSE ;draw-mouse JSR2
		&no-up
	DUP #20 NEQ ,&no-down JCN


@@ 77,7 67,7 @@ BRK
	DUP #40 NEQ ,&no-left JCN
		#02 .player/d STZ
		#00 ;draw-mouse JSR2
		.player/x LDZk DEC SWP STZ
		.player/x LDZk #01 SUB SWP STZ
		MOUSE ;draw-mouse JSR2
		&no-left
	DUP #80 NEQ ,&no-right JCN


@@ 98,24 88,24 @@ BRK

@draw-mouse ( color -- )

	;spritesheet #29 .player/d LDZ ADD TOS DUP2 DEBUG2 10** ADD2 .Screen/addr DEO2
	.player/x LDZ TOS 8** .room/x LDZ2 ADD2 .Screen/x DEO2
	.player/y LDZ TOS 8** .room/y LDZ2 ADD2 .Screen/y DEO2
	;spritesheet #29 .player/d LDZ ADD #0004 SFT2 ADD2 .Screen/addr DEO2
	.player/x LDZ #0005 SFT2 .room/x LDZ2 ADD2 .Screen/x DEO2
	.player/y LDZ #0005 SFT2 .room/y LDZ2 ADD2 .Screen/y DEO2
	#40 ADD .Screen/sprite DEO

RTN
JMP2r

@draw-dungeon ( stage* -- )

	STH2
	#1000
	&ver
		DUP TOS 8** .room/y LDZ2 ADD2 .Screen/y DEO2
		DUP #0005 SFT2 .room/y LDZ2 ADD2 .Screen/y DEO2
		#1000
		&hor
			DUP TOS 8** .room/x LDZ2 ADD2 .Screen/x DEO2
			( get id ) STH2 DUP STH2r ROT OVR SWP #40 SFT ADD TOS
				( tile ) DUP2 STH2kr ADD2 LDA TOS 10** ;spritesheet ADD2 .Screen/addr DEO2
			DUP #0005 SFT2 .room/x LDZ2 ADD2 .Screen/x DEO2
			( get id ) STH2 DUP STH2r ROT OVR SWP #40 SFT ADD #00 SWP
				( tile ) DUP2 STH2kr ADD2 LDA #0004 SFT2 ;spritesheet ADD2 .Screen/addr DEO2
				( color ) STH2kr #0100 ADD2 ADD2 LDA .Screen/sprite DEO
			INC GTHk ,&hor JCN
		POP2


@@ 123,17 113,17 @@ RTN
	POP2
	POP2r

RTN
JMP2r

@print-hex ( value -- )
	
	STHk #04 SFT ,&parse JSR .Console/write DEO
	STHr #0f AND ,&parse JSR .Console/write DEO
	RTN
	JMP2r
	&parse ( value -- char )
		DUP #09 GTH ,&above JCN #30 ADD RTN &above #09 SUB #60 ADD RTN
		DUP #09 GTH ,&above JCN #30 ADD JMP2r &above #09 SUB #60 ADD JMP2r

RTN
JMP2r

@mouse-icn
	ffff ffff ffff ffff 0000 0000 0000 0000

M projects/library/asma.tal => projects/library/asma.tal +13 -22
@@ 12,12 12,6 @@
)

(
	Common macros for use later on.
)

%asma-IF-ERROR { ;asma/error LDA2 ORA }

(
	Asma's public interface.
	These routines are what are expected to be called from programs that bundle
	Asma into bigger projects.


@@ 32,7 26,7 @@
	;asma-init-first-pass JSR2
	;asma-flush-ignore ;asma/flush-fn STA2
	;asma/src-filename LDA2 ;asma-assemble-file-pass JSR2
	asma-IF-ERROR ,&error JCN
	;asma/error LDA2 ORA ,&error JCN

	;asma-init-next-pass JSR2
	;asma-flush-to-file ;asma/flush-fn STA2


@@ 40,7 34,7 @@
	;asma-flush-to-console ;asma/flush-fn STA2
	&filename-present
	;asma/src-filename LDA2 ;asma-assemble-file-pass JSR2
	asma-IF-ERROR ,&error JCN
	;asma/error LDA2 ORA ,&error JCN

	( flush output buffer )
	;asma-output/ptr LDA2 ;asma-write-buffer SUB2 ;asma/flush-fn LDA2 JSR2


@@ 226,7 220,7 @@
	ROT2 ( func* line^ buf* size^ filename* )
	,file-read-chunks JSR

	asma-IF-ERROR ,&error JCN
	;asma/error LDA2 ORA ,&error JCN

	&error
	POP2 POP2 POP2 POP2 POP2


@@ 318,7 312,7 @@
	LDAk #0a NEQ ( end-chunk* ws-char* not-newline / line^ start-of-token* )
	#00 OVR2 STA
	STH2r ,asma-assemble-token JSR ( end-chunk* ws-char* not-newline / line^ )
	asma-IF-ERROR ,&error JCN
	;asma/error LDA2 ORA ,&error JCN
	,&not-newline JCN
	,asma/lines LDR2 INC2 ,asma/lines STR2
	&not-newline ( end-chunk* ws-char* / line^ )


@@ 362,9 356,9 @@
	asma/state contains several meaningful bits:
	0x02 we are in a comment,
	0x04 we are in a macro body,
	0x10 we are in a macro body that we are ignoring
	0x08 we are in a macro body that we are ignoring
	   (because the macro was already defined in a previous pass).
	Since 0x10 never appears without 0x04, the lowest bit set in asma/state is
	Since 0x08 never appears without 0x04, the lowest bit set in asma/state is
	always 0x00, 0x02, or 0x04, which is very handy for use with jump tables.
	The lowest bit set can be found easily by #00 (n) SUBk AND.
)


@@ 596,14 590,11 @@
	-body routines) tokens that fail to match any first letter in their tree.
)

%asma-STATE-SET { ;asma/state LDA ORA ;asma/state STA }
%asma-STATE-CLEAR { #ff EOR ;asma/state LDA AND ;asma/state STA }

@asma-comment-more
	;asma/token LDA2 ;strlen JSR2 ORA ,asma-ignore JCN
@asma-comment-start
	;asma/comment-level LDAk INC ROT ROT STA
	#02 asma-STATE-SET
	;asma/state LDA #02 ORA ;asma/state STA
@asma-ignore
	JMP2r



@@ 611,7 602,7 @@
	;asma/token LDA2 ;strlen JSR2 ORA ,asma-ignore JCN
	;asma/comment-level LDAk #01 SUB DUP SWP2 STA ,asma-ignore JCN
@asma-comment-end
	#02 asma-STATE-CLEAR
	;asma/state LDA #0c AND ;asma/state STA
	JMP2r

@asma-macro-define


@@ 628,22 619,22 @@
	#0000 ;append-heap-short JSR2 ( less-than pointer )
	#0000 ;append-heap-short JSR2 ( greater-than pointer )
	;asma/token LDA2 ;append-heap-string JSR2 ( key )
	#04 asma-STATE-SET
	;asma/state LDA #04 ORA ;asma/state STA
	JMP2r

	&ignore-macro
	#14 asma-STATE-SET
	;asma/state LDA #0c ORA ;asma/state STA
	JMP2r

@asma-macro-body
	;asma/state LDA #10 AND ,&skip JCN
	;asma/state LDA #08 AND ,&skip JCN
	;asma/token LDA2 ;append-heap-string JSR2
	&skip
	JMP2r

@asma-macro-end
	#00 ;append-heap-byte JSR2
	#14 asma-STATE-CLEAR
	;asma/state LDA #02 AND ;asma/state STA
	JMP2r

@asma-label-define


@@ 852,7 843,7 @@

	&keep-going
	DUP2k ;strlen JSR2 INC2 ADD2
	SWP2 ;asma-assemble-token JSR2 asma-IF-ERROR ,&macro-error JCN
	SWP2 ;asma-assemble-token JSR2 ;asma/error LDA2 ORA ,&macro-error JCN
	,&macro-loop JMP

	&macro-error

M projects/library/math32.tal => projects/library/math32.tal +5 -9
@@ 54,10 54,6 @@
(   - mul32 memory, 12 bytes )
(   - _divmod32 memory, 16 bytes )

%COMPLEMENT32 { SWP2 #ffff EOR2 SWP2 #ffff EOR2 }
%DUP4 { OVR2 OVR2 }
%POP4 { POP2 POP2 }

( bitcount: number of bits needed to represent number )
( equivalent to floor[log2[x]] + 1 )



@@ 164,7 160,7 @@

( ~x )
@complement32 ( x** -> ~x** )
    COMPLEMENT32 JMP2r
    SWP2 #ffff EOR2 SWP2 #ffff EOR2 JMP2r

( temporary registers )
( shared by most operations, except mul32 and div32 )


@@ 289,7 285,7 @@

( -x )
@negate32 ( x** -> -x** )
    COMPLEMENT32
    ;complement32 JSR2
    INC2 ( ~xhi -xlo )
    DUP2 #0000 NEQ2 ( ~xhi -xlo non-zero? )
    ,&done JCN ( xlo non-zero => don't inc hi )


@@ 414,10 410,10 @@
( greatest common divisor - euclidean algorithm )
@gcd32 ( x** y** -> z** )
    &loop ( x y )
    DUP4 ( x y y )
    OVR2 OVR2 ( x y y )
    ;is-zero32 JSR2 ( x y y=0? )
    ,&done JCN ( x y )
    DUP4 ( x y y )
    OVR2 OVR2 ( x y y )
    STH2 STH2 ( x y [y] )
    ;mod32 JSR2 ( r=x%y [y] )
    STH2r ( rhi rlo yhi [ylo] )


@@ 428,5 424,5 @@
    ROT2 ( yhi ylo rhi rlo )
    ,&loop JMP
    &done
    POP4 ( x )
    POP2 POP2 ( x )
    JMP2r

M projects/software/neralie.tal => projects/software/neralie.tal +14 -23
@@ 1,14 1,5 @@
( app/neralie : clock with arvelie date )

%PAD { #0018 }

%MOD  { DIVk MUL SUB }
%MOD2 { DIV2k MUL2 SUB2 }

%h { .DateTime/hour   DEI }
%m { .DateTime/minute DEI }
%s { .DateTime/second DEI }

( devices )

|00 @System [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]


@@ 47,7 38,7 @@
	#01 .fps/current STZ

	( set size )
	PAD
	#0018 ( padding )
	DUP2 .frame/x1 STZ2
	DUP2 .frame/y1 STZ2
	DUP2 .Screen/width DEI2 SWP2 SUB2 #0001 SUB2 .frame/x2 STZ2


@@ 79,22 70,22 @@ BRK
@neralie-calc ( -- )

	( add up fractions of a pulse, store tenths in n6 )
	#0120 #00 h MUL2
	#00c0 #00 m MUL2 ADD2
	#00f8 #00 s MUL2 ADD2
	#0120 #00 .DateTime/hour DEI MUL2
	#00c0 #00 .DateTime/minute DEI MUL2 ADD2
	#00f8 #00 .DateTime/second DEI MUL2 ADD2
	#0271 #00 .fps/next LDZ MUL2 #00 .fps/current LDZ DIV2 #30 SFT2 ADD2
	#01b0 ;modf JSR2 SWP2 #0017 MUL2 #03e8 DIV2 .neralie/n6 STZ POP

	( add up units and tens of pulses, store in n5 and n4 )
	#0042 #00 h MUL2 ADD2
	#005e #00 m MUL2 ADD2
	#000b #00 s MUL2 ADD2
	#0042 #00 .DateTime/hour DEI MUL2 ADD2
	#005e #00 .DateTime/minute DEI MUL2 ADD2
	#000b #00 .DateTime/second DEI MUL2 ADD2
	#000a ;modf JSR2 SWP2 .neralie/n5 STZ POP
	#000a ;modf JSR2 SWP2 .neralie/n4 STZ POP

	( add up hundreds of pulses + 10 x beats, store in n0123 )
	#01a0 #00 h MUL2 ADD2
	#0006 #00 m MUL2 ADD2 .neralie/n0123 STZ2
	#01a0 #00 .DateTime/hour DEI MUL2 ADD2
	#0006 #00 .DateTime/minute DEI MUL2 ADD2 .neralie/n0123 STZ2

JMP2r



@@ 109,14 100,14 @@ JMP2r
	.DateTime/year DEI2 #07d6 SUB2 NIP
		DUP #0a DIV #00 SWP #30 SFT2 ;font-numbers ADD2 .Screen/addr DEO2
			#01 .Screen/sprite DEO
		#0a MOD #00 SWP #30 SFT2 ;font-numbers ADD2 .Screen/addr DEO2
		#0a DIVk MUL SUB #00 SWP #30 SFT2 ;font-numbers ADD2 .Screen/addr DEO2
			#01 .Screen/sprite DEO
	.DateTime/doty DEI2
		DUP2 #000e DIV2 #30 SFT2 ;font-letters ADD2 .Screen/addr DEO2
			#01 .Screen/sprite DEO
		#000e MOD2
		#000e DIV2k MUL2 SUB2
		DUP2 #000a DIV2 ,digit JSR
		#000a MOD2 ,digit JSR
		#000a DIV2k MUL2 SUB2 ,digit JSR

	.Screen/x DEI2 #0008 ADD2 .Screen/x DEO2



@@ 223,8 214,8 @@ JMP2r

@update-fps ( -- )
	.fps/next LDZ INC .fps/next STZ
	s .fps/second LDZ NEQ JMP JMP2r
	s .fps/second STZ
	.DateTime/second DEI .fps/second LDZ NEQ JMP JMP2r
	.DateTime/second DEI .fps/second STZ
	.fps/next LDZ .fps/current STZ

	#00 .fps/next STZ