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