[SDK] Новая математика для кросс-компилятора в 8080/z80

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

shiny wrote:А не может такого быть, что используется var>>bitcount или явно var>>8 ?
Арифметика у меня всегда через стек и я не могу на этапе компиляции определить что сидит в стеке - переменная или константа - поэтому остаётся только на лету смотреть и проверять в рантайме (на самом деле теоретически могу и на этапе компиляции, если начну искать паттерны в байткоде выражений)...

P.S. Вот как ведут себя сдвиги 16-битного аргумента в Си (проверено в 64-битном GCC, 32-битном OpenWatcom-C/C++ и 16-битном Borland C++):

Code: Select all

-2	#0000 #0000 #FFFF
-1	#0000 #0000 #FFFF
0	#1234 #1234 #EDCB
1	#2468 #091A #F6E5
2	#48D0 #048D #FB72
3	#91A0 #0246 #FDB9
4	#2340 #0123 #FEDC
5	#4680 #0091 #FF6E
6	#8D00 #0048 #FFB7
7	#1A00 #0024 #FFDB
8	#3400 #0012 #FFED
9	#6800 #0009 #FFF6
10	#D000 #0004 #FFFB
11	#A000 #0002 #FFFD
12	#4000 #0001 #FFFE
13	#8000 #0000 #FFFF
14	#0000 #0000 #FFFF
15	#0000 #0000 #FFFF
16	#0000 #0000 #FFFF
17	#0000 #0000 #FFFF
18	#0000 #0000 #FFFF
19	#0000 #0000 #FFFF
20	#0000 #0000 #FFFF
21	#0000 #0000 #FFFF
22	#0000 #0000 #FFFF
23	#0000 #0000 #FFFF
24	#0000 #0000 #FFFF
25	#0000 #0000 #FFFF
26	#0000 #0000 #FFFF
27	#0000 #0000 #FFFF
28	#0000 #0000 #FFFF
29	#0000 #0000 #FFFF
30	#0000 #0000 #FFFF
31	#0000 #0000 #FFFF
32	#1234 #1234 #EDCB
33	#2468 #091A #F6E5
34	#48D0 #048D #FB72
35	#91A0 #0246 #FDB9
36	#2340 #0123 #FEDC
37	#4680 #0091 #FF6E
38	#8D00 #0048 #FFB7
39	#1A00 #0024 #FFDB
40	#3400 #0012 #FFED
Программа:

Code: Select all

#include <stdio.h>
#include <stdlib.h>

int main()
{
 int i;
 short w1,w2,w3,w=0x1234;
 for(i=-2;i<=40;i++)
 {
   w1 = w<<i;
   w2 = w>>i;
   w3 = (~w)>>i;
   printf("%i\t#%4.4X #%4.4X #%4.4X\n",i,w1&0xFFFF,w2&0xFFFF,w3&0xFFFF);
 }
 return 0;
}
Сделаю из этого тест 0003 :mrgreen:

P.P.S. Кстати я могу задействовать функционал по подсчёту тактов в эмуляторе Pseudo-86RK и сравнить время выполнения оригинальных сдвигов из Small-C и этих моих новых :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mondx
Doomed
Posts: 509
Joined: 10 Aug 2022 14:27
Location: Crimea

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Mondx »

Шаос, я не могу тебя учить. Но. Ты знаешь что такое стиль? Это то как ты одеваешься. Понятно, что провожают по уму, а не по одёжке, однако и по этому тоже. Ну есть же куча статей по стилю С/С++, почитал бы, не? А то, прям, воротит, ей богу.)
Last edited by Mondx on 21 Jul 2024 22:27, edited 1 time in total.
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

Mondx wrote:Шаос, я не могу тебя учить. Но. Ты знаешь что такое стиль? Это то как ты одеваешься. Понятно, что провожают по уму, а не по одёжке, однако и по этому тоже. Ну есть же куча статей по стилю С/С++, почитал бы, не? А то, прям, воротит, ей богу.)
Ну вот только в хобби не надо меня на тему кодингстайла лечить - мне на работе нытья на эту тему в кодревью хватает :lol:
Для себя я пишу как хочу, как мне удобно, как привык ещё в ранние 90е, а не как наса предложила или гугол захотел :no:
Если непонятно, то открываем азы - там Кернигана и Ричи например - и подтягиваемся до нужного уровня :eugeek:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

Shaos wrote:Кстати я могу задействовать функционал по подсчёту тактов в эмуляторе Pseudo-86RK и сравнить время выполнения оригинальных сдвигов из Small-C и этих моих новых :roll:
Первые результаты прогона с подсчётом тактов - пока только сдвиги влево числа #1234 на количество бит от 0 до 32:

Screenshot from 2024-07-22 01-36-44.png
Screenshot from 2024-07-22 01-36-44.png (34.67 KiB) Viewed 1306 times

Как можно видеть в самом начале моя подпрограмма чуть хуже (из-за проверок), но потом догоняет и обгоняет подпрограмму из Small-C ( а особый случай 8 вообще сильно лучше : )

Что касается правильности, то ответы совпадают от 0 до 31, а вот в случае 32 я по сишному делаю как сдвиг опять на 0 бит, возвращая #1234, а Small-C тупо двигает 32 раза влево, тратя на это 1000 с лишним тактов и выдавая ноль в качестве ответа!

Завтра допишу тестовую прогу, чтобы проверяла сдвиг вправо положительного и отрицательного числа точно также от 0 до 32 и выложу саму прогу и xls-файл с табличкой и графиком...

P.S. Вот тут есть объяснение почему сдвиг на 32 может означать сдвиг на 0: https://stackoverflow.com/questions/2648764/whats-bad-about-shifting-a-32-bit-variable-32-bits
Shifting a 32-bit value by 32 bits or more is undefined in C and C++. One of the reasons it was left undefined is that on some hardware platforms the 32-bit shift instruction only takes into account 5 lowest bits of the supplied shift count. This means that whatever shift count you pass, it will be interpreted modulo 32. Attempting to shift by 32 on such platform will actually shift by 0, i.e. not shift at all.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

Окончательный график (для Small-C сдвиг вправо одинаковый для положительных и отрицательных чисел, а у меня разница 4 такта, но на графике тоже не сильно видно):

Screenshot from 2024-07-22 20-27-47.png
Screenshot from 2024-07-22 20-27-47.png (124.34 KiB) Viewed 1273 times

Короче где-то после 5 у меня всё быстрее и быстрее :rotate:
Ну и сдвиг на 8 совсем быстро :lol:

Текст программы в мнемониках RASM будет в следующем сообщении (я придумал как немного ускорить сдвиг вправо)

Выхлоп Pseudo-86RK со счётчиками:

 TEST1.OUT

Code: Select all

{pseudo-86rk:v0.3}
radio-86rk
-->{a-event:0::::}
{a-event:49::::}
{a-event:64::::}
{a-event:42::::}
{b-event:54:0:::}
{b-event:103:49:::}
{b-event:167:64:::}
{b-event:209:42:::}
{c-event:312:103:0::}
{c-event:361:152:49::}
{c-event:425:216:64::}
{c-event:467:258:42::}

#1234>>#00 #1234 #1234 #1234 #1234 #EDCB #EDCB
.
.{a-event:146598:146389:146131::}
{a-event:95:146484:146226::}
{a-event:64:146548:146290::}
{a-event:72:146620:146362::}
{b-event:54:146674:146416::}
{b-event:195:141:146557::}
{b-event:259:64:146621::}
{b-event:358:99:146720::}
{c-event:461:103:146823::}
{c-event:598:240:137::}
{c-event:662:304:64::}
{c-event:761:403:99::}

#1234>>#01 #2468 #2468 #091A #091A #F6E5 #F6E5
.
.{a-event:146867:146509:146106::}
{a-event:120:146629:146226::}
{a-event:64:146693:146290::}
{a-event:102:146795:146392::}
{b-event:54:146849:146446::}
{b-event:242:188:146634::}
{b-event:306:64:146698::}
{b-event:462:156:146854::}
{c-event:565:103:146957::}
{c-event:749:287:184::}
{c-event:813:351:64::}
{c-event:969:507:156::}

#1234>>#02 #48D0 #48D0 #048D #048D #FB72 #FB72
.
.{a-event:147089:146627:146120::}
{a-event:145:146772:146265::}
{a-event:64:146836:146329::}
{a-event:132:146968:146461::}
{b-event:54:147022:146515::}
{b-event:289:235:146750::}
{b-event:353:64:146814::}
{b-event:566:213:147027::}
{c-event:669:103:147130::}
{c-event:900:334:231::}
{c-event:964:398:64::}
{c-event:1177:611:213::}

#1234>>#03 #91A0 #91A0 #0246 #0246 #FDB9 #FDB9
.
.{a-event:147297:146731:146120::}
{a-event:170:146901:146290::}
{a-event:64:146965:146354::}
{a-event:162:147127:146516::}
{b-event:54:147181:146570::}
{b-event:336:282:146852::}
{b-event:400:64:146916::}
{b-event:670:270:147186::}
{c-event:773:103:147289::}
{c-event:1051:381:278::}
{c-event:1115:445:64::}
{c-event:1385:715:270::}

#1234>>#04 #2340 #2340 #0123 #0123 #FEDC #FEDC
.
.{a-event:147516:146846:146131::}
{a-event:195:147041:146326::}
{a-event:64:147105:146390::}
{a-event:192:147297:146582::}
{b-event:54:147351:146636::}
{b-event:383:329:146965::}
{b-event:447:64:147029::}
{b-event:774:327:147356::}
{c-event:877:103:147459::}
{c-event:1202:428:325::}
{c-event:1266:492:64::}
{c-event:1593:819:327::}

#1234>>#05 #4680 #4680 #0091 #0091 #FF6E #FF6E
.
.{a-event:147699:146925:146106::}
{a-event:220:147145:146326::}
{a-event:64:147209:146390::}
{a-event:222:147431:146612::}
{b-event:54:147485:146666::}
{b-event:430:376:147042::}
{b-event:494:64:147106::}
{b-event:878:384:147490::}
{c-event:981:103:147593::}
{c-event:1353:475:372::}
{c-event:1417:539:64::}
{c-event:1801:923:384::}

#1234>>#06 #8D00 #8D00 #0048 #0048 #FFB7 #FFB7
.
.{a-event:147921:147043:146120::}
{a-event:245:147288:146365::}
{a-event:64:147352:146429::}
{a-event:252:147604:146681::}
{b-event:54:147658:146735::}
{b-event:477:423:147158::}
{b-event:541:64:147222::}
{b-event:982:441:147663::}
{c-event:1085:103:147766::}
{c-event:1504:522:419::}
{c-event:1568:586:64::}
{c-event:2009:1027:441::}

#1234>>#07 #1A00 #1A00 #0024 #0024 #FFDB #FFDB
.
.{a-event:148143:147161:146134::}
{a-event:82:147243:146216::}
{a-event:64:147307:146280::}
{a-event:282:147589:146562::}
{b-event:54:147643:146616::}
{b-event:160:106:146722::}
{b-event:224:64:146786::}
{b-event:722:498:147284::}
{c-event:825:103:147387::}
{c-event:931:209:106::}
{c-event:995:273:64::}
{c-event:1493:771:498::}

#1234>>#08 #3400 #3400 #0012 #0012 #FFED #FFED
.
.{a-event:147613:146891:146120::}
{a-event:295:147186:146415::}
{a-event:64:147250:146479::}
{a-event:312:147562:146791::}
{b-event:54:147616:146845::}
{b-event:571:517:147362::}
{b-event:635:64:147426::}
{b-event:1190:555:147981::}
{c-event:1293:103:148084::}
{c-event:1806:616:513::}
{c-event:1870:680:64::}
{c-event:2425:1235:555::}

#1234>>#09 #6800 #6800 #0009 #0009 #FFF6 #FFF6
.
.{a-event:148542:147352:146117::}
{a-event:320:147672:146437::}
{a-event:64:147736:146501::}
{a-event:342:148078:146843::}
{b-event:54:148132:146897::}
{b-event:618:564:147461::}
{b-event:682:64:147525::}
{b-event:1294:612:148137::}
{c-event:1397:103:148240::}
{c-event:1957:663:560::}
{c-event:2021:727:64::}
{c-event:2633:1339:612::}

#1234>>#0A #D000 #D000 #0004 #0004 #FFFB #FFFB
.
.{a-event:148774:147480:146141::}
{a-event:345:147825:146486::}
{a-event:64:147889:146550::}
{a-event:372:148261:146922::}
{b-event:54:148315:146976::}
{b-event:665:611:147587::}
{b-event:729:64:147651::}
{b-event:1398:669:148320::}
{c-event:1501:103:148423::}
{c-event:2108:710:607::}
{c-event:2172:774:64::}
{c-event:2841:1443:669::}

#1234>>#0B #A000 #A000 #0002 #0002 #FFFD #FFFD
.
.{a-event:148982:147584:146141::}
{a-event:370:147954:146511::}
{a-event:64:148018:146575::}
{a-event:402:148420:146977::}
{b-event:54:148474:147031::}
{b-event:712:658:147689::}
{b-event:776:64:147753::}
{b-event:1502:726:148479::}
{c-event:1605:103:148582::}
{c-event:2259:757:654::}
{c-event:2323:821:64::}
{c-event:3049:1547:726::}

#1234>>#0C #4000 #4000 #0001 #0001 #FFFE #FFFE
.
.{a-event:149176:147674:146127::}
{a-event:395:148069:146522::}
{a-event:64:148133:146586::}
{a-event:432:148565:147018::}
{b-event:54:148619:147072::}
{b-event:759:705:147777::}
{b-event:823:64:147841::}
{b-event:1606:783:148624::}
{c-event:1709:103:148727::}
{c-event:2410:804:701::}
{c-event:2474:868:64::}
{c-event:3257:1651:783::}

#1234>>#0D #8000 #8000 #0000 #0000 #FFFF #FFFF
.
.{a-event:149384:147778:146127::}
{a-event:420:148198:146547::}
{a-event:64:148262:146611::}
{a-event:462:148724:147073::}
{b-event:54:148778:147127::}
{b-event:806:752:147879::}
{b-event:870:64:147943::}
{b-event:1710:840:148783::}
{c-event:1813:103:148886::}
{c-event:2561:851:748::}
{c-event:2625:915:64::}
{c-event:3465:1755:840::}

#1234>>#0E #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:149603:147893:146138::}
{a-event:445:148338:146583::}
{a-event:64:148402:146647::}
{a-event:492:148894:147139::}
{b-event:54:148948:147193::}
{b-event:853:799:147992::}
{b-event:917:64:148056::}
{b-event:1814:897:148953::}
{c-event:1917:103:149056::}
{c-event:2712:898:795::}
{c-event:2776:962:64::}
{c-event:3673:1859:897::}

#1234>>#0F #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:149800:147986:146127::}
{a-event:470:148456:146597::}
{a-event:64:148520:146661::}
{a-event:522:149042:147183::}
{b-event:54:149096:147237::}
{b-event:900:846:148083::}
{b-event:964:64:148147::}
{b-event:1918:954:149101::}
{c-event:2021:103:149204::}
{c-event:2863:945:842::}
{c-event:2927:1009:64::}
{c-event:3881:1963:954::}

#1234>>#10 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150001:148083:146120::}
{a-event:495:148578:146615::}
{a-event:64:148642:146679::}
{a-event:552:149194:147231::}
{b-event:54:149248:147285::}
{b-event:947:893:148178::}
{b-event:1011:64:148242::}
{b-event:2022:1011:149253::}
{c-event:2125:103:149356::}
{c-event:3014:992:889::}
{c-event:3078:1056:64::}
{c-event:4089:2067:1011::}

#1234>>#11 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150209:148187:146120::}
{a-event:520:148707:146640::}
{a-event:64:148771:146704::}
{a-event:582:149353:147286::}
{b-event:54:149407:147340::}
{b-event:994:940:148280::}
{b-event:1058:64:148344::}
{b-event:2126:1068:149412::}
{c-event:2229:103:149515::}
{c-event:3165:1039:936::}
{c-event:3229:1103:64::}
{c-event:4297:2171:1068::}

#1234>>#12 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150428:148302:146131::}
{a-event:545:148847:146676::}
{a-event:64:148911:146740::}
{a-event:612:149523:147352::}
{b-event:54:149577:147406::}
{b-event:1041:987:148393::}
{b-event:1105:64:148457::}
{b-event:2230:1125:149582::}
{c-event:2333:103:149685::}
{c-event:3316:1086:983::}
{c-event:3380:1150:64::}
{c-event:4505:2275:1125::}

#1234>>#13 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150625:148395:146120::}
{a-event:570:148965:146690::}
{a-event:64:149029:146754::}
{a-event:642:149671:147396::}
{b-event:54:149725:147450::}
{b-event:1088:1034:148484::}
{b-event:1152:64:148548::}
{b-event:2334:1182:149730::}
{c-event:2437:103:149833::}
{c-event:3467:1133:1030::}
{c-event:3531:1197:64::}
{c-event:4713:2379:1182::}

#1234>>#14 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150833:148499:146120::}
{a-event:595:149094:146715::}
{a-event:64:149158:146779::}
{a-event:672:149830:147451::}
{b-event:54:149884:147505::}
{b-event:1135:1081:148586::}
{b-event:1199:64:148650::}
{b-event:2438:1239:149889::}
{c-event:2541:103:149992::}
{c-event:3618:1180:1077::}
{c-event:3682:1244:64::}
{c-event:4921:2483:1239::}

#1234>>#15 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151041:148603:146120::}
{a-event:620:149223:146740::}
{a-event:64:149287:146804::}
{a-event:702:149989:147506::}
{b-event:54:150043:147560::}
{b-event:1182:1128:148688::}
{b-event:1246:64:148752::}
{b-event:2542:1296:150048::}
{c-event:2645:103:150151::}
{c-event:3769:1227:1124::}
{c-event:3833:1291:64::}
{c-event:5129:2587:1296::}

#1234>>#16 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151249:148707:146120::}
{a-event:645:149352:146765::}
{a-event:64:149416:146829::}
{a-event:732:150148:147561::}
{b-event:54:150202:147615::}
{b-event:1229:1175:148790::}
{b-event:1293:64:148854::}
{b-event:2646:1353:150207::}
{c-event:2749:103:150310::}
{c-event:3920:1274:1171::}
{c-event:3984:1338:64::}
{c-event:5337:2691:1353::}

#1234>>#17 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151468:148822:146131::}
{a-event:670:149492:146801::}
{a-event:64:149556:146865::}
{a-event:762:150318:147627::}
{b-event:54:150372:147681::}
{b-event:1276:1222:148903::}
{b-event:1340:64:148967::}
{b-event:2750:1410:150377::}
{c-event:2853:103:150480::}
{c-event:4071:1321:1218::}
{c-event:4135:1385:64::}
{c-event:5545:2795:1410::}

#1234>>#18 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151665:148915:146120::}
{a-event:695:149610:146815::}
{a-event:64:149674:146879::}
{a-event:792:150466:147671::}
{b-event:54:150520:147725::}
{b-event:1323:1269:148994::}
{b-event:1387:64:149058::}
{b-event:2854:1467:150525::}
{c-event:2957:103:150628::}
{c-event:4222:1368:1265::}
{c-event:4286:1432:64::}
{c-event:5753:2899:1467::}

#1234>>#19 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151873:149019:146120::}
{a-event:720:149739:146840::}
{a-event:64:149803:146904::}
{a-event:822:150625:147726::}
{b-event:54:150679:147780::}
{b-event:1370:1316:149096::}
{b-event:1434:64:149160::}
{b-event:2958:1524:150684::}
{c-event:3061:103:150787::}
{c-event:4373:1415:1312::}
{c-event:4437:1479:64::}
{c-event:5961:3003:1524::}

#1234>>#1A #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152088:149130:146127::}
{a-event:745:149875:146872::}
{a-event:64:149939:146936::}
{a-event:852:150791:147788::}
{b-event:54:150845:147842::}
{b-event:1417:1363:149205::}
{b-event:1481:64:149269::}
{b-event:3062:1581:150850::}
{c-event:3165:103:150953::}
{c-event:4524:1462:1359::}
{c-event:4588:1526:64::}
{c-event:6169:3107:1581::}

#1234>>#1B #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152296:149234:146127::}
{a-event:770:150004:146897::}
{a-event:64:150068:146961::}
{a-event:882:150950:147843::}
{b-event:54:151004:147897::}
{b-event:1464:1410:149307::}
{b-event:1528:64:149371::}
{b-event:3166:1638:151009::}
{c-event:3269:103:151112::}
{c-event:4675:1509:1406::}
{c-event:4739:1573:64::}
{c-event:6377:3211:1638::}

#1234>>#1C #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152515:149349:146138::}
{a-event:795:150144:146933::}
{a-event:64:150208:146997::}
{a-event:912:151120:147909::}
{b-event:54:151174:147963::}
{b-event:1511:1457:149420::}
{b-event:1575:64:149484::}
{b-event:3270:1695:151179::}
{c-event:3373:103:151282::}
{c-event:4826:1556:1453::}
{c-event:4890:1620:64::}
{c-event:6585:3315:1695::}

#1234>>#1D #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152712:149442:146127::}
{a-event:820:150262:146947::}
{a-event:64:150326:147011::}
{a-event:942:151268:147953::}
{b-event:54:151322:148007::}
{b-event:1558:1504:149511::}
{b-event:1622:64:149575::}
{b-event:3374:1752:151327::}
{c-event:3477:103:151430::}
{c-event:4977:1603:1500::}
{c-event:5041:1667:64::}
{c-event:6793:3419:1752::}

#1234>>#1E #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152920:149546:146127::}
{a-event:845:150391:146972::}
{a-event:64:150455:147036::}
{a-event:972:151427:148008::}
{b-event:54:151481:148062::}
{b-event:1605:1551:149613::}
{b-event:1669:64:149677::}
{b-event:3478:1809:151486::}
{c-event:3581:103:151589::}
{c-event:5128:1650:1547::}
{c-event:5192:1714:64::}
{c-event:7001:3523:1809::}

#1234>>#1F #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:153128:149650:146127::}
{a-event:49:149699:146176::}
{a-event:64:149763:146240::}
{a-event:1002:150765:147242::}
{b-event:54:150819:147296::}
{b-event:103:49:147345::}
{b-event:167:64:147409::}
{b-event:2033:1866:149275::}
{c-event:2136:103:149378::}
{c-event:2185:152:49::}
{c-event:2249:216:64::}
{c-event:4115:2082:1866::}

#1234>>#20 #1234 #0000 #1234 #0000 #EDCB #FFFF
.
.{halt}
{from-last-a:150215}
{from-last-b:148182}
{from-last-c:146100}
{bye}

Экселевский файл (приготовлен в LibreOffice) обновлю и выложу чуть позже...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

Придумал как ускорить сдвиг в право на 1 такт для отрицательных и на 5 тактов для положительных чисел - теперь у меня цифры стали одинаковые для обоих вариантов, быстрее старого алгоритма из Small-C после 5 и сильно меньше при сдвиге на 8 :lol:

Code: Select all

\ SHIFT DE RIGHT (ARITHMETICALLY) BY L&31 AND RETURN IN HL
SHIFTR: XCHG
        MOV_A,E
        ANI     31
        RZ      \ RETURN IF SHIFT BY 0
        MOV_D,A
        CPI     8
        JZ      SHIFTR3
        ORA_H 
        JM      SHIFTR1
SHIFTR0:
        XRA_A
        MOV_A,H
        RAR
        MOV_H,A
        MOV_A,L
        RAR
        MOV_L,A
        DCR_D
        JNZ     SHIFTR0
        RET
SHIFTR1:
        STC
        MOV_A,H
        RAR
        MOV_H,A
        MOV_A,L
        RAR
        MOV_L,A
        DCR_D
        JNZ     SHIFTR1
        RET
SHIFTR3:
        \ SPECIAL CASE - SHIFT BY 8
        MOV_L,H
        ORA_H
        JM      SHIFTR4
        MVI_H,  0
        RET
SHIFTR4:
        MVI_H,  #FF
        RET
Я просто пользуюсь тем фактом, что на момент проверки на знак в аккумуляторе сидит число от 0 до 31 у которого старший бит заведомо ноль т.е. я делаю ИЛИ с регистром H и получаю в старшем бите аккумулятора знак числа - переход при этом делается через JM (переход если минус) и из-за того что переход не по C перестал работать укорачивающий трюк при первом проходе для отрицательных чисел - поэтому теперь номера для положительных и отрицательных абсолютно одинаковые (как я уже выше написал):

Screenshot from 2024-07-23 18-53-22.png
Screenshot from 2024-07-23 18-53-22.png (156.65 KiB) Viewed 1244 times

По числам по идее надо вычесть длительность команды-маркера MOV_A,A (-5 тактов) и добавить длительность команды POP_D, которая стоит перед вызовом этой подпрограммы в реальном сгенерированном коде, чтобы вытащить один из аргументов из стека (+10 тактов) - получается сдвиг на 0 бит занимает 49-5+10=54 такта (и влево, и вправо), сдвиг на 8 бит влево - 87 тактов, на 8 бит вправо - 106 тактов, а длительность всех остальных сдвигов от 1 до 31 вычисляются по формулам:
  • сдвиг влево: 75+N*25 тактов
  • сдвиг вправо: 94+N*47 тактов
Текст тестовой программки:

 TEST1.A

Code: Select all

@WORD = #1234

     XRA_A
LOOP:
     MOV_L,A
     MVI_H, 0
     LXI_D, @WORD
     PUSH_PSW
     MOV_A,A
     CALL SHIFTL
     MOV_A,A
     SHLD RES1

     POP_PSW
     MOV_L,A
     MVI_H, 0
     LXI_D, @WORD
     PUSH_PSW
     MOV_A,A
     CALL CCASL_
     MOV_A,A
     SHLD RES2

     MOV_L,A
     MVI_H, 0
     LXI_D, @WORD
     PUSH_PSW
     MOV_B,B
     CALL SHIFTR
     MOV_B,B
     SHLD RES3

     POP_PSW
     MOV_L,A
     MVI_H, 0
     LXI_D, @WORD
     PUSH_PSW
     MOV_B,B
     CALL CCASR_
     MOV_B,B
     SHLD RES4

     LXI_D, @WORD
     MOV_A,D
     CMA
     MOV_D,A
     MOV_A,E
     CMA
     MOV_E,A
     POP_PSW
     PUSH_D

     MOV_L,A
     MVI_H, 0
     PUSH_PSW
     MOV_C,C
     CALL SHIFTR
     MOV_C,C
     SHLD RES5

     POP_PSW
     MOV_L,A
     MVI_H, 0
     POP_D
     PUSH_PSW
     MOV_C,C
     CALL CCASR_
     MOV_C,C
     SHLD RES6

     LXI_H, STR1
     CALL #F818
     POP_PSW
     PUSH_PSW
     CALL #F815
     LHLD RES1
     CALL PRINTHL
     LHLD RES2
     CALL PRINTHL
     LHLD RES3
     CALL PRINTHL
     LHLD RES4
     CALL PRINTHL
     LHLD RES5
     CALL PRINTHL
     LHLD RES6
     CALL PRINTHL
     LXI_H, STRN
     CALL #F818

     POP_PSW
     INR_A
     CPI 33
     JNZ LOOP

     HLT

PRINTHL:
     PUSH_H
     MVI_C, 32
     CALL #F809
     MVI_C, '#'
     CALL #F809
     POP_H
     PUSH_H
     MOV_A,H
     CALL #F815
     POP_H
     MOV_A,L
     CALL #F815
     RET

\ SHIFT DE LEFT BY L&31 AND RETURN IN HL
SHIFTL: XCHG
        MOV_A,E
        ANI     31
        RZ      \ RETURN IF SHIFT BY 0
        CPI     8
        JNZ     SHIFTL1
        \ SPECIAL CASE - SHIFT BY 8
        MOV_H,L
        MVI_L,  0
        RET
SHIFTL1:
        DAD_H
        DCR_A
        JNZ     SHIFTL1
        RET

\ SHIFT DE RIGHT (ARITHMETICALLY) BY L&31 AND RETURN IN HL
SHIFTR: XCHG
        MOV_A,E
        ANI     31
        RZ      \ RETURN IF SHIFT BY 0
        MOV_D,A
        CPI     8
        JZ      SHIFTR3
        ORA_H
        JM      SHIFTR1
SHIFTR0:
        XRA_A
        MOV_A,H
        RAR
        MOV_H,A
        MOV_A,L
        RAR
        MOV_L,A
        DCR_D
        JNZ     SHIFTR0
        RET
SHIFTR1:
        STC
        MOV_A,H
        RAR
        MOV_H,A
        MOV_A,L
        RAR
        MOV_L,A
        DCR_D
        JNZ     SHIFTR1
        RET
SHIFTR3:
        \ SPECIAL CASE - SHIFT BY 8
        MOV_L,H
        ORA_H
        JM      SHIFTR4
        MVI_H,  0
        RET
SHIFTR4:
        MVI_H,  #FF
        RET

RES1 DW 0
RES2 DW 0
RES3 DW 0
RES4 DW 0
RES5 DW 0
RES6 DW 0

STRN DB #0D,#0A,'.',#0D,#0A,'.',#0D,#0A,0
STR1 DB #1F,"#1234>>#"

Новый выхлоп эмулятора с замером тактов и вычисленными значениями для N от 0 до 32:

 TEST1.OUT

Code: Select all

{pseudo-86rk:v0.3}
radio-86rk
-->{a-event:0::::}
{a-event:49::::}
{a-event:64::::}
{a-event:42::::}
{b-event:54:0:::}
{b-event:103:49:::}
{b-event:167:64:::}
{b-event:209:42:::}
{c-event:312:103:0::}
{c-event:361:152:49::}
{c-event:425:216:64::}
{c-event:467:258:42::}

#1234>>#00 #1234 #1234 #1234 #1234 #EDCB #EDCB
.
.{a-event:146598:146389:146131::}
{a-event:95:146484:146226::}
{a-event:64:146548:146290::}
{a-event:72:146620:146362::}
{b-event:54:146674:146416::}
{b-event:190:136:146552::}
{b-event:254:64:146616::}
{b-event:353:99:146715::}
{c-event:456:103:146818::}
{c-event:592:239:136::}
{c-event:656:303:64::}
{c-event:755:402:99::}

#1234>>#01 #2468 #2468 #091A #091A #F6E5 #F6E5
.
.{a-event:146861:146508:146106::}
{a-event:120:146628:146226::}
{a-event:64:146692:146290::}
{a-event:102:146794:146392::}
{b-event:54:146848:146446::}
{b-event:237:183:146629::}
{b-event:301:64:146693::}
{b-event:457:156:146849::}
{c-event:560:103:146952::}
{c-event:743:286:183::}
{c-event:807:350:64::}
{c-event:963:506:156::}

#1234>>#02 #48D0 #48D0 #048D #048D #FB72 #FB72
.
.{a-event:147083:146626:146120::}
{a-event:145:146771:146265::}
{a-event:64:146835:146329::}
{a-event:132:146967:146461::}
{b-event:54:147021:146515::}
{b-event:284:230:146745::}
{b-event:348:64:146809::}
{b-event:561:213:147022::}
{c-event:664:103:147125::}
{c-event:894:333:230::}
{c-event:958:397:64::}
{c-event:1171:610:213::}

#1234>>#03 #91A0 #91A0 #0246 #0246 #FDB9 #FDB9
.
.{a-event:147291:146730:146120::}
{a-event:170:146900:146290::}
{a-event:64:146964:146354::}
{a-event:162:147126:146516::}
{b-event:54:147180:146570::}
{b-event:331:277:146847::}
{b-event:395:64:146911::}
{b-event:665:270:147181::}
{c-event:768:103:147284::}
{c-event:1045:380:277::}
{c-event:1109:444:64::}
{c-event:1379:714:270::}

#1234>>#04 #2340 #2340 #0123 #0123 #FEDC #FEDC
.
.{a-event:147510:146845:146131::}
{a-event:195:147040:146326::}
{a-event:64:147104:146390::}
{a-event:192:147296:146582::}
{b-event:54:147350:146636::}
{b-event:378:324:146960::}
{b-event:442:64:147024::}
{b-event:769:327:147351::}
{c-event:872:103:147454::}
{c-event:1196:427:324::}
{c-event:1260:491:64::}
{c-event:1587:818:327::}

#1234>>#05 #4680 #4680 #0091 #0091 #FF6E #FF6E
.
.{a-event:147693:146924:146106::}
{a-event:220:147144:146326::}
{a-event:64:147208:146390::}
{a-event:222:147430:146612::}
{b-event:54:147484:146666::}
{b-event:425:371:147037::}
{b-event:489:64:147101::}
{b-event:873:384:147485::}
{c-event:976:103:147588::}
{c-event:1347:474:371::}
{c-event:1411:538:64::}
{c-event:1795:922:384::}

#1234>>#06 #8D00 #8D00 #0048 #0048 #FFB7 #FFB7
.
.{a-event:147915:147042:146120::}
{a-event:245:147287:146365::}
{a-event:64:147351:146429::}
{a-event:252:147603:146681::}
{b-event:54:147657:146735::}
{b-event:472:418:147153::}
{b-event:536:64:147217::}
{b-event:977:441:147658::}
{c-event:1080:103:147761::}
{c-event:1498:521:418::}
{c-event:1562:585:64::}
{c-event:2003:1026:441::}

#1234>>#07 #1A00 #1A00 #0024 #0024 #FFDB #FFDB
.
.{a-event:148137:147160:146134::}
{a-event:82:147242:146216::}
{a-event:64:147306:146280::}
{a-event:282:147588:146562::}
{b-event:54:147642:146616::}
{b-event:155:101:146717::}
{b-event:219:64:146781::}
{b-event:717:498:147279::}
{c-event:820:103:147382::}
{c-event:921:204:101::}
{c-event:985:268:64::}
{c-event:1483:766:498::}

#1234>>#08 #3400 #3400 #0012 #0012 #FFED #FFED
.
.{a-event:147603:146886:146120::}
{a-event:295:147181:146415::}
{a-event:64:147245:146479::}
{a-event:312:147557:146791::}
{b-event:54:147611:146845::}
{b-event:566:512:147357::}
{b-event:630:64:147421::}
{b-event:1185:555:147976::}
{c-event:1288:103:148079::}
{c-event:1800:615:512::}
{c-event:1864:679:64::}
{c-event:2419:1234:555::}

#1234>>#09 #6800 #6800 #0009 #0009 #FFF6 #FFF6
.
.{a-event:148536:147351:146117::}
{a-event:320:147671:146437::}
{a-event:64:147735:146501::}
{a-event:342:148077:146843::}
{b-event:54:148131:146897::}
{b-event:613:559:147456::}
{b-event:677:64:147520::}
{b-event:1289:612:148132::}
{c-event:1392:103:148235::}
{c-event:1951:662:559::}
{c-event:2015:726:64::}
{c-event:2627:1338:612::}

#1234>>#0A #D000 #D000 #0004 #0004 #FFFB #FFFB
.
.{a-event:148768:147479:146141::}
{a-event:345:147824:146486::}
{a-event:64:147888:146550::}
{a-event:372:148260:146922::}
{b-event:54:148314:146976::}
{b-event:660:606:147582::}
{b-event:724:64:147646::}
{b-event:1393:669:148315::}
{c-event:1496:103:148418::}
{c-event:2102:709:606::}
{c-event:2166:773:64::}
{c-event:2835:1442:669::}

#1234>>#0B #A000 #A000 #0002 #0002 #FFFD #FFFD
.
.{a-event:148976:147583:146141::}
{a-event:370:147953:146511::}
{a-event:64:148017:146575::}
{a-event:402:148419:146977::}
{b-event:54:148473:147031::}
{b-event:707:653:147684::}
{b-event:771:64:147748::}
{b-event:1497:726:148474::}
{c-event:1600:103:148577::}
{c-event:2253:756:653::}
{c-event:2317:820:64::}
{c-event:3043:1546:726::}

#1234>>#0C #4000 #4000 #0001 #0001 #FFFE #FFFE
.
.{a-event:149170:147673:146127::}
{a-event:395:148068:146522::}
{a-event:64:148132:146586::}
{a-event:432:148564:147018::}
{b-event:54:148618:147072::}
{b-event:754:700:147772::}
{b-event:818:64:147836::}
{b-event:1601:783:148619::}
{c-event:1704:103:148722::}
{c-event:2404:803:700::}
{c-event:2468:867:64::}
{c-event:3251:1650:783::}

#1234>>#0D #8000 #8000 #0000 #0000 #FFFF #FFFF
.
.{a-event:149378:147777:146127::}
{a-event:420:148197:146547::}
{a-event:64:148261:146611::}
{a-event:462:148723:147073::}
{b-event:54:148777:147127::}
{b-event:801:747:147874::}
{b-event:865:64:147938::}
{b-event:1705:840:148778::}
{c-event:1808:103:148881::}
{c-event:2555:850:747::}
{c-event:2619:914:64::}
{c-event:3459:1754:840::}

#1234>>#0E #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:149597:147892:146138::}
{a-event:445:148337:146583::}
{a-event:64:148401:146647::}
{a-event:492:148893:147139::}
{b-event:54:148947:147193::}
{b-event:848:794:147987::}
{b-event:912:64:148051::}
{b-event:1809:897:148948::}
{c-event:1912:103:149051::}
{c-event:2706:897:794::}
{c-event:2770:961:64::}
{c-event:3667:1858:897::}

#1234>>#0F #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:149794:147985:146127::}
{a-event:470:148455:146597::}
{a-event:64:148519:146661::}
{a-event:522:149041:147183::}
{b-event:54:149095:147237::}
{b-event:895:841:148078::}
{b-event:959:64:148142::}
{b-event:1913:954:149096::}
{c-event:2016:103:149199::}
{c-event:2857:944:841::}
{c-event:2921:1008:64::}
{c-event:3875:1962:954::}

#1234>>#10 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:149995:148082:146120::}
{a-event:495:148577:146615::}
{a-event:64:148641:146679::}
{a-event:552:149193:147231::}
{b-event:54:149247:147285::}
{b-event:942:888:148173::}
{b-event:1006:64:148237::}
{b-event:2017:1011:149248::}
{c-event:2120:103:149351::}
{c-event:3008:991:888::}
{c-event:3072:1055:64::}
{c-event:4083:2066:1011::}

#1234>>#11 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150203:148186:146120::}
{a-event:520:148706:146640::}
{a-event:64:148770:146704::}
{a-event:582:149352:147286::}
{b-event:54:149406:147340::}
{b-event:989:935:148275::}
{b-event:1053:64:148339::}
{b-event:2121:1068:149407::}
{c-event:2224:103:149510::}
{c-event:3159:1038:935::}
{c-event:3223:1102:64::}
{c-event:4291:2170:1068::}

#1234>>#12 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150422:148301:146131::}
{a-event:545:148846:146676::}
{a-event:64:148910:146740::}
{a-event:612:149522:147352::}
{b-event:54:149576:147406::}
{b-event:1036:982:148388::}
{b-event:1100:64:148452::}
{b-event:2225:1125:149577::}
{c-event:2328:103:149680::}
{c-event:3310:1085:982::}
{c-event:3374:1149:64::}
{c-event:4499:2274:1125::}

#1234>>#13 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150619:148394:146120::}
{a-event:570:148964:146690::}
{a-event:64:149028:146754::}
{a-event:642:149670:147396::}
{b-event:54:149724:147450::}
{b-event:1083:1029:148479::}
{b-event:1147:64:148543::}
{b-event:2329:1182:149725::}
{c-event:2432:103:149828::}
{c-event:3461:1132:1029::}
{c-event:3525:1196:64::}
{c-event:4707:2378:1182::}

#1234>>#14 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:150827:148498:146120::}
{a-event:595:149093:146715::}
{a-event:64:149157:146779::}
{a-event:672:149829:147451::}
{b-event:54:149883:147505::}
{b-event:1130:1076:148581::}
{b-event:1194:64:148645::}
{b-event:2433:1239:149884::}
{c-event:2536:103:149987::}
{c-event:3612:1179:1076::}
{c-event:3676:1243:64::}
{c-event:4915:2482:1239::}

#1234>>#15 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151035:148602:146120::}
{a-event:620:149222:146740::}
{a-event:64:149286:146804::}
{a-event:702:149988:147506::}
{b-event:54:150042:147560::}
{b-event:1177:1123:148683::}
{b-event:1241:64:148747::}
{b-event:2537:1296:150043::}
{c-event:2640:103:150146::}
{c-event:3763:1226:1123::}
{c-event:3827:1290:64::}
{c-event:5123:2586:1296::}

#1234>>#16 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151243:148706:146120::}
{a-event:645:149351:146765::}
{a-event:64:149415:146829::}
{a-event:732:150147:147561::}
{b-event:54:150201:147615::}
{b-event:1224:1170:148785::}
{b-event:1288:64:148849::}
{b-event:2641:1353:150202::}
{c-event:2744:103:150305::}
{c-event:3914:1273:1170::}
{c-event:3978:1337:64::}
{c-event:5331:2690:1353::}

#1234>>#17 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151462:148821:146131::}
{a-event:670:149491:146801::}
{a-event:64:149555:146865::}
{a-event:762:150317:147627::}
{b-event:54:150371:147681::}
{b-event:1271:1217:148898::}
{b-event:1335:64:148962::}
{b-event:2745:1410:150372::}
{c-event:2848:103:150475::}
{c-event:4065:1320:1217::}
{c-event:4129:1384:64::}
{c-event:5539:2794:1410::}

#1234>>#18 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151659:148914:146120::}
{a-event:695:149609:146815::}
{a-event:64:149673:146879::}
{a-event:792:150465:147671::}
{b-event:54:150519:147725::}
{b-event:1318:1264:148989::}
{b-event:1382:64:149053::}
{b-event:2849:1467:150520::}
{c-event:2952:103:150623::}
{c-event:4216:1367:1264::}
{c-event:4280:1431:64::}
{c-event:5747:2898:1467::}

#1234>>#19 #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:151867:149018:146120::}
{a-event:720:149738:146840::}
{a-event:64:149802:146904::}
{a-event:822:150624:147726::}
{b-event:54:150678:147780::}
{b-event:1365:1311:149091::}
{b-event:1429:64:149155::}
{b-event:2953:1524:150679::}
{c-event:3056:103:150782::}
{c-event:4367:1414:1311::}
{c-event:4431:1478:64::}
{c-event:5955:3002:1524::}

#1234>>#1A #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152082:149129:146127::}
{a-event:745:149874:146872::}
{a-event:64:149938:146936::}
{a-event:852:150790:147788::}
{b-event:54:150844:147842::}
{b-event:1412:1358:149200::}
{b-event:1476:64:149264::}
{b-event:3057:1581:150845::}
{c-event:3160:103:150948::}
{c-event:4518:1461:1358::}
{c-event:4582:1525:64::}
{c-event:6163:3106:1581::}

#1234>>#1B #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152290:149233:146127::}
{a-event:770:150003:146897::}
{a-event:64:150067:146961::}
{a-event:882:150949:147843::}
{b-event:54:151003:147897::}
{b-event:1459:1405:149302::}
{b-event:1523:64:149366::}
{b-event:3161:1638:151004::}
{c-event:3264:103:151107::}
{c-event:4669:1508:1405::}
{c-event:4733:1572:64::}
{c-event:6371:3210:1638::}

#1234>>#1C #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152509:149348:146138::}
{a-event:795:150143:146933::}
{a-event:64:150207:146997::}
{a-event:912:151119:147909::}
{b-event:54:151173:147963::}
{b-event:1506:1452:149415::}
{b-event:1570:64:149479::}
{b-event:3265:1695:151174::}
{c-event:3368:103:151277::}
{c-event:4820:1555:1452::}
{c-event:4884:1619:64::}
{c-event:6579:3314:1695::}

#1234>>#1D #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152706:149441:146127::}
{a-event:820:150261:146947::}
{a-event:64:150325:147011::}
{a-event:942:151267:147953::}
{b-event:54:151321:148007::}
{b-event:1553:1499:149506::}
{b-event:1617:64:149570::}
{b-event:3369:1752:151322::}
{c-event:3472:103:151425::}
{c-event:4971:1602:1499::}
{c-event:5035:1666:64::}
{c-event:6787:3418:1752::}

#1234>>#1E #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:152914:149545:146127::}
{a-event:845:150390:146972::}
{a-event:64:150454:147036::}
{a-event:972:151426:148008::}
{b-event:54:151480:148062::}
{b-event:1600:1546:149608::}
{b-event:1664:64:149672::}
{b-event:3473:1809:151481::}
{c-event:3576:103:151584::}
{c-event:5122:1649:1546::}
{c-event:5186:1713:64::}
{c-event:6995:3522:1809::}

#1234>>#1F #0000 #0000 #0000 #0000 #FFFF #FFFF
.
.{a-event:153122:149649:146127::}
{a-event:49:149698:146176::}
{a-event:64:149762:146240::}
{a-event:1002:150764:147242::}
{b-event:54:150818:147296::}
{b-event:103:49:147345::}
{b-event:167:64:147409::}
{b-event:2033:1866:149275::}
{c-event:2136:103:149378::}
{c-event:2185:152:49::}
{c-event:2249:216:64::}
{c-event:4115:2082:1866::}

#1234>>#20 #1234 #0000 #1234 #0000 #EDCB #FFFF
.
.{halt}
{from-last-a:150215}
{from-last-b:148182}
{from-last-c:146100}
{bye}

Обновлённый эксель:
Attachments

shifts.xls
(12 KiB) Downloaded 47 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

На самом деле сдвиги от 16 до 31 бесполезны - там результат заведомо известен (#0000 или #FFFF).
От 9 до 15 тоже можно ускорить прикладывая к оставшемуся байту - должно быть быстрее,
но дополнительные проверки могут ещё сильнее замедлить сдвиги на небольшое количество бит...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

Исправил косяк в !=

Code: Select all

// 0x91 // !=  A,B -> A!=B
*EXPR 0x91
#genlab %l1
#genlab %l2
        POP_D
        MOV_A,H
        CMP_D
        JNZ     %l1
        MOV_A,L
        SUB_E
        JZ      %l2
%l1
        MVI_A,  #FF
%l2
        MOV_H,A
        MOV_L,A
*
поставив SUB вместо второго CMP, чтобы регистр A обнулился, если половинки равны, а то у меня если сравнивать одинаковые ненулевые числа меньше 256, то подпрограмма ошибочно считала, что они неравны...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by shiny »

Это код для 16бит?
А он прокатит в случае A>0,B<0(не регистры, а переменные)?
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

shiny wrote:Это код для 16бит?
А он прокатит в случае A>0,B<0(не регистры, а переменные)?
Да - сравниваются HL и взятый со стека DE
Если старшие байты не равны, то оно сразу на %l1 уйдёт - после первого CMP
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by shiny »

А, это сравнение, не определил спросонья(:
Я как-то раз бился с кодом и подсмотрел у HitechC:

Code: Select all

main()
{
	int xm=-127;
	int ym=96;

	if (xm>ym) xm=-xm;

}
вышло

Code: Select all

loc_80F7:				; CODE XREF: sub_80F4+46j
		ld	(ix+0FEh), 81h ; 'Ѓ'
		ld	(ix+0FFh), 0FFh	; xm=-127
		ld	(ix+0FCh), 60h ; '`'
		ld	(ix+0FDh), 0	; ym=96
		ld	e, (ix+0FEh)
		ld	d, (ix+0FFh)
		ld	l, (ix+0FCh)
		ld	h, (ix+0FDh)
		call	sub_813D	; if (xm>ym) xm=-xm;
		jp	p, loc_812B
		ld	e, (ix+0FEh)	; xm=-xm
		ld	d, (ix+0FFh)
		ld	hl, 0
		or	a
		sbc	hl, de
		ld	(ix+0FEh), l
		ld	(ix+0FFh), h

loc_812B:				; CODE XREF: sub_80F4+22j
		ld	sp, ix
		pop	ix
		ret
; ---------------------------------------------------------------------------

loc_8130:				; CODE XREF: sub_80F4j
		push	ix
		ld	ix, 0
		add	ix, sp
		push	bc
		push	bc
		jp	loc_80F7
; End of function sub_80F4


; =============== S U B	R O U T	I N E =======================================


sub_813D:				; CODE XREF: sub_80F4+1Fp
		ld	a, h
		xor	d
		jp	m, loc_8145
		sbc	hl, de
		ret
; ---------------------------------------------------------------------------

loc_8145:				; CODE XREF: sub_813D+2j
		ld	a, h
		and	80h ; 'Ђ'
		sbc	hl, de
		inc	a
		ret

User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

вот тоже самое у меня :)

Code: Select all

robot "Test0"
author "Shaos"
main()
{
   xm=-127;
   ym=96;

   if(xm>ym) xm=-xm;
}
после препроцессора:

Code: Select all

ROBOT "Test0"
AUTHOR "Shaos"
START:
XM=-127
YM=96
(XM>YM);IFN L _l1;XM=-XM
_l1: RET
__END: END
скомпилированное в байткод RobbyVM:

Code: Select all

// Generated by ROBBYC version 2.3.2
// Alexander "Shaos" Shabarshin <me@shaos.net>

>>>>(1) robot "Test0"
>>>>(2) author "Shaos"

// HEADER OF THE ROBOT

// Robot 'Test0'
// 2 variables
// 49 bytes of code
// 0 bytes of image

02 77 18 20 00 05 54 65 73 74 30 00 02 00 31 00 |.w. ..Test0...1.
FF FF FF 00 00 00 00 00 53 68 61 6F 73 00 00 00 |........Shaos...

// CODE OF THE ROBOT

>>>>(3) main()
MAIN.R(3) START:

>>>>(4) {
>>>>(5)    xm=-127;
MAIN.R(5) XM=-127
0000 20 
0001 01 
0002 00 
0003 00 
0004 00 
0005 81 
0006 FF 

>>>>(6)    ym=96;
MAIN.R(6) YM=96
0007 20 
0008 01 
0009 01 
000A 00 
000B 00 
000C 60 
000D 00 

>>>>(7) 
>>>>(8)    if(xm>ym) xm=-xm;
MAIN.R(8) (XM>YM);IFN L _l1;XM=-XM
000E 40 
000F 0D 
0010 F5 REG L
0011 0E 
0012 FF 
0013 F5 PUSH 0
0014 00 
0015 00 
0016 F3 LOAD
0017 F5 PUSH 1
0018 01 
0019 00 
001A F3 LOAD
001B 92 >
001C F4 SAVE
001D 42 
001E 01 
001F 0E 
0020 FF 
0021 00 
0022 2F 
0023 00 
0024 40 
0025 09 
0026 F5 PUSH 0
0027 00 
0028 00 
0029 F5 PUSH 0
002A 00 
002B 00 
002C F3 LOAD
002D E0 (-)
002E F4 SAVE

>>>>(9) }
MAIN.R(9) _l1: RET
002F 33 
MAIN.R(0) __END: END
0030 FF 
оттранслируется в ассемблер i8080:

Code: Select all

\ Generated by ROBBYCC v2.0.2 (Jul 18 2024)
\ Part of nedoPC SDK, see http://www.nedopc.org/nedopc/SDK

        ORG     0
@CODE   EQU     0
@BASE   EQU     1024
@REGS   EQU     #0444
@REG_X  EQU     #0444
@REG_Y  EQU     #0446
\REG_D
@REG_N  EQU     #044A
\REG_K
@REG_R  EQU     #044E
@REG_T  EQU     #0450
\REG_E
\REG_M
\REG_I
@REG_A  EQU     #0458
@REG_B  EQU     #045A
@REG_C  EQU     #045C
\REG_P
@REG_L  EQU     #0460
\REG_S
@RAND   EQU     0
        JMP     STARTUP
        \ DATA
_B_OPTS DB  0
_L_FONT DW  0
_L_SIZE DW  0
_L_CODE DW  @CODE
_L_BASE DW  @BASE
_L_REGS DW  @REGS
_L_OSTK DW  0
        DB  "[NEDOPC SDK BIN]"
PROCSYS DB  16 DUP(0) \ PROCESSOR/SYSTEM ID
TILES:
        \ TODO: move tiles here
CHX     DB  0
CHY     DB  0
CHS     DB  4
CHB     DB  0
_NPLANE DW  0
_ANGLE  DB  0
_COLOR  DB  0
_CURX   DB  0
_CURY   DB  0
_SAYX   DB  0
_SAYY   DB  0
_SAYC   DB  0
_ATRS   DB  0
        \ CODE
STARTUP:
        \ INIT SYSTEM
        CALL    INIT
        \ COMMON INIT
        CALL    _STD_INIT
        \ SAVE OLD SP
        LXI_H,  0
        DAD_SP
        SHLD    _L_OSTK
        \ SET NEW SP
        LHLD    _L_REGS
        SPHL
        \ EXECUTE CODE
        CALL    _START
        \ RESTORE OLD SP
        LHLD    _L_OSTK
        SPHL
        RET
_START:
\ *0x20 %a1 %m2
_j0000:
        LHLD    _L_BASE
        LXI_D,  #0000
        DAD_D
        DAD_D
        PUSH_H
        LXI_H,  #FF81
        POP_D
        XCHG
        MOV_M,E
        INX_H
        MOV_M,D
\ *0x20 %a1 %m2
_j0007:
        LHLD    _L_BASE
        LXI_D,  #0001
        DAD_D
        DAD_D
        PUSH_H
        LXI_H,  #0060
        POP_D
        XCHG
        MOV_M,E
        INX_H
        MOV_M,D
\ *0x40
_j000E:
\ 0xF5
        PUSH_H
        LXI_H,  #FF0E
\ 0xF5
        PUSH_H
        LXI_H,  #0000
\ 0xF3
        MVI_A,  #FF
        CMP_H
        JNZ     _l0001
        \ REGISTER
        CALL    _R_GET
        JMP     _l0002
_l0001:
        \ VARIABLE
        CALL    _B_GET
_l0002:
\ 0xF5
        PUSH_H
        LXI_H,  #0001
\ 0xF3
        MVI_A,  #FF
        CMP_H
        JNZ     _l0003
        \ REGISTER
        CALL    _R_GET
        JMP     _l0004
_l0003:
        \ VARIABLE
        CALL    _B_GET
_l0004:
\ 0x92
        POP_D
        MOV_A,E
        SUB_L
        MOV_L,A
        MOV_A,D
        SBB_H
        MOV_H,A
        ORA_L
        JZ      _l0006
        MOV_A,H
        ANA_A
        JM      _l0005
        LXI_H,  #FFFF
        JMP     _l0006
_l0005:
        LXI_H,  0
_l0006:
\ 0xF4
        POP_D
        XCHG
        MVI_A,  #FF
        CMP_H
        JNZ     _l0007
        \ REGISTER
        CALL    _R_SET
        JMP     _l0008
_l0007:
        \ VARIABLE
        CALL    _B_SET
_l0008:
        POP_H
\ *0x42 0x01 0x0E 0xFF 0x00 %w1
_j001D:
        LHLD @REG_L
        MOV_A,H
        ORA_L
        JZ _j002F
\ *0x40
_j0024:
\ 0xF5
        PUSH_H
        LXI_H,  #0000
\ 0xF5
        PUSH_H
        LXI_H,  #0000
\ 0xF3
        MVI_A,  #FF
        CMP_H
        JNZ     _l0009
        \ REGISTER
        CALL    _R_GET
        JMP     _l0010
_l0009:
        \ VARIABLE
        CALL    _B_GET
_l0010:
\ 0xE0
        MOV_A,H
        CMA
        MOV_H,A
        MOV_A,L
        CMA
        MOV_L,A
        INX_H
\ 0xF4
        POP_D
        XCHG
        MVI_A,  #FF
        CMP_H
        JNZ     _l0011
        \ REGISTER
        CALL    _R_SET
        JMP     _l0012
_l0011:
        \ VARIABLE
        CALL    _B_SET
_l0012:
        POP_H
\ *0x33
_j002F:
        RET
\ *0xFF
_j0030:

+/home/shaos/src/SDK-work/LIB/I8080/_STD
+/home/shaos/src/SDK-work/LIB/I8080/NULL
+/home/shaos/src/SDK-work/LIB/I8080/_CLIB
+/home/shaos/src/SDK-work/LIB/I8080/_VARS
+/home/shaos/src/SDK-work/LIB/I8080/NULL_
надо подумать как к переменным побыстрее обращаться...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by shiny »

Аж голове больно (: Что-то я не врублюсь - тут сравнение на равенство?
User avatar
Shaos
Admin
Posts: 24020
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by Shaos »

У меня так:

Code: Select all

        POP_D
        MOV_A,E
        SUB_L
        MOV_L,A
        MOV_A,D
        SBB_H
        MOV_H,A
        ORA_L
        JZ      _l0006
        MOV_A,H
        ANA_A
        JM      _l0005
        LXI_H,  #FFFF
        JMP     _l0006
_l0005:
        LXI_H,  0
_l0006:
Сначала вычитаем HL (второй аргумент) из DE (первый аргумент вынутый из стека), потом сравниваем с нулём - если равно, то ответ 0, а если неравно, то проверяем знак старшего байта результата вычитания - если минус, то ответ 0, а если плюс, то ответ -1 (TRUE)

P.S. В варианте для Z80 побайтное вычитание заменится на

Code: Select all

      or   a
      sbc   hl, de
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

Re: [SDK] Новая математика для кросс-компилятора в 8080/z80

Post by shiny »

Кстати, а в библиотеке не завалялось byte reverse? Просто взглянуть
Post Reply