(適当な)c64のプログラミング

c64のプログラミング


メモリマップの概要

CART アドレス RAM ROM I/O
0000-0FFF RAM
1000-1FFF RAM
2000-2FFF
3000-3FFF
4000-4FFF
5000-5FFF
6000-6FFF
7000-7FFF
CART ROM HI 8000-8FFF RAM
9000-9FFF
CART ROM HI A000-AFFF RAM BASIC ROM
B000-BFFF
C000-CFFF RAM
D000-DFFF RAM CHAR ROM I/O
CART ROM LO E000-EFFF RAM KERNAL ROM
F000-FFFF
アドレス I/O
D000-D0FF VICU
D100-D1FF
D200-D2FF
D300-D3FF
D400-D4FF SID
D500-D5FF
D600-D6FF
D700-D7FF
D800-D8FF COLOR RAM
D900-D9FF
DA00-DAFF
DB00-DBFF
DC00-DCFF CIA 1
DD00-DDFF CIA 2
DE00-DEFF I/O 1
DF00-DFFF I/O 2

デフォルトの構成

カートリッジROM

カートリッジROMを接続した場合、最大3つのアドレス可能な場所に配置できます。
ただし、常に2つの8KBバンクしか認識しません。

BASICプログラム記憶領域

BASICプログラムは$0800〜&9FFFのRAM領域に記憶配置されます。

RAMテーブル

アドレス(Hex) アドレス(Dec) ページ 内容
$0000-$00FF 0-255 Page 0 ゼロページ
$0100-$01FF 256-511 Page 1 拡張ゼロページに(スタックが含まれています)
$0200-$02FF 512-767 Page 2 オペレーティング システムとBASICポインター
$0300-$03FF 768-1023 Page 3 オペレーティング システムとBASICポインター
$0400-$07FF 1024-2047 Page 4-7 スクリーン画面メモリ
$0800-$9FFF 2048-40959 Page 8-159 BasicプログラムのRAM領域(38911 bytes)
$A000-$BFFF 40960-49151 Page 160-191 マシン語プログラムのRAM領域(ROM切り替え時)
$C000-$CFFF 49152-53247 Page 192-207 マシン語プログラムのRAM領域
$D000-$D3FF 53248-54271 Page 208-211
$D400-$D7FF 54272-54527 Page 212-215
$D800-$DBFF 55296-56319 Page 216-219
$DC00-$DCFF 56320-56575 Page 220
$DD00-$DDFF 56576-56831 Page 221
$DE00-$DFFF 56832-57343 Page 222-223 インターフェイス拡張用に予約済み
$E000-$FFFF 57344-65535 Page 224-255 マシン語プログラムのRAM領域(ROM切り替え時)

ROMテーブル

アドレス(Hex) アドレス(Dec) ページ 内容
$8000-$9FFF 32768-40959 Page 128-159 カートリッジ ROM (low)
$A000-$BFFF 40960-49151 Page 160-191 BASICインタープリタROMまたはカートリッジ ROM(high)
$D000-$DFFF 53248-57343 Page 208-223 キャラクタージェネレータROM
$E000-$FFFF 57344-65535 Page 224-255 カーネルまたはカートリッジ ROM(high)

I/Oテーブル

アドレス(Hex) アドレス(Dec) ページ 内容
$0000-$0001 0-1 CPU I/O port(ゼロページ)
$D000-$D3FF 53248-54271 Page 208-211 VIC-IIレジスタ
$D400-$D7FF 54272-55295 Page 212-215 SIDレジスタ
$D800-$DBFF 55296-56319 Page 216-219 Color RAM
$DC00-$DCFF 56320-56575 Page 220 CIA 1
$DD00-$DDFF 56576-56831 Page 221 CIA 2
$DE00-$DEFF 56832-57087 Page 222 I/O 1
$DF00-$DFFF 57088-57343 Page 223 I/O 2

Color

color ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■
name シアン パープル 明赤 濃灰 灰色 明緑 水色 明灰
poke 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

色情報格納アドレス

BASIC-command POKE を使用して色を変更できるアドレスマップ

アドレス(Hex) アドレス(Dec) 内容
$0286 646 テキストの色
$0287 647 カーソル位置下のカラー
$D020 53280 画面枠の色 (0~15 の色の値、数値が大きいほど繰り返し表示されます)
$D021 53281 画面背景の色 (通常モード)
$D022 53282 画面背景の色 1 (マルチカラー &拡張カラーモードで使用))
$D023 53283 画面背景の色 2 (マルチカラー &拡張カラーモードで使用))
$D024 53284 画面背景の色 3 (拡張カラーモード))
$D025 53285 スプライトマルチカラー1(マルチカラーモードのみ))
$D026 53286 スプライトマルチカラー2(マルチカラーモードのみ)
$D027 53287 スプライトの色 0
$D028 53288 スプライトの色 1
$D029 53289 スプライトの色 2
$D02A 53290 スプライトの色 3
$D02B 53291 スプライトの色 4
$D02C 53292 スプライトの色 5
$D02D 53293 スプライトの色 6
$D02E 53294 スプライトの色 7
$D800-$DBE7 55296-56295 任意の画面座標を指定して色変更(*)

(*)画面マトリックス内のすべての1000文字(25行、40列)の個々の色を制御できます。
次の使用例は、左上隅(0行、0列)の文字を白色で設定します。

POKE 55296,1

文字表示格納アドレス

BASICコマンドPOKEを使用すると、256文字をビデオ マトリックスに配置できます。
次の使用例は、char A を左上隅(0行、0列)に表示します。

POKE 1024,1
アドレス(Hex) アドレス(Dec) 内容
Screen RAM
$0400-$07E7 1024-2023 任意の画面座標を指定して文字表示
$07E8-$07F7 2024-2039 未使用
Sprite block register
$07F8 2040 メモリブロック内のスプライト1のポインタ: Blockno.*64
$07F9 2041 メモリブロック内のスプライト2のポインタ: Blockno.*64
$07FA 2042 メモリブロック内のスプライト3のポインタ: Blockno.*64
$07FB 2043 メモリブロック内のスプライト4のポインタ: Blockno.*64
$07FC 2044 メモリブロック内のスプライト5のポインタ: Blockno.*64
$07FD 2045 メモリブロック内のスプライト6のポインタ: Blockno.*64
$07FE 2046 メモリブロック内のスプライト7のポインタ: Blockno.*64
$07FF 2047 メモリブロック内のスプライト8のポインタ: Blockno.*64

データセットI/Oバッファのスプライト1 $033C
Blockno.=13(13*64=832、16進数:$0340)

スプライト表示

スプライトイネーブル

8bitの各桁でON(1)、OFF(0)を設定

種類 Hex Dec
表示ON・OFF $D015 53269
X方向伸縮 $D01D 53277
Y方向伸縮 $D017 53271
BG優先度 $D01B 53275
衝突判定 $D01E 53278

スプライトポインタ

No Hex Dec
#0 $07F8 2040
#1 $07F9 2041
#2 $07FA 2042
#3 $07FB 2043
#4 $07FC 2044
#5 $07FD 2045
#6 $07FE 2046
#7 $07FF 2047

スプライト表示位置

No X Y
Hex Dec Hec Dec
#0 $D000 53248 $D001 53249
#1 $D002 53250 $D003 53251
#2 $D004 53252 $D005 53253
#3 $D006 53254 $D007 53255
#4 $D008 53256 $D009 53257
#5 $D00A 53258 $D00B 53259
#6 $D00C 53260 $D00D 53261
#7 $D00E 53262 $D00F 53263

ジョイスティックの読み取り

接続されたジョイスティックは、以下のアドレスで読み取ります。

ポート1 $DC01 / 56321

ポジション Fireボタン押してない Fireボタン押した
Dec Bit Dec Bit
真ん中 255 %11111111 239 %11101111
254 %11111110 238 %11101110
253 %11111101 237 %11101101
251 %11111011 235 %11101011
247 %11110111 231 %11100111
左上 250 %11111010 234 %11101010
右上 247 %11110111 230 %11100110
左下 249 %11111001 233 %11101001
右下 245 %11110101 229 %11100101

ポート2 $DC00 / 56320

ポジション Fireボタン押してない Fireボタン押した
Dec Bit Dec Bit
真ん中 127 %01111111 111 %01101111
126 %01111110 110 %01101110
125 %01111101 109 %01101101
123 %01111011 107 %01101011
119 %01110111 103 %01100111
左上 122 %01111010 106 %01101010
右上 118 %01110110 102 %01100110
左下 121 %01111001 105 %01101001
右下 117 %01110101 101 %01100101

TASM

コマンド

「左矢印キー」を押してから次のコマンドを押す事によって呼び出される。
「左矢印キー」はUS配列キーボードでの一番左上の「`」になる。

コマンド 機能
1 basicへ戻る
2 区切り行を挿入します
3 Assemble
4 印刷 (? - print, name - to file, ' - To Screen)
5 オブジェクトファイルの作成 (assemble to disk)
6 メモリの一部をデータとして入力します-バイナリデータを.byteとしてインポートします
7 タブを設定(戻り後のカーソル位置)
8 ニーモニック列の位置
c コールドスタート(Like "NEW" in basic)
Return 行を挿入します (undo "=")
DEL 行を削除
Arrow up 行をラインバッファに入れます
\ バッファを貼り付けます(「Arrow up」を参照)
/ カーソル位置の後ろ、行の残りの部分のデータを削除します。
INST ラインインサートのオン/オフ
q 左端にカーソルを置きます-特にFキーマクロに適しています!
= Join lines (Hard to explain! Try!)
l PRG形式でファイルをロードします
s PRG形式でファイルを保存
e SEQファイルを入力(ロード)
w SEQファイルとして書き込む(保存)
* Directory
@ ディスク情報
L アドレスへデータをロードします(ファイルのデフォルトアドレスで質問のロード時に戻ります)
p ファイルを保護します
+ 加算ルーチン
- 減算ルーチン
: List マーク
; Kill マーク
m マークを設定します(0〜9-ブックマーク、S-ブロックの開始、E-ブロックの終了)
g cマーク(「m」を参照)
a 制御コードを入力します(「右矢印キー」で中止)
b ブロックコマンド(最初に「m」コマンドでブロックを定義する必要があります)。
ここから、以前に定義したセクションをコピー、ディスクへの書き込み、強制終了、または保存できます。
u ラベルの一覧表示(?-プリンタへ、Name-ディスクへ、 '-画面へ)
v メモリマップ
i メモリを初期化します (Zero fill unused)
F メモリーを埋める(範囲を指定)
j 16進ダンプで指定されたメモリ領域
S アドレスにデータを保存
f 検索:...(「h」を参照)
h 次をハント(「f」で定義)
r 文字の置き換え(Replace: ... By: ... Finds the first occurrence (「t」および「y」を参照)
t 最初の置換を実行します(「r」を参照)
y 全ての置換を実行します。(「r」を参照)
n ソースの指定された行に移動します
d 制御コード
<- 「左矢印キー」を挿入するには、「左矢印キー」を2回押す
k F3-F6を再定義します(再定義するキーが続きます)
F1 Fキーのリセット(「k」の編集を元に戻す)
o 画面の色変更
K キークリックのオン/オフ

ファンクションキー

コマンド 機能
F1 1画面上へ移動(PAGE UP)
F2 一番トップ画面へ移動(HOME)
F3 .WORD / .TEXT / DIR
F4 Assemble開始
F5 .BYTE
F6 現在の行を削除する
F7 1画面下へ移動(PAGE DOWN)
F8 一番最後の画面へ移動(END)
Inst 挿入モードのオン/オフ

疑似Opコード

.BYTE

.BYTE "p", $ab,%100011001,49,&19

データを入力します。
引用符(1文字)内、16進数($ E0)、2進数(%10001110)、10進数(45)、または8進数(&34)のいずれかです。
数字はコンマで区切ります。

.WORD

.WORD label, $1000, label+$f8/2, *-9

通常の6502/6510の方法、つまりローバイト、ハイバイトで16ビット/ 2バイトアドレスを入力します。

*

* = $XXXX

XXXXはここからあなたのコードの始まりです。
何度でも使用できますが、ディスク("5" assemble to disk)にassembleするときは注意。

.TEXT

.TEXT "Some text"

ASCII形式でテキストを入力します。
ポークコードを入力する明確な方法はないことに注意してください。
ただし、この目的のために、私は独自の方法をお勧めします。
AND #$3F または :

;

; <Comment>

セミコロンの後にコメントを入力します。

.OFFS

.OFFS XXXX

これは、コードを再配置するタフなものです。
.OFFSの値は、* =値に追加された値です。
例)
「*=$ 1000」の後に、OFFS $0800が続くと、コードは$1800になり、.OFFS $F800は$0800になります。
ドライブコードのようなものを挿入することは、それが少し理解しやすくなったとしても、この機能のおかげで喜びです。
それを機能させる秘訣はこのコードであるため、これも機能します

 	*=$1000
label1	 
 	*=$0400          ;Start for f.ex. drive code
 	.OFFS 0-(*-label1)
label2	LDA label2

ラベルは次のように初期化されます。

Label1         =$1000
Label2         =$0400

コードLDA $0400は、メモリの$1000に配置されます。