mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-01-22 08:31:36 +00:00
Allow Apple3 heap allocator to skip graphics memory
This commit is contained in:
parent
b986e1da38
commit
7af5d53fbb
@ -62,8 +62,6 @@ SEGSTART = $A000
|
|||||||
BPL -
|
BPL -
|
||||||
LDX #$4C ; SET JMPTMP OPCODE
|
LDX #$4C ; SET JMPTMP OPCODE
|
||||||
STX JMPTMP
|
STX JMPTMP
|
||||||
; STA JMPTMPX
|
|
||||||
; STA JMPTMPX+1
|
|
||||||
STA TMPX ; CLEAR ALL EXTENDED POINTERS
|
STA TMPX ; CLEAR ALL EXTENDED POINTERS
|
||||||
STA SRCX
|
STA SRCX
|
||||||
STA DSTX
|
STA DSTX
|
||||||
@ -201,6 +199,21 @@ _DIVEX INX
|
|||||||
LDY IPY
|
LDY IPY
|
||||||
RTS
|
RTS
|
||||||
;*
|
;*
|
||||||
|
;* INCREMENT TOS
|
||||||
|
;*
|
||||||
|
INCR INC ESTKL,X
|
||||||
|
BNE +
|
||||||
|
INC ESTKH,X
|
||||||
|
+ JMP NEXTOP
|
||||||
|
;*
|
||||||
|
;* DECREMENT TOS
|
||||||
|
;*
|
||||||
|
DECR LDA ESTKL,X
|
||||||
|
BNE +
|
||||||
|
DEC ESTKH,X
|
||||||
|
+ DEC ESTKL,X
|
||||||
|
JMP NEXTOP
|
||||||
|
;*
|
||||||
;* OPCODE TABLE
|
;* OPCODE TABLE
|
||||||
;*
|
;*
|
||||||
!ALIGN 255,0
|
!ALIGN 255,0
|
||||||
@ -317,21 +330,6 @@ IDXW LDA ESTKL,X
|
|||||||
STA ESTKH+1,X
|
STA ESTKH+1,X
|
||||||
JMP DROP
|
JMP DROP
|
||||||
;*
|
;*
|
||||||
;* INCREMENT TOS
|
|
||||||
;*
|
|
||||||
INCR INC ESTKL,X
|
|
||||||
BNE +
|
|
||||||
INC ESTKH,X
|
|
||||||
+ JMP NEXTOP
|
|
||||||
;*
|
|
||||||
;* DECREMENT TOS
|
|
||||||
;*
|
|
||||||
DECR LDA ESTKL,X
|
|
||||||
BNE +
|
|
||||||
DEC ESTKH,X
|
|
||||||
+ DEC ESTKL,X
|
|
||||||
JMP NEXTOP
|
|
||||||
;*
|
|
||||||
;* BITWISE COMPLIMENT TOS
|
;* BITWISE COMPLIMENT TOS
|
||||||
;*
|
;*
|
||||||
COMP LDA #$FF
|
COMP LDA #$FF
|
||||||
|
@ -17,12 +17,6 @@ const resxhgr2 = $0080
|
|||||||
const modkeep = $2000
|
const modkeep = $2000
|
||||||
const modinitkeep = $4000
|
const modinitkeep = $4000
|
||||||
//
|
//
|
||||||
// SOS flags
|
|
||||||
//
|
|
||||||
const O_READ = 1
|
|
||||||
const O_WRITE = 2
|
|
||||||
const O_READ_WRITE = 3
|
|
||||||
//
|
|
||||||
// Pedefined functions.
|
// Pedefined functions.
|
||||||
//
|
//
|
||||||
predef syscall(cmd,params)#1, call(addr,areg,xreg,yreg,status)#1
|
predef syscall(cmd,params)#1, call(addr,areg,xreg,yreg,status)#1
|
||||||
@ -35,7 +29,7 @@ predef execmod(modfile)#1
|
|||||||
//
|
//
|
||||||
// Exported CMDSYS table
|
// Exported CMDSYS table
|
||||||
//
|
//
|
||||||
word version = $0100 // 01.00
|
word version = $0101 // 01.01
|
||||||
word syspath
|
word syspath
|
||||||
word cmdlnptr
|
word cmdlnptr
|
||||||
word = @execmod
|
word = @execmod
|
||||||
@ -810,7 +804,7 @@ def setpfx(path)#1
|
|||||||
perr = syscall($C6, @params)
|
perr = syscall($C6, @params)
|
||||||
return path
|
return path
|
||||||
end
|
end
|
||||||
def volume(devname, volname, ttlblks, freblks)#1
|
def volume(devname, volname)#1
|
||||||
byte params[9]
|
byte params[9]
|
||||||
|
|
||||||
params.0 = 4
|
params.0 = 4
|
||||||
@ -819,8 +813,6 @@ def volume(devname, volname, ttlblks, freblks)#1
|
|||||||
params:5 = 0
|
params:5 = 0
|
||||||
params:7 = 0
|
params:7 = 0
|
||||||
perr = syscall($C5, @params)
|
perr = syscall($C5, @params)
|
||||||
*ttlblks = params:5
|
|
||||||
*freblks = params:7
|
|
||||||
return perr
|
return perr
|
||||||
end
|
end
|
||||||
def open(path)#1
|
def open(path)#1
|
||||||
@ -899,18 +891,7 @@ end
|
|||||||
//
|
//
|
||||||
// MEMORY CALLS
|
// MEMORY CALLS
|
||||||
//
|
//
|
||||||
def seg_request(base, limit, id)#1
|
def seg_find(search, pages, id)#3
|
||||||
byte params[7]
|
|
||||||
|
|
||||||
params.0 = 4
|
|
||||||
params:1 = base
|
|
||||||
params:3 = limit
|
|
||||||
params.5 = id
|
|
||||||
params.6 = 0
|
|
||||||
perr = syscall($40, @params)
|
|
||||||
return params.6
|
|
||||||
end
|
|
||||||
def seg_find(search, base, limit, pages, id)#1
|
|
||||||
byte params[10]
|
byte params[10]
|
||||||
|
|
||||||
params.0 = 6
|
params.0 = 6
|
||||||
@ -921,9 +902,7 @@ def seg_find(search, base, limit, pages, id)#1
|
|||||||
params:7 = 0
|
params:7 = 0
|
||||||
params.9 = 0
|
params.9 = 0
|
||||||
perr = syscall($41, @params)
|
perr = syscall($41, @params)
|
||||||
*base = params:5
|
return params.9, params:5, params:7
|
||||||
*limit = params:7
|
|
||||||
return params.9
|
|
||||||
end
|
end
|
||||||
def seg_release(segnum)#1
|
def seg_release(segnum)#1
|
||||||
byte params[2]
|
byte params[2]
|
||||||
@ -943,8 +922,9 @@ def init_cons()#0
|
|||||||
fin
|
fin
|
||||||
write(refcons, @textmode, 3)
|
write(refcons, @textmode, 3)
|
||||||
devcons = dev_getnum(@console)
|
devcons = dev_getnum(@console)
|
||||||
nlmode.0 = $80
|
nlmode:0 = $0D80
|
||||||
nlmode.1 = $0D
|
//nlmode.0 = $80
|
||||||
|
//nlmode.1 = $0D
|
||||||
dev_control(devcons, $02, @nlmode)
|
dev_control(devcons, $02, @nlmode)
|
||||||
end
|
end
|
||||||
def cout(ch)#0
|
def cout(ch)#0
|
||||||
@ -955,6 +935,9 @@ def cout(ch)#0
|
|||||||
write(refcons, @ch, 1)
|
write(refcons, @ch, 1)
|
||||||
fin
|
fin
|
||||||
end
|
end
|
||||||
|
def crout()#0
|
||||||
|
cout($0D)
|
||||||
|
end
|
||||||
def cin()#1
|
def cin()#1
|
||||||
byte ch
|
byte ch
|
||||||
read(refcons, @ch, 1)
|
read(refcons, @ch, 1)
|
||||||
@ -975,14 +958,11 @@ def rdstr(prompt)#1
|
|||||||
cout(prompt)
|
cout(prompt)
|
||||||
^heap = read(refcons, heap + 1, 128)
|
^heap = read(refcons, heap + 1, 128)
|
||||||
if heap->[^heap] == $0D
|
if heap->[^heap] == $0D
|
||||||
^heap = ^heap - 1
|
^heap--
|
||||||
fin
|
fin
|
||||||
cout($0D)
|
crout
|
||||||
return heap
|
return heap
|
||||||
end
|
end
|
||||||
def crout()#0
|
|
||||||
cout($0D)
|
|
||||||
end
|
|
||||||
def prbyte(v)#0
|
def prbyte(v)#0
|
||||||
cout(hexchar[(v >> 4) & $0F])
|
cout(hexchar[(v >> 4) & $0F])
|
||||||
cout(hexchar[v & $0F])
|
cout(hexchar[v & $0F])
|
||||||
@ -1002,6 +982,18 @@ def allocheap(size)#1
|
|||||||
word addr
|
word addr
|
||||||
addr = heap
|
addr = heap
|
||||||
heap = heap + size
|
heap = heap + size
|
||||||
|
if systemflags & reshgr1
|
||||||
|
if uword_islt(addr, $4000) and uword_isgt(heap, $2000)
|
||||||
|
addr = $4000
|
||||||
|
heap = addr + size
|
||||||
|
fin
|
||||||
|
fin
|
||||||
|
if systemflags & reshgr2
|
||||||
|
if uword_islt(addr, $6000) and uword_isgt(heap, $4000)
|
||||||
|
addr = $6000
|
||||||
|
heap = addr + size
|
||||||
|
fin
|
||||||
|
fin
|
||||||
if uword_isge(heap, @addr)
|
if uword_isge(heap, @addr)
|
||||||
return 0
|
return 0
|
||||||
fin
|
fin
|
||||||
@ -1150,7 +1142,7 @@ def loadmod(mod)#1
|
|||||||
//
|
//
|
||||||
// Alloc heap space for relocated module (data + bytecode).
|
// Alloc heap space for relocated module (data + bytecode).
|
||||||
//
|
//
|
||||||
moddep = moddep + 1
|
moddep++
|
||||||
modfix = moddep - @header.2 // Adjust to skip header
|
modfix = moddep - @header.2 // Adjust to skip header
|
||||||
modsize = modsize - modfix
|
modsize = modsize - modfix
|
||||||
rdlen = rdlen - modfix - 2
|
rdlen = rdlen - modfix - 2
|
||||||
@ -1181,16 +1173,16 @@ def loadmod(mod)#1
|
|||||||
while ^esd // Scan to end of ESD
|
while ^esd // Scan to end of ESD
|
||||||
esd = esd + 4
|
esd = esd + 4
|
||||||
loop
|
loop
|
||||||
esd = esd + 1
|
esd++
|
||||||
if defcnt
|
if defcnt
|
||||||
//
|
//
|
||||||
// Locate bytecode defs in allocated segment.
|
// Locate bytecode defs in allocated segment.
|
||||||
//
|
//
|
||||||
modseg[modid] = seg_find($00, @codeseg, @defaddr, (rld - bytecode + 255) >> 8, modid + $12)
|
modseg[modid], codeseg, drop = seg_find($00, (rld - bytecode + 255) >> 8, modid + $12)
|
||||||
if perr
|
if perr
|
||||||
return -perr
|
return -perr
|
||||||
fin
|
fin
|
||||||
modid = modid + 1
|
modid++
|
||||||
defext = (codeseg.0 | $80) - 1
|
defext = (codeseg.0 | $80) - 1
|
||||||
defaddr = (codeseg & $FF00) + $6000
|
defaddr = (codeseg & $FF00) + $6000
|
||||||
codefix = defaddr - bytecode
|
codefix = defaddr - bytecode
|
||||||
@ -1268,8 +1260,6 @@ def loadmod(mod)#1
|
|||||||
//
|
//
|
||||||
memxcpy(codeseg, bytecode, modsize - (bytecode - modaddr))
|
memxcpy(codeseg, bytecode, modsize - (bytecode - modaddr))
|
||||||
fin
|
fin
|
||||||
//else
|
|
||||||
// return -perr
|
|
||||||
fin
|
fin
|
||||||
if lerr
|
if lerr
|
||||||
return -lerr
|
return -lerr
|
||||||
@ -1298,12 +1288,11 @@ def volumes()#0
|
|||||||
byte devname[17]
|
byte devname[17]
|
||||||
byte volname[17]
|
byte volname[17]
|
||||||
byte i
|
byte i
|
||||||
word ttlblks, freblks
|
|
||||||
|
|
||||||
for i = $01 to $18
|
for i = $01 to $18
|
||||||
if dev_info(i, @devname, @info, 11) == 0
|
if dev_info(i, @devname, @info, 11) == 0
|
||||||
prstr(@devname)
|
prstr(@devname)
|
||||||
if volume(@devname, @volname, @ttlblks, @freblks) == 0
|
if volume(@devname, @volname) == 0
|
||||||
prstr(" => /")
|
prstr(" => /")
|
||||||
prstr(@volname)
|
prstr(@volname)
|
||||||
cout('/')
|
cout('/')
|
||||||
@ -1423,7 +1412,7 @@ def execmod(modfile)#1
|
|||||||
lastsym = savesym
|
lastsym = savesym
|
||||||
heap = saveheap
|
heap = saveheap
|
||||||
while modid
|
while modid
|
||||||
modid = modid - 1
|
modid--
|
||||||
seg_release(modseg[modid])
|
seg_release(modseg[modid])
|
||||||
loop
|
loop
|
||||||
else
|
else
|
||||||
@ -1441,11 +1430,11 @@ init_cons
|
|||||||
//
|
//
|
||||||
// Print PLASMA version
|
// Print PLASMA version
|
||||||
//
|
//
|
||||||
prstr("PLASMA "); prbyte(version.1); cout('.'); prbyte(version.0); crout
|
prstr("PLASMA 01.01\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
|
||||||
//
|
//
|
||||||
// Init 2K symbol table.
|
// Init 2K symbol table.
|
||||||
//
|
//
|
||||||
seg_find($00, @symtbl, @lastsym, $08, $11)
|
drop, symtbl, drop = seg_find($00, $08, $11)
|
||||||
lastsym = symtbl & $FF00
|
lastsym = symtbl & $FF00
|
||||||
xpokeb(symtbl.0, lastsym, 0)
|
xpokeb(symtbl.0, lastsym, 0)
|
||||||
while *sysmodsym
|
while *sysmodsym
|
||||||
@ -1524,7 +1513,7 @@ while 1
|
|||||||
prbyte(terr)
|
prbyte(terr)
|
||||||
perr = 0
|
perr = 0
|
||||||
else
|
else
|
||||||
prstr("OK\n")
|
prstr("OK")
|
||||||
fin
|
fin
|
||||||
crout()
|
crout()
|
||||||
fin
|
fin
|
||||||
|
Loading…
x
Reference in New Issue
Block a user