;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