1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-10-18 07:24:16 +00:00

Assembly-ize some rotuines

This commit is contained in:
David Schmenk 2019-12-26 16:01:38 -08:00
parent e258131e71
commit 755c4b424a
2 changed files with 308 additions and 112 deletions

View File

@ -157,6 +157,21 @@ export asm divmod7(x)#2
STA ESTKH+1,X
RTS
end
//export def hgrColor(c)#0
// curhclr = hcolor[c & $07]
//end
export asm hgrColor(c)#0
LDA ESTKL+0,X ; COLOR
AND #$07
ASL
TAY
LDA $1000,Y ; HCOLORL
STA $2000 ; CURHCLRL
LDA $1001,Y ; HCOLORH
STA $2001 ; CRHCLRH
INX
RTS
end
//export def hgrCopyDst(ofst, y, w, h, dstptr)#0
// word j, srcptr
//
@ -459,94 +474,256 @@ asm _hgrPlotD
INX
RTS
end
export def hgrXorPlot(x, y)#0
word pixptr
byte ofst, pixofst, pmask
ofst, pixofst = divmod7(x)
pixptr = hgrscan[y] + drawbuff + ofst
pmask = hbmask[pixofst]
^pixptr = ^pixptr ^ (curhclr.[ofst & 1] & pmask)
//export def hgrXorPlot(x, y)#0
// word pixptr
// byte ofst, pixofst, pmask
//
// ofst, pixofst = divmod7(x)
// pixptr = hgrscan[y] + drawbuff + ofst
// pmask = hbmask[pixofst]
// ^pixptr = ^pixptr ^ (curhclr.[ofst & 1] & pmask)
//end
export asm hgrXorPlot(x, y)#0
LDY ESTKL+0,X ; Y COORD
CPY #192
BCS +
end
export def hgrHlin(x1, x2, y)#0
word pixptr, x
byte lofst, lpixofst, lpmask
byte rofst, rpixofst, rpmask
if x1 == x2
hgrPlot(x1, y)
else
lofst, lpixofst = divmod7(x1)
pixptr = hgrscan[y] + drawbuff + lofst
rofst, rpixofst = divmod7(x2)
lpmask = hlmask[lpixofst]
rpmask = hrmask[rpixofst]
if lofst == rofst
lpmask = lpmask & rpmask
^pixptr = (^pixptr & ~lpmask) | (curhclr.[pixptr.0 & 1] & lpmask)
else
^pixptr = (^pixptr & ~lpmask) | (curhclr.[pixptr.0 & 1] & lpmask)
pixptr++
for x = lofst + 1 to rofst - 1
^pixptr = curhclr.[pixptr.0 & 1]
pixptr++
next
^pixptr = (^pixptr & ~rpmask) | (curhclr.[pixptr.0 & 1] & rpmask)
fin
fin
asm _hgrXorPlotA
LDA $8000,Y ; HGRSCANL
STA DSTL
LDA $1000 ; DRAWBUFFH
ORA $9000,Y ; HGRSCANH
STA DSTH
INX
end
export def hgrVlin(y1, y2, x)#0
word pixptr, y, ofst
byte pixofst, pmask, cmask
if y1 == y2
hgrPlot(x, y1)
else
ofst, pixofst = divmod7(x)
ofst = ofst + drawbuff
pmask = hbmask[pixofst]
cmask = curhclr.[ofst & 1] & pmask
pmask = ~pmask
for y = y1 to y2
pixptr = hgrscan[y] + ofst
^pixptr = (^pixptr & pmask) | cmask
next
fin
asm _hgrXorPlotB
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; PIXEL OFFSET
end
asm _hgrXorPlotC
LDA $1000,Y ; HBMASK
STA TMPL
LDA ESTKL+1,X ; HORIZ OFFSET
CMP #40
BCS +
AND #$01
TAY
end
asm _hgrXorPlotD
LDA $2000,Y ; CURHCLR
AND TMPL
LDY ESTKL+1,X ; HORIZ OFFSET
EOR (DST),Y
STA (DST),Y
+ INX
INX
RTS
end
//export def hgrHLin(x1, x2, y)#0
// word pixptr, x
// byte lofst, lpixofst, lpmask
// byte rofst, rpixofst, rpmask
//
// if x1 == x2
// hgrPlot(x1, y)
// else
// lofst, lpixofst = divmod7(x1)
// pixptr = hgrscan[y] + drawbuff + lofst
// rofst, rpixofst = divmod7(x2)
// lpmask = hlmask[lpixofst]
// rpmask = hrmask[rpixofst]
// if lofst == rofst
// lpmask = lpmask & rpmask
// ^pixptr = (^pixptr & ~lpmask) | (curhclr.[pixptr.0 & 1] & lpmask)
// else
// ^pixptr = (^pixptr & ~lpmask) | (curhclr.[pixptr.0 & 1] & lpmask)
// pixptr++
// for x = lofst + 1 to rofst - 1
// ^pixptr = curhclr.[pixptr.0 & 1]
// pixptr++
// next
// ^pixptr = (^pixptr & ~rpmask) | (curhclr.[pixptr.0 & 1] & rpmask)
// fin
// fin
//end
export asm hgrHLin(x1, x2, y)#0
LDA ESTKL+1
CMP ESTKL+2
BNE +
LDA ESTKH+1
CMP ESTKH+2
BNE +
LDA ESTKL+0
STA ESTKL+1
LDA ESTKH+0
STA ESTKH+1
INX
end
asm _hgrHLinA
JMP $F000
+ LDY ESTKL+0,X ; Y COORD
CPY #192
BCS +
end
asm _hgrHLinB
LDA $8000,Y ; HGRSCANL
STA DSTL
LDA $1000 ; DRAWBUFFH
ORA $9000,Y ; HGRSCANH
STA DSTH
LDA ESTKL+1,X
STA ESTKL+0,X
LDA ESTKH+1,X
STA ESTKH+0,X
end
asm _hgrHLinC
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; RIGHT PIXEL OFFSET
end
asm _hgrHLinD
LDA $1000,Y ; HRMASK
STA TMPH
INX
INX
INX
end
asm _hgrHLinE
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; LEFT PIXEL OFFSET
end
asm _hgrHLinF
LDA $1000,Y ; HLMASK
STA TMPL
LDA ESTKL+1,X ; LEFT HORIZ OFFSET
TAY
LSR
BCS +
end
asm _hgrHLinG
LDA $2000 ; CURHCLRL
STA SRCL
LDA $2001 ; CURHCLRH
STA SRCH
BCC ++
+ LDA $2000 ; CURHCLRL
STA SRCH
LDA $2001 ; CURHCLRH
STA SRCL
++ TYA
CMP ESTKL-1,X ; RIGHT HORIZ OFFSET
BNE +
LDA TMPL
AND TMPH
STA TMPL
AND SRCL
STA TMPH
LDA TMPL
EOR #$FF
AND (DST),Y
ORA TMPH
STA (DST),Y
INX
INX
RTS
+ LDA SRCL ; CURHCLR
AND TMPL
STA ESTKL+0,X
LDA TMPL
EOR #$FF
AND (DST),Y
ORA ESTKL+0,X
- STA (DST),Y
INY
TYA
CMP ESTKL-1,X ; RIGHT HORIZ OFFSET
LDA SRCH
BCS +
STA (DST),Y
INY
TYA
CMP ESTKL-1,X ; RIGHT HORIZ OFFSET
LDA SRCL
BCC -
+ AND TMPH
STA ESTKL+0,X
LDA TMPH
EOR #$FF
AND (DST),Y
ORA ESTKL+0,X
STA (DST),Y
INX
INX
RTS
end
//export def hgrVlin(y1, y2, x)#0
// word pixptr, y, ofst
// byte pixofst, pmask, cmask
//
// if y1 == y2
// hgrPlot(x, y1)
// else
// ofst, pixofst = divmod7(x)
// ofst = ofst + drawbuff
// pmask = hbmask[pixofst]
// cmask = curhclr.[ofst & 1] & pmask
// pmask = ~pmask
// for y = y1 to y2
// pixptr = hgrscan[y] + ofst
// ^pixptr = (^pixptr & pmask) | cmask
// next
// fin
//end
export asm hgrVlin(y1, y2, x)#0
JSR 1000 ; DIVMOD7
LDY ESTKL+0,X ; PIXEL OFFSET
end
asm _hgrVLinA
LDA $1000,Y ; HBMASK
STA TMPL
EOR #$FF
STA TMPH
LDA ESTKL+1,X ; HORIZ OFFSET
AND #$01
TAY
end
asm _hgrVLinB
LDA $2000,Y ; CURHCLR
AND TMPL
STA TMPL
LDY ESTKL+3,X ; Y1 COORD
end
asm _hgrVLinC
- LDA $8000,Y ; HGRSCANL
STA DSTL
LDA $1000 ; DRAWBUFFH
ORA $9000,Y ; HGRSCANH
STA DSTH
LDY ESTKL+1,X ; HORIZ OFFSET
LDA (DST),Y
AND TMPH
ORA TMPL
STA (DST),Y
LDY ESTKL+3,X ; Y1 COORD
TYA
INY
STY ESTKL+3,X ; Y1 COORD
CMP ESTKL+2,X ; Y2 COORD
BNE -
INX
INX
INX
INX
RTS
end
export def hgrRect(x1, x2, y1, y2)#0
word pixptr, x, y, lofst, rofst
byte lpixofst, lpmask, cmask
byte rpixofst, rpmask
word y
if x1 == x2
hgrVLin(y1, y2, x1)
else
lofst, lpixofst = divmod7(x1)
rofst, rpixofst = divmod7(x2)
lofst = lofst + drawbuff
rofst = rofst + drawbuff
lpmask = hlmask[lpixofst]
rpmask = hrmask[rpixofst]
if lofst == rofst
lpmask = lpmask & rpmask
cmask = curhclr.[pixptr.0 & 1] & lpmask
lpmask = ~lpmask
for y = y1 to y2
pixptr = hgrscan[y] + lofst
^pixptr = (^pixptr & lpmask) | cmask
next
else
for y = y1 to y2
pixptr = hgrscan[y] + lofst
^pixptr = (^pixptr & ~lpmask) | (curhclr.[pixptr.0 & 1] & lpmask)
pixptr++
for x = lofst + 1 to rofst - 1
^pixptr = curhclr.[pixptr.0 & 1]
pixptr++
next
^pixptr = (^pixptr & ~rpmask) | (curhclr.[pixptr.0 & 1] & rpmask)
next
fin
for y = y1 to y2
hgrHLin(x1, x2, y)
next
fin
end
export def hgrBLT(x, y, w, h, srcptr)#0
@ -559,14 +736,14 @@ export def hgrBLT(x, y, w, h, srcptr)#0
for i = 0 to w - 1
c = srcptr->[i >> 1]
if i & 1
curhclr = hcolor[c & $07]
hgrColor(c)
if c & $08
hgrXorPlot(x + i, j)
else
hgrPlot(x + i, j)
fin
else
curhclr = hcolor[(c >> 4) & $07]
hgrColor(c >> 4)
if c & $80
hgrXorPlot(x + i, j)
else
@ -578,9 +755,6 @@ export def hgrBLT(x, y, w, h, srcptr)#0
next
curhclr = saveclr
end
export def hgrColor(c)#0
curhclr = hcolor[c & $07]
end
export def hgrMode#1
memset(hgr1, 0, $2000) // Clear HGR page 1
^showpage1
@ -619,26 +793,53 @@ end
//
// Assembly fixups
//
_hgrCopyDst:1 = @hgrscanl
_hgrCopyDst:6 = @drawbuff.1
_hgrCopyDst:9 = @hgrscanh
_hgrCopySrc:1 = @hgrscanl
_hgrCopySrc:6 = @drawbuff.1
_hgrCopySrc:9 = @hgrscanh
_hgrAndSrc:1 = @hgrscanl
_hgrAndSrc:6 = @drawbuff.1
_hgrAndSrc:9 = @hgrscanh
_hgrXorSrc:1 = @hgrscanl
_hgrXorSrc:6 = @drawbuff.1
_hgrXorSrc:9 = @hgrscanh
_hgrOrSrc:1 = @hgrscanl
_hgrOrSrc:6 = @drawbuff.1
_hgrOrSrc:9 = @hgrscanh
_hgrPlotA:1 = @hgrscanl
_hgrPlotA:6 = @drawbuff.1
_hgrPlotA:9 = @hgrscanh
_hgrPlotB:1 = @divmod7
_hgrPlotC:1 = @hbmask
_hgrPlotD:1 = @curhclr
_hgrCopyDst:1 = @hgrscanl
_hgrCopyDst:6 = @drawbuff.1
_hgrCopyDst:9 = @hgrscanh
_hgrCopySrc:1 = @hgrscanl
_hgrCopySrc:6 = @drawbuff.1
_hgrCopySrc:9 = @hgrscanh
_hgrAndSrc:1 = @hgrscanl
_hgrAndSrc:6 = @drawbuff.1
_hgrAndSrc:9 = @hgrscanh
_hgrXorSrc:1 = @hgrscanl
_hgrXorSrc:6 = @drawbuff.1
_hgrXorSrc:9 = @hgrscanh
_hgrOrSrc:1 = @hgrscanl
_hgrOrSrc:6 = @drawbuff.1
_hgrOrSrc:9 = @hgrscanh
_hgrPlotA:1 = @hgrscanl
_hgrPlotA:6 = @drawbuff.1
_hgrPlotA:9 = @hgrscanh
_hgrPlotB:1 = @divmod7
_hgrPlotC:1 = @hbmask
_hgrPlotD:1 = @curhclr
_hgrXorPlotA:1 = @hgrscanl
_hgrXorPlotA:6 = @drawbuff.1
_hgrXorPlotA:9 = @hgrscanh
_hgrXorPlotB:1 = @divmod7
_hgrXorPlotC:1 = @hbmask
_hgrXorPlotD:1 = @curhclr
_hgrHLinA:1 = @hgrPlot
_hgrHLinB:1 = @hgrscanl
_hgrHLinB:6 = @drawbuff.1
_hgrHLinB:9 = @hgrscanh
_hgrHLinC:1 = @divmod7
_hgrHLinD:1 = @hrmask
_hgrHLinE:1 = @divmod7
_hgrHLinF:1 = @hlmask
_hgrHLinG:1 = @curhclr
_hgrHLinG:6 = @curhclr.1
_hgrHLinG:13 = @curhclr.1
_hgrHLinG:18 = @curhclr
hgrVLin:1 = @divmod7
_hgrVLinA:1 = @hbmask
_hgrVLinB:1 = @curhclr
_hgrVLinC:1 = @hgrscanl
_hgrVLinC:6 = @drawbuff.1
_hgrVLinC:9 = @hgrscanh
hgrColor:7 = @hcolor
hgrColor:10 = @curhclr
hgrColor:13 = @hcolor.1
hgrColor:16 = @curhclr.1
done

View File

@ -70,7 +70,6 @@ MON = rel/apple/MON\#FE1000
HGRTEST = rel/apple/HGRTEST\#FE1000
GRTEST = rel/apple/GRTEST\#FE1000
DGRTEST = rel/apple/DGRTEST\#FE1000
HGRTEST = rel/apple/HGRTEST\#FE1000
MEMMGR = rel/MEMMGR\#FE1000
MEMTEST = rel/MEMTEST\#FE1000
FIBERTEST = rel/FIBERTEST\#FE1000
@ -429,10 +428,6 @@ $(DGRTEST): samplesrc/dgrtest.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/dgrtest.pla > samplesrc/dgrtest.a
acme --setpc 4094 -o $(DGRTEST) samplesrc/dgrtest.a
$(HGRTEST): samplesrc/hgrtest.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < samplesrc/hgrtest.pla > samplesrc/hgrtest.a
acme --setpc 4094 -o $(HGRTEST) samplesrc/hgrtest.a
$(MON): utilsrc/apple/mon.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW < utilsrc/apple/mon.pla > utilsrc/apple/mon.a
acme --setpc 4094 -o $(MON) utilsrc/apple/mon.a