|
|
1.1 root 1: PAGE
2: SBTTL "--- DISK I/O ---"
3:
4: DSKCON EQU $C004 ; CONTAINS DISK ACCESS VECTOR
5: DCB EQU $EA ; ADDRESS OF DCB
6: MOTOR EQU $FF40 ; DRIVE MOTOR ON/OFF SWITCH
7: BLOCK1 EQU 37 ; 1ST Z-CODE BLOCK (TRACK 2, SECTOR 1)
8:
9: ; ------------------------
10: ; READ A Z-BLOCK FROM DISK
11: ; ------------------------
12:
13: ; ENTRY: DRIVE # (0 OR 1) IN [DRIVE]
14: ; BLOCK # IN [DBLOCK]
15: ; BUFFER ADDRESS IN [DBUFF]
16:
17: GETDSK: LDD TEMP ; SAVE [TEMP] AND
18: LDX VAL ; [VAL] FOR DIVISION
19: PSHS X,D
20:
21: ; CONVERT BLOCK # TO SECTOR/TRACK
22:
23: LDD DBLOCK ; FETCH BLOCK #
24: ADDD #BLOCK1 ; ADD DISK OFFSET
25: CMPD #16*18+1 ; IF BELOW TRACK 16
26: BLO TRAKZ ; CONTINUE
27: ADDD #36 ; ELSE SKIP OVER TRACKS 16 & 17
28: TRAKZ: STD TEMP ; USE AS DIVIDEND
29: LDD #18
30: STD VAL ; DIVIDE BY 18 (# SECTORS PER TRACK)
31: JSR UDIV ; UNSIGNED DIVIDE
32: LDA TEMP+1 ; [TEMP] HAS QUOTIENT (TRACK #)
33: LDB VAL+1 ; [VAL] HAS REMAINDER (SECTOR #)
34: BNE NXTSEC ; IF REMAINDER WAS ZERO,
35: LDB #18 ; CHANGE IT TO 18
36: DECA ; AND PATCH TRACK #
37: NXTSEC: STD TRACK
38: JSR DREAD ; ACCESS THE DISK
39: INC DBLOCK+1 ; POINT TO NEXT Z-BLOCK
40: BNE REND
41: INC DBLOCK
42: REND: PULS X,D ; RESTORE VARIABLES
43: STX VAL
44: STD TEMP
45: RTS
46:
47: ; -----------------
48: ; SAVE/RESTORE INIT
49: ; -----------------
50:
51: SAVRES: JSR ZCRLF ; FLUSH OUTPUT BUFFER
52: JSR CLS
53: LDD #SCREEN
54: STD CURSOR ; MOVE CURSOR TO STATUS LINE
55: CLR SCRIPT ; DISABLE SCRIPTING
56: RTS
57:
58: ; ---------
59: ; SAVE GAME
60: ; ---------
61:
62: ZSAVE: BSR SAVRES ; INIT THINGS
63: LDX #SAV
64: LDB #SAVL
65: JSR DLINE ; "SAVE POSITION"
66:
67: JSR PARAMS ; GET POSITION AND DRIVE
68:
69: LDX #SING
70: LDB #SINGL
71: JSR DLINE ; "SAVING"
72: JSR TIONP ; "POSITION X ..."
73:
74: LDX #BUFSAV ; POINT TO AUX BUFFER
75: LDD ZCODE+ZID ; GET GAME ID CODE
76: STD ,X++ ; SAVE IN BUFFER
77: LDD OZSTAK ; OLD STACK POINTER
78: STD ,X++
79: STU ,X++ ; AND CURRENT STACK POINTER
80: LDA ZPCH ; HI BYTE OF ZPC
81: STA ,X+
82: LDD ZPCM ; LOW ZPC BYTES
83: STD ,X
84:
85: LDD #LOCALS
86: STD DBUFF
87: BSR DWRITE ; WRITE LOCAL/BUFFER PAGE
88:
89: LDD #ZSTACK ; SAVE CONTENTS
90: STD DBUFF ; OF Z-STACK (2 PAGES)
91: BSR DWRITE ; FIRST HALF
92: BSR DWRITE ; 2ND HALF
93:
94: ; SAVE GAME PRELOAD
95:
96: LDD #ZCODE ; START OF PRELOAD
97: STD DBUFF
98: LDA ZCODE+ZPURBT ; SIZE OF PRELOAD (MSB, # PAGES)
99: INCA ; ROUND UP
100: STA TEMP ; USE [TEMP] AS INDEX
101:
102: LSAVE: BSR DWRITE ; SAVE A PAGE
103: DEC TEMP ; SAVED ENTIRE PRELOAD YET?
104: BNE LSAVE ; NO, KEEP SAVING
105: JMP RESUME
106:
107: ; *** ERROR #12: DISK ADDRESS RANGE ***
108:
109: DSKERR: LDA #12
110: BRA DSKEX
111:
112: ; *** ERROR #14: DISK ACCESS ***
113:
114: DERR2: LDA #14
115: DSKEX: JSR ZERROR
116:
117: ; ------------
118: ; ACCESS DRIVE
119: ; ------------
120:
121: ; ENTRY: [DBUFF] HOLDS BUFFER ADDRESS
122: ; [TRACK] HOLDS TRACK, SECTOR ADDRESS
123: ; [DRIVE] HOLDS DRIVE #
124:
125: DWRITE: LDX #IOBUFF ; POINT TO DISK I/O BUFFER
126: LDY DBUFF ; AND RAM PAGE TO BE WRITTEN
127: DRLOOP: LDD ,Y++ ; GRAB A WORD OUT OF RAM
128: STD ,X++ ; MOVE IT INTO THE BUFFER
129: CMPX #IOBUFF+$100 ; BUFFER FILLED YET?
130: BLO DRLOOP ; NO, KEEP MOVING
131: LDA #3 ; "WRITE SECTOR" COMMAND
132: BRA DIO
133:
134: DREAD: LDA #2 ; "READ SECTOR" COMMAND
135:
136: DIO: JSR ROMIN ; ENABLE ROMS [TAKEN OUT BY ASK 5/15/85]
137:
138: LDX #DCB ; GET ADDR OF DCB
139: LDB DRIVE ; DRIVE # (0 OR 1)
140: STD ,X ; PASS TO [DSKCON]
141: LDD TRACK ; TRACK & SECTOR ADDRESSES
142: CMPA #35
143: BHS DSKERR ; NO TRACKS HIGHER THAN 34
144: CMPB #19
145: BHS DSKERR ; OR SECTORS HIGHER THAN 18
146: STD 2,X ; PASS IT
147: LDD #IOBUFF ; BUFFER ADDRESS
148: STD 4,X
149:
150: ; ACCESS THE DRIVE
151:
152: JSR MYCON ; (NOT ANY MORE-->) LET OS DO THE DIRTY WORK
153:
154: JSR ROMOUT ; THEN TURN ROMS OFF AGAIN [ASK 5/15/85]
155:
156: ; CHECK FOR ACCESS ERRORS
157:
158: LDA 6,X ; GET STATUS BYTE
159: BITA #%01000000 ; WRITE-PROTECT ERROR?
160: BNE WPERR ; YES, GO REPORT IT
161: TSTA ; ANY OTHER ERRORS?
162: BNE DERR2 ; ERROR IF ANY BIT SET
163:
164: LDX #IOBUFF ; MOVE CONTENTS OF I/O BUFFER
165: LDY DBUFF ; TO DESIRED RAM ADDRESS
166: QLOOP: LDD ,X++
167: STD ,Y++
168: CMPX #IOBUFF+$100
169: BLO QLOOP
170:
171: INC DBUFF ; POINT TO NEXT PAGE OF RAM
172: LDD TRACK ; AND NEXT SECTOR
173: INCB
174: CMPB #19
175: BLO DIOEX
176: LDB #1
177: INCA
178: DIOEX: STD TRACK
179: RTS
180:
181: ; -------------------
182: ; WRITE-PROTECT ERROR
183: ; -------------------
184:
185: WPERR: PULS D ; PULL RETURN ADDRESS OFF STACK
186: BRA ERRWP ; PROMPT FOR GAME DISK
187:
188: ; ------------
189: ; RESTORE GAME
190: ; ------------
191:
192: ZREST: JSR SAVRES
193:
194: LDX #RES
195: LDB #RESL
196: JSR DLINE ; "RESTORE POSITION"
197:
198: JSR PARAMS
199:
200: LDX #RING
201: LDB #RINGL
202: JSR DLINE ; "RESTORING"
203: JSR TIONP ; "POSITION X ..."
204:
205: ; SAVE LOCALS ON MACHINE STACK
206: ; IN CASE OF ERROR
207:
208: LDX #LOCALS ; POINT TO LOCALS STORAGE
209: STX DBUFF ; POINT TO 1ST PAGE TO RESTORE
210: LOCLP: LDD ,X++ ; GRAB A LOCAL
211: PSHS D ; AND PUSH IT
212: CMPX #LOCALS+30 ; SAVED 15 LOCALS YET?
213: BLO LOCLP ; NO, KEEP PUSHING
214:
215: JSR DREAD ; RETRIEVE LOCALS/BUFFER PAGE
216:
217: LDD BUFSAV ; READ SAVED GAME ID
218: CMPD ZCODE+ZID ; IF IT MATCHES CURRENT GAME ID,
219: BEQ VERSOK ; PROCEED WITH THE RESTORE
220:
221: ; WRONG SAVE DISK, ABORT RESTORE
222:
223: LDX #LOCALS+30 ; RESTORE PUSHED LOCALS
224: RESLP: PULS D
225: STD ,--X
226: CMPX #LOCALS
227: BHI RESLP
228: ERRWP: BSR TOBOOT ; PROMPT FOR GAME DISK
229: JMP PREDF ; PREDICATE FAILS
230:
231: VERSOK: LEAS +30,S ; POP OLD LOCALS OFF STACK
232: LDD ZCODE+ZSCRIP
233: STD VAL ; SAVE FLAGS
234:
235: LDD #ZSTACK ; RETRIEVE
236: STD DBUFF ; CONTENTS OF Z-STACK
237: JSR DREAD
238: JSR DREAD
239:
240: DOREST: LDD #ZCODE ; NOW RETRIEVE
241: STD DBUFF ; 1ST PAGE OF PRELOAD
242: JSR DREAD
243:
244: LDA ZCODE+ZPURBT ; DETERMINE # PAGES
245: STA TEMP ; TO RETRIEVE
246:
247: LREST: JSR DREAD ; FETCH REMAINDER OF PRELOAD
248: DEC TEMP
249: BNE LREST
250:
251: ; RESTORE STATE OF SAVED GAME
252:
253: LDX #BUFSAV+2 ; POINT TO SAVED VARIABLES
254: LDD ,X++
255: STD OZSTAK ; RESTORE OLD STACK POINTERS
256: LDU ,X++
257: LDA ,X+
258: STA ZPCH ; HIGH BYTE OF ZPC
259: LDD ,X ; LOW BYTES OF ZPC
260: STD ZPCM
261: CLR ZPCFLG ; PC HAS CHANGED!
262:
263: LDD VAL ; RESTORE FLAGS
264: STD ZCODE+ZSCRIP
265:
266: ; RESUME GAME AFTER SAVE OR RESTORE
267:
268: RESUME: BSR TOBOOT ; PROMPT FOR GAME DISK
269: JMP PREDS ; PREDICATE SUCCEEDS
270:
271: TOBOOT: CLR DRIVE ; BACK TO BOOT DRIVE
272: LDX #GAME
273: LDB #GAMEL
274: JSR DLINE ; "INSERT STORY DISK IN DRIVE 0,"
275: JSR ENTER ; "PRESS <ENTER> TO CONTINUE"
276: COM SCRIPT ; RE-ENABLE SCRIPTING
277: JMP CLS ; CLEAR SCREEN AND RETURN
278:
279: ; ---------------------------
280: ; "PRESS <ENTER> TO CONTINUE"
281: ; ---------------------------
282:
283: ENTER: LDX #PRESS
284: LDB #PRESSL
285: STB CFLAG ; ENABLE CURSOR
286: JSR LINE ; "PRESS <ENTER> TO CONTINUE"
287: JSR GETKEY ; GET A KEY
288: CLR CFLAG ; DISABLE CURSOR
289: LDA #EOL
290: JMP COUT ; DO EOL AND RETURN
291:
292: ; --------------------------------
293: ; PROMPT SEQUENCE FOR SAVE/RESTORE
294: ; --------------------------------
295:
296: PARAMS: LDX #POSIT
297: LDB #POSITL
298: JSR DLINE ; "GAME ... POSITION 1-7 "
299: JSR INVERT ; FLIP STATUS LINE
300:
301: LDA #TRUE
302: STA CFLAG ; ENABLE CURSOR
303:
304: ; GET POSITION
305:
306: LDA GPOSIT ; GET DEFAULT POSITION
307: INCA ; 1-ALIGN IT
308: JSR DODEF
309:
310: GETPOS: JSR GETKEY
311: CMPA #EOL
312: BEQ SETPOS
313: SUBA #$31 ; CONVERT "1-7" TO 0-6
314: CMPA #7 ; IF LOWER THAN "7"
315: BLO POSSET ; SET NEW POSITION
316: JSR BOOP ; ELSE RAZZ
317: BRA GETPOS ; AND TRY AGAIN
318:
319: SETPOS: LDA GPOSIT ; USE DEFAULT
320: POSSET: STA GPOSIT ; TEMP DEFAULT
321: ADDA #$31 ; CONVERT TO ASCII
322: STA PDO ; HERE TOO
323: JSR OUTCHR ; AND SHOW CHOICE
324:
325: ; GET DRIVE #
326:
327: LDX #WDRIV
328: LDB #WDRIVL
329: JSR DLINE ; "DRIVE 0 OR 1 "
330:
331: LDA GDRIVE
332: BSR DODEF ; SHOW DEFAULT
333:
334: GETDRV: JSR GETKEY
335: CMPA #EOL
336: BEQ DRVSET
337: SUBA #$30 ; CONVERT TO ASCII
338: CMPA #2
339: BLO SETDRV
340: JSR BOOP
341: BRA GETDRV ; DRIVE # NO GOOD
342:
343: DRVSET: LDA GDRIVE
344: SETDRV: STA DRIVE ; NEW DEFAULT
345: ADDA #$30 ; CONVERT TO ASCII
346: STA GAMDRI ; FOR PROMPT
347: JSR OUTCHR ; SHOW CHOICE
348:
349: LDA GPOSIT ; MAKE IT THE NEW DEFAULT
350: LDB #5 ; CALC BLOCK OFFSET (5 TRACKS/GAME)
351: MUL
352: STB TRACK ; TRACK ADDRESS
353: LDB #1 ; START ON SECTOR 1
354: STB TRACK+1 ; SECTOR ADDRESS
355:
356: LDX #INSERM
357: LDB #INSERML
358: JSR DLINE ; "INSERT SAVE DISK IN DRIVE X,"
359: JMP ENTER ; ETC.
360:
361: ; ------------
362: ; SHOW DEFAULT
363: ; ------------
364:
365: DODEF: ADDA #$30 ; CONVERT # TO ASCII
366: STA DEFNUM ; INSERT IN STRING
367: LDX #DEFALT
368: LDB #DEFALL
369: STB CFLAG ; ENABLE CURSOR
370:
371: ; FALL THROUGH TO ...
372:
373: ; --------------------
374: ; DIRECT SCREEN OUTPUT
375: ; --------------------
376:
377: ; ENTRY: SAME AS "LINE" ROUTINE
378:
379: DLINE: LDA ,X+
380: JSR OUTCHR
381: DECB
382: BNE DLINE
383: RTS
384:
385: ; ----------------------
386: ; PRINT "POSITION X ..."
387: ; ----------------------
388:
389: TIONP: LDX #PTION
390: LDB #PTIONL
391: BRA DLINE
392:
393: ; ---------------------
394: ; TEXT FOR SAVE/RESTORE
395: ; ---------------------
396:
397: RES: DB "RESTORE"
398: RESL EQU $-RES
399:
400: SAV: DB "SAVE"
401: SAVL EQU $-SAV
402:
403: INSERM: DB EOL
404: DB EOL
405: DB "INSERT SAVE DISK IN DRIVE "
406: GAMDRI: DB "0."
407: DB EOL
408: INSERML EQU $-INSERM
409:
410: GAME: DB EOL
411: DB "INSERT STORY DISK IN DRIVE 0."
412: DB EOL
413: GAMEL EQU $-GAME
414:
415: PRESS: DB "PRESS <ENTER> TO CONTINUE."
416: DB EOL
417: DB ">"
418: PRESSL EQU $-PRESS
419:
420: POSIT: DB " POSITION"
421: DB EOL
422: DB EOL
423: DB "POSITION 1-7 "
424: POSITL EQU $-POSIT
425:
426: WDRIV: DB EOL
427: DB "DRIVE 0 OR 1 "
428: WDRIVL EQU $-WDRIV
429:
430: DEFALT: DB "(DEFAULT IS "
431: DEFNUM: DB "0) >"
432: DEFALL EQU $-DEFALT
433:
434: SING: DB EOL
435: DB "SAVING"
436: SINGL EQU $-SING
437:
438: RING: DB EOL
439: DB "RESTORING"
440: RINGL EQU $-RING
441:
442: PTION: DB " POSITION "
443: PDO: DB "1 ..."
444: DB EOL
445: PTIONL EQU $-PTION
446:
447: ENDTST: DB "END"
448:
449: END
450:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.