Annotation of coco/disk.src, revision 1.1.1.3

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: 

unix.superglobalmegacorp.com

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