Mad-Pascal

Mad-Pascal (MP) jest 32-bitowym kompilatorem Turbo Pascala dla Atari XE/XL. W założeniu jest kompatybilny z Free Pascal Compilator (FPC) (przełącznik -MDelphi powinien być aktywny), co oznacza możliwość otrzymania kodu uruchomieniowego dla XE/XL, PC i każdej innej platformy dla której istnieje FPC. MP nie jest portem FPC, został napisany na podstawie kompilatorów SUB-Pascal (2009), XD-Pascal (2010), których autorem jest Vasiliy Tereshkov.

Źródła dostępne na GitHub wraz z release dla systemu Windows.

Historia

1.6.9

  • poprawiona alokacja pamięci dla tablic [0..0], wymuszany jest wstępnie 'ABSOLUTE $0000', oszczędzamy 1 bajt pamięci
  • dodana możliwość deklaracji tablic bez podania ich rozmiaru, np.:
var tab: array of byte = [1,3,4,3,1];
var tb: array of char = 'abcdefghij';
  • nowa dyrektywa kompilatora {$bin2csv filename} pozwala inicjować tablice np.:
var tb: array of byte = [ {$bin2csv filename} ];
  • nowa dyrektywa kompilatora {$optimization loopunroll}, {$optimization noloopunroll}, dokonuje rozpętlenia pętli FOR przy stałych parametrach
  • nowy moduł BLOWFISH pozwalający szyfrować, deszyfrować ciągi znakowe wg podanego klucza
  • nowy przykład a8\AES-Rijndeal

1.6.7-1.6.8

  • rezygnacja z rozszerzania typu dla wyrażeń z SHR
  • nowy typ zasobu SAPR, SAPRPLAY
  • dla RMTPLAY jako drugi parametr można podać adres dla zmiennych na stronie zerowej
  • SizeOfResource(variable, name)
  • unit SAPLZSS
  • unit SHANTI
  • unit SHA1
  • unit xSFX
  • unit SYSTEM: NtoBE, RorByte, RorWord, RorDWord, RolByte, RolWord, RolDWord, SarShortint, SarSmallint, SarLongint
  • możliwość zaincjowania tablicy typu CHAR przez STRING (jeśli string jest krótszy zostaną wstawione spacje), np.:
    tab: array [0..15] of char = '0123456789ABCDEF';
  • naprawione przekazywanie wartości funkcji przez tablice
  • dodana obsluga przerwania VBLKI (natychmiastowe) przez SetIntVec, GetIntVec (https://mads.atari8.info/doc/pl/przerwania/)
  • przepisany kod kompilatora na moddzielne moduły
  • przepisany kod obsługi tablic ze wskaźnikami do rekordów tab: array [0..x] of record^
  • dodana optymalizacja 'Common head/tail Sequence coalescing'

1.6.6

  • poprawiona implementacja EXIT
  • dodano możliwość generowania kodu dla RAW (-target)
  • dodano obsługę modyfikatora INLINE dla procedur i funkcji
  • dodano możliwość zadeklarowania zmiennej na stronie zerowej poprzez użycie modyfikatora REGISTER
  • dodana obsługa typu TEXTFILE (TEXT)
  • unit INIFILES
  • unit ZX2
  • unit SYSUTILS: CompareMem, TryStrToInt
  • unit SYSTEM: CompareByte, Pos, Delete
  • poprawiono przekazywanie parametrów do obiektów (OBJECT) bez udziału stosu programu :STACKORIGIN (w większości przypadków)
  • dodano możliwość oznaczenia zmiennej jako ulotnej [volatile]
    [volatile] vcount: byte absolute $d40b;
  • dla OBJECT dodano metody CONSTRUCTOR, DESTRUCTOR
  • dodano obsługę makr {$define label (parametry) := wyrażenie}
  • dodana konstrukcja 'FOR element IN array' dla tablic nie przekraczających 256 bajtów
  • więcej wolnej pamięci na stronie zerowej, wskaźniki FXPTR, PSPTR są teraz alokowane w zależności od tego czy są używane
  • dodana obsługa typu FLOAT16
  • dodana obsługa typu proceduralnego

1.6.5

  • przepisana obsługa CASE OF
  • przepisany kod optymalizacji dla tablic nie przekraczających 256 bajtów
  • optymalizacja dla warunków '>', '<='
  • dodana alokacja pamięci dla tablic typu STRING (do tej pory odkładany był tylko wskaźnik, działało to jak 'tablica ^string')
  • dodana nowa platforma, Commodore C4 Plus
  • unit GRAPHICS: procedura Font(charset: pointer);
  • unit STRINGUTILS
  • unit MISC, RMT, CMC, MPT: DetectAntic
  • unit SYSTEM zmieniony w celu uwzględnienia platform ATARI, C64, C4Plus
  • unit ZX0
  • unit HCM2
  • dodano obsługa $resource (RCDATA, RCASM) dla platform C64, C4Plus, zasoby są sortowane według rosnących adresów
  • rozszerzony zasób RCDATA o możliwość określenia ofsetu dla ładowanego pliku
  • dodano obsługę składni zgodnej z Pascalem dla bloku ASM, nie są wymagane nawiasy { }
  • dodana nowa dyrektywa {$codealign proc = wartość}, {$codealign loop = wartość} pozwalająca na wyrównanie wygenerowanego kodu

1.6.4

  • procedury mnożenie u8x8, u16x16 zastąpione kodem z CC65
  • dodanie kodu resetujacego POKEY-a na początku uruchomienia programu
  • optymalizacje wyrażeń warunkowych IF () and () and ... ; IF () or () or ...
  • optymalizacja CMP_SHORTINT, CMP_SMALLINT
  • GRAPH, FASTGRAPH: SetActiveBuffer, SetDisplayBuffer, NewDisplayBuffer, SwitchDisplayBuffer, przykład demoeffects\lines2.pas, line3.pas, line4.pas
  • GRAPH: procedure Ellipse(X, Y, StAngle, EndAngle, xRadius,yRadius: Word);
  • MATH: Hypot
  • SYSTEM: Length(string_array[element])
  • SYSTEM: GetMem, FreeMem
  • SYSTEM: IntToStr(CARDINAL), Str(CARDINAL, STRING)
  • SYSUTILS: ByteToStr(BYTE): STRING
  • SYSUTILS: poprawione FindFirst, StrToFloat
  • SYSTEM: poprawione Val(string, real, code) ; Val(string, single, code)
  • nowy unit CIO: Opn, Cls, Get, Put, BGet, BPut, XIO
  • nowy unit SIODISK, wydzielony z SYSTEM
  • nowy unit S2, zintegrowany z instalatorem handlera VBXE S2: (S_VBXE.SYS)
  • nowy unit DEFLATE, realizujący dekompresję DEFLATE (procedure unDEF), przykład compression\undef.pas
  • nowy unit LZ4, realizujący dekompresję LZ4 z pamięci lub dysku (procedure unLZ4), przykład compression\unlz4.pas, unlz4_stream.pas
  • nowy unit APLIB, realizujący dekompresję apLib z pamięci RAM lub dysku (procedure unApl), przykład compression\unapl.pas, unapl_stream.pas
  • nowy unit CRC: function crc32(crc: cardinal; buf: Pbyte; len: word)
  • nowy modyfikator procedur/funkcji PASCAL, powodujący przydzielenie/zwolnienie nowego bloku pamięci dla zmiennych przy każdym wywołaniu procedury/funkcji, przykład 'math\evaluate.pas'
  • dodana możliwość wyłączenia pamięci ROM z zachowaniem działania systemu, {$DEFINE ROMOFF}
  • krótsze nazwy przełacznikow -zpage (-z), -stack (-s), -data (-d), -code (-c), -define (-d), -ipath (-i)
  • dodana możliwość generowania kodu dla C64 (-t c64)

1.6.3

  • poprawki, optymalizacje
  • SYSUTILS: Trim
  • SYSTEM: PByte, PByteArray, PWord
  • GRAPH, FASTGRAPH: TFrameBuffer, DisplayBuffer, FrameBuffer, SwitchBuffer, Scanline
  • BLIBS: unit GR10PP
  • LIB: unit GR4PP

1.6.0 - 1.6.2

  • nowy unit EFAST dla przyspieszenia wyprowadzania znaków na urządzenie E:
  • SYSTEM: function Copy(var S: String; Index: Byte; Count: Byte): String;
  • SYSTEM: Palette, HPalette
  • dodana obsługa tablic jednowymiarowych typu ^RECORD (wskaznik do rekordu)
  • optymalizacja bloków warunkowych, generowany jest możliwie najkrótszy, najszybszy kod wynikowy
  • dodany typ PChar, [link]https://www.freepascal.org/docs-html/rtl/system/pchar.html
  • dodana możliwość zwracania wartości funkcji przez typ wyliczeniowy
  • dodany nowy przełącznik -define:symbol
  • dodany nowy przełącznik -ipath:includepath

1.5.9 - 1.6.0

  • SYSTEM: TDateTime
  • GRAPH, FASTGRAPH: Arc, PieSlice, TLastArcCoords, LastArcCoords
  • SYSUTILS: Now, Date, DateToStr, DecodeDate, DecodeDateTime, DecodeTime, EncodeDate, EncodeDateTime, EncodeTime, IsLeapYear, BoolToStr, StrToBool
  • STRUTILS: AddChar, AddCharR, PadLeft, PadRight
  • dodana obsługa {$INCLUDE %DATE%}, {$INCLUDE %TIME%}, [link]https://www.freepascal.org/docs-html/prog/progsu41.html
  • przełączniki -CODE:, -DATA:, -STACK:, -ZPAGE: domyślnie wymagają podania wartości HEX bez znaku początkowego '$'

1.5.8

  • GRAPHICS: Font, FontInitialize, FillRect, TextOut, TextWidth, MoveTo, LineTo
  • SYSTEM: FileMode (RESET), [fmOpenRead, fmOpenWrite, fmOpenAppend, fmOpenReadWrite]
  • dodana obsługa dyrektyw {$info user_defined}, {$warning user_defined}, {$error user_defined}, {$include filename}, {$resource filename}
  • akceptuje zapis PROGRAM (par1, par2 ...)
  • poprawione FillFlood, dodane FillFloodH (wypełnianie poziomymi liniami)
  • kompilator generuje krótszy kod gdy procedura/funkcja nie ma parametrów
  • dostęp do definicji .DEFINE z poziomu ASM, MAIN.@DEFINES.nazwa
  • procedury/funkcje INTERRUPT niezależnie czy zostaną użyte kompilator zawsze wygeneruje dla nich kod
  • poprawiona optymalizacja bloków REPEAT UNTIL
  • dodana informacja o czasie kompilacji
  • dodana obsługa inicjalizacji tablic dwuwymiarowych stałych i zmiennych

1.5.6 - 1.5.7

  • SYSUTILS: Click
  • SYSTEM: Sqrt(Integer): Single
  • MATH: Sign
  • dodana możliwość użycia nazwy funkcji dla zwracanej wartości, dotychczas tylko przez RESULT
  • dodana obsługa tablic typu STRING
  • dodana obsługa dyrektywy {$LIBRARYPATH path1;path2;...}
  • nowa biblioteka BLIBS
  • nowa dokumentacja dla LIB, BLIBS wygenerowana przez PASDOC

1.5.3 - 1.5.5

  • CRT: TextMode
  • SYSUTILS: ExtractFilePath
  • SYSTEM: EoLn
  • dodana obsługa linii poleceń z poziomu DOS II/D dla ParamCount, ParamStr
  • OBJECT, można zdefiniować je bez zmiennych, tylko same metody
  • OBJECT, można wywołać metodę z poziomu metody
  • dodana automatyczna konwersja wyrażeń typu INTEGER na REAL

1.5.2

  • nowy typ FLOAT jako odpowiednik typu SINGLE
  • SYSTEM unti: FileSize (SDX)
  • SYSTEM unit: EXP:Single, LN:Single, LN:Real, EXP:Real (wysoka precyzja obliczeń)
  • SYSUTILS unit: AnsiUpperCase, ExtractFileExt
  • TYPES unit: Bounds, CenterPoint, EqualRect, InflateRect, IntersectRect, IsRectEmpty, NormalizeRect, OffsetRect, Point, PointsEqual, PtInRect, PtInEllipse, Rect, RectWidth, RectHeight, Size, UnionRect
  • IMAGE unit: LoadMIC, LoadPIC, LoadBMP, LoadPCX, LoadGIF
  • VIMAGE unit: LoadVBMP, LoadVPCX, LoadVGIF
  • GRAPH, FASTGRAPH unit: SetClipRect, ClipLine, FillRect(TRect), Rectangle(TRect)

1.5.1

  • dodane nowe przełączniki -CODE:$address, -DATA:$address -STACK:$address, -ZPAGE:$address
  • SYSTEM unit: RandomF (Result as Single), VAL (Integer, Single)
  • GRAPH, FASTGRAPH unit: Bar, Bar3D, GetX, GetY, MoveRel, FloodFill
  • MATH unit: RandomRange, RandomRangeF, RandG (gaussian distributed random number)
  • CRT unit: SOUND (działa identycznie jak SOUND w Atari BASIC)
  • VBXE unit: TVBXEMemoryStream
  • dodany komunikat ostrzeżenia 'Comparison might be always true/false due to range of constant and expression'
  • zasoby RCASM, CMCPLAY, MPTPLAY można teraz ładować pod ROM
  • dodana możliwość oznaczenia kodowania ciągu znakowego jako internal ANTIC-a poprzez znak tyldy ~, np.:
txt0: string = 'Atari'~;      // ciąg w kodach ANTIC-a
txt1: string = 'Spectrum'*~;  // ciąg w inwersie w kodach ANTIC-a

1.5.0

  • poprawiona i uzupełniona inicjalizacja tablic typu POINTER
  • poprawiona i uzupełniona inicjalizacja zmiennych typu wyliczeniowego
  • wprowadzony typ LONGWORD, DWORD, UINT32 jako odpowiednik CARDINAL
  • wprowadzony typ LONGINT jako odpowiednik INTEGER
  • zreorganizowane typy rzeczywiste, typ ShortReal (fixed point Q8.8), Real (fixed point Q24.8), Single (32bit IEEE-754)
  • unit SYSTEM (const SINGLE): NaN, Infinity, NegInfinity
  • unit SYSTEM (type SINGLE): SIN, COS, ABS, SQRT, ISQRT, ROUND, TRUNC
  • unit MATH (type SINGLE): LOG2, LOG10, LOGN, IsNaN
  • dla WRITE/WRITELN akceptowane i ingorowane jest formatowanie wyniku, np.: writeln(f:8:8)

1.4.8 / 1.4.9

  • zmniejszenie wskaźnika stosu programowego w przypadku wywołania funkcji bez odebrania jej wartości
  • lepsza ocena możliwości ustalenia adresu stałej/zmiennej, dodany komunikat "Can't take the address of constant expressions"

1.4.7

  • optymalizacja dla imulBYTE, imulWORD, imulCARD, mulSHORTINT, mulSMALLINT, mulINTEGER
  • dodana obsługa wskaźnika rekordu, np.:
type
  TPoint = record x,y: smallint end;
var
  a,b: ^TPoint;
begin
  a^.y := b^.x;
  a^ := b^;
end.
  • dodana obsługa sekcji INITIALIZATION w modułach UNIT
  • dodany nowy typ EXTMEM dla pliku resource $R, pozwalajacy ładować dane do pamięci dodatkowej
  • dodany nowy typ OBJECT, czyli RECORD z dodatkowymi metodami
type
  TMemoryStream = Object

  Position: cardinal;
  Size: cardinal;

  procedure Create;
  procedure ReadBuffer(var Buffer; Count: word);
  procedure WriteBuffer(var Buffer; Count: word);

  end;
  • poprawione biblioteki CMC, MPT, RMT

1.4.6

  • dodana obsługa dyrektyw warunkowych $IFDEF, $IFNDEF, $ELSE, $ENDIF, $DEFINE, $UNDEF przez DMSC
{$define test}

const
  {$ifdef test}
  a=1;
  {$else}
  a=2;
  {$endif}
  • dodana możliwość przekazania wartości funkcji przez EXIT(expression)
  • dodana podstawowa implementacja dla typu wyliczeniowego (w pliku wynikowym nie są zapisywane nazwy etykiet)
  • dodana obsługa tablic dwuwymiarowych

1.4.4/1.4.5

  • poprawione porównanie typów tego samego rozmiaru ale o przeciwnych znakach
  • dodana możliwość użycia klauzuli USES w blokach modułów UNIT
  • dodany wymóg deklaracji funkcji/procedur w sekcji INTERFACE modułów UNIT
  • poprawione zauważone błędy optymalizatora

1.4.3

  • dodana możliwość zwrócenia wartości funkcji przez RECORD, np:
  var p: TPoint;
  p:=Point(x,y);
  • {$f page} FAST_MUL, procedury szybkiego mnożenia dla BYTE, SHORTINT, WORD, SMALLINT, SINGLE
  • SYSTEM: ReadConfig, ReadSector, WriteSector
  • SYSTEM: Point, Rect, Bounds, PointsEqual link
  • DOS: CurrentMinuteOfDay, CurrentSec100OfDay, CurrentSecondOfDay, MinuteOfDay, MinutesToTime, SecondOfDay, SecondsToTime link
  • MATH: Power, ArcTan2, InRange, EnsureRange, CycleToRad, DegNormalize, DegToGrad, DegToRad, DivMod, GradToDeg, GradToRad, RadToCycle, RadToDeg, RadToGrad link
  • nowy typ LABEL
  • dodana obsługa GOTO label

1.4.1 / 1.4.2

  • optymalizacja kodu wynikowego 6502 generowanego dla pętli FOR
  • poprawiony odczyt plików include i resource
  • MISC: DetectCPUSpeed
  • dodatkowy typ danych rzeczywistych SINGLE <-128..127>

1.4.0

  • w parametrach formalnych procedur i funkcji dodana możliwość podania typu UNTYPED (tylko przez VAR), np.
procedure move(var x,y; count: word);
begin
end;

move(tab[100], tab[200], 50);
  • SYSTEM: poprawki dla FILLCHAR, FILLBYTE, MOVE
 fillchar(pointer($bc40+40*8), 100, ord('a'));
 fillchar(scr[40*8], 100, ord('a'));            // teraz takie wywołanie też jest możliwe
  • funkcja INTTOREAL usunięta, zastąpiona przez wbudowaną konwersję typu REAL, np.
var
  f: real;
  i: word;

f:=real(i);
  • FASTGRAPH: SetClipRect, ClipLine (Cohen-Sutherland algorithm)
  • poprawki dla {$i filename}, poprawne liczenie linii kompilowanego programu

1.3.8

  • SYSTEM: RANDOM(RANGE: BYTE): BYTE; RANDOM(RANGE: INTEGER): SMALLINT;
  • CRT: WHEREX, WHEREY
  • SYSUTILS: BEEP
  • dodatkowy znak * po apostrofie ' oznacza inwers znaków, np.:

writeln('inwers'*'bez inwersu');

1.3.7

  • dodana możliwość ładowania bloku resource {$R} pod adres tablicy

1.3.6

  • dodane rozkazy GetIntVec, SetIntVec w zastępstwie rozkazu Intr
  • umożliwione zwracanie wartości RESULT dla funkcji poprzez tablice
  • poprawki dla MOVE (downwards, upwards)
  • optymalizacja ASM dla procedur/funkcji POKE, DPOKE, PEEK, DPEEK, FILLCHAR, MOVE, INTTOREAL
  • SYSTEM: ParamCount, ParamStr (SDX, BWDOS)

1.3.5

  • dodana możliwość odczytu adresu stałej, np.:

const tb: array [0..0] of byte = ( lo(word(@tb)) ); - dodany odczyt wektorów DLI, VBL przez rozkaz INTR

intr(rVBL, label);
intr(rDLI, label);

1.3.4

  • dodana dodatkowa informacja o zajmowanej pamięci przez kolejne kompilowane moduły
  • dodany nowy moduł VBXE (tryb OVERLAY, BLITTER)
  • dodana obsługa błędów dla operacji I/O {I+} {I-} IOCHECK ON/OFF
  • dwie dodatkowe poprawki Greblusa dla $I, $R z myślą o działaniu w środowisku Linuxa

1.3.3

  • Greblus dodał poprawki umożliwiające działanie kompilatora z Linux-em
  • dodana możliwość zaincjowania wskaźnika
tmp: byte;
p: pointer = @tmp;
a: ^byte = @tmp;
  • dodana możliwość przypisania rekordu
type a = record x,y: byte end;
var k,w: a;
k:=w;
  • GRAPH: SetVideoBank, SetColorMapDimensions, SetColorMapEntry
  • VBXE: GetXDL, SetXDL, RunBlit, ClrVideoBank

1.3.2

  • DOS: GetTime, SetTime
  • MATH: Ceil
  • SYSUTILS: GetTickCount
  • FindFirst ... obsługa Attributes
  • wbudowanie funkcji w kompilator: INT, FRAC, TRUNC, ROUND, ODD

1.3.1

  • dodana obsługa rekordów RECORD
  • {$i filename}
  • {$r filename}, Resource Type: RCDATA, DOSFILE, RELOC, RMT, MPT, CMC
  • dodany przełącznik -o Optimize code
  • możliwość wymuszenia typu dla CONST
  const
      a: word = 5;     // WORD
      b = 5;           // BYTE
  • dodana obsługa modyfikatorów INTERRUPT, FORWARD, REGISTER dla procedur i funkcji
  • dodana obsługa mapy kolorów (40x30x8x8) VBXE (moduł GRAPH, CRT), SetColorMap, SetColorCell, SetVideoBank
  • SYSUTILS: TSearchRec, FindFirst, FindNext, FindClose
  • GRAPH, FASTGRAPH: FillRect, FillEllipse
  • SYSTEM: ODD, INT, LOW, HIGH, SIZEOF, INTR (INTERRUPT_NUMBER), BinStr, OctStr, HexStr, Pause, Sound, NoSound, Concat
  • RMT: RMTINIT, RMTPLAY, RMTSTOP
  • MPT: MPTINIT, MPTPLAY, MPTSTOP
  • CMC: CMCINIT, CMCPLAY, CMCSTOP