;nikphe^anarchia

   А  вот вам и самый короткий (46 байт) генератор чанок 4x4 (17
градаций) с дублированием спрайта в байте.Ну,кто напишет короче?

   Чтобы  понять сам метод генерации, приведу матрицу последова-
тельного заполнения чанка:
 ┌──┬──┬──┬──┐
 │ 6│14│ 8│16│    Довольно легко увидеть закономерность заполне-
 ├──┼──┼──┼──┤ ния матрицы.
 │10│ 2│12│ 4│
 ├──┼──┼──┼──┤    Чтобы узнать максимальное число градаций, надо
 │ 7│15│ 5│13│ умножить  высоту  на  ширину и прибавить единицу.
 ├──┼──┼──┼──┤ В данном  случае  4x4+1=17, т.к. существует ещё и
 │11│ 3│ 9│ 1│ пустой чанк!!!
 └──┴──┴──┴──┘
   Собственно,метод и заключается в последовательном выставлении
битов в соответствующие ячейки.

   Один чанк будет занимать четыре таких байта:

номер
байта    ┌───────────┬─────── одинаковые;
┌┴┐ ┌────┴────┐ ┌────┴────┐
   ┌──┬──┬──┬──┬──┬──┬──┬──┐     Цифрами показано,после какой
n0 │ 6│14│ 8│16│ 6│14│ 8│16│  градации бит будет включен.
   └──┴──┴──┴──┼──┴──┴──┴──┘     На рисунке показано,какие места
   ┌──┬──┬──┬──┬──┬──┬──┬──┐  байта дублируются.
n1 │10│ 2│12│ 4│10│ 2│12│10│
   └──┴──┴──┴──┼──┴──┴──┴──┘
   ┌──┬──┬──┬──┬──┬──┬──┬──┐
n2 │ 7│15│ 5│13│ 7│15│ 5│13│
   └──┴──┴──┴──┼──┴──┴──┴──┘
   ┌──┬──┬──┬──┬──┬──┬──┬──┐
n3 │11│ 3│ 9│ 1│11│ 3│ 9│ 1│
   └──┴──┴──┴──┴──┴──┴──┴──┘

   Возьмём четыре пустых байта по адресу BUS, там будет хранить-
ся  рабочий  чанк. После включения одного соответствующего бита,
эти четыре байта перекидываются в создаваемую таблицу чанков.

   На  выставление соответствующего бита в соответствующем байте
будет тратиться один байт, т.е.у нас получится таблица для гене-
рации размером в 16 байт (т.к. включить надо 16 бит).

   Каждый байт для включения бита хранит в себе:
  ┌─┬─┬─┬─┬─┬─┬─┬─┐
  │x│x│0│0│y│y│y│y│ где xx - номер байта чанка;
  └─┴─┴─┴─┴─┴─┴─┴─┘ а yyyy - включаемые биты;
                    00 - неиспользуемые биты.
   Вот,собственно,вся таблица:

  ╔═╤═╤═╤═╤═╤═╤═╤═╗
01║█│█│░│░│░│░│░│█║     Цифры в начале показывают,для какой гра-
  ╠═╪═╪═╪═│═╪═╪═╪═╣  дации байт.
02║░│█│░│░│░│█│░│░║
  ╠═╪═╪═╪═│═╪═╪═╪═╣     Теперь расскажу, как работать с этой
03║█│█│░│░│░│█│░│█║  таблицей:
  ╠═╪═╪═╪═│═╪═╪═╪═╣
04║░│█│░│░│░│█│░│█║     Допустим,что в BC у нас адрес соответст-
  ╠═╪═╪═╪═│═╪═╪═╪═╣  вующего байта из таблицы,а в HL - адрес че-
05║█│░│░│░│░│░│█│░║  тырёх  рабочих байт, где мы последовательно
  ╠═╪═╪═╪═│═╪═╪═╪═╣  генерим чанки,причём этот адрес должен быть
06║░│░│░│░│█│░│░│░║  кратен  #100, т.е. младший байт должен быть
  ╠═╪═╪═╪═│═╪═╪═╪═╣  равен нулю, тогда будем делать так:
07║█│░│░│░│█│░│█│░║
  ╠═╪═╪═╪═│═╪═╪═╪═╣  1. берём байт из таблицы, выделяем два ста-
08║░│░│░│░│█│░│█│░║    рших бита и переносим их в начало  байта,
  ╠═╪═╪═╪═│═╪═╪═╪═╣    тем самым получаем адрес  байта  чанка, в
09║█│█│░│░│░│█│█│█║    котором необходимо установить бит:
  ╠═╪═╪═╪═│═╪═╪═╪═╣
10║░│█│░│░│█│█│░│█║           ld a,(bc)
  ╠═╪═╪═╪═│═╪═╪═╪═╣           rlca
11║█│█│░│░│█│█│█│█║           rlca
  ╠═╪═╪═╪═│═╪═╪═╪═╣           and 3
12║░│█│░│░│█│█│█│█║           ld l,a ;hl-теперь указывает на
  ╠═╪═╪═╪═│═╪═╪═╪═╣                     рабочий байт чанка;
13║█│░│░│░│█│░│█│█║
  ╠═╪═╪═╪═│═╪═╪═╪═╣  2. опять берём всё тот же байт из таблицы и
14║░│░│░│░│█│█│█│░║    копируем его,с дубликацией,в рабочий байт
  ╠═╪═╪═╪═│═╪═╪═╪═╣    чанка:
15║█│░│░│░│█│█│█│█║
  ╠═╪═╪═╪═│═╪═╪═╪═╣           ld a,(bc)
16║░│░│░│░│█│█│█│█║           ld (hl),a
  ╚═╧═╧═╧═╧═╧═╧═╧═╝           rld       ;дублируем;

                     3. копируем  четыре  рабочих  байта чанка в
                       таблицу создаваемых чанок.

   Т.е. в  конце  всех  упрощений (извращений ;) получится такая
прогза, которая, кстати, есть в приложении.

BUS     EQU #4800 ;адрес четырёх пустых байт
CHX     EQU #C000 ;размещение генерируемых чанок

        ORG #8002 ;.ADDR=#02!!!!

DATA    DB #0F,#8F,#0E,#8B  ;таблица расположена в обратном
        DB #4F,#CF,#4D,#C7  ;порядке.
        DB #0A,#8A,#08,#82
        DB #45,#C5,#44,#C1

        ORG $
        LD BC,DATA+17
        LD DE,CHX
CHURKI  LD HL,BUS
        PUSH BC    ;копирование четырёх рабочих
        LD BC,4    ;чанок
        LDIR
        POP BC
        LD A,(BC)  ;формирование адреса
        RLCA
        RLCA
        AND 3
        LD L,A
        LD A,(BC)  ;копирование и дублирование
        LD (HL),A  ;включенных битов чанка
        RLD
        DEC C
        JR NZ,CHURKI
        RET

   Если вам не нужно дублирование чанка,то фрагмент:

        ld a,(bc)
        ld (hl),a
        rld

 замените на:

        ld a,(bc)
        and %00001111
        ld (hl),a

   Как говорится, всё гениальное - просто!!!
Сайт управляется системой uCoz