Маленькая бестолковая программа, написанная от нечего делать.
Маленькая бестолковая программа, написанная от нечего делать.
Dart Alver(31.08.2024)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Если б я чуть лучше по англицки понимал, а то переводчик чутка раздражает. ((
А так забавная вещица. Не знаю конечно насколько компактный код выдаёт данная весчь, но в принципе забавно.
Можно собственный вариант параметров машины подрисовать, только не понял, можно ли прописать форматы образов для вывода например как TRD (кажется нет). Хотя по сути это легко можно решить и внешними методами.
Тот-же sjasm в помощь. ))
Есть некое руководство по добавлению отдельного компьютера к компилятору, даже разработаны Mega65 и Aquarius.
Насчет ужасма - слышал, что допиливали формат под ассемблер, но не видел.
Наверное, спрайты и без макросов обойдутся(:
Попробую на днях заняться с 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)
Совсем другое дело. Только что вот это за предупреждение?
в результате выполнения командникаКод: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.
Однако здравствуйте. Я понимаю, что яп ещё «в разработке», но то, что в макрос нельзя передать указатель на array, ну такоэ:
Код:import stdio array hello_world = "Hello ATARI!" macro void print(array s) { putstr(s, s.length) } void main() { print(hello_world) }Замечательно, судя по документации, в качестве аргумента может быть только 1 байт? o_OКод:ERROR: Type `array` is not defined
Код:macro void inc(byte b) { b += 1 }
Ясно, чуть выше нашел:
cannot contain variable or array declarations
Последний раз редактировалось breeze; 03.09.2024 в 11:12. Причина: Супер!
stdio не понимает претензий
Я нашел откуда «ноги» названиям растутПри желании можно наклепать свои вариации
Там вообще ооочень интересная ситуация с синтаксисом (по крайней мере в функциях), прям питоном повяло, когда оно начало ругаться, что не может скомпилировать потому что отступы нарушены XD
Я тут набросал вариант с инклудом для спрайтов. но был немного неприятно удивлён, что вертикальное позиционирование спрайта это ещё тот гемор >_< я даж так и не понял как его менять нужно, на DLI что ли?
Так же (если я правильно понял) ширина спрайта всегда 16 пикселей (x2), максимум что можно ещё ещё зажЫрнить (x4 и x8).
Ну и зато теперь стало ясно как раскрашивают спрайтами картинки, когда оно на тексте ползает видно как его цвет меняется:
Сырки:
Код:import stdio import sprites array hello_world = "Hello ATARI!" array(byte) sprite0 = [ %00000000, %00111100, %01000010, %10000001, %10100101, %10000001, %10000001, %10000001, %10100101, %10011001, %10000001, %01000010, %00111100, %00000000 ] noinline asm void wait(byte register(a) f) { clc adc os_RTCLOK.b2 .rt_check: cmp os_RTCLOK.b2 bne .rt_check rts } void main() { putstr(hello_world, hello_world.length) new_line() putstrz("Hello world again"z) sprCreate(sprite0, sprite0.length, $CF) byte i for i,48,to,200 { sprPos(i, 0) wait(1) } }
@Shiny буду признателен, если подскажешь как правильно позиционировать по вертикалиКод:const byte pmgmem=$80 //pmgmem*256 == place for sprites void sprCreate(pointer _sprData, byte _sprSize, byte _sprColor) { 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 ($02C0,_sprColor)//$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,_sprSize-1 { pmg0[i]=_sprData[i] } } void sprPos(byte x, byte y) { poke ($D000,x)// $30 HPOSP0 horisontal place player 0 }
atari.zip
Последний раз редактировалось breeze; 03.09.2024 в 13:11.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)