HKMAZE h DSK (HK-EA3  P'"HK-ASM CPC/ HKMAZE-XB r`00320 A0000B8040B2010B0804B0201B0000B0000B0000B0000B01017F3A1F 0001A0012B0101B0101B0101B0000B0000B0000B00FFB0101B0101B0101B01FF7F34AF 0002A0028B017DB4545B457DB01FFB001EB0016B0000B0000B0101B0000B01017F308F 0003A003EB0000B0000BFF00B0100B0000B0001B0000BFFFFBFFFFB0000B00017F2BBF 0004A0054B0000B0102B0408B0408B0102B0100B0200B0400B0800B1000B03007F378F 0005A006AB0000B02E0B8320B0200B0002B06A0C030EB0200B0206B06A0C030E7F309F 0006A0080B0200B03FFB06A0C030EB0200B0403B06A0C030EB0200B0536B06A07F2E9F 0007A0096C030EB0200B1B00B0201BD000B06A0C02A6B0200B1800B04C1B02027F306F 0008A00ACB0300B06A0C02AAB04C0B04C1B0202B1800B06A0C02AAB0200B20007F2D3F 0009A00C2B0201B1000B0202B1800B06A0C02AAB04C0B0203B0003B0201C00087F325F 0010A00D8B0202B0028B0A12B06A0C02C4B0220B0800B0603B16F5BC020C00307F2F3F 0011A00EEB05C0BC800C0052B0500BC800C004EBC820C0030B0000BC820C00327F2CFF 0012A0104B0001B05C0B05C1B3840BC302B022CC031EB0201BFFFFBC881C031C7F28CF 0013A011AB0642B16FCBC020C0032B04C1B0202C031EBA0A0C0030B05C2B05827F2C3F 0014A0130BC202BC808C0034BC0E0C0030BDC81B0603B16FDB05C2B0600B16F87F291F 0015A0146B0206C031EB0226B0190B06A0C027EBC2A0B83C0B09EABC24AB0A1A7F27BF 0016A015CBD820B8333C0040BC1C6BA1EAC0046BA1EAC004EB9817C0043B16067F275F 0017A0172BF5A9C0056BC187BD5A9C005AB10E8B0589B05CAB0289B0004B16027F27DF 0018A0188B04C9B04CAB9820C0040B8333B16E7BF5A0C0066BD820C0043C003E7F295F 0019A019EB8308B1101B103FB9818C0042B1601B1013B9818C0043B1604BD8207F2EAF 0020A01B4C0044C003EB100CB9818C0066B1101B1008BC188B9820C003EC00437F2DAF 0021A01CAB1302BC220C0034B10BEB0588B10E4B1025B0200B1990B0201B04007F2EDF 0022A01E0B06A0C02A6B0220BFFE0B06A0C02A6B0220B0040B06A0C02A6B02007F2BAF 0023A01F6B198CB06A0C02A6B04CABA02AC0046BA02AC004EB06A0C02A6B02007F277F 0024A020CB198CB020AB0002B0A1ABA02AC0046BA02AC004EB06A0C02A6B102B7F28DF 0025A0222B0200B1800BD820B8321B8C02B0260B4000BD800B8C02B0203C031E7F2F4F 0026A0238B0204B0300B04C1BD073B9801C0042B1603B0201B0400B1012B98017F326F 0027A024EC0043B1603B0201B0300B100CB04C5B2060C0060B1301B0585B20607F321F 0028A0264C0062B1302B0225B0002BC045B06C1BD801B8C00B0604B16E2B03007F2F3F 0029A027AB0002B10FFB0204B6FE5B3920B83C0B0225B7AB9BC805B83C0B045B7F26CF 0030A0290BC005B0A50BE005B0240BFF07BC0C4B0243B0007BA004B6003B045B7F2B3F 0031A02A6B0202B0001BD820B8321B8C02B0260B4000BD800B8C02B1000BD8017F2E8F 0032A02BCB8C00B0602B16FCB045BBD820B8321B8C02B0260B4000BD800B8C027F28FF 0033A02D2B1000BD831B8C00B0602B16FCB045BBD820B8321B8C02B0240B3FFF7F277F 0034A02E8BD800B8C02B1000BD060B8800B045BBD820B8321B8C02B0240B3FFF7F280F 0035A02FEBD800B8C02B1000BDC60B8800B0602B16FCB045BBD820B8321B8C027F272F 0036A0314B0260B8000BD800B8C02B045BB00007F850F 003750068HK 7FDB3F 0038: 99/4 AS 0039*5* Generates a Hunt/Kill Maze on the TI-99/4A Computer** Matthew Hagerty - March 2006** This code is Public Domain* DEF HK* VDP MEMORY MAP*/VDPRD EQU >8800 VDP RAM READ DATA,VDPSTA EQU >8802 VDP RAM STATUS0VDPWD EQU >8C00 VDP RAM WRITE DATA8VDPWA EQU >8C02 VDP RAM READ/WRITE ADDRESSMVR1CPY EQU >83D4 COPY OF VDP REGISTER 1 - SEE E/A MANUAL PG. 248* RANDOM NUMBER MEMORY MAP*2RAND16 EQU >83C0 16-BIT RANDOM NUMBER1RANDOM EQU >83C1 8-BIT RANDOM NUMBER * WORKSPACES*9WRKSP0 EQU >8300 WORKSPACE 0 FOR PROGRAM USEFWRKSP1 EQU >8320 WORKSPACE 1 FOR VDP AND RELATED ROUTINES5W1R0LB EQU WRKSP1+1 WORKSPACE 1 R0 LOW BYTE5W1R1LB EQU WRKSP1+3 WORKSPACE 1 R1 LOW BYTE5W1R2LB EQU WRKSP1+5 WORKSPACE 1 R2 LOW BYTE5W1R3LB EQU WRKSP1+7 WORKSPACE 1 R3 LOW BYTE5W1R4LB EQU WRKSP1+9 WORKSPACE 1 R4 LOW BYTE5W1R5LB EQU WRKSP1+11 WORKSPACE 1 R5 LOW BYTE5W1R6LB EQU WRKSP1+13 WORKSPACE 1 R6 LOW BYTE5W1R7LB EQU WRKSP1+15 WORKSPACE 1 R7 LOW BYTE5W1R8LB EQU WRKSP1+17 WORKSPACE 1 R8 LOW BYTE5W1R9LB EQU WRKSP1+19 WORKSPACE 1 R9 LOW BYTE6W1RALB EQU WRKSP1+21 WORKSPACE 1 R10 LOW BYTE * EQUATES*:HIMEM EQU >A000 START OF HI MEMORY EXPANSION8SXMAX EQU 128 MAXIMUM ALLOWABLE X,Y SIZESYMAX EQU 96* DATA** Pixel Look Up Table#PLUT DATA >8040,>2010,>0804,>0201 * Characters#CBLANK DATA >0000,>0000,>0000,>0000#CRIGHT DATA >0101,>0101,>0101,>0101#CBOTTM DATA >0000,>0000,>0000,>00FF#CINIT DATA >0101,>0101,>0101,>01FF#CBLOCK DATA >017D,>4545,>457D,>01FFCHREND * VARIABLES*/SX DATA 30 Size of the maze.SY DATA 225HUNTXY DATA 0 Where to start hunting.MOX BYTE 0 Screen origin of upper left corner of the maze. OY BYTE 0EX BYTE 1 Coordinate of current cell in the maze. Y BYTE 10102,>0408 Converts a direction into a bit value for given diODINV DATA >0408,>0102 Inverse of DBIT for setting an initial value of aJ* cell that is entered from a given direction.CELLT DATA >0100CELLR DATA >0200CELLB DATA >0400CELLL DATA >0800CELLC DATA >1000* Cell values::* -1 == Out of bounds, will not exist in valid maze area.* 0 == Unvisited cell.** Cell bitmap:*/* 128 | 064 | 032 | 016 | 008 | 004 | 002 | 001/* ----+-----+-----+-----+-----+-----+-----+----.* 0 | 0 | 0 | C | L | B | R | T* * If Set (1)'* T == Cell open in the Top direction.)* R == Cell open in the Right direction.** B == Cell open in the Bottom direction.(* L == Cell open in the Left direction.* C == Cell Complete.=* Set up Mode 2 1x8 bitmap mode, but use as regular character<* mode with extra color. The PDT will be duplicated and the2* Screen Image Table will be initialized to all 0.*0HK LIMI 0 DISABLE INTERRUPTS1 LWPI WRKSP1 USE VDP WORKSPACE 14 LI R0,>0002 SET BIT 6 OF VDP REG 0 BL @VWTR> LI R0,>0206 MOVE SCREEN IMAGE TABLE TO >1800 BL @VWTR7 LI R0,>03FF MOVE COLOR TABLE TO >2000 BL @VWTR? LI R0,>0403 PATTERN DESCRIPTOR TABLE TO >0000 BL @VWTRA LI R0,>0536 MOVE SPRITE ATTRIBUTE LIST TO >1B00 BL @VWTR4 LI R0,>1B00 DISABLE UNUSED SPRITES) LI R1,>D000 ALL SPRITES BL @VSBW.* WRITE 0 TO ALL SCREEN IMAGE TABLE LOCATIONS.*; LI R0,>1800 ADDRESS OF SCREEN IMAGE TABLE7 CLR R1 VALUE TO WRITE - ALL ZERO; LI R2,>300 NUMBER OF TIMES TO WRITE ZERO BL @VSMW * CLEAR PATTERN DESCRIPTOR TABLE*2 CLR R0 ADDRESS OF PDT >00007 CLR R1 VALUE TO WRITE - ALL ZERO; LI R2,>1800 NUMBER OF TIMES TO WRITE ZERO BL @VSMW* CLEAR COLOR TABLE*: LI R0,>2000 ADDRESS OF COLOR TABLE >2000C LI R1,>1000 DEFAULT COLOR IS BLACK ON TRANSPARENT@ LI R2,>1800 NUMER OF TIMES TO WRITE COLOR DATA BL @VSMW** * INITIALIZE*** WRITE CHARACTER DEFINITIONS*C* USING THE SCREEN AS A NORMAL GRAPHICS MODE MEANS WE HAVE TO WRITEA* THE SAME CHARACTER DEFINITIONS IN THE PDT FOR EACH 1/3RD OF THE * SCREEN., CLR R0 ADDRESS OF PDTB LI R3,3 3 BANKS OF 256 CHARACTER DEFINITIONS1INIT1 LI R1,CBLANK SRC ADDRESS OF DATA6 LI R2,CHREND-CBLANK NUMBER OF BYTES TO WRITEH SLA R2,1 CONVERT NUMBER OR WORDS TO NUMBER OF BYTES9 BL @VMBW WRITE CHARACTER DEFINITIONS9 AI R0,>0800 PREVIOUS GROUP (2ND OR 1ST) DEC R3 JNE INIT15* FIX UP DIRECTION TABLE FOR Y MOVEMENT (WHOLE LINES)*5 MOV @SX,R0 GET THE LENGTH OF A ROWH INCT R0 ACCOUNT FOR THE BOUNDRY - 1 BYTE EACH SIDE? MOV R0,@PY+4 UPDATE DIRECTION TABLE FOR Y DOWN2 NEG R0 NEGATIVE Y DIRECTION= MOV R0,@PY UPDATE DIRECTION TABLE FOR Y UP* INITIALIZE MAZE ARRAY*$ MOV @SX,@R0 X SIZE$ MOV @SY,@R1 Y SIZE5 INCT R0 ACCOUNT FOR THE BOUNDRY INCT R1A MPY R0,R1 SIZE IN R2 SHOULD NEVER BE GT 127405 MOV R2,R12 TOTAL SIZE OF MAZE DATA= AI R12,HKMAZE ADDRESS OF THE END OF MAZE DATA9 LI R1,>FFFF TWO BYTES WITH VALUES OF -1INIT2 MOV R1,@HKMAZE-2(R2) DECT R2 JNE INIT2* INIT VALID MAZE AREA, MOV @SY,R0 NUMBER OF ROWS0 CLR R1 INITIAL CELL VALUE3 LI R2,HKMAZE LOCATION OF MAZE DATA( A @SX,R2 ROW LENGTHA INCT R2 PASS 1ST ROW LEFT AND RIGHT BOUNDRY7 INC R2 PASS 2ND ROW LEFT BOUNDRY4 MOV R2,R8 STARTING HUNT LOCATION9 MOV R8,@HUNTXY SAVE STARTING HUNT LOCATION+INIT3 MOV @SX,R3 LENGTH OF ROW'INIT4 MOVB R1,*R2+ INIT CELL= DEC R3 COUNT DOWN CELLS IN CURRENT ROW# JNE INIT4 DONE?1 INCT R2 MOVE PAST BOUNDRIES9 DEC R0 COUNT DOWN ROWS INITIALIZED# JNE INIT3 DONE?* R6 CURRENT LOC * R7 NEXT LOC * R8 HUNT LOC!* R9 CURRENT DIR - BYTE VALUE 0-3&* R10 CURRENT DIR - WORD VALUE 0,2,4,6* R12 END OF MAZE ADDRESS* INITIAL POSITION LI R6,HKMAZE AI R6,400* 420 D=INT(RND*3)+1 :: D1=D/RNDDIR BL @RANDNO GET RANDOM NUMBER MOV @RAND16,R10, SRL R10,14 CONVERT TO 0-38 MOV R10,R9 BYTE BASED DIRECTION INDEX8 SLA R10,1 WORD BASED DIRECTION INDEX8 MOVB @W1R9LB,@D1 REMEMBER INITIAL DIRECTION * 430 NX=X+P(D,1) :: NY=Y+P(D,2)NEWLOC MOV R6,R7 A @PX(R10),R7 A @PY(R10),R7 * 440 IF MAZE(NX,NY)<>0 THEN 550 CB *R7,@ZERO JNE NEWDIR$* 450 MAZE(X,Y)=MAZE(X,Y) OR DBIT(D) SOCB @DBIT(R9),*R6 * 460 C=99&* 470 IF (MAZE(X,Y) AND 2)=2 THEN C=98=* 480 IF (MAZE(X,Y) AND 4)=4 THEN IF C=98 THEN C=96 ELSE C=97!* 490 CALL HCHAR(OY+Y-1,OX+X-1,C)'* 500 X=NX :: Y=NY :: MAZE(X,Y)=DINV(D) MOV R7,R6 MOVB @DINV(R9),*R6* 510 GOTO 420 JMP RNDDIR* 550 D=D+1 :: IF D>4 THEN D=1NEWDIR INC R9 INCT R10 CI R9,4 JNE LASTDR CLR R9 CLR R10* 560 IF D<>D1 THEN 430LASTDR CB @D1,@W1R9LB JNE NEWLOC * 600 C=99&* 610 IF (MAZE(X,Y) AND 2)=2 THEN C=98=* 620 IF (MAZE(X,Y) AND 4)=4 THEN IF C=98 THEN C=96 ELSE C=97!* 630 CALL HCHAR(OY+Y-1,OX+X-1,C)* 640 MAZE(X,Y)=MAZE(X,Y) OR 16 SOCB @CELLC,*R6 * 700 RESET=0 MOVB @ZERO,@HRESET2* 710 FOR J=HY TO SY :: DISPLAY AT(1,1):"HUNT: ";J* 720 FOR I=HX TO SX-* 730 IF MAZE(I,J)=0 THEN RESET=1 :: GOTO 800* 740 IF MAZE(I,J)>=16 THEN 800-HUNT0 C R8,R12 DONE WITH MAZE? JLT HUNT1 JMP TEST,HUNT1 CB *R8,@NEG1 SKIP BOUNDRIES JNE HUNT2 JMP HUNTLPHUNT2 CB *R8,@ZERO JNE HUNT3 MOVB @ONE,@HRESET JMP HUNTLPHUNT3 CB *R8,@CELLC JLT HUNT4 JMP HUNTLP* 750 X=I :: Y=J4* 760 IF RESET=0 THEN HX=I :: HY=J ELSE HX=1 :: HY=1* 770 DISPLAY AT(1,1):"KILL"* 780 D=4 :: D1=4* 790 GOTO 430HUNT4 MOV R8,R6 CB @HRESET,@ZERO JEQ HUNTRT MOV @HUNTXY,R8HUNTRT JMP RNDDIR * 800 NEXT I * 810 HX=1 * 820 NEXT JHUNTLP INC R8 JMP HUNT0* 900 DISPLAY AT(1,1):"DONE"(* 910 CALL KEY(0,K,S) :: IF S=0 THEN 910 * 1000 END JMP TEST0 LI R0,>1800+400 SCREEN IMAGE TABLE LI R1,>0400 BL @VSBW AI R0,-32 BL @VSBW AI R0,64 BL @VSBW LI R0,>1800+396 BL @VSBW CLR R10 A @PX(R10),R0 A @PY(R10),R0 BL @VSBW LI R0,>1800+396 LI R10,2 SLA R10,1 A @PX(R10),R0 A @PY(R10),R0 BL @VSBW JMP DONE* TEST0TEST LI R0,>1800 SCREEN IMAGE TABLED MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE ADDRESSI ORI R0,>4000 SET READ/WRITE BITS 14 AND 15 TO WRITE (01)E MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRITE ADDRESS LI R3,HKMAZE LI R4,>300TEST1 CLR R1 MOVB *R3+,R1 CB R1,@NEG1 JNE TEST2 LI R1,>0400 JMP TEST8TEST2 CB R1,@ZERO JNE TEST3 LI R1,>0300 JMP TEST8TEST3 CLR R5 COC @CELLR,R1 JEQ TEST4 INC R5TEST4 COC @CELLB,R1 JEQ TEST5 AI R5,2TEST5 MOV R5,R1 SWPB R13TEST8 MOVB R1,@VDPWD WRITE BYTE TO VDP RAM DEC R4 JNE TEST1/DONE LIMI 2 ENABLE INTERRUPTSQUIT JMP QUIT**** * SUBROUTINES******* RANDOM NUMBERS**3* GENERATES A RANDOM NUMBER AND PLACES IT IN RAND16*RANDNO LI R4,28645 MPY @RAND16,R4 AI R5,31417 MOV R5,@RAND16 RT* PIXEL OFFSET ADDRESS*C* Calculate a byte and bit offset in bitmap mode. The register useC* is such that when done R0 contains the address offset for readingD* the existing byte from the pattern descriptor table into R1. Then@* set the correct pixel and write back to the pattern descriptor* table.** R4 = Column (X), R5 = Row (Y)&* R0 = Byte Offset, R3 = Bit to Change*'PXADDR MOV R5,R0 ROW TO R09 SLA R0,5 DIV ROW BY 8 AND MUL BY 2565 SOC R5,R0 ADD REMAINDER TO OFFSET1 ANDI R0,>FF07 ADJUST FOR DIVISION' MOV R4,R3 COL TO R3* ANDI R3,7 COL MODULO 8/ A R4,R0 ADD COL TO OFFSET5 S R3,R0 ADJUST BY COL REMAINDER RT*** VDP ROUTINES**0* Uses a dedicated workspace in fast 16-bit RAM.** General register use is: * R0 VDP RAM starting address.J* R1 MSB contains the value to write or to receive a value when reading.F* For multipe byte reads/writes, contains the CPU buffer address.7* R2 Counter (counts down) for multiple reads/writes.** WRITING VDP DATA*4* VDP SINGLE BYTE WRITE - SINGLE BYTE MULTIPLE WRITE*<* Writes the value in the most-significant byte of R1 to the=* VDP RAM address indicated in R0. For VSMW, the value in R2<* determines how many times to write the byte. This is very>* useful when initializing large amounts of VDP RAM for things8* such as clearing the screen or setting up bitmap mode.*MVSBW LI R2,1 FORCE THE BYTE COUNT TO 1 FOR SINGLE BYTE WRITEDVSMW MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE ADDRESSI ORI R0,>4000 SET READ/WRITE BITS 14 AND 15 TO WRITE (01)E MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRITE ADDRESS. NOP WAIT FOR THE VDP3VSMWLP MOVB R1,@VDPWD WRITE BYTE TO VDP RAM* DEC R2 BYTE COUNTER+ JNE VSMWLP CHECK IF DONE RT* VDP MULTIPLE BYTE WRITE*=* Writes the number of bytes indicated in R2 from the CPU RAM<* starting at the address indicated by R1 and places them in6* the VDP RAM starting at the address indicated by R0.*DVMBW MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE ADDRESSI ORI R0,>4000 SET READ/WRITE BITS 14 AND 15 TO WRITE (01)E MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRITE ADDRESS. NOP WAIT FOR THE VDP3VMBWLP MOVB *R1+,@VDPWD WRITE BYTE TO VDP RAM* DEC R2 BYTE COUNTER+ JNE VMBWLP CHECK IF DONE RT** READING VDP DATA** VDP SINGLE BYTE READ*>* Reads a byte from VDP RAM address indicated in R0 and places(* it in the most-significate byte of R1.*DVSBR MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE ADDRESSH ANDI R0,>3FFF SET READ/WRITE BITS 14 AND 15 TO READ (00)E MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRITE ADDRESS. NOP WAIT FOR THE VDP4 MOVB @VDPRD,R1 READ BYTE FROM VDP RAM RT* VDP MULTIPLE BYTE READ*<* Reads the number of bytes indicated in R2 from the VDP RAM<* starting at the address indicated by R0 and places them in6* the CPU RAM starting at the address indicated by R1.*DVMBR MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE ADDRESSH ANDI R0,>3FFF SET READ/WRITE BITS 14 AND 15 TO READ (00)E MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRITE ADDRESS. NOP WAIT FOR THE VDP4VMBRLP MOVB @VDPRD,*R1+ READ BYTE FROM VDP RAM* DEC R2 BYTE COUNTER/ JNE VMBRLP CHECK IF FINISHED RT** VDP REGISTERS** VDP WRITE TO REGISTER*A* Writes the value in the least-significant byte of R0 to the VDP8* register indicated in the most-significate byte of R0.*LVWTR MOVB @W1R0LB,@VDPWA SEND LOW BYTE (VALUE) TO WRITE TO VDP REGISTERC ORI R0,>8000 SET UP A VDP REGISTER WRITE OPERATIONF MOVB R0,@VDPWA SEND HIGH BYTE (ADDRESS) OF VDP REGISTER RT3HKMAZE DATA 0 START ADDRESS OF MAZE END}2,1Q72.212M42a*2e 2m2q 2w22222233&31v3Kl3jb3X303&333444K4h4p44444@565,57"5H5566L6Y6666777?7ax7n7d7KEY0KSS011DONEJHX1I D4D1411KILL#RESET0HXIHYJHX1HY1XIYJMAZEIJ16 MAZEIJ0RESET1 IHXSX JHYSY11HUNT: J RESET0MAZEXYMAZEXY16HCHAROYY1OXX1C+MAZEXY44C98C96C97MAZEXY22C98C99 DD1DD1D4D1XNXYNYMAZEXYDINVDHCHAROYY1OXX1C+MAZEXY44C98C96C97MAZEXY22C98C99MAZEXYMAZEXYDBITDMAZENXNY0&NXXPD1NYYPD2DϷ31D1D11KILL0XϷSX1YϷSY1MAZEXY0IHCHARIOX99SXIOYOYSY1CDINV4DINV14DINV28DINV31DINV42CDBIT4DBIT11DBIT22DBIT34DBIT48=P310P321P411P420=P110P121P211P220 P422I1SYMAZE0I1MAZESX1I1I6I0SX1MAZEI01MAZEISY11IMAZE1313SX12SY12OX10OY6HX1HY1COLOR9211"CHAR100017D4545457D01FF!CHAR9901010101010101FF!CHAR9800000000000000FF!CHAR970101010101010101!CHAR960000000000000000CLEAR01 CRIGHT DATA >0101,>0101,>0101,>0101  0012 0101  0014 0101  0016 0101 8 0055 0018 0000 CBOTTM DATA >0000,>0000,>0000,>00FF  001A 0000  001C 0000  001E 00FF 8 0056 0020 0101 CINIT DATA >0101,>0101,>0101,>01FF  0022 0101  0024 0101  0026 01FF 8 0057 0028 017D CBLOCK DATA >017D,>4545,>457D,>01FF  002A 4545  002C 457D  002E 01FF  0058 CHREND  0059 0060 * VARIABLES  0061 * D 0062 0030 001E SX DATA 30 Size of the maze. " 0063 0032 0016 SY DATA 22 N 0064 0034 00 OX BYTE 0 Screen origin of upper left co" 0065 0035 00 OY BYTE 0 N 0066 0036 01 X BYTE 1 Coordinate of current cell in " 0067 0037 01 Y BYTE 1 N 0068 0038 00 NX BYTE 0 Next tentative "current cell"." 0069 0039 00 NY BYTE 0 N 0070 003A 01 HX BYTE 1 Last valid "hunting" location N 0071 003B 01 HY BYTE 1 hunting process over from the N 0072 003C 00 HRESET BYTE 0 Used to indicate if "hunting" N 0073 003D 00 D BYTE 0 Random direction. D1 is used N 0074 003E 00 D1 BYTE 0 directions have been tried forN 0075 003F 00 C BYTE 0 Character to be displayed in a 0076 " 0077 0040 FF NEG1 BYTE -1 " 0078 0041 00 ZERO BYTE 0 " 0079 0042 0001 CELLT DATA 1 " 0080 0044 0002 CELLR DATA 2 " 0081 0046 0004 CELLB DATA 4 " 0082 0048 0008 CELLL DATA 8 " 0083 004A 0010 CELLC DATA 16  0084 0085 EVEN N 0086 004C 0000 PX DATA 0,1,0,-1 Converts a direction into +/-  004E 0001  0050 0000  0052 FFFF D 0087 0054 FFFF PY DATA -1,0,1,0 UP,RIGHT,DOWN,LEFT  0056 0000  0058 0001  005A 0000 N 0088 005C 0102 DBIT DATA >0102,>0408 Converts a direction into a bi 005E 0408 N 0089 0060 0408 DINV DATA >0408,>0102 Inverse of DBIT for setting an 0062 0102 N 0090 * cell that is entered from a gi 0091 " 0092 * Cell values:   99/4 ASSEMBLERFVERSION 1.2 PAGE 0003N 0093 * -1 == Out of bounds, will not exist in valid maze area. , 0094 * 0 == Unvisited cell.  0095 * " 0096 * Cell bitmap:  0097 * D 0098 * 128 | 064 | 032 | 016 | 008 | 004 | 002 | 001 D 0099 * ----+-----+-----+-----+-----+-----+-----+---- B 0100 * 0 | 0 | 0 | C | L | B | R | T  0101 * 0102 * If Set (1) < 0103 * T == Cell open in the Top direction. > 0104 * R == Cell open in the Right direction. > 0105 * B == Cell open in the Bottom direction. < 0106 * L == Cell open in the Left direction. * 0107 * C == Cell Complete.  0108  0109 N 0110 * Set up Mode 2 1x8 bitmap mode, but use as regular characteN 0111 * mode with extra color. The PDT will be duplicated and theF 0112 * Screen Image Table will be initialized to all 0.  0113 * D 0114 0064 0300 HK LIMI 0 DISABLE INTERRUPTS  0066 0000 F 0115 0068 02E0 LWPI WRKSP1 USE VDP WORKSPACE 1  006A 8320  0116 H 0117 006C 0200 LI R0,>0002 SET BIT 6 OF VDP REG 0  006E 0002 & 0118 0070 06A0 BL @VWTR  0072 029A'  0119 N 0120 0074 0200 LI R0,>0206 MOVE SCREEN IMAGE TABLE TO >18 0076 0206 & 0121 0078 06A0 BL @VWTR  007A 029A'  0122 L 0123 007C 0200 LI R0,>03FF MOVE COLOR TABLE TO >2000  007E 03FF & 0124 0080 06A0 BL @VWTR  0082 029A'  0125 N 0126 0084 0200 LI R0,>0403 PATTERN DESCRIPTOR TABLE TO >0 0086 0403 & 0127 0088 06A0 BL @VWTR  008A 029A'  0128 N 0129 008C 0200 LI R0,>0536 MOVE SPRITE ATTRIBUTE LIST TO  008E 0536 & 0130 0090 06A0 BL @VWTR  0092 029A'  0131 H 0132 0094 0200 LI R0,>1B00 DISABLE UNUSED SPRITES  0096 1B00 > 0133 0098 0201 LI R1,>D000 ALL SPRITES  009A D000 & 0134 009C 06A0 BL @VSBW  009E 0232'  0135 B 0136 * WRITE 0 TO ALL SCREEN IMAGE TABLE LOCATIONS.   99/4 ASSEMBLERFVERSION 1.2 PAGE 0004 0137 * N 0138 00A0 0200 LI R0,>1800 ADDRESS OF SCREEN IMAGE TABLE  00A2 1800 L 0139 00A4 04C1 CLR R1 VALUE TO WRITE - ALL ZERO N 0140 00A6 0202 LI R2,>300 NUMBER OF TIMES TO WRITE ZERO  00A8 0300 & 0141 00AA 06A0 BL @VSMW  00AC 0236'  0142 4 0143 * CLEAR PATTERN DESCRIPTOR TABLE  0144 * F 0145 00AE 04C0 CLR R0 ADDRESS OF PDT >0000 L 0146 00B0 04C1 CLR R1 VALUE TO WRITE - ALL ZERO N 0147 00B2 0202 LI R2,>1800 NUMBER OF TIMES TO WRITE ZERO  00B4 1800 & 0148 00B6 06A0 BL @VSMW  00B8 0236'  0149 ( 0150 * CLEAR COLOR TABLE  0151 * N 0152 00BA 0200 LI R0,>2000 ADDRESS OF COLOR TABLE >2000  00BC 2000 N 0153 00BE 0201 LI R1,>1000 DEFAULT COLOR IS BLACK ON TRAN 00C0 1000 N 0154 00C2 0202 LI R2,>1800 NUMER OF TIMES TO WRITE COLOR  00C4 1800 & 0155 00C6 06A0 BL @VSMW  00C8 0236'  0156  0157 ** 0158 * INITIALIZE  0159 **  0160 2 0161 * WRITE CHARACTER DEFINITIONS  0162 * N 0163 * USING THE SCREEN AS A NORMAL GRAPHICS MODE MEANS WE HAVE TN 0164 * THE SAME CHARACTER DEFINITIONS IN THE PDT FOR EACH 1/3RD O 0165 * SCREEN. @ 0166 00CA 04C0 CLR R0 ADDRESS OF PDT N 0167 00CC 0203 LI R3,3 3 BANKS OF 256 CHARACTER DEFIN 00CE 0003 F 0168 00D0 0201 INIT1 LI R1,CBLANK SRC ADDRESS OF DATA  00D2 0008' J 0169 00D4 0202 LI R2,CHREND-CBLANK NUMBER OF BYTES TO WRITE  00D6 0028 N 0170 00D8 0A12 SLA R2,1 CONVERT NUMBER OR WORDS TO NUMN 0171 00DA 06A0 BL @VMBW WRITE CHARACTER DEFINITIONS  00DC 0250' N 0172 00DE 0220 AI R0,>0800 PREVIOUS GROUP (2ND OR 1ST)  00E0 0800 " 0173 00E2 0603 DEC R3 & 0174 00E4 16F5 JNE INIT1  0175 J 0176 * FIX UP DIRECTION TABLE FOR Y MOVEMENT (WHOLE LINES)  0177 * N 0178 00E6 C820 MOV @SX,@PY STORE THE LENGTH OF ONE ROW  00E8 0030'  00EA 0054' N 0179 00EC 05E0 INCT @PY ACCOUNT FOR THE BOUNDRY - 1 BY  99/4 ASSEMBLERFVERSION 1.2 PAGE 0005 00EE 0054' N 0180 00F0 0560 INV @PY MAKE THE VALUE NEGATIVE - Y UP 00F2 0054'  0181 N 0182 00F4 C820 MOV @SX,@PY+2 STORE THE LENGTH OF ONE ROW  00F6 0030'  00F8 0056' N 0183 00FA 05E0 INCT @PY+2 ACCOUNT FOR THE BOUNDRY - 1 BY 00FC 0056'  0184 , 0185 * INITIALIZE MAZE ARRAY  0186 * 8 0187 00FE C020 MOV @SX,R0 X SIZE  0100 0030' 8 0188 0102 C060 MOV @SY,R1 Y SIZE  0104 0032' J 0189 0106 05C0 INCT R0 ACCOUNT FOR THE BOUNDRY " 0190 0108 05C1 INCT R1 N 0191 010A 3840 MPY R0,R1 SIZE IN R2 SHOULD NEVER BE GT N 0192 010C 0201 LI R1,>FFFF TWO BYTES WITH VALUES OF -1  010E FFFF 0 0193 0110 C881 INIT2 MOV R1,@HKMAZE-2(R2)  0112 02A8' " 0194 0114 0642 DECT R2 & 0195 0116 16FC JNE INIT2  0196 * 0197 * INIT VALID MAZE AREA @ 0198 0118 C020 MOV @SY,R0 NUMBER OF ROWS  011A 0032' D 0199 011C 04C1 CLR R1 INITIAL CELL VALUE H 0200 011E 0202 LI R2,HKMAZE LOCATION OF MAZE DATA  0120 02AA' < 0201 0122 A0A0 A @SX,R2 ROW LENGTH  0124 0030' N 0202 0126 05C2 INCT R2 PASS 1ST ROW LEFT AND RIGHT BOL 0203 0128 0582 INC R2 PASS 2ND ROW LEFT BOUNDRY @ 0204 012A C0E0 INIT3 MOV @SX,R3 LENGTH OF ROW  012C 0030' < 0205 012E DC81 INIT4 MOVB R1,*R2+ INIT CELL N 0206 0130 0603 DEC R3 COUNT DOWN CELLS IN CURRENT RO8 0207 0132 16FD JNE INIT4 DONE? F 0208 0134 05C2 INCT R2 MOVE PAST BOUNDRIES N 0209 0136 0600 DEC R0 COUNT DOWN ROWS INITIALIZED 8 0210 0138 16F8 JNE INIT3 DONE?  0211 $ 0212 * R6 CURRENT LOC " 0213 * R7 NEXT LOC & 0214 * R10 CURRENT DIR  0215 & 0216 * INITIAL POSITION * 0217 013A 0206 LI R6,HKMAZE  013C 02AA' & 0218 013E 0226 AI R6,400  0140 0190  0219 0 0220 * 420 D=INT(RND*3)+1 :: D1=D D 0221 0142 06A0 RNDDIR BL @RANDNO GET RANDOM NUMBER  0144 020A' , 0222 0146 C2A0 MOV @RAND16,R10   99/4 ASSEMBLERFVERSION 1.2 PAGE 0006 0148 83C0 @ 0223 014A 09EA SRL R10,14 CONVERT TO 0-3 L 0224 014C D820 MOVB @W1RALB,@D1 REMEMBER INITIAL DIRECTION  014E 8335  0150 003E'  0225 4 0226 * 430 NX=X+P(D,1) :: NY=Y+P(D,2) & 0227 0152 C1C6 NEWLOC MOV R6,R7 , 0228 0154 A1EA A @PX(R10),R7  0156 004C' , 0229 0158 A1EA A @PY(R10),R7  015A 0054'  0230 4 0231 * 440 IF MAZE(NX,NY)<>0 THEN 550 * 0232 015C 9817 CB *R7,@ZERO  015E 0041' & 0233 0160 1606 JNE NEWDIR  0234 8 0235 * 450 MAZE(X,Y)=MAZE(X,Y) OR DBIT(D) . 0236 0162 F5AA SOCB @DBIT(R10),*R6  0164 005C'  0237  0238 * 460 C=99 : 0239 * 470 IF (MAZE(X,Y) AND 2)=2 THEN C=98 N 0240 * 480 IF (MAZE(X,Y) AND 4)=4 THEN IF C=98 THEN C=96 ELSE C=96 0241 * 490 CALL HCHAR(OY+Y-1,OX+X-1,C)  0242 < 0243 * 500 X=NX :: Y=NY :: MAZE(X,Y)=DINV(D) & 0244 0166 C187 MOV R7,R6 . 0245 0168 D5AA MOVB @DINV(R10),*R6  016A 0060'  0246 " 0247 * 510 GOTO 420 & 0248 016C 10EA JMP RNDDIR  0249 2 0250 * 550 D=D+1 :: IF D>4 THEN D=1 $ 0251 016E 058A NEWDIR INC R10 & 0252 0170 028A CI R10,4  0172 0004 & 0253 0174 1601 JNE LASTDR $ 0254 0176 04CA CLR R10  0255 , 0256 * 560 IF D<>D1 THEN 430 , 0257 0178 9820 LASTDR CB @D1,@W1RALB  017A 003E'  017C 8335 & 0258 017E 16E9 JNE NEWLOC  0259  0260 * 600 C=99 : 0261 * 610 IF (MAZE(X,Y) AND 2)=2 THEN C=98 N 0262 * 620 IF (MAZE(X,Y) AND 4)=4 THEN IF C=98 THEN C=96 ELSE C=96 0263 * 630 CALL HCHAR(OY+Y-1,OX+X-1,C)  0264 4 0265 * 640 MAZE(X,Y)=MAZE(X,Y) OR 16 , 0266 0180 F5A0 SOCB @CELLC+1,*R6  0182 004B'  0267 " 0268 * 700 RESET=0 . 0269 0184 D820 MOVB @ZERO,@HRESET   99/4 ASSEMBLERFVERSION 1.2 PAGE 0007 0186 0041'  0188 003C'  0270 F 0271 * 710 FOR J=HY TO SY :: DISPLAY AT(1,1):"HUNT: ";J ( 0272 * 720 FOR I=HX TO SX B 0273 * 730 IF MAZE(I,J)=0 THEN RESET=1 :: GOTO 800 4 0274 * 740 IF MAZE(I,J)>=16 THEN 800  0275 $ 0276 * 750 X=I :: Y=J H 0277 * 760 IF RESET=0 THEN HX=I :: HY=J ELSE HX=1 :: HY=1 0 0278 * 770 DISPLAY AT(1,1):"KILL" & 0279 * 780 D=4 :: D1=4 " 0280 * 790 GOTO 430  0281 0282 * 800 NEXT I  0283 * 810 HX=1 0284 * 820 NEXT J  0285 0 0286 * 900 DISPLAY AT(1,1):"DONE" < 0287 * 910 CALL KEY(0,K,S) :: IF S=0 THEN 910  0288  0289 * 1000 END  0290  0291 D 0292 018A 0200 LI R0,>1800+400 SCREEN IMAGE TABLE  018C 1990 ( 0293 018E 0201 LI R1,>0400  0190 0400 & 0294 0192 06A0 BL @VSBW  0194 0232'  0295 & 0296 0196 0220 AI R0,-32  0198 FFE0 & 0297 019A 06A0 BL @VSBW  019C 0232'  0298 $ 0299 019E 04CA CLR R10 , 0300 01A0 A02A A @PX(R10),R0  01A2 004C' , 0301 01A4 A02A A @PY(R10),R0  01A6 0054' & 0302 01A8 06A0 BL @VSBW  01AA 0232'  0303 $ 0304 01AC 102B JMP DONE  0305  0306  0307 * TEST D 0308 01AE 0200 LI R0,>1800 SCREEN IMAGE TABLE  01B0 1800 N 0309 01B2 D820 MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE 01B4 8321  01B6 8C02 N 0310 01B8 0260 ORI R0,>4000 SET READ/WRITE BITS 14 AND 15  01BA 4000 N 0311 01BC D800 MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRIT 01BE 8C02  0312 * 0313 01C0 0203 LI R3,HKMAZE   99/4 ASSEMBLERFVERSION 1.2 PAGE 0008 01C2 02AA' ( 0314 01C4 0204 LI R4,>300  01C6 0300 " 0315 01C8 04C1 TEST1 CLR R1 ( 0316 01CA D073 MOVB *R3+,R1 ( 0317 01CC 9801 CB R1,@NEG1  01CE 0040' & 0318 01D0 1603 JNE TEST2 ( 0319 01D2 0201 LI R1,>0400  01D4 0400 & 0320 01D6 1012 JMP TEST8 ( 0321 01D8 9801 TEST2 CB R1,@ZERO  01DA 0041' & 0322 01DC 1603 JNE TEST3 ( 0323 01DE 0201 LI R1,>0300  01E0 0300 & 0324 01E2 100C JMP TEST8 " 0325 01E4 04C5 TEST3 CLR R5 * 0326 01E6 2060 COC @CELLR,R1  01E8 0044' & 0327 01EA 1301 JEQ TEST4 " 0328 01EC 0585 INC R5 * 0329 01EE 2060 TEST4 COC @CELLB,R1  01F0 0046' & 0330 01F2 1302 JEQ TEST5 $ 0331 01F4 0225 AI R5,2  01F6 0002 & 0332 01F8 C045 TEST5 MOV R5,R1 " 0333 01FA 06C1 SWPB R1 H 0334 01FC D801 TEST8 MOVB R1,@VDPWD WRITE BYTE TO VDP RAM  01FE 8C00 " 0335 0200 0604 DEC R4 & 0336 0202 16E2 JNE TEST1  0337  0338 D 0339 0204 0300 DONE LIMI 2 ENABLE INTERRUPTS  0206 0002 $ 0340 0208 10FF QUIT JMP QUIT  0341  0342  0343  0344  0345 ***  0346 * " 0347 * SUBROUTINES  0348 *  0349 ***  0350  0351 ** $ 0352 * RANDOM NUMBERS  0353 **  0354 H 0355 * GENERATES A RANDOM NUMBER AND PLACES IT IN RAND16  0356 * ( 0357 020A 0204 RANDNO LI R4,28645  020C 6FE5 * 0358 020E 3920 MPY @RAND16,R4  0210 83C0 ( 0359 0212 0225 AI R5,31417   99/4 ASSEMBLERFVERSION 1.2 PAGE 0009 0214 7AB9 * 0360 0216 C805 MOV R5,@RAND16  0218 83C0  0361 021A 045B RT  0362 * 0363 * PIXEL OFFSET ADDRESS  0364 * N 0365 * Calculate a byte and bit offset in bitmap mode. The regisN 0366 * is such that when done R0 contains the address offset for N 0367 * the existing byte from the pattern descriptor table into RN 0368 * set the correct pixel and write back to the pattern descri 0369 * table.  0370 * 4 0371 * R4 = Column (X), R5 = Row (Y) : 0372 * R0 = Byte Offset, R3 = Bit to Change  0373 * < 0374 021C C005 PXADDR MOV R5,R0 ROW TO R0 N 0375 021E 0A50 SLA R0,5 DIV ROW BY 8 AND MUL BY 256 J 0376 0220 E005 SOC R5,R0 ADD REMAINDER TO OFFSET F 0377 0222 0240 ANDI R0,>FF07 ADJUST FOR DIVISION  0224 FF07 < 0378 0226 C0C4 MOV R4,R3 COL TO R3 > 0379 0228 0243 ANDI R3,7 COL MODULO 8  022A 0007 D 0380 022C A004 A R4,R0 ADD COL TO OFFSET J 0381 022E 6003 S R3,R0 ADJUST BY COL REMAINDER  0382 0230 045B RT  0383  0384  0385 ** " 0386 * VDP ROUTINES  0387 **  0388 D 0389 * Uses a dedicated workspace in fast 16-bit RAM.  0390 * . 0391 * General register use is: 4 0392 * R0 VDP RAM starting address. N 0393 * R1 MSB contains the value to write or to receive a valueN 0394 * For multipe byte reads/writes, contains the CPU buffeL 0395 * R2 Counter (counts down) for multiple reads/writes.  0396  0397 * & 0398 * WRITING VDP DATA  0399 *  0400 H 0401 * VDP SINGLE BYTE WRITE - SINGLE BYTE MULTIPLE WRITE  0402 * N 0403 * Writes the value in the most-significant byte of R1 to theN 0404 * VDP RAM address indicated in R0. For VSMW, the value in RN 0405 * determines how many times to write the byte. This is veryN 0406 * useful when initializing large amounts of VDP RAM for thinL 0407 * such as clearing the screen or setting up bitmap mode.  0408 * N 0409 0232 0202 VSBW LI R2,1 FORCE THE BYTE COUNT TO 1 FOR  0234 0001 N 0410 0236 D820 VSMW MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE 0238 8321  023A 8C02 N 0411 023C 0260 ORI R0,>4000 SET READ/WRITE BITS 14 AND 15   99/4 ASSEMBLERFVERSION 1.2 PAGE 0010 023E 4000 N 0412 0240 D800 MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRIT 0242 8C02 B 0413 0244 1000 NOP WAIT FOR THE VDP H 0414 0246 D801 VSMWLP MOVB R1,@VDPWD WRITE BYTE TO VDP RAM  0248 8C00 > 0415 024A 0602 DEC R2 BYTE COUNTER @ 0416 024C 16FC JNE VSMWLP CHECK IF DONE  0417 024E 045B RT  0418 . 0419 * VDP MULTIPLE BYTE WRITE  0420 * N 0421 * Writes the number of bytes indicated in R2 from the CPU RAN 0422 * starting at the address indicated by R1 and places them inJ 0423 * the VDP RAM starting at the address indicated by R0.  0424 * N 0425 0250 D820 VMBW MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE 0252 8321  0254 8C02 N 0426 0256 0260 ORI R0,>4000 SET READ/WRITE BITS 14 AND 15  0258 4000 N 0427 025A D800 MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRIT 025C 8C02 B 0428 025E 1000 NOP WAIT FOR THE VDP H 0429 0260 D831 VMBWLP MOVB *R1+,@VDPWD WRITE BYTE TO VDP RAM  0262 8C00 > 0430 0264 0602 DEC R2 BYTE COUNTER @ 0431 0266 16FC JNE VMBWLP CHECK IF DONE  0432 0268 045B RT  0433  0434  0435 * & 0436 * READING VDP DATA  0437 *  0438 * 0439 * VDP SINGLE BYTE READ  0440 * N 0441 * Reads a byte from VDP RAM address indicated in R0 and plac< 0442 * it in the most-significate byte of R1.  0443 * N 0444 026A D820 VSBR MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE 026C 8321  026E 8C02 N 0445 0270 0240 ANDI R0,>3FFF SET READ/WRITE BITS 14 AND 15  0272 3FFF N 0446 0274 D800 MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRIT 0276 8C02 B 0447 0278 1000 NOP WAIT FOR THE VDP H 0448 027A D060 MOVB @VDPRD,R1 READ BYTE FROM VDP RAM  027C 8800  0449 027E 045B RT  0450 , 0451 * VDP MULTIPLE BYTE READ  0452 * N 0453 * Reads the number of bytes indicated in R2 from the VDP RAMN 0454 * starting at the address indicated by R0 and places them inJ 0455 * the CPU RAM starting at the address indicated by R1.  0456 * N 0457 0280 D820 VMBR MOVB @W1R0LB,@VDPWA SEND LOW BYTE OF VDP RAM WRITE  99/4 ASSEMBLERFVERSION 1.2 PAGE 0011 0282 8321  0284 8C02 N 0458 0286 0240 ANDI R0,>3FFF SET READ/WRITE BITS 14 AND 15  0288 3FFF N 0459 028A D800 MOVB R0,@VDPWA SEND HIGH BYTE OF VDP RAM WRIT 028C 8C02 B 0460 028E 1000 NOP WAIT FOR THE VDP H 0461 0290 DC60 VMBRLP MOVB @VDPRD,*R1+ READ BYTE FROM VDP RAM  0292 8800 > 0462 0294 0602 DEC R2 BYTE COUNTER D 0463 0296 16FC JNE VMBRLP CHECK IF FINISHED  0464 0298 045B RT  0465  0466  0467 * $ 0468 * VDP REGISTERS  0469 *  0470 , 0471 * VDP WRITE TO REGISTER  0472 * N 0473 * Writes the value in the least-significant byte of R0 to thL 0474 * register indicated in the most-significate byte of R0.  0475 * N 0476 029A D820 VWTR MOVB @W1R0LB,@VDPWA SEND LOW BYTE (VALUE) TO WRITE 029C 8321  029E 8C02 N 0477 02A0 0260 ORI R0,>8000 SET UP A VDP REGISTER WRITE OP 02A2 8000 N 0478 02A4 D800 MOVB R0,@VDPWA SEND HIGH BYTE (ADDRESS) OF VD 02A6 8C02  0479 02A8 045B RT  0480 H 0481 02AA 0000 HKMAZE DATA 0 START ADDRESS OF MAZE  0482 END   99/4 ASSEMBLERFVERSION 1.2 PAGE 0012J ' C 003F ' CBLANK 0008 ' CBLOCK 0028 ' CBOTTM 0018 J ' CELLB 0046 ' CELLC 004A ' CELLL 0048 ' CELLR 0044 J ' CELLT 0042 ' CHREND 0030 ' CINIT 0020 ' CRIGHT 0010 J ' D 003D ' D1 003E ' DBIT 005C ' DINV 0060 J ' DONE 0204 HIMEM A000 D HK 0064 ' HKMAZE 02AA J ' HRESET 003C ' HX 003A ' HY 003B ' INIT1 00D0 J ' INIT2 0110 ' INIT3 012A ' INIT4 012E ' LASTDR 0178 J ' NEG1 0040 ' NEWDIR 016E ' NEWLOC 0152 ' NX 0038 J ' NY 0039 ' OX 0034 ' OY 0035 ' PLUT 0000 J ' PX 004C ' PXADDR 021C ' PY 0054 ' QUIT 0208 J R0 0000 R1 0001 R10 000A R11 000B J R12 000C R13 000D R14 000E R15 000F J R2 0002 R3 0003 R4 0004 R5 0005 J R6 0006 R7 0007 R8 0008 R9 0009 J RAND16 83C0 ' RANDNO 020A RANDOM 83C1 ' RNDDIR 0142 J ' SX 0030 SXMAX 0080 ' SY 0032 SYMAX 0060 J ' TEST1 01C8 ' TEST2 01D8 ' TEST3 01E4 ' TEST4 01EE J ' TEST5 01F8 ' TEST8 01FC VDPRD 8800 VDPSTA 8802 J VDPWA 8C02 VDPWD 8C00 ' VMBR 0280 ' VMBRLP 0290 J ' VMBW 0250 ' VMBWLP 0260 VR1CPY 83D4 ' VSBR 026A J ' VSBW 0232 ' VSMW 0236 ' VSMWLP 0246 ' VWTR 029A J W1R0LB 8321 W1R1LB 8323 W1R2LB 8325 W1R3LB 8327 J W1R4LB 8329 W1R5LB 832B W1R6LB 832D W1R7LB 832F J W1R8LB 8331 W1R9LB 8333 W1RALB 8335 WRKSP0 8300 J WRKSP1 8320 ' X 0036 ' Y 0037 ' ZERO 0041 0000 ERRORS