어셈블리 언어로 GAMEBOY 개발(배경 표시)

6808 단어 gameboyassembly
지난번에 화면을 사용하지 않았는데 이러면 전혀 재미없어서 그려봤어요.GB는 배경 화면에 sprite라고 불리는 이동 이미지를 겹쳐서 표시합니다. (가능합니다. 아직 자세히 조사하지 않았습니다.)이번에는 배경화면을 시도해 봤다.
소스 코드는 여기.입니다.

GB 화면 표시 구조


평평하게 펴다

  • GAMEBOY의 배경 이미지는 기와로 불리는 8X8 픽셀의 이미지를 배열하여 구성된다.
  • 슬라이스의 이미지를 VRAM에 씁니다.(ROM에서 필요에 따라 복제)
  • 배경 화면의 구성

  • 32매 크기×32 타일.VRAM에서 1바이트당 와트 쓰기 번호입니다.
  • 배경화면이 실제 화면보다 크다.SCRX 레지스터 및 SCRY 레지스터에서 배경 화면의 시작 지점(왼쪽 위)을 지정합니다.레지스터를 바꾸면 스크롤을 할 수 있습니다.
  • 프로세스 초기화


    팔레트와 스크롤 레지스터를 설정합니다.
    bg.asm
        ld  a, %11100100    ; パレット(パレットごとに2bitで白さを指定。MSBがパット番号0番)
        ld  [rBGP], a       ; BGPレジスタにパレットを設定
    
        ld  a,0             ; スクロールレジスタを設定し、画面を左上に固定
        ld  [rSCX], a       ; SCXレジスタ
        ld  [rSCY], a       ; SCYレジスタ
    
    화면 그리기 중에 VRAM을 쓸 수 없으며 화면 표시를 일시적으로 끕니다.
    bg.asm
    .waitVBlank:                ; 画面描画を止めるため、まず現在の描画が終るのを待つ
        ld  a, [rLY]
        cp  145                 ; 画面描画が終った=描画位置がY=145であるか?
        jr  nz, .waitVBlank     ; 違ったらまだ待つ(jrは相対ジャンプで、命令長が短くなる)
    
        ld  a, [rLCDC]
        res 7, a             
        ld  [rLCDC], a          ; VRAMに書き込むため、画面描画を止める
    
    타일을 VRAM에 로드합니다.
    bg.asm
        ld  hl, Tile            ; vramcpy コピー元 (ハードコードしたタイルの画像のアドレス)
        ld  bc, _VRAM           ; vramcpy コピー先 ($8000)
        ld  de, TileEnd-Tile    ; vramcpy コピー長さ
        call  vramcpy           ; VRAMに値をコピーするするサブルーチン
    
    VRAM에서 와트 번호를 설정합니다.
    bg.asm
        ld  b, $0               ; vramset 設定値
        ld  hl, _SCRN0          ; vramset コピー先
        ld  de, 32*32           ; vramset コピー長さ
        call  vramset           ; サブルーチン。画面全域にタイル番号0番を設定
    
    화면을 다시 그립니다.GB는 두 개의 배경화면이 있는데 이번에는'BG8000'을 사용했기 때문에 LCDC 레지스터에'LCDCT BG8000'을 설치했다.또 타일도 VRAM 2세트가 가능하며 이번에는'BG9800'을 사용했다.스프라이트를 사용하지 않으므로 LCDCT OBJOFF를 통해 디스플레이가 닫힙니다.
    bg.asm
        ld  a, LCDCF_ON|LCDCF_BG8000|LCDCF_BG9800|LCDCF_BGON|LCDCF_OBJ16|LCDCF_OBJOFF
        ld  [rLCDC], a          ; 画面ON
    
    주 순환 시작
    bg.asm
    mainloop:
        halt
        nop
        jr mainloop
    

    캡처



    기왓장 격식


    기와 조각의 데이터 형식은 상당히 복잡하다.이번에 사용한 타일(트레이 번호 0은 흰색, 1은 밝은 회색, 2는 어두운 회색, 3은 검은색) 시

    각 픽셀에 대한 팔레트 번호를 다음과 같이 지정합니다.
    bg.asm
    ;タイル用画像
    ;2バイトで1ラインを表し、各バイトの各ビットが1ピクセルに対応する。
    ;偶数バイトが、パレット番号の下位ビットを表し、奇数バイトが上位ビットを表す
    Tile:  
        ;1行目8ピクセルのパレット番号は, 0,3,3,3, 3,3,3,3
        db  %01111111   ;1行目, パレット番号下位ビット 
        db  %01111111   ;1行目, パレット番号上位ビット
    
        ;2行目8ピクセルのパレット番号は, 2,2,2,2, 2,2,2,2
        db  %00000000   ;2行目, パレット番号下位ビット
        db  %11111111   ;2行目, パレット番号上位ビット
    
        db  %11111111   ;3行目
        db  %00000000
        db  %00000000   ;4
        db  %00000000
        db  %11111111   ;5
        db  %00000000
        db  %00000000   ;6
        db  %11111111   
        db  %11111111   ;7
        db  %11111111   
        db  %00000000   ;8
        db  %00000000
    TileEnd:
    
    손으로 쓰는 것은 매우 고생스럽기 때문에 아래의 공구가 있다.어셈블리 원본에 직접 포함될 수 있는 코드를 출력하는 우수한 것이다.
    http://www.devrs.com/gb/hmgd/gbtd.html

    좋은 웹페이지 즐겨찾기