/*--------------------------------------------------------------
Peps.h — Kopfdatei für peps.exe
VERSION konnte auf PC, AMIGA, (ATARI noch nicht verfügbar) gesetzt werden
Codepage: UTF-8 ohne BOM, Zeilenenden: LF, Tabweite: 8
--------------------------------------------------------------*/
#define PEPSIII // Compilieren als PEPS-III-Version
// Der Unterschied zu PEPS-II ist mir unbekannt.
// Vermutlich ist jener ein EPROM-Simulator ohne Rücklesemöglichkeit
#ifdef WIN32
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <io.h>
// alte MSVCRT.DLL exportiert kein __iob_func() sondern __iob (Tabelle)
// (Problem entsteht durch msvcrt-light.lib)
#ifdef _M_IX86
_CRTIMP FILE _iob[3];
#undef stdout
#define stdout (_iob+0)
#undef stdin
#define stdin (_iob+1)
#undef stderr
#define stderr (_iob+2)
#endif
#define T(x) TEXT(x)
#define lseek _lseek
#define read _read
#define write _write
#define close _close
#else // Linux
#define _cdecl // Keine Aufrufkonvention
#define _ttoi atoi // fehlende <tchar.h>
#define _tcstoul strtoul
#define _tcstol strtol
#define _tfopen fopen
#define _tcsstr strstr
#define _tunlink unlink
#define _isatty isatty
#define _fileno fileno
typedef char TCHAR; // Windows-Typen
typedef unsigned short WORD;
typedef unsigned long DWORD, DWORD_PTR;
typedef unsigned char BYTE;
typedef int HANDLE;
#define O_BINARY 0
#include <stdio.h> // printf()
#include <stdlib.h>
#include <errno.h> // errno
#include <fcntl.h> // open(), O_RDWR usw.
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
#define T(x) x
#define MulDiv(a,b,c) (int)((long long)(a)*(b)/(c))
#endif
#define elemof(x) (sizeof(x)/sizeof(*(x)))
#define nobreak
#ifndef __cplusplus
typedef enum {false, true} bool; // Enum-Größe?
#endif
/*--------------------- Prototypes -----------------------*/
extern void _cdecl DoExit(int RCode,...);
extern void Fortschritt(long, long);
extern void newline();
/* hexload.c */
typedef struct _MEMAREA {
struct _MEMAREA *next; // EVL (einfach verkettete Liste)
long a; // Startadresse
long e; // Endadresse + 1
}MEMAREA; // beschreibt einen gefüllten Speicherbereich
extern MEMAREA *areas; // sortierte (!) Speicherbereiche
extern BYTE buffer[]; // 2 MiB Platz, zum Aufsammeln von HEX-Dateien
extern long LoadOffset; // Verschiebung der HEX- oder BIN-Daten
//extern long TargetSize; // Platz in den PEPSen = Puffergröße
FILE *InFile;
void InitBuffer(long size);
void AddArea(long a, long e);
void AddBytes(const BYTE*p, long a, long len);
// Loader laden von <InFile> mit <LoadOffset> nach <buffer>
void LoadObjModule();
void LoadIntel();
void LoadMotorola();
void LoadBinary();
/* sendiii.c */
typedef enum {PARPORT,INPOUT32,USB2PRN,USB2LPT} IODEVICE;
/*══════════════╤═══════════════════════╤═══════════════════════╗
║ │ WINDOWS │ LINUX ║
╟───────────────┼───────────────────────┼───────────────────────╢
║ PARPORT │ Direktzugriff │ Direktzugriff ║
║ davor: │ DirectNT.sys laden │ ioperm()-Aufruf ║
╟───────────────┼───────────────────────┼───────────────────────╢
║ INPOUT32 │ DLL-Funktionen │ioctl auf /dev/parportX║
║ davor: │ InpOut32.dll laden │ /dev/parportX öffnen ║
╟───────────────┼───────────────────────┼───────────────────────╢
║ USB2PRN │ ioctl auf USB2PRN │ioctl auf /dev/usb/lpX ║
║ davor: │ Handle beschaffen │ /dev/usb/lpX öffnen ║
╟───────────────┼───────────────────────┼───────────────────────╢
║ USB2LPT │ ioctl auf USB2LPT │ [ungelöst] ║
║ davor: │ Handle beschaffen │ [libusb laden?] ║
╚═══════════════╧═══════════════════════╧══════════════════════*/
#ifdef WIN32
# define IOLOGICAL 2 // ab USB2PRN (hier: /dev/usb/lpX) logische Nummern
#else
# define IOLOGICAL 1 // ab INPOUT32 (hier: /dev/parportX) logische Nummern
#endif
extern IODEVICE iodevice;
extern BYTE Cen_Clk; // High-Nibble = Bitmaske für Taktbits, 0 = Auto-Detect
extern WORD PPort; // Parallelport-Basisadresse oder Geräte-Index
extern BYTE outcycles; // Anzahl wiederholender OUT-Befehle, Warteschleifen wenn >1; 0 = Auto-Detect
extern bool debug; // Loggen der Portzugriffe auf stderr
// E/A-Schnittstelle vorbereiten bzw. aufräumen
void iodeviceInit(); // mehrfacher Aufruf schadet nicht
void iodeviceDone(); // mehrfacher Aufruf schadet nicht
// PEPS-Zugriffe (Die DIL-Schalterstellungen lassen sich nicht abfragen)
typedef enum {CHECK_DELAY=1, CHECK_SRG=2, CHECK_RAM=4, CHECK_SIZE=8} CHECK_FLAGS;
// CHECK_SIZE dauert am längsten, weil dem Adresszähler 512K Takte übermittelt werden müssen.
void InitPeps3(CHECK_FLAGS check); // Auto-Detect, RAM-Prüfung usw.
void HoldReset(); // Mikrocontroller in RESET halten
void Simulate(); // Simulator und Mikrocontroller freigeben
long GetPepsSize(); // Gesamte RAM-Größe in Erfahrung bringen
void SendData(const BYTE *Base,long Size,long addr);
void ReadData( BYTE *Base,long Size,long addr,bool verify);
/* resu.c bzw. resw.c */
extern void InitRes();
extern void vrprintf(int,va_list);
extern void _cdecl rprintf(int,...);
extern int mygetch(bool noblock);
#ifdef WIN32
extern void usleep(DWORD);
#ifdef _M_IX86
extern bool InstallDirectNT(bool);
#else
#define InstallDirectNT(x) true
#endif
#else
extern DWORD GetTickCount();
#endif
extern WORD GetParportAddr(int n);
Detected encoding: UTF-8 | 0
|