У меня есть код 6502 для печати строки в памяти экрана после очистки экрана. К сожалению, если я напечатаю строку, например, «HELLO WORLD», она будет искажена. Я обнаружил, что это связано с тем, что символы верхнего регистра начинаются с 0x01, а не с 0x41, как я думал из кодов PETSCII здесь.
Я могу исправить это, вычитая из своей строки 0x40, но тогда все, кроме букв, неверно, например пробелы. Я просто не уверен, почему генератор символов превращает 0x01 в символ «A», а не 0x41. Он превращает 0x41 в перевернутую пику (как на колоде карт), а все, что выше, кажется граничными и странными символами.
Посмотрев некоторое время, я нашел эту цитату на странице Википедии для PETSCII, которая, казалось, излагала проблему, которую я пытаюсь решить, но я не уверен, как это исправить, и нигде не могу найти никакой информации...
В ПЗУ фактического генератора символов использовался другой набор назначений. Например, чтобы отобразить символы «@ABC» на экране, напрямую выполнив POKE в памяти экрана, нужно POKE использовать десятичные значения 0, 1, 2 и 3, а не 64, 65, 66 и 67.
Я работаю на эмуляторе VICE x64 в Mac OS X и собираю с портом OS X 64tass.
Это ассемблерный код без вычитания 0x40:
*=$c000
BORDER = $d020
INNER = $d021
start lda #0
sta BORDER
lda #0
sta INNER
jsr clear
jsr string
loop
jmp loop
clear ; clear screen
lda #$00
tax
lda #$20
clrloop
sta $0400, x ; clear each memory "row"
sta $0500, x
sta $0600, x
sta $0700, x
dex
bne clrloop ; clear if x != 0
rts
string ; load string
ldx #$0
strloop lda hello, x ; load each byte in turn
cmp #0 ; if we reached a null byte, break
beq strexit
sta $0400, x
inx
jmp strloop
strexit rts
hello .text "HELLO WORLD"
.byte 0
Вот скриншот вывода
Спасибо всем в комментариях!
Примечание, чтобы помочь другим
Вы можете указать, в какую строку и столбец будет выводиться CHROUT, установив положение курсора с помощью PLOT.