User Tag List

Страница 4 из 16 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 151

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

  1. #31

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,877
    Спасибо Благодарностей отдано 
    128
    Спасибо Благодарностей получено 
    131
    Поблагодарили
    81 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Wink

    Цитата Сообщение от Shiny Посмотреть сообщение
    Любопытный подход (: Опрос джойстика можно использовать с помощью теста битов.
    Ну вообще да, это я с тетрадки проверку поднял, ещё когда в школе учился делал опрос на бейсике

    Цитата Сообщение от Shiny Посмотреть сообщение
    Кстати, тут определяется игрок 0, а всего 0-3(не считая снарядов(missile) 0-3, которые можно объединить в спрайт.
    Ну это да, есть задумка прикрутить спрайт из Boulder Dash и попробовать анимацию.

    Кстати, посмотрел как «они» печатают символ, нашел кусок:

    Код:
    noinline asm void putchar(byte register(a) char) {
        ? tax
        lda $347
        pha
        lda $346
        pha
        ? txa
        rts
    }
    
    
    inline void new_line() {
        putchar($9b)
    }
    Что-то мне весь этот «конструкт» напоминает кубики лего
    @Shiny подскажи плиз, как позиционируется курсор в текстовом режиме бейсика? Может есть какие-то адреса текущей позиции? Хочу выводить текущие координаты спрайта перетирая старые значения.

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

  3. #32

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

    По умолчанию

    Цитата Сообщение от breeze Посмотреть сообщение
    @Shiny подскажи плиз, как позиционируется курсор в текстовом режиме бейсика? Может есть какие-то адреса текущей позиции? Хочу выводить текущие координаты спрайта перетирая старые значения.
    Почитать Mapping The Atari (:
    Сам не сталкивался с позиционированием, но в книге написано: 656 - строка, 657/658 - столбец.
    https://forums.atariage.com/topic/28...omment-4976073
    Последний раз редактировалось Shiny; 05.09.2024 в 11:02.

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

    breeze(05.09.2024)

  4. #33

    Регистрация
    20.04.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,870
    Спасибо Благодарностей отдано 
    522
    Спасибо Благодарностей получено 
    251
    Поблагодарили
    225 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В Altira 2.40 реакции на стрелки нет. Рожица добегает по строчке слева направо и всё! Нельзя ли другой тест под стрелки? В эмуляторе второй игрок - всегда компьютер.
    Последний раз редактировалось andrews; 05.09.2024 в 11:03.

  5. #34

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

    По умолчанию

    Цитата Сообщение от andrews Посмотреть сообщение
    В Altira 2.40 реакции на стрелки нет. Рожица добегает по строчке слева направо и всё! Нельзя ли другой тест под стрелки?
    Опрос джойстика, а не клавишей со стрелками.

  6. #35

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,877
    Спасибо Благодарностей отдано 
    128
    Спасибо Благодарностей получено 
    131
    Поблагодарили
    81 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    Почитать Mapping The Atari (:
    Ну тут блин ещё искать где и как, а вдруг ты более подкован и уже делал такоэ

    Цитата Сообщение от Shiny Посмотреть сообщение
    Сам не сталкивался с позиционированием, но в книге написано: 656 - строка, 657/658 - столбец.
    https://forums.atariage.com/topic/28...omment-4976073
    К сожалению не сработало, видимо дело или в бейсике или потому что у них граф.режим 2

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

    Цитата Сообщение от andrews Посмотреть сообщение
    В Altira 2.40 реакции на стрелки нет. Рожица добегает по строчке слева направо и всё! Нельзя ли другой тест под стрелки? В эмуляторе второй игрок - всегда компьютер.
    Что-то это не то явно. Во первых код с движением закомментирован и никто никуда не должен ехать. А во вторых да, управление джойстиком. Стрелки это надо ещё с опросом клавиатуры разбираться.

    - - - Добавлено - - -
    @Shiny Короче если попытаться включить GR.2 через $ef9c, как у тебя в lines сделано:

    Код:
    asm void openmode(byte register(a) m) @ $ef9c extern
    То либо ничего, либо конфликт со спрайтами:

    Если сначала вызвать openmode, а затем инитить спрайты, то оно «перетирается».

    Если же сначала вызвать инит спрайтов, а затем openmode(2), то спрайт растягивает по вертикали в виде мусора и колбасит. При этом один фиг позиционирование не работает.

    Видимо я не до конца понимаю как на асме переключаются режимы.

  7. #36

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

    По умолчанию

    все время сначала включали режим, потом задавали спрайты.
    Заодно надо посмотреть, где располагается Display List и адресована видеопамять - возможен конфликт.

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

    Цитата Сообщение от breeze Посмотреть сообщение
    К сожалению не сработало, видимо дело или в бейсике или потому что у них граф.режим 2
    попробуй адреса 84, 85/86

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

    Код:
    import stdio
    import stdlib
    
    array hello_world = "Hello world"
    
    void main() {
        putstr(hello_world, hello_world.length)
    
    	poke(84,5)
    	poke(85,3)
        putstr(hello_world, hello_world.length)
    
    
        while(true){}
    
    }

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

    breeze(05.09.2024)

  8. #37

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,877
    Спасибо Благодарностей отдано 
    128
    Спасибо Благодарностей получено 
    131
    Поблагодарили
    81 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Exclamation

    Цитата Сообщение от Shiny Посмотреть сообщение
    попробуй адреса 84, 85/86
    Супер! Офигенно! То что надо!!!

    p.s. с клавиатурой засада Если юзать как в примере с опросом через ROM:

    Код:
        lda #$C
        sta $2A
        lda $E425
        pha
        lda $E424
        pha
        rts
    То да, код нажатой клавиши возвращается, но пока не отпустишь нифига нет.
    Если выкинуть кусок в начале:

    Код:
        lda $E425 // GET ADRESS-VECTOR
        pha       // FROM ROM HANDLER TAB
        lda $E424 // PLACE ADDRESS AS
        pha       // RETURN ADDRESS TO STACK
        rts       // JUMP TO ROM-ROUTINE
    То да, оно работает. Но во первых каждый раз пибикает, во вторых медленно, а третьих если ни одна клавиша не нажата то из «цикла» не отпускает и всё тупо висит пока не нажмёшь клавишу.

    Нужно искать какой-то опрос напрямую через порты, как на спектруме. Но ничего вменяемого пока не нашел.

  9. #38

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

    По умолчанию

    peek(764). Если клавиша нажата, впиши в нее 255

    В общем, какая-то байда с включением видеорежима - не получаю текстовый. Написал код по примеру, теперь не работает print #6. Заставил, чтобы заработало, нашлись доки(:

    Код:
    array(byte) hello_world = [$30,$31,$32,$33,$9B]
    array(byte) nam=[$53,$3a,$9B]
    
    void main() {
    	asm
     {
    	lda #18
           PHA           ; Store on stack
           LDX #$60      ; IOCB6 for screen
           LDA #$C       ; CLOSE command
           STA $0342,X;ICCOM,X   ; in command byte
           JSR $E456;CIOV      ; Do the CLOSE
           LDX #$60      ; The screen again
           LDA #3        ; OPEN command
           STA $0342,X;ICCOM,X   ; in command byte
           LDA #nam&255 ; Name is "S:"
           STA $0344,X;ICBAL,X   ; Low byte
           LDA #nam/256 ; High byte
           STA $0345,X;ICBAH,X
           PLA           ; Get GRAPHICS n
           STA $034B,X;ICAX2,X   ; Graphics mode
           AND #$F0      ; Get high 4 bits
           EOR #$10      ; Flip high bit
           ORA #$C       ; Read or write
           STA $034A,X;ICAX1,X   ; n+16, n+32 etc.
           JSR $E456;CIOV      ; Setup GRAPHICS n
    //print #6
    	lda #2
    	sta $84
    	lda #2
    	sta 85
    	ldx #$60
    	lda #hello_world&255
    	sta $0344,X ; ICBAL
    	lda #hello_world/256
    	sta $0345,X ; ICBAL
    	lda #9
    	sta $0342,X ; ICCOM
    	lda #0
    	sta $0348,X ;ICBLL
    	lda #$FF
    	sta $0349,X ;ICBLH
           	JSR $E456;CIOV
    
    	lda #0
    	sta 84
    	lda #2
    	sta 85
    
    	ldx #$60
    	lda #nam&255
    	sta $0344,X ; ICBAL
    	lda #nam/256
    	sta $0345,X ; ICBAL
    	lda #9
    	sta $0342,X ; ICCOM
    	lda #0
    	sta $0348,X ;ICBLL
    	lda #$FF
    	sta $0349,X ;ICBLH
           	JSR $E456;CIOV
    
     }
    //    putstr(hello_world, hello_world.length)
    
    	poke(84,5)
    	poke(85,3)
    //    putstr(hello_world, hello_world.length)
    
    
        while(true){}
    
    }
    Последний раз редактировалось Shiny; 05.09.2024 в 15:05. Причина: адрес 764, а не 765

  10. #39

    Регистрация
    11.02.2005
    Адрес
    【RB】
    Сообщений
    3,877
    Спасибо Благодарностей отдано 
    128
    Спасибо Благодарностей получено 
    131
    Поблагодарили
    81 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    Exclamation

    Это было не просто, но мы справились. Структура спрайтов на атари это ещё то гениальное решение

    Короче доделал универсальную шнягу для отображения спрайта, теперь задаёшь номер 0,1,2,3 и вгружаются данные для Player0 … Player3 соответственно.

    Было немного неприятно узнать, что данные спрайта в начале и в конце надо обязательно обрамлять $00 иначе при движении вверх/вниз крайний байт начинает мазать в линию x_x



    Сырки:

    sprites.mfk
    Код:
    const byte pmgmem=$80 //pmgmem*256 == place for sprites
    
    
    void sprInit() {
    
    
    	poke($D407,pmgmem)      // PMGBASE place in memory
    
    
    	poke ($022F,%00111110)  // SDMCTL - Shadow of $D400 - Direct Memory Access (DMA) Control
                                    // Bit	Dec	Function
                                    // 7	128	not used
                                    // 6	64	not used
                                    // 5	32	Direct Memory Access on=1/off=0
                                    // 4	16	One-line P/M-vertical resolution on=1/off=0
                                    // 3	8	DMA for Players on=1/off=0
                                    // 2	4	DMA for Missiles on=1/off=0
                                    // 0,1	3	Wide playfield (48 bytes/chars)
                                    // 0,1	2	Normal playfield (40 bytes/chars)
                                    // 0,1	1	Narrow playfield (32 bytes/chars)
                                    // 0,1	0	Playfield off
    
    
    	poke ($D01D,%00000011)  // GRACTL controls PM and Triggers
                                    // Bit 	Function
                                    // 7	unused
                                    // 6	unused
                                    // 5	unused
                                    // 4	unused
                                    // 3	unused
                                    // 2	Latch Triggers when =1
                                    // 1	Turn on players when =1
                                    // 0	Turn on missiles when =1
    
    
    	poke ($026F,1)          // GPRIOR Priority Selection Register
                                    // Bit	Value	Description
                                    // 0	1	P0-P1-P2-P3 PF0-PF1-PF2-PF3 BAK
                                    // 1	2	P0-P1 PF0-PF1-PF2-PF3 P2-P3 BAK
                                    // 2	4	PF0-PF1-PF2-PF3 P0-P1-P2-P3 BAK
                                    // 3	8	PF0-PF1 P0-P1-P2-P3 PF2-PF3 BAK
                                    // 4	16	Four Missiles add up to be 5th player
                                    // 5	32	Overlapping Players have 3rd color
                                    // 6	64	GTIA Mode see next table
                                    // 7	128	GTIA Mode see next table
    	
    	poke ($D008,0)          // [W] SIZEP0 size of player 0
                                    // 0 = normal, 1 = double, 3 = quadruple
                                    // [R] M0PL Collision Missile 0 with Player
    	poke ($D009,0)          // [W] SIZEP1 size of player 1
    	poke ($D00a,0)          // [W] SIZEP2 size of player 2
    	poke ($D00b,0)          // [W] SIZEP3 size of player 3
    
    
    //	poke ($D00b,0)          // [W] SIZEM size of missile
    
    
    }
    
    
    //asm void setColor(byte player, byte register(a) m) @ $02C0 + player extern
    
    
    asm void setColor(byte player, byte register(a) m) {
        LDX player
        STA $02C0,X
        RTS
    }
    
    
    asm void setPosX(byte player, byte register(a) m) {
        LDX player
        STA $D000,X
        RTS
    }
    
    
    void sprShow(byte sprNum, pointer _sprData, byte _sprSize, byte _sprColor, byte x, byte y) {
    	pointer pmg0 //, pmg1
    	ubyte i
    
    
    	setColor(sprNum, _sprColor)
    	setPosX(sprNum, x)
    
    
    //      poke ($D004,x)         // HPOSM0 horisontal place missile 0
    //      poke ($D005,x)         // HPOSM1 horisontal place missile 1
    //      poke ($D006,x)         // HPOSM2 horisontal place missile 2
    //      poke ($D007,x)         // HPOSM3 horisontal place missile 3
    
    
            // copy sprite data to defined place
    	pmg0=word((pmgmem*256) + 1024 + ($100 * sprNum) + y)
    	for i,0,to,_sprSize-1 {
    		pmg0[i]=_sprData[i]
    	}
    }
    boulder.mfk
    Код:
    import stdio
    
    
    import sprites
    
    
    array titleStr = "Boulder Dash ]["
    
    
    array(byte) heroSpr0 = [0,$24,$3c,$5a,$5a,$3c,$18,$3c,$42,$18,0,$18,0]
    array(byte) heroSpr1 = [0,$18,$24,$18,0,$18,0,0,$66,0]
    array(byte) heroSpr2 = [0,$24,$24,$24,0]
    
    
    byte color0 = $56
    byte color1 = $0e
    byte color2 = $c6
    
    
    noinline asm void wait(byte register(a) f) {
      clc
      adc os_RTCLOK.b2
      .rt_check:
      cmp os_RTCLOK.b2
      bne .rt_check
      rts
    }
    
    
    void printAt(byte x, byte y, byte i) {
    	poke(84, y)
    	poke(85, x)
    
    
    	putword(i)
    	putstrz("   "z)
    }
    
    
    void main() {
    	byte pX
    	byte pY
    	byte joy
    	
    	sprInit()
    
    
    	putstr(titleStr , titleStr.length)
    	new_line()
    	putstrz("Use JoyStick, LOOK!"z)
    	new_line()
    
    
    	pX = 120
    	pY = 116
    	putstrz("PosX: "z)
    	putword(pX)
    	new_line()
            putstrz("PosY: "z)
    	putword(pY)
    	new_line()
    	joy = peek(632)
    	putstrz("JoyStick: "z)
    	putword(joy)
    
    
    	sprShow(0, heroSpr0, heroSpr0.length, color0, pX, pY)
    	sprShow(1, heroSpr1, heroSpr1.length, color1, pX, pY+7)
    	sprShow(2, heroSpr2, heroSpr2.length, color2, pX, pY+11)
    
    
    	while (true) {
    		wait(1)
    		joy = peek(632)
    
    
    		if (joy == 11 || joy == 10 || joy == 9) {
    			pX -= 1
    		} else if (joy == 7 || joy == 6 || joy == 5) {
    			pX += 1
    		}
    		if (joy == 14 || joy == 10 || joy == 6) {
    			pY -= 1
    		} else if (joy == 13 || joy == 9 || joy == 5) {
    			pY += 1
    		}
    		if (joy != 15) {
    			sprShow(0, heroSpr0, heroSpr0.length, color0, pX, pY)
    			sprShow(1, heroSpr1, heroSpr1.length, color1, pX, pY+7)
    			sprShow(2, heroSpr2, heroSpr2.length, color2, pX, pY+11)
    			printAt(8, 2, pX)
    			printAt(8, 3, pY)
    			printAt(12, 4, joy)
    		} else {
    			printAt(12, 4, joy)
    		}
    	}
    
    
    
    
    }
    - - - Добавлено - - -

    Что бы не рисовать ручками, решил тут поискать спрайты в памяти оригинального Boulder Dash.
    Ага, щаз! Судя по структуре похоже оно тайлами фигарит

    К слову нашёл сырки, кто-то декомпильнул оригинальный Boulder Dash
    Вложения Вложения

    Эти 2 пользователя(ей) поблагодарили breeze за это полезное сообщение:

    andrews(26.10.2024), Oleg N. Cher(06.09.2024)

  11. #40

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

    По умолчанию

    Интересно, а прокатит ли способ сложения цветов? В Preliminary Monty 16K это выглядит оч даже симпатично.

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

    Добрался до Apple ii
    Компиляция
    Код:
    java -jar millfork.jar -I .\include\ -t apple2 xp.mfk
    java -jar AppleCommander-1.3.5.jar -d MASTER.dsk xp
    java -jar AppleCommander-1.3.5.jar -p MASTER.dsk xp B 0xc00 < xp.a2
    MASTER.dsk можно найти в дистрибутиве AppleWin,AppleCommander-1.3.5 найдете гуглом.
    первая строка - компиляция
    вторая строка - удаление с диска файла xp
    третья строка - копирование файла на образ диска
    Запуск: BRUN XP

    Код xp.mfk
    Код:
    //Apple II lowres pattern
    import stdlib
    array(byte) cold=[$00,$88,$44,$CC,$EE,$AA,$FF,$55,$77,$66,$22,$33,$11,$BB,$99,$DD]
    pointer linea @ 0x26//GBASL,GBASH
    asm byte gbascalc(byte a) @ $F847 extern// in:A=Y coordinate, out:(GBASL,GBASH)=video memory address
    asm byte setlores() @ $FB40 extern
     void main() {
    	byte i,y
    	setlores()
    	poke ($C052,0)//enable graphics/text mixed mode
    	for y,0,to,23
    		{
    		gbascalc(y)//calculate address
    		for i,0,to,39
    			{
    			linea[i]=cold[(i&y)&15]
    //			linea[i]=cold[i&15]//obly debug output
    			}
    		}
     	while true{}
    	}
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	xp.png 
Просмотров:	40 
Размер:	2.7 Кб 
ID:	81214  

Страница 4 из 16 ПерваяПервая 12345678 ... ПоследняяПоследняя

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

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

Эту тему просматривают: 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

Ваши права

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