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