mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-28 04:38:09 +00:00
449 lines
7.1 KiB
Plaintext
449 lines
7.1 KiB
Plaintext
PAGE
|
|
SBTTL "--- GAME I/O: CBM64 ---"
|
|
|
|
; --------------
|
|
; INTERNAL ERROR
|
|
; --------------
|
|
|
|
; ENTRY: ERROR CODE IN [A]
|
|
|
|
ERRM: DB "Internal error "
|
|
ENUMB: DB "00."
|
|
ERRML EQU $-ERRM
|
|
|
|
ZERROR: LDY #1 ; CONVERT ERROR BYTE IN [A]
|
|
ECON: JSR DIV10 ; TO ASCII DECIMAL IN [ENUMB]
|
|
ORA #'0'
|
|
STA ENUMB,Y
|
|
TXA
|
|
DEY
|
|
BPL ECON
|
|
|
|
JSR CLRCHN
|
|
JSR ZCRLF ; CLEAR BUFFER
|
|
LDA #0
|
|
STA SCRIPT ; DISABLE SCRIPTING
|
|
|
|
LDX #LOW ERRM
|
|
LDA #HIGH ERRM
|
|
LDY #ERRML
|
|
JSR DLINE
|
|
|
|
; FALL THROUGH ...
|
|
|
|
; ----
|
|
; QUIT
|
|
; ----
|
|
|
|
ZQUIT: JSR ZCRLF ; FLUSH BUFFER
|
|
|
|
LDX #LOW TOQ
|
|
LDA #HIGH TOQ
|
|
LDY #TOQL
|
|
JSR DLINE ; "END OF STORY"
|
|
|
|
LDA FAST ; FAST-READ ENGAGED?
|
|
BEQ FREEZE
|
|
JSR FOFF ; DISENGAGE IF SO
|
|
FREEZE: JMP FREEZE ; AND STOP
|
|
|
|
TOQ: DB "End of session."
|
|
DB EOL
|
|
TOQL EQU $-TOQ
|
|
|
|
; -------
|
|
; RESTART
|
|
; -------
|
|
|
|
ZSTART: JSR ZCRLF
|
|
|
|
LDA FAST ; FAST-READ?
|
|
BEQ DOSTRT ; NO, GO
|
|
JSR FOFF ; ELSE DISENGAGE
|
|
|
|
DOSTRT: LDA ZBEGIN+ZSCRIP+1 ; SAVE SCRIPT STATE
|
|
AND #%00000001 ; FOR LATER
|
|
STA SFLAG ; (BM 5/14/85)
|
|
|
|
JMP WARM1 ; AND DO A WARMSTART
|
|
|
|
; --------------------
|
|
; PRINT VERSION NUMBER
|
|
; --------------------
|
|
|
|
VERS: DB "C64 Version F"
|
|
DB EOL
|
|
VERSL EQU $-VERS
|
|
|
|
VERNUM: JSR ZCRLF
|
|
|
|
LDX #LOW VERS
|
|
LDA #HIGH VERS
|
|
LDY #VERSL
|
|
JMP DLINE
|
|
|
|
; --------------------------
|
|
; RETURN TOP RAM PAGE IN [A]
|
|
; --------------------------
|
|
|
|
MEMTOP: LDA #$CF ; IT'S A GIVEN
|
|
RTS
|
|
|
|
; --------------------------------
|
|
; RETURN RANDOM BYTES IN [A] & [X]
|
|
; --------------------------------
|
|
|
|
RANDOM: LDA RAND ; SOMETHING FROM HERE
|
|
LDX RASTER ; AND HERE
|
|
RTS
|
|
|
|
; -------------------
|
|
; Z-PRINT A CHARACTER
|
|
; -------------------
|
|
|
|
; ENTRY: ASCII CHAR IN [A]
|
|
|
|
COUT: CMP #EOL ; IF EOL,
|
|
BEQ ZCRLF ; DO IT!
|
|
CMP #SPACE ; IGNORE ALL OTHER
|
|
BCC CEX ; CONTROLS
|
|
|
|
LDX LENGTH ; ELSE GET LINE POINTER
|
|
STA LBUFF,X ; ADD CHAR TO BUFFER
|
|
CPX #XSIZE ; END OF LINE?
|
|
BCS FLUSH ; YES, FLUSH THE LINE
|
|
INC LENGTH ; ELSE UPDATE POINTER
|
|
|
|
CEX: RTS
|
|
|
|
; -------------------
|
|
; FLUSH OUTPUT BUFFER
|
|
; -------------------
|
|
|
|
; ENTRY: LENGTH OF BUFFER IN [X]
|
|
|
|
FLUSH: LDA #SPACE
|
|
|
|
FL0: CMP LBUFF,X ; FIND LAST SPACE CHAR
|
|
BEQ FL1 ; IN THE LINE
|
|
DEX
|
|
BNE FL0 ; IF NONE FOUND,
|
|
LDX #XSIZE ; FLUSH ENTIRE LINE
|
|
|
|
FL1: STX OLDLEN ; SAVE OLD LINE POS HERE
|
|
STX LENGTH ; MAKE IT THE NEW LINE LENGTH
|
|
|
|
JSR ZCRLF ; PRINT LINE UP TO LAST SPACE
|
|
|
|
; START NEW LINE WITH REMAINDER OF OLD
|
|
|
|
LDX OLDLEN ; GET OLD LINE POS
|
|
LDY #0 ; START NEW LINE AT BEGINNING
|
|
FL2: INX
|
|
CPX #XSIZE ; CONTINUE IF
|
|
BCC FL3 ; INSIDE OR
|
|
BEQ FL3 ; AT END OF LINE
|
|
STY LENGTH ; ELSE SET NEW LINE LENGTH
|
|
RTS
|
|
|
|
FL3: LDA LBUFF,X ; GET CHAR FROM OLD LINE
|
|
STA LBUFF,Y ; MOVE TO START OF NEW LINE
|
|
INY ; UPDATE LENGTH OF NEW LINE
|
|
BNE FL2
|
|
|
|
; ---------------
|
|
; CARRIAGE RETURN
|
|
; ---------------
|
|
|
|
ZCRLF: INC LINCNT ; NEW LINE GOING OUT
|
|
LDA LINCNT ; IS IT TIME TO
|
|
CMP LMAX ; PRINT "MORE" YET?
|
|
BCC CR1 ; NO, CONTINUE
|
|
|
|
; SCREEN FULL; PRINT "MORE"
|
|
|
|
JSR ZUSL ; UPDATE STATUS LINE
|
|
|
|
LDA #0
|
|
STA LINCNT ; RESET LINE COUNTER
|
|
STA COLOR ; PRINT "MORE" IN BLACK
|
|
STA NDX ; CLEAR QUEUE
|
|
|
|
SEC
|
|
JSR PLOT ; GET CURSOR POSITION
|
|
STY OLDX
|
|
STX OLDY
|
|
|
|
LDX #LOW MORE
|
|
LDA #HIGH MORE
|
|
LDY #MOREL
|
|
JSR DLINE ; PRINT "MORE" DIRECTLY
|
|
|
|
ZCR0: JSR GETIN ; GET ANY KEYPRESS
|
|
TAX
|
|
BEQ ZCR0
|
|
|
|
LDY OLDX
|
|
LDX OLDY
|
|
CLC
|
|
JSR PLOT ; RESTORE CURSOR
|
|
|
|
LDA #1
|
|
STA COLOR ; SWITCH BACK TO WHITE
|
|
|
|
LDX #LOW MCLR
|
|
LDA #HIGH MCLR
|
|
LDY #MOREL
|
|
JSR DLINE ; RUB OUT "MORE"
|
|
|
|
LDY OLDX
|
|
LDX OLDY
|
|
CLC
|
|
JSR PLOT ; RESTORE CURSOR AGAIN
|
|
|
|
CR1: LDX LENGTH
|
|
LDA #EOL ; INSTALL EOL AT
|
|
STA LBUFF,X ; END OF CURRENT LINE
|
|
INC LENGTH ; UPDATE LINE LENGTH
|
|
|
|
LINOUT: LDY LENGTH ; IF BUFFER EMPTY,
|
|
BEQ LINEX ; DON'T PRINT ANYTHING
|
|
|
|
STY PRLEN ; SAVE LENGTH HERE FOR "PPRINT"
|
|
LDX #0 ; SEND CONTENTS OF [LBUFF]
|
|
LOUT: LDA LBUFF,X ; TO SCREEN
|
|
JSR CHAR
|
|
INX
|
|
DEY
|
|
BNE LOUT
|
|
|
|
JSR PPRINT ; PRINT [LBUFF] IF ENABLED
|
|
|
|
LINEX: LDA #0 ; RESET LINE LENGTH
|
|
STA LENGTH ; TO ZERO
|
|
RTS ; AND RETURN
|
|
|
|
MORE: DB "[MORE]"
|
|
MOREL EQU $-MORE
|
|
|
|
MCLR: DB " "
|
|
|
|
; ----------------------
|
|
; UPDATE THE STATUS LINE
|
|
; ----------------------
|
|
|
|
SCORE: DB "Score: "
|
|
SCOREL EQU $-SCORE
|
|
|
|
CLOCK: DB "Time: "
|
|
CLOCKL EQU $-CLOCK
|
|
|
|
ZUSL: SEC ; SAVE THE CURRENT
|
|
JSR PLOT ; CURSOR POSITION
|
|
STY OLDX
|
|
STX OLDY
|
|
|
|
LDA LENGTH ; SAVE ALL
|
|
PHA ; STRING-PRINTING
|
|
LDA MPCH ; VARIABLES
|
|
PHA
|
|
LDA MPCM
|
|
PHA
|
|
LDA MPCL
|
|
PHA
|
|
LDA TSET
|
|
PHA
|
|
LDA PSET
|
|
PHA
|
|
LDA ZWORD+HI
|
|
PHA
|
|
LDA ZWORD+LO
|
|
PHA
|
|
LDA ZFLAG
|
|
PHA
|
|
LDA DIGITS
|
|
PHA
|
|
|
|
LDX #XSIZE
|
|
USL0: LDA LBUFF,X ; MOVE CONTENTS OF [LBUFF]
|
|
STA BUFSAV,X ; TO [BUFSAV]
|
|
LDA #SPACE ; CLEAR
|
|
STA LBUFF,X ; [LBUFF] WITH SPACES
|
|
DEX
|
|
BPL USL0
|
|
|
|
LDA #0
|
|
STA LENGTH ; RESET LINE LENGTH
|
|
STA SCRIPT ; DISABLE SCRIPTING
|
|
STA COLOR ; PRINT STATUS LINE IN BLACK
|
|
|
|
LDA #$13 ; HOME THE
|
|
JSR CHROUT ; CURSOR
|
|
LDA #$12 ; PRINT IN
|
|
JSR CHROUT ; INVERSE VIDEO
|
|
|
|
; PRINT ROOM DESCRIPTION
|
|
|
|
LDA #16 ; GLOBAL VAR #16 (ROOM ID)
|
|
JSR GETVRG ; GET IT INTO [VALUE]
|
|
LDA VALUE+LO
|
|
JSR PRNTDC ; PRINT SHORT ROOM DESCRIPTION
|
|
|
|
LDA #24 ; MOVE LINE INDEX UP
|
|
STA LENGTH ; TO TIME/SCORE POSITION
|
|
|
|
LDA #17 ; GLOBAL VAR #17 (SCORE/HOURS)
|
|
JSR GETVRG ; GET IT INTO [VALUE]
|
|
|
|
LDA TIMEFL ; GET MODE FLAG
|
|
BNE DOTIME ; USE TIME MODE IF NON-ZERO
|
|
|
|
; PRINT "SCORE"
|
|
|
|
LDA #'S'
|
|
JSR COUT
|
|
LDA #'c'
|
|
JSR COUT
|
|
LDA #'o'
|
|
JSR COUT
|
|
LDA #'r'
|
|
JSR COUT
|
|
LDA #'e'
|
|
JSR COUT
|
|
LDA #':'
|
|
JSR COUT
|
|
LDA #SPACE
|
|
JSR COUT
|
|
|
|
LDA VALUE+LO ; MOVE SCORE VALUE
|
|
STA QUOT+LO ; INTO [QUOT]
|
|
LDA VALUE+HI ; FOR PRINTING
|
|
STA QUOT+HI
|
|
JSR NUMBER ; PRINT SCORE VALUE IN DECIMAL
|
|
|
|
LDA #'/' ; PRINT A SLASH
|
|
BNE MOVMIN ; BRANCH ALWAYS
|
|
|
|
; PRINT "TIME"
|
|
|
|
DOTIME: LDA #'T'
|
|
JSR COUT
|
|
LDA #'i'
|
|
JSR COUT
|
|
LDA #'m'
|
|
JSR COUT
|
|
LDA #'e'
|
|
JSR COUT
|
|
LDA #':'
|
|
JSR COUT
|
|
LDA #SPACE
|
|
JSR COUT
|
|
|
|
LDA VALUE+LO ; 00 IS REALLY 24
|
|
BNE DT0
|
|
LDA #24
|
|
DT0: CMP #13 ; IS HOURS > 12,
|
|
BCC DT1
|
|
SBC #12 ; CONVERT TO 1-12
|
|
DT1: STA QUOT+LO ; MOVE FOR PRINTING
|
|
LDA #0
|
|
STA QUOT+HI ; CLEAR MSB
|
|
JSR NUMBER
|
|
|
|
LDA #':' ; COLON
|
|
|
|
MOVMIN: JSR COUT ; PRINT SLASH OR COLON
|
|
|
|
LDA #18 ; GLOBAL VAR #18 (MOVES/MINUTES)
|
|
JSR GETVRG ; GET IT INTO [VALUE]
|
|
LDA VALUE+LO ; MOVE TO [QUOT]
|
|
STA QUOT+LO ; FOR EVENTUAL PRINTING
|
|
LDA VALUE+HI
|
|
STA QUOT+HI
|
|
|
|
LDA TIMEFL ; WHICH MODE?
|
|
BNE DOMINS ; TIME IF NZ
|
|
|
|
; PRINT NUMBER OF MOVES
|
|
|
|
JSR NUMBER ; SHOW # MOVES
|
|
JMP STATEX ; ALL DONE
|
|
|
|
; PRINT MINUTES
|
|
|
|
DOMINS: LDA VALUE+LO ; CHECK MINUTES
|
|
CMP #10 ; IF MORE THAN TEN
|
|
BCS DOM0 ; CONTINUE
|
|
|
|
LDA #'0' ; ELSE PRINT A
|
|
JSR COUT ; PADDING "0" FIRST
|
|
|
|
DOM0: JSR NUMBER ; SHOW MINUTES
|
|
|
|
LDA #SPACE
|
|
JSR COUT ; SEPARATE THINGS
|
|
|
|
LDA #17 ; CHECK "HOURS" AGAIN
|
|
JSR GETVRG
|
|
LDA VALUE+LO
|
|
CMP #12 ; PAST NOON?
|
|
BCS DOPM ; YES, PRINT "PM"
|
|
|
|
LDA #'A' ; ELSE PRINT "AM"
|
|
BNE DOXM ; BRANCH ALWAYS
|
|
|
|
DOPM: LDA #'P'
|
|
|
|
DOXM: JSR COUT
|
|
LDA #'M'
|
|
JSR COUT
|
|
|
|
; STATUS LINE READY
|
|
|
|
STATEX: LDA #40 ; PRINT THE ENTIRE
|
|
STA LENGTH ; STATUS LINE
|
|
JSR CR1
|
|
|
|
LDX #XSIZE ; RESTORE OLD [LBUFF]
|
|
USLX: LDA BUFSAV,X
|
|
STA LBUFF,X
|
|
DEX
|
|
BPL USLX
|
|
|
|
PLA ; RESTORE ALL
|
|
STA DIGITS ; SAVED VARIABLES
|
|
PLA
|
|
STA ZFLAG
|
|
PLA
|
|
STA ZWORD+LO
|
|
PLA
|
|
STA ZWORD+HI
|
|
PLA
|
|
STA PSET
|
|
PLA
|
|
STA TSET
|
|
PLA
|
|
STA MPCL
|
|
PLA
|
|
STA MPCM
|
|
PLA
|
|
STA MPCH
|
|
PLA
|
|
STA LENGTH
|
|
|
|
LDX OLDY ; RESTORE CURSOR
|
|
LDY OLDX
|
|
CLC
|
|
JSR PLOT
|
|
|
|
LDX #$FF
|
|
STX SCRIPT ; RE-ENABLE SCRIPTING
|
|
INX ; = 0
|
|
STX MPCFLG ; INVALIDATE [MPC]
|
|
INX ; = 1
|
|
STX COLOR ; PRINT IN WHITE AGAIN
|
|
RTS
|
|
|
|
END
|
|
|