mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-03-09 04:00:10 +00:00
408 lines
6.1 KiB
NASM
408 lines
6.1 KiB
NASM
PAGE
|
|
STTL "--- TIME-STAMP PAGING ROUTINE ---"
|
|
|
|
|
|
; -------------------------
|
|
; POINT [MPC] TO V-ADDR [I]
|
|
; -------------------------
|
|
|
|
SETWRD: LDA I+LO
|
|
STA MPCL
|
|
LDA I+HI
|
|
STA MPCM
|
|
LDA #0
|
|
STA MPCH ; ZERO TOP BIT
|
|
JMP VLDMPC
|
|
|
|
|
|
; THE FIRST 86K (SIDE1) MUST
|
|
; BE RAM RESIDENT (344=$158 PAGES)
|
|
;
|
|
; PAGES V$0 TO ($FE-VBEGIN) ARE IN MAIN (BANK1)
|
|
; PAGES ($FE-VBEGIN) TO V$158 ARE IN AUX (BANK0)
|
|
; PAGENG BUFFERS ARE IN HIGH AUX
|
|
;
|
|
DSKBNK: DB 00
|
|
;
|
|
WANTED: DB 00,00
|
|
;
|
|
CURRENT: DB 00
|
|
NEXT: DB 00
|
|
NSUBA: DB 00
|
|
PSUBA: DB 00
|
|
NSUBCUR: DB 00
|
|
;
|
|
YTEMP: DB 00
|
|
ATEMP: DB 00
|
|
NSUBY: DB 00
|
|
;
|
|
;
|
|
; GET SIDE 1 LOADS ALL CODE FROM
|
|
; DISK SIDE 1 INTO ITS CORRECT
|
|
; PLACE
|
|
|
|
; THE FIRST VPAGE MUST ALREADY BE
|
|
; RESIDENT AT [ZBEGIN]
|
|
|
|
GETSIDE1: LDA ZBEGIN+ZLENTH+1 ;GET LENGTH OF GAME (QUADS)
|
|
STA J+LO
|
|
LDA ZBEGIN+ZLENTH+0
|
|
LDY #5
|
|
SLP: LSR A ;CONVERT QUADS TO PAGES WITH /64
|
|
ROR J+LO
|
|
DEY
|
|
BPL SLP
|
|
STA J+HI
|
|
|
|
; [J] HAS # PAGES IN GAME ROUNDED
|
|
; DOWN, BUT PAGE 0 IS IN ALREADY
|
|
; SO WE NEED ONLY LOAD [J] MORE
|
|
; PAGES OR FILL MEM WITH SIDE 1
|
|
; IF THE GAME IS LARGER THAN SIDE 1
|
|
|
|
; FILL MAIN AND AUX
|
|
; # GETRES ASSUMED TO BE POINTING
|
|
; # AT V-PAGE 1 AND RAM PAGE ZBEGIN+1
|
|
; # ALSO, GETRES SHOULD ROLL INTO
|
|
; # AUX RAM WHEN INCMNTING DBUFF
|
|
|
|
FLP: JSR DECJ ; C=0 IF [J] GOES HIGH 0
|
|
BCC FIN
|
|
JSR GETDSK ; (CBD)
|
|
BCC FLP0
|
|
JMP DSKERR ; OH SHIT
|
|
|
|
FLP0: LDA DSKBNK ; IS IT FILLING AUX ?
|
|
CMP #AUX
|
|
BNE FLP ; JMP
|
|
|
|
FLP1: LDA DBUFF+HI
|
|
CMP #PBEGIN ;FILLED TO PAGING BUFFERS YET?
|
|
BNE FLP ;NO, NOT YET
|
|
|
|
LDA #CLS
|
|
JSR CHROUT ; CLEAR THE SCREEN FOR NEATNESS
|
|
LDA SIDEFLG ; IF NOT ON SIDE 2 YET
|
|
CMP #2
|
|
BEQ FIN
|
|
LDX #2
|
|
LDY #0
|
|
CLC ; make sure you set it
|
|
JSR PLOT
|
|
JMP SIDE2 ; GO ASK FOR IT NOW
|
|
FIN: RTS
|
|
|
|
;DECJ RETURNS C=0 WHEN J=$FFFF
|
|
|
|
DECJ: LDA J+LO
|
|
SEC
|
|
SBC #1
|
|
STA J+LO
|
|
LDA J+HI
|
|
SBC #0
|
|
STA J+HI
|
|
RTS
|
|
|
|
|
|
; MAKE [MPCPNT],[MPCBNK] POINT TO
|
|
; THE RAM PAGE AND BANK THAT HOLDS
|
|
; THE V-PAGE MPCH,M
|
|
;
|
|
VLDMPC: LDA MPCH
|
|
BNE VLD1 ;NOT IN FIRST V-64K
|
|
LDA MPCM
|
|
CMP #VAUX ;IS IT A PAGE IN MAIN
|
|
BCS VLD2 ;NO, IT IS IN AUX
|
|
ADC #>ZBEGIN ;ADD OFFSET TO GET RAM PAGE
|
|
VLD0: LDY #MAIN
|
|
JMP VLDEXI ;JMP
|
|
|
|
VLD1: CMP #1 ;BETWEEN 64K AND 128K ?
|
|
BNE VLD3 ;NO, ABOVE 128K
|
|
|
|
LDA MPCM
|
|
CMP #<PSIDE1
|
|
BCS VLD3 ;PAGED
|
|
|
|
VLD2: SEC
|
|
SBC #VAUX-AUXSTART ;FIX TO OFFST INTO AUX RAM
|
|
LDY #AUX
|
|
|
|
VLDEXI: STY MPCBNK
|
|
STA MPCPNT+HI
|
|
NOMUCK: RTS
|
|
|
|
VLD3: ;MUST BE PAGED
|
|
LDA MPCH
|
|
LDY MPCM
|
|
JSR PAGE ;RETURN BUFFER IN A THAT HAS VPAGE A,Y
|
|
CLC
|
|
ADC #PBEGIN
|
|
STA MPCPNT+HI
|
|
LDY #AUX
|
|
STY MPCBNK
|
|
|
|
;TEST FOR MUCK
|
|
|
|
LDA MUCKFLG
|
|
BEQ NOMUCK
|
|
JMP VLDZPC ;MAY HAVE MUCKED ZPC SO GO FIX
|
|
|
|
;SAME IDEA AS VLDMPC
|
|
|
|
VLDZPC: LDA ZPCH
|
|
BNE VLDZ1 ;NOT IN FIRST V-64K
|
|
LDA ZPCM
|
|
CMP #VAUX ;IS IT A PAGE IN MAIN
|
|
BCS VLDZ2 ;NO, IT IS IN AUX
|
|
ADC #>ZBEGIN ;ADD OFFSET TO GET RAM PAGE
|
|
VLDZ0: LDY #MAIN
|
|
JMP VLDZEXI ;JMP
|
|
|
|
VLDZ1: CMP #1 ;BETWEEN 64K AND 128K ?
|
|
BNE VLDZ3 ;NO, ABOVE 128K
|
|
LDA ZPCM
|
|
CMP #<PSIDE1
|
|
BCS VLDZ3 ;PAGED
|
|
VLDZ2: SEC
|
|
SBC #VAUX-AUXSTART
|
|
LDY #AUX
|
|
|
|
VLDZEXI: STY ZPCBNK
|
|
STA ZPCPNT+HI
|
|
NOZMUCK: RTS
|
|
|
|
VLDZ3: ;MUST BE PAGED
|
|
LDA ZPCH
|
|
LDY ZPCM
|
|
JSR PAGE ;RETURN BUFFER IN A THAT HAS VPAGE A,Y
|
|
CLC
|
|
ADC #PBEGIN
|
|
STA ZPCPNT+HI
|
|
LDY #AUX
|
|
STY ZPCBNK
|
|
|
|
;TEST MUCKING
|
|
|
|
LDA MUCKFLG
|
|
BEQ NOZMUCK
|
|
JMP VLDMPC ;MAY HAVE MUCKED MPC SO GO FIX
|
|
|
|
|
|
; FIND V-PAGE A,Y IF IT IS IN MEM
|
|
; AND RETURN WITH LINKED LIST
|
|
; PROPERLY MAINTAINED
|
|
; IF V-PAGE A,Y NOT IN MEM
|
|
; GET FROM DISK AND PUT IN RIGHT
|
|
; PLACE
|
|
|
|
MUCKFLG: DB 00 ; 00 IF PAGING BUFFERS NOT MUCKED
|
|
|
|
|
|
PAGE: STA WANTED+HI
|
|
STY WANTED+LO
|
|
|
|
; CLEAR MUCK FLAG
|
|
|
|
LDX #0
|
|
STX MUCKFLG
|
|
|
|
JSR WHERE
|
|
BCC TOUGH ;PAGE IS RESIDENT IN PAGENG SPACE
|
|
|
|
; PAGE MUST BE BROUGHT IN FROM DISK
|
|
|
|
LDX CURRENT ;GET BUFFER TO PUT PAGE INTO
|
|
LDA NEXTPNT,X ;BY LOOKING AT NEXT POINTER
|
|
STA CURRENT ;MAKE IT THE CURRENT BUFFER
|
|
TAX
|
|
LDA WANTED+HI ;LET BUFFER MAP KNOW
|
|
STA VPAGEH,X ;WHICH PAGE
|
|
LDA WANTED+LO ;IS GOING TO
|
|
STA VPAGEL,X ;BE THERE
|
|
TAY
|
|
TXA
|
|
PHA ;SAVE BUFFER
|
|
LDA WANTED+HI
|
|
|
|
; Y = WANTED+LO
|
|
; X = BUFFER
|
|
|
|
JSR GETVPAGE ;PUT V-PAGE A,Y INTO PAGENG BUFFER X
|
|
|
|
;INDICATE A MUCKING
|
|
|
|
DEC MUCKFLG
|
|
PLA ;RESTOR BUFFER NUMBER
|
|
RTS
|
|
|
|
; THIS IS WHERE THINGS GET WEIRD
|
|
|
|
TOUGH: STA NEXT
|
|
CMP CURRENT ;GETS REALY FUCKED IF CURRENT=NEXT
|
|
BNE T1
|
|
RTS ;DO NOT CHANGE POINTERS IF IT DOES, ALL IS WELL
|
|
|
|
; Y=NEXT(CURRENT)
|
|
; DO THE RIGHT THING TO THE POINTERS
|
|
; ASK LIM TO EXPLAIN ,HA HA.
|
|
|
|
T1: LDY CURRENT
|
|
LDA NEXTPNT,Y
|
|
STA NSUBCUR
|
|
LDA NEXT
|
|
JSR DETATCH
|
|
LDY CURRENT
|
|
LDA NEXT
|
|
JSR INSERT
|
|
LDA NEXT
|
|
STA CURRENT
|
|
T2: RTS
|
|
|
|
; GET A PAGE IN BANK 1, PREPAGED
|
|
|
|
; TEMPORARY NOTE: GET A PAGED PAGE [A,Y] >(DBLOCK)
|
|
; FROM DISK & PUT IN PAGING BUFFER [X] (MUST BE MADE ABSOLUTE)
|
|
|
|
GETVPAGE: STA DBLOCK+HI
|
|
STY DBLOCK+LO
|
|
TXA ; OFFSET INTO CORRECT RAM PAGE
|
|
CLC
|
|
ADC #PBEGIN ; MAKE ABSOLUTE
|
|
STA DBUFF+HI
|
|
LDX #AUX ; SET FLAG
|
|
STX DSKBNK
|
|
JSR GETDSK
|
|
BCC T2
|
|
JMP DSKERR ; COULDN'T READ DISK
|
|
|
|
|
|
; PREV(A)=Y
|
|
; PREV(NEXT(Y))=A
|
|
; NEXT(A)=NEXT(Y)
|
|
; NEXT(Y)=A
|
|
|
|
; INSERT A BEFORE Y
|
|
|
|
INSERT: STA ATEMP
|
|
STY YTEMP
|
|
TAX
|
|
TYA
|
|
STA PREVPNT,X
|
|
|
|
LDA NEXTPNT,Y
|
|
STA NSUBY
|
|
TXA
|
|
LDX NSUBY
|
|
STA PREVPNT,X
|
|
|
|
TXA
|
|
LDX ATEMP
|
|
STA NEXTPNT,X
|
|
|
|
LDA ATEMP
|
|
STA NEXTPNT,Y
|
|
RTS
|
|
|
|
|
|
; DETATCH BUFFER HIGH ALOW
|
|
; NEXT(PREV(A))=NEXT(A)
|
|
; PREV(NEXT(A))=PREV(A)
|
|
|
|
DETATCH: TAX
|
|
LDA NEXTPNT,X
|
|
STA NSUBA
|
|
LDA PREVPNT,X
|
|
STA PSUBA
|
|
TAX
|
|
LDA NSUBA
|
|
STA NEXTPNT,X
|
|
LDA PSUBA
|
|
LDX NSUBA
|
|
STA PREVPNT,X
|
|
RTS
|
|
|
|
|
|
; RETURN BUFFER OF PAGE [WANTED]
|
|
; IN [A] ELSE SEC (Y=WANTED+LO)
|
|
; (CHECKING FOR PAGED BUFFER ALREADY RESIDENT)
|
|
|
|
WHERE: LDX #NUMBUFS-1
|
|
WHLOOP:
|
|
LDA WANTED+HI
|
|
CMP VPAGEH,X ;HIGH SAME
|
|
BEQ WHGOT
|
|
WHNOGOT:
|
|
DEX
|
|
BPL WHLOOP
|
|
SEC
|
|
RTS
|
|
WHGOT:
|
|
TYA
|
|
CMP VPAGEL,X
|
|
BNE WHNOGOT
|
|
TXA
|
|
CLC
|
|
RTS
|
|
|
|
|
|
; SETS UP PAGING SYSTEM - CALLED FROM WARM (?, COLD ?)
|
|
|
|
INITPAG: LDX #NUMBUFS-1
|
|
STX CURRENT
|
|
LDA #$FF
|
|
INILP:
|
|
STA VPAGEH,X
|
|
DEX
|
|
BPL INILP
|
|
LDX #0
|
|
LDY #1
|
|
INILP2:
|
|
TYA
|
|
STA PREVPNT,X
|
|
INX
|
|
INY
|
|
CPX #NUMBUFS
|
|
BCC INILP2
|
|
LDA #00
|
|
DEX
|
|
STA PREVPNT,X
|
|
LDX #0
|
|
LDY #$FF
|
|
LDA #NUMBUFS-1
|
|
INILP3:
|
|
STA NEXTPNT,X
|
|
INX
|
|
INY
|
|
TYA
|
|
CPX #NUMBUFS
|
|
BCC INILP3
|
|
|
|
JMP GETSIDE1
|
|
|
|
; TAKE CARE OF CROSSING A PAGE
|
|
|
|
CRSMPC:
|
|
PHA
|
|
INC MPCM
|
|
BNE CRS1
|
|
INC MPCH
|
|
CRS1: JSR VLDMPC
|
|
PLA
|
|
RTS
|
|
|
|
;SAME AS CRSMPC
|
|
|
|
CRSZPC:
|
|
PHA
|
|
INC ZPCM
|
|
BNE CRSZ1
|
|
INC ZPCH
|
|
CRSZ1: JSR VLDZPC
|
|
PLA
|
|
RTS
|
|
|
|
PAGE
|
|
|
|
END
|