Ну если не трудно, сделай плиз пример со спрайтом.
Вид для печати
Наверное, спрайты и без макросов обойдутся(:
Попробую на днях заняться с 6502, сейчас занимаюсь Спектрумом. Есть неплохая статья про PMG
- - - Добавлено - - -
Как-то так
Код:// compile java -jar millfork.jar -I .\include\ -t A8 -s pmg.mfk
import stdlib
const byte pmgmem=$80 //pmgmem*256 == place for sprites
array(byte) sprd = [0,60,66,129,165,129,129,129,165,153,129,66,60,0]
void main ()
{
pointer pmg0
ubyte i
poke($D407,pmgmem)//PMGBASE place in memory
poke ($022F,%111110)//SDMCTL
poke ($D01D,3)//GRACTL Enable PM display
poke ($026F,1)//GPRIOR priority
poke ($D000,$30)//HPOSP0 horisontal place player 0
poke ($02C0,$CF)//PCOLR0 color of player 0
poke ($D008,0)//SIZEP0 size of player 0: ;0 = normal, 1 = double, 3 = quadruple
// copy sprite data to defined place
pmg0=word((pmgmem*256)+1024+30)
for i,0,to,13
{
pmg0[i]=sprd[i]
}
while true{}
}
Кстати, я написал не совсем верно, вместо poke можно использовать запись antic_pmbase=pmgmem. Но на код это не влияет.
Интересно посмотреть на генерацию кода копирования памяти
Сделано все четко - адресация нулевой страницы и цикл 14 итераций подходит для 8-битного индексного регистра Y(он может принимать значения 0-255). Но со счетчиком цикла замудрили. Вообще-то я с подозрением отношусь к разным компиляторам, насмотрелся полученный индусский код, но у millfork'a сделано четко.Код:LDA #$1E
STA main$pmg0
LDA #$84
STA main$pmg0 + 1
LDA #0
STA main$i
.wh__00015:
LDY main$i
LDA sprd.array, Y
LDY main$i
STA (main$pmg0), Y
.fp__00017:
LDA main$i
CMP #$D
BNE .el__00019
Конечно, можно написать лучше на ассемблере, но на то и сгенерированный исходник(:
На следующей неделе появится обновление версии, автор пока допиливает. Об изменениях сообщу.
А чего там субъект сквозь стены гуляет? Запускал на Altirra-2.40
proga.tap лучше простые окружности вывести имхо, а так непонятно, то ли задумка такая, то ли чё? Запускал на Fuse.
- - - Добавлено - - -
Главное, чтобы хотя бы работало. А шашечки за donate или "безд-возд-мездно БВМ, то есть даром (C) сова из мультика про Винни-Пуха Заходера" не обязательны.
пример Helloworld есть на Github
Окружность по Брезенхему написана, но есть один нюанс, пока выясняетсяКод:// compile with
// java -jar millfork.jar -I ${PATH}/include -t ${platform} ${PATH}/examples/hello_world/hello_world.mfk
import stdio
array hello_world = "Hello world"
void main() {
ensure_mixedcase()
#if CBM_64 || CBM_264
set_bg_color(white)
#endif
#if CBM_64 || CBM_264 || ZX_SPECTRUM
set_border(red)
#endif
putstr(hello_world, hello_world.length)
new_line()
putstrz("Hello world again"z)
#if not(CPM)
while(true){}
#endif
}
Код://Bresenham circle
//http://members.chello.at/easyfilter/bresenham.html
array(word) sa[192]
array(byte) bw = [$80,$40,$20,$10,8,4,2,1]
pointer sd
asm word call_22b0(byte a,byte c) @ $22b0 extern
void pp(ubyte x0,ubyte y0)
{
sd=sa[y0]+(x0>>3)
sd[0] |= bw[x0&7]
}
void inits()
{
ubyte i
for i,0,to,191
{
sa[word(i)]=call_22b0(i,0)
}
}
void cls()
{
asm
{
// xor a
// ld b,$18
// call 3652
ld hl,$4000
ld de,$4001
ld bc,6144
ld (hl),l
ldir
ld (hl),$38
ld bc,767
ldir
}
}
void circle(ubyte xm,ubyte ym,ubyte r)
{
sbyte x,y
unsigned16 err,rr
x=0-r// error with x=-r
y=0
err=2-r-r//2-2*r
do
{
pp(xm-x,ym+y)
pp(xm-y,ym-x)
pp(xm+x,ym-y)
pp(xm+y,ym+x)
rr=err
if (rr<=y) {
y=y+1
err=err+y+y+1//err+y*2+1
}
if (rr>x || err>y) {
x=x+1
err=err+x+x+1//err+x*2+1
}
} while (x<0)
}
void main() {
inits()//precalc screen lines adresses
cls()
circle(128,96,80)
while true {}
}
Совсем другое дело. Только что вот это за предупреждение?
в результате выполнения командникаКод:WARN: (progas.mfk:21:17) Unsupported register parameter combination: (A,C)
sa[word(i)]=call_22b0(i,0)
^
INFO: Segment default: $8000-$81f9, size: 506 B (31820 B free, of which unused gaps 0 B)
Код:millfork.jar -I .\include\ -t zxspectrum -s progas.mfk
"Главное, что хотя бы заработало"(с)
Это трюк для передачи параметров регистрам при вызове процедуры $22B0 - A=y координата, C=0.