; Disassembly del file "monitor-382.bin" ; ; CPU Type: Z80 ; ; Created da DE LUCA PIETRO ; ; on Sunday, 04 of June 2006 at 03:38 PM ; ram_offset: .equ 08000h rom_offset: .equ 00000h out_cs: .equ 08h in_cs: .equ 08h key_ret .equ 80f0h rit232 .equ 10h ; delay time for 9600 bps rx param .equ 10h .org 0000h+rom_offset jp k81abh .org 0038h jp k82b9h .org 0066h jp k82b9h .org rom_offset+0100h k8003h: push hl ;Shift a sinistra display 0-1 push bc ld hl,0001h+ram_offset ld c,02h jr k0017h k800ch: push hl push bc ld hl,0006h+ram_offset ld c,04h jr k0017h k8015h: push hl push bc k0017h: dec c k0018h: dec l ld b,(hl) inc l ld (hl),b dec l dec c jr nz,k0018h ld (hl),a pop bc pop hl ret k8024h: push hl ;carica in contenuto delle locazioni 0001-0000 in A ld hl,0001h+ram_offset jr k002bh k802ah: push hl k002bh: ld a,(hl) rlca rlca rlca rlca dec l or (hl) pop hl ret k8034h: push af ;carica il contenuto di A nelle locazioni 0001-0000 push hl push bc ld hl,0001h+ram_offset jr k003fh k803ch: push af push hl push bc k003fh: ld c,02h push af and 0f0h rrca rrca rrca rrca call k8015h pop af and 0fh call k8015h pop bc pop hl pop af ret k8055h: push af ;carica in DE il contenuto delle locazioni 6-5-4-3 push hl ld hl,0004h+ram_offset call k802ah ld e,a inc l inc l call k802ah ld d,a pop hl pop af ret k0067h: ld a,11h ;spegne tutti i display 11=" " k8069h: push hl push bc ld hl,0008h+ram_offset ld c,08h k0070h: dec l dec c ld (hl),a jr nz,k0070h pop bc pop hl ret k8078h: push af ;carica il contenuto di DE sdoppiato nelle locazioni 0006-0005-0004-0003 push hl push bc ld hl,0006h+ram_offset ld a,d ld c,02h call k803ch dec l dec l ld a,e call k803ch pop bc pop hl pop af ret k008eh: push hl ;ritardo variabile di 1ms * (0021-0020) ld hl,(0020h+ram_offset) jr k0095h k8094h: push hl k0095h: push af k0096h: call k80d6h dec hl ld a,h or l jr nz,k0096h pop af pop hl ret ;se si commenta la riga successiva funziona con gli switch k80aah: jp n80aah push bc ;carica in A il valore digitato da Tastiera push hl ;attende un tasto k00ach: ld hl,08ach; era 0001 (1110)originale 456h ; ritardo di attacco 0^1 call k80ech ;NUOVA AGGIUNTA 09/08/2006 ;mostra sul display il contenuto di 0000-0007 sul display (refresh) ;invertire i bit di out display con k a massa k00afh: in a,(in_cs) ; INPUT bit 7,a jr z,k00ach dec hl ld a,h or l jr nz,k00afh k00bah: call k80ech ;nuova aggiunta 17/08/2006 ;scansione continua in a,(in_cs) ;INPUT bit 7,a ;attende 1^0 jr nz,k00bah ld b,a ld hl,0005h call k8094h ;ritardo di rilascio 09/08/2006 k00c7h: in a,(in_cs) ld c,a and 7fh cp b ; attacco=rilascio jr nz,k00c7h ;se no attendi bit 7,c jr nz,k00ach ; o se è un errore attendi un tasto pop hl pop bc ret k80d6h: push af ;genera un ritardo di 1 ms. fisso push de ld de,0097h k00dbh: dec de ld a,d or e jr nz,k00dbh pop de pop af ret k00e3h: push hl ;genera un ritardo fisso di 5 Secondi ld hl,1388h call k8094h pop hl ret k80ech: push bc ;salva bc ;mostra sul display il contenuto di 0000-0007 sul display push de ;salva de push hl ;salva hl push af ;salva af ld bc,out_cs+007h ;bc=out_cs ld de,0007h+ram_offset ;de=0007 k00f6h: ld hl,k8187h ;hl=k8187h tabella caratteri ld a,(de) ;a=(de) add a,l ;a=a+l ld l,a ;l=a ld a,(hl) ;legge dalla tabella corrispondente il carattere da inviare al display cpl ;inversione dell'output out (c),a ;out su porta call k80d6h ;NUOVA AGGIUNTA 09/08/2006 (ritardo di 1 ms persistenza di scansione ) dec e ;e=e-1 dec c ;c=c-1 ld a,c ;a=c cp 07h ;a=07 limite 8 caratteri del display jr nz,k00f6h ;ripete per tutto il display pop af ;ripristina AF pop hl ;ripristina HL pop de ;ripristina DE pop bc ;ripristina BC ret ;ritorna k810bh: inc sp ;salta la locazione di ritorno sullo stack inc sp cp 10h ;se 10 (CTRL-0) Enter jr c,k0139h cp 11h ;se 11 (CTRL-1) chiama 81d4 ripete monitor daccapo jp z,k81d4h cp 12h ;se 12 (CTRL-2) chiama 8216 visualizza e modifica "registri" jp z,k8216h cp 14h ;se 14 (CTRL-4) chiama 8296 RUN jp z,k8296h ;cp 13h ;se 13 (CTRL-3) chiama 82fb Single Step ;jp z,k82fbh ;cp 17h ;se 17 (CTRL-7) chiama 8400 Salva su nastro ;jp z,k8400h ;cp 15h ;se 15 (CTRL-5) chiama 830a Leggi da Nastro ;jp z,k830ah ;cp 16h ;se 16 (CTRL-6) chiama 835f Future Espansioni ;jp z,k835fh ;cp 1fh ;se 18 (CTRL-8) chiama 83bd Non dichiarato ;jp z,k83bdh k0139h: dec sp ;se non e' nessun comando riprista l'indirizzo di ritorno sullo stack dec sp ret k013ch: ex de,hl ;carica il contenuto di HL nelle locazioni 0006-0005-0004-0003 call k8078h call k80ech ex de,hl ret ;Tabella Registri ;caratteri A,F,B,C,D,E,L,H,1,S,P,1,P,C,00 k8178h: .db 00ah ;carattere 0A "A" .db 00fh ;carattere 0F "F" .db 00bh ;carattere 0B "b" .db 00ch ;carattere 0C "C" .db 00dh ;carattere 0d "d" .db 00eh ;carattere 0E "E" .db 016h ;carattere 16 "L" .db 015h ;carattere 15 "H" .db 001h ;carattere 1 "1" .db 005h ;carattere 5 "S" .db 017h ;carattere 17 "P" .db 001h ;carattere 1 "1" .db 017h ;carattere 17 "P" .db 00ch ;carattere 0C "C" .db 000h ;non è un carattere ma il terminator di questa tabella ;Tabella caratteri display k8187h: .db 0c0h ;carattere 0 "0" .db 0f9h ;carattere 1 "1" .db 0a4h ;carattere 2 "2" .db 0b0h ;carattere 3 "3" .db 099h ;carattere 4 "4" .db 092h ;carattere 5 "5" o "S" .db 082h ;carattere 6 "6" .db 0d8h ;0f8h ;carattere 7 "7" .db 080h ;carattere 8 "8" .db 090h ;carattere 9 "9" .db 088h ;carattere 0A "A" .db 083h ;carattere 0B "b" .db 0c6h ;carattere 0C "C" .db 0a1h ;carattere 0d "d" .db 086h ;carattere 0E "E" .db 08eh ;carattere 0F "F" .db 0bfh ;carattere 10 "-" .db 0ffh ;carattere 11 " " blank .db 0abh ;carattere 12 "n" bassa .db 09dh ;carattere 13 "u" alta .db 0b6h ;carattere 14 "3" linee orizzontali" .db 089h ;carattere 15 "H" .db 0c7h ;carattere 16 "L" .db 08ch ;carattere 17 "P" .db 0a7h ;carattere 18 "c" bassa .db 0c2h ;carattere 19 "G" .db 0c8h ;carattere 1A "N" .db 098h ;carattere 1B "q" .db 0afh ;carattere 1C "r" .db 087h ;carattere 1D "t" .db 0c1h ;carattere 1E "U" .db 0e3h ;carattere 1F "u" bassa .db 0e1h ;carattere 20 "J" .db 091h ;carattere 21 "Y" .db 0ffh ;carattere 22 " " blank .db 0ffh ;carattere 23 " " blank ;/* ;d7 d6 d5 d4 d3 d2 d1 d0 ; p g f e d c b a ;0 = ON ;1 = OFF ; a ; * ***** * ; * * ; f * * b ; * * ; * g * ; ***** ; * * ; e * * c ; * * ; * * ; * ***** * ; d ** p ; ** ;*/ ;nota le locazioni 0000-0007+ram offset sono le cifre sul il display ;le locazioni 0008-000f+ram_offset sono i registri ;/* inizio monitor */ k81abh: ld a,00 ;inizializzaione key_ret ld (key_ret),a ld hl,0000h ; ld (0022h+ram_offset),hl ;0022=00 0023=00 dec l ;l=ff k81b2h: dec h ;h=ff ld a,(hl) ;prende il valore di a cpl ;inverte a; ld (hl),a ;lo rimette a posto cp (hl) ;controlla che il valore depositato è uguale ad A jr nz,k81b2h ;se non è uguale non è un blocco di memoria cpl ;inverte a ld (hl),a ;ripristina il valore iniziale inc hl ;sp = hl-1 ld sp,hl ;fin qui esplora tutta la memoria a partire dalla cima loc 65535 ;a blocchi di 256 bytes alla volta ;fino a trovare la parte più alta della ram e qui posiziona SP k01bdh: ld hl,9000h ;hl=0066 (Stack programma utente - SP) ld (0010h+ram_offset),hl ;0010=66 0011=00 ;ld a,0c3h ;a=C3 codice istruzine jp (jump) ;ld (0038h),a ;0038=c3 ;ld (0066h),a ;0066=c3 ;ld hl,82b9h ;hl = 82b9 ;ld (0039h),hl ;0039 =b9 003a=82 ;ld (0067h),hl ;0067 =b9 0068=82 ;la sub 82b9 inizializza il display ma non viene per chiamata ;nel monitor viene utilizzata per il breakpoint k81d4h: ld a,10h ;a=carattere 10 "-" call k8069h ;le locazioni da 0000-0006= "-" k01d9h: ld hl,0007h+ram_offset ;hl=0007 ld (hl),12h ;0007=carattere 12 "n" bassa k81deh: call k80ech ;aggiorna il display con i codici memorizzati in 0000-0007 call k80aah ;attende un dato da tastiera call k810bh ;testa se Š un comando riconosciuto cp 10h ;se Š il comando 10 salta a 1f0 (ctrl - 0) jr z,k81f0h ;salta a 1f0 (ctrl - 0) ; /* ALTRIMENTI è IN MODALITà DI DIGITAZIONE DELL'INDIRIZZO */ ;/* INPUT INDIRIZZO (DISPLAY 3-5-4-3 )*/ k01ebh: call k800ch ;shift a sinistra dei display 6-5-4-3 jr k81deh ;aggiorna il display e torna all'attesa del carattere ;ed il contenuto del registro a nel display 3 ;/* INPUT DATI ( DISPLAY 0-1) */ k81f0h: call k8055h ;NOTA siamo a 1f0 carica in DE il numero contenuto in 6,5,4,3 ld a,(de) ;a=(de) legge in a il contenuto della locazione sul display call k8034h ;carica il contenuto di A nelle locazioni 0001 e 0000 k81f7h: call k80ech ;aggiorna il display con i codici memorizzati in 0000-0007 call k80aah ;attende un dato da tastiera call k810bh ;testa se Š un comando cp 10h ;testa se "ctrl-0" jr z,k8209h ;se ctrl-0 vai a 0209 call k8003h ;shift a sinistra del display 0-1 jr k81f7h ;torna a 1f7 (cicla finchŠ non si digita un comando) k8209h: call k8055h ;carica in DE il numero contenuto in 6,5,4,3 call k8024h ;carica in a il contenuto dei primi due display ld (de),a ;(de)=a inc de ;inc DE call k8078h ;carica il contenuto di DE nelle locazioni 0006-0005-0004-0003 jr k81f0h ;torna ad 1f0 k8216h: ld a,10h ;mostra il contenuto dei registri call k8069h ;0000-0007="-" ld hl,0007h+ram_offset ;hl=0007 ld (hl),13h ;(0007)=13 "u" ld bc,0008h+ram_offset ;bc=0008 memoria che contiene i valori di registro ld hl,k8178h ;hl=8178 inizio tabella registri la tabella termina con 00 k8226h: ld a,(hl) ;a=(8178) a=0a or a ;a=a or a jr z,k8216h ;se a = 0 ripeti daccapo la visualizzazione dei registri dec a ;a=a-1 jr z,k824ah ;se a=0 vai a 24a (vuol dire che ci sono 2 caratteri) call k828dh ;1 solo carattere quindi mostra il registro attuale e il suo contenuto k8230h: call k80ech ;aggiorna il display call k80aah ;attendi un numero da tastiera distrugge il registro A call k810bh ;controlla se Š un comando cp 10h ;se Š enter jr z,k8242h ;salta a 242 call k8003h ;shift a sinistra del carattere digitato jr k8230h ;salta indietro a 230 k8242h: call k8024h ;enter modifica il contenuto del display carica in a il contenuto dei display ld (bc),a ;modifica il contenuto del "registro" k8246h: inc hl ;hl=hl+1 inc bc ;bc=bc+1 jr k8226h ;continua la visualizzazione degli altri registri k824ah: inc hl ;registro a 16 bit hl=hl+1 call k828dh ;gosub 828d mostra il registro attuale e il suo contenuto inc hl ;hl=hl+1 inc bc ;bc=bc+1 k8250h: ld a,(hl) ;ed ora la parte alta del registro ld (0005h+ram_offset),a ;mostra il nome ld a,(bc) ;legge il contenuto push hl ;salva hl push bc ;salva bc ld hl,0003h+ram_offset ;hl=0003 ld c,02h ;c=2 call k803ch ;sdoppia il registro A in due locazioni successive 0003-0004 pop bc ;riprista bc pop hl ;ripristina hl k8261h: call k80ech ;aggiorna il display call k80aah ;attendi un numero da tastiera distrugge il registro A call k810bh ;controlla se Š un comando cp 10h ;se Š enter jr z,k827ch ;salta a 27c aggiorna il contenuto del registro push hl ;salva hl push bc ;salva bc ld hl,0003h+ram_offset ;hl=0003 ld c,04h ;c=04 call k8015h ;shift display pop bc ;ripristina bc pop hl ;ripristina hl jr k8261h ;continua l'input a 16 bit k827ch: call k8024h ;carica in a il contenuto dei primi due display dec bc ;bc=bc-1 ld (bc),a ;bc=a push hl ;salva hl ld hl,0003h+ram_offset ;hl=2 call k802ah ;carica in al il contenuto di 2due dispaly adiacenti pop hl ;ripristina hl inc bc ;bc=bc+1 ld (bc),a ;bc=a jr k8246h ;continua la visualizzazione degli altri registri k828dh: ld a,(hl) ;a=(hl) ld (0006h+ram_offset),a ;0006=a il display conterr… "uA------" e cos via ld a,(bc) ;a=(bc) registro attuale a 8 bit call k8034h ;carica il contenuto di a nelle locazioni 0001 e 0000 ret ;ritorna k8296h: ld hl,(0010h+ram_offset) ;RUN ld sp,hl ld hl,(0012h+ram_offset) push hl call k82a3h ei ret k82a3h: ld hl,0008h+ram_offset ;hl=0008 ld a,03h ;a=03 k82a8h: ld d,(hl) ;d=(0008) inc hl ;hl=hl+1 ld e,(hl) ;d=(0009) inc hl ;hl=hl+1 push de ;salva de dec a ;a=a-1 a=2 jr nz,k82a8h ; ld e,(hl) inc hl ld d,(hl) push de pop hl pop de pop bc pop af ret k82b9h: ld (000eh+ram_offset),hl ;000e=h 000f=l return dal programma utente Š interrupt ld (0008h+ram_offset),a ;0008=a push af ;af sullo stack pop hl ;hl=af; ld (0009h+ram_offset),hl ;0009=h 0008=l ld hl,000ah+ram_offset ;hl=000a ld (hl),b ;000a=b inc l ;hl=000b ld (hl),c ;000b=c inc l ;hl=000c ld (hl),d ;000c=d inc l ;hl=000d ld (hl),e ;000d=e pop hl ;hl=stack ? ld (0012h+ram_offset),hl ;0012 = h 0013 =l ld hl,0000h ;hl=0000; add hl,sp ;hl=hl+sp ld (0010h+ram_offset),hl ;0010=l 0011=h ld a,10h ;a=10 call k8069h ;0000-0007 =a =10 "-" ld hl,0007h+ram_offset ;hl=0007 ld (hl),14h ;0007=14 "n" ld hl,(0012h+ram_offset) ;hl=12 ex de,hl ;de=hl hl=de call k8078h ;carica il contenuto di DE sdoppiato nelle locazioni 0006 0005 0004 0003 ld a,(de) ;a=(de) call k8034h ;carica il contenuto di A nelle locazioni 0001 e 0000 k82eeh: call k80ech ;mostra sul display il contenuto delle celle 0000-0007 (tabella di corrispondenza) call k80aah ;resta in attesa di un tasto call k810bh ;testa se Š un comando ed eseguilo cp 10h ;testa il carattere ricevuto in a jr nz,k82eeh ;se Š diverso da 10 salta a 2ee k82fbh: ld hl,(0010h+ram_offset) ;Single Step ld sp,hl ;sp=hl ld hl,(0012h+ram_offset) ;(hl=12) push hl ;salva=hl (lo stack9 call k82a3h ;ripristina tutti i registri dallo stack ;out (0f8h),a ;out 0f8 =a dove retn ;il programma utente parte con un call (ed il return) k830ah: ret ;non serve k8338h: ret ;non serve k835fh: ret ;non serve k83bdh: ret ;non serve k8400h: ret ;fuori rom ;**************************************************************************** rx232: ;ritorna in a un byte seriale ricevuto su bit d6 a 9600 bps push hl push de push bc ld hl,rit232 ; delay ld b,8 ; number of bits rx1: call sample ; get in port status jr c,rx1 ; jump if low push hl ld hl,rit232/2 ; get a sample in the middle call ritardo ; wait pop hl call sample jr c,rx1 ; jump if not start bit rx2: call ritardo call sample rr c djnz rx2 ld hl,rit232/2 call ritardo ld a,c ; return byte pop bc pop de pop hl ret sample: in a,(in_cs) and 40h ; check input port bit (bit d6) scf ; set carry if zero ret z ccf ret ;**************************************************************************** ritardo: ;ritardo con valore di hl push hl ; 11 save hl push af ; 11 save a rit1: dec hl ; 6 - 6 dec the count ld a,l ; 4 - 4 get l or h ; 4 - 4 or with h jr nz,rit1 ; 12 - 7 loop till both are zero pop af ; 10 restore a pop hl ; 10 restore hl ret ; ;26 *(hl-1) + 41 ;caso rit232 = 15*26 + 63 = 453 * 0.25 = 113.25 microsec ;caso rit232/2 = 7*26 + 63 = 245* 0.25 = 61.25 microsec ; ;********************************************************************************* n80aah: push bc ;carica in A il valore digitato da Tastiera push hl ;attende un tasto n00ach: ld hl,0006h ;0001 ;ritardo di attacco 0^1 ;mostra sul display il contenuto di 0000-0007 sul display (refresh) ;invertire i bit di out display con k a massa ; INPUT n00afh: call n80ech ;NUOVA AGGIUNTA 09/08/2006 ld a,(key_ret) ;in a,(in_cs) bit 7,a jr z,n00ach dec hl ld a,h or l jr nz,n00afh ;testa solo il bit di strobe (persistenza hl) n00bah: call n80ech ;quando il contatore di persistenza ha raggiunto il valore anti_debounce ;nuova aggiunta 17/08/2006 ;scansione continua ;in a,(in_cs) ;INPUT ld a,(key_ret) bit 7,a ;attende 1^0 jr nz,n00bah ;in atessa del rilascio ;ld hl,0005h ;call k8094h ;ritardo di rilascio 09/08/2006 pop hl pop bc ret ;********************************************************************************************* n80ech: push bc ;salva bc ;mostra sul display il contenuto di 0000-0007 sul display push de ;salva de push hl ;salva hl push af ;salva af ld a,(key_ret);legge key_ret ;res 4,a ;azzera ctrl ad ogni scansione res 7,a ;azzera lo strobe ad ogni scansione ld (key_ret),a;aggiorna key_ret ld bc,out_cs+007h ;bc=out_cs ld de,0007h+ram_offset ;de=0007 n00f6h: ld hl,k8187h ;hl=k8187h tabella caratteri ld a,(de) ;a=(de) add a,l ;a=a+l ld l,a ;l=a ld a,(hl) ;legge dalla tabella corrispondente il carattere da inviare al display cpl ;inversione dell'output (k comune) out (c),a ;out su porta del carattere call k80d6h ;NUOVA AGGIUNTA 09/08/2006 (ritardo di 1 ms persistenza di scansione ) call read_data dec e ;e=e-1 dec c ;c=c-1 ld a,c ;a=c cp 07h ;a=07 limite 8 caratteri del display jr nz,n00f6h ;ripete per tutto il display pop af ;ripristina AF pop hl ;ripristina HL pop de ;ripristina DE pop bc ;ripristina BC ret ;ritorna ;******************************************************************************************* ;acquisice l'eventuale tasto premuto ;e ricostruisce il key_ret read_data: push bc get_data: in a,(in_cs) ;flash sulla condizione delle linee di ingresso su scansione corrente ld b,a test_0: bit 0,a ;test se bit d0=0 jr nz,test_1 ;altrimenti test successivo ld a,c ;a contatore di colonna attuale sub 08h ;calcola la cifra corrente (0-7) sla a sla a ;a= colonna * 4 add a,00h ;riga rilevata set 7,a bit 4,b ;testa shift jr nz,no_shift_0 ; set 4,a ;setta bit 4 di a no_shift_0: ld (key_ret),a ;key_ret ok jr fine_chk test_1: bit 1,a ;test se bit d1=0 jr nz,test_2 ;altrimenti test successivo ld a,c sub 08h sla a sla a ;a= colonna * 4 add a,01h ;riga rilevata set 7,a bit 4,b jr nz,no_shift_1 set 4,a no_shift_1: ld (key_ret),a jr fine_chk test_2: bit 2,a ;test se bit d2=0 jr nz,test_3 ;altrimenti test successivo ld a,c sub 08h sla a sla a ;a= colonna * 4 add a,02h ;riga rilevata set 7,a bit 4,b jr nz,no_shift_2 set 4,a no_shift_2: ld (key_ret),a jr fine_chk test_3: bit 3,a ;test se bit d3=0 jr nz,fine_chk ;altrimenti prosegui nel programma di scansione ld a,c sub 08h sla a sla a ;a= colonna * 4 add a,03h ;riga rilevata set 7,a bit 4,b jr nz,no_shift_3 set 4,a no_shift_3: ld (key_ret),a fine_chk: pop bc ret .end