Annotation of coco/disk.src, revision 1.1.1.2

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: 

unix.superglobalmegacorp.com

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