Annotation of coco/paging.src, revision 1.1.1.2

1.1       root        1:        PAGE
1.1.1.2 ! root        2:        ;SBTTL  "--- TIMESTAMP PAGING ROUTINES (BM 11/24/84) ---"
1.1       root        3: 
                      4:        ; --------------------
                      5:        ; FETCH A VIRTUAL WORD
                      6:        ; --------------------
                      7: 
                      8: GETWRD:        BSR     GETBYT
                      9:        STA     TEMP
                     10:        BSR     GETBYT
                     11:        STA     TEMP+1
                     12:        RTS
                     13: 
                     14:        ; -----------------
                     15:        ; FETCH NEXT Z-BYTE
                     16:        ; -----------------
                     17: 
                     18: NEXTPC:        TST     ZPCFLG          ; IS [ZPCPNT] VALID?
                     19:        BNE     NPC2            ; YES, GET THE BYTE
                     20: 
                     21:        ; Z-PAGE HAS CHANGED!
                     22: 
                     23:        LDD     ZPCH            ; GET TOP 9 BITS OF [ZPC]
                     24:        TSTA                    ; IS TOP BIT CLEAR?
                     25:        BNE     NPC0            ; NO, PAGE MUST BE SWAPPED
                     26: 
                     27:        CMPB    ZPURE           ; IS THIS PAGE PRELOADED?
                     28:        BHS     NPC0            ; NO, SWAP IT IN
                     29: 
1.1.1.2 ! root       30:        ADDB    #(ZCODE/256)    ; ELSE MAKE IT ABSOLUTE
1.1       root       31:        BRA     NPC1            ; AND CONTINUE
                     32: 
                     33: NPC0:  CLR     MPCFLG          ; INVALIDATE [MPC] FOR SAFETY
                     34:        BSR     PAGE            ; RETURN BUFFER IN [B]
                     35: 
                     36: NPC1:  STB     ZPCPNT          ; SET MSB OF BUFFER ADDRESS
                     37:        CLR     ZPCPNT+1        ; CLEAR LSB
                     38:        LDA     #TRUE
                     39:        STA     ZPCFLG          ; VALIDATE [ZPC]
                     40: 
                     41: NPC2:  LDB     ZPCL            ; GET BYTE INDEX
                     42:        LDX     ZPCPNT          ; AND PAGE ADDRESS
                     43:        ABX                     ; USE [ZPCL] AS OFFSET
                     44:        LDA     ,X              ; AND FETCH THE BYTE
                     45: 
                     46:        INC     ZPCL            ; POINT TO NEXT BYTE
                     47:        BNE     NPC3            ; CONTINUE IF NO OVERFLOW
                     48: 
                     49:        CLR     ZPCFLG          ; ELSE INVALIDATE [ZPC]
                     50:        INC     ZPCM            ; AND POINT
                     51:        BNE     NPC3            ; TO THE
                     52:        INC     ZPCH            ; NEXT Z-PAGE
                     53: 
                     54: NPC3:  RTS                     ; RETURN BYTE IN [A]
                     55: 
                     56:        ; ---------------------
                     57:        ; GET NEXT VIRTUAL BYTE
                     58:        ; ---------------------
                     59: 
                     60: GETBYT:        TST     MPCFLG          ; IS [MPCPNT] VALID?
                     61:        BNE     GTBT2           ; YES, GET THE BYTE
                     62: 
                     63:        ; Z-PAGE HAS CHANGED!
                     64: 
                     65:        LDD     MPCH            ; GET TOP 9 BITS OF [MPC]
                     66:        TSTA                    ; IS TOP BIT CLEAR?
                     67:        BNE     GTBT0           ; NO, PAGE MUST BE SWAPPED
                     68: 
1.1.1.2 ! root       69: PATCH  EQU     *+1             ; PATCH POINT FOR "VERIFY"
1.1       root       70: 
                     71:        CMPB    ZPURE           ; IS THIS PAGE PRELOADED?
                     72:        BHS     GTBT0           ; NO, SWAP IT IN
                     73: 
1.1.1.2 ! root       74:        ADDB    #(ZCODE/256)    ; ELSE MAKE IT ABSOLUTE
1.1       root       75:        BRA     GTBT1           ; AND CONTINUE
                     76: 
                     77: GTBT0: CLR     ZPCFLG          ; INVALIDATE [ZPC] FOR SAFETY
                     78:        BSR     PAGE            ; RETURN BUFFER PAGE IN [B]
                     79: 
                     80: GTBT1: STB     MPCPNT          ; SET MSB OF BUFFER ADDRESS
                     81:        CLR     MPCPNT+1        ; CLEAR LSB
                     82:        LDA     #TRUE
                     83:        STA     MPCFLG          ; VALIDATE [MPC]
                     84: 
                     85: GTBT2: LDB     MPCL            ; GET BYTE INDEX
                     86:        LDX     MPCPNT          ; AND PAGE ADDRESS
                     87:        ABX                     ; USE [MPCL] AS OFFSET
                     88:        LDA     ,X              ; AND FETCH THE BYTE
                     89: 
                     90:        INC     MPCL            ; POINT TO NEXT BYTE
                     91:        BNE     GTBT3           ; CONTINUE IF NO OVERFLOW
                     92: 
                     93:        CLR     MPCFLG          ; ELSE INVALIDATE [MPC]
                     94:        INC     MPCM            ; AND POINT
                     95:        BNE     GTBT3           ; TO THE
                     96:        INC     MPCH            ; NEXT Z-PAGE
                     97: 
                     98: GTBT3: RTS                     ; RETURN BYTE IN [A]
                     99: 
                    100:        ; -------------------------
                    101:        ; LOCATE A SWAPPABLE Z-PAGE
                    102:        ; -------------------------
                    103: 
                    104:        ; ENTRY: TARGET PAGE IN [D] (TOP 9 BITS)
                    105:        ; EXIT: ABSOLUTE BUFFER PAGE IN [B]
                    106: 
                    107: PAGE:  STD     DBLOCK          ; SAVE TARGET PAGE HERE
                    108:        CLR     ZPAGE           ; CLEAR INDEX
                    109:        LDX     #PTABLE         ; START AT BOTOM OF TABLE
                    110: PG0:   CMPD    ,X++            ; FOUND IT?
                    111:        BEQ     PG1             ; YES!
                    112:        INC     ZPAGE           ; ELSE COUNT NEXT PAGE
                    113:        CMPX    TABTOP          ; ANY BUFFERS LEFT?
                    114:        BLO     PG0             ; NO, KEEP SEARCHING
                    115: 
                    116:        ; SWAP IN THE TARGET PAGE
                    117: 
                    118:        BSR     EARLY           ; FIND THE EARLIEST PAGE
                    119:        LDB     SWAP            ; MOVE ITS INDEX
                    120:        STB     ZPAGE           ; INTO [ZPAGE]
                    121: 
                    122:        ADDB    PAGE0           ; CALC ABSOLUTE PAGE OF BUFFER
                    123:        STB     DBUFF           ; TELL DISK WHERE TO PUT DATA
                    124:        CLR     DBUFF+1         ; CLEAR LSB
                    125: 
                    126:        LDX     #PTABLE         ; GET THE PAGING TABLE ADDRESS
                    127:        LDB     ZPAGE           ; AND THE BUFFER OFFSET
                    128:        ABX                     ; ADD THE OFFSET
                    129:        ABX                     ; TWICE FOR WORD ALIGNMENT
                    130:        LDD     DBLOCK          ; RETRIEVE PAGE ID
                    131:        STD     ,X              ; SPLICE IT INTO THE TABLE
                    132: 
                    133:        JSR     GETDSK          ; MOVE BLOCK [DBLOCK] TO [DBUFF]
                    134: 
                    135:        ; UPDATE THE TIMESTAMP
                    136: 
                    137: PG1:   LDB     ZPAGE           ; GET BUFFER INDEX
                    138:        LDX     #LRUMAP         ; CALC ADDRESS OF ENTRY
                    139:        ABX                     ; IN TIMESTAMP MAP
                    140:        LDA     ,X              ; GET BUFFER'S LAST STAMP
                    141:        CMPA    STAMP           ; SAME AS CURRENT STAMP?
                    142:        BEQ     PG5             ; EXIT IF SO
                    143: 
                    144:        INC     STAMP           ; UPDATE [STAMP]
                    145:        BNE     PG4             ; IF STAMP OVERFLOWS ...
                    146: 
                    147:        ; HANDLE STAMP OVERFLOW
                    148: 
                    149:        BSR     EARLY           ; GET EARLIEST STAMP INTO [LRU]
                    150: 
                    151:        LDX     #LRUMAP         ; GET BASE ADDRESS OF STAMPS
                    152:        CLRB                    ; INIT STAMP COUNTER
                    153: PG2:   LDA     ,X              ; GET A STAMP
                    154:        BEQ     PG3             ; SKIP IF ALREADY ZERO
                    155:        SUBA    LRU             ; ELSE SUBTRACT OFF EARLIEST STAMP
                    156:        STA     ,X              ; AND REPLACE IT
                    157: PG3:   LEAX    +1,X            ; INCREMENT BASE ADDRESS
                    158:        INCB                    ; AND COUNTER
                    159:        CMPB    PMAX            ; OUT OF PAGES YET?
                    160:        BLO     PG2             ; LOOP TILL DONE
                    161: 
                    162:        LDA     #0              ; TURN BACK THE CLOCK
                    163:        SUBA    LRU             ; ON [STAMP]
                    164:        STA     STAMP           ; TO REFLECT TABLE FUDGING
                    165: 
                    166:        ; STAMP THE PAGE WITH CURRENT TIME
                    167: 
                    168: PG4:   LDX     #LRUMAP
                    169:        LDB     ZPAGE
                    170:        ABX
                    171:        LDA     STAMP
                    172:        STA     ,X
                    173: 
                    174: PG5:   LDB     ZPAGE           ; GET PAGE OFFSET
                    175:        ADDB    PAGE0           ; MAKE IT ABSOLUTE
                    176:        RTS                     ; AND RETURN IT IN [B]
                    177: 
                    178:        ; -------------------------
                    179:        ; LOCATE EARLIEST TIMESTAMP
                    180:        ; -------------------------
                    181: 
                    182:        ; EXIT: [LRU] = EARLIEST STAMP READING
                    183:        ;       [SWAP] = INDEX TO EARLIEST BUFFER
                    184: 
                    185: EARLY: CLR     SWAP            ; RESET [SWAP]
                    186:        LDA     LRUMAP          ; FETCH 1ST READING FOR COMPARISONS
                    187:        LDX     #LRUMAP+1       ; POINT TO 2ND READING
                    188:        LDB     #1              ; INIT BUFFER INDEX
                    189: EAR0:  CMPA    ,X              ; IS THIS STAMP EARLIER THAN [A]?
                    190:        BLO     EAR1            ; NO, TRY NEXT
                    191:        LDA     ,X              ; ELSE MAKE THIS READING THE "NEW" LOWEST
                    192:        STB     SWAP            ; AND REMEMBER WHERE WE FOUND IT
                    193: EAR1:  LEAX    +1,X            ; UPDATE POINTER
                    194:        INCB                    ; AND BUFFER INDEX
                    195:        CMPB    PMAX            ; OUT OF BUFFERS YET?
                    196:        BLO     EAR0            ; LOOP TILL DONE
                    197: 
                    198:        STA     LRU             ; SAVE EARLIEST STAMP FOUND
                    199:        RTS                     ; AND RETURN
                    200: 
                    201:        ; ---------------------
                    202:        ; POINT [MPC] TO [TEMP]
                    203:        ; ---------------------
                    204: 
                    205: SETWRD:        LDD     TEMP
                    206:        STD     MPCM
                    207:        CLR     MPCH
                    208:        CLR     MPCFLG
                    209:        RTS
                    210: 
1.1.1.2 ! root      211:        ;END
1.1       root      212: 

unix.superglobalmegacorp.com