1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-21 10:31:15 +00:00

Another optimization for inner interp loop, SOS quit, and begin conio

library
This commit is contained in:
David Schmenk 2014-06-21 20:45:44 -07:00
parent 262d64d2aa
commit 5f6a5088d7
7 changed files with 439 additions and 73 deletions

295
src/libsrc/conio.pla Normal file

@ -0,0 +1,295 @@
import STDLIB
predef syscall, call, memset, getc, putc, puts, modaddr
byte MACHID
end
;
; Handy constants.
;
const FALSE = 0
const TRUE = !FALSE
const FULLMODE = 0
const MIXMODE = 1
;
; Apple II hardware constants.
;
const speaker = $C030
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 keyboard = $C000
const keystrobe = $C010
const hgr1 = $2000
const hgr2 = $4000
const page1 = 0
const page2 = 1
;
; Predefined functions.
;
predef a2keypressed, a2gotoxy, a2grmixmode, a2textmode
;
; String pool.
;
byte stdlib[] = "STDLIB"
;
; Screen row address arrays.
;
word txt1scrn[] = $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 txt2scrn[] = $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 devcons
;
; Exported function table.
;
export word conio[]
;
; Function pointers.
;
word = @a2reset
word = @a2keypressed
word = @a2home
word = @a2gotoxy
word = @a2viewport
word = @a2texttype
word = @a2textmode
word = @a2grmixmode
word = @grcolor
word = @grplot
;
; Native routines.
;
asm equates
!SOURCE "vmsrc/plvmzp.inc"
end
;
; def grscrn(rowaddrs)
;
asm grscrn
GRSCRN = $26
GRSCRNL = GRSCRN
GRSCRNH = GRSCRNL+1
LDA ESTKL,X
STA GRSCRNL
LDA ESTKH,X
STA GRSCRNH
RTS
end
;
; def grcolor(color)
;
asm grcolor
GRCLR = $30
LDA #$0F
AND ESTKL,X
STA ESTKL,X
ASL
ASL
ASL
ASL
ORA ESTKL,X
STA GRCLR
RTS
end
;
; def grplot(x, y)
;
asm grplot
STY IPY
LDA ESTKL,X
AND #$FE
TAY
LDA (GRSCRN),Y
STA DSTL
INY
LDA (GRSCRN),Y
STA DSTH
LDY ESTKL+1,X
LDA GRCLR
LSR ESTKL,X
BCS +
AND #$0F
STA TMPL
LDA #$F0
BCC ++
+ AND #$F0
STA TMPL
LDA #$0F
++ AND (DST),Y
ORA TMPL
STA (DST),Y
LDY IPY
INX
RTS
end
;
; Apple 1 routines.
;
def a1keypressed
return ^$D011 >= 128
end
def a1gotoxy(x, y)
end
def a1viewport(left, top, width, height)
end
def a1texttype(type)
end
def a1textmode(columns)
end
def a1grmode(mix)
return 0 ; not supported
end
;
; Apple II routines.
;
def a2keypressed
return ^keyboard >= 128
end
def a2gotoxy(x, y)
^$24 = x + ^$20
return call($FB5B, y + ^$22, 0, 0, 0)
end
def a2viewport(left, top, width, height)
if !width or !height
left = 0
top = 0
width = 40
height = 24
fin
^$20 = left
^$21 = width
^$22 = top
^$23 = height + top - 1
return a2gotoxy(0, 0)
end
def a2texttype(type)
end
def a2textmode(columns)
call($FB39, 0, 0, 0, 0) ;textmode()
return call($FC58, 0, 0, 0, 0) ;home()
end
def a2grmode(mix)
call($FB2F, 0, 0, 0, 0) ;initmode()
call($FB40, 0, 0, 0, 0) ;grmode()
if !mix
^showfull
fin
call($FC58, 0, 0, 0, 0) ;home()
return grscrn(@txt1scrn) ; point to lo-res screen
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)
return count
end
def a3home
return cout(28)
end
def a3gotoxy(x, y)
putc(24)
putc(x)
putc(25)
return putc(y)
end
def a3viewport(left, top, width, height)
if !width or !height
;
; Reset the full-screen viewport
;
left = 0
top = 0
width = 80
height = 24
fin
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 a3texttype(type)
end
def a3textmode(columns)
puts(@textbwmode)
a3viewport(0, 0, 40, 24)
return putc(28)
end
def a3grmode(mix)
byte i
if mix
mix = 19
else
mix = 23
fin
puts(@textclrmode)
dev_control(devcons, 17, @grcharset)
a3viewport(0, 20, 40, 4)
for i = 0 to mix
memset(txt1scrn[i], 40, $0000) ; text screen
memset(txt2scrn[i], 40, $0000) ; color screen
next
return grscrn(@txt2scrn) ; point to color screen
end
;
; Machine specific initialization.
;
when MACHID & $C8
is $08 ; Apple 1
conio:reset = @a1reset
conio:keypressed = @a1keypressed
conio:home = @a1home
conio:gotoxy = @a1gotoxy
conio:viewport = @a1viewport
conio:texttype = @a1texttype
conio:textmode = @a1textmode
conio:grmixmode = @a1grmixmode
is $C0 ; Apple ///
conio:reset = @a3reset
conio:keypressed = @a3keypressed
conio:home = @a3home
conio:gotoxy = @a3gotoxy
conio:viewport = @a3viewport
conio:texttype = @a3texttype
conio:textmode = @a3textmode
conio:grmixmode = @a3grmixmode
devcons = modaddr(@stdlib).5 ; devcons variable from STDLIB
otherwise ; Apple ][
wend

@ -7,6 +7,8 @@ end
;
const FALSE=0
const TRUE=!FALSE
const FULLMODE=0
const MIXMODE=1
;
; Apple II hardware constants.
;
@ -28,7 +30,7 @@ const page2 = 1
;
; Predefined functions.
;
predef a2keypressed, a2gotoxy, a2grmixmode, a2textmode, a2grcolor, a2grplot
predef a2keypressed, a2gotoxy, a2grmode, a2textmode
;
; String data.
;
@ -40,10 +42,10 @@ byte stdlib[] = "STDLIB"
;
; Screen row address arrays.
;
word txtscrn[] = $0400,$0480,$0500,$0580,$0600,$0680,$0700,$0780
word txt1scrn[] = $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 txt2scrn[] = $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
;
@ -52,17 +54,80 @@ word = $0850,$08D0,$0950,$09D0,$0A50,$0AD0,$0B50,$0BD0
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 grmode = @a2grmode
word textmode = @a2textmode
word grcolor = @a2grcolor
word grplot = @a2grplot
;
; Common routines.
;
asm equates
!SOURCE "vmsrc/plvmzp.inc"
end
;
; def grscrn(rowaddrs)
;
asm grscrn
GRSCRN = $26
GRSCRNL = GRSCRN
GRSCRNH = GRSCRNL+1
LDA ESTKL,X
STA GRSCRNL
LDA ESTKH,X
STA GRSCRNH
RTS
end
;
; def grcolor(color)
;
asm grcolor
GRCLR = $30
LDA #$0F
AND ESTKL,X
STA ESTKL,X
ASL
ASL
ASL
ASL
ORA ESTKL,X
STA GRCLR
RTS
end
;
; def grplot(x, y)
;
asm grplot
STY IPY
LDA ESTKL,X
AND #$FE
TAY
LDA (GRSCRN),Y
STA DSTL
INY
LDA (GRSCRN),Y
STA DSTH
LDY ESTKL+1,X
LDA GRCLR
LSR ESTKL,X
BCS +
AND #$0F
STA TMPL
LDA #$F0
BCC ++
+ AND #$F0
STA TMPL
LDA #$0F
++ AND (DST),Y
ORA TMPL
STA (DST),Y
LDY IPY
INX
RTS
end
;
; Apple II routines.
;
@ -76,21 +141,19 @@ def a2gotoxy(x, y)
^$24 = x + ^$20
return call($FB5B, y + ^$22, 0, 0, 0)
end
def a2grmixmode
def a2grmode(mix)
call($FB2F, 0, 0, 0, 0) ;initmode()
call($FB40, 0, 0, 0, 0) ;grmode()
return call($FC58, 0, 0, 0, 0) ;home()
if !mix
^showfull
fin
call($FC58, 0, 0, 0, 0) ;home()
return grscrn(@txt1scrn) ; point to lo-res screen
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.
;
@ -138,33 +201,27 @@ def a3viewport(left, top, width, height)
putc(3)
return a3gotoxy(0, 0)
end
def a3grmixmode
def a3grmode(mix)
byte i
if mix
mix = 19
else
mix = 23
fin
puts(@textclrmode)
dev_control(devcons, 17, @grcharset)
for i = 0 to 19
memset(txtscrn[i], 40, $0000)
memset(clrscrn[i], 40, $0000)
a3viewport(0, 20, 40, 4)
for i = 0 to mix
memset(txt1scrn[i], 40, $0000) ; text screen
memset(txt2scrn[i], 40, $0000) ; color screen
next
return a3viewport(0, 20, 40, 4)
return grscrn(@txt2scrn) ; point to color screen
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.
;
@ -205,10 +262,8 @@ when MACHID & $C8
is $C0 ; Apple ///
keypressed = @a3keypressed
gotoxy = @a3gotoxy
grmixmode = @a3grmixmode
grmode = @a3grmode
textmode = @a3textmode
grcolor = @a3grcolor
grplot = @a3grplot
if modaddr(@stdlib):0 == $0010
devcons = modaddr(@stdlib).5 ; devcons variable from STDLIB
else
@ -217,7 +272,7 @@ when MACHID & $C8
fin
otherwise ; Apple ][
wend
grmixmode()
grmode(MIXMODE)
gotoxy(11, 1)
puts(@exitmsg)
rod

@ -923,7 +923,7 @@ LEAVE LDY #$01
RET RTS
A1CMD !SOURCE "vmsrc/a1cmd.a"
SEGEND = *
VMINIT LDY #$0E ; INSTALL PAGE 0 FETCHOP ROUTINE
VMINIT LDY #$0F ; INSTALL PAGE 0 FETCHOP ROUTINE
- LDA PAGE0,Y
STA DROP,Y
DEY
@ -946,7 +946,7 @@ PAGE0 = *
INX ; DROP
INY ; NEXTOP
BEQ NEXTOPH
FETCHOP LDA (IP),Y
LDA $FFFF,Y ; FETCHOP @ $F3, IP MAPS OVER $FFFF @ $F4
STA OPIDX
JMP (OPTBL)
NEXTOPH INC IPH

@ -247,7 +247,7 @@ CMDEXEC = *
;
; INSTALL PAGE 0 FETCHOP ROUTINE
;
LDY #$0E
LDY #$0F
- LDA PAGE0,Y
STA DROP,Y
DEY
@ -319,9 +319,9 @@ PAGE0 = *
INX ; DROP @ $EF
INY ; NEXTOP @ $F0
BEQ NEXTOPH
FETCHOP LDA (IP),Y
LDA $FFFF,Y ; FETCHOP @ $F3, IP MAPS OVER $FFFF @ $F4
STA OPIDX
JMP (OPTBL)
JMP (OPTBL) ; OPIDX AND OPPAGE MAP OVER OPTBL
NEXTOPH INC IPH
BNE FETCHOP
}

@ -50,7 +50,7 @@ DSTX = XPAGE+DSTH
BNE PRHEX
LDA #$01
STA MEMBANK
LDY #$0E ; INSTALL PAGE 0 FETCHOP ROUTINE
LDY #$0F ; INSTALL PAGE 0 FETCHOP ROUTINE
LDA #$00
- LDX PAGE0,Y
STX DROP,Y
@ -67,25 +67,6 @@ DSTX = XPAGE+DSTH
STA IFPH
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
JMP SOSCMD
SEGREQ !BYTE 4
!WORD $2001
!WORD $9F01
!BYTE $10
!BYTE $00
PAGE0 = *
!PSEUDOPC $00EF {
;*
;* INTERP BYTECODE INNER LOOP
;*
INX ; DROP
INY ; NEXTOP
BEQ NEXTOPH
FETCHOP LDA (IP),Y
STA OPIDX
JMP (OPTBL)
NEXTOPH INC IPH
BNE FETCHOP
}
PRHEX PHA
LSR
LSR
@ -105,15 +86,34 @@ PRHEX PHA
ADC #6
+ STA $880
FAIL RTS
SEGREQ !BYTE 4
!WORD $2001
!WORD $9F01
!BYTE $10
!BYTE $00
PAGE0 = *
!PSEUDOPC $00EF {
;*
;* INTERP BYTECODE INNER LOOP
;*
INX ; DROP
INY ; NEXTOP
BEQ NEXTOPH
LDA $FFFF,Y ; FETCHOP @ $F3, IP MAPS OVER $FFFF @ $F4
STA OPIDX
JMP (OPTBL)
NEXTOPH INC IPH
BNE FETCHOP
}
;*
;* SYSTEM INTERPRETER ENTRYPOINT
;*
INTERP LDY #$00
STY IPX
PLA
INTERP PLA
STA IPL
PLA
STA IPH
LDY #$00
STY IPX
INY
JMP FETCHOP
;*

@ -17,11 +17,12 @@ VMZP = ESTK+ESTKSZ
IFP = VMZP
IFPL = IFP
IFPH = IFP+1
IP = IFP+2
IPL = IP
IPH = IP+1
IPY = IP+2
TMP = IP+3
;IP = IFP+2 ; MOVED TO OVERLAY NEXTOP
;IPL = IP
;IPH = IP+1
;IPY = IP+2
IPY = IFP+2
TMP = IPY+1
TMPL = TMP
TMPH = TMP+1
NPARMS = TMPL
@ -30,5 +31,9 @@ DVSIGN = TMP+2
ESP = TMP+2
DROP = $EF
NEXTOP = $F0
OPIDX = NEXTOP+8
FETCHOP = NEXTOP+3
IP = FETCHOP+1
IPL = IP
IPH = IPL+1
OPIDX = FETCHOP+6
OPPAGE = OPIDX+1

@ -733,6 +733,17 @@ def seg_release(segnum)
perr = syscall($45, @params)
return perr
end
;
; Other SOS calls.
;
def quit
byte params[1]
close(0)
params.0 = 0
perr = syscall($65, @params)
end
;
; CONSOLE I/O
;
@ -839,7 +850,6 @@ def addsym(sym, addr)
xpokeb(symtbl.0, lastsym + 2, addr.1)
xpokeb(symtbl.0, lastsym + 3, 0)
lastsym = lastsym + 3
; return addtbl(sym, addr, symtbl.0, @lastsym)
end
;
; Module routines.
@ -1263,15 +1273,16 @@ while 1
if ^cmdptr
when toupper(parsecmd(cmdptr))
is 'Q'
; reboot()
quit
is 'C'
catalog(cmdptr)
is 'P'
setpfx(cmdptr)
is 'V'
volumes()
volumes
is '+'
execmod(cmdptr)
write(refcons, @textmode, 3)
otherwise
prstr(@huhstr)
wend