Ну тогда наверное в ущерб скорости ещё можно размер ужать?
Можно сделать условную компиляцию - чтобы собирала типа самый быстрый вариант и с другим ключом самый компактный
А ещё будет самый жырный вариант от меня - с "объяснялками"
P.S. Смотрю последние варианты - я в своих экспериментах над первой версией кода по похожему пути пошёл
Code: Select all
CHBASE EQU '@'
PLUS16 EQU 8000h
LETTER4_X EQU 10h
LETTER4_L EQU 20h
LETTER4_H EQU 30h
LETTER4_I EQU 40h
LETTER4_D EQU 50h
LETTER4_V EQU 60h
LETTER4_G EQU 70h
LETTER4_E EQU 80h
LETTER4_B EQU 90h
disasm_mnemo_8085:
; db "MOV ","MVI ","STAX","LDAX","STA ","LDA "
dw (('M'-CHBASE)+(('O'-CHBASE)*32)+(('V'-CHBASE)*1024))
db 3
dw (('M'-CHBASE)+(('V'-CHBASE)*32)+(('I'-CHBASE)*1024)+PLUS16)
db 1 ; 17
dw (('S'-CHBASE)+(('T'-CHBASE)*32)+(('A'-CHBASE)*1024))
db LETTER4_X+7
dw (('L'-CHBASE)+(('D'-CHBASE)*32)+(('A'-CHBASE)*1024))
db LETTER4_X+8
dw (('S'-CHBASE)+(('T'-CHBASE)*32)+(('A'-CHBASE)*1024))
db 5
dw (('L'-CHBASE)+(('D'-CHBASE)*32)+(('A'-CHBASE)*1024))
db 6
P.P.S. Это последний вариант или ещё будешь чего подчищать?
Code: Select all
disassm_disassm_str_8085_let4:
db "XXDDHGLLBLEIIVXXLL"
Я могу под
pdp11asm85 опять напильником обработать чтобы без макросов стало
P.P.P.S. А вот это никак нельзя упростить? Вроде как лишние 16 байт т.к один и тот же адрес повторяется 8 раз:
Code: Select all
disassm_op:
dw disassm_op_none, disassm_op_r8, disassm_op_r16, disassm_op_im8
dw disassm_op_im16, disassm_op_r8_im8, disassm_op_r16_im16, disassm_op_n
dw disassm_op_b_r8, disassm_op_c_r8, disassm_op_d_r8, disassm_op_e_r8
dw disassm_op_h_r8, disassm_op_l_r8, disassm_op_m_r8, disassm_op_a_r8
...
disassm_op_b_r8:
disassm_op_c_r8:
disassm_op_d_r8:
disassm_op_e_r8:
disassm_op_h_r8:
disassm_op_l_r8:
disassm_op_m_r8:
disassm_op_a_r8:
mov a, c
rrc
rrc
rrc
rrc
call disassm_op_r8
...
типа вот тут проверить, что если код операнда 8,9,10,11,12,13,14 или 15, то сделать его 8
Code: Select all
mov c, m ; operands
mov a, c
ani 0F0h
; тут проверить если A>=80h, то сделать A=80h
cpi 80h
jc $+2
mvi a,80h
; и далее как было
rrc
rrc
rrc
mov e, a
lxi h, disassm_op
dad d
...
и укоротить табличку disassm_op на 14 байт:
Code: Select all
disassm_op:
dw disassm_op_none, disassm_op_r8, disassm_op_r16, disassm_op_im8
dw disassm_op_im16, disassm_op_r8_im8, disassm_op_r16_im16, disassm_op_n
dw disassm_op_any_r8 ; фсё
что вместе с увеличением кода на 7 байт приведёт к экономии в 7 байт, что уже даст 992 байта вместо 999
Подумал было, что можно поправить коды
Code: Select all
MNEMO_OP_NONE EQU 0
MNEMO_OP_R8 EQU 1
MNEMO_OP_R16 EQU 2
MNEMO_OP_IM8 EQU 3
MNEMO_OP_IM16 EQU 4
MNEMO_OP_R8_IM8 EQU 5
MNEMO_OP_R16_IM16 EQU 6
MNEMO_OP_N EQU 7
MNEMO_OP_B_R8 EQU 8
MNEMO_OP_C_R8 EQU 8 ; !!!
MNEMO_OP_D_R8 EQU 8 ; !!!
MNEMO_OP_E_R8 EQU 8 ; !!!
MNEMO_OP_H_R8 EQU 8 ; !!!
MNEMO_OP_L_R8 EQU 8 ; !!!
MNEMO_OP_M_R8 EQU 8 ; !!!
MNEMO_OP_A_R8 EQU 8 ; !!!
чтобы не потребовалось вставки лишней проверки, что сэкономит ещё 7 байт, однако потом увидел по программе, что этот же код потом нужен для вытаскивания имени регистра, ну значит проверка необходима, что возвращает нас обратно к 992
