На каналі Ben Eater розповідається про комп'ютер на 6502. Особисто мені подобаються старі комп'ютери через їх атмосферність. Більше років десяти тому я знайшов книжку (від саморобок на логічних мікросхемах до мікро ЕОМ) про те як покроково зібрати комп'ютер з дискретних мікросхем. Мене тоді вразила сама можливість самому зробити те, що мені тоді здавалось надзвичайно складним.
Зараз я розумію, що нічого складного в 50и річних процесорах нема, а головні виклики були технічні: як запрограмувати ROM, як дістати мікросхеми, як не спалити мікросхеми, як заставити їх стабільно працювати, тощо.
Якщо ж сьогодні збирати комп'ютер 80х років, то можна обійтись (для початку) набагато меншою кількістю мікросхем і значно спростити схему. Що Бен в принципі і зробив. Окрім процесора, генератора, мікросхем RAM і ROM, селектора адрес, є мікросхема "GPIO" для комунікації процесора із зовнішнім світом, LCD, мікросхема UART та перетворювач рівнів для повноцінного COM порту.
В порівнянні з оригінальною схемою я вніс невеличкі зміни бо використовую ROM двічі більшого розміру (так було дешевше).

Які переваги такого комп'ютера у 2026 році? Я бачу дві: самонавчання на дуже простому комп'ютері і естетична насолода.
Я не знаю чи є сенс забирати в Бена хліб і переповідати що він там у відео розказує в деталях. Він починає писати програми на машиному коді і поступово переходить в асемблер. Наведу для прикладу асемблерний файл для Hello world на LCD:
PORTB = $6000
PORTA = $6001
DDRB = $6002
DDRA = $6003
E = %10000000
RW = %01000000
RS = %00100000
* = $0000
.dsb $8000, $00
.org $8000
reset:
ldx #$ff
txs
lda #%11111111 ; Set all pins on port B to output
sta DDRB
lda #%11100000 ; Set top 3 pins on port A to output
sta DDRA
lda #%00111000 ; Set 8-bit mode; 2-line display; 5x8 font
jsr lcd_instruction
lda #%00001110 ; Display on; cursor on; blink off
jsr lcd_instruction
lda #%00000110 ; Increment and shift cursor; don't shift display
jsr lcd_instruction
lda #$00000001 ; Clear display
jsr lcd_instruction
ldx #0
print:
lda message,x
beq loop
jsr print_char
inx
jmp print
loop:
jmp loop
message: .asciiz "Hello, world!"
lcd_wait:
pha
lda #%00000000 ; Port B is input
sta DDRB
lcdbusy:
lda #RW
sta PORTA
lda #(RW | E)
sta PORTA
lda PORTB
and #%10000000
bne lcdbusy
lda #RW
sta PORTA
lda #%11111111 ; Port B is output
sta DDRB
pla
rts
lcd_instruction:
jsr lcd_wait
sta PORTB
lda #0 ; Clear RS/RW/E bits
sta PORTA
lda #E ; Set E bit to send instruction
sta PORTA
lda #0 ; Clear RS/RW/E bits
sta PORTA
rts
print_char:
jsr lcd_wait
sta PORTB
lda #RS ; Set RS; Clear RW/E bits
sta PORTA
lda #(RS | E) ; Set E bit to send instruction
sta PORTA
lda #RS ; Clear E bits
sta PORTA
rts
.org $fffc
.word reset
.word $0000
Програма зрозуміла навіть тим, хто вперше бачить асемблерний код: задіяно лише кілька інструкцій. Я від себе лише додав заповнення файлу нулями на початку для того аби записуваний файл в ROM був чітко 64кБ.
Компілятор можна скачати тут. Скомпілювати можна командою
vasm6502_oldstyle.exe -Fbin -dotdir ./hello-world-final.s
Подивитись скомпільований файл можна ось так:
hexdump -C a.bin
Я прошивав ROM своїм саморобним програматором. Все запрацювало майже зразу.
Наразі поки чекаю мікросхему UART. Як приїде, будем робити щось накшталт Apple I.
