#define ADD(a,b) do{a+=(M&b); C=(a>>8)&1; S=(a>>7)&1; a&=M;}while(0)
#define ADC(a,b) do{a+=(M&b)+C; C=(a>>8)&1; S=(a>>7)&1; a&=M;}while(0)
void div_8(int &hl, int &a, int &bc){
const int M=255;//такая маска чтобы не плодить макросов, hl и a могут быть разной разрядности
int de=-bc&M;//для замены тормозного вычитания сложением
int C=0,S=0;//флаги переноса и знака
ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A1;
S1: ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A2;
S2: ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A3;
S3: ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A4;
S4: ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A5;
S5: ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A6;
S6: ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A7;
S7: ADC(a,a); ADC(hl,hl); ADD(hl,de); if(S) goto A8;
S8: ADC(a,a);
return;
A1: ADC(a,a); ADC(hl,hl); ADD(hl,bc); if(!S) goto S2;
A2: ADC(a,a); ADC(hl,hl); ADD(hl,bc); if(!S) goto S3;
A3: ADC(a,a); ADC(hl,hl); ADD(hl,bc); if(!S) goto S4;
A4: ADC(a,a); ADC(hl,hl); ADD(hl,bc); if(!S) goto S5;
A5: ADC(a,a); ADC(hl,hl); ADD(hl,bc); if(!S) goto S6;
A6: ADC(a,a); ADC(hl,hl); ADD(hl,bc); if(!S) goto S7;
A7: ADC(a,a); ADC(hl,hl); ADD(hl,bc); if(!S) goto S8;
A8: ADC(a,a); ADD(hl,bc);
return;
}