; .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 ;Addresss. STA MTEMP+1 JSR GENMZE ;Generate Maze! LDA #$C5 ;Exit in lower STA MAZE+$06D3 ;right corner 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 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 ;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 ;is. STA SDLSTL+1 LDA # >DLI ;Point system STA VDSLST+1 ;to my DLI. 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 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 # SCREEN STA LO+1 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 ;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 ;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