;----------------------------------------------- ; Eprom 2390 .org 0f000h jp lf3fd lf003: in a,(8ch) xor a out (0d6h),a ; ferma i motori dei drive e setta il flip-flop del circuito di reset di ld sp,7000h call lf0a5 ; init video lf00f: call lf227 ; fa il test della memoria video (errorpoints) ld hl,lf301 ; visualizza i messaggi per il boot call lf2e1 ld hl,lf318 call lf2e1 ld hl,lf31f call lf2e1 ld hl,lf339 call lf2e1 ld hl,lf3d3 call lf2e1 ld hl,0526h call lf060 lf036: call lf094 ; input da tastiera cp 1bh jp z,lf13d cp 0dh jr z,lf00f ; (-51) jr lf036 ; (-14) lf044: in a,(8ch) ; attende la ritraccia del video bit 7,a jr z,lf044 ; (-6) ld hl,3040h ld a,(hl) out (80h),a inc hl ld a,(hl) out (84h),a inc hl ld a,(hl) out (88h),a inc hl ld a,(hl) out (8eh),a xor a out (8dh),a ret lf060: ld a,0eh ; carica da HL l'indirizzo del cursore out (8ch),a ld a,h out (8dh),a ld a,0fh out (8ch),a ld a,l out (8dh),a lf06e: ld a,12h ; carica da HL l'indirizzo del carattere da visualizzare in R18 e R19 out (8ch),a ld a,h out (8dh),a ld a,13h out (8ch),a ld a,l out (8dh),a jr lf086 ; (8) lf07e: ld a,0ah ; spegne il cursore out (8ch),a ld a,20h out (8dh),a lf086: ld a,1fh ; accesso a R31 del SY6545 per fare l'update out (8ch),a ret lf08b: ld a,0ah out (8ch),a xor a out (8dh),a jr lf086 ; (-14) lf094: in a,(85h) ; attende la pressione di un tasto cpl bit 7,a jr nz,lf094 ; (-7) lf09b: in a,(85h) cpl bit 7,a jr z,lf09b ; (-7) and 7fh ret lf0a5: in a,(89h) ; setta il video a 80 colonne res 1,a ld hl,lf2f5 out (89h),a ld a,8fh ; inizializza i PIO out (82h),a ; PIO 0/A (RAM 0) out (86h),a ; PIO 1/A (RAM 1) out (8ah),a ; PIO 2/A (RAM 2) ld a,0cfh out (83h),a ; PIO 0/B (stampante) ex af,af' xor a out (83h),a ex af,af' out (87h),a ; PIO 1/B (tastiera) ex af,af' dec a out (87h),a ex af,af' out (8bh),a ; PIO 2/B (busy stampante / controllo 40-80 caratteri) ld a,0f1h out (8bh),a ld b,0ch ; inizializza i registri del SY6545 da R11 a R0 lf0ce: ld a,b dec a out (8ch),a ld a,(hl) out (8dh),a inc hl djnz lf0ce ; (-10) lf0d8: ld b,08h ; azzera i registri del SY6545 da R19 a R12 lf0da: ld a,b add a,0bh out (8ch),a xor a out (8dh),a djnz lf0da ; (-10) jp lf086 lf0e7: call lf07e ld hl,0020h ld (3040h),hl ld hl,0ff00h ld (3042h),hl call lf0d8 ld hl,0000h lf0fc: ld a,(3040h) call lf113 inc hl ld a,h cp 07h jr nz,lf0fc ; (-12) ld a,l cp 80h jr nz,lf0fc ; (-17) call lf0d8 jp lf08b lf113: push af lf114: in a,(8ch) bit 7,a jr z,lf114 ; (-6) pop af out (80h),a ld a,(3043h) out (8eh),a xor a out (8dh),a ret lf126: ld hl,0000h call lf0d8 ; call "azzera i registri del SY6545 da R19 a R12" lf12c: push hl call lf044 pop hl inc hl ld a,h cp 07h jr nz,lf12c ; (-11) ld a,l cp 80h jr nz,lf12c ; (-16) ret lf13d: call lf0e7 ; call "spegne il cursore" ld hl,lf356 call lf2e1 ; visualizza i messaggi per il boot ld hl,lf375 call lf2e1 ld hl,lf3a4 call lf2e1 lf152: ld a,0ffh ld (3043h),a ld hl,lf3d3 call lf2e1 ld hl,0526h call lf060 ; posiziona il cursore call lf094 ; attende la pressione di un tasto ld hl,(lf3b6) push hl call lf060 pop hl ld b,1ah ; cancella la riga che conterrà l'eventuale errore lf170: ld a,20h call lf113 djnz lf170 ; (-7) ld hl,0526h ; posiziona il cursore call lf060 lf17d: xor a ; INIZIO DEL BOOT DA DISCO out (0d6h),a ; ferma i motori dei drive out (0d0h),a ; invia un comando di restore lf182: ex (sp),hl ; Controlla se l'INDEX è attivo. Se lo è invia un "force interrupt" ex (sp),hl ; (senza generazione di interrupt, solo per interrompere il comando) e poi controlla in a,(0d0h) ; nuovamente se l'INDEX è attivo. Il bit di INDEX viene aggiornato appena il precedente bit 1,a ; comando si interrompe. Probabilmente serve per attendere nel caso in cui jr z,lf190 ; non sia presente il floppy nel drive. In questo caso l'INDEX è a 1, poi quando si ld a,0d0h ; inserisce il floppy va a zero (a meno che il forellino non coincida out (0d0h),a ; casualmente con il fotodiodo). jr lf182 lf190: ld hl,0000h ; carica 0000h in 9000h-9001h, indicanti la locazione in cui cominciare a inserire ld (9000h),hl ; i dati letti ld hl,1500h ; carica 00h in 9002h (il settore da leggere) e 15h in 9003h (la traccia da leggere) ld (9002h),hl ld a,01h ; accende il motore del drive 0 out (0d6h),a ld b,05h ; invia 5 volte il comando di restore per posizionare la testina sulla traccia 0 lf1a2: ld a,0bh out (0d0h),a ex (sp),hl ex (sp),hl djnz lf1a2 ; (-8) lf1aa: in a,(0d0h) ; attende che il "busy" si disattivi bit 0,a jr nz,lf1aa ; (-6) ; da qui comincia a caricare il sistema operativo. Termina quando trova il quart'ultimo byte del settore <> 01 lf1b0: ld de,(9002h) ; carica in DE la traccia/settore da leggere ld hl,(9000h) ; carica in HL la locazione da cui cominciare a mettere i dati letti call lf1f5 ; salta a subroutine di lettura settore ld a,(9002h) ; incrementa il numero di settore da leggere inc a cp 0ah jr nz,lf1ca ; (8) ld a,(9003h) ; se ha letto tutti i settori incrementa la traccia da leggere inc a ld (9003h),a xor a ; e azzera il numero del settore da leggere lf1ca: ld (9002h),a dec hl ; carica l'indirizzo di memoria in cui cominciare a leggere i successivi dati ld a,(hl) ; prendendolo dagli ultimi 2 bytes del settore letto ld (9001h),a dec hl ld a,(hl) ld (9000h),a dec hl ld a,(hl) ; controlla se il terz'ultimo byte letto è 01h cp 01h ; se non lo è visualizza il messaggio di errore "NO NE-DOS" jr nz,lf1e4 ; (7) dec hl ld a,(hl) ; controlla se il quart'ultimo byte letto è 01h cp 01h jr z,lf1b0 ; (-51) se lo è legge il successivo settore (o la traccia successiva, settore 0) rst 00h ; altrimenti ha finito e salta al NE-DOS. Il drive resta acceso lf1e4: ld hl,lf3b6 ; visualizza l'errore "NO NE-DOS" xor a out (0d6h),a ; ferma il motore ld a,0f0h ld (3043h),a call lf2e1 jp lf152 lf1f5: ld a,e ; SUBROUTINE DI LETTURA SETTORE. Legge un settore della traccia/settore indicata da DE e la mette a partire da HL out (0d2h),a ; carica il registro di settore ld a,d out (0d7h),a ; carica il data register con il numero della traccia da leggere ld a,1ah out (0d0h),a ; effettua una seek ex (sp),hl ex (sp),hl lf201: in a,(0d0h) ; attende che il "busy" vada a 0 rrca jr c,lf201 ; (-5) ld a,88h ; effettua un "read sector" cercando il data mark FBh out (0d0h),a push bc pop bc jr lf211 ; (3) lf20e: rrca ; controlla il bit "busy" jr nc,lf21d ; (12) se non è "busy" va a lf21d, altrimenti prosegue lf211: in a,(0d0h) ; controlla il "DRQ" bit 1,a ; jr z,lf20e ; (-9) se il "DRQ" è a 0 (dato non presente) va a lf20e, altrimenti prosegue in a,(0d7h) ; legge il "data register" e lo scrive nella locazione puntata da HL ld (hl),a inc hl jr lf211 ; (-12) salta a leggere il successivo byte del settore lf21d: in a,(0d0h) ; legge lo status register and 5ch ret z ; se non ci sono errori ritorna ld a,0d0h ; altrimenti invia un "force interrupt" out (0d0h),a ret ; e poi ritorna lf227: ld hl,7f00h ; fa il test della memoria video (errorpoints) ld (9006h),hl xor a ex af,af' ld hl,0ffffh ld (3040h),hl ld hl,0efffh ld (3042h),hl call lf126 call lf0d8 ld hl,0780h lf244: in a,(8ch) bit 7,a jr z,lf244 ; (-6) in a,(80h) inc a jr nz,lf259 ; (10) in a,(84h) inc a jr nz,lf259 ; (5) in a,(88h) inc a jr z,lf26e ; (21) lf259: ld (9004h),sp ld sp,(9006h) push hl ld (9006h),sp ld sp,(9004h) ex af,af' ld a,01h ex af,af' lf26e: dec hl xor a out (8dh),a ld a,h or l jr nz,lf244 ; (-50) call lf0d8 ex af,af' or a jr z,lf2de ; (97) call lf0e7 ld hl,lf3d9 call lf2e1 ld hl,0140h call lf060 ld (9004h),sp lf290: ld a,20h call lf113 ld sp,(9006h) pop hl ld (9006h),sp ld a,h add a,30h call lf113 ld h,00h add hl,hl add hl,hl add hl,hl add hl,hl ld a,h cp 0ah jr c,lf2b1 ; (2) add a,07h lf2b1: add a,30h call lf113 or a ld a,l rra rra rra rra cp 0ah jr c,lf2c2 ; (2) add a,07h lf2c2: add a,30h call lf113 ld a,(9007h) cp 7fh jr nz,lf290 ; (-62) ld sp,(9004h) ld hl,lf3e9 call lf2e1 call lf07e call lf094 lf2de: jp lf0e7 lf2e1: ld c,(hl) ; visualizza una riga di messaggio puntato da HL inc hl ld b,(hl) push hl push bc pop hl call lf06e pop hl lf2eb: inc hl ld a,(hl) cp 00h ret z call lf113 jr lf2eb ; (-10) lf2f5: .byte 0bh, 00h, 0bh, 48h, 18h, 18h, 00h, 1ah, 28h, 57h, 50h, 6fh lf301: .byte 0bh, 01h, "GRAFIC - MONITOR 1.0", 00h lf318: .byte 04h, 02h, "type", 00h lf31f: .byte 3ah, 03h, 22h, "ESC", 22h, " for BOOTSTRAPPING", 00h lf339: .byte 0d9h, 03h, 22h, "RETURN", 22h, " for testing VIDEO", 00h lf356: .byte 08h, 01h, "BOOTSTRAP Version GRAFIC 1.0", 00h lf375: .byte 9fh, 01h, "Insert NE-DOS-DISK Version" .byte " GRAFIC in drive 0", 00h lf3a4: .byte 4eh, 02h, "then type a key", 00h lf3b6: .byte 89h, 03h, " No NE-DOS Version GRAFIC ", 00h lf3d3: .byte 25h, 05h, "> <", 00h lf3d9: .byte 0eh, 00h, "Errorpoints :", 00h lf3e9: .byte 28h, 00h, "Please type a key", 00h .org 0f3fdh lf3fd: jp lf003 ;------------------------------------------------------ .org 0f400h .end