atarionline.pl Assembler 6502 - odwapnianie mózgu :) - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthorat0mic
    • CommentTime30 Mar 2012 zmieniony
     
    @Kaz wydaje mi się że w Polsce najwięcej było:

    1 Spectrum/Timex
    2 Atari XL/XE
    3 Commodore 64/128
    4 Amstrad/schneider
    5 MSX
    6 Meritum 1/2
    7 ZX 81
    8 C 16/116/+4
    9 elwro
    10 Sam Coupe
    11 Meritum III (Meritum 3), ostatni model z tej serii, był rozszerzony między innymi o tryb graficzny 256 x 192, 32 kolory, 4 odcienie szarości. W serii próbnej powstało około 100 sztuk tej wersji.
    12 C65

    rozumiem że swoje twierdzenie opierasz na podaży globalnej a nie lokalnej...
    • 2: CommentAuthorbob_er
    • CommentTime30 Mar 2012
     
    z maluchami (xl/xe) jest jeszcze ten problem, że wiele z nich zostało zdekompletowanych (stereo).
    • 3:
       
      CommentAuthorKaz
    • CommentTime30 Mar 2012 zmieniony
     
    @Kaz wydaje mi się że w Polsce najwięcej było:


    Moze i tak bylo, ale to dawno i nieprawda. Akurat w Polsce sytuacja komputerowa bardzo dynamicznie sie zmieniala na przelomie lat 80-tych i 90-tych. Nie spotkalem jeszcze wiarygodnych opracowan na temat liczby komputerow w Polsce i wszystko oparte jest na wrazeniach. A moje wrazenie jest takie, ze poczatkowo najliczniejsze byly Spectrumy ze wzgledu na najnizsza cene (do polowy lat 80-tych), potem Atari ze wzgledu na dostepnosc w Pewexie(do przelomu 89/90), a potem C-64 ze wzgledu na wyprzedaz na Zachodzie. Sadze tak na podstawie wizyt na gieldzie i rozmow z handlarzami.

    Na pewno tamte czasy znaczaco sie roznia od obecnych i liczba komputerow poszczegolnych marek wspolczesnie jest inna. Widac to wlasnie po cenach aukcyjnych.

    rozumiem że swoje twierdzenie opierasz na podaży globalnej a nie lokalnej...


    Jak najbardziej lokalnej :). Ceny z Allegro (ten serwis mozemy umownie nazwac zrodlem podazy) to nie sa ceny globalne tylko lokalne, dopasowane do miejscowego popytu i podazy.

    Tylko, ze lokalna podaz jest ograniczona podaza globalna. Komputery naplywaly do Polski z roznych krajow, poczynajac od RFN w latach 80-tych i 90-tych, a wspolczesnie nie tylko z Niemiec, ale i Francji, Wlk. Brytanii, USA. Tylko, ze w przypadku Atari podaz globalna jest kilkunastokrotnie nisza niz w przypadku C-64 i jest to bariera nie do przeskoczenia.

    A jak Bober zauwazyl - dodatkowo wiele Atarek poszlo na przemial ze wzgledu na rozbudowana u nas scene milosnikow lutowania (tego na C-64 nie ma) :)
    • 4: CommentAuthorxxl
    • CommentTime30 Mar 2012
     
    > jak w asm zrobić GR.X ?
    > podejrzewam że LDA#$ coś i JSR$ gdzieś ale nie wiem gdzie i szkoda czasu na szukanie jeśli ktoś wie i będzie chciał odpisać to z góry dziękuję

    KIJ W MROWISKO:

    LDA #tryb_grafiki
    JSR $EF9C

    pod warunkiem, ze masz OS wlaczony. ale jedno i drugie to zlo i szatan.
    • 5:
       
      CommentAuthormgr_inz_rafal
    • CommentTime30 Mar 2012 zmieniony
     

    Kaz:

    wszystko oparte jest na wrazeniach
    Na mojej "dzielni" w dzieciństwie (lata 80-90) było tak:
    - Atari 65XE (ok. 12-13 sztuk)
    - Atari 800XL (4 sztuki)
    - C64 (jeden)
    Takie mam wrażenia :) Choć te dotyczące C64 mogą być przekłamane, bo trzymało się głównie z Atarowcami...

    Ale w tym samym czasie jak bywałem u rodziny w zachodnich Niemczech, to tam z kolei głównie na C64 się grało.
    • 6:
       
      CommentAuthorTheFender
    • CommentTime30 Mar 2012
     
    W sumie ciężko mówić o ilości konkretnych mikrokomputerów w Polsce w dajmy tam latach 84-88. To był ogólnie towar deficytowy wtedy. Moje wspomnienia podpowiadają, że najwięcej było ZX Spectrum lub Meritum (a potem Timex): były i po szkołach, i po zakładach pracy, i na uczelniach :). Na drugim miejscu towary luksusowe z Baltony, czyli C=64, które trafiały się na przemian z Atari 800XL. W niektórych kręgach były przemycane Amstrady (na których ponoć fajnie można było bawić się w DTP) i służyły do nazwijmy to "małej poligrafii alternatywnej" (to jeszcze za komuny). Rok 1988/89 to wysyp Atari do Pewexów i przez to bardzo mocna popularyzacja tego komputera w Polsce. To trwało do ok. 1991 kiedy w Polskich sklepach zaczęły pojawiać się Amigi i zamiotły resztę pod dywan. Jakoś tak wtedy również zaczęło się pojawiać dużo C=64 po sklepach (popularne szczególnie z zestawem z cartridge Flimbo's Quest) - jak kogoś nie było stać na Ami to kupował komodorka. Sporo tego pojawiło się wtedy w domach. Później, jak kogoś wciągnęła Amiga to do niej dokładaj kolejne rozszerzenia :) a reszta bawiła się Pegazusami. Tak do ok. 1996, gdzie ludzi pozdawali matury i część kupiła sobie Sony Playstation a inni pecety (a niektórzy jedno i drugie).
    • 7: CommentAuthorat0mic
    • CommentTime31 Mar 2012 zmieniony
     
    odwapniania ciąg dalszy: "kompletna ślepota..."

    Aby program ASM był wykonany w BASIC
    zwykle używa się
    zmienna = usr(adres,parametr1,...,parametrN)
    .

    Ponieważ do tej pory nie używałem parametrów dostałem pomoc. Miker (dzięki Miker) mówi że trzeba dać PLA. PLA jest żeby zdjąć ze stosu wartość zero, mówiącą że nie podano parametrów, co zapewni prawidłowy powrót do basic po wykonaniu programu ASM. (jeszcze było o JSR u Mikera)

    W ramach eksperymentu napisałem nic nie robiącą, zoptymalizowaną* procedurę do bezawaryjnego powrotu do basic po instrukcji USR odwołujacej się do programu ASM wraz z przekazaniem parametrów dowolnej** ich liczby.

    *optymalizacja polegała na wykonaniu jak najszybszego i najkrótszego programu - bez niepotrzebnych instrukcji.
    **jest to liczba ograniczona - niestety nie doczytałem jaka :/
    PLA   ;"POBIERA DO A ILOŚĆ PARAMETRÓW"
    BEQ rts ;"JEŚLI NIE MA PARAMETRÓW WRACA DO BASIC"
    ASL ; "MNOŻY LICZBĘ PARAMETRÓW RAZY 2BAJTY BO TYLE JEST DANYCH NA STOSIE"
    TSX ; "WSKAZNIK STOSU WKŁADA DO REJESTRU X"
    STX$CC ;"ZAPAMIĘTUJE X W $CC NA STRONIE ZEROWEJ"
    CLC ; "ZERUJE ZNACZNIK C PRZED DODAWANIEM"
    ADC$CC;"DODAJE A DO $CC "
    TAX ;"PRZEKAZUJE A DO X "
    TXS ;"NOWY WSKAZNIK STOSU JEST USTAWIONY TAK JAKBY BYŁO WYKONANE (ilość parametrów*2) x PLA ->*2 bo parametry są dwubajtowe"
    RTS


    -działa ale ma podstawową wadę tzn nie ma wygodnego dostępu do parametrów.
    -można oczywiście zrobić PLA w pętli indeksowanej rejestrem X albo Y ale mi chodzi o zabawę stosem a nie najprostsze zapętlanie się ;P

    Wsk Stosu dalej będę używał SP (stack pointer -jeśli będzie to dalej i nie usnę wcześniej) może mieć maksymalną wartość 255 a minimalną 0.
    Przy wartości 0 wskazuje na $100
    a przy wartości $ff (255) na $1ff (511).
    Ważne że PLA zwiększa tę wartość a PHA zmniejsza.

    no więc kolejny program wyglądał trochę inaczej i nie był już taki optymalny ale miał konkretne zadanie tj. dobrać się do parametrów:

    PLA
    BEQ rts
    ASL
    STA$CC
    TSX
    STX$CB
    CLC
    ADC$CB
    TAX
    TXS
    LDX#$00
    LDY$CB
    LDA$0101,Y ;dół stosu zwiększamy o 1 bajt bo pierwszy bajt mówi ile liczb było przekazanych jako parametry USR i jak wpiszemy prawidłowy dół stosu $100 to niestety nie dostaniemy bajtu LO ostatniego parametru z USR (trzeba by zwiększyć INC$CC jeśli się upierasz przy LDA$0100,Y)

    STA$9C40,X
    INY
    DEX
    CPX$cc00
    BNE lda$oioo,y
    RTS


    KOD JEST OBRZYDLIWY I NIE MAM JUŻ SERCA GO UZDATNIAĆ
    Wypisuje bajty w pamięci ekranu w takiej kolejności jak był prametry w USR ale niestety z organizacją HILO - co dyskwalifikuje go jako program do współpracy z kodem ASM.

    odwapniłem ... idę spać! dobranoc!

    mylę górę pamięci z dołem, dół stosu ze szczytem ... o ... zzzzzz. hrrrrrr. psiiiiii... hrrrrrrrrr... fiuuuuuuuuu
    • 8: CommentAuthorat0mic
    • CommentTime2 Apr 2012 zmieniony
     
    MADS - trywialny problem dla wyjadaczy
    w instrukcji MADS nawet nie ma tematu stałe - szukałem.
    chcę zrobić stałą

    żeby:
    stała = 10
    lda stała
    zasemblowało się na:

    lda #$0a <- tak bym chciał


    stała equ 10
    lda stała
    asembluje się na:
    lda$0a

    .var .byte stała = 10
    lda stała
    asembluje się np:

    lda$037f - czyli wskazuje miejsce w pamięci gdzie jest 10=$0a a mi po prostu jest stała niezbędna żeby nie tracić cykli i pamięci.

    może to być stała "wirtualna" której nie ma w pamięci a zapisuje się w kodzie programu


    trudny jest MADS jak dla mnie
    • 9:
       
      CommentAuthorjhusak
    • CommentTime2 Apr 2012 zmieniony
     
    Mads nie jest trudny, on ma ułatwienia co do zwykłego asma, np. te wbudowane makra:
    mva
    mwa
    adw
    add
    sbw
    sub

    Jednak dla początkującego te makra generują więcej złęgo, niż dobrego IMHO.

    Poza tym zachowuje się jak asembler, nie sprawdza typów wyrażeń.

    Jak będziesz używał jak zwykłego asma - nie będzie niespodzianek, a i asma się nauczysz lepiej i szybciej.

    Trochę chodzi o to, by te dodawania/odejmowania typu word mieć w małym paluszku.

    Na pocieszenie dodam, że ja też się mylę z tym # i nie # - nie widzę tego na pierwszy rzut oka.
    • 10: CommentAuthorBrix
    • CommentTime2 Apr 2012
     
    @at0mic:Możesz tak:

    lda #stala

    Poza tym jak na razie nie rozumiesz makr lub im nie ufasz, to nie musisz ich stosować (chyba że chodzi Ci o kłopoty ze zrozumieniem przykładów). Z czasem i tak zacznie Cię nudzić ciągłe pisanie lda - sta czy clc - adc ;)
    • 11: CommentAuthorat0mic
    • CommentTime2 Apr 2012 zmieniony
     
    @Brix ale jak #stała ?

    a stała niby jak ma być zadeklarowana ?

    nie rozumiem

    można sobie lda#10 albo lda#$0a napisać ale #stała daje błąd i się nie asembluje

    mi chodzi o definicje stałej żeby jej assebler używał przy adresowaniu natychmiastowym a nie bezpośrednim.

    ***ŻEBY LDA DAWAŁO KOD A9 A NIE AD***
    nie chcę też stałej mieć w pamięci tylko żeby assembler brał ją jako wirtualną wyłącznie do procesu asemblacji
    • 12: CommentAuthorajcek
    • CommentTime2 Apr 2012
     
    hej,

    stala equ 10

    lda #stala

    pewnie o to chodzi co ?
    • 13: CommentAuthorBrix
    • CommentTime2 Apr 2012
     
    No przecież daje A9... Nie wiem, może chodzi o polskie literki w nazwie?

    mads 1.9.2 build 21 (21 Jan 11)
    Source: tst.asm
    1
    2 = 000A stala = 10
    3
    4 opt h+
    5 org $2000
    6
    7 FFFF> 2000-2006> A5 0A lda stala
    8 2002 A9 0A lda #stala
    9
    10 2004 4C 04 20 goto jmp goto
    • 14: CommentAuthorat0mic
    • CommentTime2 Apr 2012
     
    dzięki Brix i dzięki ajcek

    problem jak zwykle leżał między oparciem mojego krzesła a monitorem komputera.

    niemądry byłem deklarując equ i wskazując że ma być .byte skoro i tak się to nie zapisuje w pamięci.

    pozdrawiam wszystkich serdecznie - ależ się umęczyć człowiek potrafi jak skompilować nie umie kodu - powoli robię się ćwierć-zaawansowany początkujący MADS ;)
    • 15: CommentAuthorbob_er
    • CommentTime2 Apr 2012
     
    ->link<- - tu na dole masz instrukcję do quick assemblera - w podstawowym (jak dla początkującego wystarczającym) zakresie. może wystarczy.
    mads jest z tym kompatybilny.
    • 16:
       
      CommentAuthormgr_inz_rafal
    • CommentTime2 Apr 2012 zmieniony
     

    Brix:

    Z czasem i tak zacznie Cię nudzić ciągłe pisanie lda - sta czy clc - adc ;)
    Racja. Mnie może jeszcze nie nudzi, ale już wkurza :) Zwłaszcza, jak zapomnę clc albo skorzystam z niego zamiast z sec przy odejmowaniu...

    Ale tak jak napisał jhusak odnośnie szkodliwości, nie korzystam na razie celowo z żadnych udogodnień oferowanych przez MADS. Po prostu inwestuję czas, żeby zrozumieć bebechy, bo to - moim zdaniem - niesie największą wartość dodaną. Takie podejście bywa frustrujące, ale daje satysfakcję większą niż napisanie programu na zasadzie: trochę copy&paste z jakiegoś przykładu, trochę przepisania na ślepo z Tajemnic Atari i... czasem działa, choć nie wiem dlaczego :)

    Życzę dużo cierpliwości!

    Również sobie :)

    PS. Naprawdę wiele godzin kiedyś szukałem tego pieprzonego clc przed sbc ;)
    • 17: CommentAuthorbob_er
    • CommentTime2 Apr 2012
     
    te wszystkie clc/sec i inne z czasem wejdą w krew.
    konieczność pisania lda/sta zamiast jakiegoś mov - również.
    trzeba tylko pisać, pisać i pisać.
    jeżeli wejdziesz na ścieżkę demową - będziesz dążył do tego, by każdy efekt sprowadzić do kombinacji rozkazów lda/ora/sta :).
    • 18: CommentAuthorBrix
    • CommentTime2 Apr 2012
     
    Tylko to już zaczyna być dyskusja o wyższości jednych świąt nad drugimi :)

    Makra (i inne rzeczy) to tylko narzędzie, ale dla ludzi którzy wiedzą co one dokładnie robią. Mniej pisania, pozwalają uprościć kod i uczynić go bardziej czytelnym. Inna sprawa, że przeczytawszy opasłą instrukcję MADSa rzeczywiście można kompletnie zgłupieć z nadmiaru wiedzy i mnogości konstrukcji (inna sprawa, że i dla mnie wciąż sporo (większość?) rzeczy to kompletna abstrakcja ;) ) Lecz na na początek naprawdę wystarczą absolutne podstawy (lda, sta, clc, dta, adresy, młodsze i starsze bajty itd.). A gdy się tych podstaw nie ma, moim zdaniem po prostu nie ma co się brać za naukę zaawansowanych funkcji MADSa, bo to tylko strata czasu i może spowodować więcej kłopotów niż korzyści.
    • 19: CommentAuthorxxl
    • CommentTime3 Apr 2012
     
    prawdziwego atarowca, wychowanego na disasemblerach pociagac moze jedynie surowe piekno czystego asemblera. makra odbieraja radosc czytania zrodel a pisanie z makrami jest jak chlipanie - goracy temat inaczej sie nie da zapisac ale czy to bedzie ladne?
    • 20: CommentAuthorat0mic
    • CommentTime3 Apr 2012 zmieniony
     
    no to zagadka dla starych wyjadaczy od początkującego w A8

    jak to działa że działa?
    (konieczne spojrzenie na piękno mnemoników w monitorze języka maszynowego - w moim emulatorze f8 ;)
    ;tester badlines/ atari ma je tak jak C64 ;)
    org $0600
    ;***************************
    ;*** ROZWIĄZANIE ZAGADKI ***
    ;***************************
    sei ;-< maskuj przerwania IRQ
    lda #0
    sta $d40e ;<- wyłącz przerwania NMI <-#0
    eor #6 ;<- A=6 Hi-adresu do którego będzie rts
    nop ;<- jest potrzebne aby Lo dla rts był właściwy
    pha ;<- Hi adresu odkładane na stos
    asl ;<- Lo tworzone w locie A=#$0c
    pha ;<- Lo na stos czyli mamy HiLo=$060c
    rts ;<- skok - o kurczę wygląda to na zapętlenie*
    sta$d40a ;<- czekaj na linię - 7 cykli
    sty$d01a ;<zmień kolor ramki na Y
    iny ; to nie jest najefektywniejszy sposób
    iny ; seria INY zwiększenia Y o 8 w każdym kroku
    iny ; tax ;<- to jest program alternatywny
    iny ; tya ;zamiast tych ośmiu INY
    iny ; clc ; clc mozna sobie darować
    iny ; adc#8 ; zajmuje 1 bajt mniej
    iny ; tay ; a jak wywalimy clc to nawet dwa bajty
    iny ; txa
    lsr ; z A=#$0c robimy A=#$06
    pha ; Hi=#$06 odkładamy na stos
    asl ; z A=#$06 robimy A=#$0c
    pha ; Lo=#$0c odkładamy na stos
    rts ; rts zdejmuje adresy ze stosu i skacze pod $060c

    ; nic nie byłoby w tym dziwnego gdyby nie fakt że pod adresem $060c jest instrukcja RTS

    *$060C rts: to jest haczyk który albo ktoś zna albo nie ;P
    nie będę go tłumaczył bo jest trywialny. Dla ułatwienia dodam że procesor wcale nie skacze do $060c.

    program pokazuje w których liniach Antic kradnie cykle na odczytanie przez DMA fontów które ma wyświetlić na ekranie
    (podwójne rasterlinie)

    testowałem tylko pod Atari800WinPlus - nie wiem czy zadziała dobrze na prawdziwym atari bo nie posiadam.

    jestem amatorem obsługi stosu w asm na x86 - może zostanę też na 6502 ;) jak poćwiczę

    ------------------------------
    dlaczego iny x8:
    PAL ma 624 linie -> z czego C64/Atari wyświetla obraz po 312 z uwagi na interlace.
    wiemy że standardowo jest 24 wiersz więc 24 badlines =
    312-24=288
    288 dzieli się na 16 więc trzeba teraz tak dodawać żeby zawsze się zaczynało od tego samego koloru ;) a dlaczego 8 a nie 16 - bo atari ma najpierw odcienie a potem kolory a bardziej widać różnice w odcieniach i dlatego jest 8xINY co daje dwa poziomy luminacji i 16 kolorów ;)
    • 21:
       
      CommentAuthorjhusak
    • CommentTime3 Apr 2012
     
    Naprawdę, znam prostsze pętle ;p
    • 22: CommentAuthor0xF
    • CommentTime3 Apr 2012 zmieniony
     
    Owszem i nie trzeba tu zaglądać do monitora. Znacznie ciekawszą sztuczkę stosuje Fun With Art - każdą procedurę DLI kończy JSR. Procedura zdejmuje ze stosu adres powrotu, po zwiększeniu wstawia go w wektor przerwania i wraca z przerwania. Procedura następnego przerwania jest od razu po JSR.
    • 23: CommentAuthorxxl
    • CommentTime3 Apr 2012
     
    @Fox, ciekawe :-)
    gdyby rozpisac koń.kurs na ciekawe uzycie stosu - z przyjemnoscia wzialbym w nim udzial.
    • 24: CommentAuthor0xF
    • CommentTime3 Apr 2012
     
    W temacie stosu popatrzcie na DL w wektorach w Drunk Chessboard oraz pamięć ekranu w Professional Copy 2.x. ;)
    • 25:
       
      CommentAuthorjhusak
    • CommentTime3 Apr 2012 zmieniony
     
    W atalanie i amaurote funkcja wypisująca tekst jest w ten sposób zaimplementowana, że bezpośrednio za wywołaniem JSR PRINT jest lista: tekst i ew. parametry. WW lista jest obsługiwana w procedurze wypisującej, a następnie podmieniany wektor powrotu na "za parametrami" i rts.
    • 26: CommentAuthorbob_er
    • CommentTime3 Apr 2012
     
    o ile dobrze kojarzę symbol PRINTF ze sparty x analogicznie działa.
    • 27: CommentAuthor0xF
    • CommentTime4 Apr 2012
     
    Dobrze kojarzysz.
    • 28: CommentAuthorxxl
    • CommentTime4 Apr 2012
     
    w grze hobgoblin tak drukowane sa wszelkie teksty
    • 29: CommentAuthorat0mic
    • CommentTime5 Apr 2012 zmieniony
     
    kojące nerwy ...
    ;Mad AtariXL/XE Syntax
    org $08ff

    sei
    lda#$00
    sta$d40e
    eor#$9
    pha
    pha
    rts
    ldy#$00
    vcy cpy$d40b
    bne vcy
    tu lda$1000,y
    sta$d40a
    sta$d01a
    sta$d018
    iny
    bne tu
    lda#$09
    pha
    pha
    rts


    org $1000
    dta b($0,$0,$2,$0,$2,$2,$4,$2,$4,$4,$6,$4,$6,$6,$8,$6,$8,$8,$a,8,$a,$a,$c,$a,$c,$c,$e,$c,$e,$e)
    dta b($c,$e,$c,$c,$a,$c,$a,$a,$8,$a,$8,$8,$6,$8,$6,$6,$4,$6,$4,$4,$2,$4,$2,$2,$0,$2)
    dta b($0,$0,$02,$10,$12,$12,$14,$22,$24,$24,$36,$34,$36,$46,$48,$46,$58,$58,$5a,$68,$6a,$6a,$7c,$7a,$7c,$8c,$8e,$8c,$9e,$9e)
    dta b($9c,$ae,$ac,$ac,$ba,$bc,$ba,$ca,$c8,$ca,$d8,$d8,$d6,$e8,$e6,$e6,$f4,$f6,$f4,$f4,$f2,$f4,$f2,$f2,$f0,$f2)
    dta b($c0,$c0,$c2,$c0,$c2,$c2,$d4,$d2,$d4,$d4,$e6,$e4,$e6,$e6,$f8,$f6,$f8,$f8,$1a,$18,$1a,$1a,$2c,$2a,$2c,$2c,$3e,$3c,$3e,$3e)
    dta b($4c,$4e,$4c,$4c,$5a,$5c,$5a,$5a,$68,$6a,$68,$68,$76,$78,$76,$76,$84,$86,$84,$84,$92,$94,$92,$92,$90,$02)
    dta b($10,$10,$12,$10,$12,$12,$24,$22,$24,$24,$26,$24,$36,$36,$38,$36,$38,$38,$1a,$18,$1a,$1a,$fc,$fa,$fc,$fc,$1e,$1c,$1e,$1e)
    dta b($1c,$1e,$1c,$1c,$2a,$2c,$2a,$2a,$28,$2a,$38,$38,$36,$48,$46,$56,$54,$56,$54,$54,$52,$54,$52,$52,$50,$52)
    dta b($0,$0,$2,$0,$2,$2,$4,$2,$4,$4,$6,$4,$6,$6,$8,$6,$8,$8,$a,8,$a,$a,$c,$a,$c,$c,$e,$c,$e,$e)
    dta b($c,$e,$c,$c,$a,$c,$a,$a,$8,$a,$8,$8,$6,$8,$6,$6,$4,$6,$4,$4,$2,$4,$2,$2,$0,$2)


    • 30:
       
      CommentAuthorMaW
    • CommentTime5 Apr 2012 zmieniony
     
    słuchajcie, jak ominąć te podwójne linie tęczy (w których ANTIC tworzy znaki) by nie tracić całej zawartości linii ?

    //EDIT: żeby nie robić offtopu pytanie przeniosłem tutaj: ->link<-
    • 31:
       
      CommentAuthorjhusak
    • CommentTime6 Apr 2012 zmieniony
     
    Antic właśnie je "omija":)

    A tak na poważnie - są triki, ale to jest w stylu raz pobierz a wyświetlaj wiele razy, co oznacza te same znaki w każdej linii tekstu. Trzeba zmieniać wówczas generator znaków co linię.

    Albo tryb graficzny :)
    • 32:
       
      CommentAuthormgr_inz_rafal
    • CommentTime2 May 2012 zmieniony
     
    Dziś wieczorem prezentuję kolejne pytanie... Tym razem kolizje :)

    No właśnie - niby wszystko działa jak należy, ale czasem mi się gruczoł mija z czaszką, tzn. dwa playery się zderzają - dość wyraźnie - lecz nie robi to wrażenia na komórce 0xD00C.

    Tak w kilku procentach przypadków nie workuje jak powinno.

    I teraz, zanim zacznę grzebać w gó..., tzn. w moim kodzie, chciałbym zapytać, czy gdzieś w sprzętowych kolizjach tkwi jakiś haczyk? Czytając różne posty na różnych portalach odnoszę ogólne wrażenie, że chyba nie jest to najbardziej właściwa metoda działania programisty gier :)

    I od razu prośba o wskazanie, który rozdział w której książce dobrze omawia temat.

    =====================================
    EDIT: Dobra, wiem! :) Przecież czaszka to dwa playery, a sprawdzam kolizję tylko z jednym...


    Ale podtrzymuję prośbę odnośnie książki :)
    =====================================
    • 33:
       
      CommentAuthorjhusak
    • CommentTime3 May 2012
     
    zasada jest bardzo prosta.
    kolizje są wykrywane PODCZAS generowania ekranu i na bieżąco są ustawiane odpowiednie bity kolizji
    Pomiędzy ekranami (VBLANK) należy sczytać bity kolizji a następnie je zresetować przez wpisanie dowolnej wartości do HITCLR.

    Zamiast VBLANK można użyć aktywnego czekania na określoną linię przy użyciu VCOUNT (a'la A2600).

    Z racji długiego przedziału czasu ustawiania bitów takie kolizje trudniej badać np. w BASIC.
  1.  
    Dzięki - na razie zaczęło mi wszystko śmigać gdy poprawiłem sprawdzanie kolizji z odpowiednimi playerami.

    Jednakże widzę, że poruszam się w temacie animacji trochę po omacku... Gdzieś sobie wpisuję coś do HITCLR (i wcale nie wiem, czy to jest pomiędzy ekranami), gdzieś indziej czekam na wartość #$80 w $d40b, żeby rysować od nowa (#$80 wyszło mi metodą prób i błędów).

    Ogólnie - świetna zabawa! :) Basic zaczyna wydawać się taki skomplikowany :)
    • 35:
       
      CommentAuthorjhusak
    • CommentTime3 May 2012 zmieniony
     
    $80 to dość dobra wartość, bo vcount liczy:
    For an NTSC machine, VCOUNT counts from $00 to $82; for PAL, it counts to $9B.


    Ważne tylko, żeby poniżej tej linii nie było kolizji :) bo będzie źle działać.

    Doskonała większość gier synchronizuje się z vblank, czy to w przerwaniu, czy to w pętli. I tego się należy trzymać, w p. p. mogą być problemy z widzeniem dwóch klatek animacji na raz, migotaniem bohaterów, złym wykrywaniem kolizji, niedziałającym efektom DL, itepe, itede.

    Polecam Altirra Hardware Reference Manual, jednak po angielsku.
    Ale wszystko niemal tam jest opisane bez lania wody.
    • 36:
       
      CommentAuthormgr_inz_rafal
    • CommentTime11 May 2012 zmieniony
     
    Mam jeszcze prośbę o wyjaśnienie poniższego zachowania dotyczącego procedur w MADS.

    Posiadam w kodzie tablicę z napisem:
    .array	katamaran .byte
    [0] = 16
    [1] = "KATAMARAN"
    [10] = 0
    .enda

    [0] to offset na ekranie, potem tekst, a [10] oznacza koniec stringa.

    Piszę sobie prockę do wypisywania tego tekstu. Wywołuję ją tak:
    write katamaran


    A tak wygląda procedura (bez ciałka):
    .proc	write(.word what) .var
    .var what .word
    ------ tutaj jakis kod ------
    rts
    .endp

    Moja procka nie działa tak jak powinna (inaczej bym nie pytał), a problem tkwi w tym, że o ile
    >what = >katamaran
    to już
    <what != <katamaran

    Kto podpowie co przeoczyłem w temacie przekazywania parametrów typu .word?

    Dodam jeszcze, że jeśli w kodzie procedury zamienię "what" bezpośrednio na "katamaran" to działa dobrze, dlatego też nie zamieszczam ciała procki, bo na razie go nie podejrzewam.
    • 37:
       
      CommentAuthorjhusak
    • CommentTime11 May 2012
     
    Jak nie wiesz, jak coś działa, to zdisasembluj to :)
    Odpowiedź masz od razu!
    • 38:
       
      CommentAuthormgr_inz_rafal
    • CommentTime11 May 2012 zmieniony
     
    No niby mógłbym tak zrobić, ale nie lubię iść na łatwiznę :>

    _________
    Edit: OK, mam :)
    Przeniesienie "what" na stronę zerową i adresowanie indirect rozwiązało problem.

    Ale zaraz chyba będę miał jeszcze jedno pytanko... :)

    PS. Nauczka - nie stosować proc jak się nie wie jak działają :) Może zmienię MADS na QA :)
    • 39:
       
      CommentAuthorjhusak
    • CommentTime11 May 2012
     
    Eee, tam, łatwiznę; to jest bardzo trudne i nie lada wyzwanie :)
    • 40:
       
      CommentAuthormgr_inz_rafal
    • CommentTime7 Mar 2013 zmieniony
     
    Jak można najprościej wyzerować lub ustawić konkretny bit akumulatora, nie ruszając innych?

    Oraz jak "odwrócić" konkretny bit, również nie ruszając innych?
    • 41: CommentAuthorxxl
    • CommentTime7 Mar 2013 zmieniony
     
    zmienic stan np. bitu0 w akumulatorze:
    eor #%00000001
    zapalic bit1 w akumulatorze:
    ora #%00000010
    zgasic bit2 w akumulatorze:
    and #%11111011
    • 42: CommentAuthorwieczor
    • CommentTime7 Mar 2013
     
    Ustawianie : ORA #%00010000 - zapali bit 4
    Kasowanie : AND #%11101111 - skasuje bit 4
    • 43: CommentAuthorMADRAFi
    • CommentTime3 Apr 2019
     
    podepne sie pod watek z assemblerem

    probuje wczytac i ustawic wlasny font i potem wypisac cos na ekranie.
    Pytanie, dlaczego nie widac uzycia nowego fontu?

    Ten samm problem mam gdy wylacze OS i musze uzyc fontu by moc cos napisac :)

    CHARSET_ADDRESS equ $D800; 
    org CHARSET_ADDRESS
    ins '../assets/Nvdi8.fnt'

    org $0580

    dlist
    .byte DL_BLANK8, DL_BLANK8, DL_BLANK8
    .byte DL_MODE_40x24T2 + DL_LMS, a(vmem)
    .byte DL_JVB, a(dlist)

    vmem
    .byte " LOADING... "
    main
    mva .hi(CHARSET_ADDRESS) chbas
    mva #28 colpf1s
    mva #0 colpf0s
    mva #0 colpf2s
    mva #0 colpf3s
    mva #0 colbaks
    mwa #dlist sdlstl

    run main
    • 44: CommentAuthormono
    • CommentTime3 Apr 2019
     
    Nie jesten pewny, ale chyba powinieneś użyć:
    #.hi(CHARSET_ADDRESS)

    bo samo .hi zwraca tylko MSB - bez # wskazuje komórkę pamięci a nie wartość.
    • 45: CommentAuthorgorgh
    • CommentTime3 Apr 2019
     
    ta dzisiejsza młodzież niewychowana na Quick Assemblerze używa jakichś sztuczek
    • 46: CommentAuthorMADRAFi
    • CommentTime3 Apr 2019
     
    Zeby nie bylo, probowalem:

    mva .hi(CHARSET_ADDRESS) chbas
    mva >CHARSET_ADDRESS chbas
    mva #>CHARSET_ADDRESS chbas
    • 47: CommentAuthorMADRAFi
    • CommentTime3 Apr 2019 zmieniony
     
    screen
    • 48: CommentAuthorxxl
    • CommentTime3 Apr 2019 zmieniony
     
    jak piszesz, ze masz ten sam problem gdy masz wylaczony OS to juz widze oczami wyobrazni ze nie dziala NMI a to na tym przerwaniu jest przenoszona wartosc z chbas do rejestru sprzetowego.

    ---
    jedna linia DL i 1kb fontow pod napis na czas ladowania? moj kalkulator mowi ze nie. 40x8 = 320 bajtow + 8 bajtow na DL vs 1024 bajty dla fontow
    • 49: CommentAuthorMADRAFi
    • CommentTime3 Apr 2019 zmieniony
     
    Dzieki XXL
    Czyli musze najpierw wlaczyc nmi, a potem wylaczyc :)

    Albo wylaczyc w laoderze OS i uzywac tylko sprzetowych rekestrow, tak?
    • 50: CommentAuthorxxl
    • CommentTime3 Apr 2019
     
    zapisz jednoczesnie do cienia i sprzetowego na poczatek wystarczy