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
     
    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 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
     
    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 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
     
    A pokaż co ląduje od adresu $1803. To się wyjaśni.
    • 6: CommentAuthorzbyti
    • CommentTime26 Apr 2020 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
     
    troche dlugi ten wait
    wait	lda 20
    cmp 20
    beq *-2
    rts
    • 8: CommentAuthorzbyti
    • CommentTime26 Apr 2020 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
     
    Jakbym ogarniał desasemblację to bym sobie poradził. A nie ogarniam - dlatego prosiłem o pomoc. No nic.
    • 10: CommentAuthorzbyti
    • CommentTime26 Apr 2020 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 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 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 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
     
    @zbyti: Dzięki, już wszystko jasne. I to co robi to =* też.
    • 15: CommentAuthorzbyti
    • CommentTime26 Apr 2020 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 zmieniony
     
    Mamy kolejnego ATRa:

    Dziś między innymi wyświetliliśmy 6 duszków w linii rastra ;))
    • 17: CommentAuthorzbyti
    • CommentTime27 Apr 2020 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 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
     

    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 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 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 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
     
    Dzisiaj za niecały kwadrans już 10 odcinek kursu. Łacznie było więc 27h.
    • 25: CommentAuthorgebi
    • CommentTime27 Apr 2020
     
    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
     
    Ale w końcu się pojawiłeś! :D

    A przy okazji filmik Zbytiego:

    • 27: CommentAuthorzbyti
    • CommentTime27 Apr 2020 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 zmieniony
     
    • 29: CommentAuthorzbyti
    • CommentTime28 Apr 2020 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 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 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
     
    Dzisiaj podpatrzone - może by tak podebrać kilka pomysłów? ;-)
    ->link<-
    • 33: CommentAuthorzbyti
    • CommentTime28 Apr 2020 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 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
     
    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
     
    @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 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
     

    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 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
     
    ;      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
     
    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 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
     

    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 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
     
    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 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
     
    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 zmieniony
     
    @xxl dzięki za info.. przyda się :]

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


    ---
    albo zaraz napisze toola do inicjalizacji


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

    EDIT: tool to jeszcze lepiej, poczekam :]