Автор Тема: z88dk и блочная графика.  (Прочитано 291 раз)

Sharpnull, suhmai и 1 Гость просматривают эту тему.

Оффлайн SMax

  • Пользователь
  • Сообщений: 7
    • Просмотр профиля
z88dk и блочная графика.
« : 21 Октябрь 2025, 09:48:56 »
Делаю игрушку на C z88dk под zx80.
Никак не могу победить блочную графику, выводит пустые строки и всё. Коды с 0x80 по 0x8F. Уже по всякому изгалялся, никак не выводятся.
Подскажите как блочную графику вывести на экран?

#include <stdio.h>

void main(void) {
    int i;
   
    printf("System character set test:\n");
    printf("==========================\n");
   
    // Тест стандартных ASCII символов
    printf("ASCII (32-127): ");
    for(i = 32; i < 127; i++) {
        putchar(i);
    }
    printf("\n\n");
   
    // Тест символов блочной графики
    printf("Block graphics (128-143):\n");
    for(i = 128; i <= 143; i++) {
        printf("Code %3d: [%c]\n", i, (char)i);
    }
   
    // Тест альтернативных кодов
    printf("\nAlternative codes (176-223):\n");
    for(i = 176; i <= 223; i++) {
        printf("%c", (char)i);
    }
    printf("\n");
}

zcc +zx -lm -create-app -clib=sdcc_iy -o blocks blocks.c

Онлайн Sharpnull

  • Пользователь
  • Сообщений: 5508
    • Просмотр профиля
z88dk и блочная графика.
« Ответ #1 : 21 Октябрь 2025, 11:32:24 »
Стандартный шрифт в роме и кодировка (набор символов) такая https://en.wikipedia.org/wiki/ZX80_character_set. Можно определить свой шрифт https://github.com/z88dk/z88dk/wiki/Classic-GenericConsole#defining-a-custom-font, пример кода https://github.com/z88dk/z88dk/blob/2e38490f409973d45e8af4844bd2e58f4ec21e28/examples/spectrum/fontexample.c.
UPD: Я дал пример кода для ZX Spectrum, а не ZX80.
« Последнее редактирование: 21 Октябрь 2025, 12:07:42 от Sharpnull »

Оффлайн SMax

  • Пользователь
  • Сообщений: 7
    • Просмотр профиля
z88dk и блочная графика.
« Ответ #2 : 21 Октябрь 2025, 14:02:11 »
Стандартный шрифт в роме и кодировка (набор символов) такая https://en.wikipedia.org/wiki/ZX80_character_set. Можно определить свой шрифт https://github.com/z88dk/z88dk/wiki/Classic-GenericConsole#defining-a-custom-font, пример кода https://github.com/z88dk/z88dk/blob/2e38490f409973d45e8af4844bd2e58f4ec21e28/examples/spectrum/fontexample.c.
UPD: Я дал пример кода для ZX Spectrum, а не ZX80.

Да, я что-то ошибся. Мне надо для ZX Spectrum.
По ссылкам пробежался. Не совсем то что надо, но всё равно спасибо большое. Пригодится. Особенно fontexample.c
Хотелось бы чтобы просто набрал что-то вроде printf("\x8B\x83\x87\n"); и не заморачиваться с костылями.

Онлайн Sharpnull

  • Пользователь
  • Сообщений: 5508
    • Просмотр профиля
Re: z88dk и блочная графика.
« Ответ #3 : 21 Октябрь 2025, 16:02:28 »
Оказывается, что z88dk определяет шрифты только до 127, с 128 нужно задать самому https://github.com/z88dk/z88dk/wiki/Classic-GenericConsole#defining-udgs. Я взял из z88dk\examples\console\dstar_gencon.c код для простого вывода доп. символов 0x80 - 0x83:
Компилировал как zcc +zx -vn -lndos fontexample.c -create-app -o fontexample.bin.
Вам остаётся в udgs добавить свою графику символов.
UPD: Вы можете нарисовать шрифт в 8x8 Pixel ROM Font Editor https://www.min.at/prinz/o/software/pixelfont/ и File > Export as C include.
UPD2: Для теста я использовал 128-255 символы:
« Последнее редактирование: 21 Октябрь 2025, 16:15:16 от Sharpnull »

Оффлайн SMax

  • Пользователь
  • Сообщений: 7
    • Просмотр профиля
z88dk и блочная графика.
« Ответ #4 : 21 Октябрь 2025, 18:48:56 »
Я тоже подумал про UDG, хотя это ненормально, если уже есть готовые символы в ZX Spectrum.
Даже уже начал рисовать эти символы. А потом просто написал вопрос на форуме www.z88dk.org
https://www.z88dk.org/forum/viewtopic.php?t=12088

И мне ответили!
Работает!

/*
 * zcc +zx -vn -startup=30 -clib=sdcc_iy block.c -o block -create-app
 */

#include <stdio.h>

void main(void)
{
  for( uint8_t i=0x80; i <= 0x8F; i++ )
  {
    printf("0x%02X = %c\n", i, i);
  }
}

Онлайн Sharpnull

  • Пользователь
  • Сообщений: 5508
    • Просмотр профиля
z88dk и блочная графика.
« Ответ #5 : 21 Октябрь 2025, 19:23:59 »
Работает!
Получается отличие только в -startup=30, этот параметр задаёт вариант для target. Их много https://github.com/z88dk/z88dk/tree/2e38490f409973d45e8af4844bd2e58f4ec21e28/libsrc/_DEVELOPMENT/target/zx/startup, со значением 30, кроме системного шрифта, ещё какие-то изменения. Ещё бы знать где посмотреть подробное описание каждого значения, но это уже проблема разработчиков под ZX.

Оффлайн SMax

  • Пользователь
  • Сообщений: 7
    • Просмотр профиля
z88dk и блочная графика.
« Ответ #6 : 21 Октябрь 2025, 22:42:56 »
Про это описано в ZXSpectrumZSDCCnewlib_02_HelloWorld.md

#### -startup=30 (crt30)

32x24 rom print routine, no scanf
much smaller than other crts because the rom is used for output

Я не телепат, как понять, что это то что мне надо?!

Ну хоть что-то!

На самом деле я уже счастлив, не надо использовать костыли!
Моя игра чисто текстовая (ZX Spectrum 48K) и каждый байт имеет значение.

/*
 * zcc +zx -vn -startup=30 -clib=sdcc_iy block.c -o block -create-app
 */
#include <stdio.h>
void main(void)
{
printf("\x8B\x83\x7fMaxim_Sivkov_2025\x83\x87\n");
for (int i = 1; i < 19; i++) {
printf("\x8A                    \x85\n");
}
printf("\x8E\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8D");
}


Оффлайн SMax

  • Пользователь
  • Сообщений: 7
    • Просмотр профиля
z88dk и блочная графика.
« Ответ #7 : Вчера в 12:32:55 »
Теперь другая проблема появилась. Не могу изменить цвет
коды для INK, PAPER перестали работать.

puts("\x10\x31");
Говорит Invalid Colour

Прям беда какая-то.

Онлайн Sharpnull

  • Пользователь
  • Сообщений: 5508
    • Просмотр профиля
Re: z88dk и блочная графика.
« Ответ #8 : Вчера в 14:50:07 »
Говорит Invalid Colour
Ну так -startup=30 не поддерживает control code, этот CRT по минимуму сделан. И про вопрос выше, также нет поддержки функции scanf(), которую вы знаете, но предполагаю, что чтение ввода всё-таки осталось, иначе был бы бесполезный CRT.

Оффлайн SMax

  • Пользователь
  • Сообщений: 7
    • Просмотр профиля
Re: z88dk и блочная графика.
« Ответ #9 : Вчера в 18:02:40 »
Ну так -startup=30 не поддерживает control code, этот CRT по минимуму сделан. И про вопрос выше, также нет поддержки функции scanf(), которую вы знаете, но предполагаю, что чтение ввода всё-таки осталось, иначе был бы бесполезный CRT.

Тяжко с нуля это всё воспринимать, особенно с учётом, что в Си я полный ноль. Незнание базовых библиотек и синтаксиса напрягает.

Вот строка компиляции кода:
zcc +zx -vn -startup=30 -clib=sdcc_iy -create-app minesweaper.c -o minesweaper

И код:
#include <stdio.h>
#include <arch/zx.h>
//#include <arch/spectrum.h>
//#include <stdlib.h>

#define FLASH_ON "\x12\x31"
#define FLASH_OFF "\x12\x30"
#define BRIGHT_ON "\x13\x31"
#define BRIGHT_OFF "\x13\x30"
#define INK "\x10"
#define PAPER "\x11"
#define BLACK "\x30"
#define BLUE "\x31"
#define RED "\x32"
#define WHITE "\x37"
#define AT "\x16"
#define printInk(k)          printf("\x10%c", '0'+k)
#define printPaper(k)        printf("\x11%c", '0'+k)
#define printAt(row, col)    printf("\x16%c%c", (row)+32, (col)+32)
 
void main(void)
{
zx_cls(PAPER_WHITE);
zx_border(PAPER_BLACK);

//puts(INK BLUE); //not work
//zx_colour(112); //not work
//zx_colour(PAPER_BLACK|INK_WHITE); //not work
//printInk(1); //not work
//printPaper(1); //not work
//printAt(1,1); //not work

printf("\x8B\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x83\x87\n");
for (int i = 1; i < 20; i++) {
printf("\x8A                    \x85\n");
}
printf("\x8E\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8C\x8D\n\n");
}

Готов к любой идее как победить проблему. Даже если идея безумная.

Онлайн Sharpnull

  • Пользователь
  • Сообщений: 5508
    • Просмотр профиля
Re: z88dk и блочная графика.
« Ответ #10 : Вчера в 20:36:24 »
Готов к любой идее как победить проблему
Возможно для CRT 30 стандартный для спектрума способ окрашивания текста. Я ввёл printf("\x16\x0A\x03\x10\x01\x11\x06\x13\x01Hello good Sir!"); и получил жёлтый фон и синий текст как здесь https://youtu.be/5qiXx5P6oUc?t=2443. Для \x16\x0A\x03\x10\x01\x11\x06\x13\x01 у него написано AT 22,3 INK Blue PAPER yellow FLASH 1.

Оффлайн SMax

  • Пользователь
  • Сообщений: 7
    • Просмотр профиля
Re: z88dk и блочная графика.
« Ответ #11 : Сегодня в 07:59:33 »
Возможно для CRT 30 стандартный для спектрума способ окрашивания текста. Я ввёл printf("\x16\x0A\x03\x10\x01\x11\x06\x13\x01Hello good Sir!"); и получил жёлтый фон и синий текст как здесь https://youtu.be/5qiXx5P6oUc?t=2443. Для \x16\x0A\x03\x10\x01\x11\x06\x13\x01 у него написано AT 22,3 INK Blue PAPER yellow FLASH 1.

Оригинально получилось. Я всякие варианты перебирал, но не догадался ввести именно так.
Что интересно, работают цвета с \x01 по \x07. На \x00 ругается. Осталось разобраться как вывести BLACK Color

Онлайн Sharpnull

  • Пользователь
  • Сообщений: 5508
    • Просмотр профиля
Re: z88dk и блочная графика.
« Ответ #12 : Сегодня в 14:21:08 »
На \x00 ругается. Осталось разобраться как вывести BLACK Color
В языке C строки завершаются нулём, поэтому нельзя передать 0x00. Не знаю лучший способ, но можно передать 0x00 в putchar():
putchar(0x10); // Ink
putchar(0x03);
putchar(0x11); // Paper
putchar(0x00);
printf("Test");
Или через fwrite() записать нужное кол-во байт, но занимает больше кода (размер .tap файла):
fwrite("\x10\x03\x11\x00", 1, 4, stdout);
printf("Test");