z88 print a bmp

Discussion about other targets
Post Reply
Jbizzel
Member
Posts: 14
Joined: Tue Jun 29, 2021 7:20 pm

z88 print a bmp

Post by Jbizzel »

I have some code that opens a window, size 255. I then use putsprite() to draw a 64x64 pixel image on the screen.

This works perfectly! :)

BUT, if I change the window size to 64 or to 128 for example, and the image doesn't render correctly, and there are blank bars breaking the image up.

I'm really happy to have something drawing on the screen, but I can't see where I'm going wrong - please help?

compiled with

Code: Select all

zcc +z88 -clib=ansi putsprite.c

Code: Select all

#ifdef __Z88_APPLICATION
#pragma -expandz88
#endif

#include <stdio.h>
#include <games.h>
//#include <ctype.h>
#include <graphics.h>

struct window mine; /* Window structure */

char panther[] = 
    {        64,64,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x75, 0x57, 0xF5, 0x55,
0xAA, 0xAA, 0xAE, 0xAA, 0xFE, 0xAF, 0x1E, 0xAA,
0x55, 0x55, 0x5F, 0x55, 0xFF, 0xDC, 0x07, 0x55,
0xAA, 0xAA, 0xBF, 0xAA, 0xFF, 0xF8, 0x03, 0xAA,
0x55, 0x55, 0x7F, 0x55, 0x8F, 0xD8, 0x01, 0xD5,
0xAA, 0xAA, 0xFE, 0xAB, 0x03, 0xB0, 0x60, 0xAA,
0x55, 0x55, 0xFD, 0xD5, 0x01, 0x50, 0x90, 0xD5,
0xAB, 0xFB, 0xF0, 0x6A, 0x00, 0xB8, 0x90, 0xAA,
0x5F, 0x3D, 0xE0, 0x36, 0x00, 0xDC, 0x91, 0xD5,
0xBC, 0x1A, 0xC0, 0x1A, 0x00, 0x78, 0xA3, 0xAA,
0x70, 0x0D, 0x40, 0x1E, 0x00, 0x70, 0x47, 0x55,
0xE0, 0x0A, 0xC0, 0x0A, 0x18, 0x40, 0x1E, 0xAA,
0x61, 0x8D, 0xC0, 0x0A, 0x3C, 0x40, 0x35, 0x55,
0xE2, 0x4B, 0xC3, 0x09, 0x2C, 0x40, 0x1A, 0xAA,
0x62, 0x2F, 0x47, 0x89, 0x3C, 0x80, 0x0D, 0x55,
0xF1, 0x2C, 0x46, 0xC8, 0x98, 0x80, 0x06, 0xAA,
0x78, 0xC0, 0x47, 0xD0, 0x41, 0x00, 0x07, 0x55,
0xBC, 0x00, 0x23, 0x96, 0x3E, 0x40, 0x43, 0xAA,
0x5F, 0x80, 0x10, 0x29, 0x80, 0x31, 0x83, 0x55,
0xAA, 0x80, 0x0C, 0xD0, 0x60, 0x0E, 0x06, 0xAA,
0x55, 0x80, 0x03, 0x20, 0x10, 0x04, 0x07, 0x55,
0xAB, 0x80, 0x00, 0x43, 0xFC, 0x04, 0x0E, 0xAA,
0x57, 0x00, 0x20, 0xBF, 0xFF, 0x88, 0x1D, 0x55,
0xAB, 0x00, 0x41, 0xFF, 0xFC, 0xF8, 0x3A, 0xAA,
0x57, 0x21, 0x81, 0xFF, 0xFC, 0x0F, 0x75, 0x55,
0xAB, 0x9F, 0x07, 0xFF, 0xF8, 0x03, 0xEA, 0xAA,
0x57, 0x81, 0x98, 0xFF, 0xF8, 0x01, 0xD5, 0x55,
0xAB, 0xC0, 0xF0, 0x7F, 0xF0, 0x01, 0xAA, 0xAA,
0x55, 0xF0, 0xE0, 0x3F, 0xE0, 0x0E, 0xD5, 0x55,
0xAA, 0xBD, 0xC0, 0x0F, 0xC0, 0x01, 0x7F, 0xEA,
0x55, 0x5F, 0x80, 0x03, 0x80, 0x01, 0xD5, 0x7F,
0xAA, 0xAF, 0x00, 0x01, 0x80, 0x0E, 0xAA, 0xAB,
0x55, 0x56, 0x00, 0x01, 0x80, 0x03, 0x75, 0x55,
0xAA, 0xAB, 0x60, 0x03, 0xE0, 0x1F, 0xAE, 0xAA,
0x55, 0x56, 0x88, 0x07, 0x3F, 0x3F, 0x55, 0xD5,
0xAA, 0xAF, 0xF0, 0x1E, 0x19, 0xFA, 0xAA, 0xBA,
0x55, 0x75, 0xE0, 0xFC, 0x30, 0x75, 0x55, 0x57,
0xAA, 0xEB, 0xF3, 0xC7, 0xE0, 0x6A, 0xAA, 0xAB,
0x57, 0x57, 0x7F, 0x80, 0x00, 0x75, 0x55, 0x55,
0xAE, 0xAE, 0xAF, 0x80, 0x00, 0x6A, 0xAA, 0xAA,
0x5D, 0x5D, 0x55, 0xC0, 0x00, 0xD5, 0x55, 0x55,
0xAA, 0xBA, 0xAA, 0xE0, 0x00, 0xEA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x60, 0x01, 0xD5, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xF0, 0x03, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x78, 0x07, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAF, 0x1E, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x57, 0xFD, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAB, 0xEA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
    };
int main()
{
    mine.graph = 1;
    mine.width = 128;
    mine.number = '4';
    /* Open map with on window #4 */
    window(&mine);
    clg();
putsprite(spr_or,1,0,panther);
/* Close the graphics window */
    closegfx(&mine);
}
User avatar
dom
Well known member
Posts: 2076
Joined: Sun Jul 15, 2007 10:01 pm

Re: z88 print a bmp

Post by dom »

It's not you!

I think only 256 pixel wide maps are supported - the graphics support was built off Gunther's library and that was all that it supported.
Jbizzel
Member
Posts: 14
Joined: Tue Jun 29, 2021 7:20 pm

Re: z88 print a bmp

Post by Jbizzel »

Ah!! thanks Dom.

At least I know I've done something right!! I'll figure out how to work with this.
User avatar
dom
Well known member
Posts: 2076
Joined: Sun Jul 15, 2007 10:01 pm

Re: z88 print a bmp

Post by dom »

I've not tried it, but it's easy to override the pixel address function which calculates where a pixel is within the map. Just add the next snippet to a convenient C file.

Code: Select all

void asm_wrapper() __naked
{
#asm
PUBLIC pixeladdress
.pixeladdress
                                ld      b,l
                                srl     b
                                srl     b
                                srl     b                               ; linedist = y  div 8 * 256
                                ld      a,h
                                and     @11111000                       ; rowdist       = x div 8       * 8
                                ld      c,a                             ; bc    = linedist + rowdist
; Generic below here
                                ld      a,l
                                and     @00000111                       ; coldist       = y mod 8
                                ld      de,(base_graphics)      ; pointer       to base of graphics     area
                                ld      e,a                             ; coldist       = graphicsarea  + coldist
                                ld      a,h
                                ex      de,hl
                                add     hl,bc                   ; bytepos       = linedist + rowdist + coldist
                                ex      de,hl
                                and     @00000111                       ; a = x mod 8
                                xor     @00000111                       ; a = 7 -       a
                                ret

#endasm
}
That's the default handling for a 256 wide map, where each 8 lines steps down 256 bytes. For a 128 wide map, each 8 line steps down by 128 bytes. So it should be a case of adjusting the top of the function. Maybe something like this:

Code: Select all

ld b,l
ld c,0
srl b
srl b
srl b
srl b
rr c
ld a,h
and @01111000
or c
ld c,a
And for 64 wide:

Code: Select all

ld b,l
ld c,0
srl b
srl b
srl b
srl b
rr c
srl b
rr c
ld a,h
and @00111000
or c
ld c,a
Jbizzel
Member
Posts: 14
Joined: Tue Jun 29, 2021 7:20 pm

Re: z88 print a bmp

Post by Jbizzel »

Dom,

I just tested you examples for 64x64 and 255 - BRILLIANT and amazing! :)

Thank you sir!!

Image
User avatar
dom
Well known member
Posts: 2076
Joined: Sun Jul 15, 2007 10:01 pm

Re: z88 print a bmp

Post by dom »

Fab, well, I've been more successful with code written in a forum than in an IDE today!

I am slightly disappointed that you're not making an etch-a-sketch app...
Jbizzel
Member
Posts: 14
Joined: Tue Jun 29, 2021 7:20 pm

Re: z88 print a bmp

Post by Jbizzel »

@Dom haha! You know about that debacle!

Yes, I have been seriously thinking about it!!

One where you turn the z88 upside down and shake it to clear the screen. :lol:
Post Reply