6502, 12 byte (13 byte jika Apple II)
6502
Kode mesin mengasumsikan bahwa sepasang lokasi nol halaman terhubung ke perangkat keras input karakter ($ FE) dan output (FF). Banyak sistem berbasis 6502 memfasilitasi I / O dengan cara ini, meskipun alamat I / O biasanya tidak berada di halaman nol.
Untuk kesederhanaan, saya menggunakan Py65 , sebuah simulator sistem komputer 6502 yang ditulis dengan Python.
Berikut ini adalah dump memori dari Py65. Anda dapat memuat kode berikut di mana saja di halaman nol sehingga tidak tumpang tindih dengan $ FE dan $ 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
Berjalan di jendela perintah Windows, Anda dapat menempel (Ctrl + V) teks apa pun yang Anda inginkan, atau Anda cukup mengetik. Jika mengetik, tekan Ctrl + J untuk baris baru (karakter ASCII yang sama). Tekan Ctrl + C untuk mengganggu prosesor dan kembali ke command prompt Py65.
Secara alami, kode assembly lebih mudah dibaca.
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
Untuk kejelasan, berikut adalah kode perakitan dalam format 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
Kode di atas mengasumsikan nol menunjukkan tidak ada input, jadi lanjutkan polling hingga nilai yang bukan nol dikembalikan.
Sebagai perbandingan, Apple I dan Apple II memberi sinyal ketersediaan karakter baru dengan menetapkan bit 7 dari alamat I / O keyboard, yang kemudian harus dihapus setelah mengambil karakter. Pada sistem tersebut, karakter I / O biasanya dilakukan dengan memanggil rutinitas monitor sistem alih-alih mengakses perangkat keras secara langsung.
Dengan memanggil RDKEY ($ FD0C) dan COUT ($ FDED), yang setara dengan Apple II di atas dapat dikodekan dalam 13 byte, dan dapat dijalankan di mana saja dalam RAM. Berikut adalah kode yang saya jalankan di Apple // e emulator, a2ix di Android 9.
Menekan Pengembalian memiliki efek yang sama dengan baris baru.
*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
Apakah Anda memperhatikan bahwa alih-alih nilai ASCII normal # $ 21 untuk titik seru, # $ A1 digunakan sebagai gantinya? Itu karena mengirim nilai ASCII standar ke COUT menyebabkannya ditampilkan dalam "mode terbalik," hitam putih. Menampilkan ASCII dalam warna putih normal pada hitam memerlukan penambahan # $ 80 pada nilai karakter di akumulator sebelum memanggil COUT. Karena RDKEY mengembalikan karakter dengan set hi-bit, program perakitan umumnya membersihkan bit karakter untuk mendapatkan nilai ASCII sebelum menggunakannya.