быстрое деление/умножение

ZXNet эхоконференция «code.zx»

От Kirill Frolov Кому All 23.03.2001

Hемедленно нажми на RESET, All! Пытаюсь драйвер винта для ис-доса (и не только) сделать. А тут надо CHS адресацию в LBA пересчитывать и обратно. Если из CHS в LBA то получается два 16-битных умножения, а если из LBA в CHS то одно умножение и два 16-битных деления с остатком. А если вспомнить сколько времени спек делит 16-битные числа то страшно становится подумать как же оно тормозить будет! Hа одно деление уходит только несколько тысяч тактов, да и на умножение не намного меньше. :-( Можно провести оптимизацию: ; HLDE=LBA, HL'=трек DE'=секторов в треке LD B, 4 L1 ЕX DE, HL ADD HL, HL EX DE, HL ADC HL, HL DJNZ L1 LD B, 28 EXX LD HL, 0 LD DE, (HEADS*SECTORS) EXX L2 EX DE, HL ADD HL, HL EX DE, HL ADC HL, HL EXX CCF JR NC, L3 ADD HL, DE L3 ADC HL, HL EXX DJNZ L2 Получается около 2-х тыс. тактов. :-( Hа ОДHУ операцию! :-( Дизассемблером ещё не пытался смотреть -- неужели так каждый драйвер винта тормозит? :-( ) * Originally in CODE.ZX * Crossposted in ZX.SPECTRUM