From 2c1fce4c0aa30b61960d00e1f95c01214106fe56 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Fri, 18 Mar 2016 10:15:19 -0500 Subject: [PATCH] tesuto is vrl draw now ww --- makefile | 6 +- src/tesuto.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++---- src/tesuto.h | 15 +++++ 3 files changed, 163 insertions(+), 13 deletions(-) create mode 100755 src/tesuto.h diff --git a/makefile b/makefile index b1ca6b2e..b9a57562 100755 --- a/makefile +++ b/makefile @@ -112,14 +112,14 @@ scroll.$(OBJ): $(SRC)scroll.c # NOTE: dos86h = 16-bit huge memory model. memory model must match! -tesuto.exe: tesuto.$(OBJ) dl_vga.lib +tesuto.exe: tesuto.$(OBJ) dl_vga.lib 16_head.$(OBJ) # %write tmp.cmd option quiet option map=tesuto.map $(DOSLIB_LDFLAGS_DOS16H) file tesuto.obj name tesuto.exe # %write tmp.cmd library $(DOSLIBDIR)/hw/cpu/dos86h/cpu.lib # %write tmp.cmd library $(DOSLIBDIR)/hw/dos/dos86h/dos.lib # @wlink @tmp.cmd - wcl $(WCLQ) tesuto.$(OBJ) dl_vga.lib + wcl $(FLAGS) $(WCLQ) tesuto.$(OBJ) dl_vga.lib 16_head.$(OBJ) tesuto.$(OBJ): $(SRC)tesuto.c - wcl $(WCLQ) -c $(SRC)tesuto.c + wcl $(FLAGS) $(WCLQ) -c $(SRC)tesuto.c #tesuto.exe: tesuto.$(OBJ) # wcl $(WCLQ) -mh -d2 tesuto.$(OBJ) #tesuto.$(OBJ): $(SRC)tesuto.c diff --git a/src/tesuto.c b/src/tesuto.c index b05591da..82965a81 100755 --- a/src/tesuto.c +++ b/src/tesuto.c @@ -1,15 +1,150 @@ +#include "src/tesuto.h" +/* #include +#include // this is where Open Watcom hides the outp() etc. functions +#include +#include +#include +#include +#include +#include +#include +*/ -/*typedef unsigned char far *VGA_RAM_PTR; -VGA_RAM_PTR vga_graphics_ram = (VGA_RAM_PTR)MK_FP(0xA000,0x0000); -unsigned char vga_stride = 80; // 80 x 4 = 320 for 320-pixel wide modes +#pragma pack(push,1) +struct vrl_header { + uint8_t vrl_sig[4]; // +0x00 "VRL1" + uint8_t fmt_sig[4]; // +0x04 "VGAX" + uint16_t height; // +0x08 Sprite height + uint16_t width; // +0x0A Sprite width + int16_t hotspot_x; // +0x0C Hotspot offset (X) for programmer's reference + int16_t hotspot_y; // +0x0E Hotspot offset (Y) for programmer's reference +}; // =0x10 +#pragma pack(pop) -static inline void vga_write_sequencer(unsigned char i,unsigned char c) { - outp(0x3C4,i); - outp(0x3C5,c); -}*/ +static unsigned char palette[768]; -void main() -{ - printf("pee\n"); +void draw_vrl_modex(unsigned int x,unsigned int y,struct vrl_header *hdr,unsigned char *data,unsigned int datasz) { + unsigned int vram_offset = (y * vga_stride) + (x >> 2); + unsigned char *fence = data + datasz; + unsigned char vga_plane = (x & 3); + unsigned char run,skip,b; + unsigned char far *draw; + + while (data < fence) { + /* start of another vertical strip */ + draw = vga_graphics_ram + vram_offset; + vga_write_sequencer(0x02/*map mask*/,1 << vga_plane); + + while (data < fence) { + run = *data++; + if (run == 0xFF) break; + skip = *data++; + draw += skip * vga_stride; + if (run & 0x80) { + b = *data++; + while (run > 0x80) { + *draw = b; + draw += vga_stride; + run--; + } + } + else { + while (run > 0) { + *draw = *data++; + draw += vga_stride; + run--; + } + } + } + + /* end of a vertical strip. next line? */ + if ((++vga_plane) == 4) { + vram_offset++; + vga_plane = 0; + } + } + + vga_write_sequencer(0x02/*map mask*/,0xF); +} + +int main(int argc,char **argv) { + struct vrl_header *vrl_header; + unsigned char *buffer; + unsigned int bufsz; + int fd; + + if (argc < 3) { + fprintf(stderr,"drawvrl \n"); + return 1; + } + + fd = open(argv[1],O_RDONLY|O_BINARY); + if (fd < 0) { + fprintf(stderr,"Unable to open '%s'\n",argv[1]); + return 1; + } + { + unsigned long sz = lseek(fd,0,SEEK_END); + if (sz < sizeof(vrl_header)) return 1; + if (sz >= 65535UL) return 1; + + bufsz = (unsigned int)sz; + buffer = malloc(bufsz); + if (buffer == NULL) return 1; + + lseek(fd,0,SEEK_SET); + if ((unsigned int)read(fd,buffer,bufsz) < bufsz) return 1; + + vrl_header = (struct vrl_header*)buffer; + if (memcmp(vrl_header->vrl_sig,"VRL1",4) || memcmp(vrl_header->fmt_sig,"VGAX",4)) return 1; + if (vrl_header->width == 0 || vrl_header->height == 0) return 1; + } + close(fd); + + probe_dos(); + if (!probe_vga()) { + printf("VGA probe failed\n"); + return 1; + } + int10_setmode(19); + update_state_from_vga(); + vga_enable_256color_modex(); // VGA mode X + + /* load color palette */ + fd = open(argv[2],O_RDONLY|O_BINARY); + if (fd >= 0) { + unsigned int i; + + read(fd,palette,768); + close(fd); + + vga_palette_lseek(0); + for (i=0;i < 256;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2); + } + + draw_vrl_modex(0,0,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header)); + while (getch() != 13); + + { + unsigned int i; + + for (i=1;i < 320;i++) + draw_vrl_modex(i,0,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header)); + } + while (getch() != 13); + + { + unsigned int i; + + for (i=1;i < 200;i++) + draw_vrl_modex(i,i,vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header)); + } + while (getch() != 13); + + int10_setmode(3); + buffer = NULL; + free(buffer); + bufsz = 0; + return 0; } diff --git a/src/tesuto.h b/src/tesuto.h new file mode 100755 index 00000000..ea627b6d --- /dev/null +++ b/src/tesuto.h @@ -0,0 +1,15 @@ +#ifndef __TESUTO_H__ +#define __TESUTO_H__ + +#include "src/lib/16_head.h" +#include "src/lib/doslib/hw/vga/vga.h" + +typedef unsigned char far *VGA_RAM_PTR; +VGA_RAM_PTR vga_graphics_ram = (VGA_RAM_PTR)MK_FP(0xA000,0x0000); +unsigned char vga_stride = 80; // 80 x 4 = 320 for 320-pixel wide modes + +static inline void vga_write_sequencer(unsigned char i,unsigned char c) { + outp(0x3C4,i); + outp(0x3C5,c); +} +#endif -- 2.39.5