# Thư viện TCVN cho Turbo Pascal

> Thư viện mình viết năm 2008, hồi cấp 3, để hiển thị và gõ tiếng Việt TCVN3 trong Turbo Pascal: cách nó hoạt động, lệnh ẩn in thông tin tác giả, bản lưu để tải và cách chạy bằng DOSBox.

- Tác giả: Nguyễn Công Hoàng (Nguyen Cong Hoang)
- Người viết: AI, Claude Code (mô hình Claude Opus 5.5), từ các prompt của tác giả (xem mục cuối)
- Ngày: 2026-10-17
- URL: https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal
- Ngôn ngữ: vi

## Tóm tắt

- Năm 2008, hồi học cấp 3, mình viết TCVN, một thư viện (unit) cho Turbo Pascal 7.0 giúp chương trình hiển thị và gõ tiếng Việt mã TCVN3 ở chế độ văn bản.
- Thư viện có 3 thủ tục và 4 hàm: `loadfont`, `unloadfont`, `TCVNInf`, `telex`, `vni`, `ReadT`, `ReadV`. [Thư viện có gì](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#thư-viện-có-gì)
- `loadfont` nạp 256 hình chữ 8×16 vào card VGA, nên các byte TCVN3 hiện thành chữ Việt. [Cách hiển thị](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#thư-viện-hiển-thị-tiếng-việt-thế-nào)
- Thư viện có một lệnh ẩn: nếu chữ `author` đang hiện trên màn hình khi gọi `loadfont`, nó in thông tin tác giả. Claude (AI) tìm lại lệnh này cho mình bằng cách dịch ngược tệp `TCVN.TPU`. [Lệnh ẩn](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#lệnh-ẩn-in-thông-tin-tác-giả)
- Bài có bản lưu để tải về (thư viện, trợ giúp gốc, ví dụ, script) và hướng dẫn chạy bằng DOSBox trên macOS và Windows. [Tải về](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#tải-về)

Năm 2008, hồi học cấp 3, mình viết một thư viện cho Turbo Pascal 7.0 tên là TCVN, để chương trình Pascal ở chế độ văn bản hiển thị được chữ Việt và cho người dùng gõ tiếng Việt kiểu Telex hoặc VNI. Tệp `TCVN.TPU` còn lưu tới nay mang ngày 22/11/2008, chương trình trợ giúp đi kèm mang ngày 16/09/2008.

Thư viện từng được giới thiệu trên vài diễn đàn tin học, trong bài "Nhập xuất tiếng Việt trong Pascal với thư viện TCVN" (một bản chép lại ghi ngày 06/07/2011), kèm bản cài "Turbo Pascal tích hợp thư viện TCVN" do mình đóng gói. Bản cài đó, một tệp `.exe` cho Windows tải lên ngày 04/05/2011, vẫn còn trên [MediaFire](https://www.mediafire.com/file/y5app1m88z3jehh/Turbo+Pascal+7.0+kem+thu+vien+TCVN.exe). Bài này ghi lại thư viện, kèm một [bản lưu để tải về](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#tải-về) chỉ gồm thư viện, trợ giúp và các ví dụ.

Từ bản 7.3.4, [Turbo Pascal (With DOSBox)](https://sourceforge.net/projects/turbopascal-wdb/) của Lưu Nguyễn Thiện Hậu cũng tích hợp thư viện này. Trang [download.com.vn](https://download.com.vn/pascal-128790) ghi hơn 200.000 lượt tải Turbo Pascal (With DOSBox), và nút tải ở đó dẫn tới bản cài trên SourceForge. Một [bài báo ngày 14/7/2014](https://baodongthap.vn/doi-ban-tien-dat-truc-van-sang-kien-phan-mem-tin-hoc-tien-dung-a39841.html), nay trên trang Báo Đồng Tháp, viết về phần mềm hỗ trợ học Pascal của hai học sinh lớp 9 Trường THCS Vĩnh Kim; phần mềm dùng thư viện TCVN.TPU để hiển thị tiếng Việt có dấu trong Turbo Pascal.

Tìm lại thư viện này giống một lần khai quật khảo cổ: link tải trong bài giới thiệu cũ đã bị xoá, tệp thư viện nằm trong bộ cài của người khác, còn lệnh ẩn chỉ thấy được khi dịch ngược mã máy. May là có Claude (AI, chạy trong Claude Code) làm phần lớn việc đó cho mình. Tự làm thì mình sẽ mất rất nhiều thời gian, và chắc mình sẽ không làm.

## Thư viện có gì

Chương trình khai báo `uses tcvn;` rồi gọi các thủ tục và hàm sau:

| Tên                 | Loại    | Việc làm                                                         |
| ------------------- | ------- | ---------------------------------------------------------------- |
| `loadfont`          | thủ tục | nạp font tiếng Việt TCVN3, xoá màn hình                          |
| `unloadfont`        | thủ tục | trả lại font của máy                                             |
| `TCVNInf`           | thủ tục | in thông tin tác giả, chờ một phím                               |
| `telex(s)`          | hàm     | đổi chuỗi gõ kiểu Telex thành chữ TCVN3: `telex('Tieesng Vieejt')` |
| `vni(s)`            | hàm     | đổi chuỗi gõ kiểu VNI thành chữ TCVN3: `vni('Tie61ng Vie65t')`     |
| `ReadT`, `ReadV`    | hàm     | nhập một chuỗi, người dùng gõ tiếng Việt kiểu Telex hoặc VNI      |

Chương trình trợ giúp `TCVNHELP.EXE` (cũng chạy trong DOS) mô tả đủ 3 thủ tục và 4 hàm này:

![Trang 2 của TCVNHELP.EXE: LoadFont nạp font tiếng Việt TCVN, UnloadFont trả lại font của máy, TCVNinf ghi ra màn hình thông tin tác giả phần mềm](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/help-2.webp)

*Trang 2 của TCVNHELP.EXE, chạy trong DOSBox Staging trên macOS.*

**Xem các trang khác của TCVNHELP.EXE**

![Trang 1: Thư viện pascal TCVN được viết bởi Nguyễn Công Hoàng, hướng dẫn khai báo uses TCVN](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/help-1.webp)

*Trang 1: giới thiệu và cách khai báo.*

![Trang 3: các hàm Telex, Vni, ReadT và ReadV, kèm ví dụ](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/help-3.webp)

*Trang 3: bốn hàm.*

![Trang 4: soạn tiếng Việt trực tiếp trong mã nguồn bằng font TCVN3 (.Vn) và bộ gõ chọn bảng mã TCVN3](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/help-4.webp)

*Trang 4: viết chữ Việt thẳng vào mã nguồn bằng font .Vn.*

![Trang 5: thông tin tác giả, ngày sinh và email đã được làm mờ](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/help-5.webp)

*Trang 5: thông tin tác giả (ngày sinh và email được làm mờ trong ảnh).*

### Ví dụ

```pascal
program ViDu;
uses crt, tcvn;
var s: string;
begin
  loadfont;          { nap font TCVN3, xoa man hinh }
  writeln(telex('Ddaay laf moojt dofng tieesng Vieejt'), ' (Telex)');
  writeln(vni('D9a6y la2 mo65t do2ng tie61ng Vie65t'), ' (VNI)');
  writeln;
  write(telex('Gox moojt caau'), ' (Telex): ');
  s := readt;        { go Telex, nhan ve chuoi TCVN3 }
  writeln(telex('Bajn vuwfa gox: '), s);
  readln;
  unloadfont;        { tra lai font cua may }
end.
```

![Kết quả: Đây là một dòng tiếng Việt (Telex), Đây là một dòng tiếng Việt (VNI), Gõ một câu (Telex): tôi học lập trình, Bạn vừa gõ: tôi học lập trình](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/vidu-run.webp)

*Chạy VIDU.PAS; câu sau dấu hai chấm được gõ bằng các phím <code>tooi hojc laajp trifnh</code>.*

**Xem VIDU.PAS trong trình soạn thảo Turbo Pascal 7.0**

![VIDU.PAS mở trong trình soạn thảo Turbo Pascal 7.0, nền xanh](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/vidu-source.webp)

Ví dụ này cho thấy hai giới hạn của thư viện:

- Dấu phải gõ liền sau nguyên âm: `chafo` ra "chào", còn `chaof` ra "chaò"; `moojt` ra "một", còn `mootj` ra "môtj". Bộ gõ ngày nay như [JOKey](https://afixer.app/blog/lam-bo-go-tieng-viet-cho-macos) cho gõ dấu ở cuối chữ.
- `telex()` đổi mọi chữ, kể cả chữ tiếng Anh: `telex('Telex')` ra "Telẽ", và gõ `pascal` qua `ReadT` ra "pácal". Thư viện chưa có kiểm tra chính tả, nên trong ví dụ chữ "Telex" được để ngoài lời gọi `telex()`.

## Thư viện hiển thị tiếng Việt thế nào

Ở chế độ văn bản 80×25, màn hình là 2.000 ô, mỗi ô lưu một byte mã ký tự và một byte màu, ở địa chỉ `B800:0000`. Hình của từng mã ký tự lấy từ một bảng font 256 hình chữ trong card VGA. `loadfont` gọi ngắt `10h` với `AX = 1100h` để nạp 256 hình chữ 8×16 của thư viện vào bảng đó. Các mã từ 128 tới 255 khi đó mang hình chữ Việt theo bảng mã TCVN3, nên chương trình chỉ cần in các byte TCVN3 là ra chữ Việt. `unloadfont` gọi `AX = 1104h` để nạp lại font 8×16 có sẵn của máy.

Font dài 4.096 byte (256 hình chữ × 16 byte), nằm trong tệp `TCVN.OBJ` được liên kết vào unit. Theo trí nhớ của mình, các hình chữ Việt trong font được trích từ VietRes, bộ gõ tiếng Việt cho DOS của Seatic. Bản VietRes đi kèm Turbo Pascal (With DOSBox) bị nén bằng PKLITE, nên chưa so được từng byte.

Trước khi nạp font, `loadfont` chuyển sang chế độ đồ hoạ 13h rồi về chế độ văn bản 03h. Trên Windows XP, chương trình DOS chuyển sang chế độ đồ hoạ thì cửa sổ dòng lệnh chuyển sang toàn màn hình; có lẽ vì vậy mà trợ giúp gốc ghi rằng `loadfont` "đưa về chế độ toàn màn hình (full screen)". Trong DOSBox, font hiện trong cửa sổ như bình thường.

Dịch ngược `TCVN.TPU`, `loadfont` làm những việc sau (viết lại bằng Pascal, tên biến lấy từ bảng ký hiệu của unit):

```pascal
function ReadChar(x, y: byte): char;   { mem[$B800 : (y-1)*160 + (x-1)*2] }
function ReadLine(y: byte): string;    { 79 ký tự của dòng y }

procedure Loadfont;
var regs: Registers; show_inf: boolean; i: byte;
begin
  show_inf := false;
  for i := 1 to 25 do
    if Pos('author', ReadLine(i)) > 0 then begin show_inf := true; break; end;
  { int 10h với AX = 13h rồi AX = 03h: đặt lại chế độ văn bản 80x25 }
  regs.ax := $1100; regs.bx := $1000;  { nạp font, 16 byte mỗi hình chữ }
  regs.cx := 256;   regs.dx := 0;      { 256 hình chữ, từ mã 0 }
  regs.es := Seg(font); regs.bp := Ofs(font);
  Intr($10, regs);
  if show_inf then begin TCVNInf; ClrScr; end;
end;
```

## Lệnh ẩn in thông tin tác giả

Có hai cách để thư viện in thông tin tác giả:

1. Gọi thẳng `TCVNInf`. Thủ tục này có trong `TCVNHELP.EXE`, nhưng bài giới thiệu thư viện trên diễn đàn và trang trợ giúp của Turbo Pascal (With DOSBox) đều không nhắc tới nó.
2. Để chữ `author` hiện ở bất kỳ đâu trên màn hình rồi gọi `loadfont`. Không tài liệu nào ghi cách này: nó chỉ nằm trong mã của `loadfont` ở trên.

```pascal
program Author;
uses crt, tcvn;
begin
  clrscr;
  while keypressed do readkey;  { bo phim con trong bo dem }
  writeln('author');
  loadfont;      { thay "author" -> TCVNInf, roi xoa man hinh }
  writeln(telex('Xin chafo, ddaay laf thuw vieejn TCVN.'));
  readln;
  unloadfont;
end.
```

![Màn hình TCVNInf: Thư viện pascal TCVN, thông tin tác giả Nguyễn Công Hoàng, ngày sinh và email đã được làm mờ](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/author-trigger.webp)

*Chạy AUTHOR.PAS: <code>loadfont</code> thấy chữ "author" và gọi <code>TCVNInf</code> (ngày sinh và email được làm mờ trong ảnh).*

![Sau khi nhấn phím: Xin chào, đây là thư viện TCVN.](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/author-after.webp)

*Nhấn một phím, <code>loadfont</code> xoá màn hình và chương trình chạy tiếp.*

Dòng `while keypressed do readkey;` để bỏ các phím còn sót trong bộ đệm bàn phím. Nếu bộ đệm còn một phím, `ReadKey` trong `TCVNInf` nhận phím đó, và màn hình thông tin tác giả biến mất trước khi kịp đọc.

## Tìm lại bằng dịch ngược

Mình chỉ nhớ là đã giấu một lệnh in thông tin tác giả trong thư viện, không nhớ là lệnh gì. Claude tìm lại lệnh đó qua các bước dưới đây; mình chỉ đưa yêu cầu và trả lời vài câu hỏi (các prompt nằm ở [cuối bài](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#bai-nay-duoc-viet-the-nao)).

1. Link tải trong bài giới thiệu cũ đã bị xoá. Bài ["Một số điều có thể bạn chưa biết về Turbo Pascal"](https://congnghevadoisong.vn/mot-so-dieu-co-the-ban-chua-biet-ve-turbo-pascal-d9421.html) trên congnghevadoisong.vn (25/06/2012) còn link MediaFire của bản cài gốc, nhưng lúc đó máy của Claude bị chặn truy cập MediaFire. Sau khi mình mở chặn, Claude tải bản cài gốc về: `TCVN.TPU` và `TcvnHelp.EXE` trong đó giống từng byte với hai tệp lấy từ Turbo Pascal (With DOSBox) ở bước 2.
2. Bản cài [Turbo Pascal (With DOSBox) 7.3.5](https://sourceforge.net/projects/turbopascal-wdb/files/Setup/7.3.5/) là một tệp `.msi` (tệp OLE compound file). Bên trong có một tệp cabinet nén kiểu MSZIP chứa 278 tệp, trong đó có `TCVN.TPU` và `TCVNHELP.EXE`. Script `extract-tp7.py` trong bản lưu đọc cả hai định dạng này bằng thư viện chuẩn của Python.
3. Tệp `.TPU` của Turbo Pascal 7.0 bắt đầu bằng chữ ký `TPUQ`, và giữ nguyên tên các ký hiệu. Phần interface có 7 tên: `Loadfont`, `UnLoadfont`, `TCVNInf`, `telex`, `vni`, `ReadT`, `ReadV`. Tiếp theo là các tên nội bộ như `ReadChar`, `ReadLine`, `font`, `show_inf`.
4. Mã máy bắt đầu ở offset `0xC00`. Mỗi thủ tục là một code segment riêng, theo một bảng 15 mục ở offset `0x783`. Mỗi lời gọi tới thủ tục khác được ghi trong một bảng fixup, 8 byte mỗi mục: unit, loại, đích, độ lệch, vị trí trong segment.
5. Segment của `loadfont` mở đầu bằng hằng chuỗi Pascal `06 'author'`. Lời gọi cuối cùng trong segment này có fixup trỏ vào mục thứ 3 của bảng thủ tục, tức `TCVNInf`. Các chuỗi thông tin tác giả nằm ở đầu segment của `TCVNInf`, lưu bằng mã TCVN3.
6. Cuối cùng, Claude biên dịch hai ví dụ ở trên bằng `TPC.EXE` 7.0 và chạy trong DOSBox để kiểm tra.

**Xem mã máy đầu tiên của loadfont**

```text
0007  55              push   bp
0008  89 e5           mov    bp, sp
...
0016  c6 46 ea 00     mov    byte [bp-0x16], 0      ; show_inf := false
001a  c6 46 eb 01     mov    byte [bp-0x15], 1      ; i := 1
...
0023  bf 00 00        mov    di, 0                  ; fixup: hằng 'author' ở đầu segment
...
0032  e8 00 00        call   ReadLine               ; fixup: thủ tục nội bộ của TCVN
0035  9a 00 00 00 00  call   far Pos                ; fixup: System
003a  09 c0           or     ax, ax
003c  7e 06           jle    +6
003e  c6 46 ea 01     mov    byte [bp-0x16], 1      ; show_inf := true
...
0044  80 7e eb 19     cmp    byte [bp-0x15], 25     ; hết 25 dòng?
004a  b8 13 00        mov    ax, 13h
004d  cd 10           int    10h                    ; chế độ đồ hoạ 320x200
004f  b8 03 00        mov    ax, 03h
0052  cd 10           int    10h                    ; về chế độ văn bản 80x25
0054  c7 46 ec 00 11  mov    word [bp-0x14], 1100h  ; regs.ax: nạp font
...
007c  9a 00 00 00 00  call   far Intr               ; fixup: Dos
0081  80 7e ea 00     cmp    byte [bp-0x16], 0      ; show_inf?
0085  74 09           je     +9
0087  0e              push   cs
0088  e8 00 00        call   TCVNInf                ; fixup: mục 3 của bảng thủ tục
008b  9a 00 00 00 00  call   far ClrScr             ; fixup: Crt
```

## Tải về

[tcvn-pascal.zip](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal/tcvn-pascal.zip) (24 KB) gồm:

- `TCVN.TPU`: thư viện, giống từng byte với tệp trong bản cài gốc năm 2011 và trong Turbo Pascal (With DOSBox) 7.3.5;
- `TCVNHELP.EXE`: chương trình trợ giúp gốc;
- `VIDU.PAS`, `INFO.PAS`, `AUTHOR.PAS`: ba ví dụ trong bài;
- `tools/extract-tp7.py`: chép Turbo Pascal 7.0 ra từ bản cài Turbo Pascal (With DOSBox);
- `tools/tpudis.py`: dịch ngược một code segment của tệp `.TPU` (cần `clang` và `objdump`);
- `README.txt` và `SHA256SUMS.txt`.

Gói không kèm Turbo Pascal 7.0, vì đó là phần mềm của Borland. `TCVN.TPU` chỉ dùng được với Turbo Pascal 7.0, nên cần lấy trình biên dịch từ bản cài Turbo Pascal (With DOSBox) như hướng dẫn dưới đây, hoặc từ bản Turbo Pascal 7.0 bạn đang có.

SHA-256 của tệp zip: `e72f2d6e80a6066c03456fff973419e8aa3dc3fd51dc19b90b06e0a568d70020`

## Chạy thử bằng DOSBox

### macOS

Claude đã chạy thử các bước này trên máy Mac của mình (macOS 26):

1. Cài [DOSBox Staging](https://dosbox-staging.github.io/):

   ```sh
   brew install dosbox-staging
   ```

2. Tải `TP(WDB)-7.3.5-Setup.msi` từ [trang SourceForge của Turbo Pascal (With DOSBox)](https://sourceforge.net/projects/turbopascal-wdb/files/Setup/7.3.5/).
3. Giải nén `tcvn-pascal.zip`, mở Terminal trong thư mục `tcvn-pascal`, rồi chép Turbo Pascal 7.0 ra từ bản cài:

   ```sh
   python3 tools/extract-tp7.py ~/Downloads/TP\(WDB\)-7.3.5-Setup.msi
   ```

4. Biên dịch và chạy ví dụ:

   ```sh
   dosbox-staging -c "mount c ." -c "c:" -c "tpc vidu.pas" -c "vidu"
   ```

   Hoặc mở trình soạn thảo Turbo Pascal (Ctrl+F9 để chạy, Alt+X để thoát):

   ```sh
   dosbox-staging -c "mount c ." -c "c:" -c "turbo vidu.pas"
   ```

   Xem trợ giúp gốc của thư viện:

   ```sh
   dosbox-staging -c "mount c ." -c "c:" -c "tcvnhelp"
   ```

### Windows

Các bước này chưa được thử trên Windows.

- Cách đơn giản nhất: cài Turbo Pascal (With DOSBox) từ 7.3.4 trở lên. Bản này đã tích hợp thư viện TCVN, chỉ cần khai báo `uses tcvn;`.
- Cách giống macOS: cài [DOSBox Staging](https://dosbox-staging.github.io/) và [Python 3](https://www.python.org/), tải bản cài `.msi` như trên, rồi trong thư mục `tcvn-pascal` chạy:

  ```bat
  py tools\extract-tp7.py "%USERPROFILE%\Downloads\TP(WDB)-7.3.5-Setup.msi"
  dosbox -c "mount c ." -c "c:" -c "tpc vidu.pas" -c "vidu"
  ```

  `dosbox.exe` nằm trong thư mục cài DOSBox Staging.

## Liên quan

Mười tám năm sau, mình vẫn làm bộ gõ tiếng Việt, giờ là JOKey cho macOS: bài [Làm bộ gõ tiếng Việt cho macOS](https://afixer.app/blog/lam-bo-go-tieng-viet-cho-macos) kể về nó, từ engine tới cách gõ vào từng app.

## Bài này được viết thế nào

Phần thêm cho ai đọc tới đây. Bài này do Claude Code (mô hình Claude Opus 5.5) viết. Dưới đây là ý tưởng của mình, các prompt chính mình đã gõ (viết lại bằng tiếng Việt cho dễ đọc) và những chỗ phải sửa.

### Ý tưởng

Năm 2008 mình giấu trong thư viện TCVN một lệnh in thông tin tác giả, rồi quên mất đó là lệnh gì. Mình muốn tìm lại lệnh đó, chạy lại thư viện để chụp ảnh, và lưu một bản cho người khác tải về chạy thử.

### Các prompt

1. > Tìm kiếm "thư viện TCVN trên Pascal". Tôi đã làm bộ gõ tiếng Việt trên Pascal từ năm 2010, năm tôi học cấp 3, và có chèn một lệnh in ra thông tin tác giả trong thư viện đó. Hãy tìm kiếm, tải về và phân tích để tìm lại lệnh đó.

   Claude tìm thấy bài giới thiệu cũ, và bản cài Turbo Pascal (With DOSBox) trên SourceForge có kèm `TCVN.TPU`. Năm 2010 là mình nhớ nhầm (prompt 8).

2. > Đó là bản cài đặt do tôi đóng gói.

   Bài giới thiệu trên diễn đàn kèm bản cài "Turbo Pascal tích hợp thư viện TCVN"; bản cài đó do mình đóng gói.

3. > Tôi không công khai thủ tục in thông tin tác giả, nên cần dịch ngược để tìm.

   Claude viết script đọc tệp `.TPU` và dịch ngược mã máy, rồi tìm ra chữ `author` trong `loadfont` và thủ tục `TCVNInf` (mục [Tìm lại bằng dịch ngược](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#tìm-lại-bằng-dịch-ngược)).

4. > Tìm cách chạy thư viện để chụp ảnh màn hình.

   Claude hỏi mình rồi cài DOSBox Staging, chép Turbo Pascal 7.0 ra từ bản cài, biên dịch các ví dụ trong DOSBox và chụp các cửa sổ.

5. > Chụp cả mã nguồn của các ví dụ.

   Thêm ảnh VIDU.PAS trong trình soạn thảo Turbo Pascal.

6. > Có thể viết thành một bài riêng, gồm ảnh chụp màn hình, bản lưu cho phép tải về và hướng dẫn chạy bằng DOSBox trên macOS và Windows.

   Phần về thư viện TCVN được tách khỏi bài JOKey thành bài này, kèm tệp zip và hướng dẫn chạy bằng DOSBox.

7. > Tôi nhớ là đã trích font chữ Việt từ VietRes, có thể nhắc tới trong bài.

   Claude thử so font với bản VietRes trong bộ cài, nhưng tệp đó bị nén bằng PKLITE, nên bài ghi rằng đây là theo trí nhớ của mình.

8. Trả lời câu hỏi của AI: "22/11/2008 (TCVN.TPU) và 16/09/2008 (chương trình trợ giúp)."

   > Đúng là năm 2008, hồi tôi học cấp 3, tức là đã 18 năm. Giữ phần thông tin cá nhân đã làm mờ.

   Ngày của các tệp cho thấy thư viện được viết năm 2008, không phải 2010. Ngày sinh và email trong ảnh vẫn được làm mờ.

9. > Tôi muốn ghi rõ ở mọi bài đã đăng và sắp đăng rằng bài đó do AI viết, và chia sẻ chi tiết các prompt, ý tưởng và những chỗ tôi sửa, như phần thưởng cho ai đọc hết bài.

   Thêm dòng ghi chú AI viết ở đầu bài và phần này ở cuối bài.

10. > Về bài TCVN, tôi muốn nói rằng tìm lại thư viện này giống như một cuộc khai quật khảo cổ, và may là có Claude giúp, chứ tự làm thì chắc sẽ tốn rất nhiều thời gian và tôi sẽ không làm.

    Đoạn mở đầu và mục [Tìm lại bằng dịch ngược](https://afixer.app/blog/thu-vien-tcvn-cho-turbo-pascal#tìm-lại-bằng-dịch-ngược) giờ ghi rõ Claude làm phần tìm lại.

11. > Tôi tìm được một bài báo: https://baodongthap.vn/doi-ban-tien-dat-truc-van-sang-kien-phan-mem-tin-hoc-tien-dung-a39841.html, còn link SourceForge được dẫn từ https://download.com.vn/pascal-128790.

    Đoạn mở đầu nhắc tới bài báo năm 2014 và trang download.com.vn.

12. > Tìm link bài trên congnghevadoisong.vn.

    Bước 1 của mục dịch ngược có link tới bài trên congnghevadoisong.vn.

13. > Link MediaFire vẫn còn, tôi đã mở chặn tên miền MediaFire.

    Kèm ảnh chụp trang MediaFire của bản cài (tải lên ngày 04/05/2011). Claude tải bản cài về, giải nén và so với tệp zip của bài: `TCVN.TPU` và chương trình trợ giúp giống từng byte. Đoạn mở đầu giờ có link tới bản cài gốc.

### Những chỗ phải sửa

- Bài đăng lần đầu ghi rằng link tải bản cài gốc không còn mở được. Link MediaFire vẫn còn; máy của Claude bị chặn truy cập MediaFire nên Claude tưởng link đã chết (prompt 13).
- Bản nháp viết như thể mình tự dịch ngược thư viện; người làm việc đó là Claude (prompt 10).
- Ví dụ đầu tiên Claude viết có các phím sai: `mootj` (ra "môtj"), `chaof` (ra "chaò") và `Da6y` (chữ Đ trong VNI là `D9`). Thư viện cần gõ dấu liền sau nguyên âm; từ lỗi này bài có thêm đoạn về giới hạn của thư viện.
- Ví dụ đầu cũng đưa chữ tiếng Anh qua `telex()`: "Telex" ra "Telẽ", "pascal" ra "pácal".
- Lần chạy `AUTHOR.PAS` đầu tiên, màn hình thông tin tác giả biến mất trước khi kịp đọc vì bộ đệm bàn phím còn một phím. Ví dụ có thêm dòng `while keypressed do readkey;`.
- Đoạn mã máy trong bản nháp có offset không khớp với `TCVN.TPU`; Claude thay bằng các dòng `objdump` in ra.
