Kaynağa Gözat

TP3-comp: add README.md

Eric Streit 2 hafta önce
ebeveyn
işleme
81e39edeef
1 değiştirilmiş dosya ile 105 ekleme ve 0 silme
  1. 105 0
      README.md

+ 105 - 0
README.md

@@ -0,0 +1,105 @@
+# TP3-comp
+
+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.
+
+## Status
+
+| Milestone | Tag | Status |
+|---|---|---|
+| Main-menu shell | `v0.1-shell` | done |
+| WordStar-style editor | `v0.2-editor` | done |
+| Compiler → 8086 codegen | — | next |
+| Interpreter ("R", .COM execution) | — | later |
+
+## Build
+
+Requires GNU Modula-2 (`gm2`, tested with 16.0.1) and a C compiler for the
+`FOR "C"` bridge.
+
+```sh
+cd shell
+make
+./tpshell
+```
+
+The shell runs in raw mode: it needs a real ANSI terminal, no wrappers.
+
+## Layout
+
+- `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.
+
+## Shell (TP3.0 main menu)
+
+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`, `R` | compile / run (placeholders) |
+| `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.
+
+## Editor
+
+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:
+
+- Movement — ^S/^D/^E/^X/^A/^F/^R/^C/^W/^Z and ^Q S/D/E/X/R/C/B/K/P,
+  arrow keys / PgUp / PgDn / Home / End (ANSI escape sequences).
+- Editing — insert/overwrite (^V), ^G delete char, backspace joins lines,
+  ^T word, ^Y line, ^Q-Y to end of line, ^N / CR line break, TAB auto-indent
+  to word start on the line above.
+- Block — ^K B/K mark, ^K T word, ^K H show/hide, ^K C/V/Y copy/move/delete,
+  ^K R/W read/write block to/from a file.
+- Search — ^Q-F find, ^Q-A replace, ^L repeat last; options B/G/n/U/W, and
+  N (no-confirm) for replace; ^A matches any char, CR LF searches a line break.
+- ^P prefix inserts a literal control character; ^U / ESC abort prompts.
+- ^K-D returns to the shell; the text stays in memory, `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.
+
+## Porting notes (gm2)
+
+- Foreign modules (`DEFINITION MODULE FOR "C"`) must use `ADDRESS`, not
+  Modula-2 record/pointer types — cast at the call site.
+- gm2 ICEs on `FOR ... EXIT`; use `WHILE`+flag (or `LOOP`+`EXIT`).
+- gm2 only emits `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`.
+- termios is used in raw mode, so every newline is explicit `CR LF`.
+- `EXIT` is only legal inside `LOOP` (ISO Modula-2), not `WHILE`.