mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-01-19 17:28:25 +00:00
323 lines
6.1 KiB
Plaintext
323 lines
6.1 KiB
Plaintext
PAGE
|
|
SBTTL "--- SCREEN & PRINTER I/O ---"
|
|
|
|
; ------------
|
|
; RESTART GAME
|
|
; ------------
|
|
|
|
ZSTART: JSR ZCRLF ; FLUSH OUTPUT BUFFER
|
|
CLR SCRIPT ; DISABLE SCRIPTING [ASK 5/28/85]
|
|
; JSR ENTER ; "PRESS ANY KEY TO CONTINUE"[ASK 5/28/85]
|
|
LDA ZCODE+ZSCRIP+1
|
|
STA SFLAG
|
|
JMP LUKE ; SKIP SCRIPT DISABLE
|
|
; FALL THROUGH TO ...
|
|
|
|
; ---------
|
|
; COLDSTART
|
|
; ---------
|
|
|
|
COLD: CLR SCRIPT ; DISABLE SCRIPTING
|
|
LUKE: JSR CLS ; A CLEAN SLATE
|
|
LDD #SCREEN+228 ; POSITION
|
|
STD CURSOR ; CURSOR
|
|
LDX #LOADM
|
|
LDB #LOADML
|
|
JSR DLINE ; "LOADING GAME ..."
|
|
JMP START ; AND DO A WARMSTART
|
|
|
|
LOADM: DB "THE STORY IS LOADING ..."
|
|
LOADML EQU $-LOADM
|
|
|
|
; -----
|
|
; ERROR
|
|
; -----
|
|
|
|
; ENTRY: ERROR CODE # IN [A]
|
|
|
|
INTERR: DB EOL
|
|
DB "INTERNAL ERROR #"
|
|
IERRL EQU $-INTERR
|
|
|
|
ZERROR: PSHS A ; SAVE CODE #
|
|
JSR ZCRLF ; FLUSH BUFFER
|
|
LDX #INTERR
|
|
LDB #IERRL
|
|
JSR LINE ; "INTERNAL ERROR #"
|
|
PULS A ; RETRIEVE CODE #
|
|
STA TEMP+1
|
|
CLR TEMP
|
|
JSR NUMBER ; CONVERT ERROR CODE #
|
|
JSR CR1 ; AND SHOW IT
|
|
|
|
; FALL THROUGH TO ...
|
|
|
|
; ----
|
|
; QUIT
|
|
; ----
|
|
|
|
ZQUIT: LDX #ENDSES
|
|
LDB #ENDSL
|
|
JSR LINE ; "END OF SESSION"
|
|
CLR MOTOR ; SHUT DOWN DRIVE MOTOR
|
|
|
|
; JSR ROMIN ; MAKE SURE ROM'S ACTIVE [ASK 5/15/85]
|
|
|
|
FREEZE: BRA FREEZE ; STOP DEAD
|
|
|
|
ENDSES: DB "END OF SESSION"
|
|
VCODE: DB EOL ; SHARED EOL CHAR
|
|
ENDSL EQU $-ENDSES
|
|
|
|
; --------------------------
|
|
; DISPLAY ZIP VERSION NUMBER
|
|
; --------------------------
|
|
|
|
DB "COCO 2 VERSION C"
|
|
DB EOL
|
|
VCODEL EQU $-VCODE
|
|
|
|
VERNUM: LDX #VCODE
|
|
LDB #VCODEL
|
|
JMP LINE
|
|
|
|
; -----------------
|
|
; PRINT A CHARACTER
|
|
; -----------------
|
|
|
|
COUT: LDX #BUFFER ; POINT TO I/O BUFFER
|
|
LDB CHRPNT ; GET LINE INDEX
|
|
CMPA #EOL ; IF THIS IS A CR,
|
|
BEQ ZCRLF ; HANDLE AS SUCH
|
|
CMPA #SPACE ; IGNORE OTHER CONTROLS
|
|
BLO COUT1
|
|
|
|
STA B,X ; SEND CHAR TO BUFFER
|
|
CMPB #31 ; END OF SCREEN LINE?
|
|
BHS FLUSH ; YES, SO FLUSH CURRENT BUFFER
|
|
INC CHRPNT ; ELSE UPDATE INDEX
|
|
COUT1: RTS ; AND LEAVE
|
|
|
|
; FLUSH CONTENTS OF [BUFFER]
|
|
|
|
FLUSH: LDA #SPACE
|
|
FLUSH1: CMPA B,X ; FIND LAST SPACE CHAR
|
|
BEQ FLUSH2 ; IN CURRENT LINE
|
|
DECB
|
|
BNE FLUSH1 ; KEEP SCANNING
|
|
LDB #31 ; SEND ENTIRE LINE IF NONE FOUND
|
|
|
|
FLUSH2: STB CPSAV ; SAVE
|
|
STB CHRPNT ; # CHARS IN LINE
|
|
JSR ZCRLF ; OUTPUT 1ST PART OF LINE
|
|
|
|
; START NEW LINE WITH REMAINDER OF OLD
|
|
|
|
FLUSH3: INC CPSAV ; GET 1ST CHAR
|
|
LDB CPSAV ; OF REMAINDER
|
|
CMPB #31 ; END OF LINE YET?
|
|
BLS FLUSH4 ; NO, MOVE IT FORWARD
|
|
RTS ; ELSE WE'RE DONE HERE
|
|
|
|
FLUSH4: LDX #BUFFER ; POINT TO BUFFER
|
|
LDA B,X ; GET OLD CHAR
|
|
LDB CHRPNT ; THIS WAS RESET BY CRLF
|
|
STA B,X ; MOVE TO START OF BUFFER
|
|
INC CHRPNT ; NEXT POSITION
|
|
BRA FLUSH3 ; KEEP MOVING
|
|
|
|
MORES: DB "[more]"
|
|
MOREL EQU $-MORES
|
|
|
|
; ---------------
|
|
; CARRIAGE RETURN
|
|
; ---------------
|
|
|
|
ZCRLF: INC LINCNT ; NEW LINE GOING OUT
|
|
LDA LINCNT
|
|
CMPA #13 ; 13 LINES SENT YET?
|
|
BLO CR1 ; NO, KEEP GOING
|
|
|
|
BSR ZUSL ; UPDATE STATUS LINE
|
|
|
|
LDD CURSOR ; GET CURSOR POSITION
|
|
STD TEMP2 ; AND SAVE IT
|
|
|
|
LDX #MORES ; "[MORE]"
|
|
LDB #MOREL
|
|
JSR DLINE
|
|
|
|
CLR CFLAG ; NO CURSOR!
|
|
JSR GETKEY ; GET A KEYPRESS
|
|
|
|
LDD TEMP2
|
|
STD CURSOR ; RESTORE CURSOR
|
|
|
|
LDA #SPACE ; ERASE "MORE" MESSAGE
|
|
LDB #MOREL ; WITH SPACES
|
|
SPCS: JSR OUTCHR
|
|
DECB
|
|
BNE SPCS
|
|
|
|
LDD TEMP2
|
|
STD CURSOR ; RESTORE CURSOR AGAIN
|
|
CLR LINCNT ; RESET LINE COUNTER
|
|
|
|
CR1: LDB CHRPNT
|
|
LDX #BUFFER
|
|
LDA #EOL ; INSTALL AN EOL
|
|
STA B,X ; AT END OF CURRENT LINE
|
|
INC CHRPNT ; ADD IT TO CHAR COUNT
|
|
|
|
LINOUT: TST CHRPNT ; IF NO CHARS IN BUFFER
|
|
BEQ SCDONE ; DON'T PRINT ANYTHING
|
|
OUTPUT: JSR BUFOUT ; ELSE DISPLAY BUFFER
|
|
CLR CHRPNT ; RESET CHAR INDEX
|
|
SCDONE: RTS ; AND RETURN
|
|
|
|
; ------------------
|
|
; UPDATE STATUS LINE
|
|
; ------------------
|
|
|
|
ZUSL: LDA CHRPNT ; SAVE ALL Z-STRING VARS
|
|
LDB STBYTF
|
|
LDX CURSOR
|
|
LDY ZSTWRD
|
|
PSHS X,Y,D
|
|
LDA MPCH ; HIGH BIT OF MPC
|
|
LDB BINDEX
|
|
LDX MPCM ; LOW BYTES OF MPC
|
|
LDY CSTEMP ; TEMP & PERM TOGETHER!
|
|
PSHS X,Y,D
|
|
|
|
LDY #BUFSAV ; MOVE OUTPUT BUFFER
|
|
LDX #BUFFER ; TO TEMPORARY STORAGE
|
|
LDB #SPACE ; CLEAR [BUFFER] WITH SPACES
|
|
ZUSL1: LDA ,X
|
|
STB ,X+
|
|
STA ,Y+
|
|
CMPX #BUFFER+32
|
|
BLO ZUSL1
|
|
|
|
LDX #SCREEN
|
|
LDA #$20 ; CLEAR OLD STATUS LINE
|
|
ZSL: STA ,X+
|
|
CMPX #SCREEN+32
|
|
BLO ZSL
|
|
|
|
; DISPLAY ROOM NAME
|
|
|
|
CLR CHRPNT ; RESET CHAR INDEX
|
|
CLR SCRIPT ; DISABLE SCRIPTING
|
|
LDD #SCREEN ; HOME THE
|
|
STD CURSOR ; CURSOR
|
|
|
|
LDA #$10 ; GLOBAL VAR #0 (ROOM #)
|
|
JSR VARGET
|
|
LDA TEMP+1
|
|
JSR PRNTDC ; GET SHORT DESC INTO [BUFFER]
|
|
|
|
LDA #22 ; ADVANCE BUFFER INDEX
|
|
STA CHRPNT ; INTO SCORING POSITION
|
|
LDA #SPACE ; PRINT A SPACE
|
|
JSR COUT ; TO SEPARATE THINGS (BM 12/6/84)
|
|
|
|
LDA #$11 ; FETCH GLOBAL VARIABLE
|
|
JSR VARGET ; #1 (SCORE/HOURS)
|
|
TST TIMEFL ; TIME MODE?
|
|
BNE PTIME ; YES IF NZ
|
|
|
|
; PRINT SCORE
|
|
|
|
JSR NUMBER ; PRINT THE VALUE
|
|
LDA #$2F ; ASCII SLASH
|
|
BRA MOVEP
|
|
|
|
; PRINT TIME (HOURS)
|
|
|
|
PTIME: LDA TEMP+1
|
|
BNE PTIME1 ; 00 IS REALLY 24
|
|
LDA #24
|
|
PTIME1: CMPA #12
|
|
BLE PTIME2 ; IF HOURS IS GREATER THAN 12,
|
|
SUBA #12 ; CONVERT TO 12-HOUR TIME
|
|
STA TEMP+1
|
|
PTIME2: JSR NUMBER ; SHOW HOURS VALUE
|
|
LDA #$3A ; ASCII COLON
|
|
|
|
MOVEP: JSR COUT ; SEND COLON (OR SLASH)
|
|
LDA #$12 ; GLOBAL VAR #2 (MOVES/MINUTES)
|
|
JSR VARGET
|
|
TST TIMEFL ; TIME MODE?
|
|
BEQ PNUM ; NO, DO MOVES
|
|
|
|
; PRINT MINUTES
|
|
|
|
LDA TEMP+1
|
|
CMPA #10 ; IF LESS THAN 10 MINUTES,
|
|
BHS MOVEP1
|
|
LDA #$30 ; ADD ASCII ZERO FOR PADDING
|
|
JSR COUT
|
|
|
|
MOVEP1: JSR NUMBER ; SHOW MINUTES
|
|
|
|
; PRINT "AM/PM"
|
|
|
|
LDA #SPACE ; SEPARATE TIMING
|
|
JSR COUT ; FROM "AM/PM"
|
|
LDA #$11 ; GLOBAL #1 AGAIN
|
|
JSR VARGET
|
|
LDA TEMP+1
|
|
CMPA #12 ; PAST NOON?
|
|
BHS USEPM ; YES, IT'S PM
|
|
LDA #$41 ; "A"
|
|
BRA DOM
|
|
USEPM: LDA #$50 ; "P"
|
|
DOM: JSR COUT
|
|
LDA #$4D ; "M"
|
|
JSR COUT
|
|
BRA AHEAD ; DONE!
|
|
|
|
; PRINT # MOVES
|
|
|
|
PNUM: JSR NUMBER ; SIMPLE, EH?
|
|
|
|
AHEAD: JSR CR1 ; DUMP BUFFER
|
|
BSR INVERT ; INVERT STATUS LINE
|
|
|
|
LDY #BUFSAV ; POINT TO "SAVE" BUFFER
|
|
LDX #BUFFER ; POINT TO OUTPUT BUFFER
|
|
USLEND: LDA ,Y+
|
|
STA ,X+ ; RESTORE PREVIOUS CONTENTS
|
|
CMPX #BUFFER+32
|
|
BLO USLEND
|
|
|
|
PULS X,Y,D ; RESTORE EVERYTHING
|
|
STY CSTEMP
|
|
STX MPCM
|
|
STB BINDEX
|
|
STA MPCH
|
|
PULS X,Y,D
|
|
STY ZSTWRD
|
|
STX CURSOR
|
|
STB STBYTF
|
|
STA CHRPNT
|
|
COM SCRIPT ; RE-ENABLE SCRIPTING
|
|
CLR MPCFLG ; MPC NO LONGER VALID
|
|
RTS
|
|
|
|
; ------------------
|
|
; INVERT STATUS LINE
|
|
; ------------------
|
|
|
|
INVERT: LDX #SCREEN
|
|
REVERS: LDA ,X
|
|
ANDA #%10111111 ; CLEAR BIT 6 (REVERSE VIDEO)
|
|
STA ,X+
|
|
CMPX #SCREEN+32
|
|
BLO REVERS
|
|
RTS
|
|
|
|
END
|
|
|