6502, 12 byte (13 byte nếu Apple II)
6502
Mã máy giả định rằng một cặp vị trí trang 0 được kết nối với phần cứng đầu vào ký tự ($ FE) và đầu ra (FF). Nhiều hệ thống dựa trên 6502 tạo điều kiện cho I / O theo cách này, mặc dù địa chỉ I / O thường không ở trang không.
Để đơn giản, tôi đã sử dụng Py65 , một trình giả lập hệ thống máy vi tính 6502 được viết bằng Python.
Đây là một bãi chứa bộ nhớ từ Py65. Bạn có thể tải đoạn mã sau ở bất cứ đâu trong trang 0 để nó không trùng với $ FE và $ FF.
PC AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.mem 0:b
0000: a9 21 85 ff a5 fe f0 fc 85 ff d0 f4
Chạy trong cửa sổ lệnh Windows, bạn có thể dán (Ctrl + V) bất kỳ văn bản nào bạn muốn hoặc bạn chỉ cần gõ. Nếu gõ, nhấn Ctrl + J cho một dòng mới (cùng char ASCII). Nhấn Ctrl + C để ngắt bộ xử lý và quay lại dấu nhắc lệnh Py65.
Đương nhiên, mã lắp ráp dễ đọc hơn.
PC AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.d 00:0b
$0000 a9 21 LDA #$21
$0002 85 ff STA $ff
$0004 a5 fe LDA $fe
$0006 f0 fc BEQ $0004
$0008 85 ff STA $ff
$000a d0 f4 BNE $0000
Để rõ ràng, đây là mã lắp ráp ở định dạng CBA65 .
; ASSEMBLE:
; cba65 bangit
;
; LOAD/RUN
; python3 py65/monitor.py -i 00fe -o 00ff -l bangit.bin
; goto 0000
.FILES BIN=256
; I/O LOCATIONS
GETC .EQU $FE ; (1) MOVING PY65'S GETC TO ZP SHAVES 1 BYTE
PUTC .EQU $FF ; (1) MOVING PY65'S PUTC TO ZP SHAVES 2 BYTES
.ORG $0000
VROOM LDA #'!'
STA PUTC
VROOM2 LDA GETC
BEQ VROOM2
STA PUTC
BNE VROOM
.END
Táo II
Mã ở trên giả sử null cho biết không có đầu vào, vì vậy tiếp tục bỏ phiếu cho đến khi giá trị khác null được trả về.
Để so sánh, Apple I và Apple II báo hiệu sự sẵn có của một ký tự mới bằng cách đặt bit 7 của địa chỉ I / O bàn phím, sau đó cần phải xóa sau khi tìm nạp ký tự. Trên các hệ thống đó, I / O ký tự thường được thực hiện bằng cách gọi các thói quen giám sát hệ thống thay vì truy cập trực tiếp vào phần cứng.
Bằng cách gọi RDKEY ($ FD0C) và COUT ($ FDED), tương đương Apple II ở trên có thể được mã hóa thành 13 byte và có thể chạy được ở bất cứ đâu trong RAM. Đây là mã tôi đã chạy trong trình giả lập Apple // e, a2ix trên Android 9.
Nhấn Return có tác dụng tương tự như một dòng mới.
*300L
0300- A9 A1 LDA #$A1
0302- 20 ED FD JSR $FDED
0305- 20 0C FD JSR $FD0C
0308- 20 ED FD JSR $FDED
030B- F0 F3 BEQ $0300
Bạn có để ý rằng thay vì giá trị ASCII bình thường # $ 21 cho dấu chấm than, # $ A1 được sử dụng thay thế không? Đó là bởi vì việc gửi các giá trị ASCII tiêu chuẩn tới COUT khiến chúng được hiển thị ở "chế độ nghịch đảo", màu đen trắng. Hiển thị ASCII màu trắng bình thường trên nền đen yêu cầu thêm # $ 80 vào giá trị ký tự trong bộ tích lũy trước khi gọi COUT. Vì RDKEY trả về các ký tự với tập hi-bit, các chương trình lắp ráp thường xóa bit của ký tự để lấy giá trị ASCII của nó trước khi sử dụng.