Sufficiency Economy
Group Blog
 
All blogs
 

Gameboy Programming [1] : แสดง background

หลักการแสดงภาพ background 
1. รอช่วง VBank เพื่อ copy ข้อมูลลง VRAM แต่ตัวอย่างที่แสดงเอาง่ายคือรอ VBank และปิดหน้าจอเลย หุๆ ใช้ register ชื่อrLY และ rLCDC
2. ตำแหน่งของ VRAM ที่ไว้ใส่ Background มี 2 method (8000 และ 8800)จำนวน Tile มากสุดคือ 256
block การเก็บข้อมูล Tile มี 3 block  คือ
block 0 : $8000-87FF
block 1 : $8800-8FFF
block 3 : $9000-97FF
เราเลือก method 8800 คือ เก็บข้อมูลที่  block3(1-128) ด้วย block1(129-256)
หมายเหตุ สำหรับ sprite จะเก็บที่ block 0 เสมอ ทำให้มีการซ้อนทับข้อมูลTile(ใช้ข้อมูลร่วมกันระหว่าง background กับ Tile) ใน block1
3. กำหนดสี palette มี 4 สี คือ white, light gray, dark gray และ black 00, 01, 10, 11 ตามลำดับ ใช้ register ชื่อ rBGP 
ld a, %11100100
ld [rBGP], a
แสดงว่า index 0 คือ white -> index 3 คือ black
4. โครงสร้างของ Tile : 1 Tile ใช้ 2 plane ถ้าต้องการเขียนกล่องสี่เหลี่ยม จะมีข้อมูลประมาณนี้
;Plane1
;11111111 $FF
;10000001 $81
;10000001
;10000001
;10000001
;10000001
;10000001
;11111111

;Plane2
;11111111
;10000001
;10000001
;10000001
;10000001
;10000001
;10000001
;11111111

โดยการเรียงจะสลับ plane1 และ plane2 คนละ 1 byte คือ
db $FF,$FF,$81,$81,$81,$81,$81,$81,$81,$81,$81,$81,$81,$81,$FF,$FF 

5. การเขียนข้อมูล เชียนเป็น function ? ประมาณนี้ source: de และ destination : hl
Memcpy:
ld a, [de]
ld [hli], a
inc de
dec bc
ld a, b
or c
jr nz, Memcpy
ret

ตัวอย่างโปรแกรม มั่วๆ เป็นตามนี้
source code

load assember จาก https://rgbds.gbdev.io
พิมพ์ make




 

Create Date : 24 ตุลาคม 2563    
Last Update : 24 ตุลาคม 2563 13:53:04 น.
Counter : 688 Pageviews.  

Gameboy Programming [0]

ตอนนี้คิดถึงวันวานตอนเด็กที่เล่น Gameboy เลยซื้อ Gameboy pocket มา ตามทำธรรมเนียมต้องทดลองเขียนโปรแกรมเล่นดู 
ตามจริงมีวิธีเขียน 3 รูปแบบคือ
1. GBstudio ง่ายสุด ตาม Link
2. Gameboy Development Kit 2020 เขียนด้วยภาษาซี ตาม Link
3. RGBDS เขียนด้วยภาษา ASM ตาม Link 

ก็เลยทดลองเขียนจากยาก ไปหาง่ายล่ะกัน โดยเริ่มที่ RGBDS 
อย่างแรกต้องศึกษาจาก web  และ https://gbdev.gg8.se/ พอสรุปได้ประมาณนี้
1. จอแสดงผล LCD ขนาด W x H (160 x 144 pixel)
2. CPU Z80 ที่ custom มี Register a b c d e f และ  h l ซึ่งเก็บข้อมูลขนาด 8 bit แต่สามารถ
จับคู่เพื่อเก็บข้อมูล 16 bit ได้ เช่น bc de hl และเก็บข้อมูลแบบ little-endian
3. Memory Mapping

แต่ที่ web นี้ อธิบายได้ง่ายกว่ามัง Link


วันนี้เอาแค่นี้ก่อน ล่ะกัน 107





 




 

Create Date : 21 กันยายน 2563    
Last Update : 21 กันยายน 2563 16:39:06 น.
Counter : 471 Pageviews.  

snes : แสดงภาพบน Background



ตอนรับ การได้มาของ SNES MINI โซนยุโรป (ไม่เอาของ อเมริกา เพราะไม่สวยอย่าแรง ) ตามจริงอยากได้แบบญี่ปุ่น แต่อ่านภาษาอังกฤษง่ายกว่า ^^


และมีการ hack ให้เพิ่มเกมส์ได้ ด้วย hackchi2 
ก็เลย มาเขียนโปรแกรม snes เล่นดีกว่า โดยจะแสดงรูปนี้ด ขนาด 72 x 88 ใน mode 1
ที่มี background 3 layer 
BG1 16 สี
BG2 16 สี
BG3  4 สี

แต่เราจะแสดงบน BG1

ต้องแปลงเป็น format : PCX แล้ว convert เป็น data ที่ snes อ่านง่าย ด้วยโปรแกรม pcx2snesWIN

เขียน code และ compile หรือ assembler หว่า? ให้เป็น .smc

Code ก็ประมาณนี้
;============================================================================
; Includes
;============================================================================

;== Include MemoryMap, Vector Table, and HeaderInfo ==
.INCLUDE "header.inc"

;== Include SNES Initialization routines ==
.INCLUDE "InitSNES.asm"
.INCLUDE "LoadGraphics.asm"


;============================================================================
; Main Code
;============================================================================

.BANK 0 SLOT 0
.ORG 0
.SECTION "MainCode"

Start:
    InitSNES    ; Clear registers, etc.

    ; Load Palette for our tiles
    LoadPalette BG_Palette, 0, 16

    ; Load Tile data to VRAM
    LoadBlockToVRAM Tiles, $0000, $0C60 ; 99 tiles  = 3168 bytes

; Address Tiles Map BG1 setting
    lda #$00
    sta $2115
; Input Tiles Map
ldx #$3000 ; $6000 line = 1
    stx $2116
    lda #$00
- sta $2118
    inc a
    cmp #$9
bne -


ldx #$3020 ; $6000 line = 2
    stx $2116 
lda #$09
- sta $2118
    inc a
    cmp #$12
bne -
ldx #$3040 ; $6000 line = 3
    stx $2116 
lda #$12
    sta $2118
    lda #$13
    sta $2118
lda #$14
    sta $2118
lda #$15
    sta $2118
    lda #$16
    sta $2118
lda #$17
    sta $2118
lda #$18
    sta $2118
    lda #$19
    sta $2118
lda #$1A
    sta $2118

ldx #$3060 ; $6000 line = 4
    stx $2116 
lda #$1B
- sta $2118
    inc a
    cmp #$24
bne -
ldx #$3080 ; $6000 line = 5
    stx $2116 
lda #$24
- sta $2118
    inc a
    cmp #$2D
bne -
ldx #$30A0 ; $6000 line = 6
    stx $2116 
lda #$2D
- sta $2118
    inc a
    cmp #$36
bne -
ldx #$30C0 ; $6000 line = 7
    stx $2116 
lda #$36
- sta $2118
    inc a
    cmp #$3F
bne -
ldx #$30E0 ; $6000 line = 8
    stx $2116 
lda #$3F
- sta $2118
    inc a
    cmp #$48
bne -

ldx #$3100 ; $6000 line = 9
    stx $2116 
lda #$48
- sta $2118
    inc a
    cmp #$51
bne -
ldx #$3120 ; $6000 line = 10
    stx $2116 
lda #$51
- sta $2118
    inc a
    cmp #$5A
bne -
ldx #$3140 ; $6000 line = 11
    stx $2116 
lda #$5A
- sta $2118
    inc a
    cmp #$63
bne -
    ; Setup Video modes and other stuff, then turn on the screen
    jsr SetupVideo
Infinity:
    jmp Infinity    ; bwa hahahahaha


;============================================================================
; SetupVideo -- Sets up the video mode and tile-related registers
;----------------------------------------------------------------------------
; In: None
;----------------------------------------------------------------------------
; Out: None
;----------------------------------------------------------------------------
SetupVideo:
    php

    lda #$01
    sta $2105           ; Set Video mode 1, 8x8 tiles, 16 color BG1/BG2/ ,4 color BG3

    lda #$30            ; Set BG1's Tile Map offset to $6000 (Word address)
    sta $2107           ; And the Tile Map size to 32x32

    stz $210B           ; Set BG1's Character VRAM offset to $0000 (word address)

    lda #$01            ; Enable BG1
    sta $212C

    lda #$FF
    sta $210E
    sta $210E

    lda #$0F
    sta $2100           ; Turn on screen, full Brightness

    plp
    rts
;============================================================================
.ENDS

;============================================================================
; Character Data
;============================================================================
.BANK 1 SLOT 0
.ORG 0
.SECTION "CharacterData"

    .INCLUDE "man1.inc"

.ENDS

=======================
ผลก็ประมาณนี้


วางจะลองไปใส่ใน snes mini ^0^
โดยศึกษาจาก https://wiki.superfamicom.org/
ในหมวด tutorial
Link นี้ก็น่าสนใจ https://github.com/PeterLemon/SNES





 

Create Date : 04 พฤศจิกายน 2560    
Last Update : 4 พฤศจิกายน 2560 18:17:09 น.
Counter : 990 Pageviews.  

nes emulator

มีคนเก่ง เข้าเขียน nes emulator แล้วแสดงบน youtube ตามนี้



และ


เก่งมากๆๆ แถมยังให้ source code อยู่ที่ Link
ซึ่งเขียนด้วย c++0x (0x คือไรหว่า) และคิดว่าคง run บน unix หรือ linux มัง
แต่จะลองมา run บน mac ดู
1. อย่างแรกต้องหา SDL for mac มาติดตั้ง ต้องใช้ version 1.2 เพราะถ้าเป็น version 2+ จะเปลี่ยนconcept ในการสร้าง window การ putpixel 
2. ขั้นตอนติดตั้ง SDL ก็load file ที่ Link นี้ runแล้วจะได้ file ชื่อ SDL.framework
แล้วไป copy ไปใส่ใน /Library/Frameworks/ ก็ใช้ได้แล้ว แต่ถ้าเป็น SDL2 ต้องทำตามนี้
//joseph-long.com/writing/sdl-and-os-x/
3. ในsourcecode 
3.1 แก้ไข include ของ SDL ให้มี SDL/SDL.h

3.2ไปลบบรรทัดที่เกี่ยวกับเสียง เนื่องจากใน mac ไม่มีโปรแกรม resample ที่ไว้เล่นเพลง เขาบอกว่ามีใน unix? ไม่รู้ใน linux มีเปล่ายังไม่ได้ลองครับ

//static FILE* fp = popen("resample mr1789800 r48000 | aplay -fdat 2>/dev/null", "w");

//fputc(sample, fp);

//fputc(sample/256, fp);

4. compile โดยใช้ make ก็ได้ execute  file มา 

ทดสอบกับ rom rockman2 ก็ได้ประมาณนี้ สีมันเพี้ยน ไม่มีเสียงเพราะเราตัด code บางส่วน



แต่การที่คุณ bisqwit เขียนcode ประมาณ 900 บรรทัด ก็สุดยอดมากๆเลย 

ต่อไปเลยอยากแกะ code ที่เขาเขียนไว้ แต่ดูแล้วยากมาก เลยไปอุดหนุน amazon ด้วยเล่มนี้ หุๆ






 

Create Date : 31 กรกฎาคม 2558    
Last Update : 31 กรกฎาคม 2558 11:40:50 น.
Counter : 977 Pageviews.  

Nes Programming

วันนี้มาลองดูว่า เขียนโปรแกรมบน nes ทำอย่างไง 

ก็มี link สอนอยู่ที่ 
//blog.tozt.net/2014/10/13/writing-an-nes-game-part-1/
แปะไว้ศึกษาต่อ

แล้วก็มีต้วอย่างไฟล์ให้ compile ด้วย ประกอบด้วย
sprites.s เก็บ source code
sprites.chr เก็บ ข้อมูลgraphic

การ compile ก็ดูยุ่งยากเหมือนกัน
เริ่มจาก ไปหา wla-dx ที่ //www.villehelin.com/wla.html หรือ https://github.com/vhelin/wla-dx

1. wla-6502 -o test.s จะไ้ด้ test.o
2. wlalink linkfile test.rom จะได้ test.rom แต่ไฟล์ linkfile ภายในต้องเขียนประมาณนี้
[objects]
test.o
3. ใส่ header ไฟล์ด้วย cat header.bin test.rom > test.nes

หา emulator จาก //www.bannister.org/software/nestopia.htm

ทดลอง run ก็จะประมาณนี้ สามารถ เลื่อน กากบาทได้ 







 

Create Date : 02 กรกฎาคม 2558    
Last Update : 2 กรกฎาคม 2558 19:57:10 น.
Counter : 742 Pageviews.  

1  2  

wink99_th
Location :
พิษณุโลก Thailand

[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 8 คน [?]




New Comments
Friends' blogs
[Add wink99_th's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.