начало работы с Commodore64

 


От безделья засел за изучение компьютера. Эмулятор у меня уже был, взялся за поиск ассемблера и сборки .PRG


Нашелся один из вариантов (dasm 2.20.07)

;DASM C64 BASIC stub
          processor 6502
          org $801
          dc.w nxt_line    ; Calculate pointer to next BASIC line
          dc.w 2012        ; BASIC Line# (change this to any # you want)
          hex 9e           ; BASIC token for SYS
       if ml_start         ; If ml_start not defined, skip it for now
          dc.b [ml_start]d ; ML start address (use any address here) 2061
       endif
          hex 00           ; End of BASIC line
nxt_line  hex 00 00        ; The next BASIC line would start here
ml_start
ldy #00
loop
;the screen ram (default $0400-$07FF) that stores the characters (or 'tiles') codes
;the color ram ($D800-$DBFF) that stores the foreground color of each character
;the character rom ($D000-$DFFF) that defines characters pixels (kind of Font)
tya
sta $400,y
sta $D800,y
; sta $D000,y
iny
bne loop
          rts              ;Just giving the compiler something to do

получился .prg - программа на BASIC, которая содержит в себе сам код и старт программы в виде токена SYSадрес.
Сам код заполняет значениями символов и область памяти, которая отвечает за цвет.

Для удобства я решил пересесть на привычный ассемблер ACME, который заточен под С64, заодно при чтении доков выяснилось, что текстовый режим не так уж и прост

!to "test2.prg", cbm ; #name of output, type of assembly
!cpu 6502 ; type of cpu
* = $0801 ; set assembler context, where to operate.

          !word nxt_line    ; Calculate pointer to next BASIC line
          !word 2012        ; BASIC Line# (change this to any # you want)
          !byte $9e           ; BASIC token for SYS
;       if ml_start         ; If ml_start not defined, skip it for now
;          dc.b [ml_start]d ; ML start address (use any address here) 2061
!byte $32,$30,$36,$31
;       endif
          !byte 0;hex 00           ; End of BASIC line
nxt_line  !byte 0,0 ; hex 00 00        ; The next BASIC line would start here

ml_start
ldy #00
sei
;$D018 = %xxxx100x -> charmem is at $2000
;$D018 = %xxxx1xxx -> bitmap is at $2000
;$D018 = %0001xxxx -> screenmem is at $0400
lda #$18     ; screen at $0400, chars at $2000
sta $d018

loop

;?$dd00 -> $00 (bank 3, ie $c000 - $ffff)
;?$d018 -> $04 (screen at $c000, charset at $d000)
tya
sta $400,y ;Screen memory - for text mode
sta $D800,y ;Color memory - for text mode
sta $2000,y ;character data
iny
bne loop
          rts              ;Just giving the compiler something to do

После некоторых мучений удалось слепить почти 1К интро со звуком. Теперь решил заняться спрайтами и после мучений получил изображение. Об этом следующий пост.

Комментарии