;------------------------------------------------------ ; PROGRAMMA PER LA PROVA DELLE TASTIERE ; 26/11/2024 - Roberto Bazzano ; ; Da utilizzare con il monitor multi-firmware ; .include "jump.inc" brkadr .equ 0000h ; contiene il timer per la visualizzazione del messaggio BREAK timer .equ 0Fh ; ritardo per la visualizzazione del messaggio BREAK .org 0F000h key: ld hl,0000h ld (brkadr),hl ld a,0C3h ld (0066h),a ; inizializza i tasti BREAK ld hl,break ld (0067h),hl call initv call initn call mask ; visualizza la maschera a video ld de,0020h iniz: ld b,02h ; riga/colonna iniziale ld c,col in a,(0eah) ; input da tastiera vecchia call keyvis in a,(085h) ; input da tastiera nuova call keyvis in a,(085h) ; input da tastiera nuova complementato cpl call keyvis push bc ld bc,01ffh ; controlla se c'è un tasto premuto sulla tastiera esadecimale push af esad: pop af in a,(0f0h) ; fa 255 input. Quello che è il bit 7 a 0 è il tasto premuto (a causa del contatore hardware che fa lo scan dei tasti) push af bit 7,a jr z,esad1 ; tasto premuto sulla tastiera esadecimale dec bc ld a,b or c jr nz,esad esad1: pop af pop bc call keyvis call brk ; gestisce la visualizzazione del messaggio BREAK jr iniz ;------------------------------------------------------ ; Visualizza il dato normale e con lo strobe a 0 su due righe differenti ; keyvis: call key1 ; visualizza il dato come arriva da tastiera inc b ; si posiziona sulla riga successiva and 7fh ; visualizza il dato con lo strobe a 0 call key1 inc b ; si posiziona due righe dopo inc b ret ;------------------------------------------------------ ; Visualizza gli 8 bit, il byte esadecimale, e il carattere ascii corrispondente contenuti in A ; alla riga/colonna indicata da BC ; key1: push bc push af call nloc1 ; posizione sul video nuovo in DE ex de,hl ; salva la posizione del video nuovo su HL call lf06e ; si posiziona sul video nuovo call vloc1 ; posizione sul video vecchio in DE call waitv ; attende la ritraccia sul video vecchio ld b,08h ; numero di bit da scrivere loop: rlca push af ld a,'0' ; carica in A il carattere "0" se non c'è il carry, "1" se c'è il carry adc a,00h ld (de),a ; scrive il bit sul video vecchio inc de ; punta alla prossima posizione sul video vecchio call writen ; scrive il bit sul video nuovo inc hl ; punta alla prossima posizione sul video nuovo pop af djnz loop ; loooppa fino a che non ha scritto tutti gli 8 bit call sep ; visualizza il separatore pop af ; recupera il byte da visualizzare push af rra ; considera il nibble H rra rra rra and 0fh call lett ; somma l'offset per l'ASCII del numero o della lettera ld (de),a ; visualizza il nibble H del byte sul video vecchio inc de call writen ; e sul video nuovo inc hl pop af ; recupera il byte push af and 0fh ; considera il nibble L call lett ; somma l'offset per l'ASCII del numero o della lettera ld (de),a ; visualizza il nibble L del byte sul video vecchio inc de call writen ; e sul video nuovo inc hl call sep ; visualizza il separatore pop af ; visualizza il carattere ASCII ld (de),a ; sul video vecchio inc de call writen ; e sul video nuovo inc hl pop bc ret ;------------------------------------------------------ ; Visualizza il separatore '-' ; sep: inc de ; si posiziona sul video vecchio inc hl ; si posiziona sul video nuovo call lf06e ld a,'-' ld (de),a ; scrive sul video vecchio inc de call writen ; scrive sul video nuovo inc hl inc de ; si posiziona sul video vecchio inc hl ; si posiziona sul video nuovo call lf06e ret ;------------------------------------------------------ ; Somma l'offset per l'ASCII del numero o della lettera ; lett: cp 0Ah jr c,lett1 ; salta se minore add a,55 ret lett1: add a,'0' ret ;------------------------------------------------------ ; Visualizza la maschera a video ; mask: ld hl,testo1 mask1: push hl call vloc ; calcola la posizione sul video vecchio. Al ritorno HL punta al primo carattere da visualizzare push de ; salva la posizione in BC pop bc pop hl call nloc ; calcola la posizione sul video nuovo. Al ritorno HL punta al primo carattere da visualizzare ex de,hl ; si posiziona sul video nuovo call lf06e ex de,hl ld a,(hl) ; recupera il carattere da visualizzare mask2: call writen ; scrive il carattere sul video nuovo call waitv ; scrive il carattere sul video vecchio ld (bc),a inc hl ; punta al prossimo carattere da visualizzare inc bc ; punta alla prossima posizione sul video vecchio inc de ; punta alla prossima posizione sul video nuovo ld a,(hl) ; controlla se il carattere è 00h or a jr nz,mask2 ; se no lo visualizza inc hl ; altrimenti punta alla prossima riga/colonna ld a,(hl) ; controlla se è 0ffh cp 0ffh jr nz,mask1 ; se non è FFh si posiziona e continua a visualizzare ret ;------------------------------------------------------ ; Gestisce i tasti BREAK ; break: push af ld a,timer ; carica il valore del timer in brkadr per visualizzare il messaggio BREAK temporizzato ld (brkadr),a pop af retn ;------------------------------------------------------ brk: ld a,(brkadr) ; recupera brkadr cp 00h jr z,brk1 ; se brkadr è 00h visualizza il messaggio BLANK, altrimenti visualizza il messaggio BREAK dec a ; decrementa brkadr ld (brkadr),a ld hl,txtbrk ; visualizza il messaggio BREAK jr brk2 brk1: ld hl,blank ; visualizza il messaggio BLANK brk2: push hl call vloc ; calcola la posizione sul video vecchio e la salva in BC push de pop bc pop hl ; calcola la posizione sul video nuovo in DE call nloc ex de,hl call lf06e ; si posiziona sul video nuovo ex de,hl brk3: ld a,(HL) ; recupera il carattere la visualizzare or a ; se è 00h esce ret z call waitv ; lo visualizza sul video vecchio ld (bc),a inc bc call writen ; e sul video nuovo inc de inc hl ; punta al prossimo carattere da visualizzare jr brk3 testo1: .byte 00h, 09h, "PROVA TASTIERE", 00h .byte 02h, 00h, "LX.388:", 00h .byte 03h, 00h, "AND 7F:", 00h .byte 05h, 00h, "LX.529:", 00h .byte 06h, 00h, "AND 7F:", 00h .byte 08h, 00h, "LX.529 CPL:", 00h .byte 09h, 00h, "AND 7F:", 00h .byte 0Bh, 00h, "LX.384:", 00h .byte 0Ch, 00h, "AND 7F:", 00h, 0ffh txtbrk: .byte 0Eh, 0Ch, "*BREAK*", 00h blank: .byte 0Eh, 0Ch, " ", 00h col .equ 0Ch .org 0F7FFh .byte 00h .end