Files
erkyrath.infocom-zcode-terps/c-128/xzip/memory.asm
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

344 lines
5.5 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
PAGE
STTL "--- COMMODORE 128 MEMORY ACCESS RTNS ---"
ORG SHARED
; THIS CODE MUST BE ACCESSIBLE FROM BOTH BANK0 AND BANK1
; THEREFORE IT WILL BE IN THE "SHARED" SECTION OF MEMORY
; ------
; GETBYT
; ------
GETBYT: LDX MPCBNK ;SELECT CURRENT BANK
LDA BANK2,X ;ENABLE READ
STA CR
LDY MPCL
LDA (MPCPNT),Y ;GET THE BYTE
LDX BANK1 ;KILL (FOR SAFTY)
STX CR
INC MPCL ;POINT TO NEXT BYTE
BNE GETGOT ;IF NO CROSS WE ARE STILL VALID
JSR CRSMPC
GETGOT: TAY ;SET FLAGS
RTS ;RED SLIPPER TIME
; ------
; NEXTPC
; ------
; LIKE GETBYT
NEXTPC: LDX ZPCBNK
LDA BANK2,X
STA CR
LDY ZPCL
LDA (ZPCPNT),Y
LDX BANK1 ;KILL
STX CR
INC ZPCL
BNE NXTGOT
JSR CRSZPC
NXTGOT: TAY
RTS
; -----------
; READ SECTOR
; -----------
; NOW HAVE TRACK & SECTOR, READ THE DISK
GETRES: CLC ; CARRY CLEAR = "READ BLOCK"
JSR DISK ; GO DO IT!
GOT: LDX DSKBNK ; SET TO PROPER BANK
LDA BANK2,X
STA CR
LDY #0 ; MOVE CONTENTS OF [IOBUFF]
GDKL: LDA IOBUFF,Y ; TO THE
STA (DBUFF),Y ; TARGET PAGE IN [DBUFF]
INY
BNE GDKL
LDA BANK1 ; RESET TO MAIN BANK
STA CR
INC DBUFF+HI ; POINT TO NEXT PAGE
LDA DBUFF+HI
CMP #MAINEND+1 ; PAST LAST MAIN RAM PAGE ?
BCC GDEX ; NO
LDA #AUXSTART ; RESET DBUFF TO FIRST AUX PAGE
STA DBUFF+HI
LDA #AUX ; SET DSKBNK TO AUX
STA DSKBNK
GDEX: JMP NXTDBL ; POINT TO NEXT DBLOCK, SECTOR & TRACK
; -------------
; KERNAL ACCESS
; -------------
; THESE RTNS WILL SWITCH TO BANK0 WHERE THE KERNAL
; CAN BE ACCESSED, CALL THE WANTED RTN AND THEN
; SWITCH BACK TO BANK1 TO RESUME WITH EZIP
CHKIN: JSR KSETUP ; SET TO BANK 0
JSR RCHKIN ; AND CALL KERNAL RTN
JMP MEMOUT ; THEN SET BACK TO MAIN BANK
CHKOUT: JSR KSETUP
JSR RCHKOUT
JMP MEMOUT
CHRIN: JSR KSETUP
JSR RCHRIN
JMP MEMOUT
CHROUT: JSR KSETUP
JSR RCHROUT
JMP MEMOUT
CLALL: JSR KSETUP
JSR RCLALL
JMP MEMOUT
CLOSE: JSR KSETUP
JSR RCLOSE
JMP MEMOUT
CLRCHN: JSR KSETUP
JSR RCLRCHN
JMP MEMOUT
GETIN: JSR KSETUP
JSR RGETIN
JMP MEMOUT
OPEN: JSR KSETUP
JSR ROPEN
JMP MEMOUT
PLOT: JSR KSETUP
JSR RPLOT
JMP MEMOUT
SETLFS: JSR KSETUP
JSR RSETLFS
JMP MEMOUT
SETNAM: JSR KSETUP
JSR RSETNAM
JMP MEMOUT
SETFCN: JSR KSETUP
JSR RSETFCN
JMP MEMOUT
LISTEN: JSR KSETUP
JSR RLISTEN
JMP MEMOUT
;
; open talk channel to disk
; [a] = device number
; [x] = seconday number
TALK: JSR KSETUP
TXA
PHA
JSR RTALK
PLA
JSR RTKSA
JMP MEMOUT
UNTALK: JSR KSETUP
JSR RUNTLK
JMP MEMOUT
KSETUP: PHA ; SAVE [A] IN CASE IS NEEDED
LDA BANK0 ; SET TO BANK0 WHERE CAN ACCESS KERNAL
STA CR
PLA
RTS
MEMOUT: PHA
LDA BANK1
STA CR
PLA
RTS
;;
;; this is the 'get at expansion memory' code, cuz it has to be
;; slow, and must get at the i/o space too
;;
;; [X] - expansion ram bank
;; [Y] - expansion ram page
;; [A] - XREAD or XWRITE
;;
;; Data is in IOBUFF
;;
EXIO:
JSR KSETUP ; get i/o rom here
STX XFLAGS+XBANK ; BANK CURRENTLY WRITING TO
LDX #0
STX FASTER ; make it go slow
STX XFLAGS+XRAM+LO
STX XFLAGS+XINT ; NO INTERRUPTS
STX XFLAGS+XINCR ; INCREMENT ADDR POINTERS
STX XFLAGS+XSIZ+LO ; AMOUNT TO WRITE IS 1 PG
INX ; now make a 1
STX XFLAGS+XSIZ+HI
LDX #>IOBUFF
STX XFLAGS+XBUFF+HI
LDX #<IOBUFF
STX XFLAGS+XBUFF+LO
STY XFLAGS+XRAM+HI ; BLOCK IN XRAM
STA XFLAGS+XFER ; THIS WRITE DOES ACTUAL TRANSFER
INC FASTER ; speed me up
JMP MEMOUT ; and gwon back
; THE TWO FILE NAMES CALLED WITH SETNAM, THEY NEED
; TO BE ACCESSIBLE FROM BANK0 FOR THE CALL
I0: DB "I0"
I0L EQU $-I0
POUND: DB "#"
POUNDL EQU $-POUND
; --------------------------------
; RETURN RANDOM BYTES IN [A] & [X]
; --------------------------------
RANDOM: LDA BANK0
STA CR
INC RAND ; RANDOM FROM APPLE (11/4/86 LD)
DEC RASTER
LDA RAND
ADC RNUM1
TAX
LDA RASTER
SBC RNUM2
STA RNUM1
STX RNUM2
LDY BANK1
STY CR
RTS
RNUM1: DB 0
RNUM2: DB 0
BOOP: LDA BANK0
STA CR
LDA #96 ; FREQ LSB
STA FRELO1
LDA #22 ; MSB
STA FREHI1
LDA #$F2
STA TIME
JMP SOUND
BEEP: LDA BANK0
STA CR
LDA #60 ; FREQ LSB
STA FRELO1
LDA #50 ; MSB
STA FREHI1
LDA #$FC
STA TIME
SOUND: LDA #%11110000
STA SUREL1 ; FULL SUSTAIN
LDA #%10001111
STA SIGVOL ; FULL VOLUME
LDA #%01000001
STA VCREG1 ; START PULSE
RAZZ: LDA TIME
BNE RAZZ
STA VCREG1 ; STOP PULSE
LDA #%10000000
STA SIGVOL ; VOLUME OFF
LDA BANK1 ; RESET SYSTEM
STA CR
RTS
; WRITE THE CONTROL REGISTER TO $D600 AND THE CHAR TO $D601
; TO WRITE TO 80 COL CHIP
; MUST WRITE ADDRESS (MSB, LSB) THEN CHAR. THRU THIS
; PROCESS, THE ONLY ACCESS POINT IN REGULAR MEMORY
; IS THRU $D600 & $D601
WRTCHR: PHA ; SAVE CHAR TO SEND
LDA BANK0
STA CR
LDA #$12 ; MSB
JSR WRTREG
STX $D601
LDA #$13 ; LSB OF ADDR
JSR WRTREG
STY $D601
LDA #$1F ; THE CHAR TO WRITE THERE
JSR WRTREG
PLA
STA $D601
LDA BANK1 ; RESET SYSTEM
STA CR
RTS
WRTREG: STA $D600
WAIT: BIT $D600
BPL WAIT
RTS
; SET BACKGROUND COLOR IN REGISTER 26 BITS 3-0 OF 80 COL CHIP
COLOR: STA IOCHAR
LDA BANK0
STA CR
LDA #26 ; READ WHAT'S IN THERE NOW
JSR WRTREG
LDA $D601
AND #$F0 ; CLEAR OFF LOW NIBBLE
ORA IOCHAR ; ADD IN NEW COLOR
PHA
LDA #26 ; SET IT UP
JSR WRTREG
PLA ; TO PUT NEW COLOR IN
STA $D601
LDA BANK1 ; RESET SYSTEM
STA CR
RTS
; DON'T HAVE TO FILL OUT SECTOR TO ALIGN PAGES CAUSE 2500AD
; CROSS ASSEMBLER DOES THAT TO EXCESS
END