Processing System Procedures
All Turbo Pascal system procedures are processed by this function. Each system procedure has a processing function with optional parameter which is used when two or more procedures share the same processing function. Processing function returns the offset to intermediate code subroutine.
Type TSystemProcedure = Record
Proc: Function: Word;
ProcParameter: Word;
end;
Const stProcedures: Array [$00..$2B] of TSystemProcedure = (
(Proc: Proc_New; ProcParameter: 0),
(Proc: Proc_Write_Writeln; ProcParameter: SysProc_WriteEnd),
(Proc: Proc_Write_Writeln; ProcParameter: SysProc_WriteLine),
(Proc: Proc_Read_Readln; ProcParameter: SysProc_ReadEnd),
(Proc: Proc_Read_Readln; ProcParameter: SysProc_ReadLine),
(Proc: Proc_Dispose; ProcParameter: 0),
(Proc: Proc_Mark_Release; ProcParameter: SysProc_MarkPtr),
(Proc: Proc_Mark_Release; ProcParameter: SysProc_ReleasePtr),
(Proc: Proc_Insert; ProcParameter: 0),
(Proc: Proc_Delete; ProcParameter: 0),
(Proc: Proc_Assign; ProcParameter: 0),
(Proc: Proc_Reset_Rewrite; ProcParameter: SysProc_ResetFile),
(Proc: Proc_Reset_Rewrite; ProcParameter: SysProc_RewriteFile),
(Proc: Proc_Close; ProcParameter: 0),
(Proc: Proc_Seek; ProcParameter: 0),
(Proc: Proc_Erase; ProcParameter: 0),
(Proc: Proc_Rename; ProcParameter: 0),
(Proc: Proc_Halt_RunError; ProcParameter: SysProc_HaltTurbo),
(Proc: Proc_BREAK_CONTINUE_Exit; ProcParameter: Ofs (LastJumpToProgramBlockExit)),
(Proc: Proc_GetMem; ProcParameter: 0),
(Proc: Proc_FreeMem; ProcParameter: 0),
(Proc: Proc_Truncate; ProcParameter: 0),
(Proc: Proc_FillChar; ProcParameter: 0),
(Proc: Proc_Move; ProcParameter: 0),
(Proc: Proc_Randomize; ProcParameter: 0),
(Proc: Proc_Str; ProcParameter: 0),
(Proc: Proc_Val; ProcParameter: 0),
(Proc: Proc_GetDir; ProcParameter: 0),
(Proc: Proc_ChDir_MkDir_RmDir; ProcParameter: SysProc_DirSet),
(Proc: Proc_ChDir_MkDir_RmDir; ProcParameter: SysProc_DirCreate),
(Proc: Proc_ChDir_MkDir_RmDir; ProcParameter: SysProc_DirRemove),
(Proc: Proc_Append_Flush; ProcParameter: SysProc_AppendText),
(Proc: Proc_Append_Flush; ProcParameter: SysProc_FlushText),
(Proc: Proc_Inc_Dec; ProcParameter: $00),
(Proc: Proc_Inc_Dec; ProcParameter: $28),
(Proc: Proc_BlockRead_BlockWrite; ProcParameter: SysProc_ReadBlock),
(Proc: Proc_BlockRead_BlockWrite; ProcParameter: SysProc_WriteBlock),
(Proc: Proc_SetTextBuf; ProcParameter: 0),
(Proc: Proc_Halt_RunError; ProcParameter: SysProc_HaltError),
(Proc: Proc_Fail; ProcParameter: 0),
(Proc: Proc_BREAK_CONTINUE_Exit; ProcParameter: Ofs (LastJumpOutOfBlock)),
(Proc: Proc_BREAK_CONTINUE_Exit; ProcParameter: Ofs (LastJumpToNextBlockIteration)),
(Proc: Proc_Include_Exclude; ProcParameter: Include),
(Proc: Proc_Include_Exclude; ProcParameter: Exclude));
This function processes system procedures. The parameter is saved to allow recursion.
Function SystemProcedure (ProcNumber: Word): Word;
Var SavedParameter: Word;
begin
SavedParameter := ProcParameter;
ProcParameter := stProcedures [ProcNumber].ProcParameter;
SystemProcedure := stProcedures [ProcNumber].Proc;
If ProcParameter = $FFFF then Halt (1);
ProcParameter := SavedParameter;
end;