1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-02-09 04:30:37 +00:00

Apple /// lo-res graphics (and fix STDLIB module address)

This commit is contained in:
David Schmenk 2014-06-19 14:17:02 -07:00
parent 72bea1e510
commit 0f325d66c4
4 changed files with 200 additions and 48 deletions

View File

@ -1,20 +1,14 @@
import STDLIB import STDLIB
predef call, puts predef syscall, call, memset, getc, putc, puts, modaddr
byte MACHID
end end
; ;
; Handy constants. ; Handy constants.
; ;
const FALSE=$0000 const FALSE=0
const TRUE=!FALSE const TRUE=!FALSE
; ;
; CALL return register structure. ; Apple II hardware constants.
;
const acc = 0
const xreg = 1
const yreg = 2
const preg = 3
;
; Hardware constants.
; ;
const speaker = $C030 const speaker = $C030
const showgraphics = $C050 const showgraphics = $C050
@ -32,22 +26,147 @@ const hgr2 = $4000
const page1 = 0 const page1 = 0
const page2 = 1 const page2 = 1
; ;
; ROM routinse. ; Predefined functions.
; ;
const grplot = $F800 predef a2keypressed, a2gotoxy, a2grmixmode, a2textmode, a2grcolor, a2grplot
const initmode = $FB2F
const textmode = $FB39
const grmode = $FB40
const vtab = $FB5B
const grcolor = $F864
const home = $FC58
; ;
; String data. ; String data.
; ;
byte a1err[] = "Apple 1 not supported.\n"
byte a3err[] = "Apple 3 version mismatch.\n"
byte exitmsg[] = "Press any key to exit.\n" byte exitmsg[] = "Press any key to exit.\n"
byte goodbye[] = "That's all, folks!\n" byte goodbye[] = "That's all, folks!\n"
byte stdlib[] = "STDLIB"
; ;
; Rod's Colors ; Screen row address arrays.
;
word txtscrn[] = $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 clrscrn[] = $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
;
; Apple 3 console codes.
;
byte textbwmode[] = 2, 16, 0
byte textclrmode[] = 2, 16, 1
byte grcharset[] = 1, 0, $7F, $7F, $7F, $7F, $00, $00, $00, $00
byte grfullcolor
byte devcons
;
; Function pointers.
;
word keypressed = @a2keypressed
word gotoxy = @a2gotoxy
word grmixmode = @a2grmixmode
word textmode = @a2textmode
word grcolor = @a2grcolor
word grplot = @a2grplot
;
; Apple II routines.
;
def a2keypressed
if ^keyboard >= 128
return ^keystrobe
fin
return FALSE
end
def a2gotoxy(x, y)
^$24 = x + ^$20
return call($FB5B, y + ^$22, 0, 0, 0)
end
def a2grmixmode
call($FB2F, 0, 0, 0, 0) ;initmode()
call($FB40, 0, 0, 0, 0) ;grmode()
return call($FC58, 0, 0, 0, 0) ;home()
end
def a2textmode
call($FB39, 0, 0, 0, 0) ;textmode()
return call($FC58, 0, 0, 0, 0) ;home()
end
def a2grcolor(color)
return call($F864, color, 0, 0, 0)
end
def a2grplot(x, y)
return call($F800, y, 0, x, 0)
end
;
; Apple III routines.
;
def dev_control(devnum, code, list)
byte params[5]
params.0 = 3
params.1 = devnum
params.2 = code
params:3 = list
return syscall($83, @params)
end
def dev_status(devnum, code, list)
byte params[5]
params.0 = 3
params.1 = devnum
params.2 = code
params:3 = list
return syscall($82, @params)
end
def a3keypressed
byte count
dev_status(devcons, 5, @count)
if count
return getc
fin
return FALSE
end
def a3gotoxy(x, y)
putc(24)
putc(x)
putc(25)
return putc(y)
end
def a3viewport(left, top, width, height)
putc(1) ; Reset viewport
putc(26)
putc(left)
putc(top)
putc(2)
putc(26)
putc(left + width - 1)
putc(top + height - 1)
putc(3)
return a3gotoxy(0, 0)
end
def a3grmixmode
byte i
puts(@textclrmode)
dev_control(devcons, 17, @grcharset)
for i = 0 to 19
memset(txtscrn[i], 40, $0000)
memset(clrscrn[i], 40, $0000)
next
return a3viewport(0, 20, 40, 4)
end
def a3textmode
puts(@textbwmode)
a3viewport(0, 0, 40, 24)
return putc(28)
end
def a3grcolor(color)
grfullcolor = (color & $0F) | (color << 4)
end
def a3grplot(x, y)
word blockaddr
blockaddr = clrscrn[y >> 1] + x
if y & 1
^blockaddr = (^blockaddr & $0F) | (grfullcolor & $F0)
else
^blockaddr = (^blockaddr & $F0) | (grfullcolor & $0F)
fin
end
;
; Rod's Colors.
; ;
def rod def rod
byte i, j, k, w, fmi, fmk, color byte i, j, k, w, fmi, fmk, color
@ -59,31 +178,49 @@ def rod
color = (j * 3) / (i + 3) + i * w / 12 color = (j * 3) / (i + 3) + i * w / 12
fmi = 40 - i fmi = 40 - i
fmk = 40 - k fmk = 40 - k
call(grcolor, color, 0, 0, 0) ;grcolor(color); grcolor(color)
call(grplot, k, 0, i, 0) ;grplot(i, k); grplot(i, k)
call(grplot, i, 0, k, 0) ;grplot(k, i); grplot(k, i)
call(grplot, fmk, 0, fmi, 0) ;grplot(fmi, fmk); grplot(fmi, fmk)
call(grplot, fmi, 0, fmk, 0) ;grplot(fmk, fmi); grplot(fmk, fmi)
call(grplot, fmi, 0, k, 0) ;grplot(k, fmi); grplot(k, fmi)
call(grplot, k, 0, fmi, 0) ;grplot(fmi, k); grplot(fmi, k)
call(grplot, fmk, 0, i, 0) ;grplot(i, fmk); grplot(i, fmk)
call(grplot, i, 0, fmk, 0) ;grplot(fmk, i); grplot(fmk, i)
if ^keyboard >= 128 if keypressed()
return ^keystrobe return
fin fin
next next
next next
next next
loop loop
end end
;
call(initmode, 0, 0, 0, 0) ;initmode() ; Machine specific initialization.
call(grmode, 0, 0, 0, 0) ;grmode() ;
^$24 = 10 ;gotoxy(10,22) when MACHID & $C8
call(vtab, 22, 0, 0, 0) is $08 ; Apple 1
puts(@a1err)
return
is $C0 ; Apple ///
keypressed = @a3keypressed
gotoxy = @a3gotoxy
grmixmode = @a3grmixmode
textmode = @a3textmode
grcolor = @a3grcolor
grplot = @a3grplot
if modaddr(@stdlib):0 == $0010
devcons = modaddr(@stdlib).5 ; devcons variable from STDLIB
else
puts(@a3err)
return
fin
otherwise ; Apple ][
wend
grmixmode()
gotoxy(11, 1)
puts(@exitmsg) puts(@exitmsg)
rod rod
call(textmode, 0, 0, 0, 0) ;textmode() textmode()
call(home, 0, 0, 0, 0) ;home()
puts(@goodbye) puts(@goodbye)
done done

View File

@ -19,7 +19,7 @@ predef syscall, call
predef markheap, allocheap, allocalignheap, releaseheap, availheap predef markheap, allocheap, allocalignheap, releaseheap, availheap
predef memset, memcpy predef memset, memcpy
predef uword_isgt, uword_isge, uword_islt, uword_isle predef uword_isgt, uword_isge, uword_islt, uword_isle
predef loadmod, execmod, lookupmod predef loadmod, execmod, lookupstrmod
; ;
; System variables. ; System variables.
; ;
@ -78,7 +78,7 @@ word = @uisltstr, @uword_islt
word = @uislestr, @uword_isle word = @uislestr, @uword_isle
word = @loadstr, @loadmod word = @loadstr, @loadmod
word = @execstr, @execmod word = @execstr, @execmod
word = @modadrstr, @lookupmod word = @modadrstr, @lookupstrmod
word = @machidstr, @machid word = @machidstr, @machid
word = 0 word = 0
word stdlibsym = @exports word stdlibsym = @exports
@ -690,6 +690,11 @@ def lookupmod(mod)
byte dci[17] byte dci[17]
return lookuptbl(modtosym(mod, @dci), symtbl) return lookuptbl(modtosym(mod, @dci), symtbl)
end end
def lookupstrmod(str)
byte mod[17]
stodci(str, @mod)
return lookupmod(@mod)
end
def addmod(mod, addr) def addmod(mod, addr)
byte dci[17] byte dci[17]
return addsym(modtosym(mod, @dci), addr) return addsym(modtosym(mod, @dci), addr)
@ -955,7 +960,7 @@ symtbl = allocheap($200)
lastsym = symtbl lastsym = symtbl
^lastsym = 0 ^lastsym = 0
stodci(@stdlibstr, heap) stodci(@stdlibstr, heap)
addmod(heap, @systemflags) addmod(heap, @version)
while *stdlibsym while *stdlibsym
stodci((stdlibsym):0, heap) stodci((stdlibsym):0, heap)
addsym(heap, (stdlibsym):2) addsym(heap, (stdlibsym):2)

View File

@ -21,7 +21,7 @@ predef crout, cout, prstr, cin, rdstr
predef markheap, allocheap, allocalignheap, releaseheap, availheap predef markheap, allocheap, allocalignheap, releaseheap, availheap
predef memset, memcpy predef memset, memcpy
predef uword_isgt, uword_isge, uword_islt, uword_isle predef uword_isgt, uword_isge, uword_islt, uword_isle
predef loadmod, execmod, lookupmod predef loadmod, execmod, lookupstrmod
; ;
; System variable. ; System variable.
; ;
@ -77,7 +77,7 @@ word = @uisltstr, @uword_islt
word = @uislestr, @uword_isle word = @uislestr, @uword_isle
word = @loadstr, @loadmod word = @loadstr, @loadmod
word = @execstr, @execmod word = @execstr, @execmod
word = @modadrstr, @lookupmod word = @modadrstr, @lookupstrmod
word = @machidstr, MACHID word = @machidstr, MACHID
word = 0 word = 0
word stdlibsym = @exports word stdlibsym = @exports
@ -824,6 +824,11 @@ def lookupmod(mod)
byte dci[17] byte dci[17]
return lookuptbl(modtosym(mod, @dci), symtbl) return lookuptbl(modtosym(mod, @dci), symtbl)
end end
def lookupstrmod(str)
byte mod[17]
stodci(str, @mod)
return lookupmod(@mod)
end
def addmod(mod, addr) def addmod(mod, addr)
byte dci[17] byte dci[17]
return addsym(modtosym(mod, @dci), addr) return addsym(modtosym(mod, @dci), addr)
@ -1243,7 +1248,7 @@ heap = *freemem
; Init symbol table. ; Init symbol table.
; ;
stodci(@stdlibstr, heap) stodci(@stdlibstr, heap)
addmod(heap, @systemflags) addmod(heap, @version)
while *stdlibsym while *stdlibsym
stodci((stdlibsym):0, heap) stodci((stdlibsym):0, heap)
addsym(heap, (stdlibsym):2) addsym(heap, (stdlibsym):2)

View File

@ -14,15 +14,15 @@ predef syscall, call
predef markheap, allocheap, allocalignheap, releaseheap, availheap predef markheap, allocheap, allocalignheap, releaseheap, availheap
predef memset, memcpy predef memset, memcpy
predef uword_isgt, uword_isge, uword_islt, uword_isle predef uword_isgt, uword_isge, uword_islt, uword_isle
predef loadmod, execmod, lookupmod predef loadmod, execmod, lookupstrmod
; ;
; System variables. ; System variables.
; ;
word version = $0010 ; 00.10 word version = $0010 ; 00.10
word systemflags = 0 word systemflags = 0
byte refcons = 0
byte devcons = 0
word heap = $2000 word heap = $2000
word refcons = 0
word devcons
byte modid = 0 byte modid = 0
byte modseg[15] byte modseg[15]
word symtbl, lastsym word symtbl, lastsym
@ -77,7 +77,7 @@ word = @uisltstr, @uword_islt
word = @uislestr, @uword_isle word = @uislestr, @uword_isle
word = @loadstr, @loadmod word = @loadstr, @loadmod
word = @execstr, @execmod word = @execstr, @execmod
word = @modadrstr, @lookupmod word = @modadrstr, @lookupstrmod
word = @machidstr, @machid word = @machidstr, @machid
word = 0 word = 0
word stdlibsym = @exports word stdlibsym = @exports
@ -848,6 +848,11 @@ def lookupmod(mod)
byte dci[17] byte dci[17]
return lookuptbl(modtosym(mod, @dci), symtbl) return lookuptbl(modtosym(mod, @dci), symtbl)
end end
def lookupstrmod(str)
byte mod[17]
stodci(str, @mod)
return lookupmod(@mod)
end
def addmod(mod, addr) def addmod(mod, addr)
byte dci[17] byte dci[17]
return addsym(modtosym(mod, @dci), addr) return addsym(modtosym(mod, @dci), addr)
@ -1227,7 +1232,7 @@ seg_find($00, @symtbl, @lastsym, $08, $11)
lastsym = symtbl & $FF00 lastsym = symtbl & $FF00
xpokeb(symtbl.0, lastsym, 0) xpokeb(symtbl.0, lastsym, 0)
stodci(@stdlibstr, heap) stodci(@stdlibstr, heap)
addmod(heap, @systemflags) addmod(heap, @version)
while *stdlibsym while *stdlibsym
stodci((stdlibsym):0, heap) stodci((stdlibsym):0, heap)
addsym(heap, (stdlibsym):2) addsym(heap, (stdlibsym):2)