1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-08-08 09:25:19 +00:00
Files
PLASMA/src/libsrc/dgr.pla
2016-07-08 11:00:18 -07:00

275 lines
3.9 KiB
Plaintext
Executable File

import cmdsys
predef memset, memcpy, heapmark, heapalloc, heaprelease
byte MACHID
end
//
// Apple II hardware constants.
//
const showgraphics = $C050
const showtext = $C051
const showfull = $C052
const showmix = $C053
const showpage1 = $C054
const showpage2 = $C055
const showlores = $C056
const showhires = $C057
const show40 = $C00C
const show80 = $C00D
const mapmain = $C000
const mapaux = $C001
const an3on = $C05E
const an3off = $C05F
const dis80 = $C07E
const ena80 = $C07F
const page1 = 0
const page2 = 1
//
// Screen row address arrays.
//
word[] dgr1rows = $0400,$0480,$0500,$0580,$0600,$0680,$0700,$0780
word = $0428,$04A8,$0528,$05A8,$0628,$06A8,$0728,$07A8
word = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0
word[] dgr2rows = $0800,$0880,$0900,$0980,$0A00,$0A80,$0B00,$0B80
word = $0828,$08A8,$0928,$09A8,$0A28,$0AA8,$0B28,$0BA8
word = $0850,$08D0,$0950,$09D0,$0A50,$0AD0,$0B50,$0BD0
word[] dgrbuff = @dgr1rows, @dgr2rows
//
// Color mapping.
//
byte[] evnclr = $00,$88,$11,$99,$22,$AA,$33,$BB
byte[] = $44,$CC,$55,$DD,$66,$EE,$77,$FF
byte[] oddclr = $00,$11,$22,$33,$44,$55,$66,$77
byte[] = $88,$99,$AA,$BB,$CC,$DD,$EE,$FF
asm dgrUpdate(buff)
!SOURCE "vmsrc/plvmzp.inc"
!MACRO FILLROW .rowaddr {
LDX #39
LDY #79
- LDA (SRC),Y
STA .rowaddr,X
DEY
LDA (SRC),Y
STA $C005 ; WRITE AUX MEM
STA .rowaddr,X
STA $C004 ; WRITE MAIN MEM
DEY
DEX
BPL -
}
LDA ESTKL,X
STA SRCL
LDA ESTKH,X
STA SRCH
STX ESP
PHP
SEI
+FILLROW $0400
INC SRCH
+FILLROW $0480
INC SRCH
+FILLROW $0500
INC SRCH
+FILLROW $0580
INC SRCH
+FILLROW $0600
INC SRCH
+FILLROW $0680
INC SRCH
+FILLROW $0700
INC SRCH
+FILLROW $0780
INC SRCH
+FILLROW $0428
INC SRCH
+FILLROW $04A8
INC SRCH
+FILLROW $0528
INC SRCH
+FILLROW $05A8
INC SRCH
+FILLROW $0628
INC SRCH
+FILLROW $06A8
INC SRCH
+FILLROW $0728
INC SRCH
+FILLROW $07A8
INC SRCH
+FILLROW $0450
INC SRCH
+FILLROW $04D0
INC SRCH
+FILLROW $0550
INC SRCH
+FILLROW $05D0
INC SRCH
+FILLROW $0650
INC SRCH
+FILLROW $06D0
INC SRCH
+FILLROW $0750
INC SRCH
+FILLROW $07D0
PLP
LDX ESP
RTS
end
asm drgPlot(buff, x, y, clr)
; Get buffer address
STX ESP
LDA ESTKL+3,X
STA SRCL
LDA ESTKH+3,X
STA SRCH
LDA ESTKL+1,X ; Y coord
LSR
LDA (SRC),Y
STA DSTL
INY
LDA (SRC),Y
STA DSTH
PHP
SEI
BCS ++
LDA ESTKL+2,X
LSR
PHA
BCS +
LDY ESTKL,X
end
asm dgrPlotEvnEvn
LDA $100,Y
AND #$0F
STA TMPL
PLA
TAY
LDA (DST),Y
AND #$F0
ORA TMPL
STA (DST),Y
BCC ++++
+ LDY ESTKL,X
end
asm dgrPlotEvnOdd
LDA $1000,Y
AND #$F0
STA TMPL
PLA
TAY
LDA (DST),Y
AND #$0F
ORA TMPL
STA (DST),Y
BCS ++++
++ LDA ESTKL+2,X
LSR
PHA
BCS +++
LDY ESTKL,X
end
asm dgrPlotOddEvn
LDA $1000,Y
AND #$0F
STA TMPL
PLA
TAY
LDA (DST),Y
AND #$F0
ORA TMPL
STA (DST),Y
BCC ++++
+++ LDY ESTKL,X
end
asm dgrPlotOddOdd
LDA $1000,Y
AND #$F0
STA TMPL
PLA
TAY
LDA (DST),Y
AND #$0F
ORA TMPL
STA (DST),Y
++++ PLP
LDX ESP
INX
INX
INX
RTS
end
asm vlbWait
DEX
- LDA $C019
BMI -
- LDA $C019
BPL -
RTS
end
def dgrMode
^showlores
^showfull
^showgraphics
^showpage1
^ena80 = 0
^show80 = 0
// ^mapaux = 0
^an3on
end
def txtMode
^showtext
^showpage1
^ena80 = 0
^show40 = 0
^^mapmain = 0
^an3on
end
def dgrClr(buff, clr)
byte row
word fillclr
clr = clr & $0F
fillclr = (oddclr[clr] << 8) | evnclr[clr]
for row = 0 to 5
memset(buff, fillclr, 80)
buff.1++
memset(buff, fillclr, 80)
buff.1++
memset(buff, fillclr, 80)
buff.1++
memset(buff, fillclr, 80)
buff.1++
next
end
def dgrTest
word dgrbuff
byte clsclr
dgrMode
dgrbuff = heapalloc(256*24)
^$C010
while ^$C000 < 128
dgrClr(dgrbuff, clsclr)
//vlbWait
dgrUpdate(dgrbuff)
clsclr++
loop
heaprelease(dgrbuff)
^$C010
txtMode
end
// Assembly fixups
dgrPlotEvnEvn:1 = @evnclr
dgrPlotEvnOdd:1 = @oddclr
dgrPlotOddEvn:1 = @evnclr
dgrPlotOddOdd:1 = @oddclr
dgrTest
done