Важная информация

User Tag List

Страница 2 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 11 по 20 из 60

Тема: Ретро-ЯП Millfork для Atari, Apple II, ZX Spectrum, MSX, CP/M, NES, Game Boy и MS-DOS

  1. #11
    Guru Аватар для breeze
    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,721
    Спасибо Благодарностей отдано 
    44
    Спасибо Благодарностей получено 
    48
    Поблагодарили
    35 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Макросы можно использовать.
    Ну если не трудно, сделай плиз пример со спрайтом.

  2. #12
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,300
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    105
    Поблагодарили
    77 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Наверное, спрайты и без макросов обойдутся(:
    Попробую на днях заняться с 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{}
    }
    Вложения Вложения
    • Тип файла: rar pmg.rar (1.3 Кб, Просмотров: 17)

  3. Этот пользователь поблагодарил Shiny за это полезное сообщение:

    breeze (01.09.2024)

  4. #13
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,300
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    105
    Поблагодарили
    77 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Кстати, я написал не совсем верно, вместо poke можно использовать запись antic_pmbase=pmgmem. Но на код это не влияет.
    Интересно посмотреть на генерацию кода копирования памяти
    Код:
        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
    Сделано все четко - адресация нулевой страницы и цикл 14 итераций подходит для 8-битного индексного регистра Y(он может принимать значения 0-255). Но со счетчиком цикла замудрили. Вообще-то я с подозрением отношусь к разным компиляторам, насмотрелся полученный индусский код, но у millfork'a сделано четко.

    Конечно, можно написать лучше на ассемблере, но на то и сгенерированный исходник(:

    На следующей неделе появится обновление версии, автор пока допиливает. Об изменениях сообщу.

  5. Этот пользователь поблагодарил Shiny за это полезное сообщение:

    breeze (01.09.2024)

  6. #14
    Guru Аватар для andrews
    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,745
    Спасибо Благодарностей отдано 
    444
    Спасибо Благодарностей получено 
    213
    Поблагодарили
    191 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Я раньше писал пример
    А чего там субъект сквозь стены гуляет? Запускал на Altirra-2.40
    proga.tap лучше простые окружности вывести имхо, а так непонятно, то ли задумка такая, то ли чё? Запускал на Fuse.

    - - - Добавлено - - -

    Цитата Сообщение от Shiny Посмотреть сообщение
    насмотрелся полученный индусский код
    Главное, чтобы хотя бы работало. А шашечки за donate или "безд-возд-мездно БВМ, то есть даром (C) сова из мультика про Винни-Пуха Заходера" не обязательны.
    Последний раз редактировалось andrews; 01.09.2024 в 20:52.

  7. #15
    Guru Аватар для breeze
    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,721
    Спасибо Благодарностей отдано 
    44
    Спасибо Благодарностей получено 
    48
    Поблагодарили
    35 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    А чего там субъект сквозь стены гуляет? Запускал на Altirra-2.40
    Там внизу меняется 0/1 показывает коллизии.

    Цитата Сообщение от andrews Посмотреть сообщение
    Главное, чтобы хотя бы работало.
    Ну да, новичкам очень сложно в ассемблер, а особенно в 6502. А так хоть какое-то облегчение. Ну и опять же какая-никакая кроссплатформенность.

  8. #16
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,300
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    105
    Поблагодарили
    77 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    proga.tap лучше простые окружности вывести имхо, а так непонятно, то ли задумка такая, то ли чё? Запускал на Fuse.
    Тебя кастрюль покусал что ли?

  9. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  10. #17
    Guru Аватар для andrews
    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,745
    Спасибо Благодарностей отдано 
    444
    Спасибо Благодарностей получено 
    213
    Поблагодарили
    191 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Тебя кастрюль покусал что ли?
    желателен простой пример с окружностью и/или Helloword.

    - - - Добавлено - - -

    Цитата Сообщение от breeze Посмотреть сообщение
    А так хоть какое-то облегчение
    сразу ковыряться в сложностях в нынешние времена 99% не захотят. А то, что сразу "взлетело и полетело" другое дело.

  11. #18
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,300
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    105
    Поблагодарили
    77 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    желателен простой пример с окружностью и/или Helloword.
    пример 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 {}
    }

  12. Этот пользователь поблагодарил Shiny за это полезное сообщение:

    andrews (02.09.2024)

  13. #19
    Guru Аватар для andrews
    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,745
    Спасибо Благодарностей отдано 
    444
    Спасибо Благодарностей получено 
    213
    Поблагодарили
    191 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Совсем другое дело. Только что вот это за предупреждение?
    Код:
    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.

  14. #20
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,300
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    105
    Поблагодарили
    77 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    "Главное, что хотя бы заработало"(с)
    Это трюк для передачи параметров регистрам при вызове процедуры $22B0 - A=y координата, C=0.

Страница 2 из 6 ПерваяПервая 123456 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 11
    Последнее: 08.12.2023, 17:18
  2. Bad Apple для MSX/MSX2
    от Pyhesty в разделе MSX
    Ответов: 4
    Последнее: 31.05.2021, 21:45
  3. Перенос игр с Game Boy на ZX Spectrum
    от CityAceE в разделе Программирование
    Ответов: 104
    Последнее: 14.02.2019, 10:56
  4. Game Boy Advance
    от megabyte в разделе Nintendo
    Ответов: 8
    Последнее: 22.05.2006, 14:48
  5. Game Boy Advance в Питере.
    от Surfin_Bird в разделе Nintendo
    Ответов: 10
    Последнее: 21.08.2005, 09:50

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •