atarionline.pl Warsztaty Action! - robimy action games;) - 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:
         
        CommentAuthortdc
      • CommentTime26 Apr 2020 02:04
       
      Ma to jakiś sens. Ale z drugiej strony Action! właśnie zapewnia wstawianie asm wszędzie, więc niby skąd to? po co to?
      • 2: CommentAuthorzbyti
      • CommentTime26 Apr 2020 10:04 zmieniony
       
      @tdc jak na gościa który oszczędza na nazwach zmiennych i słowie kluczowym RETURN powinieneś dostrzegać zalety takiego zapisu.

      Ja dostrzegam jeszcze parę zalet ale to już polecam każdemu do samodzielnego odkrycia ;)
      • 3:
         
        CommentAuthorPeri Noid
      • CommentTime26 Apr 2020 11:04
       
      Dzięki @zbyti. No i widać po co ta gwiazdka.

      Po kolei. W zwykłym przypadku, jak parametrów jest więcej, to jest na nie rezerwowana pamieć (te BRK które się pojawiają ciągiem). I ta pamięć jest w treści funkcji używana do obliczeń i operacji. Dodatkowo, skok do procedury jest wykonywany "z przeskokiem" o te wartości i na jej faktycznym początku jest wykonywany protokół zapewne kopiujący parametry w odpowiednie zarezerwowane miejsca (kluczem jest to co jest zapisane pod adresem $1803).

      Jeśli natomiast użyjemy =*, ta pamięć na parametry nie jest rezerwowana. Ale jeśli treść procedury jest zwykłą procedurą, to jej treść się kaszani przy kompilacji (widać, że zamiast A, B i C używana jest dokładnie ta sama lokacja i to się nie wykona poprawnie). Nie ma też tutaj wywołania kodu spod adresu $1803, czyli taka procedura nie przestrzega standardowego protokołu wywołania funkcji dla większej liczby parametrów. Dlatego ma to sens wyłącznie wtedy, gdy w procedurze jest maszynówka, która sama zarządza parametrami - i wcale nie jest tak, że pierwszy bajt jest na A, drugi na X, a reszta... gdzieś (znów kluczem jest to co siedzi pod adresem $1803).
      • 4: CommentAuthorzbyti
      • CommentTime26 Apr 2020 11:04 zmieniony
       

      Peri Noid:

      wcale nie jest tak, że pierwszy bajt jest na A, drugi na X, a reszta... gdzieś (znów kluczem jest to co siedzi pod adresem $1803

      Możesz wyjaśnić skąd taki wniosek? Piszesz o =*?

      Pierwszy parametr jeżeli jest BYTE to ląduje w A, jeżeli CARD to w A,X.

      Jeżeli pierwszy był CARD to drugi parametr funkcji BYTE wyląduje w Y. Kolejne parametry zajmują zarezerwowane na stronie zerowej $A3 i w górę.

      -------------------------------

      Mi się spodobała ta zabawa i procedury czy funkcje które u mnie wylądują w "bibliotece" (a nie są zbyt zawiłe) przepiszę sobie na ML.

      Dla przykładu napisałem sobie WAIT:
      SET $E=$2000
      SET $491=$2000

      PROC WAIT=*(BYTE FRAMES)[$A2$0$86$14$C5$14$D0$FC$60]

      PROC MAIN()
      WAIT(100)
      RETURN

      ;----------------------------------

      2000: A2 00 LDX #$00
      2002: 86 14 STX $14 ;RTCLOK+2
      2004: C5 14 CMP $14 ;RTCLOK+2
      2006: D0 FC BNE $2004
      2008: 60 RTS
      2009: 4C 0C 20 JMP $200C
      200C: A9 64 LDA #$64
      200E: 20 00 20 JSR $2000
      2011: 60 RTS
      2012: 60 RTS

      Dla porównania (sama procedura, bez MAIN)to co było do tej pory:

      BYTE RTCLOCK=$14

      PROC WAIT(BYTE FRAMES)
      FRAMES==+RTCLOCK
      WHILE FRAMES<>RTCLOCK DO OD
      RETURN

      ;----------------------------------

      20CE: 00 BRK
      20CF: 4C D2 20 JMP $20D2
      20D2: 8D CE 20 STA $20CE
      20D5: 18 CLC
      20D6: AD CE 20 LDA $20CE
      20D9: 65 14 ADC $14 ;RTCLOK+2
      20DB: 8D CE 20 STA $20CE
      20DE: AD CE 20 LDA $20CE
      20E1: 45 14 EOR $14 ;RTCLOK+2
      20E3: D0 03 BNE $20E8
      20E5: 4C EB 20 JMP $20EB
      20E8: 4C DE 20 JMP $20DE
      20EB: 60 RTS

      • 5:
         
        CommentAuthorPeri Noid
      • CommentTime26 Apr 2020 12:04
       
      A pokaż co ląduje od adresu $1803. To się wyjaśni.
      • 6: CommentAuthorzbyti
      • CommentTime26 Apr 2020 12:04 zmieniony
       
      Raczej istotniejsze jest:
      2007: 20 29 9E  JSR $9E29

      po którym jest BRK. $1803 wygląda na jakieś wartości, które akurat tak się rozkodowały na mnemoniki.

      200E: AD 00 20  LDA $2000
      2011: 6D 01 20 ADC $2001
      2014: 85 AE STA $AE ;LELNUM+1
      2016: 18 CLC
      2017: AD 02 20 LDA $2002
      201A: 65 AE ADC $AE ;LELNUM+1
      201C: 8D 02 20 STA $2002
      201F: AD 03 20 LDA $2003
      2022: 69 00 ADC #$00
      2024: 8D 03 20 STA $2003
      2027: AD 03 20 LDA $2003
      202A: 85 A1 STA $A1 ;TSLNUM+1
      202C: AD 02 20 LDA $2002
      202F: 85 A0 STA $A0 ;TSLNUM
      2031: 60 RTS

      W powyższym magii nie ma.

      Zachęcam do samodzielnego zbadania, ja wracam do kodowania :]
      • 7: CommentAuthorVidol
      • CommentTime26 Apr 2020 12:04
       
      troche dlugi ten wait
      wait	lda 20
      cmp 20
      beq *-2
      rts
      • 8: CommentAuthorzbyti
      • CommentTime26 Apr 2020 12:04 zmieniony
       
      @Vidol a jaki sens ma porównywać RTCLOK+2 do siebie samego (jak w Twoim przykładzie) skoro chcę poczekać określoną ilość ramek?

      Jak wchodzę z ustawionym A to poniższe wydaje mi się optymalne:
      2000: A2 00     LDX #$00
      2002: 86 14 STX $14 ;RTCLOK+2
      2004: C5 14 CMP $14 ;RTCLOK+2
      2006: D0 FC BNE $2004
      2008: 60 RTS

      Może zastąpię LDX, STX --> CLC ADC $14 ale raczej nie ;)
      • 9:
         
        CommentAuthorPeri Noid
      • CommentTime26 Apr 2020 13:04
       
      Jakbym ogarniał desasemblację to bym sobie poradził. A nie ogarniam - dlatego prosiłem o pomoc. No nic.
      • 10: CommentAuthorzbyti
      • CommentTime26 Apr 2020 13:04 zmieniony
       
      @Peri Noid emulator Atari800 F8 wejście do monitora.

      m address
      d address

      enter - kontynuacja d lub m

      cont lub exit.
      • 11: CommentAuthormono
      • CommentTime26 Apr 2020 14:04 zmieniony
       
      Zapis RTCLOK nie jest dobrym pomysłem, bo sterowniki które zakładają, że ten zegar jest monotoniczny mogą z nich korzystać (np jakieś zegarki).
      Nie ma zresztą potrzeby tego robić do zwykłej synchronizacji z ramką, bo
      lda RTCLOK+2
      ?w cmp RTCLOK+2
      beq ?w

      jest wystarczające.
      Nawet jeśli trzeba odliczyć n ramek, to można to zrobić przez
      lda #n
      clc
      adc RTCLOK+2
      ?w cmp RTCLOK+2
      bne ?w

      czy w bardziej rozbudowanej wersji dla dłuższych niż 5s pauz
      lda #<n
      clc
      adc RTCLOK+2
      tay
      lda #>n
      adc RTCLOK+1
      tax
      lda #^n
      adc RTCLOK
      ?w cmp RTCLOK
      bne ?w
      cpx RTCLOK+1
      bne ?w
      cpy RTCLOK+2
      bne ?w


      Edit 1: 5s wzięło się stąd że 256 tiknięć / 50 ramek na sekundę = 5,120 s w PAL i SECAM (4,267 w NTSC bo tam mamy 60 tiknięć na sekundę).

      Edit 2: Do odliczenia max 65535 tiknięć można też użyć liczników systemowych TIMCNT1($218)..TIMCNT5($220).
      Są to rzadko używane rzeczy, ale w systemie są ciągle obsługiwane.

      TIMCNT1($218) i TIMCNT2($21A) pozwala po odliczeniu uruchomić procedurę której adres znajduje się odpowiednio w TIMVEC1($226) i TIMVEC2($228).
      TIMCNT1 jest używany przez OS podczas komunikacji z SIO do odliczania timeoutów.

      TIMCNT3($21C), TIMCNT4($21E) i TIMCNT5($220) z kolei tylko odliczają zadaną ilość ramek po czym sygnalizują ten fakt odpowiednio w TIMFLG3($22A), TIMFLG4($22C) i TIMFLG5($22E) wartością $00. Ale uwaga - ta wartość zostaje tam tylko przez jedną ramkę. Normalnie system umieszcza w tych zmiennych wartość $FF.

      Używając procedury systemowej JSETVBV ($E45C) numeracja tych liczników wygląda tak:
      1 - TIMCNT1
      2 - TIMCNT2
      3 - TIMCNT3
      4 - TIMCNT4
      5 - TIMCNT5
      a wektorów tak:
      8 - TIMVEC1
      9 - TIMVEC2
      więc można z tego skorzystać tak:
      ldy #<procedura
      ldx #>procedura
      lda #9 ;TIMVEC2
      jsr JSETVBV
      ldy #<n
      ldx #>n
      lda #2 ;TIMCNT2
      jsr JSETVBV
      ...
      procedura:
      ...
      rts

      albo:
      ldy #<n
      ldx #>n
      lda #5 ;TIMCNT5
      jsr JSETVBV
      ?w lda TIMFLG5
      bne ?w

      To wszystko jest zdaje się opisane przez Zientarę w "Poradniku programisty Atari".

      Edit 3: Jeszcze jedna uwaga: TIMCNT1 jest obsługiwany przez OS w natychmiastowej fazie VBLK więc niestraszne mu ustawienie flagi CRITIC (podczas operacji I/O) ani SEI. Za to TIMCNT2..TIMCNT5 są obsługiwane w opóźnionej fazie a więc nie będą liczyć jeśli ustawiono CRITIC ($42) lub wykonano SEI.
      • 12: CommentAuthorzbyti
      • CommentTime26 Apr 2020 15:04 zmieniony
       
      @mono dzięki za tak szczegółowe wyjaśnienie!

      W takim razie przejdę na clc/adc by nie tykać RTCLOK bo ~5s mi wystarczy, będzie to też bliższe mojej pierwotnej implementacji w Action!

      Obyś miał czas i chęci robić więcej takich wpisów! :]

      PROC WAIT=*(BYTE F)[$18$65$14$C5$14$D0$FC$60]

      PROC MAIN()
      WAIT(100)
      RETURN

      ;--------------------------------

      2000: 18 CLC
      2001: 65 14 ADC $14 ;RTCLOK+2
      2003: C5 14 CMP $14 ;RTCLOK+2
      2005: D0 FC BNE $2003
      2007: 60 RTS
      2008: 4C 0B 20 JMP $200B
      200B: A9 64 LDA #$64
      200D: 20 00 20 JSR $2000
      2010: 60 RTS
      2011: 60 RTS

      EDIT: @mono zobacz WAIT ->link<- tak ludzi uczyli ;)
      • 13: CommentAuthorzbyti
      • CommentTime26 Apr 2020 15:04 zmieniony
       
      MEMO: @mono podzielił się ze mną wczoraj ideą zrobienia multiplikacji duszków.

      Jak okrzepnę, to spróbuję to zrobić w Action! A teraz zostawiam to info na "zaś" ;)

      mono:

      Multiplikacja sprajtow w rastrze. IDEA.

      Pozycja sprajta jest w HPOSPx i HPOSMx zapisujesz ten rejestr po prostu, a pooniewaz ANTIC pobiera dane sprajtow na poczatku linii (poza ekranem) to ten sam ksztalt w ten sposob duplikujesz w dwoch miejscach.

      Jak zapiszesz dodatkowo GRAFPx lub GRAFM to zmienisz tez ksztalt a jak zmienisz COLPMx to zmienisz tez kolor, oczywiscie przed poczatkiem nastepnej linii skanningowej trzeba z powrotem przywrocic HPOSPx/Mx i COLPMx (GRAFPx i GRAFM zostana nadpisane przez ANTIC-a automatycznie wiec o przywracanie ksztaltu sie nie musisz martwic.

      Tutaj interesujący materiał o sprajtach na różnych platformach ->link<-
      • 14:
         
        CommentAuthorPeri Noid
      • CommentTime26 Apr 2020 16:04
       
      @zbyti: Dzięki, już wszystko jasne. I to co robi to =* też.
      • 15: CommentAuthorzbyti
      • CommentTime26 Apr 2020 16:04 zmieniony
       
      SET $E=$2000
      SET $491=$2000

      PROC WAIT=*(BYTE F)[$18$65$14$C5$14$D0$FC$60]

      PROC MAIN()
      WAIT(100)
      RETURN

      z =*
      2000: 18        CLC
      2001: 65 14 ADC $14 ;RTCLOK+2
      2003: C5 14 CMP $14 ;RTCLOK+2
      2005: D0 FC BNE $2003
      2007: 60 RTS
      2008: 4C 0B 20 JMP $200B
      200B: A9 64 LDA #$64
      200D: 20 00 20 JSR $2000
      2010: 60 RTS
      2011: 60 RTS

      bez
      2000: 00        BRK
      2001: 4C 04 20 JMP $2004
      2004: 8D 00 20 STA $2000
      2007: 18 CLC
      2008: 65 14 ADC $14 ;RTCLOK+2
      200A: C5 14 CMP $14 ;RTCLOK+2
      200C: D0 FC BNE $200A
      200E: 60 RTS
      200F: 4C 12 20 JMP $2012
      2012: A9 64 LDA #$64
      2014: 20 01 20 JSR $2001
      2017: 60 RTS
      2018: 60 RTS

      Rożni się przekazywaniem zmiennych z parametrów itd. gwiazdka jest oszczędniejsza ale często musimy sami zadbać o "miejsce" dla danych.

      W powyższym przykładzie bez =* mamy wolniejszy kod, zbędny JMP, STA oraz zbędną komórkę na dane pod $2000.

      • 16:
         
        CommentAuthortdc
      • CommentTime26 Apr 2020 23:04 zmieniony
       
      Mamy kolejnego ATRa:

      Dziś między innymi wyświetliliśmy 6 duszków w linii rastra ;))
      • 17: CommentAuthorzbyti
      • CommentTime27 Apr 2020 02:04 zmieniony
       
      UWAGA!

      Action! 3.7P by JAC! na karcie ma taką implementację OPEN:

      PROC Open=*(BYTE d CARD s BYTE m, a)
      [$86$A1$20 _LODCHN $A5$A1$20
      _STONAM $A5$A3$9D$4A$03$A5$A4$9D$4B
      $03$A9$03$9D$42$03$20 _GOCIO $8A$4A
      $4A$4A$4A$AA$A9$00$9D$C0$05$60]

      Procedura jaką używa @tdc do wgrywania assetów bazuje na oryginalnym kodzie OPEN i wygląda tak:

      PROC Open=*(BYTE d,BYTE ARRAY f,BYTE m,a2)
      [$48$A186$A284$A8$A9$0$99 EOF$A8$A1B1$8D OpenBuf $A8$C8$9BA9$2D0$A1B1$99 OpenBuf $88$F8D0
      $68$A2 OpenBufL $A0 OpenBufH $20Opn$4C ChkErr]

      Nie mam pojęcia dlaczego zmieniła się implementacja i jest to jedyna różnica sprawiająca, że kod @tdc nie działa na wspomnianych wersjach oprogramowania.

      Może obadam co z tym zrobić, albo zapytam autora tej zmiany na AA o jej powód, w końcu zerwał kompatybilność bez zrozumiałej dla mnie przyczyny.

      ->link<-

      EDIT: implementacja inna ale działanie prawidłowe.
      • 18: CommentAuthorzbyti
      • CommentTime27 Apr 2020 09:04 zmieniony
       
      Problem nie jest w nazwie pliku, CARD s zadziała tak jak BYTE ARRAY f.

      channel, mode, aux2 niby w tych samych miejscach w procedurze...

      Zaciekawiło mnie to... ;)

      EDIT: z nowym OPEN chyba nie działają:
      POKEC($364,G) POKEC($368,I)

      Jeszcze nie znalazłem na sieci co siedzi pod tymi adresami, ale na chłopski rozum początek bufora, którego nowy OPEN CHYBA nie obsługuje.
      • 19:
         
        CommentAuthorKaz
      • CommentTime27 Apr 2020 10:04
       

      Zbyti:

      Może obadam co z tym zrobić, albo zapytam autora tej zmiany na AA o jej powód,


      Bardzo dobry pomysł. Wnikanie w szczegóły przynosi fajne efekty.
      • 20: CommentAuthorzbyti
      • CommentTime27 Apr 2020 13:04 zmieniony
       
      Ok, zbadałem w czym problem.

      CHAR ARRAY TX="D:VIRUS.FNT"

      PROC MAIN()
      CLOSE(2)
      OPEN(2,TX,4,128)
      POKE($362,7)
      POKEC($364,$4000) POKEC($368,$400)
      [162 32 32 $56 $E4 133 $A3]
      CLOSE(2)
      RETURN

      Powyższy kod działa na Action! 3.7P by JAC!

      Wczytuje fonty pod $4000. Więc problem jest tylko i wyłącznie w innej mapie pamięci 3.7P by JAC!

      Sprawdzę to...

      EDIT: tak przy karci 3.7P by JAC! inna jest mapa pamięci, po zamianie adresów na "wolne" wszystko śmiga.

      • 21: CommentAuthorzbyti
      • CommentTime27 Apr 2020 15:04 zmieniony
       
      To tak dla wygody kursantów wrzucam "wyjęty" kod wyświetlający tło.

      SET $E=$2000
      SET $491=$2000

      CARD SDLSTL=$230

      BYTE ARRAY
      P=0,
      DL=[$70 $44 0 $40
      4 4 4 4 4 4 4 4 4 4 4 4 4 4
      4 4 4 4 4 4 4 4 4 4 4 4 4 4
      $41 0 0]

      ;M=4 LOAD, M=8 SAVE
      PROC LOAD(CARD FILE,SADDR,NBYTES, BYTE M)
      CLOSE(2) OPEN(2,FILE,M,128)
      IF M=4 THEN POKE($362,7)
      ELSE POKE($362,11) FI
      POKEC($364,SADDR) POKEC($368,NBYTES)
      [162 32 32 $56 $E4 133 $A3] CLOSE(2)
      RETURN

      PROC MAIN()
      CHAR ARRAY
      FILE1="H1:VIRUS.SCR",
      FILE2="H1:VIRUS.FNT"

      P(712)=0
      P(708)=$20
      P(709)=$14;$16
      P(710)=$F8;$FA
      P(711)=$1F

      LOAD(FILE1,$4000,$460,4)
      LOAD(FILE2,$5000,$400,4)

      P(756)=$50

      SDLSTL=DL
      RETURN
      • 22: CommentAuthorzbyti
      • CommentTime27 Apr 2020 19:04 zmieniony
       
      action.sublime-build
      {
      "shell_cmd": "xfce4-terminal -x atari800 -cart /home/zbyti/Retro/Atari/tools/Action/car/ACTION-37-ROM-Plain-16k.car -turbo -playback /home/zbyti/Retro/Atari/action-compile; atari800 -cart /home/zbyti/Retro/Atari/tools/Action/car/ACTION-37-ROM-Plain-16k.car /home/zbyti/Atari8HDD/MAIN.OBJ",
      "selector": "source.action"
      }

      .bash_aliases
      alias action="atari800 -cart /home/zbyti/Retro/Atari/tools/Action/car/ACTION-37-ROM-Plain-16k.car"
      alias action-compile="action -turbo -playback /home/zbyti/Retro/Atari/action-compile >> /dev/null; action /home/zbyti/Atari8HDD/MAIN.OBJ"

      atari800
      -record <filename>    Record input to <filename>
      -playback <filename> Playback input from <filename>

      Można zobaczyć jak powyższe działa w praktyce - film w załączniku.
    1.  
      @zbyti - o fajnie, patrzę na ten `build-action` i w połączeniu z `podpowiedziami kodu` i `snippetami` i `kolorowaniem` mamy praktycznie kompletny plugin `Action!` do SublimeText :)
      • 24:
         
        CommentAuthorKaz
      • CommentTime27 Apr 2020 19:04
       
      Dzisiaj za niecały kwadrans już 10 odcinek kursu. Łacznie było więc 27h.
      • 25: CommentAuthorgebi
      • CommentTime27 Apr 2020 20:04
       
      Hmm. TDC miał rację, że PC-ty mają kiepska architekturę. Właśnie zdalnie zablokowali mi uruchamianie Zoom-a na firmowym laptopie, więc nie będzie mnie na dzisiejszej lekcji...
      • 26:
         
        CommentAuthorKaz
      • CommentTime27 Apr 2020 21:04
       
      Ale w końcu się pojawiłeś! :D

      A przy okazji filmik Zbytiego:

      • 27: CommentAuthorzbyti
      • CommentTime27 Apr 2020 23:04 zmieniony
       
      Pomysłodawcą toolchaina Action! jest @jhusak. Nie mogłem dziś sobie przypomnieć gdzie czytałem o jego idei więc zrobiłem wedle swojego uznania (a trudno to zrobić inaczej).

      Dopiero teraz znalazłem watek z oryginalnym pomysłem z 2014, więc zamieszczam ->link<- :)
      • 28:
         
        CommentAuthortdc
      • CommentTime27 Apr 2020 23:04 zmieniony
       
      • 29: CommentAuthorzbyti
      • CommentTime28 Apr 2020 01:04 zmieniony
       
      Po testach stwierdzam, że do developmentu pod Sublime 3 to bardziej nadaje się wariant z "save state" zrzucony tak by po ENTER kompilować już pisaną nazwę pliku, czyli w monitorze czeka na nas gotowy do zatwierdzeni wpis:

      C "H6:MAIN.ACT"

      Zapewnia to dostęp do monitora emulator pod klawiszem F8, możliwość odczytania błędów kompilacji, nie ma też problemu z OBJ wczytującym zasoby z H: procedurą @tdc.

      action.sublime-build
      {
      "shell_cmd": "xfce4-terminal -x atari800 -cart /home/zbyti/Retro/Atari/tools/Action/car/ACTION-37-ROM-Plain-16k.car -state /home/zbyti/Retro/Atari/action-compile.a8",
      "selector": "source.action"
      }
      • 30: CommentAuthorzbyti
      • CommentTime28 Apr 2020 02:04 zmieniony
       
      Przepisane z kursu pana Zientary zamieszczonego w Bajtku.



      SET $E=$2000
      SET $491=$2000

      BYTE
      WSYNC=$D40A,
      VCOUNT=$D40B,
      COLPF2=$D018

      PROC MAIN()
      BYTE
      CHGCLR=[0],
      CLR,INCCLR

      GRAPHICS(0)

      PUTE()
      FOR CLR=1 TO 23 DO
      PRINTE("ZMIANA KOLOROW TLA")
      OD
      PRINT("ZMIANA KOLOROW TLA ")

      DO
      FOR CLR=1 TO 4 DO
      INCCLR=CHGCLR
      DO
      WSYNC=0
      COLPF2=INCCLR
      INCCLR==+1
      UNTIL VCOUNT&128
      OD
      OD
      CHGCLR==+1
      OD
      RETURN
      • 31: CommentAuthorzbyti
      • CommentTime28 Apr 2020 11:04 zmieniony
       
      Kod scrollujący tło VIRUS-a. Przy krótszym skoku, chcę go wykorzystać by "potrząsnąć" ekranem w momencie utraty "życia" ;)

      Wrzucam jako grafikę, bo zupełnie inaczej się go czyta z syntaxem Michała :]

      • 32:
         
        CommentAuthorPeri Noid
      • CommentTime28 Apr 2020 12:04
       
      Dzisiaj podpatrzone - może by tak podebrać kilka pomysłów? ;-)
      • 33: CommentAuthorzbyti
      • CommentTime28 Apr 2020 16:04 zmieniony
       
      Achtung!

      Wyjaśniła się zagadka dlaczego na Action! 3.7P program @tdc nie działał mi poprawnie i wyglądało, że grafika nie ładowała się pod wskazany adres.



      Symbol Table Space

      Action! 3.6 1983 ma domyślnie $495 ustawione na 8 czyli rezerwuje 8 stron pamięci.

      Action! 3.7P 2015 ma $495 ustawione domyślnie na 16 czyli rezerwuje (na nazwy zmiennych etc.) dwa razy więcej. Z powodu, że jest to rezerwowane od HIMEM "w doł" to miałem "konflikt".

      -----------------------

      Przy okazji, można sobie wartość $495 ustawić za pomocą SET i nie ograniczać się do jedno, dwu-literowych nazw zmiennych.

      Co prawda pamięć Atari nie jest z gumy ale jak się wyłączy BASIC to się zrekompensuje ;)

      EDIT: sprawa jest jeszcze bardziej prozaiczna, cart z Action! 3.7P zabiera pamieć już od $8000 czyli to nawet nie problem większej 2x tablicy symboli.
      • 34: CommentAuthorzbyti
      • CommentTime29 Apr 2020 01:04 zmieniony
       
      Oto kolejny kawałek wiedzy przekazanej przez @mono.

      Ja używam profilu 130XE i taką ilość RAM uznaję za podstawową także przyjrzę się bliżej realizacji poniższych wskazówek w praktyce Action!

      mono:

      Atari 130XE

      Dodatkowa pamiec jest widziana tak jak pamiec cartridge'a ale w obszarze $4000-$7FFF.

      W PortB mozna przelaczac bank, w 130XE jak widzisz są 4 banki dodatkowe.

      W rozwiazaniu p.t. RAMBO zarowno antic, jak i cpu widzi ten wlaczony bank rownoczesnie natomiast w rozszerzeniu 130xe (to jest tzw standard compy-shop) sa dwa osobne bity w PortB dodatkowo, ktore pozwalaja na skonfigurowanie ktora pamiec w obszarze $4000-$7FFF widzi antic i ktora pamiec widzi CPU, czy ma widziec bank pamieci rozszerzeonej czy pamiec podstawowa, ale to nie dziala tak ze osobny bank dla antica i osobny dla cpu tylko konfiguruje sie, ze albo podstawowa pamiec albo dodatkowa w obszarze $4000-$7fff tyle ze osobnym bitem sie to konfiguruje dla antica a osobnym dla cpu
      • 35:
         
        CommentAuthorKaz
      • CommentTime29 Apr 2020 01:04
       
      O właśnie, praktyczne testy by się przydały. Bo jakoś podejrzanie rzadko programy w Action! korzystają z banków pamięci. Ktoś potrafi takie wymienić?
      • 36:
         
        CommentAuthortdc
      • CommentTime29 Apr 2020 03:04
       
      @Zbyti
      Standard rozszerzonej pamięci 130 XE (compy-shop) jest uznany od dziesięcioleci jako "odrzucony" przez świat Atari.
      Choć ja bym wolał, aby było inaczej;)

      @Kaz
      Bo w tym miejscu cartridge Action! trzyma kod programu, co jest niezwykle niewygodne.
      Dla małych programów można kompilować pod $8000 - ale zostaje już mało miejsca.
      • 37:
         
        CommentAuthortdc
      • CommentTime29 Apr 2020 03:04 zmieniony
       
      Nasze wczorajsze dokonania;) Dziś mamy KWASa, a kodujemy dalej jutro!;)

      Dziś pracowaliśmy w pliku głównym oraz stworzyliśmy nowy plik, który w mojej ocenie prezentuje naprawdę coś bardzo, bardzo ładnego, co pokazuje możliwości Atari w niemal pełnej krasie ;)
      Plik: CWICZ5.ACT
      w głównej pętli jest możliwość wyboru pomiędzy dwoma efektami, procedury: BARY() i MOON(). Obecnie jest aktywny drugi.

      Dodałem, że naciskając klawisze SELECT lub OPTION wyświetla się grafika bez poprawek - można porównać oba;)
      • 38:
         
        CommentAuthorKaz
      • CommentTime29 Apr 2020 09:04
       

      TDC:

      Bo w tym miejscu cartridge Action! trzyma kod programu, co jest niezwykle niewygodne.


      Ale niewygodne nie oznacza niemożliwe. Więc warto wiedzieć jak to zrobić.
      • 39: CommentAuthorzbyti
      • CommentTime29 Apr 2020 10:04 zmieniony
       
      Spróbuję :]

      Problem widzę tak:

      Symbol table space is allocated from the top of memory downward. The symbol table itself contains symbols for both global and local variables (which part of the table is used for what is controlled by the "hash tables", part of the "semi-fixed" memory mentioned above). The amount of space allocated is determined by STSP ( $0495 ), whichmay be changed by the user.

      The only real limitation is that Action!'s semi-fixed buffers, your compiled program, and your symbol table must, somehow, fit in the memory between the top of DOS LOMEM and the bottom of the screen memory HIMEM.



      W obszarze pamięci gdzie jest okienko na "dodatkową" pamięć 130XE standardowo Action! trzyma symbol table która idzie od HIMEM w dół 8 stron (można ustawić ile konkretnie).

      Dlatego jeżeli HIMEM można ustawić Action! tak by wskazywała na $3FFF własną DL ustawić ekran na obszar bankowany (lub na obszar zajmowany przez BASIC po jego wyłączeniu) to za pomocą CODEOFF można kompilować za obszarem bankowanym główny kod programu.

      Wymaga to oczywiście poskładania tego wszystkiego "do kupy na zewnątrz" ale w dobie emulatorów wydaja się to w miarę proste.

      Tyle rozkminy gościa słabo znającego Atari! ale wydaje mi się powyższe rozumowanie sensowne.

      Jakby jeszcze wyłączyć OS to już w ogóle wszystkie poważne ograniczenia Action! związanie z RAM by znikły.

      EDIT: A najlepiej jakby powstał Effectus i można by te kombinacje do kosza wywalić bo miałby wszystkie możliwości Mad Pascala w tym zakresie :D
      • 40: CommentAuthorzbyti
      • CommentTime29 Apr 2020 10:04
       
      ;      BIGST.ACT

      ; copyright (c) 1984
      ; by Action Computer Services
      ; All Rights Reserved

      ; This program will create a big
      ; global symbol table (max 510
      ; entries, normally 255) when run.
      ; It will boot the cartridge as well,
      ; so you must not have anything in
      ; the Editor that you want. It does
      ; not increase the space used to
      ; store variable names. If you want
      ; to increase this as well, you will
      ; have to 'SET $495 = #' in the
      ; monitor after running this program.
      ; # is the number of pages you want
      ; to be used for name storage (each
      ; page is 256 bytes, default is 8).

      ; You must use the correct version of
      ; Cold below:

      ; version 3.0 ACTION! ROM
      ;PROC Cold=$A323()[]

      ; version s 3.1 to 3.6 ACTION! ROMs
      PROC Cold=$A326()[]


      PROC BigSymbolTable()
      CHAR bigST=$4C4
      BYTE EBank=$D503

      Zero($480, 255)

      ; following statement causes all
      ; variables starting with uppercase
      ; letters to go into one half of the
      ; global symbol table and variables
      ; starting with lowercase letters to
      ; go into other half (255 entries in
      ; each half). If you use mostly
      ; uppercase variable (this includes
      ; PROC/FUNC names) use 'M. If you
      ; use mostly lowercase variables then
      ; use 'm.

      bigST = 'a

      ; boot cartridge with big S.T.
      ; Will not return.

      EBank = 0
      Cold()
      RETURN
      • 41: CommentAuthorxxl
      • CommentTime29 Apr 2020 10:04
       
      DOS z dyskietki przykladowej ustawia MEMLO na $2000, wystarczy wymienic DOS na np. xBoot DOS i "magicznie" mamy ponad 5 kilobajtow pamieci wiecej ( 5840 bajtowe ) :D
      • 42: CommentAuthorzbyti
      • CommentTime29 Apr 2020 10:04 zmieniony
       
      Sprawdziłem ten trick z HIMEM/MEMTOP na ten moment jest to po za sensowną kontrolą takiego laika jak ja ;)

      Więc faktycznie pozostaje opcja xBoot by xxl :]
      • 43:
         
        CommentAuthorKaz
      • CommentTime29 Apr 2020 10:04
       

      Zbyti:

      A najlepiej jakby powstał Effectus i można by te kombinacje do kosza wywalić bo miałby wszystkie możliwości Mad Pascala w tym zakresie :D


      Trzeba napisać do Gurego, że jest tu aktywna grupa użytkowników Action!, której zależy na Effectucie - to na pewno wzmoże jego motywację do pracy nad tym programem.

      Ale niezależnie od Effectusa - przyda się również rozwiązanie natywne, bo niektórzy - jak wiesz :D - pracują tylko natywnie, bo tak przywykli.
      • 44: CommentAuthorzbyti
      • CommentTime29 Apr 2020 10:04 zmieniony
       
      @Kaz Dałem znać Guremu, że są warsztaty z Action! i podrzuciłem mu link do kolorowania składni Action! Michała (a tam na git-cie jest link do wątku na AOL), zrobiłem to specjalnie w wątku Effectus a nie w innych o Action! ;)

      A ten Pan co pisze natywnie to miał ponad 20-lat by rozgryźć problem ;) więc to raczej ja poproszę o podanie rozwiązania ;)
      • 45:
         
        CommentAuthorKaz
      • CommentTime29 Apr 2020 10:04
       
      Ale ten Pan widocznie nie potrzebował dotychczas rozwiązania tego problemu, albo przekracza to ramy warsztatu (podstawy Action!), a jak mamy tworzyć duże gry, z obszerną grafiką to sam rozumiesz :)
      • 46: CommentAuthorzbyti
      • CommentTime29 Apr 2020 11:04 zmieniony
       
      Tak przy okazji, domyśle możliwości wersji plikowej Action! 3.7X JAC!



      Tutaj warto by xBootDOS od @xxl wrzucić i było by super :]

      Przy tej wersji można by już bankować 130XE :)

      Idę zobaczyć, czy umiem użyć tego xBootDOS by spreparować Action! 3.7.X ;)

      EDIT: no normalne... dir2atr wymaga Windows :P
      • 47: CommentAuthorxxl
      • CommentTime29 Apr 2020 11:04
       
      bootowac z obecnej dyskietki a pod d2: zamontowac dyskietke zainicjowana xBootDOSem (nagrac na nia Action pod nazwa autorun). kompilowac do pliku na D2 z memlo $930.

      po skompilowaniu zabootowac z tej dyskietki.
      • 48: CommentAuthorzbyti
      • CommentTime29 Apr 2020 11:04 zmieniony
       
      @xxl dzięki za info.. przyda się :]

      Jak wytrzepię skądś Windows to zrobię...
      • 49: CommentAuthorxxl
      • CommentTime29 Apr 2020 11:04 zmieniony
       
      wystarczy wkleic 384 bajty ( xBD: ) do .atr od pozycji $10


      ---
      albo zaraz napisze toola do inicjalizacji


      5 minut...
      • 50: CommentAuthorzbyti
      • CommentTime29 Apr 2020 11:04 zmieniony
       
      @xxl dziękuję, z takim info już sobie powinienem poradzić :]

      EDIT: tool to jeszcze lepiej, poczekam :]