org $3900 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; RUTINA DE CARGA A 12600 bps PARA FUNCIONAR EN ROM (en la zona libre) ;; con detección (no muy robusta) de BREAK y salvaguarda de bytes anteriores ;; USO: HL= dirección -1 de bloque de datos ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; inicio ld b,(hl) dec hl ld c,(hl) push hl push bc exx pop bc pop de exx ;guardamos dos bytes anteriores al inicio del bloque de datos ;porque se se van a machacar ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; di ld bc, $eefe ; b = color amarillo c= puerto EAR ld d, $10 ; d = contador de ciclos válidos de tono guia pii ld a,10 ; a= color rojo y mide ciclos out (c),a pi_LOW inc a in e,(c) jp po, pi_LOW ; mide semiclo negativo bit 0,e jp z,fin ; si se pulsó SHIFT hacemos break out (c),b pi_HIGH sub c in f,(c) jp pe, pi_HIGH ; mide semiclo positivo ; a resulta = 10+ tiempo_negativo+2*tiempo_positivo SYNC cp 74+10 rl d ; si es menor que 84, tono guia bueno cp 54+10 ; si es mayor que 64, todavía no ha llegado el sincornismo jr nc, pii inc d ; si llegó un ciclo menor jr nz , pii ; si no hubo al menos 8 ciclos consecutivos de tonos guia se sigue esperando postsyn_LOW in f,(c) ; hubo sincronismo jp po, postsyn_LOW ; esperamos al siguiento pulso cp 34 +10 ; ¿el ciclo de sincronismo es menor que 44? ld ixl,d ld a, d ex de,hl jr c, entra ; Sí => polarida positiva. Entra en rama positiva postsyn_hi ; No => polaridad negativa in f,(c) jp pe, postsyn_hi ; se espera fin semiciclo postsincronismo jr entra_inv ; Entra en rama negativa ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K1 tabla ; Tabla para medir los ciclos defb $fc,$fc defb $fc,$fc,$fc,$fc,$fc defb $fd,$fd,$fd,$fd,$fd defb $fe,$fe,$fe,$fe,$fe defb $ff,$ff,$ff,$ff,$ff defb $ff,$ff defb $40,$40,$40,$40,$40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Rama positiva ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; full and H ld (de),a ; se guarda el dato recibido inc de ; siguente direccion de memoria xor ixl ld ixl,a ; se actualiza checksum ld a,c ; contador de bits recibidos entra sigue HIGH inc hl in f , (c) jp pe, HIGH ; mide semiciclo positivo res 4,b out (c),b ; color de borde rojo o blanco ld h,$39 ld h,(hl) ; h= simbolo (00 , 01 , 10 , 11) que se acaba de recibir ld l, (tabla-$3900 )-8 ; l mide el tiempo rlca rla ; se incramenta en dos el contador de bits recibidos ; y se prepara A para recibir por la derecha dos bit LOW inc hl in b,(c) jp po, LOW ; mide semiciclo negativo jp nC, full ; ¿se han recibido 4 simbolos? bit 0,b jr z, fin ; comprueba Shift pulsada ld b, $ea ; color del borde rojo and H ; guarda simbolo recien llegado jp m, sigue ; sigue si no ha llegado un ciclo de fin de transmisión jr fin ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Rama negativa ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fulli and H ld (de),a inc de xor ixl ld ixl,a ld a,c; entra_inv siguei HIGHi inc hl in f , (c) jp po, HIGHi res 4,b out (c),b ld h,$39 ld h,(hl) ld l,(tabla-$3900)-8 rlca rla LOWi inc hl in b , (c) jp pe, LOWi ;28 jp nC, fulli bit 0,b jr z, fin ld b, $ea and H jp m, siguei ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fin exx ld a,c ld (de),a inc de ld a,b ld (de),a exx ; se recupera memoria machacada jr nz, no_break ; ¿hubo break o fin normal? ei rst 8 defb $14 ; L: break into program no_break ld a,ixl or a ; se comprueba cheksum == 0 ei ret z rst 8 defb 26 ; R: tape laoding eror