C = 64第4部分:ASCII艺术

下一个任务是在屏幕上打印一个小的ASCII艺术作品 。 为此,我增强了宏,以便能够在屏幕上的任何X,Y位置显示文本。

我发现,如果要使用16位内存地址,则需要使用间接索引寻址模式:

  • 我已经预先计算了每个屏幕行的地址(请参阅scrLines )。
  • 接下来,我将所选屏幕行的内存地址保存到零页上未使用的位置。 我为MSB选择了$ FC位置,为LSB选择了$ FB。
  • 将存储线地址保存到零页$ FB $ FC位置后,指令STA($ FB),Y用于将A寄存器的值保存到Y寄存器在零页$ FB $ FC位置中引用的地址用作偏移量的值:

这是代码:

  ;  ---------------------------------- 
;
; 在X,Y处打印字符串
;
; ----------------------------------

defm PRINT_AT_XY
; 在/ 1 = X(内存)
; In / 2 = Y(内存)
; / 3 =字符串/字节数组(内存)
; In / 4 =字符串/数组长度(内存)

lda / 2; 加载Y位置
asl; 乘以2(我们使用单词...)
税收; A-> X

lda scrLines,X; 加载LSB(例如,从$ 28到$ 0428)
sta $ fb; 将其保存到未使用的零页单元格

墨水; 到达MSB地址
lda scrLines,X; 加载MSB(例如,$ 04到$ 0428)
sta $ fc; 将其保存到未使用的零页

ldy / 1; 负载X位置
ldx#0; 加载字符串长度

@环
lda / 3,X​​; 将字符加载到A
sta($ fb),Y; 使用间接索引地址保存A
墨水; 增加字符串索引
伊尼; 增加屏幕位置
cpx / 4; 我们到达字符串末尾了吗?
密件抄送@loop

结局

; 所有25条屏幕行的地址(C64为40x25字符)
scrLines字$ 0400,$ 0428,$ 0450,$ 0478,$ 04A0,$ 04C8,$ 04F0,$ 0518,$ 0540,$ 0568,$ 0590,$ 05B8,$ 05E0,$ 0608,$ 0630,$ 0658,$ 0680,$ 06A8,$ 06D0,$ 06F8, $ 0720,$ 0748,$ 770,$ 798,$ 7C0

屏幕上的结果:

GitHub:https://github.com/RetroAsmDev/C64asm/tree/master/TextOutput3