;        .OPT NO LIST
;        .OPT OBJ
;-----------------------------
;Labyrinths: Revision 09/15/87
;Programmed By Steven Lashower
;(C) 1987 Argosoft Productions
;-----------------------------
        *= $80
;-------------------
;Page Zero Variables
;-------------------
LO            2         ;Srce Copy adrs
DESTLO            2         ;Dest Copy adrs
MTEMP            2         ;Maze location
YTEMP            1         ;Y Coord Temp
COLTMP            1         ;X Coord Temp
XTMP            1         ;X Coord Temp
YTMP            1         ;Y Coord Temp
FLAG            1         ;Variable Flag
LEN            1         ;Maze Draw Lngth
H            1         ;Player X Coord
V            1         ;Player Y Coord
W            1         ;Maze width
TEMP            1         ;Temporary Data
DIRECTION            1         ;Player Dirction
DUMMY            1         ;Temporary Data
BACK            1         ;Behnd plyr data
COUNTR            1         ;Main DLI pointr
SEC1            5         ;Time "h:mm:ss"
J            1         ;Maze gen varble
VOLUM1            1         ;Sound volume
TIME            1         ;Day/Night Flag
COLOR            1         ;Draw/Plot Color
OFF            1         ;Patroler Bottom
TONE            1         ;Tone for sound
HOLD            1         ;Temp storage
PLOTX            1         ;X Coord Value
PLOTY            1         ;Y Coord Value
COPCNT            1         ;Byte copy count
FRONT2            1         ;Center cpy byte
BACK2            1         ;Copy of BACK
H2            7         ;Patrol X Coords
V2            7         ;Patrol Y Coords
DIR2            7         ;Patrol Drection
DIRTMP            1         ;Temp. DIRECTION
CDTMV4            1         ;Patrol Move Chk
OLDSTK            1         ;Stick 0 Copy
MNUM            1         ;Patroller #
PAT            1         ;Patrol Plot Var
DIFLEV            1         ;Diffculty level
POINTER            1         ;Title DLI pntr
CENTER            $0A         ;Center data
LEFT            $0A         ;Left side data
RIGHT            $0A         ;Right side data
CENTER2            $0A         ;Copy of CENTER
RTCLOK        = $14
ROWCRS        = $54
COLCRS        = $55
VDSLST        = $0200
CDTMV3        = $021C
SDMCTL        = $022F
SDLSTL        = $0230
GPRIOR        = $026F
STICK0        = $0278
STRIG0        = $0284
PCOLR0        = $02C0
COLOR0        = $02C4
COLOR2        = $02C6
COLOR3        = $02C7
CH        = $02FC
HPOSP0        = $D000
HPOSP1        = $D001
SIZEP0        = $D008
SIZEP1        = $D009
SIZEP2        = $D00A
SIZEP3        = $D00B
COLPM0        = $D012
COLPM1        = $D013
COLPM2        = $D014
COLPM3        = $D015
COLPF0        = $D016
COLPF1        = $D017
COLPF2        = $D018
GRACTL        = $D01D
CONSOL        = $D01F
AUDF1        = $D200
AUDC1        = $D201
RANDOM        = $D20A
DMACTL        = $D400
PMBASE        = $D407
WSYNC        = $D40A
NMIEN        = $D40E
SETVBV        = $E45C
XITVBV        = $E462
DISP        = $9000
SCREEN        = $5000
TIMSC        = BOTTOM+$52
PRINT1        = TEXT+$0172
PRINT2        = TEXT+$0127
PRINT3        = TEXT+$0142
PMG        = $7000
PL1        = $7500
        *= $7800
;-------------------
;Get things ready...
;-------------------
LABYRINTHS        LDA #$00         ;Turn screen
        STA SDMCTL         ;off.
        STA FLAG
        LDA #$FF
        STA VOLUM1
        JSR CLSCN         ;Clear scrren.
        LDA # <MAZE
        STA MTEMP         ;Copy maze
        LDA # >MAZE         ;Addresss.
        STA MTEMP+1
        JSR GENMZE         ;Generate Maze!
        LDA #$C5         ;Exit in lower
        STA MAZE+$06D3         ;right corner
        LDA # <BOTTOM
        STA TEXTB         ;Print timer &
        LDA # >BOTTOM         ;compass at
        STA TEXTB+1         ;screen bottom.
        LDA #$00
        LDX #$00
CLTIME        STA SEC1,X         ;Set elapsed
        INX          ;time to 0:00:00
        CPX #$05
        BNE CLTIME
        STA COUNTR
        LDA #$3C         ;Set timer for 1
        STA CDTMV3         ;Second.
        LDY # <VBI
        LDX # >VBI
        LDA #$07         ;Initialize VBI.
        JSR SETVBV
        LDA #$01         ;Player starts
        STA H         ;game at (1,2).
        LDA #$02
        STA V
        LDA #$03         ;Player's facing
        STA DIRECTION         ;south,
        LDA #$32         ;Maze Width = 50
        STA W
        JSR SETUP         ;Set up screen.
        JMP MAINPROG         ;Main Program.
;----------------------
;Display List Interrupt
;----------------------
DLI        PHA          ;Save Accum and
        TXA          ;X Register.
        PHA
        LDX COUNTR         ;Which DLI?
        CPX #$00
        BNE DLI1
        INX          ;Point to next
        STX COUNTR         ;DLI.
        LDX #$90
DLI0        STX COLPF1         ;Shade game
        INX          ;title in 8
        INX          ;shades of blue.
        STA WSYNC         ;Wait for SYNC.
        CPX #$A0         ;Shaded yet?
        BNE DLI0         ;Nope...
        LDA #$0A         ;Set Text Luma.
        STA COLPF1
        JMP ENDDLI         ;Return from DLI
DLI1        LDA #$0A         ;Set maze wall
        STA COLPF2         ;colors to
        LDA #$04         ;shades of grey.
        STA COLPF1
        LDX COUNTR
        LDA TIME         ;ITS
        CMP #$00         ;Daytime?
        BNE DLI2         ;Nope...
        LDA COLORS,X         ;Yep!  Dayglow
        JMP DLI3         ;colors.
DLI2        LDA COLORS2,X         ;Night colors
DLI3        STA COLPM2         ;Store colors
        STA COLPM3         ;in players 2&3.
DLI3B        INX          ;Point to next
        STX COUNTR         ;DLI...
        CPX #$11         ;All colors yet?
        BNE ENDDLI         ;Nope! Exit DLI.
        LDA #$00         ;Reset pointer
        STA COUNTR         ;to screen top.
        LDA #$F8
        STA COLPF0         ;Set all colors
        LDA #$0A         ;for bottom
        STA COLPF1         ;of screen.
        LDA #$00
        STA COLPF2
ENDDLI        PLA          ;Restore X reg.
        TAX
        PLA          ;Restore Accum.
        RTI
;------------------------
;Vertical Blank Interrupt
;------------------------
VBI        INC PCOLR0         ;Increase
        INC PCOLR0+1         ;Patroller and
        LDA PCOLR0+1         ;player in maze
        CMP #$9F
        BNE XX1         ;Make sure
        LDA #$90         ;player flashes
        STA PCOLR0+1         ;blue.
XX1        LDA CDTMV4         ;Decrease timer
        CMP #$00         ;if and only if
        BEQ XX2         ;not zero.
        DEC CDTMV4
XX2        LDA FLAG         ;Flag set?
        CMP #$FF
        BNE XX3         ;Yep. Exit VBI!
        JMP XITVBV
XX3        LDA CDTMV3         ;Second elapsed?
        CMP #$00
        BNE X1         ;Nope...
        LDA #$3C         ;Ya! Reset
        STA CDTMV3         ;timer!
        INC SEC1         ;Increase second
        LDX #$00         ;digit.
X01        LDA SEC1,X         ;Check digits
        CMP COMP,X         ;for carry.
        BNE X0         ;No carry.
        LDA #$00         ;Carry! Zero
        STA SEC1,X         ;digit. Inc next
        INC SEC1+1,X         ;digit.
X0        INX
        CPX #$05         ;Done checking?
        BNE X01         ;Nope...
X1        LDX #$00         ;Ya! print time.
PRTIME        LDA SEC1,X         ;Load digit to
        CLC          ;print and add
        ADC #$10         ;ATASCII offset.
        LDY YVAL,X         ;Add offset and
        STA TIMSC,Y         ;print it!
        INX
        CPX #$05         ;All printed?
        BNE PRTIME         ;Nope...
        LDA VOLUM1         ;Play a sound?
        CMP #$FF
        BEQ X2         ;Nope...
        DEC VOLUM1         ;Yes! Decrease
        CLC          ;volume of sound
        ADC TONE         ;and add
        STA AUDC1         ;distortion.
X2        LDX #$00
DI1        LDA CENTER2,X         ;Can player
        CMP #$45         ;view patroller?
        BEQ DI2         ;Yes...
        CMP #$A0         ;Is a wall in
        BNE DL1A         ;the way?
        LDA #$00         ;If one is, then
        STX HPOSP0         ;don't display
        JMP XITVBV         ;it so exit VBI.
DL1A        INX
        CPX #$05         ;All view check?
        BNE DI1         ;Nope...
DI2        LDA HARGO,X         ;Set horizontal
        STA HPOSP0         ;position & size
        LDA SARGO,X         ;depending its
        STA SIZEP0         ;distance "X".
        LDA OFARG,X         ;Where's its
        STA OFF         ;bottom?
        LDY #$00
        LDA #$00         ;Erase player's
VB1        STA PMG+$0400,Y         ;bytes.
        INY
        BNE VB1
        LDA ONARG,X         ;Find patrollers
        TAY          ;top and put
VB2        LDA BARGO,X         ;bytes into
        STA PMG+$0400,Y         ;PMAREA.
        INY
        CPY OFF         ;Bottom reached?
        BNE VB2         ;No, next byte.
        JMP XITVBV         ;Ya, exit VBI
;--------------------------
;Read Surrounding Maze Data
;--------------------------
START        LDA # <MAZE         ;Get maze
        STA MTEMP         ;address and
        LDA # >MAZE         ;copy it.
        STA MTEMP+1
S0        DEY          ;Decrease "Y"
        CPY #$00         ;Zero yet?
        BEQ S1         ;Yep.
        LDA W         ;Add maze width.
        JSR ADD
        JMP S0         ;Do it again.
S1        TXA          ;Add horizontal.
        JSR ADD
        LDX #$00
        LDA DIRECTION         ;Facing north?
        CMP #$01
        BNE T1         ;Nope...
        LDA W         ;By adding maze
        JSR ADD         ;width, we can
        LDY #$00         ;get the space
        LDA (MTEMP),Y         ;in back of
        STA BACK         ;player.
        LDA W
        CLC          ;Subtract width.
        ADC #$01
        JSR SUBTRACT
S45        LDY #$00         ;Get 8 bytes
        LDA (MTEMP),Y         ;for
        STA LEFT,X         ;left
        INY
        LDA (MTEMP),Y
        STA CENTER,X         ;center
        INY
        LDA (MTEMP),Y
        STA RIGHT,X         ;& right walls.
        INX
        LDA W         ;Get ready
        JSR SUBTRACT         ;for next.
        CPX #$08         ;Add 8 bytes?
        BNE S45         ;Nope...
        RTS          ;
T1        LDA DIRECTION         ;Facing south
        CMP #$03
        BNE T2
        LDY #$00
        LDA W
        JSR SUBTRACT
        LDA (MTEMP),Y
        STA BACK
        LDA W
        SEC
        SBC #$01
        JSR ADD
T45        LDY #$00
        LDA (MTEMP),Y
        STA RIGHT,X
        INY
        LDA (MTEMP),Y
        STA CENTER,X
        INY
        LDA (MTEMP),Y
        STA LEFT,X
        INX
        LDA W
        JSR ADD
        CPX #$08
        BNE T45
        RTS
T2        LDA DIRECTION         ;Facing east
        CMP #$04
        BNE T3
        LDY #$00
U1        LDA (MTEMP),Y
        STA CENTER,Y
        INY
        CPY #$08
        BNE U1
        LDY #$00
        LDA #$01
        JSR SUBTRACT
        LDA (MTEMP),Y
        STA BACK
        LDA #$01
        JSR ADD
        LDA W
        JSR SUBTRACT
U4        LDA (MTEMP),Y
        STA LEFT,Y
        INY
        CPY #$08
        BNE U4
        LDA W
        CLC
        ADC W
        JSR ADD
        LDY #$00
U6        LDA (MTEMP),Y
        STA RIGHT,Y
        INY
        CPY #$08
        BNE U6
        RTS
T3        LDY #$00
        LDX #$00
V1        LDA (MTEMP),Y         ;Facing West
        STA CENTER,X
        LDA #$01
        JSR SUBTRACT
        INX
        CPX #$08
        BNE V1
        LDA #$09
        JSR ADD
        LDA (MTEMP),Y
        STA BACK
        LDA #$01
        CLC
        ADC W
        JSR SUBTRACT
        LDX #$00
V4        LDA (MTEMP),Y
        STA RIGHT,X
        LDA #$01
        JSR SUBTRACT
        INX
        CPX #$08
        BNE V4
        LDA #$08
        CLC
        ADC W
        ADC W
        JSR ADD
        LDX #$00
V6        LDA (MTEMP),Y
        STA LEFT,X
        LDA #$01
        JSR SUBTRACT
        INX
        CPX #$08
        BNE V6
        RTS
ADD        CLC          ;Add Accumulator
        ADC MTEMP         ;to MTEMP with
        STA MTEMP         ;carry.
        BCC SUB2
        INC MTEMP+1
        RTS
SUBTRACT        STA TEMP         ;Subtracts
        SEC          ;TEMP from
        LDA MTEMP         ;MTEMP with
        SBC TEMP         ;carry.
        STA MTEMP
        BCS SUB2
        DEC MTEMP+1
SUB2        RTS
WCOMP        .BYTE $A0,$20,$A0,$20
        .BYTE $C5,$C5
WALO        .BYTE $00,$00,$0A,$0A
        .BYTE $00,$0A
;---------------------------
;WALL DATA/VIEWING PROCESSOR
;---------------------------
MAINPROG        LDY V         ;Get player's
        LDX H         ;coords and pass
        JSR START         ;to routine.
        JSR COPCEN         ;Copy CENTER.
        LDY #$00
        STY FLAG
LOOP        LDA CENTER,Y         ;Get byte in
        LDX #$00         ;front of player
        CMP #$C5         ;Is it an exit?
        BNE LO0         ;No...
        STA FLAG         ;Yes, set flag
        JMP FRONTWALL         ;and draw it!
LO0        CMP #$A0         ;Is it a wall?
        BNE N1A2         ;No.
        JMP FRONTWALL         ;Yes! Draw it!
N1A2        TYA
        CLC
        STA HOLD
        ADC WALO,X         ;Offset for LEFT
        TAY          ;and RIGHT side.
        LDA LEFT,Y         ;Get side wall.
        CMP #$45         ;Patrollr there?
        BNE N1A25         ;No.
        LDA #$20         ;Yes...Print
N1A25        STX J         ;passage there.
        CMP WCOMP,X
        BNE N1A3
        LDY HOLD
        STX FLAG
        JSR LEFTWALL
N1A3        LDX J
        INX
        LDY HOLD
        CPX #$06
        BNE N1A2
        INY
        CPY #$05
        BNE LOOP
        LDA #$07
        STA COLCRS
        LDA #$02
        STA DUMMY
N22        LDY DUMMY
        LDA #$00
        STA TEMP
        JSR PRINT
        INC DUMMY
        LDA DUMMY
        CMP #$0C
        BNE N22
        LDY #$05
        LDA CENTER,Y
        INY
        CMP #$A0
        BNE N3
        LDA #$05
        JMP N4
N3        CMP #$C5
        BNE N3A
        LDA #$00
        JMP N4
N3A        LDA #$07
N4        STA TEMP
        JSR PRINT
        JMP LINE139
LEFTWALL        STY YTEMP
        LDA MULTI,Y
        TAX
        DEX
        LDA FLAG
        CMP #$03
        BEQ L3
        CMP #$05
        BEQ L3
        CMP #$02
        BNE L1
L3        LDA #$0C
        SEC
        SBC YTEMP
        STA COLTMP
        LDY #$00
        JMP DOWALL
L1        LDA #$02
        CLC
        ADC YTEMP
        STA COLTMP
        LDY #$00
DOWALL        INX
        INY
        TYA
        CLC
        ADC #$04
        STA ROWCRS
        LDA COLTMP
        STA COLCRS
        LDA FLAG
        CMP #$00
        BEQ D3
        CMP #$02
        BEQ D1
        CMP #$03
        BEQ D4
        CMP #$01
        BEQ D4
        LDA #$00
        JMP D2
D4        LDA PASS,X
        JMP D2
D1        LDA RWAL,X
        JMP D2
D3        LDA LWAL,X
D2        STX XTMP
        STY YTMP
        STA TEMP
        JSR PRINT
        LDX XTMP
        LDY YTMP
        CPY #$0B
        BNE DOWALL
        LDY YTEMP
        LDA #$00
        STA FLAG
        RTS
;-----------------------------
;Character bytes for left wall
;-----------------------------
LWAL        .BYTE $06,$01,$01,$01,$01
        .BYTE $01,$01,$01,$01,$01,$03
        .BYTE $00,$06,$01,$01,$01,$01
        .BYTE $01,$01,$01,$03,$00
        .BYTE $00,$00,$06,$01,$01,$01
        .BYTE $01,$01,$03,$00,$00
        .BYTE $00,$00,$00,$06,$01,$01
        .BYTE $01,$03,$00,$00,$00
        .BYTE $00,$00,$00,$00,$06,$01
        .BYTE $03,$00,$00,$00,$00
;------------------------------
;Character bytes for right wall
;------------------------------
RWAL        .BYTE $04,$01,$01,$01,$01
        .BYTE $01,$01,$01,$01,$01,$02
        .BYTE $00,$04,$01,$01,$01,$01
        .BYTE $01,$01,$01,$02,$00
        .BYTE $00,$00,$04,$01,$01,$01
        .BYTE $01,$01,$02,$00,$00
        .BYTE $00,$00,$00,$04,$01,$01
        .BYTE $01,$02,$00,$00,$00
        .BYTE $00,$00,$00,$00,$04,$01
        .BYTE $02,$00,$00,$00,$00
;-------------------------------
;Character bytes for passageways
;-------------------------------
PASS        .BYTE $00,$05,$05,$05,$05
        .BYTE $05,$05,$05,$05,$05,$00
        .BYTE $00,$00,$05,$05,$05,$05
        .BYTE $05,$05,$05,$00,$00
        .BYTE $00,$00,$00,$05,$05,$05
        .BYTE $05,$05,$00,$00,$00
        .BYTE $00,$00,$00,$00,$05,$05
        .BYTE $05,$00,$00,$00,$00
        .BYTE $00,$00,$00,$00,$00,$05
        .BYTE $00,$00,$00,$00,$00
LENGTH        .BYTE $09,$07,$05,$03,$01
HORIZ        .BYTE $03,$04,$05,$06,$07
;----------------
;Day/Night Colors
;----------------
COLORS        .BYTE $00,$9F,$9D,$9B,$99
        .BYTE $97,$95,$93,$91,$F0,$F2
        .BYTE $F4,$F6,$F8,$FA,$FC
        .BYTE $00,$00
COLORS2        .BYTE $00,$00,$00,$00,$00
        .BYTE $00,$00,$00,$00,$00
        .BYTE $00,$02,$04,$06,$08
        .BYTE $0A,$00,$00
;------------------------
;Print Front Wall Routine
;------------------------
FRONTWALL        DEY
        STY YTEMP
        LDA LENGTH,Y
        STA LEN
        LDA HORIZ,Y
        STA COLCRS
        LDA MULTI,Y
        TAX
        DEX
        STA YTEMP
        LDX YTEMP
        LDY #$00
F1        TYA
        STA ROWCRS
        INC ROWCRS
        INC ROWCRS
        INY
        INX
        STY YTMP
        STX XTMP
        LDA FLAG
        CMP #$C5
        BNE F1A
        LDA #$00
        JMP F1B
F1A        LDA PASS,X
F1B        STA TEMP
        LDY ROWCRS
        JSR PRINT
        LDY YTMP
        LDX XTMP
        CPY #$0A
        BNE F1
        DEC LEN
        LDA LEN
        BEQ LINE139
        INC COLCRS
        LDX YTEMP
        LDY #$00
        JMP F1
;--------------------
;Main Display Routine
;--------------------
LINE139        JSR MOVE         ;Print Screen!
        LDA CENTER+1         ;Copy center.
        STA FRONT2
        LDA BACK         ;Copy back.
        STA BACK2
        LDA TIME
        CMP #$01         ;Is it night?
        BEQ CE         ;Yes...
        JSR POSITION         ;No..Draw maze.
        LDX #$00
PL1CL1        LDA #0         ;Clear PMAREA
        STA PL1,X         ;[Player Maze
        INX          ;Position]
        BNE PL1CL1
        LDA H         ;Add offset for
        CLC          ;Gr. $E to
        ADC #$91         ;player horiz
        STA HPOSP1         ;position!
        CLC
        LDA V         ;Add offset to
        CLC          ;vert position
        ADC #$4A         ;to plot on a
        TAY          ;Gr. $E screen.
        LDA #$01
        STA PL1,Y         ;And store!
CE        LDX #$01
CE1        LDA DIRCHAR,X         ;Let's clear
        SEC          ;the compass
        SBC #$80         ;arrows.
        LDY OFFSETT,X
        STA TIMSC,Y
        INX
        CPX #$05
        BNE CE1
CE2        LDY DIRECTION         ;Inverse the
        LDA DIRCHAR,Y         ;compass arrow
        LDX OFFSETT,Y         ;in the dirctn
        STA TIMSC,X         ;player's facing
        LDA #$3E
        STA SDMCTL         ;Turn on screen.
;-------------------------
;Joystick/Movement Routine
;-------------------------
LINE140        JSR MVCHK         ;Patrol Move.
        LDX H         ;Get Player's
        LDY V         ;coordinates.
        JSR START
        JSR COPCEN
        LDA STICK0
        CMP #$0F
        BEQ LINE140
        LDA STICK0
        CMP #$0E
        BNE LINE190
        LDA FRONT2
        CMP #$20
        BEQ LINE1401
        CMP #$45
        BEQ LINE1401
        CMP #$C5
        BNE LINE140A
        JMP ESCAPE
LINE140A        JMP LINE1901
LINE1401        LDX DIRECTION
        DEX
        LDA WHICH,X
        TAY
        CLC
        LDA H,Y
        ADC TABLE,X
        STA H,Y
        JMP LINE275
LINE190        CMP #$0D
        BNE LINE230
        LDA BACK2
        CMP #$20
        BEQ LINE190A
        CMP #$45
        BEQ LINE190A
        CMP #$C5
        BNE LINE1901
        JMP ESCAPE
LINE1901        JSR THUMP
        JMP LINE140
LINE190A        LDX DIRECTION
        DEX
        LDA WHICH,X
        TAY
        CLC
        LDA H,Y
        ADC TABLE2,X
        STA H,Y
        JMP LINE275
LINE230        CMP #$0B
        BNE LINE250
        JSR RAZZ
        INC DIRECTION
        LDA DIRECTION
        CMP #$05
        BNE LINE275
        LDA #$01
        STA DIRECTION
        JMP LINE275
LINE250        CMP #$07
        BEQ LINE260
        JMP LINE140
LINE260        JSR RAZZ
LINE265A        DEC DIRECTION
        LDA DIRECTION
        CMP #$00
        BNE LINE275
        LDA #$04
        STA DIRECTION
        JMP LINE275
LINE275        JSR PAUSE
        JMP MAINPROG
;-------------
;Delay Routine
;-------------
PAUSE        LDA #$00         ;Zero System
        STA RTCLOK         ;Timer.
P1        JSR MVCHK         ;Check for
        LDA RTCLOK         ;Patrol move and
        SEC          ;wait for timer
        SBC #$06         ;goes past 6.
        BCC P1
        RTS          ;Pause finished!
;--------------
;Set up display
;--------------
SETUP        LDA #$0D
        STA COLOR3
        LDA #$00         ;Background's
        STA COLOR2         ;black.
        STA MNUM
        LDA #$04
        STA COLOR0
        LDA #$90
        STA PCOLR0+1
        LDA #$02         ;Set P/M Prior.
        STA GPRIOR
        LDA # <DLIST         ;Tell ANTIC
        STA SDLSTL         ;where the D/L
        LDA # >DLIST         ;is.
        STA SDLSTL+1
        LDA # >DLI         ;Point system
        STA VDSLST+1         ;to my DLI.
        LDA # <DLI
        STA VDSLST
        LDA #$C0         ;Allow for DLIs.
        STA NMIEN
        LDA #$03         ;Set players
        STA SIZEP2         ;2 & 3 to quad
        STA SIZEP3         ;size.
        LDA #$68         ;Set Player's
        STA HPOSP0+2         ;2&3 horiz
        LDA #$74         ;position.
        STA HPOSP0+3
        LDX #0
PL1CL        LDA #$00         ;Clear and init
        STA PMG+$0400,X         ;PMAREA.
        STA PMG+$0500,X
        LDA #$FF
        STA PMG+$0600,X
        STA PMG+$0700,X
        INX          ;Copy 255 Bytes.
        BNE PL1CL
        LDA #PMG/256         ;Store P/M
        STA PMBASE         ;Address.
        LDA #$02         ;Enable P/M
        STA GRACTL         ;Graphics
        RTS
;----------------------
;Main Game Display List
;----------------------
DLIST        .BYTE $70,$70,$F0,$46
        .WORD TOP
        .BYTE $0C,$20,$02,$00,$02
        .BYTE $02,$30
        .BYTE $80,$4E
        .WORD DISP
        .BYTE $0E
        .BYTE $0E,$0E,$0E,$0E,$0E,$0E
        .BYTE $0E,$0E,$8E
        .BYTE $0E,$0E,$0E,$0E,$0E,$0E
        .BYTE $0E,$0E,$8E
        .BYTE $0E,$0E,$0E,$0E,$0E,$0E
        .BYTE $0E,$8E,$0E
        .BYTE $0E,$0E,$0E,$0E,$8E,$0E
        .BYTE $0E,$0E,$8E
        .BYTE $0E,$0E,$8E,$0E,$8E,$0E
        .BYTE $8E,$8E,$0E
        .BYTE $0E,$8E,$0E,$8E,$0E,$0E
        .BYTE $0E,$8E,$0E
        .BYTE $0E,$0E,$0E,$0E,$8E,$0E
        .BYTE $0E,$0E,$0E
        .BYTE $0E,$0E,$0E,$8E,$0E,$0E
        .BYTE $0E,$0E,$0E
        .BYTE $0E,$0E,$0E,$8E,$0E,$0E
        .BYTE $0E,$0E,$0E
        .BYTE $0E,$0E,$0E,$0E,$0E,$8E
        .BYTE $70,$42
TEXTB        .WORD $00
        .BYTE $02,$02,$02,$02,$02
        .BYTE $02,$41
        .WORD DLIST
;------------------------
;Check for patroller move
;------------------------
MVCHK        JSR $6700         ;Check for move.
        LDX #$FF
        LDA DIFLEV         ;Difficulty=0?
        BEQ MV25         ;Yes...
MV1        INX
        LDA H2,X         ;Check if there
        CMP H         ;are any patrols
        BNE MV2         ;occuping the
        LDA V2,X         ;same place
        CMP V         ;where the
        BEQ MV3         ;player is.
MV2        CPX DIFLEV         ;More patrols?
        BNE MV1         ;YA...
MV25        RTS
MV3        LDA # <CAPTXT         ;Print Player
        STA TEXTB         ;capture text on
        LDA # >CAPTXT         ;screen bottom
        STA TEXTB+1
        LDA #$45         ;Put patroler in
        STA CENTER2         ;front of player
        LDA #$00         ;Zero all audio.
        STA AUDF1
        JMP EX1         ;End routine
;-------------------------------
;Routine to Print to Graphics $E
;Adapted from Retrofire!
;-------------------------------
PRINT        LDA YPOS,Y
        STA LO         ;Save Y Position
        LDA #$00
        STA LO+1
        ASL LO         ;*16
        ROL LO+1
        ASL LO         ;*32
        ROL LO+1
        LDA LO
        CLC
        ADC # <SCREEN         ;Add Display
        STA DESTLO         ;Start
        LDA LO+1
        ADC # >SCREEN
        STA DESTLO+1
        ASL LO         ;*16
        ROL LO+1
        ASL LO         ;*32
        ROL LO+1
        LDA LO
        CLC
        ADC DESTLO         ;Get character's
        STA DESTLO         ;screen address
        LDA LO+1
        ADC DESTLO+1
        STA DESTLO+1
        LDA DESTLO         ;Add X offset
        CLC          ;for final
        ADC COLCRS         ;address.
        ADC #$0C
        STA DESTLO
        BCC NODHIN
        INC DESTLO+1
NODHIN        LDY TEMP         ;Get offset into
        LDA MULT8,Y         ;character set.
        STA LO
        LDA #$00
        STA LO+1
        STA COPCNT         ;Zero copy count
        CLC
        ADC # >CHARSET         ;get info
        STA LO+1         ;from char set.
        LDA LO
        CLC
        ADC # <CHARSET
        STA LO
        BCC COPNUM
        INC LO+1
COPNUM        LDY COPCNT
        LDA (LO),Y         ;Get character
        LDY #$00         ;image byte.
        STA (DESTLO),Y         ;To screen...
        INC COPCNT         ;Next char byte.
        LDA COPCNT         ;Are all 8 bytes
        CMP #$08         ;in char moved?
        BEQ FINISH         ;Ya!
        LDA DESTLO         ;Add 20 bytes to
        CLC          ;point to next
        ADC #20         ;line on screen.
        STA DESTLO
        BCC COPNUM
        INC DESTLO+1
        BNE COPNUM
FINISH        RTS          ;All done!
YPOS        .BYTE $01,$05,$0D,$15,$1D
        .BYTE $25,$2D,$35,$3D,$45
        .BYTE $4D,$55
;----------------------
;Character Set for Maze
;----------------------
CHARSET
        .BYTE $00,$00,$00,$00,$00,$00
        .BYTE $00,$00
        .BYTE $FF,$BF,$FF,$F7,$FF,$FF
        .BYTE $DF,$FF
        .BYTE $FF,$7F,$3F,$1F,$0F,$07
        .BYTE $03,$01
        .BYTE $FF,$FE,$FE,$F8,$F0,$E0
        .BYTE $C0,$80
        .BYTE $01,$03,$07,$0F,$1F,$3F
        .BYTE $7F,$FF
        .BYTE $57,$FF,$D5,$D5,$D5,$FF
        .BYTE $57,$57
        .BYTE $80,$C0,$E0,$F0,$F8,$FC
        .BYTE $FE,$FF
        .BYTE $00,129,227,$FF,$FF,$C3
        .BYTE $81,$00
MULTI        .BYTE $00,$0B,$16,$21,$2C
        .BYTE $37,$42
MULT8        .BYTE $00,$08,$10,$18,$20
        .BYTE $28,$30,$38,$40
;--------------
;Sound Routines
;--------------
THUMP        LDA #$46         ;Pitch for THUMP
        STA AUDF1
        LDA #$0F         ;THUMP volume.
        STA VOLUM1
        LDA #$00         ;THMP distortion
        STA TONE
        LDA STICK0         ;Load joystick
        STA OLDSTK         ;and save.
TH1        JSR MVCHK         ;Patrol move...
        LDA OLDSTK         ;Stick changed
        CMP STICK0         ;direction yet?
        BEQ TH1         ;No, check again
        RTS
RAZZ        LDA #$00         ;Pitch for TURN
        STA AUDF1
        LDA #$08         ;Volume for TURN
        STA VOLUM1
        LDA #$20         ;TURN distortion
        STA TONE
        RTS
;-------------------------------
;Move newly drawn maze to screen
;-------------------------------
MOVE        LDA # <SCREEN         ;MOVE source
        STA LO
        LDA # >SCREEN
        STA LO+1
        LDA # <DISP         ;MOVE dstination
        STA DESTLO
        LDA # >DISP
        STA DESTLO+1
        LDA LO
        CLC
        ADC #$50
        STA LO
        BCC MB
        INC LO+1
MB        LDY #$0E
        LDA #$59
        STA TEMP
        LDX #$20
M0        LDA (LO),Y         ;Get FROM byte
        STA (DESTLO),Y         ;and MOVE it!
        INY
        CPY #$19         ;Line finished?
        BNE M0         ;No!
        LDY #$0E
        LDA LO         ;Point SOURCE to
        CLC          ;next line.
        ADC #$14
        STA LO
        BCC M1
        INC LO+1
M1        LDA DESTLO         ;Point DEST. to
        CLC          ;next line.
        ADC #$28
        STA DESTLO
        BCC M2
        INC DESTLO+1
M2        DEC TEMP
        LDA TEMP         ;Any lines left?
        CMP #$00         ;
        BNE M0         ;Yes,do it again
        RTS          ;Nope, done!
;---------------------------
;Clear Screen/Memory Routine
;---------------------------
CLSCN        LDA #$89         ;Start clearing
        STA LO+1         ;at $8900
        LDA #$00
        STA LO
LX2        LDY #$00
        LDA #$00         ;Erase BYTE
LX1        STA (LO),Y
        INY
        CPY #$00
        BNE LX1
        INC LO+1
        LDA LO+1
        CMP #$A0         ;At $A000 yet?
        BNE LX2         ;No,more to copy
        RTS          ;Done!
POSITION        LDA H         ;Get X & Y cords
        STA PLOTX         ;and store them.
        LDA V
        STA PLOTY
        LDA #$02         ;Dark Grey color
        STA COLOR
        LDX #$00
        LDA #$10         ;Store screen
        STA MTEMP         ;address of maze
        LDA #$90         ;in MTEMP.
        STA MTEMP+1
        LDY DIRECTION
PO1        STX XTMP
        LDA DIRECTION
        CMP #$01         ;The rest of
        BEQ PLEFT         ;this routine
        CMP #$04         ;draws the maze
        BEQ PLEFT         ;on the right
        TXA          ;of the screen.
        CLC
        ADC #$0A
        TAX
PLEFT        LDA LEFT,X
        CMP #$A0
        BNE PO1A
        LDA DRAW2X,Y
        TAX
        DEC PLOTX,X
        JSR PLOTCL
        INC PLOTX,X
PO1A        LDX XTMP
        LDA DIRECTION
        CMP #$02
        BEQ PRIGHT
        CMP #$03
        BEQ PRIGHT
        TXA
        CLC
        ADC #$0A
        TAX
PRIGHT        LDA LEFT,X
        CMP #$A0
        BNE PO1B
        LDA DRAW2X,Y
        TAX
        INC PLOTX,X
        JSR PLOTCL
        DEC PLOTX,X
PO1B        LDX XTMP
        LDA CENTER,X
        CMP #$A0
        BEQ PO2
        CLC
        LDA DRAWX,Y
        TAX
        LDA PLOTX,X
        ADC DRAWY,Y
        STA PLOTX,X
        LDX XTMP
        INX
        CPX #$06
        BNE PO1
        RTS
PO2        JSR PLOTCL
        RTS
;-----------------------
;Plot Calculator
;Adapted from Retrofire!
;-----------------------
PLOTCL        PHA          ;Save accum.
        TXA          ;Save X register
        PHA
        TYA          ;Save Y Register
        PHA
        LDA PLOTY
        ASL A
        STA LO
        LDA #$00
        ROL A
        STA LO+1         ;*2
        ASL LO
        ROL LO+1         ;*4
        ASL LO
        LDA LO
        STA DESTLO
        ROL LO+1
        LDA LO+1
        STA DESTLO+1         ;*8
        ASL LO
        ROL LO+1         ;*16
        ASL LO
        ROL LO+1         ;*32
        LDA LO
        CLC
        ADC DESTLO
        STA LO
        LDA LO+1
        ADC DESTLO+1
        STA LO+1
        LDA MTEMP         ;Add the display
        CLC          ;address to get
        ADC #$0A         ;the actual
        CLC          ;address of the
        ADC LO         ;byte that will
        STA LO         ;be altered for
        LDA MTEMP+1         ;the plot.
        ADC LO+1
        STA LO+1
        LDA PLOTX         ;Mask PLOTX for
        AND #$03         ;plot index.
        TAX
        LDA PLOTX         ;Get PLOTX and
        LSR A         ;divide
        LSR A         ;by 4.
        CLC          ;Add to plot
        ADC LO         ;address for
        STA LO         ;final plot
        LDA LO+1         ;address.
        ADC #$00
        STA LO+1
        LDY COLOR         ;Get color
        LDA BMASK2,X         ;and mask off
        AND COLRS,Y         ;pixel position.
        STA HOLD         ;Save it.
        LDA BMASK1,X         ;Mask off pixel
        LDY #$00         ;of the address
        AND (LO),Y         ;to be altered.
        ORA HOLD         ;Set the plot
        STA (LO),Y         ;bits and store!
        PLA
        TAY          ;Restore Y Reg
        PLA
        TAX          ;Restore X Reg
        PLA          ;Restore accum
        RTS          ;Finished!
COLRS        .BYTE $00,$55,$AA,$FF
BMASK1        .BYTE $3F,$CF,$F3,$FC
BMASK2        .BYTE $C0,$30,$0C,$03
;---------------
;Screen Displays
;---------------
BOTTOM
        .SBYTE "  !!!!!!!!!!!!!!    "        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "        Compass     "
        .SBYTE "  |Time Elapsed|    "
        .SBYTE "                    "
        .SBYTE "  | 0:00:00.00 |    "
        .SBYTE "         North      "
        .SBYTE "  !!!!!!!!!!!!!!    "        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "           !        "        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "                    "
        .SBYTE "     West ! ! East  "        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "                    "
        .SBYTE "           !        "        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "                    "
        .SBYTE "         South      "
ESCTXT
        .SBYTE "      Congratulation"
        .SBYTE "s Pathfinder!!      "
        .SBYTE "                    "
        .SBYTE "                    "
        .SBYTE "    >You have escape"
        .SBYTE "d the Labyrinth<    "
        .SBYTE "                    "
        .SBYTE "                    "
        .SBYTE "        Your time wa"
        .SBYTE "s 0:00:00.00        "
        .SBYTE "                    "
        .SBYTE "                    "
        .SBYTE "       Press !Trigge"        ;!!!!!!!! INVERSE CHARS SPECIAL CH
        .SBYTE "r to Restart      "        ;!!!!!!!! INVERSE CHARS !!!!!!!!
CAPTXT
        .SBYTE "         You have be"
        .SBYTE "en captured         "
        .SBYTE "                    "
        .SBYTE "                    "
        .SBYTE "     You will be dis"
        .SBYTE "posed of at the     "
        .SBYTE "      next time conv"
        .SBYTE "ienent for you      "
        .SBYTE "        Your time wa"
        .SBYTE "s 0:00:00.00        "
        .SBYTE "                    "
        .SBYTE "                    "
        .SBYTE "       Press !Trigge"        ;!!!!!!!! INVERSE CHARS SPECIAL CH
        .SBYTE "r! to Restart       "        ;!!!!!!!! INVERSE CHARS SPECIAL CH
DIRCHAR        .BYTE $00,$DC,$DE,$DD,$DF
OFFSETT        .BYTE $00,$45,$6C,$95,$6E
;---------------------
;Random Maze Generator
;---------------------
GENMZE        LDA MTEMP         ;This routine,
        STA LO         ;taken from a
        LDA MTEMP+1         ;BASIC routine,
        STA LO+1         ;generates a
        LDX #$00         ;maze with only
L0        LDY #$00         ;one correct
        LDA #$A0         ;path to the
MLOOP        STA (LO),Y         ;exit.
        INY
        CPY #$31
        BNE MLOOP
        LDA #$00
        STA (LO),Y
        CLC
        LDA LO
        ADC #$32
        STA LO
        BCC L2
        INC LO+1
L2        INX
        CPX #$23
        BNE L0
LINE20        LDA #$00
        STA DESTLO
LINE30        LDA MTEMP
        STA LO
        LDA MTEMP+1
        STA LO+1
        CLC
        LDA LO
        ADC #$35         ; Start gen here
        STA LO
        BCC LINE50
        INC LO+1
LINE50        LDY #$00
        LDA #$05
        STA (LO),Y
LINE60        LDA RANDOM
        AND #$07
        STA J
        LDA J
        SEC
        SBC #$04
        BCS LINE60
LINE70        LDA J
        STA TEMP
LINE80        LDA LO
        STA DESTLO
        LDA LO+1
        STA DESTLO+1
        LDA J
        CMP #$00
        BNE LINE801
        CLC
        LDA DESTLO
        ADC #$02
        STA DESTLO
        BCC LINE90
        INC DESTLO+1
        JMP LINE90
LINE801        LDA J
        CMP #$01
        BNE LINE802
        SEC
        LDA DESTLO
        SBC #$64
        STA DESTLO
        BCS LINE90
        DEC DESTLO+1
        JMP LINE90
LINE802        LDA J
        CMP #$02
        BNE LINE803
        SEC
        LDA DESTLO
        SBC #$02
        STA DESTLO
        BCS LINE90
        DEC DESTLO+1
        JMP LINE90
LINE803        LDA J
        CMP #$03
        BNE LINE90
        CLC
        LDA DESTLO
        ADC #$64
        STA DESTLO
        BCC LINE90
        INC DESTLO+1
LINE90        LDY #$00
        LDA (DESTLO),Y
        CMP #$A0
        BNE LINE100
        LDA J
        CLC
        ADC #$01
        LDY #$00
        CMP #$00
        BNE LINE90A
        LDA #$20
LINE90A        STA (DESTLO),Y
        JSR LINE200
        LDY #$00
        LDA #$20
        STA (LO),Y
        LDA DESTLO
        STA LO
        LDA DESTLO+1
        STA LO+1
        JMP LINE60
LINE100        LDA J
        CMP #$03
        BNE LINE101A
        LDA #$00
        STA J
        JMP LINE110
LINE101A        INC J
LINE110        LDA J
        CMP TEMP
        BEQ LINE110A
        JMP LINE80
LINE110A        LDY #$00
LINE120        LDA (LO),Y
        STA J
LINE130        LDA #$20
        STA (LO),Y
        LDA J
        SEC
        SBC #$05
        BCS LINE210
        DEC J
        LDX J
        LDA NEWJ,X
        STA J
        JSR LINE200
        JSR LINE200
        JMP LINE60
LINE200        LDA J
        CMP #$00
        BNE LINE2001
        CLC
        LDA LO
        ADC #$01
        STA LO
        BCC LINE210
        INC LO+1
        JMP LINE210
LINE2001        LDA J
        CMP #$01
        BNE LINE2002
        SEC
        LDA LO
        SBC #$32
        STA LO
        BCS LINE210
        DEC LO+1
        JMP LINE210
LINE2002        LDA J
        CMP #$02
        BNE LINE2003
        SEC
        LDA LO
        SBC #$01
        STA LO
        BCS LINE210
        DEC LO+1
        JMP LINE210
LINE2003        LDA J
        CMP #$03
        BNE LINE210
        CLC
        LDA LO
        ADC #$32
        STA LO
        BCC LINE210
        INC LO+1
LINE210        RTS
COPCEN        LDX #$00
COP2        LDA CENTER,X
        STA CENTER2,X
        INX
        CPX #$07
        BNE COP2
        RTS
;-------------------------
;Miscellaneous Data Tables
;-------------------------
NEWJ        .BYTE $02,$03,$00,$01
TABLE        .BYTE $FF,$FF,$01,$01
TABLE2        .BYTE $01,$01,$FF,$FF
WHICH        .BYTE $01,$00,$01,$00
DRAWY        .BYTE $00,$FF,$FF,$01,$01
DRAWX        .BYTE $00,$01,$00,$01,$00
DRAW2X        .BYTE $00,$00,$01,$00,$01
YVAL        .BYTE $08,$07,$05,$04,$02
COMP        .BYTE $0A,$06,$0A,$06,$0A
HARGO        .BYTE $6E,$6E,$6E,$6E
        .BYTE $7A,$00
SARGO        .BYTE $03,$03,$03,$03,$00
BARGO        .BYTE $FF,$7E,$3C,$18,$18
ONARG        .BYTE $54,$5C,$64,$6C,$74
OFARG        .BYTE $9A,$92,$8A,$82,$7A
;------------------------------
;Escape from Maze/Death Routine
;------------------------------
ESCAPE        LDA # <ESCTXT         ;Print
        STA TEXTB         ;"Escape from
        LDA # >ESCTXT         ;Maze" text at
        STA TEXTB+1         ;screen bottom.
        STA DESTLO+1
EX1        LDA TEXTB+1
        STA DESTLO+1
        LDA TEXTB
        CLC          ;Point DESTLO to
        ADC #$B4         ;proper place on
        STA DESTLO         ;screen to print
        BCC EX2         ;final time.
        INC DESTLO+1
EX2        LDX #$00
        LDA CENTER2         ;Check if player
        CMP #$45         ;is dead.
        BEQ EX3         ;yep...
EX21        LDA #$FF         ;Turn of timer.
        STA FLAG
        LDA #$03         ;Quadruple Player
        STA SIZEP0         ;Width for
        STA SIZEP1         ;Players 0 & 1.
        JSR PL1CL
        LDX #$A6
        LDA #$FF         ;Display Players
EX25        INX          ;on bottom 1/3rd
        STA PMG+$0400,X         ;of screen.
        STA PMG+$0500,X
        CPX #$E5
        BNE EX25
        LDA #$20         ;Display players
        STA HPOSP0         ;in left and
        LDA #$C0         ;right margin of
        STA HPOSP0+1         ;the screen.
        LDX #$00
EX3        LDA SEC1,X         ;Print elapsed
        CLC          ;time, one
        ADC #$10         ;character at a
        LDY YVAL,X         ;time in proper
        STA (DESTLO),Y         ;space at the
        INX          ;bottom of the
        CPX #$05         ;screen.
        BNE EX3
ES1        LDA CENTER2         ;Are Patroller &
        CMP #$45         ;player together?
        BEQ ES2         ;YES...Captured!
        LDA RANDOM         ;Not Captured...
        STA COLPM0         ;Change PM Colors
        STA COLPM1         ;for victory
        INC HOLD         ;display.
ES2        LDA STRIG0         ;Trigger Pressed?
        CMP #$01
        BEQ ES1         ;Nope...
        JMP $6900         ;Yes...Restart!
TOP
        .SBYTE "     labyrinths     "
        .SBYTE "                    "
        .SBYTE "    The Ultimate 3-D"
        .SBYTE " Maze  Adventure    "
        .SBYTE "     (C) 1987  ArgoS"
        .SBYTE "oft Productions     "
        .SBYTE "                    "
        .SBYTE "                    "
MAZE            $0400
        *= $6700
;--------------------------
;Patroller Movement Routine
;--------------------------
;        .LOCAL
_BEGIN        LDA CH         ;[ESC] pressed?
        CMP #$1C
        BNE BEG1         ;Nope...
        JMP $6900         ;Yes...Restart!
BEG1        LDA CDTMV4         ;Timer counted
        CMP #$00         ;down to 0 yet?
        BEQ B15         ;Yes...
        JMP RET2         ;Nope...
B15        LDA #$10         ;Reset Timer.
        STA CDTMV4
        LDX MNUM
        LDA #$00         ;Erase patroller
        STA COLOR         ;position on maze
        JSR EDOT         ;drawing.
B2        LDA DIRECTION         ;Save player
        STA DIRTMP         ;direction.
        LDX MNUM         ;Which patroller?
        LDA DIR2,X         ;Get its dirction
        STA DIRECTION         ;and store it!
        LDA V2,X         ;Get "Y" Coord.
        TAY          ;and put it in Y.
        LDA H2,X         ;Get "X" Coord.
        TAX          ;and put it in X.
        LDA #$20         ;Put "Space" in
        STA PAT         ;patroller pos.
        JSR PUTPT         ;in memory maze.
        LDX MNUM         ;Which patroller?
        LDA V2,X         ;Transfer the
        TAY          ;"X" and "Y"
        LDA H2,X         ;coords again.
        TAX
        JSR START         ;Get local walls.
        LDX MNUM         ;Which patroller?
        LDA DIRTMP         ;Transfer temp.
        STA DIRECTION         ;back to orig.
        LDA CENTER+1         ;Space in front
        CMP #$20         ;of patroller?
        BNE TURN         ;Nope. Turn
        JSR _LINE1401         ;Ya. Staight.
RET        LDX MNUM         ;Get patroller #.
        LDA #$03         ;White color for
        STA COLOR         ;plot.
        INC MNUM         ;Point next one.
        LDY MNUM         ;Check to see if
        DEY          ;all patrollers
        CPY DIFLEV         ;have moved.
        BEQ B15X         ;Yep...
        JSR EDOT         ;Nope. Replot.
        JMP B15         ;Next move...
B15X        LDA #$00         ;Reset patroller
        STA MNUM         ;number.
RET2        LDA #$45         ;Replot all
        STA PAT         ;patrollers
        LDX MNUM         ;in memory maze.
        CPX DIFLEV         ;All ploted?
        BEQ RET3         ;Yep...
        LDA V2,X         ;Get "X" coord
        TAY          ;and
        LDA H2,X         ;"Y" coordinate
        TAX          ;and
        JSR PUTPT         ;print in maze/
        INC MNUM
        CMP DIFLEV         ;All ploted?
        BNE RET2         ;Nope...
RET3        LDA #$00         ;Reset Patroller#
        STA MNUM
        RTS          ;Back to program!
TURN        LDA RANDOM         ;Get a random #.
        CLC
        ADC #$80         ;If number>128,
        BCC PTR         ;turn right.
PTL        LDA LEFT         ;Is there a wall
        CMP #$A0         ;to the left?
        BEQ PTL1         ;Yep. Right turn.
        JMP TLEFT         ;Nope. Left turn.
PTL1        LDA RIGHT         ;Is there a wall
        CMP #$A0         ;to the right?
        BEQ RNDTURN         ;Ya. Random turn.
        JMP TRIGHT         ;No. Right turn.
PTR        LDA RIGHT         ;Is there a wall
        CMP #$A0         ;to the right?
        BEQ PTR1         ;Yep. Left turn.
        JMP TRIGHT         ;No. Right turn.
PTR1        LDA LEFT         ;Is there a wall
        CMP #$A0         ;to the left?
        BEQ RNDTURN         ;Ya. Random turn.
        JMP TLEFT         ;No. Turn left.
RNDTURN        LDA RANDOM         ;Get Random #.
        CLC
        ADC #$80         ;If <128 then
        BCC TRIGHT         ;turn right.
TLEFT        LDA DIR2,X         ;Load current
        TAY          ;direction of
        LDA LTDIR,Y         ;patroller and
        STA DIR2,X         ;change with
        JMP RET         ;new value.
LTDIR        .BYTE $00,$02,$03,$04,$01
TRIGHT        LDA DIR2,X         ;Load current
        TAY          ;direction of
        LDA RTDIR,Y         ;patroller and
        STA DIR2,X         ;change with
        JMP RET         ;new value.
RTDIR        .BYTE $00,$04,$01,$02,$03
EDOT        LDA H2,X         ;Get "X" and "Y"
        STA PLOTX         ;coords from
        LDA V2,X         ;patroller.
        STA PLOTY
        LDA #$10         ;Set MTEMP to
        STA MTEMP         ;point to maze
        LDA #$90         ;on screen
        STA MTEMP+1
        LDA TIME         ;What time is it?
        CMP #$00         ;Daytime?
        BNE ED01         ;Nope...
        JSR PLOTCL         ;Yes, plot point.
ED01        RTS
_LINE1401        LDX MNUM         ;Patroller #.
        LDA DIR2,X         ;Find direction
        TAX          ;its moving.
        DEX
        LDA _WHICH,X         ;Add to Horiz
        CLC          ;or vert.
        ADC MNUM         ;Offset to
        TAY          ;proper
        CLC          ;patroller #.
        LDA H2,Y         ;Add or Subtrct
        ADC _TABLE,X         ;from horiz or
        STA H2,Y         ;vert.
        RTS
_TABLE        .BYTE $FF,$FF,$01,$01
_WHICH        .BYTE $07,$00,$07,$00
SPOS        .BYTE $14,$30,$30,$02,$30
        .BYTE "!!"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .BYTE $14,$22,$02,$14,$14
        .BYTE "!!"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .BYTE $04,$04,$04,$01,$04
        .BYTE "!!"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
PUTPT        LDA # <MAZE         ;Copy maze
        STA MTEMP         ;address to
        LDA # >MAZE         ;MTEMP
        STA MTEMP+1
_S0        DEY          ;Decrease "Y"
        CPY #$00         ;until zero to
        BEQ _S1         ;find vert pos.
        LDA #$32         ;Add maze width.
        JSR ADD
        JMP _S0
_S1        TXA          ;Add horiz val.
        JSR ADD
        LDY #$00
        LDA PAT         ;Store
        STA (MTEMP),Y         ;plot/erase
        RTS          ;here.
;-------------------------------
;Title Page and Option Selection
;-------------------------------
        *= $6900
        LDA #$40         ;Disable DLIs.
        STA NMIEN
        LDA #$00         ;Turn off Screen
        STA DMACTL
        STA AUDC1         ;and sounds.
        LDX #$00
        STX SIZEP0         ;Zero P/M sizes.
        STX SIZEP1
SUB3        STA CENTER2,X         ;Erase
        INX          ;CENTER2.
        CPX #$06
        BNE SUB3
        STX HPOSP0         ;Position PM0 &
        STX HPOSP1         ;PM1 off screen.
        LDX #$00
SUB4        LDA SPOS,X         ;Reset
        STA H2,X         ;Patrollers'
        INX          ;starting
        CPX #$14         ;positions.
        BNE SUB4
        LDA #$FF         ;Turn off timer.
        STA FLAG
        LDA #$00         ;Zero Dummy and
        STA DUMMY         ;pointer
        STA POINTER
        JMP _DLINIT         ;Init.
;--------------
;Title Page DLI
;--------------
_DLI        PHA          ;Save Accumulator
        TXA
        PHA          ;Save X register
        TYA
        PHA          ;Save Y register
        LDA POINTER         ;Which DLI?
        CMP #$00
        BNE _DLOOP2
        LDX #$90
_DLOOP1        STX COLPF0         ;Shade line
        INX          ;in 16 shades
        STA WSYNC         ;of blue
        CPX #$9F
        BNE _DLOOP1
        JMP _DRTS
_DLOOP2        CMP #$01         ;2nd DLI?
        BEQ _DLOOP25
        CMP #$02         ;3rd DLI?
        BNE _DLOOP5
_DLOOP25        LDX #$00         ;2nd DLI...
_DLOOP3        STX COLPF0         ;Shade
        INX          ;in 8 colors
        INX          ;of grey.
        STA WSYNC
        CPX #$10
        BNE _DLOOP3
        JMP _DRTS
_DLOOP5        LDY DUMMY         ;Change colors
        LDA _COLORS,Y         ;on bottom
        STA COLPF2         ;of titles.
        INC DUMMY
        LDA DUMMY         ;All colors
        CMP #$06         ;displayed?
        BNE _DRTS         ;nope..
        LDA #$00         ;Set color pntr
        STA DUMMY         ;to start color.
_DRTS        INC POINTER
        LDA POINTER         ;All DLIs
        CMP #$09         ;done?
        BNE _DR1         ;Nope...
        LDA #$00         ;Set pointer
        STA POINTER         ;to 1st DLI.
_DR1        PLA          ;Restore Y Reg
        TAY
        PLA          ;Restore X Reg
        TAX
        PLA          ;Restore A
        RTI
;-------------------------
;Title Page Initialization
;-------------------------
_DLINIT        LDA #_DLIST&255         ;Set D/L
        STA SDLSTL         ;address to
        LDA #_DLIST/256         ;pointer.
        STA SDLSTL+1
        LDA #_DLI&255         ;Set DLI
        STA VDSLST         ;address
        LDA #_DLI/256         ;to pointer.
        STA VDSLST+1
        LDA #$C0         ;Enable DLIs.
        STA NMIEN
        LDA #$00
        STA COLOR2         ;Black Background
        LDA #$22         ;Turn on Screen
        STA SDMCTL         ;Display.
        LDA TIME         ;Load time and
        JMP E4         ;print it.
PLV        LDY DIFLEV         ;Load dificulty
        LDX #$00         ;level.
        LDA POINT,Y         ;Get offset
        TAY          ;pointer.
PLV1        LDA LEVELS,Y         ;Get Character
        CMP #$5B         ;My EOL Char?
        BEQ END         ;Ya...
        STA PRINT1,X         ;Nope print
        INY          ;character.
        INX          ;Inc POINTERS.
        JMP PLV1         ;Print next.
END:    LDA DIFLEV
        CLC          ;Print level #
        ADC #$10         ;in proper spot
        STA PRINT2         ;of screen.
        LDA CONSOL
        CMP #$05         ;SELECT pressd?
        BNE END1
        LDA #$01         ;Yes...Set flag
        STA HOLD
        JMP E3         ;Beep!
END1        CMP #$03         ;OPTION pressd?
        BEQ E3         ;Beep!
        CMP #$06         ;START Pressed?
        BNE END         ;nope...
        LDA #$00         ;Zero last key
        STA CH         ;pressed and
        LDA #$00         ;flags.
        STA FLAG
        STA HOLD
        JMP $7800         ;Main program!
E3        LDA #$30
        STA AUDF1         ;Frequency
        LDA #$0F         ;Store volume
        STA CDTMV3         ;in timer.
E1        LDA CDTMV3         ;Add an offset
        CLC          ;to timer for
        ADC #$A0         ;note volume.
        STA AUDC1
        CMP #$A0
        BNE E1
        STA AUDC1
        LDA HOLD         ;SELECT pressed?
        CMP #$00
        BEQ E5         ;Nope...
        LDA #$00
        STA HOLD
        INC TIME         ;Toggle between
        LDA TIME         ;Day and Night
        CMP #$02         ;TIME=0 ; Daytime
        BNE E4         ;TIME=1 ; Night
        LDA #$00
        STA TIME
E4        TAY
        LDX #$00
        LDA TPOINT,Y         ;Get offset for
        TAY          ;Time Print
PLV3        LDA TPRINT,Y         ;Print until
        CMP #$5B         ;My EOL
        BNE PLV4
        JMP PLV
PLV4        STA PRINT3,X
        INY
        INX
        JMP PLV3
E5        INC DIFLEV         ;Increase
        LDA DIFLEV         ;difficulty
        CMP #$07         ;level (0-6)
        BEQ PLV5
        JMP PLV         ;and print it.
PLV5        LDA #$00
        STA DIFLEV
        JMP PLV
;-----------------------
;Title Page Display List
;-----------------------
_DLIST        .BYTE $70,$70,$70
        .BYTE $42
        .WORD TEXT
        .BYTE $02,$F0,$07,$00,$F0
        .BYTE $06,$80,$06
        .BYTE $70,$02,$70,$02,$70,$02
        .BYTE $70,$F0,$00,$82,$00,$82
        .BYTE $70,$70,$82,$00,$82,$00
        .BYTE $82,$00,$41
        .WORD _DLIST
;-----------------------------
;Title Page and Selection Data
;-----------------------------
TEXT
        .SBYTE "     ArgoSoft Softwa"
        .SBYTE "re Productions      "
        .SBYTE "            Proudly "
        .SBYTE "Presents            "
        .SBYTE "     LABYRIN"
        .SBYTE "THS       THE ULTIMA"
        .SBYTE "TE 3-D     MAZE ADVE"
        .SBYTE "NTURE            A.N"
        .SBYTE ".A.L.O.G. Computing"
        .SBYTE "              Progra"
        .SBYTE "mmed  By Steven Lash"
        .SBYTE "ower"
        .SBYTE "      (C) 1987 ArgoS"
        .SBYTE "oft Software Product"
        .SBYTE "ions"
        .SBYTE "     Number of Argon"
        .SBYTE "ian Patrollers->0"
        .SBYTE "       You Will Atte"
        .SBYTE "mpt A          "
        .SBYTE "Escape"
        .SBYTE "     !Option! Diffic"        ;!!!!!!!! INVERSE CHARS SPECIAL CH
        .SBYTE "ulty Level -        "
        .SBYTE "     !Select! Daytim"        ;!!!!!!!! INVERSE CHARS SPECIAL CH
        .SBYTE "e or Nightime "
        .SBYTE "Escape "
        .SBYTE "    !Start ! Enter t"       ;!!!!!!!! INVERSE CHARS SPECIAL CH
        .SBYTE "he Labyrinth        "
        .SBYTE "  "
_COLORS        .BYTE $C2,$B2,$A2,$92
        .BYTE $82,$00
LEVELS        .SBYTE "Beginner!Easy    "        ;!!!!!!!! SPECIAL CHARS !!!!!!!
        .SBYTE "!Moderate!Hard    !T"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "rivial!Sadistic!Insa"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "ne  !"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
POINT        .BYTE $00,$09,$12,$1B
        .BYTE $24,$2C,$35
TPRINT        .SBYTE "Daylight!"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
        .SBYTE "Nightime!"        ;!!!!!!!! SPECIAL CHARS !!!!!!!!
TPOINT        .BYTE $00,$09
        *= $02E0
        .WORD $6900
