ZX81の回想禄

PR

×

プロフィール

ZX81

ZX81

カレンダー

コメント新着

コメントに書き込みはありません。

キーワードサーチ

▼キーワード検索

2026.07.15
XML

水ゲージの追加に合わせて、スコア表示、残機表示などの準備をします。

そのため、スクリーン表示関係を行うscrn.hとscrn.cを追加しました。

ーーーーーscrn.h
map.hからスクリーン表示関係を移動し
water gauge処理を追加

/*
 *      ZX81 Screen Handling Module header
 */
#ifndef _ZX81_SCRN_H
#define _ZX81_SCRN_H
// screen address
#define D_FILE          0x400c
#define D_DX            33      // 32+1(CR)
#define D_DY            24
// screen functions
void scrn_init();
unsigned char* getscrnaddr(int posy, int posx);
// zx81 write
void zx81_write_str(unsigned char *dstp, const char *asciip, int step);
void zx81_write_num(unsigned char *dstp, int num, int ndigit);
// goal meter
void goal_meter_init(void);
void goal_meter_draw(int dy);
// water gauge
void water_gauge_init(void);
void water_gauge_draw(void);
#endif  // _ZX81_SCRN_H

ーーーーーscrn.c
scrn.hと同様に、map.cからスクリーン表示関係を移動し
更に water gauge処理を追加しました。

あとは縦の文字描画も必要となったため、
zx81_write_strにstepを追加して、step=1なら横方向
step=D_DX(33)なら縦方向の文字描画が可能となりました。

水ゲージは位置だけを見たいので、最大量のバーを書いています。

/*
 *      ZX81 Screen Handling Module program
 */

#include <stdio.h>
#include <string.h>
#include "scrn.h"
#include "map.h"
// ASCII to ZX81-character
#define ASCII_BGN   32
#define ASCII_END   (ASCII_BGN + sizeof(zx81chr) - 1)
unsigned char zx81chr[] = {
//   (32),!(33),"(34),#(35),$(36)
    0x00, 0x00, 0x0b, 0x00, 0x0d,
//  %(37),&(38),'(39),((40),)(41)
    0X00, 0X00, 0X00, 0x10, 0x11,
//  *(42),+(43),,(44),-(45),.(46)
    0x17, 0x15, 0x1a, 0x16, 0x1b,
//  /(47),0(48),1(49),2(50),3(51)
    0x18, 0x1c, 0x1d, 0x1e, 0x1f,
//  4(52),5(53),6(54),7(55).8(56)
    0x20, 0x21, 0x22, 0x23, 0x24,
//  9(57),:(58),;(59),<(60),=(61)
    0x25, 0x0e, 0x19, 0x13, 0x14,
//  >(62),?(63),@(64),A(65),B(66)
    0x12, 0x0f, 0x0c, 0x26, 0x27,
//  C(67),D(68),E(69),F(70),G(71)
    0x28, 0x29, 0x2a, 0x2b, 0x2c,
//  H(72),I(73),J(74),K(75),L(76)
    0x2d, 0x2e, 0x2f, 0x30, 0x31,
//  M(77),N(78),O(79),P(80),Q(81)
    0x32, 0x33, 0x34, 0x35, 0x36,
//  R(82),S(83),T(84),U(85),V(86)
    0x37, 0x38, 0x39, 0x3a, 0x3b,
//  W(87),X(88),Y(89),Z(90)
    0x3c, 0x3d, 0x3e, 0x3f
};
#define ZX81CHR_SIZE    59
// ----------------------------------------------------------
// 初期化
// ----------------------------------------------------------
void scrn_init(void)
{
    zx81_write_str(getscrnaddr(1, 27), "1UP", 1);
    zx81_write_num(getscrnaddr(3, 26), 0, 6);
    zx81_write_str(getscrnaddr(6, 27), "TOP", 1);
    zx81_write_num(getscrnaddr(8, 26), 0, 6);
    zx81_write_str(getscrnaddr(11, 26), "ROUNDS", 1);
}
#asm
;----------------------------------------
; HL = HL * 33
;----------------------------------------
_HL_MULT33:
    push    de
    ld      d, h
    ld      e, l
    add     hl, hl      ; *2
    add     hl, hl      ; *4
    add     hl, hl      ; *8
    add     hl, hl      ; *16
    add     hl, hl      ; *32
    add     hl, de      ; *33
    pop     de
    ret
#endasm
unsigned char* getscrnaddr(int posy, int posx)
{
#asm
    ld      ix, 2
    add     ix, sp
    push    de
    ld      d, (ix+2)       ; d=posy
    ld      e, (ix+0)       ; e=posx
    call    getscrnaddr_calc
    pop     de
    ret
getscrnaddr_calc:
; IN:  D=posy, E=posx
; OUT: HL= screen address
    push    bc
    ; HL = posy * 33
    ld      h, 0
    ld      l, d
    call    _HL_MULT33
    ; HL += posx
    ld      b, 0
    ld      c, e            ; c=posx
    add     hl, bc
    ; HL += D_FILE
    ld      bc, (D_FILE)
    inc     bc
    add     hl, bc
    pop     bc
    ret
#endasm
}
void zx81_write_str(unsigned char *dstp, const char *asciip, int step)
{
    #asm
        ld      ix,2
        add     ix,sp
        ld      e, (ix+0)
        ld      d, (ix+1)       ; step
        ld      c, (ix+2)
        ld      b, (ix+3)       ; asciip
        ld      l, (ix+4)
        ld      h, (ix+5)       ; dstp
zx81_write_str_loop:
        ld      a,(bc)
        cp      0
        ret     z
        push    de
        sub     ASCII_BGN
        jp      c,zx81_write_str_2
        cp      ZX81CHR_SIZE    ;sizeof(zx81chr)
        jp      nc,zx81_write_str_2
        ld      de,_zx81chr
        add     a,e
        jp      nc,zx81_write_str_1
        inc     d
zx81_write_str_1:
        ld      e,a
        ld      a,(de)
        jp      zx81_write_str_3
zx81_write_str_2:
        ld      a,0
zx81_write_str_3:
        ld      (hl),a
        pop     de
        inc     bc
        add     hl,de
        jp      zx81_write_str_loop
    #endasm
}
void zx81_write_num(unsigned char *dstp, int num, int ndigit)
{
    unsigned char ascii[16+1];
    int  i, n;
    memset(ascii, 0, sizeof(ascii));
    if (ndigit > 16) {
        return;
    }
    i = ndigit-1;
    while (i >= 0) {
        n = num % 10;
        num /= 10;
        if (num != 0) {
            ascii[i] = '0' + n;
        }
        else {
            ascii[i] = ((n != 0) || (i == ndigit-1)) ? '0' + n : ' ';
        }
        i--;
    }
    zx81_write_str(dstp, ascii, 1);
}
void goal_meter_init(void)
{
    unsigned char *p;
    int  i;
    zx81_write_str(getscrnaddr(6, 2), "GOAL  METER", D_DX);
    p = getscrnaddr(1, 3);
    for (i = 1; i <= 22; i++) {
        *p = 0x05;
        p += D_DX;
    }
}
void goal_meter_draw(int dy)
{
    int  y;
    unsigned char *p, c;
    if (dy < 0)
    {
//        if (map_scroll_y == 0) return;
        y = map_scroll_y / 22;
        if (y & 1)
        {
            c = 0x01;
        }
        else
        {
            c = 0x00;
        }
        p = getscrnaddr(1 + (y >> 1), 3);
        *p = c;
/*
zx_setcursorpos(0,0);
printf("%d%d", y, 1+(y>>1));
zx_setcursorpos(1,0);
printf("%d", c);
*/
    }
    else if (dy > 0)
    {
//        if (map_scroll_y == 1000-48) return;
        y = map_scroll_y / 22;
        if (y & 1)
        {
            c = 0x01;
        }
        else
        {
            if (y == 0)
            {
                return;
            }
            y -= 2;
            c = 0x05;
        }
        p = getscrnaddr(1 + (y >> 1), 3);
        *p = c;
    }
}
void water_gauge_init(void)
{
    unsigned char *p;
    int  i;
    zx81_write_str(getscrnaddr(6, 0), "WATER GAUGE", D_DX);
    p = getscrnaddr(1, 1);
    for (i = 1; i <= 22; i++) {
        *p = 0x05;
        p += D_DX;
    }
}
void water_gauge_draw(void)
{
}

画面はこんな感じです。









お気に入りの記事を「いいね!」で応援しよう

最終更新日  2026.07.15 15:59:43
コメント(0) | コメントを書く
[ZX81C言語でのプログラム開発] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: