~aleteoryx/uxn

c31f4588d2b2b89dd8b0f749efd9cc3c2fea48ed — glenda 8 months ago 5cad9be
nanpa basics
6 files changed, 100 insertions(+), 1 deletions(-)

A arvelie.rom
A arvelie.rom.sym
M mkfile
A nanpa.rom
A nanpa.rom.sym
A nanpa.tal
A arvelie.rom => arvelie.rom +0 -0
A arvelie.rom.sym => arvelie.rom.sym +0 -0
M mkfile => mkfile +2 -1
@@ 1,5 1,6 @@
roms=\
	arvelie.rom
	arvelie.rom\
	nanpa.rom

all:VQ: $roms


A nanpa.rom => nanpa.rom +0 -0
A nanpa.rom.sym => nanpa.rom.sym +0 -0
A nanpa.tal => nanpa.tal +98 -0
@@ 0,0 1,98 @@
|10 @Console &vector $2 &read $1 &pad $5 &write $1 &error $1

|0 @State &seenPrefix $1 &numType $1 &number $1 &err $1 &errChar $1
	@flag $1 @count $1

|0 @NumType &decimal $1 &octal $1 &hexcadecimal $1 &binary


|100
@on-reset ( -> )
	#ffff testnum
	#efff testnum
	#8fff testnum
	#7fff testnum
	#3fff testnum
	#2710 testnum
	#0fff testnum
	#03e8 testnum
	#01f4 testnum
	#000b testnum
	BRK

@testnum ( num* -- )
	DUP2 printoctal
	#09 .Console/write DEO
	DUP2 printdecimal
	#09 .Console/write DEO
	SWP printhex printhex
	#0a .Console/write DEO
	JMP2r

@printhex ( num -- )
	#10 DIVk DUP printhexdigit
	MUL SUB printhexdigit
	JMP2r

@printdecimal ( num* -- )
	#01 .flag STZ
	#00 STH ( return stack is loop counter )
	#2710 DIV2k DUP2 NIP DUP #00 EQU ?{
		DUP printbcddigit
		#00 .flag STZ
	} POP
	MUL2 SUB2
	&loop
		#03e8 DIV2k DUP2 NIP ( get 1000s place )
		DUP #00 EQU .flag LDZ AND ?{ ( if flag || s != 0 )
			DUP printbcddigit
			#00 .flag STZ
		} POP
		MUL2 SUB2 #000a MUL2 ( DUP2 SWP printhex printhex )
	STHr #01 ADD DUP STH #04 NEQ
	( end ) ?&loop
	POPr POP2 JMP2r

@printoctal ( num* -- )
	#01 .flag STZ
	#00 STH ( return stack is loop counter )
	DUP2 #0f SFT2 NIP #00 EQU ?{
		#31 .Console/write DEO
		#00 .flag STZ
	}
	#10 SFT2
	&loop
		DUP2 #0d SFT2 NIP ( get top 3 bits )
		DUP #00 EQU .flag LDZ AND ?{ ( if flag || s != 0 )
			DUP printbcddigit
			#00 .flag STZ
		} POP
		#30 SFT2
	STHr #01 ADD DUP STH #05 NEQ
	( end ) ?&loop
	POPr POP2 JMP2r

@printhexdigit ( digit -- )
	#0f AND
	DUP #0a LTH ?{ #27 ADD } ( take top part, if 10-15 move to a-f )
	#30 ADD .Console/write DEO
	JMP2r
@printbcddigit ( digit -- )
	#0f AND
	#30 ADD .Console/write DEO
	JMP2r



@errors
	&prefix		={ "error 20 "at 20 "position 20 }
	&prefix2	={ 20 "with 20 "encoding 20 }
	&encoding	={ "character 20 "not 20 "valid 20 "in 20 "encoding }

@encodings
	&decimal	={ "decimal }
	&octal		={ "octal }
	&hexcadecimal	={ "hexcadecimal }
	&binary		={ "binary }
	&tab		=&decimal =&octal =&hexcadecimal =&binary