|
|
1.1 root 1: PAGE
1.1.1.2 root 2: ;SBTTL "--- SCREEN & PRINTER I/O ---"
1.1 root 3:
4: ; ------------
5: ; RESTART GAME
6: ; ------------
7:
8: ZSTART: JSR ZCRLF ; FLUSH OUTPUT BUFFER
9: CLR SCRIPT ; DISABLE SCRIPTING [ASK 5/28/85]
10: ; JSR ENTER ; "PRESS ANY KEY TO CONTINUE"[ASK 5/28/85]
11: LDA ZCODE+ZSCRIP+1
12: STA SFLAG
13: JMP LUKE ; SKIP SCRIPT DISABLE
14: ; FALL THROUGH TO ...
15:
16: ; ---------
17: ; COLDSTART
18: ; ---------
19:
20: COLD: CLR SCRIPT ; DISABLE SCRIPTING
21: LUKE: JSR CLS ; A CLEAN SLATE
22: LDD #SCREEN+228 ; POSITION
23: STD CURSOR ; CURSOR
24: LDX #LOADM
25: LDB #LOADML
26: JSR DLINE ; "LOADING GAME ..."
27: JMP START ; AND DO A WARMSTART
28:
1.1.1.2 root 29: LOADM: .STR "THE STORY IS LOADING ..."
30: LOADML EQU *-LOADM
1.1 root 31:
32: ; -----
33: ; ERROR
34: ; -----
35:
36: ; ENTRY: ERROR CODE # IN [A]
37:
1.1.1.2 root 38: INTERR: .DB EOL
39: .STR "INTERNAL ERROR #"
40: IERRL EQU *-INTERR
1.1 root 41:
42: ZERROR: PSHS A ; SAVE CODE #
43: JSR ZCRLF ; FLUSH BUFFER
44: LDX #INTERR
45: LDB #IERRL
46: JSR LINE ; "INTERNAL ERROR #"
47: PULS A ; RETRIEVE CODE #
48: STA TEMP+1
49: CLR TEMP
50: JSR NUMBER ; CONVERT ERROR CODE #
51: JSR CR1 ; AND SHOW IT
52:
53: ; FALL THROUGH TO ...
54:
55: ; ----
56: ; QUIT
57: ; ----
58:
59: ZQUIT: LDX #ENDSES
60: LDB #ENDSL
61: JSR LINE ; "END OF SESSION"
62: CLR MOTOR ; SHUT DOWN DRIVE MOTOR
63:
64: ; JSR ROMIN ; MAKE SURE ROM'S ACTIVE [ASK 5/15/85]
65:
66: FREEZE: BRA FREEZE ; STOP DEAD
67:
1.1.1.2 root 68: ENDSES: .STR "END OF SESSION"
69: VCODE: .DB EOL ; SHARED EOL CHAR
70: ENDSL EQU *-ENDSES
1.1 root 71:
72: ; --------------------------
73: ; DISPLAY ZIP VERSION NUMBER
74: ; --------------------------
75:
1.1.1.3 ! root 76: .STR "COCO VERSION D"
1.1.1.2 root 77: .DB EOL
78: VCODEL EQU *-VCODE
1.1 root 79:
80: VERNUM: LDX #VCODE
81: LDB #VCODEL
82: JMP LINE
83:
84: ; -----------------
85: ; PRINT A CHARACTER
86: ; -----------------
87:
88: COUT: LDX #BUFFER ; POINT TO I/O BUFFER
89: LDB CHRPNT ; GET LINE INDEX
90: CMPA #EOL ; IF THIS IS A CR,
91: BEQ ZCRLF ; HANDLE AS SUCH
92: CMPA #SPACE ; IGNORE OTHER CONTROLS
93: BLO COUT1
94:
95: STA B,X ; SEND CHAR TO BUFFER
96: CMPB #31 ; END OF SCREEN LINE?
97: BHS FLUSH ; YES, SO FLUSH CURRENT BUFFER
98: INC CHRPNT ; ELSE UPDATE INDEX
99: COUT1: RTS ; AND LEAVE
100:
101: ; FLUSH CONTENTS OF [BUFFER]
102:
103: FLUSH: LDA #SPACE
104: FLUSH1: CMPA B,X ; FIND LAST SPACE CHAR
105: BEQ FLUSH2 ; IN CURRENT LINE
106: DECB
107: BNE FLUSH1 ; KEEP SCANNING
108: LDB #31 ; SEND ENTIRE LINE IF NONE FOUND
109:
110: FLUSH2: STB CPSAV ; SAVE
111: STB CHRPNT ; # CHARS IN LINE
112: JSR ZCRLF ; OUTPUT 1ST PART OF LINE
113:
114: ; START NEW LINE WITH REMAINDER OF OLD
115:
116: FLUSH3: INC CPSAV ; GET 1ST CHAR
117: LDB CPSAV ; OF REMAINDER
118: CMPB #31 ; END OF LINE YET?
119: BLS FLUSH4 ; NO, MOVE IT FORWARD
120: RTS ; ELSE WE'RE DONE HERE
121:
122: FLUSH4: LDX #BUFFER ; POINT TO BUFFER
123: LDA B,X ; GET OLD CHAR
124: LDB CHRPNT ; THIS WAS RESET BY CRLF
125: STA B,X ; MOVE TO START OF BUFFER
126: INC CHRPNT ; NEXT POSITION
127: BRA FLUSH3 ; KEEP MOVING
128:
1.1.1.2 root 129: MORES: .STR "[more]"
130: MOREL EQU *-MORES
1.1 root 131:
132: ; ---------------
133: ; CARRIAGE RETURN
134: ; ---------------
135:
136: ZCRLF: INC LINCNT ; NEW LINE GOING OUT
137: LDA LINCNT
138: CMPA #13 ; 13 LINES SENT YET?
139: BLO CR1 ; NO, KEEP GOING
140:
141: BSR ZUSL ; UPDATE STATUS LINE
142:
143: LDD CURSOR ; GET CURSOR POSITION
144: STD TEMP2 ; AND SAVE IT
145:
146: LDX #MORES ; "[MORE]"
147: LDB #MOREL
148: JSR DLINE
149:
150: CLR CFLAG ; NO CURSOR!
151: JSR GETKEY ; GET A KEYPRESS
152:
153: LDD TEMP2
154: STD CURSOR ; RESTORE CURSOR
155:
156: LDA #SPACE ; ERASE "MORE" MESSAGE
157: LDB #MOREL ; WITH SPACES
158: SPCS: JSR OUTCHR
159: DECB
160: BNE SPCS
161:
162: LDD TEMP2
163: STD CURSOR ; RESTORE CURSOR AGAIN
164: CLR LINCNT ; RESET LINE COUNTER
165:
166: CR1: LDB CHRPNT
167: LDX #BUFFER
168: LDA #EOL ; INSTALL AN EOL
169: STA B,X ; AT END OF CURRENT LINE
170: INC CHRPNT ; ADD IT TO CHAR COUNT
171:
172: LINOUT: TST CHRPNT ; IF NO CHARS IN BUFFER
173: BEQ SCDONE ; DON'T PRINT ANYTHING
174: OUTPUT: JSR BUFOUT ; ELSE DISPLAY BUFFER
175: CLR CHRPNT ; RESET CHAR INDEX
176: SCDONE: RTS ; AND RETURN
177:
178: ; ------------------
179: ; UPDATE STATUS LINE
180: ; ------------------
181:
182: ZUSL: LDA CHRPNT ; SAVE ALL Z-STRING VARS
183: LDB STBYTF
184: LDX CURSOR
185: LDY ZSTWRD
186: PSHS X,Y,D
187: LDA MPCH ; HIGH BIT OF MPC
188: LDB BINDEX
189: LDX MPCM ; LOW BYTES OF MPC
190: LDY CSTEMP ; TEMP & PERM TOGETHER!
191: PSHS X,Y,D
192:
193: LDY #BUFSAV ; MOVE OUTPUT BUFFER
194: LDX #BUFFER ; TO TEMPORARY STORAGE
195: LDB #SPACE ; CLEAR [BUFFER] WITH SPACES
196: ZUSL1: LDA ,X
197: STB ,X+
198: STA ,Y+
199: CMPX #BUFFER+32
200: BLO ZUSL1
201:
202: LDX #SCREEN
203: LDA #$20 ; CLEAR OLD STATUS LINE
204: ZSL: STA ,X+
205: CMPX #SCREEN+32
206: BLO ZSL
207:
208: ; DISPLAY ROOM NAME
209:
210: CLR CHRPNT ; RESET CHAR INDEX
211: CLR SCRIPT ; DISABLE SCRIPTING
212: LDD #SCREEN ; HOME THE
213: STD CURSOR ; CURSOR
214:
215: LDA #$10 ; GLOBAL VAR #0 (ROOM #)
216: JSR VARGET
217: LDA TEMP+1
218: JSR PRNTDC ; GET SHORT DESC INTO [BUFFER]
219:
220: LDA #22 ; ADVANCE BUFFER INDEX
221: STA CHRPNT ; INTO SCORING POSITION
222: LDA #SPACE ; PRINT A SPACE
223: JSR COUT ; TO SEPARATE THINGS (BM 12/6/84)
224:
225: LDA #$11 ; FETCH GLOBAL VARIABLE
226: JSR VARGET ; #1 (SCORE/HOURS)
227: TST TIMEFL ; TIME MODE?
228: BNE PTIME ; YES IF NZ
229:
230: ; PRINT SCORE
231:
232: JSR NUMBER ; PRINT THE VALUE
233: LDA #$2F ; ASCII SLASH
234: BRA MOVEP
235:
236: ; PRINT TIME (HOURS)
237:
238: PTIME: LDA TEMP+1
239: BNE PTIME1 ; 00 IS REALLY 24
240: LDA #24
241: PTIME1: CMPA #12
242: BLE PTIME2 ; IF HOURS IS GREATER THAN 12,
243: SUBA #12 ; CONVERT TO 12-HOUR TIME
244: STA TEMP+1
245: PTIME2: JSR NUMBER ; SHOW HOURS VALUE
246: LDA #$3A ; ASCII COLON
247:
248: MOVEP: JSR COUT ; SEND COLON (OR SLASH)
249: LDA #$12 ; GLOBAL VAR #2 (MOVES/MINUTES)
250: JSR VARGET
251: TST TIMEFL ; TIME MODE?
252: BEQ PNUM ; NO, DO MOVES
253:
254: ; PRINT MINUTES
255:
256: LDA TEMP+1
257: CMPA #10 ; IF LESS THAN 10 MINUTES,
258: BHS MOVEP1
259: LDA #$30 ; ADD ASCII ZERO FOR PADDING
260: JSR COUT
261:
262: MOVEP1: JSR NUMBER ; SHOW MINUTES
263:
264: ; PRINT "AM/PM"
265:
266: LDA #SPACE ; SEPARATE TIMING
267: JSR COUT ; FROM "AM/PM"
268: LDA #$11 ; GLOBAL #1 AGAIN
269: JSR VARGET
270: LDA TEMP+1
271: CMPA #12 ; PAST NOON?
272: BHS USEPM ; YES, IT'S PM
273: LDA #$41 ; "A"
274: BRA DOM
275: USEPM: LDA #$50 ; "P"
276: DOM: JSR COUT
277: LDA #$4D ; "M"
278: JSR COUT
279: BRA AHEAD ; DONE!
280:
281: ; PRINT # MOVES
282:
283: PNUM: JSR NUMBER ; SIMPLE, EH?
284:
285: AHEAD: JSR CR1 ; DUMP BUFFER
286: BSR INVERT ; INVERT STATUS LINE
287:
288: LDY #BUFSAV ; POINT TO "SAVE" BUFFER
289: LDX #BUFFER ; POINT TO OUTPUT BUFFER
290: USLEND: LDA ,Y+
291: STA ,X+ ; RESTORE PREVIOUS CONTENTS
292: CMPX #BUFFER+32
293: BLO USLEND
294:
295: PULS X,Y,D ; RESTORE EVERYTHING
296: STY CSTEMP
297: STX MPCM
298: STB BINDEX
299: STA MPCH
300: PULS X,Y,D
301: STY ZSTWRD
302: STX CURSOR
303: STB STBYTF
304: STA CHRPNT
305: COM SCRIPT ; RE-ENABLE SCRIPTING
306: CLR MPCFLG ; MPC NO LONGER VALID
307: RTS
308:
309: ; ------------------
310: ; INVERT STATUS LINE
311: ; ------------------
312:
313: INVERT: LDX #SCREEN
314: REVERS: LDA ,X
315: ANDA #%10111111 ; CLEAR BIT 6 (REVERSE VIDEO)
316: STA ,X+
317: CMPX #SCREEN+32
318: BLO REVERS
319: RTS
320:
1.1.1.2 root 321: ;END
1.1 root 322:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.