Annotation of coco/disk.src, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.