6502, 12 ไบต์ (13 ไบต์หาก Apple II)
6502
รหัสเครื่องสันนิษฐานว่าคู่ตำแหน่งศูนย์หน้าเชื่อมต่อกับอินพุตอักขระ ($ FE) และฮาร์ดแวร์เอาต์พุต (FF) ระบบที่ใช้ 6502 หลายระบบจะช่วยอำนวยความสะดวกในการใช้ I / O ในลักษณะนี้แม้ว่าที่อยู่ I / O จะไม่อยู่ในศูนย์
เพื่อความง่ายฉันใช้Py65ระบบจำลองไมโครคอมพิวเตอร์ 6502 ที่เขียนด้วย Python
นี่คือการถ่ายโอนข้อมูลหน่วยความจำจาก Py65 คุณสามารถโหลดรหัสต่อไปนี้ได้ทุกที่ในหน้าศูนย์ซึ่งจะไม่ทับซ้อนกับ $ FE และ $ 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
ทำงานในหน้าต่างคำสั่งของ Windows คุณสามารถวาง (Ctrl + V) ข้อความใด ๆ ที่คุณต้องการหรือพิมพ์ได้ง่ายๆ หากพิมพ์ให้กด Ctrl + J เพื่อขึ้นบรรทัดใหม่ (อักขระ ASCII เดียวกัน) กด Ctrl + C เพื่อขัดจังหวะตัวประมวลผลและกลับไปที่พรอมต์คำสั่ง Py65
รหัสแอสเซมบลีนั้นง่ายต่อการอ่าน
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
เพื่อความชัดเจนนี่คือรหัสการประกอบในรูปแบบ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
Apple II
รหัสข้างต้นถือว่าเป็นโมฆะแสดงว่าไม่มีอินพุตดังนั้นให้ทำการสำรวจต่อไปจนกว่าจะส่งคืนค่าที่ไม่เป็นโมฆะ
สำหรับการเปรียบเทียบ Apple I และ Apple II ส่งสัญญาณความพร้อมใช้งานของอักขระใหม่โดยการตั้งค่าบิต 7 ของที่อยู่ I / O ของแป้นพิมพ์ซึ่งจะต้องถูกล้างหลังจากเรียกอักขระ บนระบบเหล่านั้นอักขระ I / O มักจะดำเนินการโดยเรียกรูทีนการมอนิเตอร์ระบบแทนการเข้าถึงฮาร์ดแวร์โดยตรง
ด้วยการเรียก RDKEY ($ FD0C) และ COUT ($ FDED) แอปเปิ้ลที่เทียบเท่ากับที่กล่าวมาสามารถเข้ารหัสใน 13 ไบต์และสามารถรันได้ทุกที่ใน RAM นี่คือรหัสที่ฉันใช้ในโปรแกรมจำลองแอปเปิ้ล // e, a2ixบน Android 9
การกด Return มีผลเช่นเดียวกับการขึ้นบรรทัดใหม่
*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
คุณสังเกตเห็นว่าแทนที่จะใช้ค่า ASCII ปกติ # $ 21 สำหรับเครื่องหมายอัศเจรีย์จะใช้ # $ A1 แทนหรือไม่ นั่นเป็นเพราะการส่งค่า ASCII มาตรฐานไปยัง COUT ทำให้พวกเขาแสดงใน "โหมดผกผัน" ดำบนพื้นขาว การแสดง ASCII ในสีขาวปกติบนพื้นดำต้องเพิ่ม # $ 80 ลงในค่าตัวอักษรในแอคคูเลเตอร์ก่อนเรียก COUT เนื่องจาก RDKEY ส่งคืนอักขระด้วยชุด hi-bit โดยทั่วไปแล้วแอสเซมบลีโปรแกรมจะทำการล้างบิตของอักขระเพื่อรับค่า ASCII ก่อนที่จะใช้