コモドール64に2つ目のディスプレイを追加するというアイデアを思いついた後、私はすぐにこのプロジェクトを実装しました。すべてのハードウェアは、標準サイズのカートリッジ(DE-15コネクタを含む)に収まります。VGA(31 kHz)と互換性のあるビデオ出力。
カートリッジの中には、フレームバッファ用の128KBのSRAMとシンプルな1ビットDACがあります。
TL; DR
これは、カートリッジ内のボードの外観です。ここからソースをダウンロードできます 。
プログラミングインターフェース
カートリッジは、I / O1またはI / O2を含め、64KBのアドレス空間のどこにでも配置できます。 8KBの基本メモリを使用する@EXPROMフレームバッファのウィンドウに表示するVerilogコード、またはRAMを節約するレジスタベースのアプローチがあります。
示されている例では、$ DE00のI / O1が制御レジスタに使用されています。他のアドオン(2番目のSIDチップなど)と競合する場合は、指定された例を変更することをお勧めします。一般に、競合を回避できる特別なトークンがサポートされていますが、これらの競合を引き起こす追加のソフトウェアはありません。 IOBASE
レジスタ
=トークン
IOBASE + 1 = lsbアドレス
IOBASE + 2 = msbアドレス
IOBASE + 3 =データフレームバッファ
は線形であり、ネイティブのC64ビットマップモードと同様に使いやすいです。SRAMでは、$ 00,000から始まります。
ビデオ出力
内蔵の100MHzジェネレーターにより、選択したモードに関係なく、25MHzのピクセルレートでビデオが出力されます。このパラメータは、60 HzFPSの640x480画面の25.175MHz標準に近いものです。したがって、接続したディスプレイはすべて、問題なく正しく画像を表示していました。このモードをトリガーするために、垂直および水平の同期およびブランキング領域が正しい極性と長さに設定されます。フレームバッファデータには、高解像度640x4801ビット/ピクセルモードと低解像度マルチカラーモード320x480の2つの解釈が考えられます。どちらのモードもパレットダイレクトです。
鉄
ハードウェアはかなり基本的です:3.3Vレギュレータ、CPLD、発振器、SRAM。 SRAMは、ホストへの応答に半分の時間を費やし、ピクセルデータのロードに半分の時間を費やしています。ここで使用されているCPLD、ザイリンクス95144XLは5Vで安定しているため、C64拡張バス上にありますが、他のハードウェアとともに3.3Vレギュレーターから電力が供給されます。
ほとんどすべてのCPLDリソースが使用されます。ポインター用に1つのハードウェアスプライトを取り付けることを望んでいましたが、そのためのスペースがありませんでした。
クーラーを印刷する人のために、STLモデルには必要なものがすべて揃っており、C64スタイルです。
重要な点は、ビットストリームをCPLDにロードするためにJTAGプログラマが必要なことです。
さらにもう1つ、カートリッジはUltimate 64ボードでは機能しません。さらに、このボードにカートリッジを取り付けると、カートリッジが損傷する可能性があります。ただし、すべてがC64、C128、およびC64リローデッドボードのすべてのバージョンで機能します。カートリッジがコモドールからリリースされたC64またはC128のすべてのバージョンと互換性があるかどうかはわかりませんが、問題はありません。
仕様
- 4- . Gerber. , ( , female-).
- . STL.
- , 22 , 6,6
- , pn 430156043726, reset .
- .1"
- 0603: 2 499R, 3 300R, 2 30R
- 0603: 10 0,1 , 7 0,01
- 2 3,2x1,6 ( , )
- XC95144XL-5TQ100C CPLD ( )
- JEDEC 128kx8 SO Async SRAM a la AS6C1008-55PCN ( )
- VGA , DE15
Verilog
これらのCPLD用のオープンソースツールキットが見つからなかったため、ザイリンクスISE14.5を使用しました。誰かがそのような情報を持っているなら、共有してください。
ピクセルパッキング
高解像度モードでは、各ビットは1ピクセルに対応します。 1 =白、0 =黒。アドレスは、左上の最も目に見える位置の(0,0)から右下(639 479)に、列ごとに移動し、次に行ごとに移動します。各バイトのビット7は最初のピクセルです。
マルチカラーモードでは、ピクセルはモノクロモードと同じレートで出力されますが、各カラーチャネルの解像度は異なります。緑は1/2ピクセルレート、赤と青は1/4ピクセルレートです。ビットパターンのカラーチャネルへのマッピングはバイトごと(断片的)であり、次のとおりです
。G0G1 G2 G3 R0 R1 B0 B1
フレームバッファの各バイトの画面表現は次のようになります
。R0R0R0R0 R1 R1 R1 R1
G0 G0 G1 G1 G2 G2 G3 G3
B0 B0 B0 B0 B1 B1 B1 B1
ImageMagick、モノクロモードで表示するために画像を
変換する: input.tiff -resize 640x480 -colors 2 -depth 1 output.monoを 変換する
カラーモード:
input.tiff +を変換するdither -posterize 2 -resize 640x480 output.tiff
convert output.tiff -separate channel%d.png
コードはPythonで書かれています-このオプションは私には最も簡単に思えました:
from PIL import Image
from array import *
import numpy as np
ir = Image.open("channel0.png")
ig = Image.open("channel1.png")
ib = Image.open("channel2.png")
ir = ir.resize((640,480))
ig = ig.resize((640,480))
ib = ib.resize((640,480))
r = ir.load()
g = ig.load()
b = ib.load()
arr=np.zeros((480,80,8))
out=np.zeros((480,640))
for y in range(0,480):
for x in range(0,80):
# 0 1 2 3 is green level
# 4 5 is red level
# 6 7 is blue level
# GREEN
arr[y][x][0]=(g[x*8+0,y]+g[x*8+1,y])/2
arr[y][x][1]=(g[x*8+2,y]+g[x*8+3,y])/2
arr[y][x][2]=(g[x*8+4,y]+g[x*8+5,y])/2
arr[y][x][3]=(g[x*8+6,y]+g[x*8+7,y])/2
# RED
arr[y][x][4]=(r[x*8+0,y]+r[x*8+1,y]+r[x*8+2,y]+r[x*8+3,y])/4
arr[y][x][5]=(r[x*8+4,y]+r[x*8+5,y]+r[x*8+6,y]+r[x*8+7,y])/4
#BLUE
arr[y][x][6]=(b[x*8+0,y]+b[x*8+1,y]+b[x*8+2,y]+b[x*8+3,y])/4
arr[y][x][7]=(b[x*8+4,y]+b[x*8+5,y]+b[x*8+6,y]+b[x*8+7,y])/4
for y in range(0,480):
for x in range(0,80):
for bit in range(0,8):
arr[y][x][bit] = int(round(round(arr[y][x][bit])/255))
newfile=open("output.bin","wb")
for y in range(0,480):
for x in range(0,80):
out[y][x] = int(arr[y][x][0] + arr[y][x][1]*2 + arr[y][x][2]*4 + arr[y][x][3]*8
+ arr[y][x][4]*16 + arr[y][x][5]*32 + arr[y][x][6]*64 + arr[y][x][7]*128)
newfile.write(out[y][x].astype(np.ubyte))
newfile.close()
デモビデオ:
収集してはんだ付けします:
このリンクから、作業に必要なすべてのファイルをダウンロードできます。