;============================================================================== ; 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