
;GET A ROW FROM THE MAP IN SAVE RAM AND COPY TO THE SCREEN MAP IN RAM

GETROW:
    LDX <MAPX
    JSR GETSCREENADDRESS

    LDA #$10
    STA <$04

GETROWLOOP:
    LDA <COLUMN
    CMP <MAPHEIGHTH
    BCS GETBORDERTILE1

    CPY <MAPWIDTH
    BCC GETMETATILE1

GETBORDERTILE1:
    LDA #$01
    BNE PUTMETATILE1

GETMETATILE1:
    LDA [$02], Y
PUTMETATILE1:
    STA $0500, X

    DEC <$04
    BEQ EXITGETROW

    INY
    INX

    TXA
    AND #$0F
    BNE GETROWLOOP

    TXA
    SEC
    SBC #$10
    TAX

    JMP GETROWLOOP

EXITGETROW:
    RTS

;GET A COLUMN FROM THE MAP IN SAVE RAM AND COPY TO THE SCREEN MAP IN RAM

GETCOLUMN:
    TAX
    LDA <MAPY

    JSR GETSCREENADDRESS

    LDA #$0F
    STA <$04
GETCOLUMNLOOP:
    CPY <MAPWIDTH
    BCS GETBORDERTILE2

    LDA <COLUMN
    CMP <MAPHEIGHTH

    BCC GETMETATILE2

GETBORDERTILE2:
    LDA #$01
    BNE PUTMETATILE2

GETMETATILE2:
    LDA [$02], Y
PUTMETATILE2:
    STA $0500, X

    DEC <$04
    BEQ EXITGETCOLUMN

    TXA
    CLC
    ADC #$10
    TAX

    INC <COLUMN
    BNE DONTRESETMAP

    LDA #$00
    STA <$02
    LDA #$62
    STA <$03

    BNE GETCOLUMNLOOP
DONTRESETMAP:
    LDA <$02
    CLC
    ADC <MAPWIDTH
    STA <$02

    BCC GETCOLUMNLOOP

    INC <$03
    BNE GETCOLUMNLOOP
EXITGETCOLUMN:
    RTS

;GET THE ADDRESS TO START READING A ROW OR COLUMN FROM

GETMAPADDRESS:
    LDX <MAPWIDTH
    JSR DOMULTIPLY

    TAX

    LDA <$03
    ADC #$00
    STA <$02

    TXA
    ADC #$62
    STA <$03

    RTS

;GET THE ADDRESS INTO THE SCREEN MAP TO COPY A ROW OR COLUMN TO

GETSCREENADDRESS:
    STX <ROW
    STA <COLUMN

    JSR GETMAPADDRESS

    LDA <COLUMN
    ASL A
    ASL A
    ASL A
    ASL A
    STA <$04

    LDY <ROW

    TYA
    AND #$0F
    ORA <$04
    TAX

    RTS

;DRAW A ROW FROM THE SCREEN MAP IN RAM TO THE SCREEN IN VRAM

DRAWROW:
    JSR SETVRAMADDR

    LDA #$20                   ;LENGTH OF ROW
    SEC
    SBC <$12
    CMP <$07                   ;LENGTH OF A HORZ. OR VERT. SCREEN ROW

    PHP
    BCC SETVRAMCOUNT1

    LDA <$07
SETVRAMCOUNT1:
    STA $6700, X

    INX
    STX <TILEINDEX

    LSR A                      ;DIVIDE BY 2 FOR TILE DRAWING COUNT
    JSR DRAWMETATILE1          ;DRAW METATILES

    PLP
    BCS EXITDRAWROW            ;WE DONT NEED TO START ANOTHER ROW

    JSR NEXTROW

    LSR A                      ;DIVIDE BY 2 FOR TILE DRAWING COUNT
    JSR DRAWMETATILE1          ;DRAW METATILES

EXITDRAWROW:
    JMP ENDVRAMWRITE

;IF THE ROW GOES PAST THE RIGHT EDGE OF THE SCREEN, DRAW INTO NEXT SCREEN

NEXTROW:
    LDX <TILEINDEX

    LDA <SCREENHB
    EOR #$04                   ;SWITCH TO NEXT NAMETABLE
    STA $6700, X               ;SAVE VRAM ADDRESS HB

    INX

    LDA <SCREENLB
    AND #$E0                   ;MAKE SURE WE START FROM LEFT EDGE OF SCREEN
    STA $6700, X               ;SAVE VRAM ADDRESS LB

    INX

    LDA <$12
    ADC <$07
    SEC
    SBC #$20                   ;SET TILE DRAWING COUNT (LENGTH OF ROW)
    STA $6700, X               ;SAVE IT

    INX
    STX <TILEINDEX

    RTS

;DRAW HALF OF A METATILE ONTO THE SCREEN

DRAWMETATILE1:
    STA <$01                   ;TILE DRAWING COUNT
DRAWMETATILELOOP1:
    JSR DRAWATTRIBS            ;FIRST DO THE ATTRIBUTES FOR THE METATILE

    LDX <TILEINDEX

    LDA [$59], Y               ;LEFT TILE
    STA $6700, X               ;SAVE IT

    INX
    INY

    LDA [$59], Y               ;RIGHT TILE
    STA $6700, X               ;SAVE IT

    INX
    STX <TILEINDEX

    INC <$02
    JSR LE44E

    DEC <$01                   ;DECREMENT TILE DRAWING COUNT
    BNE DRAWMETATILELOOP1

    RTS

LE44E:
    LDA <ROW
    EOR #$01
    STA <ROW

    LSR A
    BCS LE468

    LDA <COLUMN
    TAY
    AND #$F8
    STA <COLUMN

    INY

    TYA
    AND #$07
    ORA <COLUMN
    STA <COLUMN

    INC <$5D
LE468:
    RTS

;DRAW A COLUMN FROM THE SCREEN MAP IN RAM TO THE SCREEN IN VRAM

DRAWCOLUMN:
    JSR SETVRAMADDR

    LDA #$1E                   ;LENGTH OF COLUMN
    SEC
    SBC <$13
    CMP <$07

    PHP
    BCC SETVRAMCOUNT2

    LDA <$07
SETVRAMCOUNT2:
    ORA #$80                   ;SET COLUMN TO BE DRAWN VERTICALLY
    STA $6700, X               ;SAVE VRAM COUNT

    INX
    STX <TILEINDEX

    AND #$7F                   ;MASK OUT VERTICAL FLIP SETTING
    LSR A                      ;DIVIDE BY 2 FOR TILE DRAWING COUNT
    JSR DRAWMETATILE2          ;DRAW METATILES

    PLP
    BCS EXITDRAWCOLUMN         ;WE DONT NEED TO START ANOTHER COLUMN

    LDX <TILEINDEX

    LDA <SCREENHB
    AND #$2C                   ;MAKE SURE WE START FROM TOP OF SCREEN
    STA $6700, X               ;SAVE VRAM ADDRESS HB

    INX

    LDA <SCREENLB
    AND #$1F                   ;MAKE SURE WE START DRAWING IT IN THE CORRECT ROW
    STA $6700, X               ;SAVE VRAM ADDRESS LB

    INX

    LDA <$13
    CLC
    ADC <$07
    SEC
    SBC #$1E                   ;LENGTH OF COLUMN
    ORA #$80                   ;SET COLUMN TO BE DRAWN VERTICALLY
    STA $6700, X               ;SAVE VRAM COUNT

    INX
    STX <TILEINDEX

    AND #$7F                   ;MASK OUT VERTICAL FLIP SETTING
    LSR A                      ;DIVIDE BY 2 FOR TILE DRAWING COUNT
    STA <$01                   ;SAVE IT

    INC <$01
    JSR DRAWMETATILE3
EXITDRAWCOLUMN:
    LDA <$5C
    ORA #$40
    STA <$5C

    JMP ENDVRAMWRITE

DRAWMETATILE2:
    STA <$01
DRAWMETATILELOOP2:
    JSR DRAWATTRIBS

    LDX <TILEINDEX

    LDA [$59], Y
    STA $6700, X

    INX
    INY
    INY

    LDA [$59], Y
    STA $6700, X

    INX
    STX <TILEINDEX

    LDA <$03
    CLC
    ADC #$10
    STA <$03

DRAWMETATILE3:
    LDA <ROW
    EOR #$02
    STA <ROW

    LSR A
    LSR A
    BCS LE4F0

    LDA <COLUMN
    ADC #$08
    AND #$3F
    STA <COLUMN

    INC <$5D
LE4F0:
    DEC <$01
    BNE DRAWMETATILELOOP2

    RTS

;GET THE ATTRIBUTE DATA FOR A METATILE

DRAWATTRIBS:
    LDA <$02
    AND #$0F
    ORA <$03
    TAY

    LDA $0500, Y
    TAX

    LDA $0600, X
    AND #$03

    LDX <ROW
    BEQ ALIGNED

    ASL A
    ASL A
    DEX
    BEQ ALIGNED

    ASL A
    ASL A
    DEX
    BEQ ALIGNED

    ASL A
    ASL A
ALIGNED:
    STA <$0A

    LDX <ROW
    LDA ATTRIBDATA, X

    LDX <COLUMN
    AND $0640, X
    ORA <$0A
    STA $0640, X

    LDA $0500, Y               ;GET METATILE NUMBER FROM SCREEN MAP
    ASL A                      ;MULTIPLY BY 2
    ASL A                      ;MULTIPLY BY 4 (METATILE TABLE INDEX)
    ORA <$04                   ;WHICH SIDE OF METATILE TO DRAW?
    TAY                        ;Y HOLDS METATILE INDEX

    RTS

ATTRIBDATA:
    .DB $FC, $F3, $CF, $3F

;SET THE CORRECT VRAM ADDRESS TO START DRAWING A ROW OR COLUMN TO

SETVRAMADDR:
    JSR LF32F
    JSR DOSTUFF

    LDX <TILEINDEX

    LDA <SCREENHB
    STA $6700, X               ;SAVE SCREEN ADDRESS HB

    INX

    LDA <SCREENLB
    STA $6700, X               ;SAVE SCREEN ADDRESS LB

    INX

    LDA <$14                   ;GET MAP Y COORDINATE (MULTIPLIED BY 2)
    AND #$1E
    ASL A
    ASL A
    ASL A
    STA <$03                   ;SAVE SCREEN Y OFFSET

    LDA #$00
    STA <$04
    STA <ROW                   ;CLEAR SOME VARIABLES

    LDA <$13                   ;VERTICAL SCREEN SCROLL
    LSR A
    ROL <$04                   ;TILEOFFSET
    LSR A
    ROL <ROW                   ;ATTRIBUTES OFFSET

    LDA <$12                   ;HORIZONTAL SCREEN SCROLL
    LSR A
    ROL <$04                   ;TILEOFFSET
    STA <$02                   ;SAVE SCREEN X OFFSET
    LSR A
    ROL <ROW                   ;ATTRIBUTES OFFSET

    RTS

DOSTUFF:
    LDA #$00
    STA <$5D

    LDA <$12
    LSR A
    LSR A
    STA <$5C

    LDA <$13
    AND #$FC
    ASL A
    ADC <$5C
    STA <$5C
    STA <COLUMN

    LDA #$04
    AND <SCREENHB
    BEQ DONTSET

    LDA <$5C
    ORA #$80
    STA <$5C

DONTSET:
    RTS

