4cade/src/macros.a

222 lines
4.5 KiB
Plaintext
Raw Normal View History

2018-08-23 20:02:48 +00:00
;license:MIT
;(c) 2018-9 by 4am
2018-08-23 20:02:48 +00:00
;
2018-11-10 15:08:14 +00:00
; common assembler macros (6502 compatible)
2018-08-23 20:02:48 +00:00
;
; for functions that take parameters on the stack
; set (PARAM) to point to the parameters and
; move the stack pointer to the first byte after the parameters
; clobbers A,X,Y
2018-08-23 20:02:48 +00:00
!macro PARAMS_ON_STACK .bytes {
pla
sta PARAM
pla
tax
2018-08-23 20:02:48 +00:00
stx PARAM+1
lda #.bytes
clc
adc PARAM
tay
2018-08-23 20:02:48 +00:00
bcc +
inx
+ txa
pha
tya
2018-08-23 20:02:48 +00:00
pha
}
; for functions that take parameters on the stack
; load a 16-bit value from the parameters on the stack into A (low) and Y (high)
; (assumes PARAMS_ON_STACK was used first)
!macro LDPARAM .offset {
ldy #.offset
2018-08-23 20:02:48 +00:00
lda (PARAM),y
pha
iny
2018-08-23 20:02:48 +00:00
lda (PARAM),y
tay
pla
2018-08-23 20:02:48 +00:00
}
2019-11-27 21:51:43 +00:00
; for functions that take parameters on the stack
; load a 16-bit value from the parameters on the stack into A (low) and Y (high)
; then store it as new source
; (assumes PARAMS_ON_STACK was used first)
!macro LDPARAMPTR .offset,.dest {
ldy #.offset
lda (PARAM),y
sta .dest
iny
lda (PARAM),y
sta .dest+1
}
2018-08-23 20:02:48 +00:00
; load the address of .ptr into A (low) and Y (high)
!macro LDADDR .ptr {
lda #<.ptr
ldy #>.ptr
}
; load a 16-bit value into A (low) and Y (high)
!macro LDAY .ptr {
lda .ptr
ldy .ptr+1
}
; store a 16-bit value from A (low) and Y (high)
!macro STAY .ptr {
sta .ptr
sty .ptr+1
}
2019-10-19 15:49:05 +00:00
!macro LBPL .target {
bmi +
jmp .target
+
}
2019-10-19 15:49:05 +00:00
!macro LBNE .target {
beq +
jmp .target
+
}
2019-10-19 15:49:05 +00:00
!macro LBCS .target {
bcc +
jmp .target
+
}
2018-08-23 20:02:48 +00:00
; use BIT to swallow the following 1-byte opcode
!macro HIDE_NEXT_BYTE {
!byte $24
}
; use BIT to swallow the following 2-byte opcode
!macro HIDE_NEXT_2_BYTES {
!byte $2C
}
; various language card configurations
2019-06-27 14:55:07 +00:00
!macro READ_RAM1_NO_WRITE {
bit $C088
}
!macro READ_RAM1_WRITE_RAM1 {
bit $C08B
bit $C08B
}
!macro READ_RAM2_NO_WRITE {
bit $C080
}
2019-06-20 01:10:56 +00:00
!macro READ_RAM2_WRITE_RAM2 {
bit $C083
bit $C083
}
!macro READ_ROM_WRITE_RAM1 {
bit $C089
bit $C089
}
2019-06-20 01:36:49 +00:00
!macro READ_ROM_WRITE_RAM2 {
bit $C081
bit $C081
}
!macro READ_ROM_NO_WRITE {
bit $C082
}
2019-06-18 18:56:05 +00:00
!macro LOW_ASCII_TO_LOWER {
cmp #$41
bcc +
cmp #$5B
bcs +
ora #$20
+
}
2019-06-27 15:37:23 +00:00
; requires setting zpCharMask in zero page to #$FF or #$DF before use
!macro FORCE_UPPERCASE_IF_REQUIRED {
cmp #$E1
bcc +
and zpCharMask
+
}
; these are mostly for prelaunchers -- code in the main program should keep track of which bank is active to minimize code size
!macro ENABLE_ACCEL {
+READ_RAM2_NO_WRITE
jsr EnableAccelerator
+READ_ROM_NO_WRITE
}
!macro DISABLE_ACCEL {
+READ_RAM2_NO_WRITE
jsr DisableAccelerator
+READ_ROM_NO_WRITE
}
!macro GET_MACHINE_STATUS {
+READ_RAM2_NO_WRITE
lda MachineStatus
+READ_ROM_NO_WRITE
}
2019-12-15 03:15:27 +00:00
!macro USES_TEXT_PAGE_2 {
2019-12-15 04:59:28 +00:00
lda ROM_MACHINEID
cmp #$06
bne +
2019-12-15 03:15:27 +00:00
sec
jsr $FE1F ; check for IIgs
bcs +
jsr ROM_TEXT2COPY ; set alternate display mode on IIgs (required for some games)
+
}
!macro RESET_VECTOR .addr {
lda #<.addr
sta $3F2
lda #>.addr
sta $3F3
eor #$A5
sta $3F4
}
; for games that clobber $100-$105, the prelaunch code constructs a new reset vector
; somewhere else and sets its
!macro NEW_RESET_VECTOR .addr {
lda #$2C
sta .addr
lda #$88
sta .addr+1
lda #$C0
sta .addr+2
lda #$6C ; JMP ($FFFC) points to 'Reenter'
sta .addr+3
lda #$FC
sta .addr+4
lda #$FF
sta .addr+5
+RESET_VECTOR .addr
}
; for 64k games on ][+ which either hang or restart
; updates reset hook to reboot on ctrl-reset
!macro LC_REBOOT {
lda #$82 ; (assumes LC is switched in)
sta $101
lda #$A6
sta $104
lda #$FA
sta $105 ; update reset hook to reboot
lda #0
sta $FFFC
lda #1
sta $FFFD ; LC reset vector fix
}