123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- unit system;
- interface
- {$define FPC_IS_SYSTEM}
- { The heap for ZX Spectrum is implemented
- in tinyheap.inc include file,
- but it uses default SysGetMem names }
- {$define HAS_MEMORYMANAGER}
- { Use AnsiChar for files }
- {$define FPC_ANSI_TEXTFILEREC}
- {$define FPC_STDOUT_TRUE_ALIAS}
- {$define FPC_STDERR_IS_ALIAS_FOR_STDOUT}
- {$I systemh.inc}
- {$I tnyheaph.inc}
- {$ifndef FPUNONE}
- {$ifdef FPC_HAS_FEATURE_SOFTFPU}
- {$define fpc_softfpu_interface}
- {$i softfpu.pp}
- {$undef fpc_softfpu_interface}
- {$endif FPC_HAS_FEATURE_SOFTFPU}
- {$endif FPUNONE}
- var
- { Mem[] support }
- mem : array[0..$7fff-1] of byte absolute $0;
- { memw : array[0..($7fff div sizeof(word))-1] of word absolute $0:$0;
- meml : array[0..($7fff div sizeof(longint))-1] of longint absolute $0:$0;}
- { OpenChannel(2) opens the upper screen
- OpenChannel(1) opens the lower screen
- OpenChannel(3) opens the ZX Printer }
- procedure OpenChannel(Chan: Byte);
- procedure PrintChar(Ch: AnsiChar);
- procedure PrintLn;
- procedure PrintShortString(const s: ShortString);
- procedure PrintHexDigit(const d: byte);
- procedure PrintHexByte(const b: byte);
- procedure PrintHexWord(const w: word);
- procedure Ink(colour: Byte);
- procedure Paper(colour: Byte);
- procedure GotoXY(X, Y: Byte);
- function ReadKey: AnsiChar;
- function KeyPressed: Boolean;
- implementation
- const
- LineEnding = #13;
- { LFNSupport is a variable here, defined below!!! }
- DirectorySeparator = '\';
- DriveSeparator = ':';
- ExtensionSeparator = '.';
- PathSeparator = ';';
- AllowDirectorySeparators : set of AnsiChar = ['\','/'];
- AllowDriveSeparators : set of AnsiChar = [':'];
- { FileNameCaseSensitive and FileNameCasePreserving are defined separately below!!! }
- maxExitCode = 255;
- MaxPathLen = 256;
- { Default filehandles }
- UnusedHandle = $ffff;{ instead of -1, as it is a word value}
- StdInputHandle = 0;
- StdOutputHandle = 1;
- StdErrorHandle = 2;
- FileNameCaseSensitive : boolean = false;
- FileNameCasePreserving: boolean = false;
- CtrlZMarksEOF: boolean = true; (* #26 is considered as end of file *)
- sLineBreak = LineEnding;
- DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsCR;
- var
- fpc_stackarea_start: word; external name '__fpc_stackarea_start';
- fpc_stackarea_end: word; external name '__fpc_stackarea_end';
- __heapsize: Word;external name '__heapsize';
- __fpc_initialheap: array[0..0] of byte;external name '__fpc_initialheap';
- {$I system.inc}
- {$I tinyheap.inc}
- {$ifndef FPUNONE}
- {$ifdef FPC_HAS_FEATURE_SOFTFPU}
- {$define fpc_softfpu_implementation}
- {$i softfpu.pp}
- {$undef fpc_softfpu_implementation}
- { we get these functions and types from the softfpu code }
- {$define FPC_SYSTEM_HAS_float64}
- {$define FPC_SYSTEM_HAS_float32}
- {$define FPC_SYSTEM_HAS_flag}
- {$define FPC_SYSTEM_HAS_extractFloat64Frac0}
- {$define FPC_SYSTEM_HAS_extractFloat64Frac1}
- {$define FPC_SYSTEM_HAS_extractFloat64Exp}
- {$define FPC_SYSTEM_HAS_extractFloat64Frac}
- {$define FPC_SYSTEM_HAS_extractFloat64Sign}
- {$define FPC_SYSTEM_HAS_ExtractFloat32Frac}
- {$define FPC_SYSTEM_HAS_extractFloat32Exp}
- {$define FPC_SYSTEM_HAS_extractFloat32Sign}
- {$endif FPC_HAS_FEATURE_SOFTFPU}
- {$endif FPUNONE}
- procedure randomize;
- begin
- end;
- function GetProcessID: SizeUInt;
- begin
- GetProcessID:=0;
- end;
- function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;
- begin
- result := stklen;
- end;
- procedure system_exit;
- begin
- repeat
- until false;
- end;
- var
- save_iy: Word; public name 'FPC_SAVE_IY';
- LastKey: AnsiChar absolute 23560;
- function ReadKey: AnsiChar;
- begin
- repeat
- ReadKey:=LastKey;
- until ReadKey<>#0;
- LastKey:=#0;
- end;
- function KeyPressed: Boolean;
- begin
- KeyPressed:=LastKey<>#0;
- end;
- procedure OpenChannel(Chan: Byte);assembler;
- asm
- ld iy,(save_iy)
- ld a, (Chan)
- push ix
- call 5633
- pop ix
- ld (save_iy),iy
- end;
- procedure PrintChar(Ch: AnsiChar);assembler;
- asm
- ld iy,(save_iy)
- ld a, (Ch)
- push ix
- rst 16
- pop ix
- ld (save_iy),iy
- end;
- procedure PrintLn;
- begin
- PrintChar(#13);
- end;
- procedure PrintHexDigit(const d: byte);
- begin
- { the code generator is still to broken to compile this, so we do it in a stupid way }
- { if (d >= 0) or (d <= 9) then
- PrintChar(AnsiChar(d + Ord('0')))
- else if (d >= 10) and (d <= 15) then
- PrintChar(AnsiChar(d + (Ord('A') - 10)));}
- if d=0 then
- PrintChar('0')
- else if d=1 then
- PrintChar('1')
- else if d=2 then
- PrintChar('2')
- else if d=3 then
- PrintChar('3')
- else if d=4 then
- PrintChar('4')
- else if d=5 then
- PrintChar('5')
- else if d=6 then
- PrintChar('6')
- else if d=7 then
- PrintChar('7')
- else if d=8 then
- PrintChar('8')
- else if d=9 then
- PrintChar('9')
- else if d=10 then
- PrintChar('A')
- else if d=11 then
- PrintChar('B')
- else if d=12 then
- PrintChar('C')
- else if d=13 then
- PrintChar('D')
- else if d=14 then
- PrintChar('E')
- else if d=15 then
- PrintChar('F')
- else
- PrintChar('?');
- end;
- procedure PrintHexByte(const b: byte);
- begin
- PrintHexDigit(b shr 4);
- PrintHexDigit(b and $F);
- end;
- procedure PrintHexWord(const w: word);
- begin
- PrintHexByte(Byte(w shr 8));
- PrintHexByte(Byte(w));
- end;
- procedure Ink(colour: Byte);
- begin
- PrintChar(#16);
- PrintChar(AnsiChar(colour));
- end;
- procedure Paper(colour: Byte);
- begin
- PrintChar(#17);
- PrintChar(AnsiChar(colour));
- end;
- procedure GotoXY(X, Y: Byte);
- begin
- PrintChar(#22);
- PrintChar(AnsiChar(Y-1));
- PrintChar(AnsiChar(X-1));
- end;
- procedure PrintShortString(const s: ShortString);
- var
- i: byte;
- begin
- for i:=1 to length(s) do
- PrintChar(s[i]);
- end;
- {*****************************************************************************
- SystemUnit Initialization
- *****************************************************************************}
- procedure InitZXHeap;
- begin
- RegisterTinyHeapBlock_Simple_Prealigned(@__fpc_initialheap,__heapsize);
- end;
- procedure SysInitStdIO;
- begin
- OpenStdIO(Input,fmInput,StdInputHandle);
- OpenStdIO(Output,fmOutput,StdOutputHandle);
- {$ifndef FPC_STDERR_IS_ALIAS_FOR_STDOUT}
- OpenStdIO(ErrOutput,fmOutput,StdErrorHandle);
- {$endif FPC_STDERR_IS_ALIAS_FOR_STDOUT}
- {$ifndef FPC_STDOUT_TRUE_ALIAS}
- OpenStdIO(StdOut,fmOutput,StdOutputHandle);
- OpenStdIO(StdErr,fmOutput,StdErrorHandle);
- {$endif FPC_STDOUT_TRUE_ALIAS}
- end;
- begin
- StackBottom:=@fpc_stackarea_start;
- StackLength:=(@fpc_stackarea_end-@fpc_stackarea_start)+1;
- { To be set if this is a GUI or console application }
- IsConsole := TRUE;
- {$ifdef FPC_HAS_FEATURE_DYNLIBS}
- { If dynlibs feature is disabled,
- IsLibrary is a constant, which can thus not be set to a value }
- { To be set if this is a library and not a program }
- IsLibrary := FALSE;
- {$endif def FPC_HAS_FEATURE_DYNLIBS}
- { Setup heap }
- InitZXHeap;
- SysInitExceptions;
- {$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
- initunicodestringmanager;
- {$endif def FPC_HAS_FEATURE_UNICODESTRINGS}
- { Setup stdin, stdout and stderr }
- SysInitStdIO;
- { Reset IO Error }
- InOutRes:=0;
- {$ifdef FPC_HAS_FEATURE_THREADING}
- InitSystemThreads;
- {$endif}
- end.
|