Releases: suzukiplan/vgszero
Version 1.15.0
- vgsasm を version 1.0.0 から 1.2.2 に更新
LD E, {IXH|IXL|IYH|IYL}
are incorrectly assembled toLD C, {IXH|IXL|IYH|IYL}
.- Support
label+n
expression. - Support nested struct access.
- ROM to Memory DMA (OUT $C1) が想定通りに動作をしない不具合を修正
- マクロ
dma2mem
を vgszero.inc へ追加
Version 1.14.0
Version 1.13.0
スプライト座標を 16bit にすることができる OAM16 を VRAM に追加しました。
CPU address | VRAM address | Map |
---|---|---|
0x9A00 ~ 0x9DFF | 0x1A00 ~ 0x1DFF | OAM16 |
OAM16 のレイアウトは次の通りです。
struct OAM16 {
unsigned short y;
unsigned short x;
} oam16[256];
OAM16 の x または y の値が非ゼロの場合に有効になります。
本機能を用いることで 24px 以上のサイズのスプライトがクリップ表示されるようになります。
OAM | OAM16 |
---|---|
使用方法の詳細は example/17_clip を確認してください。
Version 1.12.0
Attribute の bit-4 (PTN フラグ) を指定することで DPM のバンク番号を +1 する機能を追加
Bit-7 | Bit-6 | Bit-5 | Bit-4 | Bit-3 | Bit-2 | Bit-1 | Bit-0 |
---|---|---|---|---|---|---|---|
VI |
LR |
UD |
PTN |
P3 |
P2 |
P1 |
P0 |
- 本機能は BG, FG, スプライトの全てで使用可能
- 本機能は DPM (Direct Pattern Mapping) を使用時に限り有効
example/16_ptn-plus1 で PTN
フラグを指定するサンプルプログラムを提供
Version 1.11.2
主に NSF 対応関連の品質向上をしたアップデートです。
- RaspberryPi で NSF を再生し続けた時に
Assertion error
でクラッシュする場合がある不具合を修正 - NSF を再生した時にデフォルトトラック(NSF の先頭から 8 バイト目で指定されたトラック)を再生するように修正
- NSFPlayのコードリファクタ(不要コードの削除)
- example/03_sound を VGSBGM と NSF を混在させた形に変更
- README.md に推奨開発ツールの一覧を掲載
- README.md でマルチトラック NSF の使い方について詳述
Version 1.11.1
未サポートの音楽データ形式を再生しようとするとクラッシュする不具合を修正しました。
Version 1.11.0
- Extra RAM Bank の複製機能
OUT ($B5)
を追加 - NSF 形式 のデータを用いた BGM (ファミコン標準音源 + VRC6) の再生をサポート(bgm.dat に .nsf を組み込みそれを指定して再生することで再生可能)
- NSF 対応についての参考記事: https://note.com/suzukiplan/n/n94ea503ff2c8
Version 1.10.0
SDL2 版 VGS-Zero エミュレータにデバッグ機能を追加しました。
デバッグ機能は -d
オプションを指定することで有効にできます。
./vgs0 -d /path/to/game.pkg
デバッグ機能を有効にすると NOP
命令を検出したタイミングで対話形式のデバッガが SDL2 版 VGS-Zero エミュレータのコンソール上で起動します。
2024.05.26 14:31:02 Start main loop...
2024.05.26 14:31:02 NOP at 0x0021
A :0x01 F :0xA0, B :0x00, C :0x00, D :0x81, E :0x96, H :0x00, L :0x6F
A':0x00 F':0x00, B':0x00, C':0x00, D':0x00, E':0x00, H':0x00, L':0x00
PC:0x0021, SP:0xFFFF, IX:0x0000, IY:0x0000, I :0x00, R :0x5C
ROM BANK: 0x00, 0x01, 0x02, 0x03
RAM BANK: 0x00
SCANLINE: V=200, H=174
SCROLL: BGX=0, BGY=0, FGX=0, FGY=0
>
デバッガがサポートするコマンドは次の通りです。
M
メモリダンプD
ディスアセンブル・トグルH
ヘルプ- 再開
なお、コマンドは大文字と小文字を区別しません。
以下に各コマンドの仕様と使用例を記します。
(Memory Dump Command)
M アドレス サイズ
を実行することでメモリの内容をダンプします- アドレスは 16 進数で指定してください(デフォルト: 0xC000)
- サイズは 10 進数で指定してください(デフォルト: 256)
m8170 64
Dump from 0x8170 (64 bytes)
ADDR +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F ASCII
8170: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
8180: 00 00 00 00 00 00 00 00 - 00 00 48 45 4C 4C 4F 2C ..........HELLO,
8190: 57 4F 52 4C 44 21 00 00 - 00 00 00 00 00 00 00 00 WORLD!..........
81A0: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
(Toggle Disassemble Command)
D
を入力するとディスアセンブルの 有効 or 無効 をトグルすることができます- ディスアセンブルを有効にするとプログラムの実行速度が著しく遅くなるため注意してください
- ディスアセンブルしたい極小範囲に
NOP
を仕掛けて命令が実行される流れを確認することに適しています
2024.05.26 16:29:26 Start main loop...
2024.05.26 16:29:26 NOP at 0x0007
A :0x80 F :0x90, B :0x00, C :0x00, D :0x00, E :0x00, H :0x9F, L :0x07
A':0x00 F':0x00, B':0x00, C':0x00, D':0x00, E':0x00, H':0x00, L':0x00
PC:0x0007, SP:0xFFFF, IX:0x0000, IY:0x0000, I :0x00, R :0x40
ROM BANK: 0x00, 0x01, 0x02, 0x03
RAM BANK: 0x00
SCANLINE: V=200, H=18
SCROLL: BGX=0, BGY=0, FGX=0, FGY=0
> d
Enabled Disassemble
>
[0006] NOP
[0007] LD BC<$0000>, $0008
[000A] LD HL<$9F07>, $005C
[000D] LD DE<$0000>, $9800
[0010] LDIR ... BC<$0008>, DE<$9800>, HL<$005C>
[0010] LDIR ... BC<$0007>, DE<$9801>, HL<$005D>
[0010] LDIR ... BC<$0006>, DE<$9802>, HL<$005E>
[0010] LDIR ... BC<$0005>, DE<$9803>, HL<$005F>
[0010] LDIR ... BC<$0004>, DE<$9804>, HL<$0060>
[0010] LDIR ... BC<$0003>, DE<$9805>, HL<$0061>
[0010] LDIR ... BC<$0002>, DE<$9806>, HL<$0062>
[0010] LDIR ... BC<$0001>, DE<$9807>, HL<$0063>
[0012] LD A<$80>, $01
[0014] OUT ($C0), A<$01>
[0016] LD BC<$0000>, $000C
[0019] LD HL<$0064>, $0064
[001C] LD DE<$9808>, $818A
[001F] LDIR ... BC<$000C>, DE<$818A>, HL<$0064>
[001F] LDIR ... BC<$000B>, DE<$818B>, HL<$0065>
[001F] LDIR ... BC<$000A>, DE<$818C>, HL<$0066>
[001F] LDIR ... BC<$0009>, DE<$818D>, HL<$0067>
[001F] LDIR ... BC<$0008>, DE<$818E>, HL<$0068>
[001F] LDIR ... BC<$0007>, DE<$818F>, HL<$0069>
[001F] LDIR ... BC<$0006>, DE<$8190>, HL<$006A>
[001F] LDIR ... BC<$0005>, DE<$8191>, HL<$006B>
[001F] LDIR ... BC<$0004>, DE<$8192>, HL<$006C>
[001F] LDIR ... BC<$0003>, DE<$8193>, HL<$006D>
[001F] LDIR ... BC<$0002>, DE<$8194>, HL<$006E>
[001F] LDIR ... BC<$0001>, DE<$8195>, HL<$006F>
2024.05.26 16:29:30 NOP at 0x0022
A :0x01 F :0xA0, B :0x00, C :0x00, D :0x81, E :0x96, H :0x00, L :0x70
A':0x00 F':0x00, B':0x00, C':0x00, D':0x00, E':0x00, H':0x00, L':0x00
PC:0x0022, SP:0xFFFF, IX:0x0000, IY:0x0000, I :0x00, R :0x5D
ROM BANK: 0x00, 0x01, 0x02, 0x03
RAM BANK: 0x00
SCANLINE: V=200, H=176
SCROLL: BGX=0, BGY=0, FGX=0, FGY=0
> d
Disable Disassemble
>
(Help Command)
H
または ?
を入力するとコマンドのヘルプを表示します。
2024.05.26 16:32:28 Start main loop...
2024.05.26 16:32:28 NOP at 0x0007
A :0x80 F :0x90, B :0x00, C :0x00, D :0x00, E :0x00, H :0x9F, L :0x07
A':0x00 F':0x00, B':0x00, C':0x00, D':0x00, E':0x00, H':0x00, L':0x00
PC:0x0007, SP:0xFFFF, IX:0x0000, IY:0x0000, I :0x00, R :0x40
ROM BANK: 0x00, 0x01, 0x02, 0x03
RAM BANK: 0x00
SCANLINE: V=200, H=18
SCROLL: BGX=0, BGY=0, FGX=0, FGY=0
> h
M ADDR SIZE ... Memory Dump (ADDR: HEX, SIZE: DEC)
D ............. Toggle Disassemble
H or ? ........ Help
Other ......... Continue
>
(Other Command)
プログラムを再開します。
Version 1.9.0
ポート 0xB4 の IN/OUT により Extra RAM Bank 領域 (0xA000 ~ 0xBFFF) を 8KB x 256 個(2MB)の RAM バンクへ切り替えることができるようになりました。また、本機能を利用するvgs0lib 関数 vgs0_rambank_switch
と vgs0_rambank_get
を追加しています。
Extra RAM Bank の導入に伴い、VGS-Zero の RAM 構造の考え方を若干アップデートしました。(従来との互換性は維持しています)
https://github.com/suzukiplan/vgszero/blob/master/README.md#ram-scheme
従来の VGS-Zero の RAM は VRAM (16KB) と Main RAM (16KB) の 32KB でしたが、VRAM の後半 8KB を「Extra RAM Bank」という概念に変更しています。
- VRAM (0x8000 ~ 0x9FFF) = 8KB
- Extra RAM Bank (0xA000 ~ 0xBFFF) = 8KB x 256 Banks (2MB)
- Main RAM (0xC000 ~ 0xFFFF) = 16KB
従来からある VRAM は、Name Table、Attribute Table、OAM、Palette、VDP レジスタなどグラフィックスの表示や制御に関する機能で使用するメモリ区画で、Main RAM は変数(0xC000〜)やスタック(〜0xFFFF)などのデータ保持に用いるメモリ区画です。
Extra RAM Bank は、従来の VRAM の Character Pattern Table の領域(8KB)です。
VGS-Video では、DPM; Direct Pattern Mapping 機能や OAM Bank 機能を用いることで、ROM 上のデータをダイレクトにキャラクタパターンとして使用できるため、キャラクタパターンを RAM (VRAM) へ展開する必要がなく(※キャラクパターンをプログラムで動的に書き換えたい場合を除く)、その場合はその 8KB の領域を RAM として使うことができました。
そのユースケース自体は従来バージョン(1.8.0 以前)でもドキュメント上で推奨していましたが、今回のバージョンアップでその領域を256個のバンクにバンク切り替えできるように拡張できるようにしました。
Version 1.8.0
ポート番号 0xC1 を OUT することで、特定のバンクの特定サイズの内容を任意のアドレスに DMA 転送することができる機能を追加しました。
本機能は BC, DE, HL に次の内容を設定します:
- BC: 転送元バンク内のオフセット(0x0000〜0x1FFF)
- DE: 転送サイズ(8192 - BC 以下)
- HL: 転送先アドレス
以下にバンク番号 0x23 の 0x1234 から 512 バイトを 0xCE00 (RAM) へ DMA 転送する例を示します。
LD A, 0x23
LD BC, 0x1234
LD DE, 512
LD HL, 0xCE00
OUT (0xC1), A
また、本機能は C 言語用ライブラリ(vgs0lib)の vgs0_dma_ram
関数でも使用することができます。
/**
* @brief High-speed DMA transfer of the contents of the specified ROM Bank to the RAM or VRAM
* @param prg ROM Bank number (0-255)
* @param src Offset of prg (0-8191)
* @param size Transfer size (1-8192)
* @param dst Destination address (0x0000 ~ 0xFFFF)
* @note https://github.com/suzukiplan/vgszero/blob/master/README.md#rom-to-memory-dma
*/
void vgs0_dma_ram(uint8_t prg, uint16_t offset, uint16_t size, uint16_t dst) __smallc;