|
|
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.