Forum > Russian
Баги CYBERGRAPHICS AmigaOS 4.1
Smalovsky:
Попробовал использовать библиотеку сайберграфикс для FreePascal 3.2.2 for AmigaOS 4.1 PPC. У меня эмулятор амиги 4000 WinUAE с эмуляцией видеокарты Picasso4 на шине Zorro3 и ускорителя Cyberstorm с 126 МБ fast RAM и процессором 604e.
Я попробовал узнать характеристики видеорежимов с помощью листинга:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---Program CGX_Test;uses exec, sysutils, utility, intuition,agraphics,cybergraphics;var execlist:PList; cybernode:PCyberModeNode; begin execlist:=AllocCModeListTagList(nil); if execlist <> nil then writeln('cyber'); cybernode:=PCyberModeNode(execlist^.lh_Head); while cybernode<>nil do begin writeln('Mode ',cybernode^.ModeText); writeln('Width ',cybernode^.Width); writeln('Height ',cybernode^.Height); writeln('Depth ',cybernode^.Depth); writeln(); cybernode:=PCyberModeNode(cybernode^.Node.ln_Succ); end; end.
Информация о видеорежимах содержит ошибки. Значения высоты, ширины, глубины цвета и другие поля перепутаны в записи типа TCyberModeNode.
Сделал небольшую коррекцию через указатель:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---Program CGX_Test;uses exec, sysutils, utility, intuition,agraphics,cybergraphics;var execlist:PList; cybernode:PCyberModeNode; p:^Word; begin execlist:=AllocCModeListTagList(nil); if execlist <> nil then writeln('cyber'); cybernode:=PCyberModeNode(execlist^.lh_Head); while cybernode<>nil do begin writeln('Mode ',cybernode^.ModeText); p:=@cybernode^.Width; writeln('Width ',(p-1)^); // writeln('Width ',cybernode^.Width); p:=@cybernode^.Height; writeln('Height ',(p-1)^); //writeln('Height ',cybernode^.Height); p:=@cybernode^.Depth; writeln('Depth ',(p-1)^); //writeln('Depth ',cybernode^.Depth); writeln(); cybernode:=PCyberModeNode(cybernode^.Node.ln_Succ); end;
Теперь вывело правильно ширину, высоту и глубину для видеорежимов. Другие поля я не трогал, но в них тоже напутано.
Как и кому отправить мне этот баг?
Сам баг:
Неправильное выполнение функции AllocCModeListTagList. Функция возвращает список, элементы которого при приведении к типу указателя PCyberModeNode и получении записи типа TCyberModeNode по этому указателю содержат неправильные значения( значения перепутаны для полей записи).
AlexTP:
исправьте заголовок поста. там опечатка в названии.
так как либа из поставки FPC, то отправлять это надо на FPC bugtracker, вот сюда
https://gitlab.com/freepascal.org/fpc/source/-/issues
нужен акаунт Гитхаб или Гитлаб.
нужен пост на английском.
TRon:
If you can wait a day with reporting it as a bug then I can have it verified. I believe you have a mistake in your code.
TRon:
Sorry to say that I have managed to wreck my (custom) fs-uae installation before I was able to verify. Go ahead and report so that it won't be forgotten (I need time to set up fs-uae correctly for OS4 again).
Sorry for the inconvenience.
On a side note: the (original) code as presented should work (it does work for/on Amiga/AROS) but there are some minor nitpicking things such as the fact that the list is not traversed entirely correct (last entry is not a valid mode entry but a list end entry) and you forgot to free the allocated modelist.
At first glance it seems to me that one of the record fields is wrongly aligned (which is an RTL related issue if the case).
Smalovsky:
Мне помогли с переводом. Попробую отослать на багтрейкер. Вот перевод первого сообщения:
Hi,
While using AmigaOS4 PPC OS (on WinUAE emulator emulating Amiga4000 with graphics card for me) and FreePascal 3.2.2 for AmigaOS4.1 i do have a problem when trying to use CyberGraphics library:
Firstly, i tried to get videomode's properties with this kind of code:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---Program CGX_Test;uses exec, sysutils, utility, intuition,agraphics,cybergraphics;var execlist:PList; cybernode:PCyberModeNode; begin execlist:=AllocCModeListTagList(nil); if execlist <> nil then writeln('cyber'); cybernode:=PCyberModeNode(execlist^.lh_Head); while cybernode<>nil do begin writeln('Mode ',cybernode^.ModeText); writeln('Width ',cybernode^.Width); writeln('Height ',cybernode^.Height); writeln('Depth ',cybernode^.Depth); writeln(); cybernode:=PCyberModeNode(cybernode^.Node.ln_Succ); end; end.
But returned information contain bugs. Height, width, depth and other fields just messed around into TCyberModeNode. So i made a small modification via pointer:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---Program CGX_Test;uses exec, sysutils, utility, intuition,agraphics,cybergraphics;var execlist:PList; cybernode:PCyberModeNode; p:^Word; begin execlist:=AllocCModeListTagList(nil); if execlist <> nil then writeln('cyber'); cybernode:=PCyberModeNode(execlist^.lh_Head); while cybernode<>nil do begin writeln('Mode ',cybernode^.ModeText); p:=@cybernode^.Width; writeln('Width ',(p-1)^); // writeln('Width ',cybernode^.Width); p:=@cybernode^.Height; writeln('Height ',(p-1)^); //writeln('Height ',cybernode^.Height); p:=@cybernode^.Depth; writeln('Depth ',(p-1)^); //writeln('Depth ',cybernode^.Depth); writeln(); cybernode:=PCyberModeNode(cybernode^.Node.ln_Succ); end;end.
So then i have correct width, height and depth. Other fields i didn't touch, but they messed too.
To whom i should send a bug report ?
The bug itself are:
Wrong return of the AllocCModeListTagList(): Function return a list, elements of which when casting to a pointer type PCyberModeNode and returning of TCyberModeNode by this pointer contain wrong values (they just messed around in wrong fields).
Navigation
[0] Message Index
[#] Next page