어셈블리 언어로 GAMEBOY 개발(화면 업데이트)

2651 단어 gameboyassembly
이번에 화면을 옮겼어요.소스 코드는 여기.입니다.

화면 업데이트 언제 해요?


GB는 VRAM의 내용을 1/60초 간격으로 화면에 표시합니다.그 처리는 1/60초가 지속된 것이 아니라 실제로는 좀 짧다.따라서 화면 표시가 처리되지 않은 클리어런스 시간이 있습니다.이 간격에서 VRAM을 덮어쓰는 화면 업데이트 프로세스를 실행해야 합니다.
이'클리어런스 타임'은 영상관 TV 용어의 영향으로'수직 귀선 구간'또는'VBlank'등으로 불린다.이 기사는 이를'VBlank'라고도 부른다.

VBlank와 동기화


화면을 업데이트하기 위해 VBlank 사이에서 VRAM을 덮어쓰려고 합니다.하지만 VBlank가 언제 발생했는지 알아야 한다.
GB에서는 VBlank가 시작될 때 중단되기 때문에 손을 잡을 수 있습니다.구체적으로 말하면, VBlank가 발생할 때, 처리는 $0040의 문패로 날아갈 수 있기 때문에, 거기에 화면 업데이트의 규칙을 기록하면 된다.하지만 거기엔 8바이트 프로그램만 쓸 수 있으니 화면 업데이트로 넘어가는 프로그램 명령을 쓰겠죠.

주 순환의 쓰기


gpspec.txt에서 다음과 같이 구성된 주순환을 제시하여 이러한 구조를 진행하였다.전문가가 쓴 기사에도 이런 구성이 현장에서 사용된다.
VBlank 인터럽트 프로세서:
1. VBlank 플래그 설정
마스터 프로세싱:
1. VBlank 로고가 설정될 때까지 반복
2. VBlank 플래그 지우기
3. 게임 처리
vsync.asm
;VBlank割込みハンドラ
draw:
    ld      a,1
    ld      [VBlankFlg],a
    reti

;メインループ
mainloop:
    halt   ;何らかの割り込みが発生するまで、CPU(?)を止める。電池節約のために良いとされる。
    nop    ;halt命令で処理が止まる前に,次の命令が実行されてしまうので、ダミーの1命令を挟む

    ;Vblankを含め、何らかの割り込みがあった場合、ここに来る
    ld  a,[VBlankFlg]   ;VBlank割り込みハンドラがフラグを立てたかチェック
    or  a
    jr  z,mainloop      ;(つまり、今回の割り込みがVBlank割り込みであれば次に進む)

    xor a               ;a=0
    ld  [VBlankFlg],a   ;VBlank判定用のフラグをクリア

    ;[メインの処理]

    jp  mainloop
인터럽트 프로세서에 너무 많은 처리를 쓰면 좋지 않을 수도 있습니다.

좋은 웹페이지 즐겨찾기