; Test driver to exercise graphics routines.

                    REL
                    DSK        MAINSEG

                    use        Locator.Macs.s
                    use        Misc.Macs.s
                    use        EDS.GSOS.MACS.s
                    use        Tool222.Macs.s
                    use        Util.Macs.s
                    use        CORE.MACS.s
                    use        ../../src/GTE.s
                    use        ../../src/Defs.s

                    mx         %00

; Feature flags
NO_INTERRUPTS       equ        0                       ; turn off for crossrunner debugging
NO_MUSIC            equ        1                       ; turn music + tool loading off

; Typical init
                    phk
                    plb

                    jsl        EngineStartUp

                    lda        #^MyPalette
                    ldx        #MyPalette
                    ldy        #0
                    jsl        SetPalette

                    ldx        #0
                    jsl        SetScreenMode

; Set up our level data
                    jsr        BG0SetUp
                    jsr        BG1SetUp
                    jsr        TileAnimInit

; Allocate room to load data

                    jsl        AllocBank               ; Alloc 64KB for Load/Unpack
                    sta        BankLoad                ; Store "Bank Pointer"

                    jsr        MovePlayerToOrigin      ; Put the player at the beginning of the map
                    
                    jsr        InitOverlay             ; Initialize the status bar

                    lda        #DIRTY_BIT_BG0_REFRESH  ; Redraw all of the tiles on the next Render
                    ora        #DIRTY_BIT_BG1_REFRESH
                    tsb        DirtyBits

                    stz        frameCount
                    ldal       OneSecondCounter
                    sta        oldOneSecondCounter

                    lda        #$FFFF
                    jsl        Render
EvtLoop
                    jsl        DoTimers
                    jsl        Render
                    inc        frameCount

                    ldal       OneSecondCounter
                    cmp        oldOneSecondCounter
                    beq        :noudt
                    sta        oldOneSecondCounter
                    jsr        UdtOverlay
                    stz        frameCount
:noudt

                    jsl        ReadControl
                    and        #$007F                  ; Ignore the buttons for now

                    cmp        #'q'
                    bne        :1
                    brl        Exit

:1
                    cmp        #'l'
                    bne        :1_1
                    jsr        DoLoadFG
                    brl        EvtLoop

:1_1                cmp        #'b'
                    bne        :2
                    jsr        DoLoadBG1
                    brl        EvtLoop

:2                  cmp        #'m'
                    bne        :3
                    jsr        DumpBanks
                    brl        EvtLoop

:3                  cmp        #'f'                    ; render a 'f'rame
                    bne        :4
                    jsl        Render
                    brl        EvtLoop

:4                  cmp        #'h'                    ; Show the 'h'eads up display
                    bne        :5
                    jsr        DoHUP
                    brl        EvtLoop

:5                  cmp        #'1'                    ; User selects a new screen size
                    bcc        :6
                    cmp        #'9'+1
                    bcs        :6
                    sec
                    sbc        #'1'
                    tax
                    jsl        SetScreenMode
                    jsr        MovePlayerToOrigin
                    brl        EvtLoop

:6                  cmp        #'t'
                    bne        :7
                    jsr        DoTiles
                    brl        EvtLoop

:7                  cmp        #$15                    ; left = $08, right = $15, up = $0B, down = $0A
                    bne        :8
                    lda        #1
                    jsr        MoveRight
                    brl        EvtLoop

:8                  cmp        #$08
                    bne        :9
                    lda        #1
                    jsr        MoveLeft
                    brl        EvtLoop

:9                  cmp        #$0B
                    bne        :10
                    lda        #1
                    jsr        MoveUp
                    brl        EvtLoop

:10                 cmp        #$0A
                    bne        :11
                    lda        #1
                    jsr        MoveDown
                    brl        EvtLoop

:11                 cmp        #'d'
                    bne        :12
                    lda        #1
                    jsr        Demo
                    brl        EvtLoop

:12                 cmp        #'z'
                    bne        :13
                    jsr        AngleUp
                    brl        EvtLoop

:13                 cmp        #'x'
                    bne        :14
                    jsr        AngleDown
                    brl        EvtLoop

:14                 brl        EvtLoop

; Exit code
Exit
                    jsl        EngineShutDown

                    _QuitGS    qtRec

                    bcs        Fatal
Fatal               brk        $00

MyPalette           dw         $0000,$0777,$0F31,$0E51,$00A0,$02E3,$0BF1,$0FA4,$0FD7,$0EE6,$0F59,$068F,$01CE,$09B9,$0EDA,$0EEE

StartMusic
                    pea        #^MusicFile
                    pea        #MusicFile
                    _NTPLoadOneMusic

                    pea        $0001                   ; loop
                    _NTPPlayMusic
                    rts

; Position the screen with the botom-left corner of the tilemap visible
MovePlayerToOrigin
                    lda        #0                      ; Set the player's position
                    jsl        SetBG0XPos
                    lda        #0
                    jsl        SetBG1XPos

                    lda        TileMapHeight
                    asl
                    asl
                    asl
                    sec
                    sbc        ScreenHeight
                    pha
                    jsl        SetBG0YPos
                    pla
                    jsl        SetBG1YPos

                    rts

ClearBankLoad
                    lda        BankLoad
                    phb
                    pha
                    plb
                    ldx        #$FFFE
:lp                 sta:       $0000,x
                    dex
                    dex
                    cpx        #0
                    bne        :lp
                    plb
                    plb
                    rts

SecondsStr          str        'SECONDS'
TicksStr            str        'TICKS'

; Print a bunch of messages on screen
DoHUP
                    lda        #SecondsStr
                    ldx        #{160-12*4}
                    ldy        #$7777
                    jsr        DrawString
                    lda        OneSecondCounter        ; Number of elapsed seconds
                    ldx        #{160-4*4}              ; Render the word 4 charaters from right edge
                    jsr        DrawWord

                    lda        #TicksStr
                    ldx        #{8*160+160-12*4}
                    ldy        #$7777
                    jsr        DrawString
                    PushLong   #0
                    _GetTick
                    pla
                    plx
                    ldx        #{8*160+160-4*4}
                    jsr        DrawWord
                    rts

; Fill up the virtual buffer with tile data
DoTiles
:row                equ        1
:column             equ        3
:tile               equ        5

                    pea        $0000                   ; Allocate local variable space
                    pea        $0000
                    pea        $0000

:rowloop
                    lda        #0
                    sta        :column,s
                    lda        #$0010
                    sta        :tile,s

:colloop
                    lda        :row,s
                    tay
                    lda        :column,s
                    tax
                    lda        :tile,s
                    jsl        CopyBG0Tile

                    lda        :column,s
                    inc
                    sta        :column,s
                    cmp        #41
                    bcc        :colloop

                    lda        :row,s
                    inc
                    sta        :row,s
                    cmp        #26
                    bcc        :rowloop

                    pla                                ; restore the stack
                    pla
                    pla
                    rts

; Load a binary file in the BG1 buffer
DoLoadBG1
                    lda        BankLoad
                    ldx        #BG1DataFile
                    jsr        LoadFile

                    ldx        BankLoad
                    lda        #0
                    ldy        BG1DataBank
                    jsl        CopyBinToBG1

                    lda        BankLoad
                    ldx        #BG1AltDataFile
                    jsr        LoadFile

                    ldx        BankLoad
                    lda        #0
                    ldy        BG1AltBank
                    jsl        CopyBinToBG1

                    rts

; Load a raw pixture into the code buffer
DoLoadFG
                    lda        BankLoad
                    ldx        #FGName
                    jsr        LoadFile

                    ldx        BankLoad                ; Copy it into the code field
                    lda        #0
                    jsl        CopyBinToField
                    rts

; Load a simple picture format onto the SHR screen
DoLoadPic
                    lda        BankLoad
                    ldx        #ImageName              ; Load+Unpack Boot Picture
                    jsr        LoadPicture             ; X=Name, A=Bank to use for loading

                    ldx        BankLoad                ; Copy it into the code field
                    lda        #0
                    jsl        CopyPicToField
                    rts

; Graphics helpers

LoadPicture
                    jsr        LoadFile                ; X=Nom Image, A=Banc de chargement XX/00
                    bcc        :loadOK
                    rts
:loadOK
                    jsr        UnpackPicture           ; A=Packed Size
                    rts


UnpackPicture       sta        UP_PackedSize           ; Size of Packed Data
                    lda        #$8000                  ; Size of output Data Buffer
                    sta        UP_UnPackedSize
                    lda        BankLoad                ; Banc de chargement / Decompression
                    sta        UP_Packed+1             ; Packed Data
                    clc
                    adc        #$0080
                    stz        UP_UnPacked             ; On remet a zero car modifie par l'appel
                    stz        UP_UnPacked+2
                    sta        UP_UnPacked+1           ; Unpacked Data buffer

                    PushWord   #0                      ; Space for Result : Number of bytes unpacked 
                    PushLong   UP_Packed               ; Pointer to buffer containing the packed data
                    PushWord   UP_PackedSize           ; Size of the Packed Data
                    PushLong   #UP_UnPacked            ; Pointer to Pointer to unpacked buffer
                    PushLong   #UP_UnPackedSize        ; Pointer to a Word containing size of unpacked data
                    _UnPackBytes
                    pla                                ; Number of byte unpacked
                    rts

UP_Packed           hex        00000000                ; Address of Packed Data
UP_PackedSize       hex        0000                    ; Size of Packed Data
UP_UnPacked         hex        00000000                ; Address of Unpacked Data Buffer (modified)
UP_UnPackedSize     hex        0000                    ; Size of Unpacked Data Buffer (modified)

; Basic I/O function to load files

LoadFile
                    stx        openRec+4               ; X=File, A=Bank (high word) assumed zero for low
                    stz        readRec+4
                    sta        readRec+6
                    jsr        ClearBankLoad

:openFile           _OpenGS    openRec
                    bcs        :openReadErr
                    lda        openRec+2
                    sta        eofRec+2
                    sta        readRec+2

                    _GetEOFGS  eofRec
                    lda        eofRec+4
                    sta        readRec+8
                    lda        eofRec+6
                    sta        readRec+10

                    _ReadGS    readRec
                    bcs        :openReadErr

:closeFile          _CloseGS   closeRec
                    clc
                    lda        eofRec+4                ; File Size
                    rts

:openReadErr        jsr        :closeFile
                    nop
                    nop

                    PushWord   #0
                    PushLong   #msgLine1
                    PushLong   #msgLine2
                    PushLong   #msgLine3
                    PushLong   #msgLine4
                    _TLTextMountVolume
                    pla
                    cmp        #1
                    bne        :loadFileErr
                    brl        :openFile
:loadFileErr        sec
                    rts

msgLine1            str        'Unable to load File'
msgLine2            str        'Press a key :'
msgLine3            str        ' -> Return to Try Again'
msgLine4            str        ' -> Esc to Quit'

; Data storage    
MusicFile           str        '1/main.ntp'
BG1DataFile         strl       '1/bg1a.bin'
BG1AltDataFile      strl       '1/bg1b.bin'

ImageName           strl       '1/test.pic'
FGName              strl       '1/fg1.bin'

openRec             dw         2                       ; pCount
                    ds         2                       ; refNum
                    adrl       FGName                  ; pathname

eofRec              dw         2                       ; pCount
                    ds         2                       ; refNum
                    ds         4                       ; eof

readRec             dw         4                       ; pCount
                    ds         2                       ; refNum
                    ds         4                       ; dataBuffer
                    ds         4                       ; requestCount
                    ds         4                       ; transferCount

closeRec            dw         1                       ; pCount
                    ds         2                       ; refNum

qtRec               adrl       $0000
                    da         $00

                    PUT        App.Msg.s
                    PUT        Actions.s
                    PUT        font.s

                    PUT        gen/App.TileMapBG0.s
                    PUT        gen/App.TileMapBG1.s
                    PUT        gen/App.TileSetAnim.s

                    PUT        Overlay.s
