|
|
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: 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: 1.1.1.2 ! root 397: RES: .STR "RESTORE" ! 398: RESL EQU *-RES 1.1 root 399: 1.1.1.2 ! root 400: SAV: .STR "SAVE" ! 401: SAVL EQU *-SAV 1.1 root 402: 1.1.1.2 ! root 403: INSERM: .DB EOL ! 404: .DB EOL ! 405: .STR "INSERT SAVE DISK IN DRIVE " ! 406: GAMDRI: .STR "0." ! 407: .DB EOL ! 408: INSERML EQU *-INSERM ! 409: ! 410: GAME: .DB EOL ! 411: .STR "INSERT STORY DISK IN DRIVE 0." ! 412: .DB EOL ! 413: GAMEL EQU *-GAME ! 414: ! 415: PRESS: .STR "PRESS <ENTER> TO CONTINUE." ! 416: .DB EOL ! 417: .STR ">" ! 418: PRESSL EQU *-PRESS ! 419: ! 420: POSIT: .STR " POSITION" ! 421: .DB EOL ! 422: .DB EOL ! 423: .STR "POSITION 1-7 " ! 424: POSITL EQU *-POSIT ! 425: ! 426: WDRIV: .DB EOL ! 427: .STR "DRIVE 0 OR 1 " ! 428: WDRIVL EQU *-WDRIV ! 429: ! 430: DEFALT: .STR "(DEFAULT IS " ! 431: DEFNUM: .STR "0) >" ! 432: DEFALL EQU *-DEFALT ! 433: ! 434: SING: .DB EOL ! 435: .STR "SAVING" ! 436: SINGL EQU *-SING ! 437: ! 438: RING: .DB EOL ! 439: .STR "RESTORING" ! 440: RINGL EQU *-RING ! 441: ! 442: PTION: .STR " POSITION " ! 443: PDO: .STR "1 ..." ! 444: .DB EOL ! 445: PTIONL EQU *-PTION 1.1 root 446: 1.1.1.2 ! root 447: ENDTST: .STR "END" 1.1 root 448: 1.1.1.2 ! root 449: ;END 1.1 root 450:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.