Изменение цвета текста без памяти цветов в C64/Assembly

У меня есть код, как показано ниже, и он отлично работает. Он очищает экран, помещает некоторый цвет в цветовую память первых 12 символов на экране и печатает текст на экране.

         jsr $e544
         ldx #$00
         lda #3
loopclr: sta $d800,x
         inx
         cpx #$0c
         bne loopclr
         ldx #$00
         lda #0
loop:    lda message,x
         sta $0400,x
         inx
         cpx #$0c
         bne loop
         rts
message: .byte "Hello "
         .byte "World!"

Интересно, есть ли более простой способ изменить цвет текста в ассемблере C64, например POKE 646,color в BASIC?

Изменить: я думал, что мне нужно быть более ясным, я могу использовать

lda #color
sta 646

Но это не влияет на текст, выводимый на экран ассемблерным кодом в 1024+.

Есть ли адрес, который влияет на все символы, отображаемые на экране?

Редактировать: я думаю, что знаю ответ, нет.


person Community    schedule 19.02.2015    source источник


Ответы (1)


Теперь есть вопрос, который я никогда не думал, что мне зададут! sta $0286 (десятичное число 646) устанавливает цвет фона, который будет использоваться при использовании системной процедуры печати ($FFD2), которую я рекомендую вместо прямого доступа к видеопамяти, поскольку она учитывает положение курсора. Так:

        lda #$00     ; Black letters
        sta $0286    ; Set color
        ldx #$00
msgloop:
        lda message,x
        beq msgdone  ; Zero byte sets z flag - end of string - shorter than checking x value
        jsr $ffd2    ; print a to current device at current position (default: screen)
        inx
        bne msgloop  ; pretty much always unless you have a string > 255
msgdone:
        rts

message: .byte "Hello "
         .byte "World!"
         .byte 0

Что ж, моя репутация современного ассемблера исчезает! ;-)

person Mike    schedule 19.02.2015
comment
Почему ваш авторитет упадет? Я думаю, что ваш ответ великолепен. Я не знал о $ffd2 трюке. Спасибо. - person ; 19.02.2015
comment
Это то, что застряло у меня в голове даже через 30 лет после того, как я в последний раз использовал его. Вероятно, вы хотите ознакомиться с операционной системой. Полная разборка есть на ffd2.com/fridge/docs/c64-diss.html., векторы ядра начинаются с $FF81 с кратким описанием того, что каждый из них делает. - person Mike; 19.02.2015
comment
Ого, 30 лет! Я тоже пытался программировать C64 30 лет назад, но тогда у меня не было доступа ни к каким ресурсам программирования в моей стране. Спустя 30 лет решил освоить сборку С64. С такими, как ты, это кажется возможным. - person ; 19.02.2015
comment
Ты тоже! В качестве одного из моих наиболее эзотерических проектов я пытаюсь выяснить, как выглядело бы будущее, если бы на старом C64 был достойный компилятор C и unix-подобная ОС. - person Mike; 19.02.2015
comment
Это было бы совершенно потрясающе. Я думаю, что начал бы использовать Linux сразу после c64 и не тратил бы часть своей юности на Windows. - person ; 19.02.2015