diff --git a/tools/tests/unit/test_parse.asm b/tools/tests/unit/test_parse.asm
index 26bc106..409b082 100644
--- a/tools/tests/unit/test_parse.asm
+++ b/tools/tests/unit/test_parse.asm
@@ -8,14 +8,19 @@ zasmGetPC:
 
 testNum:	.db 1
 
-sFoo:		.db "Foo", 0
-saB:		.db "aB", 0
-s99:		.db "99", 0
-
 test:
 	ld	hl, 0xffff
 	ld	sp, hl
 
+	call	testParseHex
+	call	testParseHexPair
+	call	testParseArgs
+
+	; success
+	xor	a
+	halt
+
+testParseHex:
 	ld	a, '8'
 	call	parseHex
 	jp	c, fail
@@ -34,29 +39,90 @@ test:
 	call	parseHex
 	jp	nc, fail
 	call	nexttest
+	ret
 
-	ld	hl, s99
+testParseHexPair:
+	ld	hl, .s99
 	call	parseHexPair
 	jp	c, fail
 	cp	0x99
 	jp	nz, fail
 	call	nexttest
 
-	ld	hl, saB
+	ld	hl, .saB
 	call	parseHexPair
 	jp	c, fail
 	cp	0xab
 	jp	nz, fail
 	call	nexttest
 
-	ld	hl, sFoo
+	ld	hl, .sFoo
 	call	parseHexPair
 	jp	nc, fail
 	call	nexttest
+	ret
 
-	; success
-	xor	a
-	halt
+.sFoo:		.db "Foo", 0
+.saB:		.db "aB", 0
+.s99:		.db "99", 0
+
+
+testParseArgs:
+	ld	hl, .t1+7
+	ld	de, .t1
+	ld	iy, .t1+3
+	call	.testargs
+
+	ld	hl, .t2+7
+	ld	de, .t2
+	ld	iy, .t2+3
+	call	.testargs
+
+	ld	hl, .t3+7
+	ld	de, .t3
+	ld	iy, .t3+3
+	call	.testargs
+	ret
+
+; HL and DE must be set, and IY must point to expected results in IX
+; Expected results are 4 bytes: arg count, then the 3 expected bytes
+.testargs:
+	ld	ix, sandbox
+	call	parseArgs
+	jp	nz, fail
+	cp	(iy)
+	jp	nz, fail
+	ld	a, (ix)
+	cp	(iy+1)
+	jp	nz, fail
+	ld	a, (ix+1)
+	cp	(iy+2)
+	jp	nz, fail
+	ld	a, (ix+2)
+	cp	(iy+3)
+	jp	nz, fail
+	ret
+
+; Test data format: 3 bytes specs, one byte expected A, 3 bytes expected (IX),
+; then the arg string.
+
+; Empty args with empty specs
+.t1:
+	.db 0b0000, 0b0000, 0b0000
+	.db 0, 0, 0, 0
+	.db 0
+
+; One arg, one byte spec
+.t2:
+	.db 0b0001, 0b0000, 0b0000
+	.db 1, 0xe4, 0, 0
+	.db "e4", 0
+
+; 3 args, 3 bytes spec
+.t3:
+	.db 0b0001, 0b0001, 0b0001
+	.db 3, 0xe4, 0xab, 0x99
+	.db "e4 ab 99", 0
 
 nexttest:
 	ld	a, (testNum)
@@ -67,3 +133,6 @@ nexttest:
 fail:
 	ld	a, (testNum)
 	halt
+
+; used as RAM
+sandbox: