;------------------------------------------------------ ; TEST DELLA RAM ; ; Per monitor multi-firmware ; Allocato a F000h nella eprom ;------------------------------------------------------ .include "jump.inc" ; Indirizzi working area stack .equ 000efh ; indirizzo inziale dello stack pointer rampda .equ 000f0h ; ram presente - E' quella che viene controllata affinché non cambi rampa .equ 000f2h ramtda .equ 000f4h ; ram da testare ramta .equ 000f6h cursv .equ 000f8h ; posizione del cursore (non del carattere) sul video vecchio cursn .equ 000fah ; posizione del cursore sul video nuovo cursd .equ 000fch ; posizione del cursore sui display curfon .equ 000fdh ; flag cursori accesi. Se =00h i cursori sono accesi, se =20h i cursori sono spenti tiptes .equ 000feh ; tipo di test richiesto. 01h=base, 02h=avanzato .org 0F000h ; JUMP table jp inizio ; F000h inizio programma jp vis ; F003h visualizza il messaggio puntato da HL sui vi jp inp ; F006h input in HL del numero di caratteri esadecimali indicati dal registro D inizio: ld hl,45EDh ; disabilita i tasti BREAK ld (0066h),hl ld hl,0000h ; controlla se la ram da 0000h a 00FFh è OK lopram: xor a ; controlla la cella per 00h ld (hl),a ld a,(hl) or a ; cp 00h jp nz,errram ; se c'è un errore esce cpl ; controlla la cella per 0ffh ld (hl),a ld a,(hl) cp 0ffh jp nz,errram ; se c'è un errore esce and 01010101b ; controlla la cella per 01010101b ld (hl),a ld a,(hl) cp 01010101b jp nz,errram ; se c'è un errore esce cpl ; controlla la cella per 10101010b ld (hl),a ld a,(hl) cp 10101010b jp nz,errram ; se c'è un errore esce inc hl ; salta alla cella successiva ld a,h ; esce a 0100h cp 01h jr nz,lopram ;------------------------------------------------------ ld hl,stack ; imposta lo stack pointer ld sp,hl call lf0a5 ; inizializza i registri del SY6545 ed i PIO della scheda video nuova call checv ; imposta il registro B' che indica se esiste la scheda video vecchia ld a,01h ; imposta il registro D', che indica che l'input da tastiera deve controllare anche il BACKSPACE exx ld d,a exx ld a,0C3h ; abilita i tasti BREAK ld (0066h),a ld hl,break ld (0067h),hl call inivid ; inizializza la schermata video ld hl,msg1 ; visualizza "TEST RAM" ld de,tabds1 ; visualizza il menù sui display call vis ld hl,help ; visualizza l'help call vis ld hl,menu ; visualizza il menù call vis linp1: call curon ; accende il cursore call input ; input di un carattere call curoff ; spegne il cursore ld (tiptes),a ; salva il tipo di test richiesto cp 03h ; se è stato digitato 3 -> fine programma jr nz,linp1x jp 0f800h linp1x: cp 01h ; controlla che sia stato digitato solo 1 o 2 jr z,linp1a cp 02h jr z,linp1a jr linp1 ;------------------------------------------------------ linp1a: call inivid ; inizializza la schermata video ld a,(tiptes) cp 02h jr z,linp1b ld hl,msg15 ; visualizza "TEST RAM SEMPLICE" jr linp1c linp1b: ld hl,msg16 ; visualizza "TEST RAM AVANZATO" linp1c: ld de,tabds2 ; visualizza sui display call vis ld hl,msg2 ; visualizza "RAM DA TESTARE: " call vis linp2: ld hl,msg3 ; visualizza "INDIRIZZO INIZIALE: " ld de,tabds2 ; visualizza sui display call indir ; visualizzazione messaggio, input dell'indirizzo e controllo che non sia < 0100h jr nz,linp2 ld (ramtda),hl ; salva l'indirizzo iniziale linp3: ld hl,msg4 ; visualizza "INDIRIZZO FINALE: " ld de,tabds3 ; visualizza sui display call indir ; visualizzazione messaggio, input dell'indirizzo e controllo che non sia < 0100h jr nz,linp3 ld (ramta),hl ; salva l'indirizzo finale or a ; azzera il carry ld bc,(ramtda) ; se l'indirizzo finale è <= di iniziale richiede gli indirizzi sbc hl,bc jr c,linp4 jr z,linp4 jr linp5 ; altrimenti prosegue linp4: ld hl,msg14 ; visualizza messaggio di errore ld de,0000h call vis ld hl,msg3 ; cancella le righe di input alla posizione di msg3 e msg4 call delinp ld hl,msg4 call delinp jr linp2 ;------------------------------------------------------ linp5: ld a,(tiptes) ; verifica il tipo di test richiesto cp 01h jr z,linp9 ; se 01h evita il test avanzato ld hl,msg5 ; visualizza "RAM CHE NON SI DEVE MODIFICARE: " ld de,tabds4 call vis linp6: ld hl,msg6 ; visualizza "INDIRIZZO INIZIALE: " call indir ; visualizzazione messaggio, input dell'indirizzo e controllo che non sia < 0100h jr nz,linp6 ld (rampda),hl ; salva l'indirizzo iniziale linp7: ld hl,msg7 ; visualizza "INDIRIZZO FINALE: " ld de,tabds5 ; visualizza sui display call indir ; visualizzazione messaggio, input dell'indirizzo e controllo che non sia < 0100h jr nz,linp7 ld (rampa),hl ; salva l'indirizzo finale or a ; azzera il carry ld bc,(rampda) ; se l'indirizzo finale è <= di iniziale richiede gli indirizzi sbc hl,bc jr c,linp8 jr z,linp8 jr linp9 ; altrimenti prosegue linp8: ld hl,msg14 ; visualizza messaggio di errore ld de,0000h call vis ld hl,msg6 ; cancella le righe di input alla posizione di msg6 e msg7 call delinp ld hl,msg7 call delinp jr linp6 ;------------------------------------------------------ linp9: ld hl,tabds6 ; visualizza sui display call vdisp ld hl,msg8 ; visualizza "ATTENDERE..." ld de,0000h call vis ld a,(tiptes) ; se il test è semplice non serve azzerare la ram cp 01h ; perchè non bisogna verificare se si modifica da sola jr z,linp10 or a ; azzera il carry ld hl,(rampa) ; azzera tutta la ram presente ld bc,(rampda) sbc hl,bc push hl pop bc ld hl,(rampda) ld de,(rampda) inc de xor a ld (hl),a ldir linp10: ld hl,(ramtda) ; carica l'indirizzo iniziale da testare ;------------------------------------------------------ loop: push hl ; posiziona il cursore per visualizzare l'indirizzo in fase di test ld hl,adr1 call poscur pop hl ld a,0f3h ; posiziona il cursore per i display ld (cursd),a call visadr ; visualizza l'indirizzo in fase di test xor a ; controlla la cella per 00h ld (hl),a ld a,(hl) or a ; cp 00h jr nz,err cpl ; controlla la cella per 0ffh ld (hl),a ld a,(hl) cp 0ffh jr nz,err and 01010101b ; controlla la cella per 01010101b ld (hl),a ld a,(hl) cp 01010101b jp nz,err ; se c'è un errore esce cpl ; controlla la cella per 10101010b ld (hl),a ld a,(hl) cp 10101010b jp nz,err ; se c'è un errore esce xor a ; azzera la locazione scritta ld (hl),a ld a,(tiptes) ; se il test è avanzato controlla che la ram non si sia modificata cp 02h call z,chkram inc hl ; salta alla cella successiva ld a,h ; controlla se HL=0000h. Se sì significa che ha passato 0fffh, quindi esce or l jr z,fine loop1: ld de,(ramta) ; controlla se ha finito. Esce all'indirizzo "ramta"+1 or a ; azzera il carry push hl sbc hl,de ; imposta il carry se hl= 0ah addiziona 037h, altrimenti 030h add a,030h jr disp2 disp1: add a,037h disp2: push hl ld hl,(cursv) ; legge l'indirizzo attuale del cursore call waitv ; attende la ritraccia del video vecchio ld (hl),a ; visualizza il carattere sul video vecchio inc hl ld (cursv),hl ; salva il nuovo indirizzo del cursore del video vecchio disp2a: push af ld a,(curfon) ; se il cursore sul video vecchio era acceso lo visualizza or a jr nz,disp3 ld a,81h ; accende (scrive) il cursore sul video vecchio ld (hl),a disp3: ld hl,(cursn) ; posiziona il carattere da visualizzare sul video nuovo call lf06e pop af call writen ; attende la ritraccia e visualizza il carattere sul video nuovo ld hl,(cursn) ; salva la nuova posizione del cursore del video nuovo inc hl ld (cursn),hl call lf060 ; posiziona il cursore sul video nuovo ld a,(curfon) ; accende o spegne il cursore sul video nuovo call cursor disp4: pop hl pop af ret ;------------------------------------------------------ ; Visualizza l'indirizzo a video ; DE deve contenere la posizione del video vecchio. Il video nuovo deve essere già posizionato ; HL contiene l'indirizzo da visualizzare ; visadr: ld a,h ; separa i nibbles di HL che indicano l'indirizzo call srla4 call visad1 ; visualizza il 1° byte dell'indirizzo ld a,h call visad1 ; visualizza il 2° byte dell'indirizzo ld a,l call srla4 call visad1 ; visualizza il 3° byte dell'indirizzo ld a,l call visad1 ; visualizza il 4° byte dell'indirizzo ret visad1: and 0fh call dispca ; visualizza il byte dell'indirizzo a video e sui display ret ;------------------------------------------------------ ; SRL A per quattro volte ; srla4: srl a srl a srl a srl a ret ;------------------------------------------------------ ; Accende il cursore ; curon: push af push hl ld a,0ah ; seleziona il registro R10 out (8ch),a xor a ; scrive il valore 00h per accendere il cursore out (8dh),a ld a,81h ; accende il cursore sul video vecchio ld hl,(cursv) ; legge la posizione del cursore del video vecchio call waitv ld (hl),a xor a ; indica che i cursori sono accesi ld (curfon),a pop hl pop af ret ;------------------------------------------------------ ; Spegne il cursore ; Sul video nuovo viene sempre spento, anche se lo era già ; curoff: push af push hl ld a,(curfon) ; se i cursori erano già spenti non fa nulla cp 020h jr z,curof1 ld a,0ah ; seleziona il registro R10 out (8ch),a ld a,020h ; scrive il valore 32 (20h) per spegnere il cursore out (8dh),a ld hl,(cursv) ; spegne il cursore sul video vecchio call waitv ld (hl),a ld (curfon),a ; indica che i cursori sono spenti curof1: pop hl pop af ret ;------------------------------------------------------ ; Routine per la gestione dei tasti BREAK break: ld hl,inizio ; salta all'inizio del programma ritornando dall'interrupt non mascherabile push hl retn ;------------------------------------------------------ ; Azzeramento riga messaggi clrmsg: push de push hl ld hl,(cursn) ; salva le posizioni dei cursori nello stack push hl ld hl,(cursv) push hl ld hl,msg0 ld de,0000h call vis pop hl ; recupera le posizioni dei cursori ld (cursv),hl pop hl ld (cursn),hl call lf060 ; riposiziona il cursore sul video nuovo pop hl pop de ret ;------------------------------------------------------ ; Inizializzazione schermata video inivid: call initn ; pulisce il video nuovo call initv ; pulisce il video vecchio ld hl,0000h ; azzera la posizione del cursore ld (cursv),hl ld (cursn),hl xor a ; indica che i cursori sono accesi, in modo da spegnerli nella call curoff ld (curfon),a call curoff ; spegne il cursore ret ;------------------------------------------------------ ; Posiziona in C il display da utilizzare e incrementa la posizione del cursore dei display posdis: push af ld a,(cursd) ; recupera la posizione sui display ld c,a ; e la mette in C dec a ; salva la nuova posizione ld (cursd),a pop af ret ;------------------------------------------------------ msg0: .byte 0Dh, 00h, " " ; Utilizzato per azzerare una riga a video (o l'area messaggi) .byte " ", 00h msg1: .byte 00h, 00h, "--- TEST RAM ---", 00h msg2: .byte 02h, 00h, "RAM DA TESTARE:" ,00h msg3: .byte 03h, 00h, "INDIRIZZO INIZIALE (ESAD.): ", 00h msg4: .byte 04h, 00h, "INDIRIZZO FINALE (ESAD.) : ", 00h msg5: .byte 06h, 00h, "RAM CHE NON SI DEVE " .byte "MODIFICARE:", 00h msg6: .byte 07h, 00h, "INDIRIZZO INIZIALE (ESAD.): ", 00h msg7: .byte 08h, 00h, "INDIRIZZO FINALE (ESAD.) : ", 00h msg8: .byte 0Ah, 00h, "ATTENDERE...", 00h msg9: .byte 0Bh, 00h, "*** RAM OK ***", 00h msg10: .byte 0Bh, 00h, "*** ERRORE - INDIRIZZO: ", 00h msg11: .byte 0Bh, 00h, "*** ERRORE ***", 01h .byte 0Ch, 00h, "BYTE CAMBIATO - INDIRIZZO: ", 00h msg12: .byte 0Eh, 00h, "--- FINE PROGRAMMA ---", 01h .byte 0Fh, 00h, "PREMERE BREAK PER RIPETERE", 00h msg13: .byte 0Dh, 00h, "ERRORE: INDIRIZZO < 0100", 00h msg14: .byte 0Dh, 00h, "ERR: INDIRIZZO INIZIALE<=" .byte "FINALE", 00h msg15: .byte 00h, 00h, "--- TEST RAM SEMPLICE ---", 00h msg16: .byte 00h, 00h, "--- TEST RAM AVANZATO ---", 00h adr1: .byte 0Ah, 0Dh ; posizione (riga/colonna) a video dell'indirizzo in fase di test menu: .byte 02h, 00h, "TIPO DI TEST:", 01h .byte 03h, 00h, "1 - SEMPLICE", 01h .byte 04h, 00h, "2 - AVANZATO", 01h .byte 05h, 00h, "3 - FINE PROGRAMMA", 01h .byte 07h, 00h, "SCEGLI: ", 00h help: .byte 09h, 00h, "1-VIENE CONTROLLATA " .byte "SOLO", 01h .byte 0Ah, 00h, " LA RAM PER 00, FF, 55, AA", 01h .byte 0Bh, 00h, "2-PER OGNI INDIRIZZO " .byte "CONTROLLATO", 01h .byte 0Ch, 00h, " SI VERIFICA CHE LE ALTRE " .byte "CELLE", 01h .byte 0Dh, 00h, " DI RAM INSTALLATA NON " .byte "VENGANO", 01h .byte 0Eh, 00h, " MODIFICATE", 00h disper: .byte 086h, 0afh, 02fh, 0ffh, 08ch, 088h, 042h, 0c0h ; Err. Pag.0 errpag: .byte "ERRORE RAM IN PAGINA 0", 00h tabds1: .byte 08h, 092h, 046h, 0FFh, 0F9h, 0BFh, 0A4h, 0BFh, 0B0h ; SC. 1-2-3 tabds2: .byte 04h, 0AFh, 007h, 0F9h, 02bh ; RT.IN. tabds3: .byte 04h, 0AFh, 007h, 08Eh, 079h ; RT.FI. tabds4: .byte 04h, 0AFh, 048h, 0F9h, 02bh ; RM.IN. tabds5: .byte 04h, 0AFh, 048h, 08Eh, 079h ; RM.FI. tabds6: .byte 03h, 088h, 087h, 007h ; ATT. tabds7: .byte 03h, 086h, 0AFh, 02Fh ; ERR. tabds8: .byte 03h, 086h, 0AFh, 048h ; ERM. tabds9: .byte 06h, 0AFh, 088h, 0C8h, 0FFh, 0C0h, 0B6h ; RAM OK ;------------------------------------------------------ .org 0f7ffh .byte 00h .end