NAM TREKBOER * * V1.0 - INITIALLY COMPLETE * * V1.1 - CHANGE GRATE IN ROOM * 31 TO READ "A GRATE * ACROSS THE STREAM" TO * AVOID CONFUSION WHEN * POURING ACID TO REMOVE * THE GRATE. (11/12/84) * * V1.2 - CORRECT BEEP ROUTINE * TO PREVENT SENDING * CODE TO PRINTER * (03/26/2000) * * CHANGED TAPE TO DISK * ROUTINES FOR LOAD/SAVE * RETAINED NMI VECTOR * (03/26/2000) * * DSCKON OPCODES * READ EQU 2 WRITE EQU 3 * ORG $0400 *GSCRN EQU * GSCRN EQU $8400 * VERB/NOUN COMPARE LENGTH MAXWRD EQU 4 * MAX OBJECTS ALLOWED TO CARRY MAXOBJ EQU 5 * MAX # MOVABLE OVERLAYS/OBJ MVOBMX EQU 2 * SIZE OF ROOM TABLE ENTRY RMSIZE EQU 6 * NUMBER OF ROOMS IN ADV NORMS EQU 41 NUMBER OF ROOMS * ROOM TO STORE TREASURES IN TRESRM EQU 99 INV EQU $80 BLACK EQU 0 BLUE EQU 1 RED EQU 2 WHITE EQU 3 MAXPNT EQU 1 * SWITCHES TO ENABLE/DISABLE * UTILITY ROUTINES * * SET TO ZERO TO ENABLE RTN R.SRIT EQU 0 SCROLL RIGHT R.SLFT EQU 0 SCROLL LEFT R.SUP EQU 0 SCROLL UP R.SDN EQU 1 SCROLL DOWN R.SFLP EQU 0 FLIP COLORS R.RVIS EQU 1 MAKE ROOM VISIBLE R.PNRM EQU 0 PUT 'N ROOM R.XFOB EQU 1 XFER MOVABLE OBJ R.FIND EQU 0 FIND OBJ IN GAME R.XCHG EQU 0 CHG OBJ IN GAME C.THE EQU $80 C.SMAL EQU $81 C.ARE EQU $82 C.SEE EQU $83 C.CANT EQU $84 C.DONT EQU $85 C.LARG EQU $86 C.IM EQU $87 C.INA EQU $88 C.ONA EQU $89 C.ISA EQU $8A C.IITS EQU $8B C.TTHE EQU $8C C.IS EQU $8D C.AND EQU $8E C.AN EQU $8F C.AT EQU $90 C.OF EQU $91 C.ITSA EQU $92 C.TREK EQU $93 * MACROS * DISABLE IRQ DI MACR ORCC #$50 ENDM * ENABLE IRQ EI MACR ANDC #$EF ENDM * DEFINE AN OVERLAY POINTER DEFOVL MACR OVERLAY,ROW,COL IFEQ \1 FAIL "ZERO ROW COORDINATE" ENDC IFEQ \2 FAIL "ZERO COL COORDINATE" ENDC IFLT (90-\1)!+(128-\2) FAIL "INVALID ROW OR COL" ENDC FDB \0 FDB GSCRN+((\1-1)*32)+(\2-1)/4-32 ENDM * CALC ROW/COL ADDR ON SCREEN * AND PLACE RESULT IN X-REG CALCX MACR ROW,COL IFEQ \0 FAIL "ZERO ROW COORDINATE" ENDC IFEQ \1 FAIL "ZERO COL COORDINATE" ENDC IFLT (90-\0)!+(128-\1) FAIL "INVALID ROW OR COL" ENDC LDX #(\0-1)*32+(\1-1)/4+GSCRN ENDM * CALC WIDTH & # OF LINES FOR * AND OVERLAY AND PLACE IN D-REG CALCD MACR ROW1,COL1,ROW2,COL2 IFEQ \0 FAIL "ZERO ROW COORDINATE" ENDC IFEQ \1 FAIL "ZERO COL COORDINATE" ENDC IFEQ \2 FAIL "ZERO ROW COORDINATE" ENDC IFEQ \3 FAIL "ZERO COL COORDINATE" ENDC IFLT (90-\0)!+(90-\2) FAIL "INVALID ROW" ENDC IFLT (128-\1)!+(128-\3) FAIL "INVALID COLUMN" ENDC IFLT \2-\0 FAIL "ENDING ROW < STARTING" ENDC IFLT \3-\1 FAIL "ENDING COL < STARTING" ENDC \.AA SET (\3/4)-((\1-1)/4) \.BB SET \2-\0+1 LDD #\.AA*256+\.BB ENDM ORG $0000 ROOM RMB 1 RANDOM RMB 1 NEWRM RMB 1 VERBNO RMB 1 NOUNNO RMB 1 VERB RMB MAXWRD NOUN RMB MAXWRD MSGLNS RMB 1 CLRSW RMB 1 COLOR1 RMB 1 COLOR2 RMB 1 FLIPSW RMB 1 FLIPCT RMB 2 FLP2SW RMB 1 FLP2CT RMB 2 LITESW RMB 1 LITECT RMB 1 BRIDSW RMB 1 CAPSW RMB 1 DOORSW RMB 1 LITE OVER DOOR SPIDSW RMB 1 UNCONSCIOUS SPIDER RMMOVE RMB 1 SCRTOP RMB 2 POINTS RMB 1 SCORE RMB 2 OBJCNT RMB 1 OBJECT RMB MAXOBJ * * ADVENTURE UNIQUE VARIABLES * * SETNXT RMB 1 ROOM FOR SET COORD SETNX2 RMB 1 ROOM FOR WARP ENDVAR EQU * * JUMP VECTORS CURPOS RMB 3 CLS RMB 3 CHROUT RMB 3 DISPLY RMB 3 GETLIN RMB 3 BADINP RMB 3 REPLY RMB 3 SCNKEY RMB 3 PERIOD RMB 3 CHGOBJ RMB 3 CKOBJ RMB 3 MAKVIS RMB 3 GIVOBJ RMB 3 REPOBJ RMB 3 HAVOBJ RMB 3 GETOBJ RMB 3 PUTOBJ RMB 3 IFEQ R.RVIS RMVIS RMB 3 ENDC CKDRAW RMB 3 DRAWSC RMB 3 LOCOBJ RMB 3 * REORG no longer needed ORG $0E00 * JMP VECTORS STORAGE SJMPS EQU * JMP VEC01 CURPOS JMP VEC02 CLS JMP VEC03 CHROUT JMP VEC04 DISPLY JMP VEC05 GETLIN JMP VEC06 BADINP JMP VEC07 REPLY JMP VEC08 SCNKEY JMP VEC09 PERIOD JMP VEC10 CHGOBJ JMP VEC11 CKOBJ JMP VEC12 MAKVIS JMP VEC13 GIVOBJ JMP VEC14 REPOBJ JMP VEC15 HAVOBJ JMP VEC16 GETOBJ JMP VEC17 PUTOBJ IFEQ R.RVIS JMP VEC18 RMVIS ENDC JMP VEC19 CKDRAW JMP VEC20 DRAWSC JMP VEC21 LOCOBJ EJMPS EQU * * REORG no longer needed * RMB 6144 SCREEN MEMORY see next line ORG $1C00 START EQU * DI LDS #GSCRN LDX #8000 DI A@ STA $FFDE LDD ,X STA $FFDF STD ,X++ CMPX #$E000 BNE A@ EI * BUILD THE ROOM SAVE TABLE * IN HIGH MEMORY LDY #$8000 LDX #RMOBT1 A@ LDA ,X+ STA ,-Y CMPX #RMOBT2 BLO A@ LDX #PNTTAB B@ LDD ,X++ STD ,--Y TSTA BNE B@ * COLD START INITIALIZATION LDA #1 INIT VARIABLES STA ROOM LDX #NEWRM LDB #ENDVAR-NEWRM CLRA E@ STA ,X+ DECB BNE E@ LDY #SJMPS LDB #(EJMPS-SJMPS)/3 D@ LDA ,Y+ STA ,X+ LDU ,Y++ STU ,X++ DECB BNE D@ * WARM START INITIALIZATION WARM EQU * DI LDS #GSCRN STS SCRTOP LDX #FIRQ SETUP FIRQ VECTOR STX $010D * STX $010A NEEDED FOR DISK I/O STX $0110 LDA #$55 SETUP RESET VECTOR STA $0071 LDX #RESET STX $0072 CLR $FF40 * INITIALIZATION PARTICULAR * TO CURRENT ADVENTURE LDA #16 TRAP ROOM IN SPACE STA SETNXT STA SETNX2 LDD #'4*256+'2 STD SAVCOR LDD #'9*256+'9 STD SAVCOR+2 * RESET INITIALIZATION RESET NOP STA $FFDF RAM MODE LDS #GSCRN STS SCRTOP LDA #$34 STA $FF21 STA $FF23 STA $FF01 INCA STA $FF03 LDA $FF02 LDA #$FF STA $FF22 STA $FFC0 STA $FFC3 STA $FFC5 LDD #GSCRN LSRA LDX #$FFC6 LDB #7 C@ LSRA BCS A@ STB ,X++ BRA B@ A@ STB 1,X LEAX 2,X B@ DECB BNE C@ CLR NOUNNO LDX #GSCRN LDY #6144 LDD #$5555 D@ STD ,X++ LEAY -2,Y BNE D@ E@ JSR [$A000] BEQ E@ LDX #BOMBIT STX $0072 JSR CLS LDU #SCRN00 JSR SHOSCR LDX #VERSN JSR DISPLY LDD #$0100 STD ROWCOL LDX #MDPCRE JSR DISPLY LDD #$0D00 STD ROWCOL LDX #CREDIT JSR DISPLY G@ LDX FLIPCT LEAX 1,X STX FLIPCT CMPX #800 BLO N@ CLR FLIPCT CLR FLIPCT+1 LDA #RED STA COLOR1 LDA #BLUE STA COLOR2 LDX #GSCRN+(56*32) LDD #$2029 JSR FLPCLR N@ JSR [$A000] BEQ G@ CLR SCORE EI JMP VLOOK BOMBIT EQU * NOP DI LDX #NEWGAM STX $0072 A@ CLR ,X+ CMPX #$8000 BLO A@ B@ BRA B@ * WARM GAME RESET ROUTINE NEWGAM EQU * LDY #$8000 LDX #RMOBT1 A@ LDA ,-Y STA ,X+ CMPX #RMOBT2 BLO A@ LDX #PNTTAB B@ LDD ,--Y STD ,X++ TSTA BNE B@ CLR ROOM INC ROOM LDX #NEWRM LDB #ENDVAR-NEWRM CLRA C@ STA ,X+ DECB BNE C@ JMP WARM FIRQ EQU * JSR CHKANT INC RANDOM TST $FF00 TST $FF02 RTI INCL ADVENT00/TXT:1 INCL ADVENT01/TXT:1 INCL ADVENT02/TXT:1 INCL ADVENT03/TXT:1 INCL ADVENT05/TXT:1 INCL ADVENT04/TXT:1 INCL SCREENS/TXT:1 INCL OVERLAY1/TXT:1 INCL OVERLAY2/TXT:1 VERSN FCC 'V1.2',0 MDPCRE EQU * FCB ' +$80,' +$80,' +$80 FCC ' MAR','K+$80 FCC 'DAT','A+$80 FCC 'PRODUCTS',13,13 FCB 6[$A0] FCC 'presents',0 CREDIT EQU * FCB 7[' +$80] FCC 'By',':+$80,13,13,' +$80 FCC 'Stephe','n+$80 FCC .O'De.,'a+$80 FCB '&+$80 FCC 'Bo','b+$80 FCC 'Withers' FCB 13,13,13 FCB ' +$80,' +$80,' +$80 FCC ' Copyrigh','t+$80 FCB $5C+$80 COPYRIGHT FCC '1984',13 FCB ' +$80 FCC 'Bo','b+$80 FCC 'Wither','s+$80,'&+$80 FCC 'Stephe','n+$80 FCC .O'Dea. FCB 13,3[$A0] FCC 'Al','l+$80 FCC 'Right','s+$80 FCC 'Reserved',0 INCL ASCLNO/TXT:1 ******************************* * * GENERAL PURPOSE STRING MOVE * ******************************* MOVE EQU * DI PSHS D,X,Y A@ LDA ,X+ STA ,Y+ DECB BNE A@ EI PULS D,X,Y,PC ******************************* * * DISPLAY COMPRESSED HI-RES * SCREEN ON VIDEO * * INPUT: U = PNTR TO SCREEN * OUTPUT: NONE * ******************************* SHOSCR EQU * JSR CLS SHOSC2 EQU * DI PSHS D,X,U LEAU 1,U LDX #GSCRN A@ LDB ,U+ BEQ C@ CMPB #$FF BEQ E@ B@ LDA ,U+ STA ,X+ DECB BNE B@ BRA A@ C@ LDB ,U+ BEQ F@ LDA ,U+ D@ STA ,X+ DECB BNE D@ BRA A@ EI E@ PULS D,X,U,PC * * PROCESS SPECIAL 6 BYTE * REPEAT DESCRIPTOR * F@ LDB ,U+ LINE LEN STB REFRCT LDA ,U+ NUMBER OF LINES STA NLNSCT LDD ,U++ COLOR BYTES STD BYTE G@ LDA BYTE LDB REFRCT H@ STA ,X+ DECB BNE H@ LDD BYTE EXG A,B STD BYTE DEC NLNSCT BNE G@ BRA A@ ******************************* * * DISPLAY GRAPHIC OBJECT ON * EXISTING SCREEN * INPUT: X = PNTR TO OBJECT * ******************************* SHOOBJ EQU * PSHS D,X,Y,U DI JSR PNTRM2 SHOW PERM OVERLAYS LEAX 1,X A@ LDA ,X+ BEQ B@ BSR SHOOVL BRA A@ B@ JSR PNTRM1 SHOW MOVABLE OVLY C@ LDA ,X+ BEQ J@ BMI C@ LDY #MOVOBJ D@ TST ,Y BEQ C@ CMPA ,Y+ BNE H@ TFR Y,U LEAY MVOBMX,Y E@ LDB ,Y+ BEQ D@ CMPB ROOM BNE E@ LDB #MVOBMX F@ LDA ,U+ BEQ G@ BSR SHOOVL G@ DECB BNE F@ BRA C@ H@ LEAY MVOBMX,Y I@ TST ,Y+ BNE I@ BRA D@ J@ EI PULS D,X,Y,U,PC * SHOW AN OVERLAY * INPUT: A = OVERLAY # SHOOVL PSHS D,X,Y,U CLR MODE DECA TFR A,B CLRA LSLB ROLA LSLB ROLA LDU #SCROBJ LEAU D,U LDD 2,U STD H@ LDU ,U LDB ,U+ STB G@ E@ LDB G@ LDX H@ LEAX 32,X STX H@ F@ BSR OBJBYT STA ,X+ DECB BNE F@ BRA E@ G@ FCB 0 LINE LEN H@ FDB 0 SCREEN PNTR OBJBYT EQU * PSHS B,X,Y LDA MODE BEQ E@ CMPA #3 BEQ I@ DECA BEQ D@ LDB COUNT A@ LDA ,U+ B@ DECB BNE C@ CLR MODE C@ STB COUNT PULS B,X,Y,PC D@ LDB COUNT LDA BYTE BRA B@ E@ LDA ,U+ BEQ F@ CMPA #$FF BEQ G@ TFR A,B LDA #2 STA MODE BRA A@ F@ LDB ,U+ BEQ H@ SPECIAL DESCRIPTOR LDA #1 STA MODE LDA ,U+ STA BYTE BRA B@ G@ PULS B,X,Y LEAS 2,S PULS D,X,Y,U,PC * * PROCESS SPECIAL DESCRIPTOR * H@ LDA #3 STA MODE LDA ,U+ LINE LEN STA COUNT STA REFRCT LDA ,U+ # LINES STA NLNSCT LDD ,U++ STD BYTE I@ LDA BYTE LDB COUNT DECB BNE C@ PSHS A LDD BYTE EXG A,B STD BYTE PULS A LDB REFRCT DEC NLNSCT BNE C@ CLR MODE BRA C@ MODE FCB 0 BYTE FCB 0 BYTE2 FCB 0 NLNSCT FCB 0 REFRCT FCB 0 COUNT FCB 0 DELAY EQU * JSR DISPLY LDX #0 LDB #5 A@ LEAX -1,X BNE A@ DECB BNE A@ RTS ******************************* * * DISK SAVE GAME ROUTINE * STORES STARTING @ TRACK 0, SECTOR 1 * 3 SECTORS PER GAME MODULO 3 * ******************************* VSAVE EQU * LDD SCORE SUBD #1 STD SCORE LDX #CASMSG ACTUALLY A DISK MESSAGE NOW JSR DISPLY LBSR GETNUM BEQ X@ STD $EC TRACK & SECTOR LDU #$700 BUFFER STU $EE DSCKON BUFFER POINTER LDB #15 LDX #SAVHDR JSR $A59A MOVE DATA LDB #CURPOS LDX #ROOM JSR $A59A MOVE DATA LDA #WRITE OPCODE STA $EA DSKCON OPCODE JSR [$C004] WRITE SECTOR LDX #ROOMTB LDD #(PNTTAB-ROOMTB) TSTB REG.A = N*$100, REG.B = REMAINDER BEQ B@ INCA MUST BE EVEN NUMBER OF SECTORS B@ STX $EE SET NEW DSCKON BUFFER POINTER INC $ED INCREASE DSKCON SECTOR JSR [$C004] WRITE SECTOR LDX $EE UPDATE DSCKON BUFFER LEAX $100,X UPDATE BUFFER POINTER DECA DECREASE SECTOR COUNT BNE B@ LDX #$700 PROTECT GRANS 0-3 STX $EE LDA #READ STA $EA LDD #17*256+2 FAT TABLE STD $EC JSR [$C004] READ FAT LDD #$9999 STD ,X++ MARK NOT FREE STD ,X LDA #WRITE STA $EA JSR [$C004] WRITE MODIFIED FAT CLR $FF40 TURN OFF DRIVE X@ JMP REPLY BACK TO MAIN GAME LOOP *********************************** * * GETNUM: GET NUMBER SUBR. FOR DISK * RETURN TRACK & SECTOR FOR STORAGE * VARIATION ON GETLIN * *********************************** GETNUM LDY #10 CLR MSGLNS A@ JSR CURSOR INC RANDOM JSR [$A000] READ KEYBOARD BEQ A@ CMPA #13 CR BEQ C@ B@ CMPA #'0 IS IT A # BLO A@ CMPA #'9 BHI A@ JSR CHROUT ECHO THE # TO SCREEN SUBA #'0 CONVERT TO HEX$ LDB #3 SECTORS PER GAME MUL D@ INCA DIVIDE SECTORS BY 18 SUBB #18 MAXIMUM SECTOR VALUE BPL D@ DECA COMPENSATE ADDB #19 BASE1 NOT BASE0 C@ RTS ******************************* * * DISK LOAD GAME ROUTINE * SEE SAVE FOR COMMENTS * ******************************* VLOAD EQU * LDD SCORE SUBD #1 STD SCORE LDX #CASMSG JSR DISPLY LBSR GETNUM BEQ X@ STD $EC TRACK & SECTOR LDX #$700 STX $EE DSCKON BUFFER POINTER LDA #READ STA $EA DSCKON OPCODE JSR [$C004] READ HEADER TST $F0 DSCKON ERROR CODE BNE D@ IF ERROR LDY #SAVHDR IS THIS A SAVED TREKBOER GAME? LDB #15 G@ LDA ,X+ CMPA ,Y+ BNE E@ DECB BNE G@ LDB #CURPOS RETRIEVE DATA LDU #ROOM JSR $A59A MOVE DATA LDX #ROOMTB LDD #(PNTTAB-ROOMTB) TSTB BEQ B@ INCA B@ STX $EE SET DSCKON BUFFER POINTER INC $ED UPDATE SECTOR JSR [$C004] READ DISK TST $F0 BNE D@ IF ERROR LDX $EE LEAX $100,X DECA BNE B@ C@ CLR $FF40 STOP DRIVE CLR NOUNNO JMP VLOOK D@ LDX #IOERR BRA F@ E@ LDX #BADTAP F@ CLR $FF40 STOP DRIVE JSR DISPLY X@ JMP REPLY CASMSG FCB 13 FCC 'Inser','t+$80 FCC 'dis','k+$80 FCB 'i,'n+$80 FCC 'driv','e+$80 FCB C.AND FCC 'ente','r+$80 FCC 'th','e+$80 FCC 'game#',':+$80 FCC '(0-9, =Abort',')+$80 FCB 0 BADTAP FCB 13 FCC 'Invali','d+$80 FCC 'gam','e+$80 FCC 'sav','e+$80 FCC 'disk.',0 IOERR FCB 13 FCC 'Dis','k+$80 FCC 'I/','O+$80 FCC 'error.',0 SAVHDR FCC 'TREKBOER V1.2' FCB 2,0,0 FDB 0,0 * * DYNAMIC SAVE ROOM TABLE * END START