Так, я разобрался что делают все пять подпрограмм, правда как они это делают понятно пока только в трёх:
1. сдвигает флаговые байты на заданное аккумулятором количество бит, + грузит из рома новое значение аккумулятора.
2. строит таблицы смещений для двух режимов копирования - из рома и из распакованных данных (как пока не разобрался).
3. в зависимости от входного Y определяет смещение для копирования из распакованных данных или количество байт для копирования (из рома или из распаковки) (тоже пока не разобрался).
4. записывает значение аккумулятора в распаковку как 2 байта - это просто 
5. тоже, что и 4, но 1 байт.
Основная логика распаковки заключена в подпрограмме 3, так как основа программы просто циклично повторяет её с тремя разными Y (32, 160, 288) попеременно, и записывает результаты подпрограммами 4 и 5.
Однако для полного понимания алгоритма нужно разобраться в таблицах смещений второй подпрограммы.

не получится: сразу за данными таблиц идет последовательность из 16 бит (не обязательно в два байта, может быть и в три, если последовательность начинается не с начала флаговых байтов), которая определяет количество повторений основного цикла (того, в котором третья подпрограмма повторяется по три раза за цикл), а это значит, что заранее узнать какое значение записывать в эти флаговые байты не получится (да и само расположение второй половины последовательности может меняться), так как количество повторений вычислится только после запаковки пакета.
такая проблема была и с предыдущим пакером, буду дальше ковыряться, может пойму, где косяк.
я в недоумении... Пакер работает лучше анпакера: после пробы пакета, запакованного пакером, помещенного на место оригинального в роме выявлена проблемка - при работе с оригинальным ромом данные, распакованные анпакером, не совпадают с данными распаованными игрой, однако, данные, запакованные пакером, после распаковки игрой, совпадают с теми, которые запаковывались пакером. Во как, по неисправному анпакеру был написан исправный пакер.