mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-11-17 05:06:10 +00:00
5b26b8cc5b
This allows the code to be displayed properly on GitHub and in modern text editors, which typically do not support the irregularly-spaced tab stops used for ORCA/M code. It also avoids any possibility of problems building the code if the SysTabs file is missing or has been customized with non-standard tab stops.
235 lines
5.6 KiB
NASM
235 lines
5.6 KiB
NASM
mcopy objout.macros
|
|
****************************************************************
|
|
*
|
|
* CnOut - write a byte to the constant buffer
|
|
*
|
|
* Inputs:
|
|
* i - byte to write
|
|
*
|
|
****************************************************************
|
|
*
|
|
CnOut start
|
|
maxCBuffLen equ 191 max index into the constant buffer
|
|
|
|
lda cBuffLen if cBuffLen = maxCBuffLen then
|
|
cmp #maxCBuffLen
|
|
bne lb1
|
|
jsl Purge Purge;
|
|
lb1 phb cBuff[cBuffLen] := i;
|
|
plx
|
|
ply
|
|
pla
|
|
phy
|
|
phx
|
|
plb
|
|
ldx cBuffLen
|
|
short M
|
|
sta cBuff,X
|
|
long M
|
|
inc cBuffLen cBuffLen := cBuffLen+1;
|
|
rtl
|
|
end
|
|
|
|
****************************************************************
|
|
*
|
|
* CnOut2 - write a word to the constant buffer
|
|
*
|
|
* Inputs:
|
|
* i - word to write
|
|
*
|
|
****************************************************************
|
|
*
|
|
CnOut2 start
|
|
maxCBuffLen equ 191 max index into the constant buffer
|
|
|
|
lda cBuffLen if cBuffLen+1 >= maxCBuffLen then
|
|
inc A
|
|
cmp #maxCBuffLen
|
|
blt lb1
|
|
jsl Purge Purge;
|
|
lb1 phb cBuff[cBuffLen] := i;
|
|
plx
|
|
ply
|
|
pla
|
|
phy
|
|
phx
|
|
plb
|
|
ldx cBuffLen
|
|
sta cBuff,X
|
|
inx cBuffLen := cBuffLen+2;
|
|
inx
|
|
stx cBuffLen
|
|
rtl
|
|
end
|
|
|
|
****************************************************************
|
|
*
|
|
* COut - write a code byte to the object file
|
|
*
|
|
* Inputs:
|
|
* b - byte to write (on stack)
|
|
*
|
|
****************************************************************
|
|
*
|
|
COut start
|
|
|
|
phb OutByte(b);
|
|
pla
|
|
ply
|
|
plx
|
|
phy
|
|
pha
|
|
plb
|
|
jsr OutByte
|
|
inc blkcnt blkcnt := blkcnt+1;
|
|
inc4 pc pc := pc+1;
|
|
rtl
|
|
end
|
|
|
|
****************************************************************
|
|
*
|
|
* Out2 - write a word to the output file
|
|
*
|
|
* Inputs:
|
|
* w - word to write (on stack)
|
|
*
|
|
****************************************************************
|
|
*
|
|
Out2 start
|
|
|
|
phb OutWord(w);
|
|
pla
|
|
ply
|
|
plx
|
|
phy
|
|
pha
|
|
plb
|
|
jsr OutWord
|
|
inc blkcnt blkcnt := blkcnt+2;
|
|
inc blkcnt
|
|
rtl
|
|
end
|
|
|
|
****************************************************************
|
|
*
|
|
* Out - write a byte to the output file
|
|
*
|
|
* Inputs:
|
|
* b - byte to write (on stack)
|
|
*
|
|
****************************************************************
|
|
*
|
|
Out start
|
|
|
|
phb OutByte(b);
|
|
pla
|
|
ply
|
|
plx
|
|
phy
|
|
pha
|
|
plb
|
|
jsr OutByte
|
|
inc blkcnt blkcnt := blkcnt+1;
|
|
rtl
|
|
end
|
|
|
|
****************************************************************
|
|
*
|
|
* OutByte - write a byte to the object file
|
|
*
|
|
* Inputs:
|
|
* X - byte to write
|
|
*
|
|
****************************************************************
|
|
*
|
|
OutByte private
|
|
buffSize equ 16384 buffer size
|
|
|
|
lda objLen if objLen+segDisp+1 = buffSize then
|
|
sec
|
|
adc segDisp
|
|
cmp #buffSize
|
|
blt lb2
|
|
phx PurgeObjBuffer;
|
|
jsl PurgeObjBuffer
|
|
plx
|
|
lda objLen check for segment overflow
|
|
sec
|
|
adc segDisp
|
|
cmp #buffSize
|
|
bge lb2a
|
|
lb2 ph4 objPtr p := pointer(ord4(objPtr)+segDisp);
|
|
tsc p^ := b;
|
|
phd
|
|
tcd
|
|
ldy segDisp
|
|
short M
|
|
txa
|
|
sta [1],Y
|
|
long M
|
|
inc segDisp segDisp := segDisp+1;
|
|
|
|
pld
|
|
tsc
|
|
clc
|
|
adc #4
|
|
tcs
|
|
rts
|
|
|
|
lb2a lda #$1000 handle a segment buffer overflow
|
|
sta segDisp
|
|
ph2 #112
|
|
jsl Error
|
|
rts
|
|
end
|
|
|
|
****************************************************************
|
|
*
|
|
* OutWord - write a word to the object file
|
|
*
|
|
* Inputs:
|
|
* X - word to write
|
|
*
|
|
****************************************************************
|
|
*
|
|
OutWord private
|
|
buffSize equ 16384 buffer size
|
|
|
|
lda objLen if objLen+segDisp+2 = buffSize then
|
|
sec
|
|
adc segDisp
|
|
cmp #buffSize-1
|
|
blt lb2
|
|
phx PurgeObjBuffer;
|
|
jsl PurgeObjBuffer
|
|
plx
|
|
lda objLen check for segment overflow
|
|
sec
|
|
adc segDisp
|
|
cmp #buffSize-1
|
|
bge lb3
|
|
lb2 ph4 objPtr p := pointer(ord4(objPtr)+segDisp);
|
|
tsc p^ := b;
|
|
phd
|
|
tcd
|
|
ldy segDisp
|
|
txa
|
|
sta [1],Y
|
|
iny segDisp := segDisp+2;
|
|
iny
|
|
sty segDisp
|
|
|
|
pld
|
|
tsc
|
|
clc
|
|
adc #4
|
|
tcs
|
|
rts
|
|
|
|
lb3 ph2 #112 flag segment overflow error
|
|
jsl Error
|
|
lda #$1000
|
|
sta segDisp
|
|
rts
|
|
end
|