Mad Pascal

Nie ma róży bez kolców... Miejsce na dyskusję o najmłodszym bracie C64
Wiadomość
Autor
zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Mad Pascal

#1 Post autor: zbyti »

Cześć, zostawiłem tę informację (z grubsza) jako komentarz pod dwoma art. na portalu, ale, że postanowiłem spróbować swoich sił w programowaniu dla Plus/4 to zakładam ten wątek.

Od paru miesięcy Mad Pascal ma podstawowe wsparcie dla C64 a od 2 dni także dla Plus/4.

źródła: https://github.com/tebe6502/Mad-Pascal
dokumetajca: http://mads.atari8.info/doc/pl/index.html

Przykładowy kod @carriona z art: https://c64portal.pl/2020/05/04/program ... re-plus-4/ może wyglądać np. tak:

Kod: Zaznacz cały

var
  COLORRAM    : array [0..0] of byte absolute $0800;
  SCREEN      : array [0..0] of byte absolute $0c00;
  BORDERCOLOR : byte absolute $ff15;
  BGCOLOR     : byte absolute $ff19;

var
  w0i, row    : word;
  b0i, b1i    : byte;

begin
  BORDERCOLOR := 0; BGCOLOR := 0;
  FillByte(@SCREEN, 40 * 25, $a0);

  for b0i := 0 to 7 do begin
    row := 40 * b0i;
    for b1i := 0 to 15 do COLORRAM[row+b1i] := (b0i shl 4) + b1i;
  end;
end.
efekt w załączniku.

Jak zrobię inne sample to będę wrzucał do tego wątku.

Zachęcam do spróbowania swoich sił :]
Załączniki
palette.zip
(461 Bajtów) Pobrany 4 razy

Awatar użytkownika
carrion
Posty: 1968
Rejestracja: 27 lut 2009, 17:38
Grupa: Bonzai
Kontakt:

Re: Mad Pascal

#2 Post autor: carrion »

@zbyti
fajny pomysł. Chętnie popatrzę jak to wychodzi w Pascalu. I chociaż nie zamierzam w nim programować to dobrze jak będą gdzieś w sieci gotowe przykłady dla tych co Pascala lubią.
Ciekawe ile wspólnych procedur (bibliotek) można wykorzystać wspólnie dla Atari i C+4.

btw: a da się w tym pisać dla C64?
c64portal.pl

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Re: Mad Pascal

#3 Post autor: zbyti »

carrion pisze:
12 sty 2021, 18:40
btw: a da się w tym pisać dla C64?
Tak, w takim samym zakresie jak dla Plus/4 (a nawet ciut większym, bo aktualnie dla Plus/4 trzeba napisać parę procedur w modułe SYSTEM, które dla C64 już są) ale tak naprawdę masz mniej więcej to samo jak sobie zrobiłeś w KickC target dla Plus/4 czyli szybki kompilator ale brak bibliotek graficznych i innych specyficznych dla danej platformy. Mi to nie przeszkadza bo i tak zamierzam napisać swoje.

Ogólnie chcę napisać kiedyś engine szachowy, to wtedy wypuszczę to na A8 i Plus/4 bo 6502 jest na tych platformach fajnie taktowany.

Kolorowy hires z Plus/4 (jak coś napiszę) jeżeli chciałbym przenosić na A8 to już chyba tylko opcja gdyby chciało mi się opanować VBXE a na to się nie zanosi.

Porównanie wydajności kompilatorów KickC i Mad Pascal można obadać na Atari za pomocą:

https://github.com/zbyti/a8-mad-pascal-bench-suite

https://github.com/markjfisher/kickc-benchmarks

rime.
Posty: 41
Rejestracja: 24 sty 2019, 02:52
Grupa: Fancy Rats

Re: Mad Pascal

#4 Post autor: rime. »

Testowałem P65Pas, Pas6502, TRSE a teraz czas na Mad-Pascal. Jako fan języka Pascal (i pochodnych) słyszałem już wcześniej o MP, ale w kontekście kompilatora dla 8 bitowych Atari. Nie wiedziałem, że dodano wsparcie dla C64 i dopiero teraz swoim postem mnie uświadomiłeś. Skompilowałem przed chwilą przykład "pas6502_test" i uzyskałem plik z rozszerzeniem .obx, no i pytanie co dalej, jak uzyskać PRG ?

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Re: Mad Pascal

#5 Post autor: zbyti »

rime. pisze:
12 sty 2021, 22:59
pytanie co dalej, jak uzyskać PRG ?

Kod: Zaznacz cały

#!/bin/bash

mp="$HOME/Programs/MadPascal/mp"
mads="$HOME/Programs/mads/mads"
base="$HOME/Programs/MadPascal/base

if [ -z "$1" ]; then
  echo -e "\nPlease call '$0 <argument>' to run this command!\n"
  exit 1
fi

$mp $1 -t c64 -z 10 -o
name=${1::-4}

if [ -f $name.a65 ]; then
  [ ! -d "output" ] && mkdir output
  mv $name.a65 output/
  $mads output/$name.a65 -x -i:$base -o:output/$name.prg
else
  exit 1
fi

if [ ! -z "$2" ]; then
  x64 output/$name.prg
fi
Gdyby powyższy skrypt nie odpowiedział na Twoje pytanie to napisz jeszcze raz a opiszę to bardziej szczegółowo :]
Ostatnio zmieniony 12 sty 2021, 23:37 przez zbyti, łącznie zmieniany 1 raz.

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Re: Mad Pascal

#6 Post autor: zbyti »

W kontekście Mad Pascala polecam używać z repo ostatnią "zacommitowaną" wersję a nie "stary" oficjalny release 1.6.4.

Ja wszystko piszę na 1.6.5 a dokładnie zawsze pobieram ostatnią wersję z repozytorium.

rime.
Posty: 41
Rejestracja: 24 sty 2019, 02:52
Grupa: Fancy Rats

Re: Mad Pascal

#7 Post autor: rime. »

Dzięki, pobrałem programy bezpośrednio z repozytorium, teraz wygląda to dobrze. Poniższe zostawiam dla tych którzy też szukają niższego progu wejścia ;-D

Kod: Zaznacz cały

mp pas6502_test.pas -target:c64
mads pas6502_test.a65 -x -i:base -o:pas6502_test.prg

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Re: Mad Pascal

#8 Post autor: zbyti »

rime. pisze:
13 sty 2021, 02:45
Dzięki, pobrałem programy bezpośrednio z repozytorium, teraz wygląda to dobrze. Poniższe zostawiam dla tych którzy też szukają niższego progu wejścia ;-D

Kod: Zaznacz cały

mp pas6502_test.pas -target:c64
mads pas6502_test.a65 -x -i:base -o:pas6502_test.prg
mimo wszystko dałbym:

Kod: Zaznacz cały

mp pas6502_test.pas -t c64 -z 10 -o
bo chyba dla C64 trzeba podać inne miejsce dla programowego stosu niż jest domyślnie dla A8, spojrzę jeszcze do kodu czy target to rozróżnia, ale ja używam flagi "z" i "o".

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Re: Mad Pascal

#9 Post autor: zbyti »

@rime tak, dla C64 i C+4 musisz posłużyć się flagą "z" i określić początek stosu programowego dla MP na stronie zerowej, proponuję 10 (czyli $10).

Awatar użytkownika
Steffan
Posty: 291
Rejestracja: 04 maja 2019, 19:43
Grupa: BooM!

Re: Mad Pascal

#10 Post autor: Steffan »

zbyti pisze:
13 sty 2021, 12:37
@rime tak, dla C64 i C+4 musisz posłużyć się flagą "z" i określić początek stosu programowego dla MP na stronie zerowej, proponuję 10 (czyli $10).
Z tym 10 to pewnie chodzi o $a?
Tak nie bardzo kumam o co chodzi z tym stosem programowym. Jeśli będziemy tam zapisywać "swój" odrębny stos (bo tak to rozumiem) nadpiszemy sobie komórki strony zerowej i będzie zonk. Pewnie coś kręcę, więc mnie popraw.

Steffan
Różne rodzaje so kamadore, ale sześćdziesiąte czwarte je najfajniejsze!

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Re: Mad Pascal

#11 Post autor: zbyti »

Steffan pisze:
13 sty 2021, 13:43
Z tym 10 to pewnie chodzi o $a?
Tak nie bardzo kumam o co chodzi z tym stosem programowym. Jeśli będziemy tam zapisywać "swój" odrębny stos (bo tak to rozumiem) nadpiszemy sobie komórki strony zerowej i będzie zonk. Pewnie coś kręcę, więc mnie popraw.
MP od razu zakłada, że podajesz liczbę szesnastkowo, więc pisząc -z 10 chodzi i 16 komórkę na stronie zerowej.

Nie jestem ekspertem od C+4 ale on chyba ma stronę zerową z grubsza podzieloną tak jak C64, czyli $0-$7f zmienne BASIC, nie używamy BASIC, więc możemy nadpisywać, $80-$ff system, do póki nie wyłączymy OS nie ruszamy ;)

Stos programowy jest wykorzystywany przy np. rekurencji, są też na stronie zerowej zmienne pomocnicze MP wykorzystywane przy obliczeniach.

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

Re: Mad Pascal

#12 Post autor: zbyti »

OK, zrobiłem PR i jak wejdzie, nie będzie potrzeba dla C64 i C+4 podawać adresu dla stosu jeżeli kogoś zadowolą domyślne ustawienie czyli $10.

https://github.com/tebe6502/Mad-Pascal/pull/12

zbyti
Posty: 16
Rejestracja: 12 sty 2021, 14:26

sieve 1899 C64 Vs. C+4 Vs. A8

#13 Post autor: zbyti »

Kod: Zaznacz cały

// Eratosthenes Sieve benchmark 1899

const
 size = 8192;
 iter_max = 10;

var
  flags: array [0..size] of boolean;

  iter: byte;
  ticks: word = 0;

{$ifdef c4p}
  i: word absolute $70;
  k: word absolute $72;
  prime: word absolute $74;
  count: word absolute $76;
  clock1 : byte absolute $a4;
  clock2 : byte absolute $a5;
{$endif}
{$ifdef c64}
  i: word absolute $70;
  k: word absolute $72;
  prime: word absolute $74;
  count: word absolute $76;
  clock1 : byte absolute $a1;
  clock2 : byte absolute $a2;
{$endif}
{$ifdef atari}
  i: word absolute $e0;
  k: word absolute $e2;
  prime: word absolute $e4;
  count: word absolute $e6;
  clock1 : byte absolute $13;
  clock2 : byte absolute $14;
{$endif}

begin

	writeln(iter_max,' ITERATIONS');
	pause; clock2 := 0; clock1 := 0;

	for iter := iter_max-1 downto 0 do begin

		fillchar(flags, sizeof(flags), true);

		count := 0;

		for i:=0 to size do
			if flags[i] then begin

				prime := i*2 + 3;
				k := prime + i;

				while (k <= size) do begin
					flags[k] := false;
					inc(k, prime);
				end;
				inc(count);
			end;
	end;

 ticks := clock2 + (clock1 * 256);

 writeln(ticks, ' TICKS');
 writeln(count, ' PRIMES');

 while true do;

end.

Screenshot_2021-01-17_16-51-06.png
Screenshot_2021-01-17_16-51-06.png (7.35 KiB) Przejrzano 35 razy
Screenshot_2021-01-17_16-37-22.png
Screenshot_2021-01-17_16-37-22.png (9.71 KiB) Przejrzano 35 razy
Screenshot_2021-01-17_16-33-43.png
Screenshot_2021-01-17_16-33-43.png (46.09 KiB) Przejrzano 35 razy

ODPOWIEDZ