Turbo-pascal 3 recreation, based on multiple disassembiles and Collibri Books.
|
|
1 týždeň pred | |
|---|---|---|
| Resources | 2 týždňov pred | |
| shell | 1 týždeň pred | |
| .gitignore | 1 týždeň pred | |
| README.md | 2 týždňov pred | |
| RESUME-TP3.md | 2 týždňov pred | |
| SUMMARY.md | 1 týždeň pred | |
| TP3-COMPILER.md | 1 týždeň pred | |
| TP3-EDITOR-PSEUDOCODE.md | 2 týždňov pred | |
| TP3-EDITOR.md | 2 týždňov pred |
Recreating Turbo Pascal 3.0 (shell, editor, compiler, interpreter) in
GNU Modula-2 (-fiso). Faithful to the original: the screen layout, keys
and behaviours are reconstructed from the disassembled TP3.0 source
(Resources/) and the reference manual.
| Milestone | Tag | Status |
|---|---|---|
| Main-menu shell | v0.1-shell |
done |
| WordStar-style editor | v0.2-editor |
done |
| Shell/editor polish (Ctrl-K-D quit) | v-TP3-SHELL-EDITOR-QUIT |
done |
| Compiler skeleton + two-phase build | v-TP3-SHELL-COMPILES |
done |
Parser Skip bug class (9 sites) |
v-TP3-PARSER-FIXES |
done |
Standard procedures + rel16 fix |
v-TP3-STDPROCS |
done |
Runtime blob, linker, CmdRun interpreter |
— | not started |
Current state: tpshell builds clean (120792 bytes); the compiler front end
parses and emits 8086 for 17 of 23 fixtures, verified by hex-dumping the
image. No compiled program has been executed yet — CmdRun is a stub and
the runtime blob does not exist. See SUMMARY.md for the verified detail.
Requires GNU Modula-2 (gm2, tested with 16.0.1) and a C compiler for the
FOR "C" bridge.
cd shell
make
./tpshell
The shell runs in raw mode: it needs a real ANSI terminal, no wrappers.
shell/Term.def|mod — raw termios keyboard + ANSI screen primitives
(blocking GetCh, non-blocking Avail/GetKey via poll, GotoXY,
highlight Marked/Normal, Beep).shell/Posix.def|Posix.c — DEFINITION MODULE FOR "C" bridge to libc:
read/write/open/close/unlink/rename/getcwd/chdir/opendir/readdir/closedir/
statvfs/poll and termios (tcgetattr/tcsetattr/cfmakeraw).shell/TextBuf.def|mod — the shared TP3-style text buffer: a 62903-char
array, lines terminated by CR. Text is kept in memory so the editor and the
shell's S (save) operate on the same buffer.shell/Editor.def|mod — WordStar-style full-screen editor.shell/Shell.mod — TP3.0 main-menu dispatcher (kmenu/kcmdtab),
work-file load/save with .BAK rotation, directory listing, options menu.shell/Makefile — see notes below.SUMMARY.md — state summary and reflection notes per milestone.RESUME-TP3.md — book-derived reference for the 8086 code the TP3 compiler
generates (source of the compiler phase).Resources/ — OCR of "Au coeur de Turbo Pascal", TP3.0 manual and the
disassembled TPSRC1-10.Exact TP3.0 screen: Logged drive, Active directory, Work file,
Main file, Edit Compile Run Save / Dir Quit compiler Options,
Text: n bytes, Free: n bytes, > prompt. Command letters are drawn bold
(TP3 uses high-bit characters).
| Key | Action |
|---|---|
L |
new drive / directory |
A |
new active directory |
W |
set work file (auto-.PAS), Loading/New File |
M |
set main file |
E |
edit work file |
C |
compile (wired: TP3 error report + editor jumps to the error) |
R |
run — stub, prints "Interpreter pending" |
S |
save with ^Z EOF; old version → .BAK |
D |
directory listing, DOS *.* mask, k bytes free |
O |
options submenu (compile target, Code/Data/Stack, params) |
Q |
quit (prompts to save when text changed) |
Any other key redraws the menu, like TP3.
WordStar-style full-screen editing over TextBuf. Status line:
Line n Col n Insert/Overwrite Indent X:FILENAME.
Text rows are screen rows 2–24; row 1 carries status/prompt/messages.
Highlights:
changed is reported
and S (or the quit prompt) writes it to disk.Disk format matches TP3: CRLF line endings and a trailing ^Z; load
normalizes CRLF/LF, save re-expands.
DEFINITION MODULE FOR "C") must use ADDRESS, not
Modula-2 record/pointer types — cast at the call site.FOR ... EXIT; use WHILE+flag (or LOOP+EXIT).main when the program module source is on the link line:
gm2 -fiso -o tpshell Shell.mod Term.o Posix.o TextBuf.o Editor.o.CR LF.EXIT is only legal inside LOOP (ISO Modula-2), not WHILE.