mirror of
https://github.com/cc65/cc65.git
synced 2024-08-19 02:29:33 +00:00
266 lines
3.4 KiB
ArmAsm
266 lines
3.4 KiB
ArmAsm
|
;
|
||
|
; Runtime code for cc65.
|
||
|
;
|
||
|
|
||
|
|
||
|
.import ldai, ldaxi, pushax
|
||
|
.importzp sp, tmp1, tmp2, tmp3, ptr1, ptr4
|
||
|
|
||
|
|
||
|
; Pop a from stack
|
||
|
.export popa
|
||
|
|
||
|
popa: ldy #0
|
||
|
lda (sp),y ; Read byte
|
||
|
inc sp
|
||
|
bne *+4
|
||
|
inc sp+1
|
||
|
rts
|
||
|
|
||
|
;
|
||
|
; pop a from stack and load x with zero
|
||
|
;
|
||
|
|
||
|
.export popa0
|
||
|
|
||
|
popa0: ldy #0
|
||
|
lda (sp),y ; load low byte
|
||
|
ldx #0
|
||
|
beq incsp2
|
||
|
|
||
|
;
|
||
|
; pop a/x from stack. This function will run directly into incsp2
|
||
|
;
|
||
|
|
||
|
.export popax ; pop stack into AX
|
||
|
|
||
|
popax: ldy #1
|
||
|
lda (sp),y ; get hi byte
|
||
|
tax ; into x
|
||
|
dey
|
||
|
lda (sp),y ; get lo byte
|
||
|
|
||
|
;
|
||
|
; routines for inc/dec'ing sp
|
||
|
;
|
||
|
|
||
|
.export addysp, addysp1
|
||
|
.export incsp1, incsp2, incsp3, incsp4
|
||
|
.export incsp5, incsp6, incsp7, incsp8
|
||
|
|
||
|
; do this by hand, cause it gets used a lot
|
||
|
|
||
|
incsp2: ldy sp ; 3
|
||
|
iny ; 2
|
||
|
beq @L1 ; 2
|
||
|
iny ; 2
|
||
|
beq @L2 ; 2
|
||
|
sty sp ; 3
|
||
|
rts
|
||
|
|
||
|
@L1: iny ; 2
|
||
|
@L2: sty sp ; 3
|
||
|
inc sp+1 ; 5
|
||
|
rts
|
||
|
|
||
|
; Hand optimize this one also...
|
||
|
|
||
|
incsp1: inc sp
|
||
|
bne *+4
|
||
|
inc sp+1
|
||
|
rts
|
||
|
|
||
|
incsp3: ldy #3
|
||
|
bne addysp
|
||
|
|
||
|
incsp4: ldy #4
|
||
|
bne addysp
|
||
|
|
||
|
incsp5: ldy #5
|
||
|
bne addysp
|
||
|
|
||
|
incsp6: ldy #6
|
||
|
bne addysp
|
||
|
|
||
|
incsp7: ldy #7
|
||
|
bne addysp
|
||
|
|
||
|
incsp8: ldy #8
|
||
|
bne addysp
|
||
|
|
||
|
addysp1:
|
||
|
iny
|
||
|
addysp: pha ; save A
|
||
|
clc
|
||
|
tya ; get the value
|
||
|
adc sp ; add lo byte
|
||
|
sta sp ; put it back
|
||
|
bcc addysp_1 ; if no carry, we're done
|
||
|
inc sp+1 ; inc hi byte
|
||
|
addysp_1:
|
||
|
pla ; get A back
|
||
|
rts
|
||
|
|
||
|
|
||
|
;
|
||
|
;
|
||
|
.export subysp ; sub Y from SP
|
||
|
.export decsp1, decsp2, decsp3, decsp4
|
||
|
.export decsp5, decsp6, decsp7, decsp8
|
||
|
|
||
|
; Do this one by hand, cause it gets used a lot
|
||
|
|
||
|
decsp2: ldy sp
|
||
|
beq @L1
|
||
|
dey
|
||
|
beq @L2
|
||
|
dey
|
||
|
sty sp
|
||
|
rts
|
||
|
|
||
|
@L1: dey
|
||
|
@L2: dey
|
||
|
sty sp
|
||
|
dec sp+1
|
||
|
rts
|
||
|
|
||
|
; Decrement by 1 also done as fast as possible
|
||
|
|
||
|
decsp1: ldy sp
|
||
|
bne *+4
|
||
|
dec sp+1
|
||
|
dec sp
|
||
|
rts
|
||
|
|
||
|
decsp3: ldy #3
|
||
|
bne subysp
|
||
|
|
||
|
decsp4: ldy #4
|
||
|
bne subysp
|
||
|
|
||
|
decsp5: ldy #5
|
||
|
bne subysp
|
||
|
|
||
|
decsp6: ldy #6
|
||
|
bne subysp
|
||
|
|
||
|
decsp7: ldy #7
|
||
|
bne subysp
|
||
|
|
||
|
decsp8: ldy #8
|
||
|
; bne subysp
|
||
|
|
||
|
subysp: pha ; save A
|
||
|
sty tmp1 ; save the value
|
||
|
lda sp ; get lo byte
|
||
|
sec
|
||
|
sbc tmp1 ; sub y val
|
||
|
sta sp ; put it back
|
||
|
bcs *+4
|
||
|
dec sp+1
|
||
|
pla ; get A back
|
||
|
rts ; done
|
||
|
|
||
|
;
|
||
|
; Various kinds of store operators
|
||
|
;
|
||
|
; store AX at SP@@(Y)
|
||
|
|
||
|
.export staxspidx, staspidx, staspic
|
||
|
staxspidx:
|
||
|
jsr staspic ; use common part
|
||
|
pha
|
||
|
iny
|
||
|
lda tmp2
|
||
|
sta (ptr4),y
|
||
|
tax
|
||
|
pla
|
||
|
rts
|
||
|
staspidx:
|
||
|
jsr staspic ; use common part
|
||
|
ldx tmp2
|
||
|
rts
|
||
|
|
||
|
staspic:
|
||
|
sta tmp1
|
||
|
stx tmp2
|
||
|
sty tmp3
|
||
|
jsr popax ; get the pointer
|
||
|
sta ptr4
|
||
|
stx ptr4+1
|
||
|
ldy tmp3
|
||
|
lda tmp1
|
||
|
sta (ptr4),y
|
||
|
rts
|
||
|
|
||
|
; ax --> (sp),y
|
||
|
|
||
|
|
||
|
.export staxspp ; store AX thru (sp), and pop
|
||
|
staxspp:
|
||
|
ldy #0
|
||
|
pha
|
||
|
lda (sp),y
|
||
|
sta ptr1
|
||
|
iny
|
||
|
lda (sp),y
|
||
|
sta ptr1+1
|
||
|
txa
|
||
|
sta (ptr1),y
|
||
|
pla
|
||
|
dey
|
||
|
sta (ptr1),y
|
||
|
jmp incsp2 ; Drop address
|
||
|
|
||
|
|
||
|
.export staspp ; store A thru (sp), and pop
|
||
|
staspp:
|
||
|
ldy #1
|
||
|
pha
|
||
|
lda (sp),y
|
||
|
sta ptr1+1
|
||
|
dey
|
||
|
lda (sp),y
|
||
|
sta ptr1
|
||
|
pla
|
||
|
sta (ptr1),y
|
||
|
jmp incsp2 ; Drop address
|
||
|
|
||
|
|
||
|
;
|
||
|
; Boolean function return entries.
|
||
|
;
|
||
|
|
||
|
.export return0, return1
|
||
|
|
||
|
return1:
|
||
|
ldx #0
|
||
|
lda #1
|
||
|
rts
|
||
|
|
||
|
return0:
|
||
|
lda #0
|
||
|
tax
|
||
|
rts
|
||
|
|
||
|
;
|
||
|
; random stuff
|
||
|
;
|
||
|
|
||
|
; (a/x) 16--> (--sp)
|
||
|
|
||
|
.export pushwaxi
|
||
|
pushwaxi: ; push word at (ax)
|
||
|
jsr ldaxi
|
||
|
jmp pushax
|
||
|
|
||
|
; (a/x) 8--> (--sp)
|
||
|
|
||
|
.export pushbaxi ; push byte at (ax)
|
||
|
pushbaxi:
|
||
|
jsr ldai
|
||
|
jmp pushax
|
||
|
|
||
|
|
||
|
|