

        opt     l-
        icl     '..\include\atarihw.h'
        icl     '..\include\atarios.h'
        icl     'vbxe.asm'
        opt     l+

;scrolling w trybie 80-cio kolumnowym
LINE_WIDTH equ 80


        org     $8000

init    rts
        ini     init

        org     $8000

start
        .local

ptr1    equ     0x90
ptr2    equ     0x92

        ;kopiowanie systemowego generatora znaków do pamięci VBXE
        ;używamy bank B MEMAC w trybie dostępu dla CPU
        ;adres docelowy generatora w VBXE: 0x00800

        ;MEMAC B 0x4000 - 0x7fff <-> VBXE VRAM 0x00000 - 0x03fff
        mva     #0x80 MB_CPU
        ;znaki 0 - 127 generatora systemowego
        mwa     #0xe000 ptr1
        mwa     #0x4800 ptr2
        ldx     #4
        ldy     #0
l1      lda     (ptr1),y
        sta     (ptr2),y
        iny
        bne     l1
        inc     ptr1+1
        inc     ptr2+1
        dex
        bne     l1
        ;druga część generatora (znaki 128 - 255) inverse
        mwa     #0xe000 ptr1
        ldx     #4
l2      lda     (ptr1),y
        eor     #0xff
        sta     (ptr2),y
        iny
        bne     l2
        inc     ptr1+1
        inc     ptr2+1
        dex
        bne     l2

        ;przepisywanie palety, 24 kolory począwszy od nr 256
        ;użyjemy je do trybu tekstowego

        ldx     #0
        mwa     #palette ptr1
p1      ldy     #0
        lda     (ptr1),y
        sta     MB1
        iny
        lda     (ptr1),y
        sta     MB2
        iny
        lda     (ptr1),y
        sta     MB3
        stx     MB0
        mva     #0xc1 MSEL
        adw     ptr1 #3
        inx
        cpx     #24
        bcc     p1

        ;kopiuj XDL i BlitterList do pamięci VBXE
        ;adres (w VBXE) 0x00000, w ATARI 0x4000 (początek MEMAC_B_WINDOW)

        mva     #0x80 MB_CPU
        ldx     #0
l3      lda     xdl_load_address,x
        sta     xdl_address,x
        inx
        bne     l3
        ;czyść ekran w pamięci VBXE
        ;dla uproszczenia 256 bajtów
        txa
l4      sta     scrollline,x
        inx
        bne     l4
        ;wskaż kontrolerowi VBXE adres XDL
        lda     <xdl_pointer
        sta     XDL_ADR0
        lda     >xdl_pointer
        sta     XDL_ADR1
        lda     ^xdl_pointer
        sta     XDL_ADR2
        ;wskaż blitterowi adres XDL
        lda     <blitterlist
        sta     BL_ADR0
        lda     >blitterlist
        sta     BL_ADR1
        lda     ^blitterlist
        sta     BL_ADR2
        ;włącz wyświetlanie
        mva     #VC_XDL_ENABLED VIDEO_CONTROL
        mva     #0 MB_CPU

        .endl

        ;pętla główna
loop    lda     20
        cmp     20
        req
        jsr     hscroll_routine
        jmp     loop


        ;procedura obsługi hscroll
hscroll_routine
        sei
        inc     NMIEN
        mva     #0x80 MB_CPU

        .local

        ;uaktualnij rejestr fine Hscrolling w XDL
        ;0,1,2,3,4,5,6,7,0,1,2, ....
        ;ta kolejność daje przesuw w lewo
        ;wartość 0 brak przesuwu, wartość 7 to przesuw o 7 pikseli w lewo.
        lda     xdl_hscroll_register
        add     #1
        and     #7
        sta     xdl_hscroll_register
        jne     l4

        ;Hscroll = 0
        ;Kopiowanie ekranu wraz z atrybutami
        ;na pozycję o jeden znak w lewo.
        ;Bufor ekranu ma w sumie LINE_WIDTH+1 znaków czyli z atrybutami
        ;(LINE_WIDTH+1)*2 bajtów
        
        ;kopiowanie przez CPU ATARI
;        ldx     #(0-LINE_WIDTH*2)
;l5      lda     scrollline+2-((0-LINE_WIDTH*2)&255),x
;        sta     scrollline-((0-LINE_WIDTH*2)&255),x
;        inx
;        bne     l5

        ;kopiowanie przez blitter VBXE
        mva     #1 BLITTER_START
        lda     BLITTER_BUSY
        rne

        ;wypis nowego znaku na skrajnie prawej
        ;(dla przesuwu 0 całkowicie niewidocznej) pozycji
        ;Za każdym "powtórzeniem" linii tekstu
        ;nadamy nowy kolor 0 - 15 (czyli kolor 256 - 271 z plaety)
        ldx     txt_index
l1      lda     txt_array,x
        cmp     #255
        jne     l2
        ldx     #0
        lda     RANDOM
        and     #15
        sta     txt_color
        lda     txt_array
l2      inx
        stx     txt_index
        sta     scrollline+(LINE_WIDTH*2)
        lda     txt_color
        sta     scrollline+(LINE_WIDTH*2)+1

l4      mva     #0 MB_CPU
        mva     #0x40 NMIEN
        cli

        rts

txt_array
        .byte   "VBXE overlay textmode. Horizontal scrolling demo ...   ",255
txt_index
        .byte   txt_index-txt_array-1
txt_color
        .byte   0

        .endl

palette
        ;prosta przykładowa paleta
        ;podstawowe barwy i ich podstawowe kombinacje
        ;R, G, B
        .byte   0, 0, 0               ;kolor 0 (256)
        .byte   0xa0, 0xa0, 0xa0      ;kolor 1 (257)
        .byte   0xff, 0xff, 0xff      ;kolor 2 (258)
        .byte   0xa0, 0, 0            ;kolor 3 (259)
        .byte   0xff, 0, 0            ;kolor 4 (260)
        .byte   0, 0xa0, 0            ;kolor 5 (261)
        .byte   0, 0xff, 0            ;kolor 6 (262)
        .byte   0, 0, 0xa0            ;kolor 7 (263)
        .byte   0, 0, 0xff            ;kolor 8 (264)
        .byte   0xa0, 0xa0, 0         ;kolor 9 (265)
        .byte   0xff, 0xff, 0         ;kolor 10 (266)
        .byte   0xa0, 0, 0xa0         ;kolor 11 (267)
        .byte   0xff, 0, 0xff         ;kolor 12 (268)
        .byte   0, 0xa0, 0xa0         ;kolor 13 (269)
        .byte   0, 0xff, 0xff         ;kolor 14 (270)
        .byte   0x80, 0x80, 0x80      ;kolor 15 (271)

        .byte   0, 0, 0               ;kolor 16 (272)
        .byte   0x60, 0x60, 0x60      ;kolor 17 (273)
        .byte   0x90, 0x90, 0x90      ;kolor 18 (274)
        .byte   0x80, 0, 0            ;kolor 19 (275)
        .byte   0, 0x80, 0            ;kolor 20 (276)
        .byte   0, 0, 0x80            ;kolor 21 (277)
        .byte   0x60, 0, 0x60         ;kolor 22 (278)
        .byte   0x60, 0x60, 0         ;kolor 23 (279)



;*** XDL ***

;XDL załaduje się do normalnej pamięci ATARI
;następnie zostanie skopiowane przy inicjalizacji programu do pamięci VBXE
;Korzystamy z bufora MEMAC_B
;dodatkowe założenie dla uproszczenia:
;wszystkie dane (XDL, ekran, fonty) dostępne
;są z banku nr 0 MEMAC_B
xdl_load_address equ *

        ;ładuj poza MEMAC_B ale asembluj pod adres MEMAC_B_WINDOW
        org     MEMAC_B_WINDOW,*

;ten adres wskażemy jako początek XDL w rejestrach XDL_ADR0,1,2
xdl_pointer equ *-MEMAC_B_WINDOW

;ten adres jest początkiem XDL widzianego przez okno MEMAC_B
xdl_address

        ;XDLC
        ;24 puste linie od góry ekranu ...
        .word   XDLC_RPTL
        .byte   3*8-1

        ;XDLC
        ;tryb tekstowy, załaduj też informacje o
        ;  - ilości kolejnych linii (XDLC_RPTL)
        ;  - adresie obszaru wyświetlanego (XDLC_OVADR)
        ;  - rejestrach scrollingu (XDLC_OVSCRL)
        ;  - adresie generatora znaków (XDLC_CHBASE)
        ;jednocześnie jest to koniec XDL (XDLC_END)
        .word   XDLC_TMON + XDLC_END + XDLC_RPTL + XDLC_OVADR + XDLC_OVSCRL + XDLC_CHBASE

        ;XDLC_RPTL
        ;razem 8 linii trybu tekstowego (jeden wiersz)
        .byte   7

        ;XDLC_OVADR
        ;adres ekranu bezpośrednio za XDL w pamięci VBXE
        .long   scrollline - MEMAC_B_WINDOW
        ;krok adresu - nie używamy (bo jest tylko jedna linia trybu tekstowego),
        ;ale musi być przy okazji adresu, więc niech będzie 0
        .word   0

        ;XDLC_OVSCRL
        ;rejestry scrollingu poziomego i pionowego dla tej linii tekstu
xdl_hscroll_register
        .byte   0       ;hscroll
        .byte   0       ;vscroll

        ;XDLC_CHBASE
        ;generator znaków w pamięci VBXE pod adresem 0x00800 ( 1 x 0x800 )
        .byte   1

blitterlist equ *-MEMAC_B_WINDOW

        ;tylko jeden blok BCB
        .long   scrollline - MEMAC_B_WINDOW + 2
        .word   0
        .long   scrollline - MEMAC_B_WINDOW
        .word   0
        .word   159
        .byte   0
        .byte   255
        .byte   0
        .byte   0
        .byte   0

        ;Obszar wyświetlany bezpośrednio za XDL
scrollline  equ *

;---------------------------------------------------------------------

        run     start

        end
