0001 0000 ;------------------------------------------------------ 0002 0000 ; 0003 0000 ; Monitor multi-firmware per start-up 0004 0000 ; computer Z80 Nuova Elettronica 0005 0000 ; 0006 0000 ; Copyright Roberto Bazzano 2006 - 2026 0007 0000 ; 0008 0000 ;------------------------------------------------------ 0009 0000 ; 0010 0000 ; BANCHI 2 e 3 - Allocati da F800h a FFFFh 0011 0000 ; 0012 0000 ; NOTA: durante tutto il codice il registro B' contiene 00h se c'è la scheda video vecchia. Se non c'è contiene FFh 0013 0000 ; Il registro C' contiene il numero della pagina di menù visualizzata a video 0014 0000 ; Il registro D' se <> 00h indica che la routine "input" deve controllare anche il backspace (utilizzato dal programma di test della ram) 0015 0000 ; NOTA: I registri alternativi non vengono utilizzati dai monitor esadecimali 0016 0000 ; 0017 0000 ;------------------------------------------------------ 0018 0000 ; 0019 0000 ; CHANGELOG: 0020 0000 ; Rel. 1.3: inserito controllo presenza schede video 0021 0000 ; 09/01/2023 0022 0000 ; 0023 0000 ; Rel. 1.4: aggiunte voci di menù S1 e S2 0024 0000 ; 01/11/2024 spostato parte del codice in monitor1.asm 0025 0000 ; aggiunti entry point nell jump table iniziale 0026 0000 ; 0027 0000 ; Rel. 1.5: eliminata voce di menù "E" (restart a 1000h) e shift delle voci successive indietro 0028 0000 ; 20/11/2024 aggiunta voce di menù S2 (basic Microsoft AG4) 0029 0000 ; modificata voce di menù D in "JUMP A INDIRIZZO" con richiesta indirizzo esadecimale a cui saltare 0030 0000 ; 0031 0000 ; Rel. 1.6: aggiunto disassembler della eprom AG3 0032 0000 ; 21/11/2024 0033 0000 ; 0034 0000 ; Rel. 1.7: aggiunta richiesta banco da mappare per la funzione di menù "D" 0035 0000 ; 22/11/2024 0036 0000 ; 0037 0000 ; Rel. 1.8: corretto bug che mandava in crash la funzione "conversione floppy" 0038 0000 ; 25/11/2024 modificata funzione "prova tastiera". Ora visualizza su entrambi i video e gestisce i tasti BREAK 0039 0000 ; 0040 0000 ; Rel. 1.9: modificato test della ram per aumentare le performance. 0041 0000 ; 27/04/2025 Ora l'indirizzo in fase di test viene visualizzato solo ogni 0100h bytes 0042 0000 ; 0043 0000 ; Rel. 1.10: corretto bug che non caricava la EP.382 per l'opzione di menu 1 0044 0000 ; 08/06/2026 0045 0000 ; 0046 0000 0047 0000 banco .equ 05fh ; porta di I/O per la selezione del banco di memoria della EPROM 0048 0000 0049 0000 ;------------------------------------------------------ 0050 0000 ; ROUTINES ED INDIRIZZI DI MONITOR1.ASM 0051 0000 ;------------------------------------------------------ 0052 0000 0053 0000 menu1 .equ 0f000h 0054 0000 menu2 .equ 0f200h 0055 0000 menu3 .equ 0f400h 0056 0000 curs .equ 0f5f0h 0057 0000 0058 0000 0059 0000 ;------------------------------------------------------ 0060 0000 ; INDIRIZZI E JUMP TABLE DI TESTRAM4.ASM 0061 0000 ;------------------------------------------------------ 0062 0000 0063 0000 ; Indirizzi working area 0064 0000 cursd .equ 000fch ; posizione del cursore sui display 0065 0000 0066 0000 ; Jump table 0067 0000 inizio .equ 0F000h ; inizio programma 0068 0000 vis .equ 0F003h ; visualizza il messaggio puntato da HL 0069 0000 inp .equ 0F006h ; input dell'indirizzo di 4 caratteri in HL 0070 0000 0071 0000 0072 0000 ;------------------------------------------------------ 0073 0000 0074 0000 0075 F800 .org 0f800h 0076 F800 0077 F800 ; JUMP table 0078 F800 C3 42 F8 jp start ; F800h inizio firmware 0079 F803 C3 02 FC jp input ; F803h routine input da tastiere per monitor esadecimale 0080 F806 C3 D2 FC jp video ; F806h routine output video per monitor esadecimale (visualizza su monitor vecchio, nuovo, e display tastiera esadecimale) 0081 F809 C3 C8 FD jp lf0a5 ; F809h routine f0a5h identica a quella della eprom 2390 (inizializza i registri del SY6545 ed i PIO) 0082 F80C C3 A3 FD jp lf060 ; F80Ch routine f060h identica a quella della eprom 2390 (carica in R14, R15, R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare) 0083 F80F C3 B3 FD jp lf06e ; F80Fh routine f06eh identica a quella della eprom 2390 (carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare) 0084 F812 C3 E2 FA jp checv ; F812h routine calcolo presenza scheda video vecchia 0085 F815 C3 00 FB jp chect ; F815h routine controllo presenza scheda video vecchia 0086 F818 C3 20 FB jp waitv ; F818h routine di attesa ritraccia video vecchio 0087 F81B C3 B5 FB jp waitn ; F81Bh routine di attesa ritraccia video nuovo 0088 F81E C3 A2 FB jp writen ; F81Eh routine di scrittura carattere sul video nuovo 0089 F821 C3 49 FB jp cursor ; F821h routine di accensione/spegnimento cursore sul video nuovo 0090 F824 C3 BE FB jp vloc ; F824h calcola la locazione del video vecchio in base alla riga/colonna nella locazione puntata da HL e HL+1 per il video vecchio 0091 F827 C3 D0 FB jp nloc ; F827h calcola la locazione del video nuovo in base alla riga/colonna nella locazione puntata da HL e HL+1 per il video nuovo 0092 F82A C3 C5 FB jp vloc1 ; F82Ah calcola la locazione del video vecchio in base alla riga/colonna contenute in BC 0093 F82D C3 D7 FB jp nloc1 ; F82Dh calcola la locazione del video nuovo in base alla riga/colonna contenute in BC 0094 F830 C3 09 FB jp initv ; F830h pulizia video vecchio 0095 F833 C3 2E FB jp initn ; F833h pulizia video nuovo 0096 F836 C3 18 FE jp ctabdi ; F836h calcola l'indirizzo della tabella TABDIS, per la conversione dei valori da visualizzare sui display, e lo ritorna in HL 0097 F839 C3 74 FD jp vdisp ; F839h visualizza un messaggio puntato da HL sui display 0098 F83C C3 92 FD jp vdispc ; F83Ch visualizza il carattere contenuto in A sul display puntato da C, convertendolo nel formato compatibile con i caratteri dei display 0099 F83F C3 A5 FB jp write1 ; F83Fh routine di scrittura carattere sul video nuovo senza attendere la ritraccia video 0100 F842 0101 F842 0102 F842 F3 start: di ; disabilita gli interrupt 0103 F843 21 ED 45 ld hl,045edh ; inizializza il vettore per l'NMI 0104 F846 22 66 00 ld (0066h),hl ; mettendo l'istruzione RETN (ED 45) 0105 F849 0106 F849 AF xor a ; spegne il motore del floppy 0107 F84A D3 D6 out (0d6h),a 0108 F84C 0109 F84C D9 exx ; inizializza il registro D' in modo che l'input da tastiera NON controlli anche il backspace 0110 F84D 57 ld d,a 0111 F84E D9 exx 0112 F84F 0113 F84F 3E 28 ld a,28h ; seleziona il banco con le subroutines. IMPORTANTE: questo banco deve rimanere sempre selezionato durante l'esecuzione del monitor multifirmware 0114 F851 D3 5F out (banco),a 0115 F853 0116 F853 ;------------------------------------------------------ 0117 F853 ; Lancia test ram se al boot è stato premuto ESC (sulle tastiere alfanumeriche) o CTRL+F (sulla tastiera esadecimale) 0118 F853 ;------------------------------------------------------ 0119 F853 0120 F853 3E CF ld a,0cfh ; inizializza il PIO 1/B (tastiera) 0121 F855 D3 87 out (87h),a 0122 F857 AF xor a 0123 F858 3D dec a 0124 F859 D3 87 out (87h),a 0125 F85B 0126 F85B tram1: ; controlla se esiste la scheda video vecchia 0127 F85B 21 00 00 ld hl,00000h ; inizializza il contatore 0128 F85E 0129 F85E 23 tram2: inc hl ; attende al massimo fino a che HL non diventa 1000h 0130 F85F 7C ld a,h ; infatti la ritraccia a "1" come tempo resta al massimo con HL a 0111h 0131 F860 FE 10 cp 10h ; se impiega più tempo significa che la scheda LX.388 non è presente 0132 F862 28 14 jr z,tram3 ; ha superato il timeout, quindi la scheda video vecchia non c'è 0133 F864 0134 F864 DB EB in a,(0ebh) ; controlla se c'è la ritraccia video 0135 F866 CB 7F bit 7,a 0136 F868 20 F4 jr nz,tram2 ; ritraccia non trovata, looppa 0137 F86A 0138 F86A 21 00 30 ld hl,03000h ; fa un ritardo per permettere alle tastiere di assestarsi all'accensione o al reset 0139 F86D 2B tram2a: dec hl 0140 F86E 7C ld a,h 0141 F86F B5 or l 0142 F870 20 FB jr nz,tram2a 0143 F872 0144 F872 DB EA in a,(0eah) ; controlla se c'è un tasto premuto sulla tastiera vecchia 0145 F874 CB 7F bit 7,a 0146 F876 20 17 jr nz,tram5 ; tasto premuto sulla tastiera vecchia 0147 F878 0148 F878 DB 85 tram3: in a,(085h) ; controlla se c'è un tasto premuto sulla tastiera nuova 0149 F87A 2F cpl 0150 F87B CB 7F bit 7,a 0151 F87D 20 10 jr nz,tram5 ; tasto premuto sulla tastiera nuova 0152 F87F 0153 F87F 01 FF 01 ld bc,01ffh ; controlla se c'è un tasto premuto sulla tastiera esadecimale 0154 F882 DB F0 tram4: in a,(0f0h) ; fa 255 input. Quello che è il bin 7 a 0 è il tasto premuto (a causa del contatore hardware che fa lo scan dei tasti) 0155 F884 CB 7F bit 7,a 0156 F886 28 24 jr z,tram8 ; tasto premuto sulla tastiera esadecimale 0157 F888 0B dec bc 0158 F889 78 ld a,b 0159 F88A B1 or c 0160 F88B 20 F5 jr nz,tram4 0161 F88D 0162 F88D 18 21 jr sp0 ; nessun tasto premuto 0163 F88F 0164 F88F E6 7F tram5: and 7fh ; controlla se è stato premuto ESC su una tastiera alfanumerica 0165 F891 FE 1B cp 01bh 0166 F893 20 1B jr nz,sp0 0167 F895 0168 F895 21 B8 FE tram6: ld hl,out11 ; visualizza "test ram" sui display 0169 F898 01 F7 08 ld bc,08F7h 0170 F89B 7E tram7: ld a,(hl) 0171 F89C ED 79 out (c),a 0172 F89E 23 inc hl 0173 F89F 0D dec c 0174 F8A0 05 dec b 0175 F8A1 AF xor a 0176 F8A2 B8 cp b 0177 F8A3 20 F6 jr nz,tram7 0178 F8A5 0179 F8A5 3E 26 ld a,26h ; seleziona il banco del programma per il test della ram 0180 F8A7 D3 5F out (banco),a 0181 F8A9 C3 00 F0 jp 0f000h ; salta al programma per il test della ram 0182 F8AC 0183 F8AC FE 1F tram8: cp 01fh ; controlla se è stato premuto CTRL+F sulla tastiera esadecimale 0184 F8AE 28 E5 jr z,tram6 0185 F8B0 0186 F8B0 ;------------------------------------------------------ 0187 F8B0 0188 F8B0 21 FF EB sp0: ld hl,0ebffh ; cerca dove posizionare lo SP prima di EC00 0189 F8B3 7E sp1: ld a,(hl) 0190 F8B4 2F cpl 0191 F8B5 77 ld (hl),a 0192 F8B6 BE cp (hl) 0193 F8B7 28 03 jr z,sp3 0194 F8B9 2B sp2: dec hl 0195 F8BA 18 F7 jr sp1 0196 F8BC 2F sp3: cpl 0197 F8BD 77 ld (hl),a 0198 F8BE BE cp (hl) 0199 F8BF 20 F8 jr nz,sp2 0200 F8C1 2B dec hl ; lo SP deve avere almeno una locazione di ram scrivibile dopo di lui, altrimenti EX (SP),HL non funziona 0201 F8C2 F9 ld sp,hl 0202 F8C3 0203 F8C3 CD C8 FD call lf0a5 ; inizializza i registri del SY6545 ed i PIO 0204 F8C6 0205 F8C6 CD E2 FA call checv ; imposta il registro B' che indica se esiste la scheda video vecchia 0206 F8C9 0207 F8C9 21 62 FE tast0: ld hl,out0 ; visualizza il messaggio "SELECT" sui display 0208 F8CC CD 74 FD call vdisp 0209 F8CF 0210 F8CF CD 52 FB call vmenu1 ; pulisce i video e visualizza il menù 0211 F8D2 0212 F8D2 CD 02 FC tast0a: call input ; input da tastiere 0213 F8D5 F5 push af ; salva il numero digitato 0214 F8D6 0215 F8D6 FE 10 cp 10h 0216 F8D8 28 2E jr z,tast0c ; se è stato premuto CR salta subito al controllo del tasto 0217 F8DA 0218 F8DA FE 14 cp 14h ; se è maggiore di SHIFT+3 looppa 0219 F8DC 30 F4 jr nc,tast0a 0220 F8DE FE 01 cp 01h ; se è minore di 1 looppa 0221 F8E0 38 F0 jr c,tast0a 0222 F8E2 0223 F8E2 21 F0 F5 ld hl,curs ; calcola la posizione sul video vecchio per visualizzare il numero digitato 0224 F8E5 CD BE FB call vloc ; calcola in DE l'indirizzo del video in base alla riga/colonna nella locazione puntata da HL e HL+1 0225 F8E8 0226 F8E8 FE 11 cp 11h ; confronta il numero digitato con 11h 0227 F8EA CD 9B FA call convnu ; converte il numero nei caratteri che rappresentano la voce di menù (AF non viene toccato) 0228 F8ED 30 07 jr nc,tast0b ; se il numero digitato è >=11h e quindi deve visualizzare due caratteri va a tast0b 0229 F8EF 0230 F8EF 7D ld a,l ; recupera il carattere da visualizzare 0231 F8F0 12 ld (de),a ; visualizza il carattere sul video vecchio 0232 F8F1 CD A2 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0233 F8F4 18 12 jr tast0c 0234 F8F6 0235 F8F6 7C tast0b: ld a,h ; recupera il primo carattere da visualizzare 0236 F8F7 12 ld (de),a ; visualizza il primo carattere sul video vecchio 0237 F8F8 CD A2 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0238 F8FB 13 inc de ; punta alla posizione del successivo carattere a video 0239 F8FC 7D ld a,l ; recupera il secondo carattere da visualizzare 0240 F8FD 12 ld (de),a ; visualizza il secondo carattere sul video vecchio 0241 F8FE CD A2 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0242 F901 0243 F901 13 inc de ; punta alla posizione del successivo carattere a video 0244 F902 3E 3C ld a,'<' ; visualizza il carattere "<" 0245 F904 12 ld (de),a ; sul video vecchio 0246 F905 CD A2 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0247 F908 0248 F908 F1 tast0c: pop af ; ripristina il numero digitato 0249 F909 0250 F909 21 1C FE ld hl,tabtas ; calcola il puntatore all'indirizzo della routine presente nella tabella TABTAS e ci salta 0251 F90C C3 B1 FA jp punt 0252 F90F 0253 F90F tast1: ; se 1 lancia il boot del basic da 5.5 K 0254 F90F 21 A0 FE ld hl,out8 ; messaggio da visualizzare sul display 0255 F912 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0256 F915 3E 04 ld a,04h ; seleziona il banco del monitor esadecimale originale 0257 F917 11 00 80 ld de,08000h ; seleziona l'indirizzo di destinazione 0258 F91A 06 01 ld b,01h ; seleziona il numero di banchi da spostare 0259 F91C CD D1 FA call setban ; sposta il banco in ram 0260 F91F 0261 F91F 3E 19 ld a,19h ; seleziona il banco del basic da 5.5 K su floppy 0262 F921 D3 5F out (banco),a 0263 F923 C3 00 F0 jp 0f000h 0264 F926 0265 F926 tast2: ; se 2 lancia il boot vecchio 0266 F926 21 6A FE ld hl,out1 ; messaggio da visualizzare sul display 0267 F929 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0268 F92C 3E 00 ld a,00h ; seleziona il banco della 1390 0269 F92E D3 5F out (banco),a 0270 F930 C3 00 F0 jp 0f000h 0271 F933 0272 F933 tast3: ; se 3 lancia il boot grafic 0273 F933 21 73 FE ld hl,out2 ; messaggio da visualizzare sul display 0274 F936 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0275 F939 3E 01 ld a,01h ; seleziona il banco della 2390 0276 F93B D3 5F out (banco),a 0277 F93D C3 00 F0 jp 0f000h 0278 F940 0279 F940 tast4: ; se 4 lancia il boot del S.O.N.E. 0280 F940 21 A9 FE ld hl,out9 ; messaggio da visualizzare sul display 0281 F943 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0282 F946 3E 1A ld a,1Ah ; seleziona il banco del s.o.n.e. 0283 F948 D3 5F out (banco),a 0284 F94A C3 00 F0 jp 0f000h 0285 F94D 0286 F94D tast5: ; se 5 lancia il basic in rom rilocato in ram 0287 F94D 21 7C FE ld hl,out3 ; messaggio da visualizzare sul display 0288 F950 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0289 F953 3E 08 ld a,08h ; seleziona il primo banco del basic in rom 0290 F955 11 00 00 ld de,00000h ; seleziona l'indirizzo di destinazione 0291 F958 06 08 ld b,08h ; seleziona il numero di banchi da spostare 0292 F95A CD D1 FA call setban ; sposta gli 8 banchi da 2K in ram 0293 F95D C3 00 00 jp 0000h ; salta al basic 0294 F960 0295 F960 tast6: ; se 6 lancia il monitor esadecimale originale non rilocato 0296 F960 CD C5 FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0297 F963 3E 04 ld a,04h ; seleziona il banco del monitor esadecimale originale 0298 F965 11 00 80 ld de,08000h ; seleziona l'indirizzo di destinazione 0299 F968 06 01 ld b,01h ; seleziona il numero di banchi da spostare 0300 F96A CD D1 FA call setban ; sposta il banco in ram 0301 F96D C3 00 80 jp 8000h 0302 F970 0303 F970 tast7: ; se 7 lancia il monitor esadecimale non rilocato con lo SP rilocato prima di EC00 con il firmware non rilocato per il programmatore di eprom 0304 F970 CD C5 FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0305 F973 3E 20 ld a,20h ; seleziona il banco del monitor esadecimale con SP rilocato 0306 F975 11 00 80 ld de,08000h ; seleziona l'indirizzo di destinazione 0307 F978 06 01 ld b,01h ; seleziona il numero di banchi da spostare 0308 F97A CD D1 FA call setban ; sposta il banco in ram 0309 F97D C3 00 80 jp 8000h 0310 F980 0311 F980 tast8: ; se 8 lancia il monitor esadecimale rilocato con lo SP rilocato prima di EC00 per la tastiera alfanumerica con il firmware rilocato per il programmatore di eprom 0312 F980 CD C5 FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0313 F983 3E 1C ld a,1Ch ; seleziona il banco del monitor esadecimale rilocato per la tastiera alfanumerica 0314 F985 D3 5F out (banco),a 0315 F987 C3 00 F0 jp 0f000h 0316 F98A 0317 F98A tast9: ; se 9 lancia il monitor esadecimale rilocato con lo SP rilocato prima di EC00 per la tastiera esadecimale con il firmware rilocato per il programmatore di eprom 0318 F98A CD C5 FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0319 F98D 3E 1E ld a,1Eh ; seleziona il banco del monitor esadecimale rilocato per la tastiera esadecimale 0320 F98F D3 5F out (banco),a 0321 F991 C3 00 F0 jp 0f000h 0322 F994 0323 F994 tastA: ; se A lancia direttamente il bootstrap multiplo 0324 F994 21 8D FE ld hl,out5 ; messaggio da visualizzare sul display 0325 F997 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0326 F99A 3E 06 ld a,06h ; seleziona il banco della 2390 modificata per non fare il check sul disco di boot 0327 F99C D3 5F out (banco),a 0328 F99E C3 7D F1 jp 0f17dh ; salta direttamente al BOOT 0329 F9A1 0330 F9A1 tastB: ; se B lancia il loader del basic da 5.5 K 0331 F9A1 CD C5 FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0332 F9A4 3E 04 ld a,04h ; seleziona il banco del monitor esadecimale originale 0333 F9A6 11 00 80 ld de,08000h ; seleziona l'indirizzo di destinazione 0334 F9A9 06 01 ld b,01h ; seleziona il numero di banchi da spostare 0335 F9AB CD D1 FA call setban ; sposta il banco in ram 0336 F9AE 0337 F9AE 3E 18 ld a,18h ; seleziona il banco del loader del basic da 5.5 K su cassetta 0338 F9B0 11 00 00 ld de,00000h ; seleziona il banco indicato da A e lo sposta in ram 0339 F9B3 06 01 ld b,01h ; seleziona il numero di banchi da spostare 0340 F9B5 CD D1 FA call setban ; sposta il banco in ram 0341 F9B8 C3 69 00 jp 0069h ; salta al loader 0342 F9BB 0343 F9BB tastC: ; se C lancia la prova tastiera 0344 F9BB 21 94 FE ld hl,out6 ; messaggio da visualizzare sul display 0345 F9BE CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0346 F9C1 3E 24 ld a,24h ; seleziona il banco del programma con la prova tastiera 0347 F9C3 D3 5F out (banco),a 0348 F9C5 C3 00 F0 jp 0f000h 0349 F9C8 0350 F9C8 tastD: ; se D salta all'indirizzo indicato 0351 F9C8 3E 01 ld a,01h ; imposta il registro D', che indica che l'input da tastiera deve controllare anche il BACKSPACE 0352 F9CA D9 exx 0353 F9CB 57 ld d,a 0354 F9CC D9 exx 0355 F9CD 0356 F9CD 3E 20 ld a,20h ; Spegne il cursore sul video nuovo 0357 F9CF CD 49 FB call cursor 0358 F9D2 CD 09 FB call initv ; Inizializza il video vecchio 0359 F9D5 CD 2E FB call initn ; Inizializza il video nuovo 0360 F9D8 0361 F9D8 3E 26 ld a,26h ; seleziona il banco del programma per il test della ram, che contiene le routine necessarie alla funzione "vis" e "inp" 0362 F9DA D3 5F out (banco),a 0363 F9DC 21 48 FE ld hl,msgban ; visualizza "BANCO: " sui video 0364 F9DF 11 D3 FE ld de,outban ; messaggio da visualizzare sul display ("banco.") 0365 F9E2 CD 03 F0 call vis ; visualizza il messaggio puntato da HL 0366 F9E5 0367 F9E5 3E F1 ld a,0f1h ; imposta la posizione sui display 0368 F9E7 32 FC 00 ld (cursd),a 0369 F9EA 16 02 ld d,02h ; numero di caratteri in input 0370 F9EC CD 06 F0 call inp ; input del banco in HL 0371 F9EF E5 push hl ; salva il numero del banco nello stack 0372 F9F0 0373 F9F0 21 53 FE ld hl,msgadr ; visualizza "INDIRIZZO: " sui video 0374 F9F3 11 D9 FE ld de,outadr ; messaggio da visualizzare sul display ("ind.") 0375 F9F6 CD 03 F0 call vis ; visualizza il messaggio puntato da HL 0376 F9F9 0377 F9F9 3E F3 ld a,0f3h ; imposta la posizione sui display 0378 F9FB 32 FC 00 ld (cursd),a 0379 F9FE 16 04 ld d,04h ; numero di caratteri in input 0380 FA00 CD 06 F0 call inp ; input dell'indirizzo in HL 0381 FA03 0382 FA03 D1 pop de ; recupera il numero del banco 0383 FA04 E5 push hl ; salva l'indirizzo digitato nello stack 0384 FA05 0385 FA05 21 9B FE ld hl,out7 ; messaggio da visualizzare sul display 0386 FA08 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0387 FA0B 0388 FA0B 7B ld a,e ; recupera il banco da selezionare 0389 FA0C CB 3F srl a 0390 FA0E CB 3F srl a 0391 FA10 CB 3F srl a 0392 FA12 CB 3F srl a 0393 FA14 0E F2 ld c,0f2h ; imposta la posizione sui display 0394 FA16 CD 92 FD call vdispc ; visualizza il carattere sui display 0395 FA19 0396 FA19 7B ld a,e ; recupera il banco da selezionare 0397 FA1A E6 0F and 0fh ; visualizza il secondo carattere del banco sui display 0398 FA1C 0E F1 ld c,0f1h ; imposta la posizione sui display 0399 FA1E CD 92 FD call vdispc ; visualizza il carattere sui display 0400 FA21 0401 FA21 7B ld a,e ; recupera il banco da selezionare 0402 FA22 D3 5F out (banco),a ; seleziona il banco richiesto 0403 FA24 0404 FA24 E1 pop hl ; recupera l'indirizzo a cui saltare 0405 FA25 E9 jp (hl) ; salta all'indirizzo richiesto 0406 FA26 0407 FA26 tastE: ; se E carica le routines di stampa per monitor esadecimale a 0070 0408 FA26 3E 07 ld a,07h ; seleziona il banco delle routines di stampa 0409 FA28 11 70 00 ld de,00070h ; seleziona l'indirizzo di destinazione 0410 FA2B 06 01 ld b,01h ; seleziona il numero di banchi da spostare 0411 FA2D CD D1 FA call setban ; sposta il banco in ram 0412 FA30 0413 FA30 3E 28 ld a,28h ; ripristina la selezione del banco delle subroutines 0414 FA32 D3 5F out (banco),a 0415 FA34 C3 C9 F8 jp tast0 0416 FA37 0417 FA37 tast10: ; se RETURN cambia pagina di menù 0418 FA37 D9 exx ; carica il numero di pagina visualizzata in A 0419 FA38 79 ld a,c 0420 FA39 D9 exx 0421 FA3A 0422 FA3A 3C inc a ; punta alla pagina successiva 0423 FA3B FE 04 cp 04h ; se è minore di 4 va bene 0424 FA3D 38 02 jr c,tast1a 0425 FA3F 3E 01 ld a,01h ; altrimenti carica la prima pagina 0426 FA41 0427 FA41 21 42 FE tast1a: ld hl,tabmen ; calcola il puntatore all'indirizzo della routine presente nella tabella TABMEN e ci salta 0428 FA44 CD B1 FA call punt ; effettua una CALL anziché un JP perché le routines vmenu1-2-3 escono con un RET 0429 FA47 0430 FA47 C3 D2 F8 jp tast0a ; ritorna all'input da tastiera 0431 FA4A 0432 FA4A tastF: ; se F lancia il programma per la conversione dei datamark dei floppy 0433 FA4A 21 B0 FE ld hl,out10 ; messaggio da visualizzare sul display 0434 FA4D CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0435 FA50 3E 22 ld a,22h ; seleziona il banco del monitor esadecimale rilocato per la tastiera alfanumerica 0436 FA52 D3 5F out (banco),a 0437 FA54 C3 00 F0 jp 0f000h 0438 FA57 0439 FA57 tastS1: ; se SHIFT+1 lancia il programma per il test della ram 0440 FA57 21 B8 FE ld hl,out11 ; messaggio da visualizzare sul display 0441 FA5A CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0442 FA5D 3E 26 ld a,26h ; seleziona il banco del programma per il test della ram 0443 FA5F D3 5F out (banco),a 0444 FA61 C3 00 F0 jp 0f000h 0445 FA64 0446 FA64 tastS2: ; se SHIFT+2 lancia il basic Microsoft AG4 0447 FA64 21 C1 FE ld hl,out12 ; messaggio da visualizzare sul display 0448 FA67 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0449 FA6A 0450 FA6A CD F0 FB call stack ; cerca dove posizionare lo SP prima di C000, altrimenti lo SP ricopre il basic che è allocato da C000h a DFFFh 0451 FA6D F9 ld sp,hl 0452 FA6E 0453 FA6E 3E 2A ld a,2ah ; seleziona il primo banco del basic AG4 in rom 0454 FA70 11 00 C0 ld de,0c000h ; seleziona l'indirizzo di destinazione 0455 FA73 06 04 ld b,04h ; seleziona il numero di banchi da spostare 0456 FA75 CD D1 FA call setban ; sposta i 4 banchi da 2K in ram 0457 FA78 0458 FA78 3E C3 ld a,0c3h ; carica l'istruzione JUMP per l'NMI 0459 FA7A 32 66 00 ld (0066h),a 0460 FA7D 0461 FA7D 3E 19 ld a,19h ; seleziona il banco del basic da 5.5 K su floppy, che (probabilmente) era utilizzato insieme al basic AG4 0462 FA7F D3 5F out (banco),a 0463 FA81 0464 FA81 C3 40 DF jp 0df40h ; salta al basic AG4 - Viene utilizzato lo SP dove si trova ora 0465 FA84 0466 FA84 tastS3: ; se SHIFT+3 lancia il basic Microsoft AG3 0467 FA84 21 CA FE ld hl,out13 ; messaggio da visualizzare sul display 0468 FA87 CD C2 FA call disp ; visualizza il messaggio sui display e inizializza i video 0469 FA8A 0470 FA8A CD F0 FB call stack ; cerca dove posizionare lo SP prima di C000, altrimenti lo SP ricopre il monitor che è allocato da D000h a DFFFh 0471 FA8D F9 ld sp,hl 0472 FA8E 0473 FA8E 3E 32 ld a,32h ; seleziona il primo banco del disassembler AG3 in rom 0474 FA90 11 00 D0 ld de,0d000h ; seleziona l'indirizzo di destinazione 0475 FA93 06 02 ld b,02h ; seleziona il numero di banchi da spostare 0476 FA95 CD D1 FA call setban ; sposta i 2 banchi da 2K in ram 0477 FA98 0478 FA98 C3 00 D0 jp 0d000h ; salta al disassembler AG3 0479 FA9B 0480 FA9B ;------------------------------------------------------ 0481 FA9B ; converte il numero nella voce di menù 0482 FA9B ; ritorna HL contentente i due caratteri da visualizzare che sono blank+numero, oppure S+numero 0483 FA9B 0484 FA9B 26 20 convnu: ld h,020h ; 020h=blank 0485 FA9D 0486 FA9D F5 push af ; visualizza il numero digitato 0487 FA9E FE 10 cp 010h ; se A < 010h 0488 FAA0 38 04 jr c,convn1 0489 FAA2 0490 FAA2 26 53 ld h,053h ; 053h="S" - converte in "S"+numero 0491 FAA4 D6 10 sub 010h 0492 FAA6 0493 FAA6 FE 0A convn1: cp 0Ah 0494 FAA8 38 02 jr c,convn2 ; se A < 0ah addiziona 30h, altrimenti addiziona 07h quindi addiziona 30h 0495 FAAA C6 07 add a,07h ; il risultato è che se A >= 0ah addiziona 037h, altrimenti 030h 0496 FAAC C6 30 convn2: add a,030h 0497 FAAE 6F ld l,a 0498 FAAF 0499 FAAF F1 pop af 0500 FAB0 C9 ret 0501 FAB1 0502 FAB1 ;------------------------------------------------------ 0503 FAB1 ; calcola il puntatore ad una tabella di jump presente in HL e salta 0504 FAB1 0505 FAB1 punt: 0506 FAB1 F5 push af 0507 FAB2 C5 push bc 0508 FAB3 0509 FAB3 3D dec a ; decrementa A, lo moltiplica per 2 e lo addiziona ad HL 0510 FAB4 CB 27 sla a 0511 FAB6 4F ld c,a 0512 FAB7 AF xor a 0513 FAB8 47 ld b,a 0514 FAB9 09 add hl,bc ; HL ora punta all'indirizzo da richiamare che è presente nella tabella 0515 FABA 4E ld c,(hl) ; carica il contenuto dell'indirizzo puntato da HL in BC 0516 FABB 23 inc hl 0517 FABC 46 ld b,(hl) 0518 FABD C5 push bc ; sposta BC su HL 0519 FABE E1 pop hl 0520 FABF 0521 FABF C1 pop bc 0522 FAC0 F1 pop af 0523 FAC1 E9 jp (hl) ; salta alla routine calcolata 0524 FAC2 0525 FAC2 ;------------------------------------------------------ 0526 FAC2 ; visualizza il messaggio sui display, spegne il cursore sul video nuovo e inizializza i video 0527 FAC2 ; Se HL=0 non visualizza il messaggio sui display 0528 FAC2 ; Sporca AF 0529 FAC2 0530 FAC2 CD 74 FD disp: call vdisp ; Visualizza il messaggio indicato da HL sui display 0531 FAC5 3E 20 disp1: ld a,20h ; Spegne il cursore sul video nuovo 0532 FAC7 CD 49 FB call cursor 0533 FACA CD 09 FB call initv ; Inizializza il video vecchio 0534 FACD CD 2E FB call initn ; Inizializza il video nuovo 0535 FAD0 C9 ret 0536 FAD1 0537 FAD1 ;------------------------------------------------------ 0538 FAD1 ; Seleziona il banco indicato da A e lo sposta all'indirizzo indicato da DE 0539 FAD1 ; Sposta il numero di banchi indicati da B 0540 FAD1 ; Sporca tutti i registri 0541 FAD1 0542 FAD1 C5 setban: push bc 0543 FAD2 D3 5F out (banco),a ; seleziona il banco 0544 FAD4 21 00 F0 ld hl,0f000h ; sposta il banco in ram 0545 FAD7 01 00 08 ld bc,0800h 0546 FADA ED B0 ldir 0547 FADC 3C inc a 0548 FADD 3C inc a 0549 FADE C1 pop bc 0550 FADF 10 F0 djnz setban ; decrementa B e looppa se <> 0 0551 FAE1 0552 FAE1 C9 ret 0553 FAE2 0554 FAE2 ;------------------------------------------------------ 0555 FAE2 ; controlla se la scheda video vecchia è presente. Per farlo verifica il cambiamento della ritraccia video 0556 FAE2 ; se la scheda video vecchia esiste ritorna 00h in B' 0557 FAE2 ; se la scheda video vecchia non esiste ritorna FFh in B' 0558 FAE2 0559 FAE2 F5 checv: push af 0560 FAE3 E5 push hl 0561 FAE4 0562 FAE4 D9 exx ; mette 00h in B' 0563 FAE5 06 00 ld b,00h 0564 FAE7 D9 exx 0565 FAE8 0566 FAE8 21 00 00 ld hl,00000h ; inizializza il contatore 0567 FAEB 0568 FAEB 23 checv1: inc hl ; attende al massimo fino a che HL non diventa 1000h 0569 FAEC 7C ld a,h ; Infatti la ritraccia a "1" come tempo resta al massimo con HL a 0111h 0570 FAED FE 10 cp 10h ; Se impiega più tempo significa che la scheda LX.388 non è presente 0571 FAEF 20 06 jr nz,checv2 0572 FAF1 0573 FAF1 D9 exx ; se la LX.388 non è presente carica FF in B' ed esce 0574 FAF2 06 FF ld b,0ffh 0575 FAF4 D9 exx 0576 FAF5 18 06 jr checv3 0577 FAF7 0578 FAF7 DB EB checv2: in a,(0ebh) ; controlla se c'è la ritraccia video 0579 FAF9 CB 7F bit 7,a 0580 FAFB 20 EE jr nz,checv1 ; ritraccia non trovata, looppa 0581 FAFD 0582 FAFD E1 checv3: pop hl 0583 FAFE F1 pop af 0584 FAFF C9 ret 0585 FB00 0586 FB00 ;------------------------------------------------------ 0587 FB00 ; controlla se è stata rilevata la scheda video vecchia 0588 FB00 ; ritorna Z a 0 se non c'è, Z a 1 se c'è 0589 FB00 ; Sporca F 0590 FB00 0591 FB00 C5 chect: push bc ; salva il valore di A nel registro B 0592 FB01 47 ld b,a 0593 FB02 0594 FB02 D9 exx ; recupera il valore dal registro B' 0595 FB03 78 ld a,b 0596 FB04 D9 exx 0597 FB05 B7 or a ; imposta il flag Z 0598 FB06 0599 FB06 78 ld a,b ; recupera il valore di A dal registro B 0600 FB07 0601 FB07 C1 pop bc 0602 FB08 C9 ret 0603 FB09 0604 FB09 ;------------------------------------------------------ 0605 FB09 ; pulizia del video vecchio 0606 FB09 0607 FB09 E5 initv: push hl 0608 FB0A D5 push de 0609 FB0B C5 push bc 0610 FB0C 21 00 EC ld hl,0ec00h 0611 FB0F 11 01 EC ld de,0ec01h 0612 FB12 36 20 ld (hl),20h 0613 FB14 01 FF 01 ld bc,01ffh 0614 FB17 CD 20 FB call waitv ; attende la ritraccia 0615 FB1A ED B0 ldir 0616 FB1C C1 pop bc 0617 FB1D D1 pop de 0618 FB1E E1 pop hl 0619 FB1F C9 ret 0620 FB20 0621 FB20 ;------------------------------------------------------ 0622 FB20 ; attende la ritraccia del video vecchio 0623 FB20 0624 FB20 F5 waitv: push af 0625 FB21 0626 FB21 CD 00 FB call chect ; esce se non esiste la scheda video vecchia 0627 FB24 20 06 jr nz,waitv2 0628 FB26 0629 FB26 DB EB waitv1: in a,(0ebh) ; attende la ritraccia video 0630 FB28 CB 7F bit 7,a 0631 FB2A 20 FA jr nz,waitv1 0632 FB2C 0633 FB2C F1 waitv2: pop af 0634 FB2D C9 ret 0635 FB2E 0636 FB2E ;------------------------------------------------------ 0637 FB2E ; pulizia del video nuovo 0638 FB2E 0639 FB2E F5 initn: push af 0640 FB2F E5 push hl 0641 FB30 21 00 00 ld hl,0h 0642 FB33 CD B3 FD initn1: call lf06e ; carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare 0643 FB36 0644 FB36 3E 20 ld a,20h ; imposta il carattere a "blank" 0645 FB38 CD A2 FB call writen ; scrive il carattere 0646 FB3B 0647 FB3B 23 inc hl 0648 FB3C 7D ld a,l 0649 FB3D FE 81 cp 81h 0650 FB3F 20 F2 jr nz,initn1 0651 FB41 7C ld a,h 0652 FB42 FE 07 cp 07h 0653 FB44 20 ED jr nz,initn1 0654 FB46 0655 FB46 E1 pop hl 0656 FB47 F1 pop af 0657 FB48 C9 ret 0658 FB49 0659 FB49 ;------------------------------------------------------ 0660 FB49 ; accende o spegne il cursore sul video nuovo 0661 FB49 ; A=00h accende, A=20h spegne 0662 FB49 0663 FB49 F5 cursor: push af 0664 FB4A 0665 FB4A 3E 0A ld a,0ah ; seleziona il registro R10 0666 FB4C D3 8C out (8ch),a 0667 FB4E 0668 FB4E F1 pop af ; scrive il valore 0669 FB4F D3 8D out (8dh),a 0670 FB51 0671 FB51 C9 ret 0672 FB52 0673 FB52 ;------------------------------------------------------ 0674 FB52 ; Subroutine per la visualizzazione del menù sui video 0675 FB52 ; 0676 FB52 0677 FB52 21 00 F0 vmenu1: ld hl,menu1 ; visualizza la 1° pagina del menu 0678 FB55 D9 exx ; carica in C' il numero della pagina visualizzata 0679 FB56 0E 01 ld c,01h 0680 FB58 D9 exx 0681 FB59 18 10 jr vmenuA 0682 FB5B 0683 FB5B 21 00 F2 vmenu2: ld hl,menu2 ; visualizza la 2° pagina del menu 0684 FB5E D9 exx ; carica in C' il numero della pagina visualizzata 0685 FB5F 0E 02 ld c,02h 0686 FB61 D9 exx 0687 FB62 18 07 jr vmenuA 0688 FB64 0689 FB64 21 00 F4 vmenu3: ld hl,menu3 ; visualizza la 3° pagina del menu 0690 FB67 D9 exx ; carica in C' il numero della pagina visualizzata 0691 FB68 0E 03 ld c,03h 0692 FB6A D9 exx 0693 FB6B 0694 FB6B CD C5 FA vmenuA: call disp1 ; pulisce i video 0695 FB6E 0696 FB6E F5 push af 0697 FB6F E5 vmenuB: push hl 0698 FB70 CD D0 FB call nloc ; calcola in DE l'indirizzo del video nuovo in base alla riga/colonna nella locazione puntata da HL e HL+1 0699 FB73 D5 push de 0700 FB74 E1 pop hl 0701 FB75 CD B3 FD call lf06e ; carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare 0702 FB78 0703 FB78 E1 pop hl 0704 FB79 CD BE FB call vloc ; calcola in DE l'indirizzo del video vecchio in base alla riga/colonna nella locazione puntata da HL e HL+1 0705 FB7C 0706 FB7C 7E vmenuC: ld a,(hl) ; recupera il carattere da scrivere 0707 FB7D CD 20 FB call waitv ; attende la ritraccia del video vecchio 0708 FB80 12 ld (de),a ; visualizza il carattere sul video vecchio 0709 FB81 13 inc de 0710 FB82 0711 FB82 CD A2 FB call writen ; attende la ritraccia e visualizza il carattere sul video nuovo 0712 FB85 0713 FB85 23 inc hl 0714 FB86 AF xor a ; controlla se il prossimo carattere è 00h 0715 FB87 BE cp (hl) 0716 FB88 20 F2 jr nz,vmenuC 0717 FB8A 23 inc hl 0718 FB8B 2F cpl ; controlla se il prossimo carattere è 0ffh 0719 FB8C BE cp (hl) ; se no, ricarica la successiva prima posizione e looppa 0720 FB8D 20 E0 jr nz,vmenuB 0721 FB8F 0722 FB8F 21 F0 F5 ld hl,curs ; calcola in DE l'indirizzo del cursore in base alla riga/colonna nella locazione puntata da HL e HL+1 0723 FB92 F1 pop af 0724 FB93 F5 push af 0725 FB94 CD D0 FB call nloc 0726 FB97 D5 push de 0727 FB98 E1 pop hl 0728 FB99 CD A3 FD call lf060 ; carica in R14, R15, R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare 0729 FB9C 0730 FB9C AF xor a ; accende il cursore sul video nuovo 0731 FB9D CD 49 FB call cursor 0732 FBA0 0733 FBA0 F1 pop af 0734 FBA1 C9 ret 0735 FBA2 0736 FBA2 ;------------------------------------------------------ 0737 FBA2 ; scrive il carattere presente in A sul video nuovo 0738 FBA2 ; Con l'entry point write1 non attende la ritraccia 0739 FBA2 0740 FBA2 CD B5 FB writen: call waitn ; attende la ritraccia 0741 FBA5 D3 80 write1: out (80h),a ; scrive il carattere 0742 FBA7 F5 push af 0743 FBA8 3E 1F ld a,1fh ; imposta gli attributi del carattere 0744 FBAA D3 8E out (8eh),a 0745 FBAC 3E 1F ld a,31 ; update 0746 FBAE D3 8C out (8ch),a 0747 FBB0 AF xor a 0748 FBB1 D3 8D out (8dh),a 0749 FBB3 F1 pop af 0750 FBB4 C9 ret 0751 FBB5 0752 FBB5 ;------------------------------------------------------ 0753 FBB5 ; attende la ritraccia del video nuovo 0754 FBB5 0755 FBB5 F5 waitn: push af 0756 FBB6 0757 FBB6 DB 8C waitn1: in a,(8ch) 0758 FBB8 CB 7F bit 7,a 0759 FBBA 28 FA jr z,waitn1 0760 FBBC F1 pop af 0761 FBBD C9 ret 0762 FBBE 0763 FBBE ;------------------------------------------------------ 0764 FBBE ; Calcola la locazione del video in base alla riga/colonna nella locazione puntata da HL e HL+1 0765 FBBE ; Chiamare "vloc" per il video vecchio, "nloc" per il video nuovo 0766 FBBE ; Ritorna DE. HL punterà al primo carattere da visualizzare 0767 FBBE ; Sporca DE e HL 0768 FBBE ; Con l'entry-point vloc1 o nloc1 il registro BC deve contenere il valore della riga/colonna. In questo caso HL non viene toccato 0769 FBBE 0770 FBBE C5 vloc: push bc 0771 FBBF 46 ld b,(hl) ; numero riga 0772 FBC0 23 inc hl 0773 FBC1 4E ld c,(hl) ; numero colonna 0774 FBC2 23 inc hl ; punta al primo carattere del messaggio 0775 FBC3 18 01 jr vloc1a 0776 FBC5 0777 FBC5 C5 vloc1: push bc 0778 FBC6 F5 vloc1a: push af 0779 FBC7 E5 push hl 0780 FBC8 21 00 EC ld hl,0ec00h ; prima locazione del video vecchio 0781 FBCB 11 20 00 ld de,00020h ; numero di caratteri che compongono una riga sul video vecchio 0782 FBCE 18 10 jr loc1 0783 FBD0 0784 FBD0 C5 nloc: push bc 0785 FBD1 46 ld b,(hl) ; numero riga 0786 FBD2 23 inc hl 0787 FBD3 4E ld c,(hl) ; numero colonna 0788 FBD4 23 inc hl ; punta al primo carattere del messaggio 0789 FBD5 18 01 jr nloc1a 0790 FBD7 0791 FBD7 C5 nloc1: push bc 0792 FBD8 F5 nloc1a: push af 0793 FBD9 E5 push hl 0794 FBDA 21 58 01 ld hl,00158h ; indirizzo del primo carattere più offset (0158h) per centrare la videata sul video nuovo 0795 FBDD 11 50 00 ld de,00050h ; numero di caratteri che compongono una riga sul video nuovo 0796 FBE0 0797 FBE0 78 loc1: ld a,b ; aggiunge il numero di caratteri che compongono una riga per tutte le righe richieste 0798 FBE1 B7 or a ; cp 00h 0799 FBE2 28 04 jr z,loc2 0800 FBE4 19 add hl,de ; somma il numero di caratteri 0801 FBE5 05 dec b 0802 FBE6 18 F8 jr loc1 0803 FBE8 0804 FBE8 06 00 loc2: ld b,00h ; aggiunge il numero di caratteri relativi alla colonna richiesta 0805 FBEA 09 add hl,bc 0806 FBEB EB ex de,hl ; mette il risultato in DE 0807 FBEC 0808 FBEC E1 pop hl 0809 FBED F1 pop af 0810 FBEE C1 pop bc 0811 FBEF 0812 FBEF C9 ret 0813 FBF0 0814 FBF0 ;------------------------------------------------------ 0815 FBF0 ; Cerca dove posizionare lo SP prima di C000 0816 FBF0 ; Ritorna l'indirizzo in HL 0817 FBF0 ; 0818 FBF0 21 FF BF stack: ld hl,0bfffh 0819 FBF3 7E spA1: ld a,(hl) 0820 FBF4 2F cpl 0821 FBF5 77 ld (hl),a 0822 FBF6 BE cp (hl) 0823 FBF7 28 03 jr z,spA3 0824 FBF9 2B spA2: dec hl 0825 FBFA 18 F7 jr spA1 0826 FBFC 2F spA3: cpl 0827 FBFD 77 ld (hl),a 0828 FBFE BE cp (hl) 0829 FBFF 20 F8 jr nz,spA2 0830 FC01 0831 FC01 C9 ret 0832 FC02 0833 FC02 ;------------------------------------------------------ 0834 FC02 ; 0835 FC02 ; Nuova routine di input tastiera per il monitor esadecimale 0836 FC02 ; Sostituisce la 80AA e accetta l'input dalla tastiera alfanumerica vecchia o nuova 0837 FC02 ; o dalla tastiera esadecimale convertendo il valore ricevuto in modo da essere 0838 FC02 ; compatibile con la 80AA 0839 FC02 ; 0840 FC02 ; Dati ricevuti dalla tastiera: 0841 FC02 ; Numeri da 0 a 9: da 30h a 39h 0842 FC02 ; Lettere da A ad F: da 61h a 66h 0843 FC02 ; Shift+numero da 1 a 9: da 21h a 29h 0844 FC02 ; Shift+lettere da A ad F: da 41h a 46h 0845 FC02 ; Return: 0dh 0846 FC02 0847 FC02 0848 FC02 C5 input: push bc 0849 FC03 D5 push de 0850 FC04 E5 push hl 0851 FC05 0852 FC05 CD 00 FB t1: call chect ; Se non c'è la scheda video vecchia salta il controllo e passa subito alla tastiera nuova 0853 FC08 20 06 jr nz,t2 0854 FC0A 0855 FC0A DB EA t1x: in a,(0eah) ; tastiera vecchia 0856 FC0C CB 7F bit 7,a 0857 FC0E 20 FA jr nz,t1x 0858 FC10 0859 FC10 DB 85 t2: in a,(085h) ; tastiera nuova 0860 FC12 CB 7F bit 7,a 0861 FC14 28 FA jr z,t2 0862 FC16 21 56 04 t2es1: ld hl,0456h ; tastiera esadecimale 0863 FC19 DB F0 t2es2: in a,(0f0h) 0864 FC1B CB 7F bit 7,a 0865 FC1D 28 F7 jr z,t2es1 0866 FC1F 2B t2es3: dec hl 0867 FC20 7C ld a,h 0868 FC21 B5 or l 0869 FC22 20 F5 jr nz,t2es2 0870 FC24 0871 FC24 ; Input da tastiere 0872 FC24 CD 00 FB t2a: call chect ; Se non c'è la scheda video vecchia salta il controllo e passa subito alla tastiera nuova 0873 FC27 20 06 jr nz,t2ax 0874 FC29 0875 FC29 DB EA in a,(0eah) ; tastiera vecchia 0876 FC2B CB 7F bit 7,a 0877 FC2D 20 38 jr nz,t2b 0878 FC2F 0879 FC2F DB 85 t2ax: in a,(085h) ; tastiera nuova 0880 FC31 2F cpl 0881 FC32 CB 7F bit 7,a 0882 FC34 20 31 jr nz,t2b 0883 FC36 DB F0 in a,(0f0h) ; tastiera esadecimale 0884 FC38 CB 7F bit 7,a 0885 FC3A 28 10 jr z,tes4 0886 FC3C 18 E6 jr t2a ; se non ho premuto nulla sulle tre tastiere allora looppa 0887 FC3E 0888 FC3E ; Input da tastiera esadecimale 0889 FC3E 21 56 04 tes1: ld hl,0456h 0890 FC41 0891 FC41 DB F0 tes2: in a,(0f0h) 0892 FC43 CB 7F bit 7,a 0893 FC45 28 F7 jr z,tes1 0894 FC47 2B tes3: dec hl 0895 FC48 7C ld a,h 0896 FC49 B5 or l 0897 FC4A 20 F5 jr nz,tes2 0898 FC4C 0899 FC4C DB F0 tes4: in a,(0f0h) 0900 FC4E CB 7F bit 7,a 0901 FC50 20 FA jr nz,tes4 0902 FC52 47 ld b,a 0903 FC53 21 05 00 ld hl,0005h 0904 FC56 CD B8 FC call rit 0905 FC59 0906 FC59 DB F0 tes5: in a,(0f0h) 0907 FC5B 4F ld c,a 0908 FC5C E6 7F and 7fh 0909 FC5E B8 cp b 0910 FC5F 20 F8 jr nz,tes5 0911 FC61 CB 79 bit 7,c 0912 FC63 20 D9 jr nz,tes1 0913 FC65 0914 FC65 18 4D tes6: jr texit 0915 FC67 0916 FC67 ; Conversione dato per tastiere alfanumeriche 0917 FC67 E6 7F t2b: and 7fh 0918 FC69 0919 FC69 FE 0D cp 0dh ; controlla se è stato premuto RETURN 0920 FC6B 20 04 jr nz,t3 0921 FC6D 3E 10 ld a,10h ; se si carica il valore di Control+0 0922 FC6F 18 43 jr texit 0923 FC71 0924 FC71 47 t3: ld b,a ; salva il registro A 0925 FC72 D9 exx ; recupera il registro D' 0926 FC73 7A ld a,d 0927 FC74 D9 exx 0928 FC75 B7 or a ; cp 00h - Se <> 0 deve controllare anche il BACKSPACE 0929 FC76 78 ld a,b ; ripristina il registro A 0930 FC77 28 08 jr z,t3b 0931 FC79 0932 FC79 FE 08 cp 08h ; controlla se è stato premuto BACKSPACE 0933 FC7B 20 04 jr nz,t3b 0934 FC7D 3E 1F ld a,01fh ; se si carica il valore 01fh (equivalente a CTRL+F sulla tastiera esadecimale) 0935 FC7F 18 33 jr texit 0936 FC81 0937 FC81 FE 3A t3b: cp 03ah ; controlla se è stato premuto un numero 0938 FC83 30 08 jr nc,t4 0939 FC85 FE 30 cp 030h 0940 FC87 38 04 jr c,t4 0941 FC89 D6 30 sub 030h ; se si sottrae 30h ed esce 0942 FC8B 18 27 jr texit 0943 FC8D 0944 FC8D FE 67 t4: cp 67h ; controlla se è stata premuta una lettera tra A ed F 0945 FC8F 30 08 jr nc,t5 0946 FC91 FE 61 cp 61h 0947 FC93 38 04 jr c,t5 0948 FC95 D6 57 sub 57h ; se si sottrae 57h ed esce 0949 FC97 18 1B jr texit 0950 FC99 0951 FC99 FE 2A t5: cp 2ah ; controlla se è stato premuto shift+numero (escluso 0) 0952 FC9B 30 08 jr nc,t6 0953 FC9D FE 21 cp 21h 0954 FC9F 38 04 jr c,t6 0955 FCA1 D6 10 sub 10h ; se si sottrae 10h ed esce 0956 FCA3 18 0F jr texit 0957 FCA5 0958 FCA5 FE 47 t6: cp 47h ; controlla se è stato premuto shift+lettera da A ad F 0959 FCA7 30 08 jr nc,t7 0960 FCA9 FE 41 cp 41h 0961 FCAB 38 04 jr c,t7 0962 FCAD D6 27 sub 27h ; se si sottrae 27h ed esce 0963 FCAF 18 03 jr texit 0964 FCB1 0965 FCB1 C3 05 FC t7: jp t1 0966 FCB4 0967 FCB4 E1 texit: pop hl 0968 FCB5 D1 pop de 0969 FCB6 C1 pop bc 0970 FCB7 C9 ret 0971 FCB8 0972 FCB8 ; Genera un ritardo 0973 FCB8 0974 FCB8 E5 rit: push hl 0975 FCB9 F5 push af 0976 FCBA 0977 FCBA CD C5 FC rit1: call rit2 0978 FCBD 2B dec hl 0979 FCBE 7C ld a,h 0980 FCBF B5 or l 0981 FCC0 20 F8 jr nz,rit1 0982 FCC2 F1 pop af 0983 FCC3 E1 pop hl 0984 FCC4 C9 ret 0985 FCC5 0986 FCC5 F5 rit2: push af 0987 FCC6 D5 push de 0988 FCC7 11 47 00 ld de,0047h 0989 FCCA 0990 FCCA 1B rit3: dec de 0991 FCCB 7A ld a,d 0992 FCCC B3 or e 0993 FCCD 20 FB jr nz,rit3 0994 FCCF D1 pop de 0995 FCD0 F1 pop af 0996 FCD1 C9 ret 0997 FCD2 0998 FCD2 ;------------------------------------------------------ 0999 FCD2 ; 1000 FCD2 ; Nuova routine di output su video per monitor esadecimale 1001 FCD2 ; Sostituisce la 80EC e accetta l'input dalle locazioni da 0000h a 0007h 1002 FCD2 ; convertendo il valore letto in modo da essere compatibile con la 80EC 1003 FCD2 ; Con l'entry point "video1" i registri BC, DE e HL devono essere già impostati 1004 FCD2 ; 1005 FCD2 1006 FCD2 F5 video: push af 1007 FCD3 C5 push bc 1008 FCD4 D5 push de 1009 FCD5 E5 push hl 1010 FCD6 1011 FCD6 3E 20 ld a,20h ; spegne il cursore sul video nuovo 1012 FCD8 CD 49 FB call cursor 1013 FCDB 1014 FCDB 11 07 00 ld de,0007h ; contatore numero di caratteri da visualizzare (indica anche la locazione da cui prelevare il carattere da visualizzare) 1015 FCDE 01 00 EC ld bc,0ec00h ; posizione video vecchio 1016 FCE1 21 00 00 ld hl,0000h ; posizione video nuovo 1017 FCE4 1018 FCE4 3E 20 ld a,20h ; spegne il cursore sul video nuovo 1019 FCE6 CD 49 FB call cursor 1020 FCE9 1021 FCE9 E5 m1: push hl ; salva la posizione del video nuovo 1022 FCEA 21 2C FD ld hl,tabvid ; calcola il carattere da visualizzare leggendolo dalla tabella di conversione 1023 FCED 1024 FCED C5 push bc 1025 FCEE 1A ld a,(de) ; legge il valore da visualizzare 1026 FCEF 06 00 ld b,0h ; lo converte nel carattere ascii 1027 FCF1 4F ld c,a 1028 FCF2 09 add hl,bc 1029 FCF3 C1 pop bc 1030 FCF4 1031 FCF4 7E ld a,(hl) ; legge dalla tabella il carattere da visualizzare 1032 FCF5 1033 FCF5 CD 00 FB call chect ; controlla se esiste la scheda video vecchia 1034 FCF8 20 04 jr nz,m2 ; se non esiste non visualizza il carattere sulla scheda video vecchia 1035 FCFA 1036 FCFA CD 20 FB call waitv ; attende la ritraccia video vecchio 1037 FCFD 02 ld (bc),a ; visualizza il carattere sul video vecchio 1038 FCFE 1039 FCFE E1 m2: pop hl ; ripristina la posizione del video nuovo 1040 FCFF CD A3 FD call lf060 ; carica in R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare 1041 FD02 CD A2 FB call writen ; visualizza il carattere sul video nuovo 1042 FD05 1043 FD05 0C inc c ; incrementa la posizione del video vecchio 1044 FD06 2C inc l ; incrementa la posizione del video nuovo 1045 FD07 1D dec e ; decrementa il contatore dei caratteri da visualizzare 1046 FD08 7B ld a,e ; controlla se ci sono altri caratteri da visualizzare 1047 FD09 FE FF cp 0ffh 1048 FD0B 20 DC jr nz,m1 ; looppa se ci sono altri caratteri da visualizzare 1049 FD0D 1050 FD0D ;------------------------------------------------------ 1051 FD0D ; Visualizza sui display della tastiera esadecimale 1052 FD0D ;------------------------------------------------------ 1053 FD0D 01 F7 00 ld bc,00f7h ; porta di output del display 1054 FD10 11 07 00 ld de,0007h ; valore da visualizzare 1055 FD13 1056 FD13 21 50 FD m3: ld hl,tabdis ; carica l'indirizzo della tabella di conversione in HL 1057 FD16 1A ld a,(de) ; legge il valore da visualizzare e lo mette in A 1058 FD17 1059 FD17 C5 push bc ; carica il valore da visualizzare in BC 1060 FD18 4F ld c,a 1061 FD19 AF xor a 1062 FD1A 47 ld b,a 1063 FD1B 09 add hl,bc ; HL ora punta all'indirizzo contenente il valore convertito 1064 FD1C C1 pop bc 1065 FD1D 1066 FD1D 7E ld a,(hl) ; carica il valore convertito in A 1067 FD1E ED 79 out (c),a ; e lo invia al display 1068 FD20 1069 FD20 1D dec e ; decrementa e passa al prossimo display/valore 1070 FD21 0D dec c 1071 FD22 79 ld a,c 1072 FD23 FE EF cp 0efh 1073 FD25 20 EC jr nz,m3 ; (-16) 1074 FD27 1075 FD27 E1 pop hl 1076 FD28 D1 pop de 1077 FD29 C1 pop bc 1078 FD2A F1 pop af 1079 FD2B C9 ret 1080 FD2C 1081 FD2C 1082 FD2C 303132333435tabvid: .byte "0123456789ABCDEF" 1082 FD32 36373839414243444546 1083 FD3C 2D204D522348 .byte "-", " ", "M", "R", "#", "H", "L", "P", "C", "G" 1083 FD42 4C504347 1084 FD46 4E5152545556 .byte "NQRTUVJY S" 1084 FD4C 4A592053 1085 FD50 1086 FD50 ;------------------------------------------------------ 1087 FD50 ; Tabella caratteri display 1088 FD50 ; Valori per l'accensione dei segmenti del display: 1089 FD50 ; 1090 FD50 ; 1 1091 FD50 ; - bit a 1 spegne il segmento 1092 FD50 ; 32 | | 2 1093 FD50 ; - 64 F0 = display a destra 1094 FD50 ; 16 | | 4 !! 1095 FD50 ; - F7 = display a sinistra 1096 FD50 ; 8 1097 FD50 ; 128 = punto decimale 1098 FD50 ; 1099 FD50 C0 tabdis: .byte 0c0h ;carattere 0 "0" 1100 FD51 F9 .byte 0f9h ;carattere 1 "1" 1101 FD52 A4 .byte 0a4h ;carattere 2 "2" 1102 FD53 B0 .byte 0b0h ;carattere 3 "3" 1103 FD54 99 .byte 099h ;carattere 4 "4" 1104 FD55 92 .byte 092h ;carattere 5 "5" o "S" 1105 FD56 82 .byte 082h ;carattere 6 "6" 1106 FD57 F8 .byte 0f8h ;carattere 7 "7" 1107 FD58 80 .byte 080h ;carattere 8 "8" 1108 FD59 90 .byte 090h ;carattere 9 "9" 1109 FD5A 88 .byte 088h ;carattere 0A "A" 1110 FD5B 83 .byte 083h ;carattere 0B "b" 1111 FD5C C6 .byte 0c6h ;carattere 0C "C" 1112 FD5D A1 .byte 0a1h ;carattere 0d "d" 1113 FD5E 86 .byte 086h ;carattere 0E "E" 1114 FD5F 8E .byte 08eh ;carattere 0F "F" 1115 FD60 BF .byte 0bfh ;carattere 10 "-" 1116 FD61 FF .byte 0ffh ;carattere 11 " " blank 1117 FD62 AB .byte 0abh ;carattere 12 "n" bassa 1118 FD63 9D .byte 09dh ;carattere 13 "u" alta 1119 FD64 B6 .byte 0b6h ;carattere 14 "3" linee orizzontali" 1120 FD65 89 .byte 089h ;carattere 15 "H" 1121 FD66 C7 .byte 0c7h ;carattere 16 "L" 1122 FD67 8C .byte 08ch ;carattere 17 "P" 1123 FD68 A7 .byte 0a7h ;carattere 18 "c" bassa 1124 FD69 C2 .byte 0c2h ;carattere 19 "G" 1125 FD6A C8 .byte 0c8h ;carattere 1A "N" 1126 FD6B 98 .byte 098h ;carattere 1B "q" 1127 FD6C AF .byte 0afh ;carattere 1C "r" 1128 FD6D 87 .byte 087h ;carattere 1D "t" 1129 FD6E C1 .byte 0c1h ;carattere 1E "U" 1130 FD6F E3 .byte 0e3h ;carattere 1F "u" bassa 1131 FD70 E1 .byte 0e1h ;carattere 20 "J" 1132 FD71 91 .byte 091h ;carattere 21 "Y" 1133 FD72 FF .byte 0ffh ;carattere 22 " " blank 1134 FD73 FF .byte 0ffh ;carattere 23 " " blank 1135 FD74 1136 FD74 1137 FD74 ;------------------------------------------------------ 1138 FD74 ; Visualizza un messaggio puntato da HL sui display 1139 FD74 ; Il messaggio da visualizzare deve essere già nel formato compatibile con i caratteri dei display 1140 FD74 ; Il primo byte indica quanti caratteri visualizzare. I rimanenti display vengono messi a FFh (display spento) 1141 FD74 1142 FD74 F5 vdisp: push af 1143 FD75 C5 push bc 1144 FD76 E5 push hl 1145 FD77 1146 FD77 0E F7 ld c,0f7h ; indirizzo del primo display 1147 FD79 46 ld b,(hl) ; numero di caratteri da visualizzare 1148 FD7A 23 inc hl 1149 FD7B 1150 FD7B 7E vdisp1: ld a,(hl) ; carica il carattere da visualizzare in A 1151 FD7C ED 79 out (c),a ; e lo invia al display 1152 FD7E 23 inc hl ; punta al prossimo carattere da visualizzare 1153 FD7F 0D dec c ; punta al prossimo display 1154 FD80 10 F9 djnz vdisp1 ; looppa se ci sono altri caratteri da visualizzare 1155 FD82 1156 FD82 79 vdisp2: ld a,c ; se rimangono altri display li spegne 1157 FD83 FE EF cp 0efh 1158 FD85 28 07 jr z,vdisp3 1159 FD87 3E FF ld a,0ffh ; spegne il display 1160 FD89 ED 79 out (c),a 1161 FD8B 0D dec c ; punta al prossimo display 1162 FD8C 18 F4 jr vdisp2 1163 FD8E 1164 FD8E E1 vdisp3: pop hl 1165 FD8F C1 pop bc 1166 FD90 F1 pop af 1167 FD91 1168 FD91 C9 ret 1169 FD92 1170 FD92 ;------------------------------------------------------ 1171 FD92 ; Visualizza il carattere contenuto in A sul display puntato da C, convertendolo nel formato compatibile con i caratteri dei display 1172 FD92 1173 FD92 E5 vdispc: push hl 1174 FD93 F5 push af 1175 FD94 C5 push bc 1176 FD95 1177 FD95 21 50 FD ld hl,tabdis ; carica l'indirizzo della tabella di conversione in HL 1178 FD98 4F ld c,a ; carica il valore da visualizzare in BC 1179 FD99 AF xor a 1180 FD9A 47 ld b,a 1181 FD9B 09 add hl,bc ; HL ora punta all'indirizzo contenente il valore convertito 1182 FD9C 7E ld a,(hl) ; carica il valore convertito in A 1183 FD9D 1184 FD9D C1 pop bc 1185 FD9E ED 79 out (c),a ; invia il valore convertito al display 1186 FDA0 1187 FDA0 F1 pop af 1188 FDA1 E1 pop hl 1189 FDA2 C9 ret 1190 FDA3 1191 FDA3 ;------------------------------------------------------ 1192 FDA3 ; Routine f060h della eprom 2390 (carica in R14, R15, R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare) 1193 FDA3 ; Routine f06eh della eprom 2390 (carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare) 1194 FDA3 1195 FDA3 F5 lf060: push af 1196 FDA4 3E 0E ld a,0eh ; carica da HL l'indirizzo del cursore 1197 FDA6 D3 8C out (8ch),a 1198 FDA8 7C ld a,h 1199 FDA9 D3 8D out (8dh),a 1200 FDAB 3E 0F ld a,0fh 1201 FDAD D3 8C out (8ch),a 1202 FDAF 7D ld a,l 1203 FDB0 D3 8D out (8dh),a 1204 FDB2 F1 pop af 1205 FDB3 1206 FDB3 F5 lf06e: push af 1207 FDB4 3E 12 ld a,12h ; carica da HL l'indirizzo del carattere da visualizzare in R18 e R19 1208 FDB6 D3 8C out (8ch),a 1209 FDB8 7C ld a,h 1210 FDB9 D3 8D out (8dh),a 1211 FDBB 3E 13 ld a,13h 1212 FDBD D3 8C out (8ch),a 1213 FDBF 7D ld a,l 1214 FDC0 D3 8D out (8dh),a 1215 FDC2 1216 FDC2 3E 1F ld a,1fh ; accesso a R31 del SY6545 per fare l'update 1217 FDC4 D3 8C out (8ch),a 1218 FDC6 F1 pop af 1219 FDC7 C9 ret 1220 FDC8 1221 FDC8 ;------------------------------------------------------ 1222 FDC8 ; Routine f0a5h della eprom 2390 (inizializza i registri del SY6545 ed i PIO) 1223 FDC8 1224 FDC8 DB 89 lf0a5: in a,(89h) ; setta il video a 80 colonne 1225 FDCA CB 8F res 1,a 1226 FDCC 21 0C FE ld hl,tabini ; carica in HL l'indirizzo della tabella contenente i parametri di inizializzazione del video nuovo 1227 FDCF D3 89 out (89h),a 1228 FDD1 3E 8F ld a,8fh ; inizializza i PIO 1229 FDD3 D3 82 out (82h),a ; PIO 0/A (RAM 0) 1230 FDD5 D3 86 out (86h),a ; PIO 1/A (RAM 1) 1231 FDD7 D3 8A out (8ah),a ; PIO 2/A (RAM 2) 1232 FDD9 3E CF ld a,0cfh 1233 FDDB D3 83 out (83h),a ; PIO 0/B (stampante) 1234 FDDD 08 ex af,af' 1235 FDDE AF xor a 1236 FDDF D3 83 out (83h),a 1237 FDE1 08 ex af,af' 1238 FDE2 D3 87 out (87h),a ; PIO 1/B (tastiera) 1239 FDE4 08 ex af,af' 1240 FDE5 3D dec a 1241 FDE6 D3 87 out (87h),a 1242 FDE8 08 ex af,af' 1243 FDE9 D3 8B out (8bh),a ; PIO 2/B (busy stampante / controllo 40-80 caratteri) 1244 FDEB 3E F1 ld a,0f1h 1245 FDED D3 8B out (8bh),a 1246 FDEF 1247 FDEF 06 0C ld b,0ch ; inizializza i registri del SY6545 da R11 a R0 1248 FDF1 78 lf0ce: ld a,b 1249 FDF2 3D dec a 1250 FDF3 D3 8C out (8ch),a 1251 FDF5 7E ld a,(hl) 1252 FDF6 D3 8D out (8dh),a 1253 FDF8 23 inc hl 1254 FDF9 10 F6 djnz lf0ce ; (-10) 1255 FDFB 1256 FDFB 06 08 lf0d8: ld b,08h ; azzera i registri del SY6545 da R19 a R12 1257 FDFD 1258 FDFD 78 lf0da: ld a,b 1259 FDFE C6 0B add a,0bh 1260 FE00 D3 8C out (8ch),a 1261 FE02 AF xor a 1262 FE03 D3 8D out (8dh),a 1263 FE05 10 F6 djnz lf0da ; (-10) 1264 FE07 1265 FE07 3E 1F lf086: ld a,1fh ; accesso a R31 del SY6545 per fare l'update 1266 FE09 D3 8C out (8ch),a 1267 FE0B C9 ret 1268 FE0C 1269 FE0C ;------------------------------------------------------ 1270 FE0C ; Tabella per l'inizializzazione dei registri della scheda video grafica 1271 FE0C 1272 FE0C 0B000B481818tabini: .byte 0bh, 00h, 0bh, 48h, 18h, 18h, 00h, 1ah, 28h, 57h, 50h, 6fh 1272 FE12 001A2857506F 1273 FE18 1274 FE18 ;------------------------------------------------------ 1275 FE18 ; Calcola l'indirizzo della tabella TABDIS e lo ritorna in HL 1276 FE18 1277 FE18 21 50 FD ctabdi: ld hl,tabdis 1278 FE1B C9 ret 1279 FE1C 1280 FE1C ;------------------------------------------------------ 1281 FE1C ; Jump table per il richiamo della routine di gestione della voce di menu selezionata 1282 FE1C 1283 FE1C 0F F9 tabtas: .dw tast1 1284 FE1E 26 F9 .dw tast2 1285 FE20 33 F9 .dw tast3 1286 FE22 40 F9 .dw tast4 1287 FE24 4D F9 .dw tast5 1288 FE26 60 F9 .dw tast6 1289 FE28 70 F9 .dw tast7 1290 FE2A 80 F9 .dw tast8 1291 FE2C 8A F9 .dw tast9 1292 FE2E 94 F9 .dw tastA 1293 FE30 A1 F9 .dw tastB 1294 FE32 BB F9 .dw tastC 1295 FE34 C8 F9 .dw tastD 1296 FE36 26 FA .dw tastE 1297 FE38 4A FA .dw tastF 1298 FE3A 37 FA .dw tast10 1299 FE3C 57 FA .dw tastS1 1300 FE3E 64 FA .dw tastS2 1301 FE40 84 FA .dw tastS3 1302 FE42 1303 FE42 ;------------------------------------------------------ 1304 FE42 ; Jump table per il richiamo della routine di visualizzazione della pagina di menù 1305 FE42 1306 FE42 52 FB tabmen: .dw vmenu1 1307 FE44 5B FB .dw vmenu2 1308 FE46 64 FB .dw vmenu3 1309 FE48 1310 FE48 ;------------------------------------------------------ 1311 FE48 ; Messaggi utilizzati dalla funzione "D" del menù 1312 FE48 1313 FE48 000042414E43msgban: .byte 000h, 000h, "BANCO: ", 000h, 0ff 1313 FE4E 4F3A2000A5 1314 FE53 0100494E4449msgadr: .byte 001h, 000h, "INDIRIZZO: ", 000h, 0ffh 1314 FE59 52495A5A4F3A2000FF 1315 FE62 1316 FE62 ;------------------------------------------------------ 1317 FE62 ; Tabelle per visualizzazione su display tastiera esadecimale 1318 FE62 ; 1319 FE62 ; 1320 FE62 ; Valori per l'accensione dei segmenti del display: 1321 FE62 ; 1322 FE62 ; 1 1323 FE62 ; - bit a 1 spegne il segmento 1324 FE62 ; 32 | | 2 1325 FE62 ; - 64 F0 = display a destra 1326 FE62 ; 16 | | 4 !! 1327 FE62 ; - F7 = display a sinistra 1328 FE62 ; 8 1329 FE62 ; 128 = punto decimale 1330 FE62 ; 1331 FE62 ; Fare la somma dei valori e poi complementare il risultato 1332 FE62 ; 1333 FE62 ;------------------------------------------------------ 1334 FE62 ; Messaggi da visualizzare sui display 1335 FE62 1336 FE62 07FF9286C786out0: .byte 07h, 0FFh, 092h, 086h, 0C7h, 086h, 0C6h, 087h ; select 1336 FE68 C687 1337 FE6A 08AB86A1C092out1: .byte 08h, 0ABh, 086h, 0A1h, 0C0h, 092h, 0FFh, 079h, 092h ; nedos 1.5 1337 FE70 FF7992 1338 FE73 08AB86A1C092out2: .byte 08h, 0ABh, 086h, 0A1h, 0C0h, 092h, 0FFh, 042h, 0F9h ; nedos G.1 1338 FE79 FF42F9 1339 FE7C 08838892F9C6out3: .byte 08h, 083h, 088h, 092h, 0F9h, 0C6h, 0FFh, 0F9h, 082h ; basic 16 1339 FE82 FFF982 1340 FE85 07C8C0ABF987out4: .byte 07h, 0C8h, 0C0h, 0ABh, 0F9h, 087h, 0C0h, 0AFh ; monitor (non utilizzato) 1340 FE8B C0AF 1341 FE8D 06FFFF83C0C0out5: .byte 06h, 0FFh, 0FFh, 083h, 0C0h, 0C0h, 087h ; boot 1341 FE93 87 1342 FE94 06FFFF878692out6: .byte 06h, 0FFh, 0FFh, 087h, 086h, 092h, 087h ; test 1342 FE9A 87 1343 FE9B 04C19286AF out7: .byte 04h, 0C1h, 092h, 086h, 0AFh ; user 1344 FEA0 08838892F9C6out8: .byte 08h, 083h, 088h, 092h, 0F9h, 0C6h, 0FFh, 012h, 092h ; basic 5.5 1344 FEA6 FF1292 1345 FEA9 06FFFF92C0ABout9: .byte 06h, 0FFh, 0FFh, 092h, 0C0h, 0ABh, 086h ; sone 1345 FEAF 86 1346 FEB0 07FF8EC7C08Cout10: .byte 07h, 0FFh, 08Eh, 0C7h, 0C0h, 08Ch, 08Ch, 091h ; floppy 1346 FEB6 8C91 1347 FEB8 0887869287FFout11: .byte 08h, 087h, 086h, 092h, 087h, 0FFh, 0AFh, 088h, 0C8h ; test ram 1347 FEBE AF88C8 1348 FEC1 08838892F946out12: .byte 08h, 083h, 088h, 092h, 0F9h, 046h, 088h, 0C2h, 099h ; basic.ag4 1348 FEC7 88C299 1349 FECA 08A1F9928812out13: .byte 08h, 0A1h, 0F9h, 092h, 088h, 012h, 088h, 0C2h, 0B0h ; disas.ag3 1349 FED0 88C2B0 1350 FED3 058388ABC640outban: .byte 05h, 083h, 088h, 0ABh, 0C6h, 040h ; banco. 1351 FED9 03 F9 AB 21 outadr: .byte 03h, 0F9h, 0ABh, 021h ; ind. 1352 FEDD 1353 FEDD ;------------------------------------------------------ 1354 FEDD 1355 FFFF .org 0ffffh 1356 FFFF 00 .byte 00h 1357 10000 1358 10000 .end Type Key: N=NULL_SEG C=CODE_SEG B=BIT_SEG X=EXTD_SEG D=DATA_SEG L=Local E=Export Value Type Label ----- ---- ------------------------------ 005F N banco F5F0 N curs 00FC N cursd FA9B N convnu FAA6 N convn1 FAAC N convn2 FAE2 N checv FAEB N checv1 FAF7 N checv2 FAFD N checv3 FB00 N chect FB49 N cursor FE18 N ctabdi FAC2 N disp FAC5 N disp1 F000 N inizio F006 N inp FB09 N initv FB2E N initn FB33 N initn1 FC02 N input FBE0 N loc1 FBE8 N loc2 FDA3 N lf060 FDB3 N lf06e FDC8 N lf0a5 FDF1 N lf0ce FDFB N lf0d8 FDFD N lf0da FE07 N lf086 F000 N menu1 F200 N menu2 F400 N menu3 FCE9 N m1 FCFE N m2 FD13 N m3 FE48 N msgban FE53 N msgadr FBD0 N nloc FBD7 N nloc1 FBD8 N nloc1a FE62 N out0 FE6A N out1 FE73 N out2 FE7C N out3 FE85 N out4 FE8D N out5 FE94 N out6 FE9B N out7 FEA0 N out8 FEA9 N out9 FEB0 N out10 FEB8 N out11 FEC1 N out12 FECA N out13 FED3 N outban FED9 N outadr FAB1 N punt FCB8 N rit FCBA N rit1 FCC5 N rit2 FCCA N rit3 F842 N start F8B0 N sp0 F8B3 N sp1 F8B9 N sp2 F8BC N sp3 FAD1 N setban FBF0 N stack FBF3 N spA1 FBF9 N spA2 FBFC N spA3 F85B N tram1 F85E N tram2 F86D N tram2a F878 N tram3 F882 N tram4 F88F N tram5 F895 N tram6 F89B N tram7 F8AC N tram8 F8C9 N tast0 F8D2 N tast0a F8F6 N tast0b F908 N tast0c F90F N tast1 F926 N tast2 F933 N tast3 F940 N tast4 F94D N tast5 F960 N tast6 F970 N tast7 F980 N tast8 F98A N tast9 F994 N tastA F9A1 N tastB F9BB N tastC F9C8 N tastD FA26 N tastE FA37 N tast10 FA41 N tast1a FA4A N tastF FA57 N tastS1 FA64 N tastS2 FA84 N tastS3 FC05 N t1 FC0A N t1x FC10 N t2 FC16 N t2es1 FC19 N t2es2 FC1F N t2es3 FC24 N t2a FC2F N t2ax FC3E N tes1 FC41 N tes2 FC47 N tes3 FC4C N tes4 FC59 N tes5 FC65 N tes6 FC67 N t2b FC71 N t3 FC81 N t3b FC8D N t4 FC99 N t5 FCA5 N t6 FCB1 N t7 FCB4 N texit FD2C N tabvid FD50 N tabdis FE0C N tabini FE1C N tabtas FE42 N tabmen F003 N vis FB52 N vmenu1 FB5B N vmenu2 FB64 N vmenu3 FB6B N vmenuA FB6F N vmenuB FB7C N vmenuC FBBE N vloc FBC5 N vloc1 FBC6 N vloc1a FCD2 N video FD74 N vdisp FD7B N vdisp1 FD82 N vdisp2 FD8E N vdisp3 FD92 N vdispc FB20 N waitv FB26 N waitv1 FB2C N waitv2 FBA2 N writen FBA5 N write1 FBB5 N waitn FBB6 N waitn1 ADDR 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ----------------------------------------------------- F800 C3 42 F8 C3 02 FC C3 D2 FC C3 C8 FD C3 A3 FD C3 F810 B3 FD C3 E2 FA C3 00 FB C3 20 FB C3 B5 FB C3 A2 F820 FB C3 49 FB C3 BE FB C3 D0 FB C3 C5 FB C3 D7 FB F830 C3 09 FB C3 2E FB C3 18 FE C3 74 FD C3 92 FD C3 F840 A5 FB F3 21 ED 45 22 66 00 AF D3 D6 D9 57 D9 3E F850 28 D3 5F 3E CF D3 87 AF 3D D3 87 21 00 00 23 7C F860 FE 10 28 14 DB EB CB 7F 20 F4 21 00 30 2B 7C B5 F870 20 FB DB EA CB 7F 20 17 DB 85 2F CB 7F 20 10 01 F880 FF 01 DB F0 CB 7F 28 24 0B 78 B1 20 F5 18 21 E6 F890 7F FE 1B 20 1B 21 B8 FE 01 F7 08 7E ED 79 23 0D F8A0 05 AF B8 20 F6 3E 26 D3 5F C3 00 F0 FE 1F 28 E5 F8B0 21 FF EB 7E 2F 77 BE 28 03 2B 18 F7 2F 77 BE 20 F8C0 F8 2B F9 CD C8 FD CD E2 FA 21 62 FE CD 74 FD CD F8D0 52 FB CD 02 FC F5 FE 10 28 2E FE 14 30 F4 FE 01 F8E0 38 F0 21 F0 F5 CD BE FB FE 11 CD 9B FA 30 07 7D F8F0 12 CD A2 FB 18 12 7C 12 CD A2 FB 13 7D 12 CD A2 F900 FB 13 3E 3C 12 CD A2 FB F1 21 1C FE C3 B1 FA 21 F910 A0 FE CD C2 FA 3E 04 11 00 80 06 01 CD D1 FA 3E F920 19 D3 5F C3 00 F0 21 6A FE CD C2 FA 3E 00 D3 5F F930 C3 00 F0 21 73 FE CD C2 FA 3E 01 D3 5F C3 00 F0 F940 21 A9 FE CD C2 FA 3E 1A D3 5F C3 00 F0 21 7C FE F950 CD C2 FA 3E 08 11 00 00 06 08 CD D1 FA C3 00 00 F960 CD C5 FA 3E 04 11 00 80 06 01 CD D1 FA C3 00 80 F970 CD C5 FA 3E 20 11 00 80 06 01 CD D1 FA C3 00 80 F980 CD C5 FA 3E 1C D3 5F C3 00 F0 CD C5 FA 3E 1E D3 F990 5F C3 00 F0 21 8D FE CD C2 FA 3E 06 D3 5F C3 7D F9A0 F1 CD C5 FA 3E 04 11 00 80 06 01 CD D1 FA 3E 18 F9B0 11 00 00 06 01 CD D1 FA C3 69 00 21 94 FE CD C2 F9C0 FA 3E 24 D3 5F C3 00 F0 3E 01 D9 57 D9 3E 20 CD F9D0 49 FB CD 09 FB CD 2E FB 3E 26 D3 5F 21 48 FE 11 F9E0 D3 FE CD 03 F0 3E F1 32 FC 00 16 02 CD 06 F0 E5 F9F0 21 53 FE 11 D9 FE CD 03 F0 3E F3 32 FC 00 16 04 FA00 CD 06 F0 D1 E5 21 9B FE CD C2 FA 7B CB 3F CB 3F FA10 CB 3F CB 3F 0E F2 CD 92 FD 7B E6 0F 0E F1 CD 92 FA20 FD 7B D3 5F E1 E9 3E 07 11 70 00 06 01 CD D1 FA FA30 3E 28 D3 5F C3 C9 F8 D9 79 D9 3C FE 04 38 02 3E FA40 01 21 42 FE CD B1 FA C3 D2 F8 21 B0 FE CD C2 FA FA50 3E 22 D3 5F C3 00 F0 21 B8 FE CD C2 FA 3E 26 D3 FA60 5F C3 00 F0 21 C1 FE CD C2 FA CD F0 FB F9 3E 2A FA70 11 00 C0 06 04 CD D1 FA 3E C3 32 66 00 3E 19 D3 FA80 5F C3 40 DF 21 CA FE CD C2 FA CD F0 FB F9 3E 32 FA90 11 00 D0 06 02 CD D1 FA C3 00 D0 26 20 F5 FE 10 FAA0 38 04 26 53 D6 10 FE 0A 38 02 C6 07 C6 30 6F F1 FAB0 C9 F5 C5 3D CB 27 4F AF 47 09 4E 23 46 C5 E1 C1 FAC0 F1 E9 CD 74 FD 3E 20 CD 49 FB CD 09 FB CD 2E FB FAD0 C9 C5 D3 5F 21 00 F0 01 00 08 ED B0 3C 3C C1 10 FAE0 F0 C9 F5 E5 D9 06 00 D9 21 00 00 23 7C FE 10 20 FAF0 06 D9 06 FF D9 18 06 DB EB CB 7F 20 EE E1 F1 C9 FB00 C5 47 D9 78 D9 B7 78 C1 C9 E5 D5 C5 21 00 EC 11 FB10 01 EC 36 20 01 FF 01 CD 20 FB ED B0 C1 D1 E1 C9 FB20 F5 CD 00 FB 20 06 DB EB CB 7F 20 FA F1 C9 F5 E5 FB30 21 00 00 CD B3 FD 3E 20 CD A2 FB 23 7D FE 81 20 FB40 F2 7C FE 07 20 ED E1 F1 C9 F5 3E 0A D3 8C F1 D3 FB50 8D C9 21 00 F0 D9 0E 01 D9 18 10 21 00 F2 D9 0E FB60 02 D9 18 07 21 00 F4 D9 0E 03 D9 CD C5 FA F5 E5 FB70 CD D0 FB D5 E1 CD B3 FD E1 CD BE FB 7E CD 20 FB FB80 12 13 CD A2 FB 23 AF BE 20 F2 23 2F BE 20 E0 21 FB90 F0 F5 F1 F5 CD D0 FB D5 E1 CD A3 FD AF CD 49 FB FBA0 F1 C9 CD B5 FB D3 80 F5 3E 1F D3 8E 3E 1F D3 8C FBB0 AF D3 8D F1 C9 F5 DB 8C CB 7F 28 FA F1 C9 C5 46 FBC0 23 4E 23 18 01 C5 F5 E5 21 00 EC 11 20 00 18 10 FBD0 C5 46 23 4E 23 18 01 C5 F5 E5 21 58 01 11 50 00 FBE0 78 B7 28 04 19 05 18 F8 06 00 09 EB E1 F1 C1 C9 FBF0 21 FF BF 7E 2F 77 BE 28 03 2B 18 F7 2F 77 BE 20 FC00 F8 C9 C5 D5 E5 CD 00 FB 20 06 DB EA CB 7F 20 FA FC10 DB 85 CB 7F 28 FA 21 56 04 DB F0 CB 7F 28 F7 2B FC20 7C B5 20 F5 CD 00 FB 20 06 DB EA CB 7F 20 38 DB FC30 85 2F CB 7F 20 31 DB F0 CB 7F 28 10 18 E6 21 56 FC40 04 DB F0 CB 7F 28 F7 2B 7C B5 20 F5 DB F0 CB 7F FC50 20 FA 47 21 05 00 CD B8 FC DB F0 4F E6 7F B8 20 FC60 F8 CB 79 20 D9 18 4D E6 7F FE 0D 20 04 3E 10 18 FC70 43 47 D9 7A D9 B7 78 28 08 FE 08 20 04 3E 1F 18 FC80 33 FE 3A 30 08 FE 30 38 04 D6 30 18 27 FE 67 30 FC90 08 FE 61 38 04 D6 57 18 1B FE 2A 30 08 FE 21 38 FCA0 04 D6 10 18 0F FE 47 30 08 FE 41 38 04 D6 27 18 FCB0 03 C3 05 FC E1 D1 C1 C9 E5 F5 CD C5 FC 2B 7C B5 FCC0 20 F8 F1 E1 C9 F5 D5 11 47 00 1B 7A B3 20 FB D1 FCD0 F1 C9 F5 C5 D5 E5 3E 20 CD 49 FB 11 07 00 01 00 FCE0 EC 21 00 00 3E 20 CD 49 FB E5 21 2C FD C5 1A 06 FCF0 00 4F 09 C1 7E CD 00 FB 20 04 CD 20 FB 02 E1 CD FD00 A3 FD CD A2 FB 0C 2C 1D 7B FE FF 20 DC 01 F7 00 FD10 11 07 00 21 50 FD 1A C5 4F AF 47 09 C1 7E ED 79 FD20 1D 0D 79 FE EF 20 EC E1 D1 C1 F1 C9 30 31 32 33 FD30 34 35 36 37 38 39 41 42 43 44 45 46 2D 20 4D 52 FD40 23 48 4C 50 43 47 4E 51 52 54 55 56 4A 59 20 53 FD50 C0 F9 A4 B0 99 92 82 F8 80 90 88 83 C6 A1 86 8E FD60 BF FF AB 9D B6 89 C7 8C A7 C2 C8 98 AF 87 C1 E3 FD70 E1 91 FF FF F5 C5 E5 0E F7 46 23 7E ED 79 23 0D FD80 10 F9 79 FE EF 28 07 3E FF ED 79 0D 18 F4 E1 C1 FD90 F1 C9 E5 F5 C5 21 50 FD 4F AF 47 09 7E C1 ED 79 FDA0 F1 E1 C9 F5 3E 0E D3 8C 7C D3 8D 3E 0F D3 8C 7D FDB0 D3 8D F1 F5 3E 12 D3 8C 7C D3 8D 3E 13 D3 8C 7D FDC0 D3 8D 3E 1F D3 8C F1 C9 DB 89 CB 8F 21 0C FE D3 FDD0 89 3E 8F D3 82 D3 86 D3 8A 3E CF D3 83 08 AF D3 FDE0 83 08 D3 87 08 3D D3 87 08 D3 8B 3E F1 D3 8B 06 FDF0 0C 78 3D D3 8C 7E D3 8D 23 10 F6 06 08 78 C6 0B FE00 D3 8C AF D3 8D 10 F6 3E 1F D3 8C C9 0B 00 0B 48 FE10 18 18 00 1A 28 57 50 6F 21 50 FD C9 0F F9 26 F9 FE20 33 F9 40 F9 4D F9 60 F9 70 F9 80 F9 8A F9 94 F9 FE30 A1 F9 BB F9 C8 F9 26 FA 4A FA 37 FA 57 FA 64 FA FE40 84 FA 52 FB 5B FB 64 FB 00 00 42 41 4E 43 4F 3A FE50 20 00 A5 01 00 49 4E 44 49 52 49 5A 5A 4F 3A 20 FE60 00 FF 07 FF 92 86 C7 86 C6 87 08 AB 86 A1 C0 92 FE70 FF 79 92 08 AB 86 A1 C0 92 FF 42 F9 08 83 88 92 FE80 F9 C6 FF F9 82 07 C8 C0 AB F9 87 C0 AF 06 FF FF FE90 83 C0 C0 87 06 FF FF 87 86 92 87 04 C1 92 86 AF FEA0 08 83 88 92 F9 C6 FF 12 92 06 FF FF 92 C0 AB 86 FEB0 07 FF 8E C7 C0 8C 8C 91 08 87 86 92 87 FF AF 88 FEC0 C8 08 83 88 92 F9 46 88 C2 99 08 A1 F9 92 88 12 FED0 88 C2 B0 05 83 88 AB C6 40 03 F9 AB 21 00 00 00 FEE0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FEF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFA0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFB0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFE0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 tasm: Number of errors = 0