(* BSD 2-Clause License Copyright (c) 2019-2021, 2023, Anton Krotov All rights reserved. *) MODULE TARGETS; IMPORT UTILS; CONST MSP430* = 0; Win32C* = 1; Win32GUI* = 2; Win32DLL* = 3; KolibriOS* = 4; KolibriOSDLL* = 5; Win64C* = 6; Win64GUI* = 7; Win64DLL* = 8; Linux32* = 9; Linux32SO* = 10; Linux64* = 11; Linux64SO* = 12; STM32CM3* = 13; RVM32I* = 14; RVM64I* = 15; cpuX86* = 0; cpuAMD64* = 1; cpuMSP430* = 2; cpuTHUMB* = 3; cpuRVM32I* = 4; cpuRVM64I* = 5; osNONE* = 0; osWIN32* = 1; osWIN64* = 2; osLINUX32* = 3; osLINUX64* = 4; osKOS* = 5; noDISPOSE = {MSP430, STM32CM3, RVM32I, RVM64I}; noRTL = {MSP430}; libRVM32I = "RVMxI" + UTILS.slash + "32"; libRVM64I = "RVMxI" + UTILS.slash + "64"; TYPE STRING = ARRAY 32 OF CHAR; TARGET = RECORD target, CPU, OS, RealSize: INTEGER; ComLinePar*, LibDir, FileExt: STRING END; VAR Targets*: ARRAY 16 OF TARGET; CPUs: ARRAY 6 OF RECORD BitDepth, InstrSize: INTEGER; LittleEndian: BOOLEAN END; target*, CPU*, BitDepth*, OS*, RealSize*, WordSize*, AdrSize*, InstrSize*: INTEGER; ComLinePar*, LibDir*, FileExt*: STRING; Import*, Dispose*, RTL*, Dll*, LittleEndian*, WinLin*: BOOLEAN; PROCEDURE Enter (idx, CPU, RealSize, OS: INTEGER; ComLinePar, LibDir, FileExt: STRING); BEGIN Targets[idx].target := idx; Targets[idx].CPU := CPU; Targets[idx].RealSize := RealSize; Targets[idx].OS := OS; Targets[idx].ComLinePar := ComLinePar; Targets[idx].LibDir := LibDir; Targets[idx].FileExt := FileExt; END Enter; PROCEDURE Select* (ComLineParam: ARRAY OF CHAR): BOOLEAN; VAR i: INTEGER; res: BOOLEAN; BEGIN i := 0; WHILE (i < LEN(Targets)) & (Targets[i].ComLinePar # ComLineParam) DO INC(i) END; res := i < LEN(Targets); IF res THEN target := Targets[i].target; CPU := Targets[i].CPU; BitDepth := CPUs[CPU].BitDepth; InstrSize := CPUs[CPU].InstrSize; LittleEndian := CPUs[CPU].LittleEndian; RealSize := Targets[i].RealSize; OS := Targets[i].OS; ComLinePar := Targets[i].ComLinePar; LibDir := Targets[i].LibDir; FileExt := Targets[i].FileExt; Import := OS IN {osWIN32, osWIN64, osKOS}; Dispose := ~(target IN noDISPOSE); RTL := ~(target IN noRTL); Dll := target IN {Linux32SO, Linux64SO, Win32DLL, Win64DLL, KolibriOSDLL}; WinLin := OS IN {osWIN32, osLINUX32, osWIN64, osLINUX64}; WordSize := BitDepth DIV 8; AdrSize := WordSize END RETURN res END Select; PROCEDURE EnterCPU (cpu, BitDepth, InstrSize: INTEGER; LittleEndian: BOOLEAN); BEGIN CPUs[cpu].BitDepth := BitDepth; CPUs[cpu].InstrSize := InstrSize; CPUs[cpu].LittleEndian := LittleEndian END EnterCPU; BEGIN EnterCPU(cpuX86, 32, 1, TRUE); EnterCPU(cpuAMD64, 64, 1, TRUE); EnterCPU(cpuMSP430, 16, 2, TRUE); EnterCPU(cpuTHUMB, 32, 2, TRUE); EnterCPU(cpuRVM32I, 32, 4, TRUE); EnterCPU(cpuRVM64I, 64, 8, TRUE); Enter( MSP430, cpuMSP430, 0, osNONE, "msp430", "MSP430", ".hex"); Enter( Win32C, cpuX86, 8, osWIN32, "win32con", "Windows", ".exe"); Enter( Win32GUI, cpuX86, 8, osWIN32, "win32gui", "Windows", ".exe"); Enter( Win32DLL, cpuX86, 8, osWIN32, "win32dll", "Windows", ".dll"); Enter( KolibriOS, cpuX86, 8, osKOS, "kosexe", "KolibriOS", ""); Enter( KolibriOSDLL, cpuX86, 8, osKOS, "kosdll", "KolibriOS", ".obj"); Enter( Win64C, cpuAMD64, 8, osWIN64, "win64con", "Windows", ".exe"); Enter( Win64GUI, cpuAMD64, 8, osWIN64, "win64gui", "Windows", ".exe"); Enter( Win64DLL, cpuAMD64, 8, osWIN64, "win64dll", "Windows", ".dll"); Enter( Linux32, cpuX86, 8, osLINUX32, "linux32exe", "Linux", ""); Enter( Linux32SO, cpuX86, 8, osLINUX32, "linux32so", "Linux", ".so"); Enter( Linux64, cpuAMD64, 8, osLINUX64, "linux64exe", "Linux", ""); Enter( Linux64SO, cpuAMD64, 8, osLINUX64, "linux64so", "Linux", ".so"); Enter( STM32CM3, cpuTHUMB, 4, osNONE, "stm32cm3", "STM32CM3", ".hex"); Enter( RVM32I, cpuRVM32I, 4, osNONE, "rvm32i", libRVM32I, ".bin"); Enter( RVM64I, cpuRVM64I, 8, osNONE, "rvm64i", libRVM64I, ".bin"); END TARGETS.