Skip to content

Releases: suzukiplan/vgszero

Version 1.15.0

08 Nov 23:39
6775ebd
Compare
Choose a tag to compare
  • vgsasm を version 1.0.0 から 1.2.2 に更新
    • LD E, {IXH|IXL|IYH|IYL} are incorrectly assembled to LD 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

05 Nov 11:58
49c4591
Compare
Choose a tag to compare
  • ツールチェインに vgsasm を追加
  • 推奨アセンブラを z88dk から vgsasm に変更
  • 基本的に全ての example にアセンブリ言語版を追加

Version 1.13.0

01 Oct 23:02
8c4dd32
Compare
Choose a tag to compare

スプライト座標を 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
image image

使用方法の詳細は example/17_clip を確認してください。

Version 1.12.0

26 Sep 21:41
d11d97b
Compare
Choose a tag to compare

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-plus1PTN フラグを指定するサンプルプログラムを提供

preview

Version 1.11.2

23 Jun 08:40
a063d3f
Compare
Choose a tag to compare

主に NSF 対応関連の品質向上をしたアップデートです。

  • RaspberryPi で NSF を再生し続けた時に Assertion error でクラッシュする場合がある不具合を修正
  • NSF を再生した時にデフォルトトラック(NSF の先頭から 8 バイト目で指定されたトラック)を再生するように修正
  • NSFPlayのコードリファクタ(不要コードの削除)
  • example/03_sound を VGSBGM と NSF を混在させた形に変更
  • README.md に推奨開発ツールの一覧を掲載
  • README.md でマルチトラック NSF の使い方について詳述

Version 1.11.1

22 Jun 09:42
1248775
Compare
Choose a tag to compare

未サポートの音楽データ形式を再生しようとするとクラッシュする不具合を修正しました。

Version 1.11.0

22 Jun 07:55
a31d37b
Compare
Choose a tag to compare
  • Extra RAM Bank の複製機能 OUT ($B5) を追加
  • NSF 形式 のデータを用いた BGM (ファミコン標準音源 + VRC6) の再生をサポート(bgm.dat に .nsf を組み込みそれを指定して再生することで再生可能)

Version 1.10.0

27 May 07:39
e1b0a5c
Compare
Choose a tag to compare

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

26 May 04:49
9114678
Compare
Choose a tag to compare

ポート 0xB4 の IN/OUT により Extra RAM Bank 領域 (0xA000 ~ 0xBFFF) を 8KB x 256 個(2MB)の RAM バンクへ切り替えることができるようになりました。また、本機能を利用するvgs0lib 関数 vgs0_rambank_switchvgs0_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」という概念に変更しています。

  1. VRAM (0x8000 ~ 0x9FFF) = 8KB
  2. Extra RAM Bank (0xA000 ~ 0xBFFF) = 8KB x 256 Banks (2MB)
  3. 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

23 May 23:32
e75d73a
Compare
Choose a tag to compare

ポート番号 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;