Chạy DOS trên bàn trộn âm thanh Behringer DDX3216 nhờ BIOS tự chế

Công nghệ13 tháng 6, 2026·5 phút đọc

Một kỹ sư đã thành công trong việc viết BIOS từ đầu cho bộ vi xử lý AMD Elan SC300 nằm trong bàn trộn âm thanh kỹ thuật số Behringer DDX3216, cho phép khởi động hệ điều hành FreeDOS.

Chạy DOS trên bàn trộn âm thanh Behringer DDX3216 nhờ BIOS tự chế

Hành trình này bắt đầu từ sự hoài niệm về chiếc máy tính Intel i486 DX2-66 đầu tiên của tôi vào năm 1994. Nhưng vào năm 2026, tôi phát hiện ra một điều thú vị: bàn trộn âm thanh kỹ thuật số Behringer DDX3216 cũ kỹ thực sự chứa một bộ vi xử lý 386 thực thụ. Điều này khơi dậy ý tưởng táo bạo: liệu tôi có thể viết một BIOS từ đầu (DIY BIOS) để khởi động hệ điều hành DOS trên thiết bị âm thanh này hay không?

Mạch chính của Behringer DDX3216Mạch chính của Behringer DDX3216

Chi tiết kỹ thuật của Behringer DDX3216

Trước khi bắt đầu viết mã, chúng ta cần hiểu rõ "ngựa chiến" của mình. DDX3216 không chỉ là một bàn mixer thông thường mà còn là một hệ thống máy tính x86 hoàn chỉnh với các linh kiện sau:

  • Bộ vi xử lý chính: AMD Elan SC300 386 SoC (tương đương 386SX với tích hợp UART, PCMCIA, GPIO).
  • Bộ nhớ: 16MB DRAM (tổng cộng từ 8 chip), 64KB ROM cho BIOS, và một chút SRAM dùng làm Video-RAM.
  • Màn hình: Màn hình LCD 4-bit kết nối trực tiếp vào SC300.
  • Kết nối: UART ngoài, cổng PCMCIA (để gắn thẻ CF), và thậm chí còn có một bộ điều khiển đĩa mềm (FDC) Intel 82078 chưa được lắp đặt.

Phần cứng xung quanh AMD Elan SC300 khá hoàn chỉnh và tương thích với các hệ thống x86 tiêu chuẩn. Đây là nền tảng lý tưởng để thực hiện dự án "bare-metal" (lập trình trực tiếp trên phần cứng) này.

Viết BIOS từ đầu cho hệ thống x86

Thách thức lớn nhất là không có mã nguồn BIOS nào sẵn có cho chip SC300 này. Các công ty từng sản xuất BIOS cho dòng chip này đã ngừng hoạt động hoặc bị mua lại từ lâu. Vì vậy, tôi quyết định tự tay viết một BIOS.

Quy trình khởi động của mọi CPU tương thích x86, từ Intel 8086 đời đầu đến Core i9 hiện đại, đều bắt đầu giống nhau: sau khi reset, CPU nhảy đến vị trí bộ nhớ 0xFFF0 (reset vector) và thực thi mã lệnh tại đó.

Dưới đây là đoạn mã Assembly cơ bản cho vector khởi động mà tôi đã viết:

reset_vector:
    nop                         // không thực hiện thao tác nào
    cli                         // vô hiệu hóa ngắt
    jmp start                   // nhảy đến bắt đầu của đoạn mã hiện tại
    // Padding và thêm ngày tháng
    .zero (0x10 - (. - reset_vector) - 8)
    .ascii "06/04/26"           // MM/DD/YY

Mã này vô hiệu hóa các ngắt phần cứng và nhảy đến hàm start. Từ đây, CPU rời khỏi trạng thái khởi động và bước vào "Real Mode" (chế độ thực) 16-bit cổ điển. Việc sắp xếp mã này vào đúng vị trí 0xFFF0 trong ROM 64KB là yêu cầu bắt buộc để hệ thống chấp nhận nó là một BIOS hợp lệ.

Khởi động màn hình và xử lý ngắt

Sau khi BIOS cơ bản chạy được, bước tiếp theo là "đánh thức" màn hình LCD. Đây là một bài toán khó vì màn hình 4-bit của DDX3216 yêu cầu thao tác trực tiếp trên các thanh ghi điều khiển và hiểu rõ về cơ chế phân đoạn (segment) của x86.

Tuy nhiên, để chạy DOS, chỉ có màn hình là chưa đủ. DOS dựa rất nhiều vào các ngắt phần mềm (software interrupts) như INT 10h (đồ họa), INT 13h (đĩa), INT 16h (bàn phím), v.v. Tôi phải viết các trình điều khiển cho các ngắt này để DOS có thể giao tiếp với phần cứng của bàn mixer.

Cổng UART dùng để debugCổng UART dùng để debug

Nỗ lực khởi động MS-DOS và thành công với FreeDOS

Ban đầu, tôi cố gắng khởi động MS-DOS 6.22. Quá trình này gặp rất nhiều khó khăn. Hệ thống thường bị treo sau khi hiển thị dòng chữ "Starting MS-DOS...". Thông qua cổng UART để debug, tôi phát hiện ra vấn đề nằm ở cách DOS quản lý bộ nhớ stack (ngăn xếp). DOS di chuyển stack xuống vùng nhớ thấp hơn, gây xung đột với BIOS của tôi.

Sau nhiều ngày cố gắng sửa lỗi cho MS-DOS mà không thành công, tôi chuyển sang thử nghiệm với FreeDOS phiên bản 1.4.

Kết quả khởi động FreeDOS thành côngKết quả khởi động FreeDOS thành công

Và điều kỳ diệu đã xảy ra! FreeDOS đã khởi động thành công. Sau tổng cộng ba tuần làm việc, tôi đã tạo ra một BIOS DIY đủ tương thích để chạy một hệ điều hành thực thụ trên chiếc bàn mixer âm thanh này.

Điều khiển LED và các bước tiếp theo

DDX3216 có rất nhiều LED VU-meter được điều khiển bởi các thanh ghi dịch (shift register) nối tiếp. Để điều khiển chúng, tôi cần gửi các bit dữ liệu cụ thể vào cổng IO 0x3000. Do các LED được kết nối xen kẽ giữa dương và âm để tiết kiệm dòng điện, mã lệnh điều khiển cũng khá đặc biệt:

bool even = false;
for (uint8_t i = 0; i < (8 * 5); i++) {
    if (even) {
        outb(0x3000, 0b11111111);
    } else {
        outb(0x3000, 0b00000000);
    }
    inb(0x3000); // Xung clock để đẩy dữ liệu
    even = !even;
}

Các bước tiếp theo của dự án này có thể bao gồm việc kết nối bộ chuyển đổi bàn phím AT-XT để có thể gõ lệnh trực tiếp trên máy, hoặc thậm chí thử nghiệm chạy Windows 2.0 hoặc 3.0. Mã nguồn đầy đủ của dự án đã được công bố trên GitHub để cộng đồng tham khảo.

Đây là một ví dụ tuyệt vời cho thấy việc hiểu sâu sắc về kiến trúc máy tính cũ có thể mang lại những ứng dụng thú vị trên phần cứng hiện đại một cách bất ngờ.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗