Комп'ютер 6502

На каналі 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.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *