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

User Tag List

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 38

Тема: CHIP8 Emulator

  1. #11
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Мдя
    а нативный компилер под линупс
    и тоже в виде сорцов...

    ладно посмотрим
    но задача несколько усложняется...

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

    ну сходу вижу у тебя все call
    заменены на jmp
    изза чего
    ничего явно не будет работать

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

    держи более рабочий бинарник
    https://dropmefiles.com/feV7y

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

    вот сорец
    поменял
    jmp на call
    и sys на jmp

    НО 100% что то отвалилось
    (не знаю как оно должно работать
    на вид не работает
    хотя еще нужно поклацать режимы совместимости в самом nschip-е
    тк много чего не работает изза разного трактования команд)

    тк что это скорей кривизна трансляции
    проверяй

    Код:
    ;;; 2048 game for CHIP-8
    ;;;
    ;;; The board is stored as 16 consecutive bytes, each with a value between 0 and 11
    ;;; 0 is an empty tile
    ;;; 1..10 is a tile with values 2..1024
    ;;; 11 is the target tile: as soon as we get an 11 tile, the user has won
    ;;;
    START:
            call NEWGAME
            call DRAW_GRID
            call PLACE_RANDOM_TILE
            call PLACE_RANDOM_TILE
    
            ;; call SLIDE_UP
            ;; call BLIT
    
            ;; call DRAW
    LOOP:
            call DRAW
            key va
            call DRAW
    
            ld vd, 0
            skne va, 6
            call SLIDE_RIGHT
            skne va, 4
            call SLIDE_LEFT
            skne va, 8
            call SLIDE_DOWN
            skne va, 2
            call SLIDE_UP
    
            skeq vd, 0
            call PLACE_RANDOM_TILE
    
            jmp LOOP
    
    DRAW_GRID:
            mvi GRID
            ld v1, 0              ; K := 0
            ld v2, 15             ; X := 15
            ld v3, 0              ; Y := 0
    DRAW_GRID_LOOP:
            skne v1, 16          ; while (K != 16)
            ret
            drw v2, v3, 8
    
            add v1, 1               ; K += 1
            add v2, 8               ; X += 8
            skeq v2, 47
            jmp DRAW_GRID_LOOP
    
            ;; Start new row
            mvi GRID_RIGHT
            drw v2, v3, 8
            ld v2, 15             ; X := 15
            add v3, 8               ; Y += 8
            mvi GRID
            skne v3, 24          ; for bottommost row, use special sprite
            mvi GRID_BOTTOM
            jmp DRAW_GRID_LOOP
    
    BLIT:
            ld v1, 0
    BLIT_LOOP:
            skne v1, 16
            ret
            mvi NEW_BOARD
            adi v1
            ldr v0
            mvi BOARD
            adi v1
            str v0
            ld v0, 0
            mvi NEW_BOARD
            adi v1
            str v0
            add v1, 1
            jmp BLIT_LOOP
    
    ;;; ROTATE
    ;;;
    ;;; Maps
    ;;;
    ;;; 0123
    ;;; 4567
    ;;; 89ab
    ;;; cdef
    ;;;
    ;;; to
    ;;;
    ;;; c840
    ;;; d951
    ;;; ea62
    ;;; fd73
    ;;;
    ;;; Use: V0: TMP
    ;;;      V1: K
    ;;;      V2: K'
    ;;;      V3: ROW
    ;;;      V4: NEW_ROW
    ROTATE:
            call ROTATE_INT
            call BLIT
            ret
    ROTATE_INT:
            ld v1, 0
            ld v2, 3
            ld v3, 3
    ROTATE_LOOP:
            skne v1, 16
            ret
    
            mvi BOARD           ; TMP := BOARD[K]
            adi v1
            ldr v0
    
            mvi NEW_BOARD       ; NEW_BOARD[K'] := TMP
            adi v2
            str v0
    
            add v1, 1                ; K += 1
            add v2, 4                ; K' += 4
    
            ld v4, $11             ; New row?
            and v4, v1
            skeq v4, 0
            jmp ROTATE_LOOP
    
            sub v3, 1               ; ROW -= 1
            ld v2, v3             ; K' := ROW
            jmp ROTATE_LOOP
    
    ;;; SLIDE_LEFT
    ;;; Vars: V0: TMP
    ;;;       V1: K
    ;;;       V2: K'
    ;;;       V3: LAST
    ;;;       V4: END_ROW
    ;;;       V5: ROW
    ;;;       V6: MATCH
    SLIDE_LEFT:
            call SLIDE_LEFT_INT
            call BLIT
            ret
    
    SLIDE_LEFT_INT:
            ld v1, 0              ; K := 0
            ld v2, 0              ; K' := 0
            ld v3, 0              ; LAST := 0
            ld vf, 0              ; WIN := 0
            ld v5, 0              ; ROW := 0
    
    SLIDE_LEFT_ROW:
            skne v1, 16
            ret
    
            mvi BOARD           ; TMP := BOARD[K]
            adi v1
            ldr v0
    
            skne v0, 0
            jmp SLIDE_LEFT_NEXT
    
            ld v6, 0
            skne v0, v3
            ld v6, 1
    
            skne v6, 1          ; IF TMP == LAST then MERGE_LEFT
            call MERGE_LEFT
            skeq v6, 1
            ld v3, v0
    
            mvi NEW_BOARD       ; NEW_BOARD[K'] := TMP'
            adi v2
            str v0
    
            skeq v1, v2          ; vd |= v1 == v2
            ld vd, 1
    
            add v2, 1               ; K' += 1
    
    SLIDE_LEFT_NEXT:
            add v1, 1               ; K += 1
    
            ld v4, $11            ; New row?
            and v4, v1
            skeq v4, 0
            jmp SLIDE_LEFT_ROW
    
            add v5, 1               ; ROW += 1
            ld v3, 0              ; LAST := 0
            ld v2, 0              ; K' := ROW * 4
            skne v5, 1
            ld v2, 4
            skne v5, 2
            ld v2, 8
            skne v5, 3
            ld v2, 12
            jmp SLIDE_LEFT_ROW
    
    SLIDE_DOWN:
            call ROTATE
            call SLIDE_LEFT
            call ROTATE
            call ROTATE
            call ROTATE
            ret
    
    SLIDE_RIGHT:
            call ROTATE
            call ROTATE
            call SLIDE_LEFT
            call ROTATE
            call ROTATE
            ret
    
    SLIDE_UP:
            call ROTATE
            call ROTATE
            call ROTATE
            call SLIDE_LEFT
            call ROTATE
            ret
    
    ;;; MERGE
    ;;; InOut: V0: TMP
    ;;;        V2: K'
    ;;;        V3: LAST
    MERGE_LEFT:
            add v0, 1
            ld v3, 0
            sub v2, 1
            ret
    
    ;;; DRAW_TILE
    ;;; In:  V1: K
    ;;;      V2: X
    ;;;      V3: Y
    ;;; Use: V0: TMP
    DRAW_TILE:
            mvi BOARD           ; TMP := BOARD[K]
            adi V1
            ldr V0
    
            skne v0, 0           ; if TMP == 0 then done
            ret
    
            sub v0, 1               ; drw digit for TMP-1 at (X, Y)
            font v0
            drw v2, v3, 5
            ret
    
    DRAW:
            ld v1, 0              ; K := 0
            ld v2, 15+3           ; X := 15+3
            ld v3, 0+2            ; Y := 0+2
    
    DRAW_LOOP:
            skne v1, 16          ; while (K /= 16)
            ret
            call DRAW_TILE
            add v1, 1               ; K += 1
            add v2, 8               ; X += 8
            skeq v2, (3*16-1)+3  ; Start new row?
            jmp DRAW_LOOP
            ld v2, 15+3           ; X := 15+3
            add v3, 8               ; Y += 8
            jmp DRAW_LOOP
    
    ;;; PLACE_RANDOM_TILE
    PLACE_RANDOM_TILE:
            rnd v2, 7               ; Place a 1 tile with prob 1/8 and a 0 tile with prob 7/8
            ld vb, 1
            skne v2, 0
            ld vb, 2
            call PLACE_TILE
            ret
    
    ;;; PLACE_TILE
    ;;; Input: VB: TILE
    ;;; Use: V0: TMP
    ;;;      V1 : K
    ;;;      V2 : TARGET
    PLACE_TILE:
            rnd v2, 15
            ;; Pick TARGET'th empty square
            ld v1, -1
    PLACE_TILE_SCAN:
            add v1, 1
            skne v1, 16
            ld v1, 0
    
            mvi BOARD           ; TMP := BOARD[K]
            adi v1
            ldr V0
    
            skeq V0, 0           ; If TMP == 0 then next
            jmp PLACE_TILE_SCAN
    
            sub v2, 1               ; Is this the TARGET'th empty square?
            skeq v2, 0
            jmp PLACE_TILE_SCAN
    
            ld v0, vb             ; BOARD[K] := TILE
            str v0
            ret
    
    
    ;;; NEWGAME: fill BOARD with zeroes
    NEWGAME:
            ld v1, 0
            ld v0, 0
    NEWGAME_LOOP:
            skne v1, 16
            ret
            mvi BOARD
            adi v1
            str v0
            add v1, 1
            jmp NEWGAME_LOOP
    
    BOARD:
            .ds 16
    NEW_BOARD:
            .ds 16
    
    GRID:   defb 	%11111111
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
    
    GRID_BOTTOM:
            defb 	%11111111
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%11111111
    
    GRID_RIGHT:
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
            defb 	%10000000
    - - - Добавлено - - -

    так же на вид (вроде бы sjasm переваривает? такие макросы)
    я могу поддержать команды через точку
    вида skip.ne

    возможно получится компилировать этот асм из коробки

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

    хотя отличить вот это друг от друга...
    скорей всего не получится

    Код:
    loadvX, time
    Load register vXwith the value of the time register.
    Code generated: 0xFX07
    load time,vX
    Load the time register with the value of register vX.
    Code generated: 0xFX15
    load tone,vX
    Load the tone register with the value of register vX.
    Code generated: 0xFX18
    load i, addr
    Load register i with the addr.The addrmust be in the range 0x200 to 0xFFF.
    Code generated: 0xANNN,where NNN is the low12bits of addr.
    Последний раз редактировалось NEO SPECTRUMAN; 18.02.2020 в 01:41.

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

    zebest (18.02.2020)

  3. #12
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,673
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    323
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ну так да, уже получше, поле рисуется, и даже цифры, но видимо где то "лишнее" заменилось. Прогресс есть.
    Profi v3.2 -=- Speccy2010,r2

  4. #13
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    Прогресс есть.
    открой сравнение тоталкомандером
    и посмотри сравни расхождения

    а так я попробую впилить поддержку того асма
    но это затянитсо на какое то время

    я то уже и забыл что к чему

  5. #14
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    кстате у него очепятки в инструкции


    jump addr
    Jump toaddr.The addrmust be even. The addrmust be in the range 0x200 to 0xFFE. The
    addr expression must be relative tosome label.
    Code generated: 0x0NNN,where NNN is the low12bits of addr.

    jump addr,v0
    Jump toaddr+v0. The addrmust be even. The addrmust be in the range 0x200 to 0xFFE. The
    addr expression must be relative tosome label. It is a run-time error if the value of register v0 is
    odd. It is a run-time error if addr+v0 is not in the range 0x2000 to 0xFFE.
    Code generated: 0xBNNN,where NNN is the low12bits of addr.

    call addr
    Call subroutine at addr.The addrmust be even. The addrmust be in the range 0x200 to 0xFFE.
    The addr expression must be relative toalabel. It is a run-time error if there are too many
    subroutine calls, although you may safely assume at least 32 levels.
    Code generated: 0x1NNN,where NNN is the low12bits of addr.
    тк jmp это 1***
    а call 2***

    a 0***
    это как раз sys
    вызов нативного кода проца (который обычно нигде не эмулируется)
    и часть адресов которых уже давно забита под другие расширения...


    да и вощем там еще много напутано...
    всякие свои велосипеды
    и даже изобрел 2 своих левых команды...

    интересно его компилятор хоть правильно компилит?
    или компилит туже ахинею что написана в мануале?...
    Последний раз редактировалось NEO SPECTRUMAN; 18.02.2020 в 06:28.

  6. #15
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,673
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    323
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    кому сколько нравиться
    никакой стандартной скорости НЕТ

    некоторым поделиям с привязкой к частоте кадров
    нужна максимально возможная скорость
    (например для chipnstein
    но мой эмуль не выдает нужной скорости
    так же выдаваемую скорость некак померять
    Ну мой то в эфсипыгыа любую скорость может изобразить. Спрайтовый модуль тактируеЦЦа хоть 8 Мгц, хоть 100 Мгц (можно и больше). Процессор сейчас у мну на 4 кГц!! (кошмарная скорость. да?) Можно те же 100 втуда подать. а так то на 20 кГц уже сильно быстро.
    Игру я впобедил!!)

    у этого же автора совсем в другом проекте скомпиленный файл нашел!!!
    https://github.com/gergoerdi/chip8-c...e/master/games
    если подизассемблить - можно вычислить наверное "неправильные" комманды. Вот только смысл теперь ?))
    (смысл конечно есть, сделать нормальный листинг этой игры под УжаСм)
    А,да,, в игрухе максимальную скорость в эмуле поставил, и то иногда некомфортно. думает над ходами ))
    Звук я так понимаю сам проц не генерит, а только отрезки времени, в течении которых включается\выключается внешний генератор??
    Последний раз редактировалось zebest; 18.02.2020 в 11:11.
    Profi v3.2 -=- Speccy2010,r2

  7. #16
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    Звук я так понимаю сам проц не генерит, а только отрезки времени, в течении которых включается\выключается внешний генератор??
    до
    но не кто не запрещает
    быстро включать и выключать пищалку

    но большинство (все?) ПЦ-шных эмуляторов
    такое не понимают

    вот на старых платформах
    такое возможно будет работать

    у меня работает
    пищите сколько влезет

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

    Цитата Сообщение от zebest Посмотреть сообщение
    смысл конечно есть,
    угу
    по ней сверю правильность компилирования
    того асма

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

    а так еще интересная игра
    ChipWar
    правда она написана под octo
    и работает только в octo и в моем эмуле (при должных режимах совместимости)
    хотя щас вполне запустил в fish n chips-е
    и на вид работает

    правда уровней там нет
    и она быстро надоедает...

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

    Цитата Сообщение от zebest Посмотреть сообщение
    у этого же автора совсем в другом проекте скомпиленный файл нашел!!!
    также я нашел другую версию
    не знаю той же игры или нет
    но с таким же названием
    от другого автора
    https://boomlin.de/findings/ch8
    Последний раз редактировалось NEO SPECTRUMAN; 18.02.2020 в 13:25.

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

  9. #17
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,673
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    323
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    но не кто не запрещает
    быстро включать и выключать пищалку

    но большинство (все?) ПЦ-шных эмуляторов
    такое не понимают
    ну у меня можно сделать хоть так. хоть так. Но по простому варианту - щелчки получаются, а по писишному - семпл играет, ну и коммутируется.
    На АЕОН-е дошел до числА "А" - 4096 если в обычном варианте)

    при скорости проца в 4кГц - напряжно, уж отчень медленно, видимо буду делать турбу х1-х2-х4-х8


    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    также я нашел другую версию
    не знаю той же игры или нет
    но с таким же названием
    от другого автора
    https://boomlin.de/findings/ch8
    название похоже, но чет игра совершенно другая, пока логику не понял еще)
    Profi v3.2 -=- Speccy2010,r2

  10. #18
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    Но по простому варианту - щелчки получаются, а по писишному - семпл играет,
    ну дык
    а ты делай переинициализацию пищалки
    чтоб играние семпла начиналось с начала
    сразу в момент появление на таймере больше 0

    тогда сохраняется и пищание семпла
    и возможность вывода своего звука
    Последний раз редактировалось NEO SPECTRUMAN; 18.02.2020 в 14:58.

  11. #19
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,673
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    323
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    у мну с процессора чисто сигнал идет
    .audio_enable (audio_enable),
    0\1, а длительность я так понял программно на этом выводе выставляют.
    Подизамблил 2048, не нашел как выгружать чисто asm, поэтому скопировал весь листинг
    upd:
    Привел в божеский вид, собирается в ужасме ровно.
    Последний раз редактировалось zebest; 19.02.2020 в 01:16.
    Profi v3.2 -=- Speccy2010,r2

  12. #20
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    теперь ошибки будут немного более осмысленные и более заметны


    пока нет возможности написать текущую строку
    но подписал текущий адрес
    уже будет легче искать косяки

    может еще Ped7g вправит sjasm когда нибудь
    для возможности выдачи текущей строки
    (lua выдает только строку в макросе (в месте его объявления))


    так же нашел способ как отличать макросы с аргуменатами от макросов без аргументов
    с одинаковыми именами
    (например нужно для того чтобы отличить jp xxx от jp v0,xxx)
    конечно ошибок сыпетсо море
    но в результате код генерит правильный

    может удастсо запилить z80 стайл асм-а

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

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

    нифига
    оно не переваривает если аргумент у макроса не цифры а например метки

    нет не хочет оно все работать...
    можно макросы только с 1 опциональным аргументом
    но не с 2-мя...
    так что z80 подобные мнемоники откладываются до лучших времен
    Последний раз редактировалось NEO SPECTRUMAN; 19.02.2020 в 17:16.

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

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

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

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

Похожие темы

  1. Speccy emulator
    от Rindex в разделе Эмуляторы
    Ответов: 53
    Последнее: 13.07.2022, 22:50
  2. GameBase Kawaks emulator
    от Rindex в разделе Зарубежные компьютеры
    Ответов: 0
    Последнее: 14.05.2014, 18:40
  3. Agat Emulator v1.26.1
    от Rindex в разделе Apple
    Ответов: 0
    Последнее: 15.02.2014, 22:02
  4. SpecEmu v2.8 emulator released
    от Woodster в разделе RST#38
    Ответов: 7
    Последнее: 16.11.2008, 21:03

Метки этой темы

Ваши права

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