;==============================================================================
; LOAD from SIF
;==============================================================================
;
; IX ukazatel na data
; DE délka
; A flag byte
; no carry = VERIFY mode

		cpu	z80undoc
		phase	1366

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

LD_BYTES	inc	d			; vynulování Z flagu, protože D nesmí obsahovat 255
						; Z bude znamenat načtení flag bytu na začátku sekvence bytů
;		ld	l,a			; zkopírovat FLAG byte
		ex	af,af'			; uložení indikátorů A / 0 = hlavička, 255 = blok dat, carry = verify
		dec	d

;;;;;;;;;;;;;;
;20140503 kompatibilita s divide
		di
		ld	a,15
		out	(254),a
;;;;;;;;;;;;;;

		ld	hl,1343			; adresa rutiny SA/LD-RET
		push	hl			; na zásobník - kvůli RET (všechny návraty včetně Breaku)

;;;;;;;;;;;;;;
;20140503 kompatibilita s divide
		in	a,(254)
;;;;;;;;;;;;;;

; délka bloku v souboru TAP včetně parity a flag bytu do BC, bude použita k přeskočení bloku, když nevyhoví

		call	SIF_LD			; čti byte, načtený byte vrací v L
		ret	nc			; NC = Break
 		ld	c,l

		call	SIF_LD			; čti byte, načtený byte vrací v L
		ret	nc			; NC = Break
 		ld	b,l

; Oba byty zahodím, protože jsou víceméně duplicitní informací a nehodí se mi s nimi pracovat.
; Data očekávám a přijímám dokud není načten celý blok daný délkou v DE a ověřen paritou.
; Délka dat v DE je určena učekáváním BASICu - buď hlavička dlouhá 17 bytů, nebo data
; jejichž délka je dána hlavičkou. Informace v TAP se hodí pro bezhlavičkové soubory, se kterými
; BASIC standardně nepracuje.

		ld	h,0			; inicializace bytu parity
		jr	LD_BYTE			; čti flag byte

LD_LOOP		ex	af,af'			; obnovení indikátorů
		jr	nz,LD_FLAG
		jr	nc,LD_VERIFY
		ld	(ix+0),l		; zapsat načtený byte do paměti
		jr	LD_NEXT

; násl. kód je poněkud složitější jen proto, abych mohl zachovat BC nezměněný

LD_FLAG		jr	c,LD_FLAG_C
		xor	l			; liší se flag byte od očekávaného?
		scf				; clear carry
		ccf
LD_FLAG_1	jr	nz,LD_FORWARD		; NZ = liší, ukonči čtení dat / přeskoč blok
		jr	LD_FLAG_CMN		; neliší, flag byte je správný, pokračuj čtením dat

LD_FLAG_C	xor	l
		scf				; set carry
		jr	LD_FLAG_1

; nesprávný flag byte, nutno načíst a zahodit nehodící se data bloku, jinak by nefungovalo LOAD "jmeno"
; pro soubory, které v TAP nejsou na první pozici

LD_FORWARD	dec	bc
LD_FORWARD_1	call	SIF_LD			; zahazuj data, dokud jsou k dispozici
		ret	nc			; NC = Break
		dec	bc
		ld	a,b
		or	c
		jr	nz,LD_FORWARD_1
		ret

LD_VERIFY	ld	a,(ix+0)		; načtu byte z paměti
		xor	l			; porovnám s bytem načteným přes SIF
		ret	nz			; NZ = neshodují se, ukonči čtení dat

LD_NEXT		inc	ix
		dec	de
LD_FLAG_CMN	ex	af,af'			; uschování indikátorů

LD_BYTE		call	SIF_LD			; čti byte, načtený byte vrací v L
		ret	nc			; NC = Break

		ld	a,h			; zpracování parity
		xor	l			; slož s novým bytem
		ld	h,a

		ld	a,d			; je DE = 0?
		or	e
		jr	nz,LD_LOOP
		ld	a,h			; parita do A
		cp	1			; test parity
		ret				; je-li paritní byte nulový pak návrat s Carry, jinak No Carry

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

SIF_LD		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
		in	a,(SIF_BASE+20)		; are any data ready for receive?
		and	1
		jr	z,SIF_LD		; Z = no data
		xor	a
		in	a,(SIF_BASE)
		ld	l,a
		and	00000111b
		out	(254),a
		scf				; carry pro non break
		ret

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

		dephase

;------------------------------------------------------------------------------
; končí na 0x05AB + výplň
;------------------------------------------------------------------------------
; 0x05E3	sestavení bytu z pulzů načtených z pásky
; 0x0605	nesmí být přepsáno