C02/include/pointer.a02

140 lines
5.0 KiB
Plaintext

;C02 library pointer.h02 assembly language subroutines
;Requires External Zero Page Variables PTRLO, PTRHI
;External Routines MSETSRC
;ptrini - Pointer Initialization code
;Sets: TEMP0 = Memory Pointer Address
PTRINI: STX TEMP0 ;Save Address LSB
TAX ;Copy Memory Pointer to X register
LDA TEMP0 ;Retrieve Address LSB
RTS
;ptradr(ptr, &addr) - Return Address Stored in Pointer
;Args: A = Zero Page Pointer Address
;Sets: TEMP0 = Pointer Address
;Affects: N,Z
;Returns: A = Zero Page Pointer Address
; Y,X = New Pointer Contents
PTRADR: JSR PTRINI ;Swap A and X Registers
PTRRTN: LDY (1,X) ;Load Pointer MSB into Y
LDA (1,X) ;Load Pointer LSB into A
TAX ;and transfer to X
LDA TEMP0 ;Load Pointer Addres into A
RTS
;ptrset(ptr, &addr) - Store Address in Pointer
;Args: A = Zero Page Pointer Address
; X,Y = Address to Store
;Sets: TEMP0 = Pointer Address
;Affects: N,Z
;Returns: A = Zero Page Pointer Address
; Y,X = New Pointer Contents
PTRSET: JSR PTRINI ;Swap A and X Registers
STA 0,X ;Store in Memory Pointer LSB
STY 1,X ;Store Address MSB in Memory Pointer MSB
TXA
LDX TEMP0
RTS ;Return Pointer Address as Result
;ptrcmp(ptr, &addr) - Compare Pointer to Address
;Args: A = Zero Page Pointer Address
; X,Y = Address to Compare Against
;Affects N,Z
;Returns A=$01 and C=? if Pointer > Address
; A=$00 and Z=1, C=? if Pointer = Address
; A=$FF and C=? if Pointer < Address
PTRCMP: JSR PRTINI ;Swap A and X Registers
CPY 1,X ;Compare High Bytes
BCC PTRCMN ;If Pointer > Address, Return 1
BNE PTRCMF ;If Pointer < Address Return 1
CPA 0,X ;Compare Low Byte
BCC PTRCMN ;If Pointer > Address, Return 1
BNE PTRCMF ;If Pointer < Address Return 1
PTRCMZ: LDA #$00 ;Return 0
RTS
PTRCMN: LDA #$01 ;Return 1
RTS
PTRCMF: LDA #$FF ;Return 255
RTS
;ptrget(ptr) - Read Byte from Pointed to Address
; and Increment Pointer
;Args: A = Zero Page Pointer Address
;Affects: N, Z
;Returns: A = Byte at pointer address
; X = Zero Page Pointer Address
PTRGET: TAX ;Transfer Pointer Address to X
LDA (0,X) ;Load Value at Pointer
JMP PTRINN ;Increment Pointer Value
;ptrinc(ptr) - Increment Pointer Address
;Args: A = Zero Page Pointer Address
;Affects: N, Z
;Returns: A,X = Zero Page Pointer Address
PTRINC: TAX ;Transfer Pointer Address to X
PTRINN: INC (0,X) ;Increment Pointer Low Byte
BNE PTRRET ;If Zero
INC (1,X) ; Increment Pointer High Byte
PTRRET: RTS ;Return from function
;ptrput(ptr,byte) - Write Byte from Pointer Address
; and Increment Pointer
;Args: A = Zero Page Pointer Address
; Y = Byte to write
;Affects: N, Z
;Returns: A,X = Zero Page Pointer Address
PTRPUT: TAX ;Transfer Pointer Address to X
STY (0,X) ;Store Value at Pointed to Address
JMP PTRINN ;Increment Pointer
;ptrdec() - Decrement Pointer Address
;Args: A = Zero Page Pointer Address
;Affects: Y, N, Z
;Returns: A = Zero Page Pointer Address
; Y,X = New Pointer Contents
PTRDEC: TAX ;Transfer Pointer Address to X
LDY (0,X) ;Get Pointer Low Byter
BNE PTRDEL ;If Zero
DEC (1,X) ; Decrement Pointer High Byte
PTRDEL: DEC (0,X) ;Decrement Pointer Low Byte
JMP PTRRTN ;Set Registers and Return
;ptradd(ptr, &offset) - Add Offset to Pointer
;Args: A = Zero Page Pointer Address
; Y,X = Number of bytes to add
;Sets: TEMP0 = Pointer Address
;Affects: N, Z
;Returns: A = Zero Page Pointer Address
; Y,X = New Pointer Contents
PTRADD: JSR PRTINI ;Swap A and X Registers
CLC ;Add Offset Low Byte
ADC (0,X) ;to Pointer Low Byte
STA (0,X) ;and Save It
TYA ;Add Offset High Byte
ADC (1,X) ;to Pointer High Byte
STA (1,X) ;and Save It
JMP PTRRTN ;Set Registers and Return
;ptrsub(offset) - Subtract Offset from Pointer
;Args: A = Zero Page Pointer Address
; Y,X = Number of bytes to add
;Sets: TEMP0 = Pointer Address
; TEMP1 = Offset LSB
; TEMP2 = Offset MSB
;Affects: N, Z
;Returns: A = Zero Page Pointer Address
; Y,X = New Pointer Contents
PTRSUB: STY TEMP2 ;Save Offset MSB
STX TEMP1 ;Save Offset LSB
STA TEMP0 ;Save Pointer Address
TAX ;Transfer Pointer Address to X
LDA (0,X) ;Get Pointer Low Byte
SEC ;Subtract Offset LSB
SBC TEMP1 ;from Pointer LSB
STA PTRLO ;and Save It
LDA (1,X) ;Subtract Offset MSB
SBC TEMP1 ;from Pointer MSB
STA (1,X) ;and Save It
JMP PTRRTN ;Set Registers and Return