mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-12-22 07:30:54 +00:00
1 line
5.3 KiB
NASM
1 line
5.3 KiB
NASM
|
mcopy native.macros
****************************************************************
*
* Remove - remove an instruction from the peephole array
*
* Inputs:
* ns - index of element to remove
*
****************************************************************
*
Remove start
elSize equ 12 size of an element
nPeepSize equ 128 size of array
ns equ 4 array element
lda ns,S compute the source address
cmp #nPeepSize (quit if nothing to move)
bge rtl
asl a
adc ns,S
asl a
asl a
adc #NPEEP
tax
sec compute the source address
sbc #elSize
tay
sec compute the move length
sbc #(nPeepSize-1)*elSize+NPEEP
eor #$FFFF
mvn NPEEP,NPEEP move the array elements
rtl dec nNextSpot nnextspot := nnextspot-1;
lda #1 didone := true;
sta didOne
lda 2,S fix stack and return
sta 4,S
pla
sta 1,S
rtl
end
****************************************************************
*
* Short - See if label lab is within short range of instruction n
*
* Inputs:
* n - instruction number
* lab - label number
*
****************************************************************
*
Short start
elSize equ 12 size of npeep array element
peep_opcode equ 0 disp in nativeType of opcode
peep_mode equ 2 disp in nativeType of mode
peep_operand equ 4 disp in nativeType of operand
peep_name equ 6 disp in nativeType of name
peep_flags equ 10 disp in nativeType of flags
d_lab equ 256 label op code #
len equ 0
i equ 2
subroutine (2:n,2:lab),4
stz len len := 0;
lda n i := n-1;
dec a while i > 0 do begin
dec a
ldx #elSize
jsl ~mul2
tax
bmi lb3
lb1 lda nPeep+peep_opcode,X if npeep[i].opcode = d_lab then
cmp #d_lab
bne lb2
lda nPeep+peep_operand,X if npeep[i].operand = lab then begin
cmp lab
bne lb2
stz fn Short := len <= 126;
lda len
cmp #127
bge lab1
inc fn
bra lab1 goto 1;
lb2 anop end;
lda nPeep+peep_opcode,X len := len+size[npeep[i].mode];
tay
lda size,Y
and #$00FF
clc
adc len
sta len
txa i := i-1;
sec
sbc #elSize
tax
bpl lb1 end; {while}
lb3 stz len len := 0;
lda n i := n+1;
ldx #elSize
jsl ~mul2
tax
lda n
inc a
sta i
lb4 lda i while i < nnextspot do begin
cmp nNextSpot
bge lb6
lda nPeep+peep_opcode,X if npeep[i].opcode = d_lab then
cmp #d_lab
bne lb5
lda nPeep+peep_operand,X if npeep[i].operand = lab then begin
cmp lab
bne lb5
stz fn Short := len < 128;
lda len
cmp #128
bge lab1
inc fn
bra lab1 goto 1;
lb5 anop end;
lda nPeep+peep_opcode,X len := len+size[npeep[i].mode];
tay
|