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 14:03 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 14:03
       
      z maluchami (xl/xe) jest jeszcze ten problem, że wiele z nich zostało zdekompletowanych (stereo).
      • 3:
         
        CommentAuthorKaz
      • CommentTime30 Mar 2012 15:03 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 15:03
       
      > 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 15:03 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 16:03
       
      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 12:03 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 13:04 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 14:04 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 14:04
       
      @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 15:04 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 16:04
       
      hej,

      stala equ 10

      lda #stala

      pewnie o to chodzi co ?
      • 13: CommentAuthorBrix
      • CommentTime2 Apr 2012 16:04
       
      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 18:04
       
      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 20:04
       
      ->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.
    1.  

      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 22:04
       
      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 23:04
       
      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 09:04
       
      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 15:04 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 16:04
       
      Naprawdę, znam prostsze pętle ;p
      • 22: CommentAuthor0xF
      • CommentTime3 Apr 2012 16:04 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 16:04
       
      @Fox, ciekawe :-)
      gdyby rozpisac koń.kurs na ciekawe uzycie stosu - z przyjemnoscia wzialbym w nim udzial.
      • 24: CommentAuthor0xF
      • CommentTime3 Apr 2012 17:04
       
      W temacie stosu popatrzcie na DL w wektorach w Drunk Chessboard oraz pamięć ekranu w Professional Copy 2.x. ;)
      • 25:
         
        CommentAuthorjhusak
      • CommentTime3 Apr 2012 18:04 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 19:04
       
      o ile dobrze kojarzę symbol PRINTF ze sparty x analogicznie działa.
      • 27: CommentAuthor0xF
      • CommentTime4 Apr 2012 09:04
       
      Dobrze kojarzysz.
      • 28: CommentAuthorxxl
      • CommentTime4 Apr 2012 14:04
       
      w grze hobgoblin tak drukowane sa wszelkie teksty
      • 29: CommentAuthorat0mic
      • CommentTime5 Apr 2012 13:04 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 22:04 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 00:04 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 :)
    2.  
      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 08:05
       
      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.
    3.  
      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 20:05 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.
    4.  
      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 18:05
       
      Jak nie wiesz, jak coś działa, to zdisasembluj to :)
      Odpowiedź masz od razu!
    5.  
      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 20:05
       
      Eee, tam, łatwiznę; to jest bardzo trudne i nie lada wyzwanie :)
    6.  
      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 11:03 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 11:03
       
      Ustawianie : ORA #%00010000 - zapali bit 4
      Kasowanie : AND #%11101111 - skasuje bit 4
      • 43: CommentAuthorMADRAFi
      • CommentTime3 Apr 2019 12:04
       
      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 12:04
       
      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 12:04
       
      ta dzisiejsza młodzież niewychowana na Quick Assemblerze używa jakichś sztuczek
      • 46: CommentAuthorMADRAFi
      • CommentTime3 Apr 2019 12:04
       
      Zeby nie bylo, probowalem:

      mva .hi(CHARSET_ADDRESS) chbas
      mva >CHARSET_ADDRESS chbas
      mva #>CHARSET_ADDRESS chbas
      • 47: CommentAuthorMADRAFi
      • CommentTime3 Apr 2019 12:04 zmieniony
       
      screen
      • 48: CommentAuthorxxl
      • CommentTime3 Apr 2019 12:04 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 12:04 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 12:04
       
      zapisz jednoczesnie do cienia i sprzetowego na poczatek wystarczy