Наверное, спрайты и без макросов обойдутся(:
Попробую на днях заняться с 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{} }
breeze (01.09.2024)
Кстати, я написал не совсем верно, вместо 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
Конечно, можно написать лучше на ассемблере, но на то и сгенерированный исходник(:
На следующей неделе появится обновление версии, автор пока допиливает. Об изменениях сообщу.
breeze (01.09.2024)
А чего там субъект сквозь стены гуляет? Запускал на Altirra-2.40
proga.tap лучше простые окружности вывести имхо, а так непонятно, то ли задумка такая, то ли чё? Запускал на Fuse.
- - - Добавлено - - -
Главное, чтобы хотя бы работало. А шашечки за donate или "безд-возд-мездно БВМ, то есть даром (C) сова из мультика про Винни-Пуха Заходера" не обязательны.
Последний раз редактировалось andrews; 01.09.2024 в 20:52.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
пример 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 {} }
andrews (02.09.2024)
Совсем другое дело. Только что вот это за предупреждение?
в результате выполнения командникаКод: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
Последний раз редактировалось andrews; 02.09.2024 в 18:23.
"Главное, что хотя бы заработало"(с)
Это трюк для передачи параметров регистрам при вызове процедуры $22B0 - A=y координата, C=0.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)