; prg-b-poker-4.prg - Disassembly annotato
; Caricato a $C700, 256 byte ($C700-$C7FF)
; Chiamato da BASIC: SYS 50944 (=$C700) alla riga 63040
;
; Scopo: visualizza l'immagine bitmap "Poker 4" e attende la pressione
;        di un tasto qualsiasi, poi ripristina la modalita' testo.
;
; L'immagine e' stata precedentemente copiata in memoria da prg-a:
;   $6000-$7FFF -> $E000-$FFFF  (8KB bitmap)
;   $7F40-$833F -> $C800-$CBFF  (1KB screen data)
;   $8328-$8727 -> $CC00-$CFFF  (1KB color data)
;   $8710       -> $CFFF        (colore sfondo)

        .setcpu "6502"

; === Riferimenti esterni ===
L8002           := $8002        ; Vettore warm start BASIC
LA002           := $A002        ; Vettore NMI/IRQ BASIC
LE518           := $E518        ; Routine cursore/editor schermo
LF6BC           := $F6BC        ; Scansione tastiera (keyboard scan)
LF6ED           := $F6ED        ; Decodifica tasto (key decode)
LFD02           := $FD02        ; Test tasto STOP
LFDA3           := $FDA3        ; Aggiorna flag STOP
LFE72           := $FE72        ; Uscita NMI Kernal (PLA/TAY/PLA/TAX/PLA/RTI)
LFFD2           := $FFD2        ; CHROUT - stampa carattere
LFFE4           := $FFE4        ; GETIN - leggi carattere da tastiera

; ===================================================================
; PARTE 1: Programma principale - visualizzazione immagine bitmap
; Chiamato con SYS 50944 dal BASIC
; ===================================================================

        ; --- Imposta vettori ---
        lda     #$FB
        sta     $0328           ; Modifica byte alto vettore CLRCHN ($0328-$0329)
        ldx     #$AC
        ldy     #$C7
        stx     $0318           ; NMI vector low = $AC
        sty     $0319           ; NMI vector high = $C7 -> handler NMI a $C7AC

        ; --- Spegni schermo per evitare glitch durante setup ---
        lda     $D011           ; VIC-II Control Register 1
        and     #$EF            ; Bit 4 = 0: spegni display
        sta     $D011

        ; --- Copia color RAM: $CC00-$CFFF -> $D800-$DBFF (1KB) ---
        ; I dati colore sono stati copiati da prg-a a $CC00.
        ; Ora li copiamo nella Color RAM hardware ($D800).
        ldx     #$00
        ldy     #$CC
        stx     $FB
        sty     $FC             ; ($FB/$FC) = $CC00 sorgente
        ldx     #$00
        ldy     #$D8
        stx     $FD
        sty     $FE             ; ($FD/$FE) = $D800 destinazione
        ldx     #$04            ; 4 pagine = 1024 byte
LC729:  ldy     #$00
LC72B:  lda     ($FB),y
        sta     ($FD),y
        iny
        bne     LC72B
        inc     $FC
        inc     $FE
        dex
        bne     LC729

        ; --- Imposta colore sfondo ---
        lda     $CFFF           ; Colore sfondo (salvato da prg-a da $8710)
        sta     $D021           ; Background color

        ; --- Configura VIC-II per bitmap multicolor ---
        lda     $DD00           ; CIA2 Port A (VIC bank select)
        and     #$FC            ; Bit 0-1 = 00: VIC bank 3 ($C000-$FFFF)
        sta     $DD00

        lda     $D011           ; VIC Control Register 1
        ora     #$20            ; Bit 5 = 1: modalita' bitmap
        sta     $D011

        lda     $D016           ; VIC Control Register 2
        ora     #$10            ; Bit 4 = 1: modalita' multicolor
        sta     $D016

        lda     $D018           ; VIC Memory Control
        and     #$2F            ;
        ora     #$28            ; Screen a $CA00, Bitmap a $E000
        sta     $D018

        ; --- Accendi schermo ---
        lda     $D011
        ora     #$10            ; Bit 4 = 1: attiva display
        sta     $D011

        ; --- Attendi pressione tasto ---
        lda     #$00
        sta     $C6             ; Svuota buffer tastiera (loc. 198)
LC76D:  jsr     LFFE4           ; GETIN: leggi carattere dal buffer
        cmp     #$00
        beq     LC76D           ; Nessun tasto -> continua ad aspettare

        ; --- Ripristina modalita' testo ---
        lda     $D011
        and     #$EF            ; Spegni display (bit 4 = 0)
        sta     $D011

        lda     $DD00
        ora     #$03            ; VIC bank 0 ($0000-$3FFF)
        sta     $DD00

        lda     $D011
        and     #$DF            ; Disattiva bitmap (bit 5 = 0)
        sta     $D011

        lda     $D016
        and     #$EF            ; Disattiva multicolor (bit 4 = 0)
        sta     $D016

        lda     $D018
        and     #$17
        ora     #$10            ; Screen a $0400, Charset a $1000 (default)
        sta     $D018

        lda     #$93            ; Codice PETSCII: CLR (clear screen)
        jsr     LFFD2           ; CHROUT: pulisci schermo

        lda     $D011
        ora     #$10            ; Riaccendi display (bit 4 = 1)
        sta     $D011

        rts                     ; Ritorna al BASIC

; ===================================================================
; PARTE 2: Handler NMI custom (installato a $C7AC)
; Gestisce scansione tastiera durante la visualizzazione bitmap,
; poiche' il normale IRQ non e' attivo in bitmap mode.
; ===================================================================

        pha                     ; Salva registri
        txa
        pha
        tya
        pha

        lda     #$7F
        sta     $DD0D           ; Disabilita NMI CIA2
        ldy     $DD0D           ; Leggi/conferma interrupt CIA2
        bmi     LC7D7           ; Se bit 7 set: timer interrupt -> esci NMI

        ; --- Test tasto STOP ---
        jsr     LFD02           ; Controlla se STOP premuto
        bne     LC7C3           ; Non STOP: vai a scansione tastiera
        jmp     (L8002)         ; STOP premuto: warm start ($8002 = $A002 default)

        ; --- Scansione e decodifica tastiera ---
LC7C3:  jsr     LF6BC           ; Scansione matrice tastiera
        jsr     LF6ED           ; Decodifica tasto premuto
        bne     LC7D7           ; Tasto trovato: esci NMI (il tasto e' nel buffer)
        bit     $FD15           ; (lettura da Kernal ROM, effetto su flag NVZ)
        jsr     LFDA3           ; Aggiorna flag STOP
        jsr     LE518           ; Gestione cursore/editor schermo
        jmp     LC7DA           ; Vai a inserire "RUN" nel buffer tastiera

        ; --- Uscita NMI ---
LC7D7:  jmp     LFE72           ; Kernal: PLA/TAY/PLA/TAX/PLA/RTI

; ===================================================================
; PARTE 3: Auto-esecuzione programma BASIC
; Inserisce "RUN" + RETURN nel buffer tastiera per avviare
; automaticamente il programma BASIC dopo il caricamento.
; ===================================================================

LC7DA:  lda     #$03
        sta     $C6             ; 3 caratteri nel buffer tastiera
        lda     #$52            ; 'R'
        ldx     #$D5            ; 'U' (shifted)
        ldy     #$0D            ; RETURN
        sta     $0277           ; Buffer tastiera posizione 0 = R
        stx     $0278           ; Buffer tastiera posizione 1 = U
        sty     $0279           ; Buffer tastiera posizione 2 = RETURN
        lda     #$FB
        sta     $0328           ; Ripristina vettore CLRCHN
        jmp     (LA002)         ; Esci tramite vettore NMI BASIC

; ===================================================================
; Dati in coda al programma
; ===================================================================
        .byte   $FF,$FF,$FF,$FF ; Padding (4 byte inutilizzati)
        .byte   $50,$4F,$4B,$45,$52,$20,$34  ; "POKER 4" - firma/marker
