;==============================================================================
; SAVE to SIF
;==============================================================================
;
; IX ukazatel na data
; DE délka
; A flag byte

		cpu	z80undoc
		phase	1218

;------------------------------------------------------------------------------
; původně 0x04C2 (nesmí se změnit)

SA_BYTES	ld	hl,1343			; adresa SA/LD-RET (tam se po dokonč./breaku bude vracet)
		push	hl			; na zásobník, protože ret
		
;;;;;;;;;;;;;;
;20140503 kompatibilita s divide
		ld	hl,1343
;;;;;;;;;;;;;;
		
		ex	af,af'			; uschovej flag byte
		inc	de			; počet bytů +1
		dec	ix			; byte před daty, který mají být uložena
						; to proto, protože teď musí být uložen flag byte a tím se
						; ukazatel i počítadlo bytů přenastaví na správnou hodnotu

; TAP - na začátku každého bloku musí být 2 byty - délka dat + 2 (parita a flag byte)
; první byte je dolní, druhý byte horní

		inc	de			; nutno započítat i paritní byte

		ld	l,e			; 2 byty - délka bloku dat pro TAP soubor
		call	SA_SIF
		ld	l,d
		call	SA_SIF

		dec	de			; korekce délky zpět na délku +1 (jen flag byte navíc)
		ex	af,af'			; obnov flag byte
		ld	l,a
		jr	SA_START		; a skok na hlavní smyčku, začne se uložením flag bytu,
						; srovná počítadlo ...

;------------------------------------------------------------------------------

SA_SIF		ld	a,127			; test klávesy SPACE (BREAK)
		in	a,(254)
		rra
		ret	nc			; je-li stisknuto, pak návrat do SA/LD
		xor	a			; může být byte odeslán?
		in	a,(SIF_BASE+20)
		and	01000000b
		jr	z,SA_SIF		; Z = nemůže, buffer plný, cíl nepřijímá dost rychle

		ld	a,l			; data do A
		out	(SIF_BASE),a		; odeslat byte

		and	111b
		out	(254),a
		scf				; set carry
		ret

;------------------------------------------------------------------------------

SA_PARITY	ld	l,h			; paritní byte do L, volá se při ukládání parity
		jr	SA_LOOP_P

SA_LOOP		ld	a,d			; čítač délky zbývajících dat v DE
		or	e
		jr	z,SA_PARITY		; Z = všechny byty odeslány, bude odeslán i paritní byte
		ld	l,(ix+0)
SA_LOOP_P	ld	a,h			; momentální parita v H
		xor	l			; XOR s novým bytem, který teď bude odeslán
SA_START	ld	h,a

; data k odeslání v L

		call	SA_SIF
		ret	nc			; NC = SPACE (BREAK), jump to SA/LD-RET

		dec	de			; sniž počítadlo bytů
		inc	ix			; posuň ukazatel na další byte

; test shodný s původním kódem v ROM

		ld	a,d
		inc	a
		jr	nz,SA_LOOP
		ret				; návrat, když je čítač bytů nastaven na #ffff
						; proto nelze uložit CODE 65535 bytů dlouhý?

		db	0,0,0,0			; výplň

		dephase

;------------------------------------------------------------------------------
; končí na 0x0506 + výplň
;------------------------------------------------------------------------------
; 0x050E	nesmí být přepsáno - pokud je init umístěn hned za tímto kódem
; 0x053F	nesmí být přepsáno