;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Test source for EMPTYTAP / SAVETAP ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

		device	zxspectrum48

; BASIC block
	module bas
line10:		db	0, 10
		dw	.len
.cmds		; BORDER NOT PI:
		db	#E7, #C3, #A7, ':'
		; PAPER NOT PI:
		db	#DA, #C3, #A7, ':'
		; INK VAL "7":
		db	#D9, #B0, '"7":'
		; CLEAR VAL "32763" : REM demo-1 address
		db	#FD, #B0, '"32763"', #0D
.len = $ - .cmds

line20:		db	0, 20
		dw	.len
.cmds		; POKE VAL "23739",CODE "o":
		db	#F4, #B0, '"23739",', #AF, '"o":'
		; LOAD ""SCREEN#: LOAD ""CODE
		db	#EF, '""', #AA, ':', #EF, '""', #AF, #0D
.len = $ - .cmds

line30:		db	0, 30
		dw	.len
.cmds		; RANDOMIZE USR VAL "32764" : REM demo address
		db	#F9, #C0, #B0, '"32764"', #0D
.len = $ - .cmds

total = $ - line10
	endmodule


; NUMS block
nums		db	1
		dw	.datalen
.data		db	#82,#49,#0F,#DA,#A2	;; Value 3.1415927
.datalen = $ - .data
.savelen = $ - nums

; CHARS block
chars		db	1
		dw	.datalen
.data		db	"SAVETAP testing character array"
.datalen = $ - .data
.savelen = $ - chars


; SCREEN$ block
		org	#4000
screen:
	dup 12
		block	256,#AA
		block	256,#55
	edup
	dup 24
		db	#07, #06, #06, #16, #05, #05, #0D, #04, #04, #14, #03, #03, #11, #02, #02, #29
		db	#29, #02, #02, #11, #03, #03, #14, #04, #04, #0D, #05, #05, #16, #06, #06, #07
	edup
.len = $ - screen


; CODE block
		org	#7FFC     ; to cross the slot-boundary

demo:		ei
		halt
		djnz	demo
.loop		ei
		halt
		ld	hl,#5801
		ld	de,#5800
		ld	bc,#300
		ld	a,(de)
		ld	(#5B00),a
		ldir
		call	.rnd
		ld	c,a
		and	#0C
		sub	#0B
		jr	nc,.not12
		ld	a,2
.not12		ld	d,a
		call	.rnd
		ld	e,a
		ld	hl,#5800
		add	hl,de
		ld	a,c
		and	#7F
		xor	(hl)
		ld	(hl),a
		jr	.loop

.rnd		ld	a,#29
		ld	b,a
		rrca
		rrca
		rrca
		xor	#1F
		add	a,b
		sbc	a,#FF
		ld	(.rnd+1),a
		ret
.len = $ - demo
        db      "XXXX"

; Clear output tap file
		emptytap "savetap_test.tap"
; Store BASIC
		savetap	"savetap_test.tap",BASIC,"tstSAVETAP", bas.line10, bas.total, 10
; Store SCREEN#
		savetap	"savetap_test.tap",CODE,"intro", screen, screen.len
; Store CODE
		savetap	"savetap_test.tap",CODE,"demo", demo, demo.len
; Store NUMBERS
		savetap "savetap_test.tap",NUMBERS,"n", nums, nums.savelen, 'n'
; Store CHARS
		savetap "savetap_test.tap",CHARS,"t$", chars, chars.savelen, 't'
; Store HEADLESS
		savetap "savetap_test.tap",HEADLESS, (screen + #1800), 32, 66 ; custom flag


; No autostart (#8000 is used)
		savetap	"savetap_test.tap",BASIC,"No start", bas.line10, bas.total
; Default letter ('A' is used)
		savetap "savetap_test.tap",NUMBERS,"n", nums, nums.savelen
; Address + length > #10000 (block to the end of memory will be saved)
		savetap "savetap_test.tap",HEADLESS, #FFFF, 2

; Extra variants of valid commands to exercise all code paths
		savetap	"savetap_test.tap",CODE,"_extra1", demo, 1, 0x8000, 0x1234


;;;;;;;;;;;;;;;;;
;; Error cases ;;
;;;;;;;;;;;;;;;;;

		emptytap ""				;; Syntax error
		savetap	""				;; Syntax error. No parameters
		savetap	"error"				;; Syntax error. No parameters
		savetap	"error",-1			;; Negative values are not allowed

		savetap	"error",HEADLESS,		;; Syntax error
		savetap	"error",HEADLESS,,		;; Missing start address
		savetap	"error",HEADLESS,-1		;; Negative values are not allowed
		savetap	"error",HEADLESS,0,-1		;; Negative values are not allowed
		savetap	"error",HEADLESS,#10000		;; Values higher than FFFFh are not allowed
		savetap	"error",HEADLESS,0,#10000	;; Values higher than FFFFh are not allowed
		savetap	"error",HEADLESS,0,		;; Syntax error
		savetap	"error",HEADLESS,0,0,		;; Syntax error
		savetap	"error",HEADLESS,0,0,-1		;; Invalid flag byte
		savetap	"error",HEADLESS,0,0,0x100	;; Invalid flag byte

		savetap	"error",CODE,			;; Syntax error
		savetap	"error",CODE,,			;; Missing tape block file name
		savetap	"error",CODE,"Err",		;; Missing start address
		savetap	"error",CODE,"Err",0,		;; Missing block length
		savetap	"error",CODE,"Err",-1		;; Negative values are not allowed
		savetap	"error",CODE,"Err",0,-1		;; Negative values are not allowed
		savetap	"error",CODE,"Err",0,0,-1	;; Negative values are not allowed
		savetap	"error",CODE,"Err",0,0,0,-1	;; Negative values are not allowed
		savetap	"error",CODE,"Err",#10000	;; Values higher than FFFFh are not allowed
		savetap	"error",CODE,"Err",0,#10000	;; Values higher than FFFFh are not allowed
		savetap	"error",CODE,"Err",0,0,#10000	;; Values higher than FFFFh are not allowed
		savetap	"error",CODE,"Err",0,0,0,#10000	;; Values higher than FFFFh are not allowed
		savetap	"error",CODE,"Err",0,0,0,	;; Syntax error
		savetap	"error",CODE,"Err",0,0,		;; Syntax error

		savetap	"error",BASIC,"Err",0,0,#4000	;; Autostart LINE out of range
		savetap	"error",NUMBERS,"Err",0,0,'@'	;; Variable name out of range
		savetap	"error",NUMBERS,"Err",0,0,'?'	;; Variable name out of range

		savetap	"error",HEADLESS	;; Will try to use HEADLESS as label for start of tap-snapshot
		savetap	"error",HEADLESS+!	;; causing to fail in other part of implementation
		savetap	"error",,	        ;; syntax error, no type parameter

		device zxspectrumnext
		savetap	"error",0x1234	        ;; SAVETAP snapshot is "ZX Spectrum devices" only
