mirror of https://git.cro.wtf/kip.git
60 lines
2.4 KiB
C
60 lines
2.4 KiB
C
#include<SDL.h>
|
|
#include"kip.h"
|
|
#define hig 480
|
|
#define wid 640
|
|
|
|
SDL_Window*win;
|
|
SDL_Surface*surf;
|
|
SDL_Renderer*ren;
|
|
SDL_Texture*tex;
|
|
|
|
_ W palette[0x10]={0x212425,0x212425,0x86215f,0xc33479,0x392874,0x0a5c9f,0xa0c5c6,0x0e8743,
|
|
0xe67216,0xe1202d,0xeb5b2b,0xed7275,0xb1739a,0xbf98ac,0xf3e46d,0xfef6dd};
|
|
_ B layer[4][wid*hig]={0},redraw;
|
|
_ W computed[wid*hig]={0};
|
|
|
|
_ Ws min(Ws x,Ws y){R x<y?x:y;}
|
|
_ Ws max(Ws x,Ws y){R x>y?x:y;}
|
|
|
|
_ NR V err(V){die("sdl:%s\n",SDL_GetError());}
|
|
|
|
V front_init(V){
|
|
Q(SDL_Init(SDL_INIT_VIDEO),err())
|
|
SDL_ShowCursor(SDL_DISABLE);
|
|
N(win=SDL_CreateWindow("kip emulator",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,wid,hig,0),err())
|
|
N(ren=SDL_CreateRenderer(win,-1,0),err())
|
|
Q(SDL_RenderSetLogicalSize(ren,wid,hig),err())
|
|
N(tex=SDL_CreateTexture(ren,SDL_PIXELFORMAT_XRGB8888,SDL_TEXTUREACCESS_STREAMING,wid,hig),err())
|
|
redraw=1;}
|
|
|
|
_ H mx,my,px,py;
|
|
_ W blit,out;
|
|
|
|
V front_events(V){_ SDL_Event ev;W t;
|
|
while(SDL_PollEvent(&ev)){t=ev.type;
|
|
Q(SDL_MOUSEMOTION==t,mx=min(wid,max(0,ev.motion.x)),my=min(hig,max(0,ev.motion.y)))OR
|
|
Q(SDL_MOUSEBUTTONDOWN==t,vec(0x04))OR
|
|
Q(SDL_MOUSEBUTTONUP==t,vec(0x08))OR
|
|
Q(SDL_QUIT==t,front_deinit(),exit(0));}}
|
|
|
|
V front_redraw(V){W i,j,k;
|
|
Q(redraw,for(i=0;i<wid*hig;++i)computed[i]=palette[0];
|
|
for(i=0;i<4;++i)for(j=0;j<wid*hig;++j)Q(k=layer[i][j],computed[j]=palette[k]);
|
|
SDL_UpdateTexture(tex,0,computed,wid*(SZ(W)/SZ(B))),
|
|
SDL_RenderClear(ren),
|
|
SDL_RenderCopy(ren,tex,0,0),
|
|
SDL_RenderPresent(ren))
|
|
vec(0x00),redraw=0;}
|
|
|
|
V front_deinit(V){SDL_DestroyTexture(tex),SDL_DestroyRenderer(ren),SDL_DestroyWindow(win),SDL_Quit();}
|
|
_ V out_pixel(B l,W c,H x,H y){Q(c,redraw=1,layer[l&3][x+wid*y]=(l>>2)?0:(B)c&0xf;)}
|
|
_ V out_1bpp(B l,W c,H x,H y){W i,j,k;for(i=0;i<8;++i)for(j=0,k=lob(blit+1*i);j<8;k<<=1,++j)out_pixel(l,(c&0xf)*(1&(k>>7)),x+j,y+i);}
|
|
_ V out_2bpp(B l,W c,H x,H y){W i,j,k;for(i=0;i<8;++i)for(j=0,k=loh(blit+2*i);j<8;k<<=2,++j)out_pixel(l,0xf&(c>>4*(3&(k>>14))),x+j,y+i);}
|
|
_ V out_4bpp(B l,W c,H x,H y){W i,j,k;for(i=0;i<8;++i)for(j=0,k=low(blit+4*i);j<8;k<<=4,++j)out_pixel(l,(k>>28),x+j,y+i);(V)c;}
|
|
_ V(*outs[])(B,W,H,H)={out_pixel,out_1bpp,out_2bpp,out_4bpp};
|
|
|
|
DEV(display_pos,(px=x>>16,py=x),(R px<<16|py))
|
|
DEV(display_blit,(blit=x),(R blit))
|
|
DEV(display_out,(W c;B m,l;out=x,m=0xf&x,l=(0xf0&x)>>4,c=x>>8,outs[m](l,c,px,py)),(R out))
|
|
DEV(mouse_pos,(mx=x<<16,my=x),(R mx<<16|my))
|