tools: bmp2tiles clearer error message
[swan-dev] / sample / simplest.asm
1 %include "WonderSwan.inc"\r
2 \r
3 \r
4 MYSEGMENT       equ     0xF000\r
5 \r
6 ; Set Maps and Sprite Table at the end of first part of ram\r
7 fgmap           equ     WSC_TILE_BANK1-MAP_SIZE\r
8 bgmap           equ     fgmap-MAP_SIZE\r
9 sprtable        equ     bgmap-SPR_TABLE_SIZE\r
10 \r
11 \r
12         CPU     186\r
13         BITS    16\r
14 \r
15         ;PADDING        15              ; Pad 15 Sections\r
16 \r
17         SECTION TEXT\r
18 \r
19         ORG     0x0000\r
20 \r
21 Start:\r
22         cli                     ; Disable Interrupts\r
23         cld                     ; Offset in Increment mode\r
24 \r
25         xor     ax,ax           ; Clear all registers\r
26         mov     bx,ax\r
27         mov     cx,ax\r
28         mov     dx,ax\r
29         mov     si,ax\r
30         mov     di,ax\r
31         mov     ds,ax           ; Clear Segments\r
32         mov     es,ax\r
33 \r
34         mov     bp,ax           ; Setup stack\r
35         mov     ss,ax\r
36         mov     sp,WS_STACK\r
37 \r
38         in      al,IO_HARDWARE_TYPE     ; Check Wonderswan Mono/Color\r
39         test    al,WS_COLOR\r
40 .mono:  jz      .mono           ; We loop forever if Mono\r
41 \r
42         mov     sp,WSC_STACK    ; New stack\r
43 \r
44         xor     ax,ax           ; Clear Ram\r
45         mov     di,0x100\r
46         mov     cx,0x7E80\r
47         rep     stosw\r
48 \r
49         out     IO_SRAM_BANK,al\r
50 \r
51         ; Video Init\r
52         in      al,IO_VIDEO_MODE\r
53         or      al,VMODE_16C_CHK | VMODE_CLEANINIT\r
54         out     IO_VIDEO_MODE,al\r
55 \r
56         xor     ax,ax\r
57 \r
58         out     IO_BG_X,al\r
59         out     IO_BG_Y,al\r
60         out     IO_FG_X,al\r
61         out     IO_FG_Y,al\r
62 \r
63         out     IO_SPR_START,al\r
64         out     IO_SPR_STOP,al\r
65 \r
66         mov     al,BG_MAP(bgmap) | FG_MAP(fgmap)\r
67         out     IO_FGBG_MAP,al\r
68 \r
69         mov     al,SPR_TABLE(sprtable)\r
70         out     IO_SPR_TABLE,al\r
71 \r
72         in      al,IO_LCD_CTRL\r
73         or      al,LCD_ON\r
74         out     IO_LCD_CTRL,al\r
75 \r
76         xor     al,al\r
77         out     IO_LCD_ICONS,al\r
78 \r
79         ; Setup VBlank Int\r
80         mov     ax,INT_BASE\r
81         out     IO_INT_BASE,al\r
82 \r
83         mov     di,INTVEC_VBLANK_START\r
84         add     di,ax\r
85         shl     di,2                    ; *4\r
86         mov     word [es:di],VBlank\r
87         mov     word [es:di+0x2],MYSEGMENT\r
88 \r
89         xor     ax,ax                   ; Clear HBL & Timer\r
90         out     IOw_HBLANK_FREQ,ax\r
91         out     IO_TIMER_CTRL,al\r
92 \r
93         dec     al                      ; Ack all Int\r
94         out     IO_INT_ACK,al\r
95 \r
96         mov     al,INT_VBLANK_START     ; Enable VBL Int\r
97         out     IO_INT_ENABLE,al\r
98 \r
99         sti                             ; Enable Interrupts !\r
100 \r
101 ;--------------------------------\r
102 \r
103         ; Set Segments for Copy\r
104         mov     ax,MYSEGMENT\r
105         mov     ds,ax\r
106         xor     ax,ax\r
107         mov     es,ax\r
108 \r
109         ; Make BG\r
110 \r
111         mov     si,TileGfx\r
112         mov     di,WSC_TILE_BANK1\r
113         mov     cx,(TileGfxE-TileGfx)/2\r
114         rep     movsw\r
115 \r
116         mov     si,TilePal\r
117         mov     di,WSC_PALETTES\r
118         mov     cx,16\r
119         rep     movsw\r
120 \r
121         mov     ax,BG_CHR(0,0,0,0,0)    ; Initial Tile, Pal 0, Bank 0\r
122         mov     di,bgmap\r
123         mov     cx,MAP_TWIDTH*MAP_THEIGHT\r
124         rep     stosw\r
125 \r
126         ; Display !\r
127         mov     al,BG_ON | FG_ON\r
128         out     IO_DISPLAY_CTRL,al\r
129 \r
130         ; Loop Read Buttons\r
131 loop:\r
132         mov     al,KEYPAD_READ_BUTTONS\r
133         out     IO_KEYPAD,al\r
134         nop\r
135         nop\r
136         nop\r
137         nop\r
138         in      al,IO_KEYPAD\r
139 \r
140         test    al,PAD_A        ; Press A for Audio\r
141         jz      loop\r
142 \r
143         jmp     loop\r
144 \r
145 ;******************************************\r
146 \r
147 VBlank:\r
148         push    ax\r
149 \r
150         mov     al,[es:VBLcnt]\r
151         inc     al\r
152         mov     [es:VBLcnt],al\r
153         and     al,3\r
154         jnz     .noscroll\r
155 \r
156         in      al,IO_BG_X      ; Infinite Scroll\r
157         inc     al\r
158         out     IO_BG_X,al\r
159 \r
160         in      al,IO_BG_Y\r
161         inc     al\r
162         out     IO_BG_Y,al\r
163 \r
164 .noscroll:\r
165         in      al,IO_INT_ACK\r
166         or      al,INT_VBLANK_START\r
167         out     IO_INT_ACK,al\r
168 \r
169         pop     ax\r
170         iret\r
171 \r
172 ;******************************************\r
173 \r
174         align   2\r
175 \r
176 TilePal:        incbin  "gfx/bgtile.pal"\r
177 TileGfx:        incbin  "gfx/bgtile.gfx"\r
178 TileGfxE:\r
179 \r
180 ;******************************************\r
181 \r
182         ROM_HEADER      Start, MYSEGMENT, 0x42, RH_WS_COLOR, RH_ROM_8MBITS, RH_NO_SRAM, RH_HORIZONTAL\r
183 \r
184 ;******************************************\r
185 \r
186         SECTION BSS     start=0x0100    ; Keep space for Int Vectors\r
187 \r
188 VBLcnt:         resb    0       ; Our datas in RAM\r
189 \r