
;READ THE DIRECTION PRESSED

READPAD2:
    CLC

    LDA <JOYDATA2
    AND #$0F
    BEQ EXITREADPAD2

    LDX #$7F
READPAD2LOOP:
    INX

    LSR A
    BCC READPAD2LOOP
EXITREADPAD2:
    RTS

;SCROLL THE SCREEN IN THE CORRECT DIRECTION

SCROLLSCREEN:
    LDA <CNTREG1
    LSR A
    TAX

    LDA <HSCROLL
    ASL A
    ASL A
    ASL A
    ORA <$31
    STA <SCROLLH

    TXA
    ROL A
    STA <CNTREG1

    LDA <VSCROLL
    ASL A
    ASL A
    ASL A
    ORA <$32
    STA <SCROLLV

    RTS

;THESE ROUTINES DO ALL THE WORK NECESSARY TO MOVE THE SCREEN

MOVELEFT1:
    DEC <MAPX
LD9EF:
    LDX <HSCROLL
    DEX
    TXA
    AND #$3F
    STA <HSCROLL

    LDA #$07
    STA <$31

    JMP MOVELEFT3

MOVELEFT2:
    LDX <$31
    DEX
    BNE LDA11

    LDX #$00

    LDA <HSCROLL
    LSR A
    BCS EXITMOVELEFT2

    STX <$61
    BCC EXITMOVELEFT2
LDA11:
    BMI LD9EF
EXITMOVELEFT2:
    STX <$31
    RTS

MOVERIGHT1:
    INC <MAPX

    INC <$31
LDA1A:
    JMP MOVERIGHT3

MOVERIGHT2:
    LDX <$31
    INX
    TXA
    AND #$07
    STA <$31

    BNE EXITMOVERIGHT2

    LDX <HSCROLL
    INX
    TXA
    AND #$3F
    STA <HSCROLL

    LSR A
    BCS LDA1A

    LDA #$00
    STA <$61
EXITMOVERIGHT2:
    RTS

MOVEUP1:
    DEC <MAPY
LDA3C:
    LDX <VSCROLL
    DEX
    BPL DONTRESETVSCROLL1

    LDX #$1D
DONTRESETVSCROLL1:
    STX <VSCROLL

    LDA #$07
    STA <$32

    JMP MOVEUP3

MOVEUP2:
    LDX <$32
    DEX
    BNE LDA5F

    LDX #$00

    LDA <VSCROLL
    LSR A
    BCS EXITMOVEUP2

    STX <$61
    BCC EXITMOVEUP2
LDA5F:
    BMI LDA3C
EXITMOVEUP2:
    STX <$32
    RTS

MOVEDOWN1:
    INC <MAPY

    INC <$32
LDA68:
    JMP MOVEDOWN3

MOVEDOWN2:
    LDX <$32
    INX
    TXA
    AND #$07
    STA <$32

    BNE EXITMOVEDOWN2

    LDX <VSCROLL
    INX
    CPX #$1E
    BCC DONTRESETVSCROLL2

    LDX #$00
DONTRESETVSCROLL2:
    STX <VSCROLL

    TXA
    LSR A
    BCS LDA68

    LDA #$00
    STA <$61
EXITMOVEDOWN2:
    RTS

;THESE ROUTINES CONTROL DRAWING DATA TO THE SCREEN

MOVEUP3:
    JSR SETUPSCREENWRITE

    LDA <VSCROLL
    LSR A
    PHP
    BCC LE196

    LDA <MAPY
    JSR GETROW
LE196:
    JSR DRAWROW

    PLP
    BCS LE1B6
LE19C:
    JMP SETVRAMWRITE

MOVEDOWN3:
    JSR SETUPSCREENWRITE

    LDA <VSCROLL
    LSR A
    PHP
    BCS LE1B0

    LDA <MAPY
    CLC
    ADC #$0E

    JSR GETROW
LE1B0:
    JSR DRAWROW

    PLP
    BCS LE19C
LE1B6:
    RTS

MOVERIGHT3:
    JSR SETUPSCREENWRITE

    LDA <HSCROLL
    LSR A
    BCS LE1CB

    LDA <MAPX
    CLC
    ADC #$0F

    JSR GETCOLUMN
LE1CB:
    JSR DRAWCOLUMN

    JMP SETVRAMWRITE

MOVELEFT3:
    JSR SETUPSCREENWRITE

    LDA <HSCROLL
    LSR A
    BCC LE1DE

    LDA <MAPX
    JSR GETCOLUMN
LE1DE:
    JSR DRAWCOLUMN

    JMP SETVRAMWRITE

;THIS ROUTINE CALCULATES THE SCREEN OFFSETS

LE243:
    .DB $20, $00, $00, $00,  $0E, $0E, $14, $0E, $0E
LE24F:
    .DB $00, $00, $00, $00,  $0C, $0C, $0C, $0C, $12

LE25B:
    .DB $00, $00, $0E, $00,  $06, $06, $06, $05, $09
LE267:
    .DB $1E, $1E, $20, $20,  $06, $06, $06, $06, $06

SETUPSCREENWRITE:
    LDA <$61                   ;THIS HOLDS THE DIRECTION NUMBER(+$80)
    AND #$03                   ;JUST GET THE DIRECTION
LE27B:
    TAY

    LDA <HSCROLL
    CLC
    ADC LE243, Y
    AND #$3F
    STA <$12                   ;HORIZONTAL SCROLL OFFSET

    LDA <VSCROLL
    CLC
    ADC LE24F, Y
    CMP #$1E
    BCC LE292

    SBC #$1E
LE292:
    STA <$13                   ;VERTICAL SCROLL OFFSET

    LDA <MAPY
    CLC
    ADC LE25B, Y
    ASL A                      ;MULTIPLY BY 2 (EACH SCREEN COORDINATE IS A 16x16 METATILE)
    STA <$14                   ;MAP Y POSITION OFFSET

    LDA LE267, Y
    STA <$07
LE2A2:
    LDA <$13                   ;GET VERTICAL SCROLL OFFSET
    LSR A                      ;$06 = $03
    ROR A                      ;$03 = $01
    ROR A                      ;$01 = $80
    TAX                        ;SAVE TEMPORARILY
    ROR A                      ;$80 = $C0
    AND #$E0                   ;MAKE SURE IT STARTS AT THE BEGINNING OF A SCREEN ROW
    STA <SCREENLB              ;SAVE SCREEN ADDRESS LB

    TXA                        ;SCREEN ADDRESS LB MULTIPLIED BY 8
    AND #$03                   ;MAKE SURE ITS A VALID SCREEN ADDRESS (2/0 - 2/3)
    ORA #$20                   ;ADD SCREEN STARTING ADDRESS HB
    STA <SCREENHB              ;SAVE SCREEN ADDRESS HB

    LDA <$12                   ;GET HORIZONTAL SCROLL OFFSET
    TAX                        ;SAVE TEMPORARILY
    AND #$1F                   ;MAKE SURE IT DOESNT GO PAST THE RIGHT EDGE OF THE SCREEN
    STA <$12                   ;SAVE HORIZONTAL SCROLL OFFSET

    ORA <SCREENLB              ;ADD IT TO SCREEN ADDRESS LB
    STA <SCREENLB              ;SAVE SCREEN ADDRESS LB

    TXA                        ;HORIZONTAL SCROLL OFFSET
    AND #$20
    LSR A                      ;DIVIDE BY 2
    LSR A                      ;DIVIDE BY 4
    LSR A                      ;DIVIDE BY 8

    ORA <SCREENHB              ;ADD IT TO SCREEN HB (SET SCREEN ADDRESS FOR NAME TABLE 0 OR 1
    STA <SCREENHB              ;SAVE SCREEN ADDRESS HB

    RTS

