barsik, изначально так и было задумано (идентификатор в старших битах), но при программировании алгоритма выяснилось, что проще и быстрее "разматывать" именно такой "бутерброд", который сделан в финальной версии.
Помимо старшего бита D7, также нужно анализировать и предыдущий - D6, после чего оба этих бита нужно отбрасывать (обнулять) дабы получить значение счётчика. В варианте кодирования идентификатора в младших битах мы убиваем трёх зайцев: анализ каждого бита одной командой ЦПУ (ротация битов через флаг <C>) + параллельно их обнуление и после анализа биты счётчика автоматом оказываются на нужных позициях.
Пример участка кода распаковки:
Код:
XRA A ; <C>=0
MOV B,A ; [B]=0
LOOP:
CALL GetBYTE
;<C>=0
RAR
JC UnpackSame
; серия разных
;<C>=0
RAR
JNC UnpackDiff1
; серия разных 64..16384
MOV B,A
CALL GetBYTE
UnpackDiff1:
MOV C,A
UnpackDiff2:
CALL GetBYTE
MOV M,A
; адрес следующего байта на экране
CALL NextScreenADDR
RZ; конец алгоритма
UnpackDiff3:
DCX B
MOV A,B
ORA C
JNZ UnpackDiff2
JMP LOOP
UnpackSame:
; серия одинаковых
CMC; <C>=0
RAR
JNC UnpackSame1
; серия одинаковых 64..16384
MOV B,A
CALL GetBYTE
UnpackSame1:
MOV C,A
CALL GetBYTE
STA UnpackSame2+1
UnpackSame2:
MVI M,0
; адрес следующего байта на экране
CALL NextScreenADDR
RZ; конец алгоритма
UnpackSame3:
DCX B
MOV A,B
ORA C
JNZ UnpackSame2
JMP LOOP