atarionline.pl MAD-Pascal - Początki - 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: CommentAuthorMADRAFi
    • CommentTime14 Mar 2019
     
    ok widze musze uzyc dodatkowych przelacznikow kompilatora...
    -code:$address adres uruchomienia programu
    -data:$address adres pamięci dla zmiennych, tablic
    -stack:$address adres pamięci dla stosu programowego (64 bajty)
    -zpage:$address adres na stronie zerowej dla zmiennych (24 bajty)
    • 2: CommentAuthorVidol
    • CommentTime15 Mar 2019 zmieniony
     
    technicznie wyglada to tak:
    org $6100
    intro ins 'intro25f7-603f.dat.deflate' - spakowane intro
    gra ins 'gra.dat_0.dat.deflate' -spakowana gra

    org $0800
    main mwa #intro inflate_zp
    mwa #$25f7 inflate_zp+2
    jsr inflate ;- rozpakuk intro

    jsr $5000 ;-start intro - intro musi koczyc sie RTS

    mwa #gra inflate_zp
    mwa #$2000 inflate_zp+2
    jsr inflate ;-rozpakuj gre
    jmp $508a ;-uruchom gre

    run main

    • 3: CommentAuthortebe
    • CommentTime15 Mar 2019 zmieniony
     
    jeśli użyłeś XBIOS-a to oprócz tego że daje on dostęp do pamięci powyżej $C000 (można wyłączyć ROM), to pozwala też na niższy adres początkowy, niższy niż $2000

    Mapa Pamięci przy konfiguracji standardowej xBIOS:
    $0000-$00ff ; free
    $0100-$01ff ; stos 6502C
    $0200-$06ff ; free
    $0700-$07ff ; bufor I/O - relokowany
    $0800-$0bff ; xBIOS - relokowany
    $0c00-$cfff ; free
    $d000-$d7ff ; Atari HW
    $d800-$ffff ; free


    dlatego dziwię się że jeszcze nie użyłeś przełącznika '-code:$0c00', to powinno dać Tobie 5120 bajtów dodatkowej pamięci

    jeśli doczytujesz jakieś grafiki powinieneś przechowywać je w formie najbardziej spakowanej, Bocianu udostępniał przykłady wykorzystania najprostszej metody, kompresji RLE

    XBIOS pozwala też na dekompresję 'w locie', tzn. że nie potrzebujesz dodatkowego bufora, odczyt i dekompresja jest w tym samym czasie
    • 4: CommentAuthorMADRAFi
    • CommentTime15 Mar 2019 zmieniony
     
    Tebe, jak tylko zobaczylem ten przelacznik to zalapalem ze bede mial jeszcze troche wolnego ramu. Ale nie wpadlbym ktore przedzialy sa jeszcze wolne. Widzialem wczesniej ta rozpiske i o niej zapomnialem. Dzieki bardzo.
    Rozpoczne od relokowania kompilacji loadera i uruchomienia intro przez xbios.
    Grafiki doczytuje z dysku jak tylko jej potrzebuje i nie jest ona spakowana w ramie tylko rozpakowana bo jest wyswietlana.
    Program jest tak rozpasly ze nie mam miejsca na 18-20 grafik 160x100 :)
    • 5:
       
      CommentAuthorgalu
    • CommentTime17 Mar 2019
     
    Mały update (wideo w.i.p.): ->link<-
    • 6:
       
      CommentAuthorKaz
    • CommentTime18 Mar 2019 zmieniony
     
    Galu - załóż nowy wątek o grze, bo podejrzewam, że ludzi to zaciekawi, a w wątku o programowaniu to się w oczy w ogóle nie rzuca. A wygląda to świetnie, w końcu ludzie wykorzystują DLI, mocną stronę Atari :D

    PS. Nie czekałem, sam założyłem :)

    ->link<-
    • 7:
       
      CommentAuthorgalu
    • CommentTime20 Mar 2019
     
    W dokumentacji MP jest taka uwaga: "Program z wstawkami ASM nie będzie działał na innej platformie niż XE/XL. MP wykorzystuje 64KB pamięci podstawowej (...)". Czy da się zapewnić zgodność z Atari 800 (48KB RAM)?
    Pytam bo na razie się odpala w takiej konfiguracji (XEX <10KB), a w tym roku wypada 40-lecie Atari 400/800 :)

    I jeszcze (z ciekawości bardziej niż potrzeby) zapytam o Atari 400 z 16KB RAM i wsparcie dla ładowania z ROM-u ;)
    • 8: CommentAuthortebe
    • CommentTime21 Mar 2019 zmieniony
     
    nie mam doświadczenia w Atari 400/800 itp. , pewnie jeśli program będzie zajmował odpowiednio mało pamięci to się uda, nie wiem jak z OS bo pewne różnice występowały
    • 9:
       
      CommentAuthorgalu
    • CommentTime28 Mar 2019 zmieniony
     
    Taki problem:
    Kompresuję - RLE - tablice z definicją poziomów i teraz mam zamiast 100 tablic 60-elementowych (100 leveli, każdy po 10x6 "kratek") 100 tablic różnej wielkości, które dopiero w momencie wczytywania konkretnego poziomu będę rozpakowywał do tablicy 60-elementowej 10x6. Pozwoliło to zaoszczędzić jakieś 3-4 KB "danych", ale za to tych 100 "skompresowanych" tablic nie mogę już trzymać w tablicy pod indeksami z numerami poziomów, nie udało mi się również z tablicą 100 wskaźników (wskaźniki na każdą ze 100 zmiennych przechowujących "skompresowaną" tablicę - pomijam to, że jeśli by to zadziałało to byłby to dodatkowy narzut 400+ bajtów). Do głowy przychodzi mi rozwiązanie z case ze 100 warunkami, ale może da się inaczej? :)
    • 10: CommentAuthortebe
    • CommentTime28 Mar 2019 zmieniony
     
    nie rozumiem problemu, masz N plików, level000.dat, level001.dat ...

    na podstawie zmiennej N, tworzysz nową nazwę pliku i odczytujesz plik o tej nazwie

    fnam:=concat('level', IntToStr(N) );
    fnam:=concat(fnam, '.dat');


    p.s.
    IntToStr jest w 'SysUtils', można zamiast niego użyć Str, który jest w 'System'

    Str(N, fnam);
    fnam:=concat('level', fnam);
    fnam:=concat(fnam, '.dat');


    ale nie musi to przynieść korzyści w postaci krótszego kodu
    • 11:
       
      CommentAuthorjhusak
    • CommentTime28 Mar 2019
     
    @galu, jak chcesz to trzymać w pamięci, to masz kilka możliwości:
    - dać tablicę 100 elementową typu word 16 bit wskaźników do leveli (+200 bajtów)
    - dać prefix oznaczający długość danych levelu przed każdym levelem, wtedy poszukiwanie określonego levelu będzie w pętli kręcącej się max 100 razy (+100 bajtów)
    - dać specjalny znak jako przerywnik levelu i wyszukiwać liniowo (+100 bajtów)

    oraz inne, bardziej skomplikowane i mniej oczywiste.
    • 12:
       
      CommentAuthorgalu
    • CommentTime28 Mar 2019
     
    Dzięki!

    A czy wykorzystanie stringów zamiast tablic wchodzi w grę jeśli "koduję" dane leveli z wykorzystaniem wszystkich 256 wartości (Byte)? Jeszcze dla wyjaśnienia - ja ten kod Pascala z definicją poziomów generuję ze starego kodu gry w Javie, tylko teraz dopisałem "enkoder" który wypluwa dane w takim formacie:
    array[0..13] of Byte = (39, 0, 19, 37, 0, 10, 38, 33, 34, 0, 8, 35, 0, 17);

    a nie bezpośrednio w takim (ten uzyskuję dopiero po "rozpakowaniu" danych w momencie wczytania kolejnego poziomu):
    array[0..5, 0..9] of BlockType = (
    (B__, B__, B__, B__, B__, B__, B__, B__, B__, B__),
    (BEX, B__, B__, B__, B__, B__, B__, B__, B__, B__),
    (B__, B__, B__, B__, B__, B__, B__, B__, B__, B__),
    (BUP, B__, B__, B__, B__, B__, B__, B__, B__, B__),
    (B__, BST, B__, B00, B__, B__, B__, B__, B__, B__),
    (B__, B__, BUL, B__, B__, B__, B__, B__, B__, B__)
    );

    Pytania by nie było jeśli bym mógł te 100 definicji wrzucić np. do jednej tablicy i odpytywać o kolejne jej indeksy (dla kolejnych leveli) - a na razie wygląda to tak:
    var levelEnc1 : array[0..6] of Byte = (0, 32, 34, 38, 39, 0, 25);
    var levelEnc2 : array[0..13] of Byte = (39, 0, 19, 37, 0, 10, 38, 33, 34, 0, 8, 35, 0, 17);
    ...
    • 13: CommentAuthorMADRAFi
    • CommentTime28 Mar 2019 zmieniony
     
    tablice 2 wymiarowa mozesz zapisac w 1 wymiarowej i wyliczac offset z ktorego masz przeczytac kolejna porcje danych

    jezeli masz tablice 2 wymiarowa 6 na 10 to:

    NUMBEROFLEVELS = 6
    NUMBEROFITEMS = 10
    array [0..(NUMBEROFLEVELS * NUMBEROFITEMS)-1] of BlockType

    for y:=0 to NUMBEROFITEMS-1 do
    begin
    offset:=(NUMBEROFITEMS * level_number) + y;
    end;



    level_number to numer poziomu z ktorego chcesz dostac dane.
    jezeli dany level ma np zmienna liczne "itemow" to w pozostalych pozycjach trzymasz 0.
    W petli czytasz tylko gdy wartosc > 0
    • 14:
       
      CommentAuthorgalu
    • CommentTime29 Mar 2019 zmieniony
     
    Skorzystałem z sugestii Jakuba (z połączenia dwóch pierwszych sugestii):
    wrzucam wszystkie skompresowane dane do jednej tablicy (~2500 elementów), a do drugiej (100 elementów) - ilość elementów z pierwszej przypadających na kolejny level. Czyli dodatkowe 100 bajtów na dane + dodatkowe 6 linii kodu przy dekompresji.

    Dzięki.
    • 15: CommentAuthorMADRAFi
    • CommentTime30 Mar 2019 zmieniony
     
    Wiem ze nie Pascal, ale w jakims sensie sie z nim laczy :)

    Probuje wykonac loader do intra i gry.
    W tej chwili loader laduje intro, ale po tym wykonanie programu zatrzymuje sie.
    Nie wiem jak ugrysc problem.

    Probowalem skoku z intro do adresu w pamieci gdzie znajduje sie dalsza czesc loadera, tez nie pomoglo.

    org $0580
    introfile .byte c'INTRO XEX'
    gamefile .byte c'GAME XEX'
    xBiosIOresult .byte
    xBiosIOerror .byte


    loadfile
    mva #0 xBiosIOresult
    sta xBiosIOerror
    adr1 ldy #0
    adr2 ldx #0
    jsr xBIOS_LOAD_FILE
    bcc @+
    stx xBiosIOerror
    mva #1 xBiosIOresult
    @ rts

    main

    jsr printf
    dta c'Loading...',$9b,0
    mva <introfile adr1+1
    mva >introfile adr2+1
    jsr loadfile
    game mva <gamefile adr1+1
    mva >gamefile adr2+1
    jmp loadfile

    run main
    • 16: CommentAuthortebe
    • CommentTime31 Mar 2019
     
    jsr loadfile

    run main


    to niepokojące
    • 17: CommentAuthorMADRAFi
    • CommentTime31 Mar 2019
     
    nawet jak zmienie na jmp to nie zmienia to mojego problemu :)
    • 18: CommentAuthorgorgh
    • CommentTime31 Mar 2019
     
    po powrocie z jsr program leci w maliny, po powrocie z rts to nie wiem gdzie leci, bo nie wiem, jak to wywołujesz
    • 19: CommentAuthorMADRAFi
    • CommentTime31 Mar 2019 zmieniony
     
    do 1 jsr loadfile dziala poprawnie
    laduje intro.xex, po zakonczeniu intro.xex, program jakby nie wracal juz do loadera lub drugie jsr loadfile nie dzialalo


    loader jest programem Xautorun na dysku atr z xbiosem
    • 20: CommentAuthorpin
    • CommentTime31 Mar 2019
     
    spokojnie - jak to odpalisz u siebie, to później będziesz odpisywał na pytania userów pt.: dlaczego program się u mnie nie uruchamia ;)
    • 21: CommentAuthorMADRAFi
    • CommentTime31 Mar 2019
     
    To moze pokazcie jakas alternatywe, bo na razie nie wiem jak to zrobic inaczej - nie mam pomyslu.
    • 22: CommentAuthorpin
    • CommentTime31 Mar 2019
     
    .. przecież to można złożyć w jeden plik wykonywalny /*.xex/ :)
    • 23: CommentAuthorMADRAFi
    • CommentTime31 Mar 2019
     
    no wlasnie nie mozna, bo nie wlezie w ram. dlatego taka sztuczka z loaderem.
    • 24: CommentAuthorxxl
    • CommentTime1 Apr 2019
     
    odpowiedz masz na mailu.

    mozna tez z pliku intro wykonac xBIOS_LOAD_FILE :-) oszczedzisz na loaderze.
    • 25: CommentAuthorMADRAFi
    • CommentTime1 Apr 2019 zmieniony
     
    To rozwiazanie bylo na poczatku i tez nie zadzialalo.
    Wygladalo na to ze ladowany program nadpisywal intro i sie wszystko zawieszalo.
    • 26: CommentAuthorxxl
    • CommentTime2 Apr 2019
     
    ogolne uwagi:
    1. jesli uzywamy OS i I/O to trzeba pamietac zeby OS byl wlaczony
    2. jesli uzywamy OS i I/O to nie nadpisujemy waznych dla niego komorek pamieci
    3. jesli uzywamy OS i I/O to musimy miec NMI WŁĄCZONE

    jesli nie lubimy ograniczen to kopiujemy odpowiedni plik cfg dla xBIOS i po sprawie :-)
    • 27: CommentAuthorMADRAFi
    • CommentTime29 Apr 2019
     
    Chcialbym nauczyc sie wyswietlac grafike z G2F przy uzyciu mad pascala.
    Po zapisaniu grafiki z g2f mam taka liste plikow:

    1. fad
    2. pmf
    3. hcl
    4. asm
    5. h
    6. scr
    7. fnt (3kb plik)

    Skonstruowalem sobie nowe DLI i VBL
    w tym dli ustawiam adres fontu (plik 7)
    Plik scr otwieram sobie w CutAs i wypluwam nim tablice char w formacie mad pascal
    (tu jest problem jak to przyciac by ladnie mi sie pokrylo z 40 znakami w linii)

    jezeli wszystko bedzie ok to pokaze mi sie 2 kolorowy obraz.

    w DLI umiem zmienic kolory ale per linia a nie per char.
    Jak to pokolorowac? :)

    Jakies inne podejscie do tematu?
    • 28: CommentAuthortebe
    • CommentTime30 Apr 2019
     
    G2F generuje gotowy plik ASM, tam masz wszystko

    plik *.FAD to zapalenie/zgaszenie kolorów, możesz pominąć

    w Special -> możesz wybrać efekt FADE, albo go wyłączyć
    • 29: CommentAuthorMADRAFi
    • CommentTime30 Apr 2019
     
    Wiem co to plik asm i nie dokonca pasuje mi on do pisania w Pascalu :)
    • 30:
       
      CommentAuthorbocianu
    • CommentTime30 Apr 2019
     
    no niestety bedziesz się musiał pogodzić z asm troszkę. Możesz podejrzeć w źródłach K-jak, jak ja poradziłem sobie z obrazkiem z g2f:

    ->link<-

    od linii 305 - procedure showTitle;

    Nie mówię, że to idealny sposób - ale działa :D
    • 31: CommentAuthortebe
    • CommentTime30 Apr 2019
     
    G2F oferuje różne metody, tryby, musisz zrobić jakieś założenie, jeśli chcesz full wypas to najlepiej ASM, możesz zrobić wersję relokowalną .RELOC a potem w kodzie Pascala dolinkować przez .LINK i wykonać skok etc.

    albo przyjmiesz że Twój obrazek jest w konkretnym formacie, w sensie ma np. tylko 5 kolorów, wtedy potrzebujesz zestawy znaków FNT, dane pamięci obrazu SCR oraz układ zestawów znakowych TAB czyli jaki zestaw w którym wierszu obrazu

    jeśli chcesz więcej kolorów, to znów możesz uprościć i założyć że zmiany są tylko na początku wiersza (G2F pozwala na zablokowanie wybranych linii wiersza), dla takiego założenia będzie prościej zbudować program przerwania DLI

    no ale jeśli chcesz dowolnie to tylko ASM

    p.s.
    w przykładach do MadPascala jest ładowanie obrazka z G2F dla VBXE

    examples\examples\pic_vbxe.pas

    zdecydowanie mapa kolorów jest prostsza niż budowanie programu DLI
    • 32: CommentAuthorgorgh
    • CommentTime30 Apr 2019
     
    wychodzi na to, że jeśli się chce coś poważniejszego napisać, to i tak znajomość asm nieodzowna
    • 33:
       
      CommentAuthorbocianu
    • CommentTime30 Apr 2019
     
    no niestety, jak chcesz wykorzystać możliwości sprzętu do maksa, to bez asm się nie obejdziesz. Chociażby w szczątkowych ilościach, ale się pojawi.
    • 34: CommentAuthortebe
    • CommentTime30 Apr 2019 zmieniony
     
    to teraz poproszę solucję jak załadować obrazek G2F w Basicu :P

    p.s.
    jakaś ostatnia gra w TEN LINERS to ASM spakowany jako DATA, a BASIC wywołuje dekompresję i uruchamia kod, więc ...
    • 35: CommentAuthorfalcon030
    • CommentTime1 May 2019
     
    @tebe: Dla przykładu programy drukowane a TajemicachAtari w sumie korzystały z takiego mechanizmu (Assembler odpalany z poziomu Basica).
    • 36: CommentAuthorMADRAFi
    • CommentTime5 May 2019 zmieniony
     
    Na podstawie pliku scr stworzylem sobie tablice w mad pascal
    Wyswietlam ja sobie na ekranie - znaki pokrywaja sie z tymi w podladzie w g2f.
    W programie mam jednak obraz nie do konca dzialajacy.
    Nie wiem czy wygenerowany font z programu zawiera tylko prawidlowe znaki opisane jako font1?

    Czy w swoim programie musze jakis offset zrobic dla danych dla fontu2 i kolejnych?
    • 37: CommentAuthorgorgh
    • CommentTime6 May 2019
     
    wygląda na to, że nie przełączasz nowego zestawu znaków w DLI
    • 38: CommentAuthorMADRAFi
    • CommentTime6 May 2019
     
    No ale g2f wypluk tylko 1 font 3kb
    Wczytalem gonsobie donpamiecini ustawilem.
    Moze g2f powinien wypluwac wiecej?

    Poza tym ten kawalek consie pokazal w mire to ma inny wyglad niz to co jest w samym programie g2f.
    Chodzi mi o piksele, font ma pionowe linie jakby.
    • 39: CommentAuthorgorgh
    • CommentTime6 May 2019
     
    na obrazku z g2f widać wyraźnie, że są 3 zestawy fontów (cyferki na lewej krawędzi obrazka- od 0 do 2)
    A niby czemu miałby różne zestawy wypluwać w oddzielnych plikach?
    Czemu inny obrazek? BO TO HIRES
    • 40: CommentAuthortebe
    • CommentTime6 May 2019
     
    jeden zestaw znaków zajmuje 1KB pamięci (1024 bajty = 128 znaków * 8 bajtów)

    skoro plik ma długość 3KB tzn. że są tam 3 zestawy

    plik *.TAB (30 bajtów) zawiera informacje o numerze zestawu

    bajt 0 oznacza zestaw tab[0] w wierszu 0
    bajt 1 oznacza zestaw tab[1] w wierszu 1
    bajt 2 oznacza zestaw tab[2] w wierszu 2
    itd.
    • 41: CommentAuthorpirx
    • CommentTime6 May 2019
     
    przy okazji widać, że warto obrazek trochę przerobić albo i uciąć, żeby się zmieścić w 2 zestawach znaków.
    • 42: CommentAuthorMADRAFi
    • CommentTime6 May 2019
     
    tebe, nic mi to nie mowi. dlaczego skoro sa 3 zestawy znakow program g2f nie zapisuje 3 plikow fnt ?
    Czy nie mozna napisac normalnej dokumentacji ktora by opisywala jak tego uzywac ?
    Szczegolnie ze autor g2f i mad pascala to ta sama osoba :)
    • 43: CommentAuthorsun
    • CommentTime7 May 2019 zmieniony
     
    Ale tu nie ma żadnej magii. Nie ma potrzeby zapisywać 3 plików i dołączać 3 skoro można dołączyć 1. To jakby tryb graficzny np. 192 linie zapisywać w 192 plikach.
    Poza tym, w czym wg Ciebie pomoże Ci zapis 3 plików?
    Musisz sobie co 4 linie (1 zestaw) na DLI zmienić adres generatora znaków o +1kb i będzie ok. Do tego ustawić taki sam tryb jak był w g2f i będziesz miał taki sam obrazek.
    • 44: CommentAuthortebe
    • CommentTime7 May 2019
     
    G2F zapisuje m.in. 3 pliki -> FNT, SCR, TAB

    te pliki opisują ekran znakowy

    FNT zawiera wszystkie N zestawów znaków, 1024b x N
    SCR zawiera pamięć obrazu, czyli kody znaków ANTIC-a
    TAB tablica z informacją o numerze zestawu znakowego w wierszu

    ten pomysł został zaczerpnięty z tego programu...
    • 45: CommentAuthorMADRAFi
    • CommentTime7 May 2019
     
    moze dla to so oczywiste oczywistosci, ale sugeruje zrobic manual ktory opisze jak to jest zbudowane.
    Jak korzystac z pliku tab w mad pascal.

    sun:

    Do tego ustawić taki sam tryb jak był w g2f i będziesz miał taki sam obrazek.


    tryb jest ten sam
    40 bajtow na wiersz
    • 46: CommentAuthortebe
    • CommentTime7 May 2019
     
    przepraszam, poprawię się :)
    • 47: CommentAuthorsun
    • CommentTime7 May 2019 zmieniony
     
    Tak Ci się wydaje, ponieważ nie wygląda to tak samo. Znaki wyglądają jakby to był tryb $02 a zapewne ma być $04.
    ->link<-
    Ale... co ja tam wiem, ostatnie takie rzeczy to robiłem 25 lat temu :)
    Zapisz sobie plik asm z g2f to zrozumiesz lepiej o co biega.
    • 48: CommentAuthorMADRAFi
    • CommentTime15 May 2019
     
    Zrobilem tak jak pisaliscie i wykonalem zmiane fontu po x linii

    phr ; store registers
    mva #.hi(LOGO_CHARSET_ADDRESS) ATARI.chbase
    sta ATARI.WSYNC
    mva #$06 ATARI.colbk
    sta ATARI.colpf2
    mva #$02 ATARI.colpf1

    lda #31
    @ cmp vcount
    bpl @-
    mva #.hi(LOGO_CHARSET_ADDRESS2) ATARI.chbase

    lda #62
    @ cmp vcount
    bpl @-
    mva #.hi(CHARSET_ADDRESS) ATARI.chbase

    plr ; restore registers
    };


    Adresy w pamieci:

    LOGO_CHARSET_ADDRESS  = $DC00;
    LOGO_CHARSET_ADDRESS2 = LOGO_CHARSET_ADDRESS + $400;


    2 font nie jest niestety prawidlowo wyswietlany.
    W tym pojecie nie mam pojecia dlaczego.
    • 49: CommentAuthorpirx
    • CommentTime16 May 2019
     
    to się w ogóle wykonuje? pobaw się kolorkami, zobacz gdzie się zmieniają i czy w ogóle.
    • 50: CommentAuthorMADRAFi
    • CommentTime16 May 2019
     
    Interesuje mnie w tej chwili pokazanie w calosci grafiki, przy uzyciu prawidlowego fontu.