OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 29.03.2024, 18:00

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 44 ]  Přejít na stránku Předchozí  1, 2, 3
Autor Zpráva
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 03.12.2018, 13:44 
Offline
Radil

Registrován: 03.07.2018, 23:06
Příspěvky: 362
Has thanked: 221 times
Been thanked: 253 times
Citace:
Neviem, ako to robil Universum, ale na CP/M sa to bežne robilo tak, že sa program preložil na dva krát od dvoch adries, obvykle vzdialených 0100h, a potom sa tieto dve binárky prehnali cez Program, ktorý hľadal práve tieto rozdiely, kde boli určite absolútne adresy a vytvoril tak relokačnú tabuľku.
Universumova relokačná tabuľka, ak ma pamäť neklame, je akoby "relatívna" a "pakovaná", kde je v tabuľke v jednom "zázname" niekoľko relokačných adries, ktoré sú od seba v rovnakých intervaloch (snáď som to napísal správne).


To je hezká metoda, takto bychom nemuseli o možnost relokace přijít. Zkusím si s tím pohrát.
Jeho relokační tabulka používá relativní odstupy. Pokud je číslo v tabulce větší než 200, je (n-200) délka odstupu a následující byte obsahuje počet opakování.

_________________
Špóngiu navlhčiť


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 03.12.2018, 13:54 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 372 times
Been thanked: 788 times
rombor píše:
Pavel.Krivanek píše:
Docela by mě zajímalo, jakým způsobem tu tabulku pro tak rozsáhlý program zkonstruoval (přepočítávaných míst je asi 1200).
Neviem, ako to robil Universum, ale na CP/M sa to bežne robilo tak, že sa program preložil na dva krát od dvoch adries, obvykle vzdialených 0100h, a potom sa tieto dve binárky prehnali cez Program, ktorý hľadal práve tieto rozdiely, kde boli určite absolútne adresy a vytvoril tak relokačnú tabuľku.
Presne tak, staci program napisat uplne klasicky (s absolutnymi adresami), skompilovat dve verzie na dve rozne adresy, a potom uz len jedna kratka rutinka obe verzie porovna a zapise rozdiely, nuz a druha jednoducha rutinka, ktora bude so zoznamom zistenych rozdielov sucastou vysledneho kodu, len popripocita vhodnu konstantu vsade tam kam ukazuje zoznam rozdielov. A je to :) Vyhodou je, ze po takejto "instalacii" programu mozno rutinku aj so zoznamom rozdielov zahodit, lebo uz nie su potrebne a nimi zabratu pamet uvolnit.

Trosku mimo temu: Ja by som program prelozil na adresu nie vyssiu o #0100, ale napr. o #0201, a vsade kde by bol rozdiel 2, to by bol vyssi bajt, a vsade kde iba 1, to by bol nizsi bajt. Vychytalo by to aj rozne sposoby typu LD H,vyssi_bajt_adresy. Ale si tiez myslim, ze z cisto praktickeho hladiska uplne postaci moznost posuvania programu v pameti po #0100 bajtoch.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 09.12.2018, 23:36 
Offline
Radil

Registrován: 03.07.2018, 23:06
Příspěvky: 362
Has thanked: 221 times
Been thanked: 253 times
Použil jsem data ze stávající rekokační tabulky k tomu, abych opravil nějaká místa v kódu, která před tím nebyla identifikována jako absolutní ukazatele či naopak jako ukazatelé byla identifikována chybně. Nyní jsem schopen pomocí dvojité kompilace s posunutím ORG vygenerovat relokační tabulky (jsou ve skutečnosti dvě) se stejným obsahem jako původní. Takže do budoucna budeme moci modifikovat Promethea při zachování jeho relokačních schopností.

Narazil jsem v jeho kódu na pár zajímavých míst. Třeba nastavení toho, jestli se písmena mají zobrazovat jako malá, velká či nezměněná, se řeší přímou modifikací kódu patřičné rutiny, což je samozřejmě pro běh nejrychlejší způsob. Na patřičné místo se jednoduše vlepí kód pro jednu z následujících možností (každá má 2 byty):

Kód:
caseModificationCodeOptions:
    and 0ffh  ; normal
    or 020h   ; lowercase
    and 0dfh  ; uppercase


Podobně se řeší to, jestli se fonty mají vykreslovat tučně. Nebo když chcete tisknout nějaký řetězec, umístí se literál s jeho obsahem přímo za volání tiskové rutiny (pomocí CALL). Ta si ze zásobníku vyzvedne adresu, která odpovídá začátku řetězce, a po vytištění skočí za jeho konec (JP, nikoliv RET), kde program vesele pokračuje.

_________________
Špóngiu navlhčiť


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 10.12.2018, 22:17 
Offline
Pan Štábní

Registrován: 29.06.2013, 16:52
Příspěvky: 1612
Has thanked: 31 times
Been thanked: 357 times
Ja bych videl radeji Promethea upraveneho, aby pouzival zasobnik jen jako zasobnik, k nicemu jinemu. Tedy aby se nespolehal, ze jsou na zasobniku nejaka predpripravena data. Predpokladam, ze kazdy, kdo Promethea na ZX bude pouzivat, nejspis ho bude nahravat z Divide ci Divmmc (alespon ve vetsine pripadu). A da se logicky predpokladat, ze bude obcas uzivatel z Promika skakat do NMI menu ESXDOSu. A prave pri stisku NMI dochazi k prepsani zasobniku, coz by mohlo zpusobit poskozeni dat programu nebo zdrojaku. Nezkoumal jsem zdrojak a praci se zasobnikem, ale minimalne by stalo za to overit kdy a jak Promik pouziva registr SP. Kdyby nahodou opravdu zasobnik pouzival pro tabulky a podobne finty, u Divide/Divmmc je stale jeste moznost zablokovat docasne funkci tlacitka NMI, ci ho kdykoli podle potreby povolit.

_________________
http://velesoft.speccy.cz/


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 11.12.2018, 01:33 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
VELESOFT píše:
Ja bych videl radeji Promethea upraveneho, aby pouzival zasobnik jen jako zasobnik, k nicemu jinemu.
To si asi zle pochopil, aspoň v tomto prípade sa zásobník používa správne a nehrozí prepis od NMI. Podobne pracuje aj Calculator, za inštrukciou call, alebo rst sú data a tie si obslužná rutina vyberie z návratovej adresy, ktorá je uložená na zásobníku.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 11.12.2018, 11:57 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 372 times
Been thanked: 788 times
Pavel.Krivanek píše:
Nebo když chcete tisknout nějaký řetězec, umístí se literál s jeho obsahem přímo za volání tiskové rutiny (pomocí CALL). Ta si ze zásobníku vyzvedne adresu, která odpovídá začátku řetězce, a po vytištění skočí za jeho konec (JP, nikoliv RET), kde program vesele pokračuje.
VELESOFT píše:
Ja bych videl radeji Promethea upraveneho, aby pouzival zasobnik jen jako zasobnik, k nicemu jinemu. Tedy aby se nespolehal, ze jsou na zasobniku nejaka predpripravena data. ...
Pokial narazas na tie data za CALL, tak ako uz pisal Antony, v tomto pripade to nicomu nevadi a zasobnik sa stale pouziva korektne tak ako ma, takze ani prerusenie nerobi problem. Napriklad ZX romka tiez casto pouziva tuto koncepciu pristupu k datam a cele to v pohode a bez problemov bezi s povolenym prerusenim.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 25.12.2018, 02:50 
Offline
Pan Štábní

Registrován: 29.06.2013, 16:52
Příspěvky: 1612
Has thanked: 31 times
Been thanked: 357 times
Další věcí ke zlepšení by byla obsluha klávesnice. U Promethea to byla někdy dost katastrofa. Kurzory pak sem tam fungují jako čísla bez shiftu a třeba na +2A/+3 to bejvalo peklo. A zrovna při programování by tedy měla klávesnice fungovat spolehlivě a na všem. Takže na romkový test klávesnice bych se vybodnul a použil vlastní.

_________________
http://velesoft.speccy.cz/


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 25.12.2018, 12:13 
Offline
Radil

Registrován: 03.07.2018, 23:06
Příspěvky: 362
Has thanked: 221 times
Been thanked: 253 times
Tipoval bych, že problém s kurzorovými klávesami může být spíše způsoben tím, že si Prometheus naopak většinu věcí ošetřuje po svém. Příslušný kód je zde:
https://github.com/oldcompcz/prometheus ... .asm#L5828

_________________
Špóngiu navlhčiť


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 25.12.2018, 16:25 
Offline
Pan Štábní

Registrován: 29.06.2013, 16:52
Příspěvky: 1612
Has thanked: 31 times
Been thanked: 357 times
Kazdopadne Prometheus vola i romkovou rutinu klavesnice a zx romka ji nema napsanou spolehlive. A nejspis by to chtelo upravit tedy i klavesnicove rutiny Promika.

_________________
http://velesoft.speccy.cz/


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 25.12.2018, 16:34 
Offline
Pan Štábní

Registrován: 29.06.2013, 16:52
Příspěvky: 1612
Has thanked: 31 times
Been thanked: 357 times
Ukladani na kazetu bych rad videl jako dva standartni hlavickove bloky code. Aby ESXDOS mohl ukladat do TAP.

_________________
http://velesoft.speccy.cz/


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 25.12.2018, 22:31 
Offline
Radil

Registrován: 03.07.2018, 23:06
Příspěvky: 362
Has thanked: 221 times
Been thanked: 253 times
Skoro každý u Promethea upravím pár návěští nebo přidám nějaké komentáře, ale je to běh na dlouhou trať. Jeho kód je poměrně křehký a dokud ho ještě důkladněji nezdokumentujeme, jsou jeho úpravy rizikové. Je ovšem příjemné sledovat, jak ten kód dostává postupně smyslf. Jakákoliv pomoc je samozřejmé vítána (je možné posílat pull requesty)

_________________
Špóngiu navlhčiť


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 26.12.2018, 06:36 
Offline
Pan Štábní

Registrován: 29.06.2013, 16:52
Příspěvky: 1612
Has thanked: 31 times
Been thanked: 357 times
A jeste jedna chybka. Kurzor v editoru je vzhledove poskozeny na jinych zx modelech se 128kB protoze Prometheus pro jeho zobrazeni pouziva obast bajtu FF ktera je jen u orig.48 rom.

_________________
http://velesoft.speccy.cz/


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 26.12.2018, 09:32 
Offline
Radil

Registrován: 03.07.2018, 23:06
Příspěvky: 362
Has thanked: 221 times
Been thanked: 253 times
Na +3 se označení nezobrazí vůbec. Prometheus data pro normální znaky bere z ROM, ale pro znak značku bloku prostě použije nižší kód znaku (0x03), který zdrojovou adresu vypočítá do nevyužité oblasti před znakovou sadou, 0x386E až 0x3D00-1 (konkrétně 3C18). Myslel jsem, že označení dělá pomocí nastavení atributů, ale takhle mu to umožňuje udělat rychlý přesun obsahu video RAM při scrollování.

_________________
Špóngiu navlhčiť


Nahoru
 Profil  
 
 Předmět příspěvku: Re: PROMETHEUS - zdrojový kód
PříspěvekNapsal: 31.12.2018, 17:00 
Offline
Radil

Registrován: 03.07.2018, 23:06
Příspěvky: 362
Has thanked: 221 times
Been thanked: 253 times
Další poznámka k Prometheovi. Jeho Monitor má úsporně řešené provázání kódů kláves (či klávesových zkratek) s akcemi, které se při jejich stisknutí mají provést. Používá k tomu tabulku, která obsahuje pro každou položku dva byty. Druhý je kód stisknuté klávesy, první je rozdíl adres dané operace a operace svázané s předcházející klávesou (přičemž adresa první takové operace je známá). To ušetří místo, protože místo dvojbytové adresy každé operace (je jich celkem 40) stačí jeden byte, a navíc to zkrátí relokační tabulku. Kód pak vypadá nějak taktko:

Kód:
    defb monShowAddresses - monExecutionMode
    defb 0x63 ; c       - show addresses
    defb monAddressPrintingMode - monShowAddresses
    defb 0x3f ; SS + c  - addresses printing mode

Pro dekompilaci takového kódu to znamená, že adresám příslušných operací nejsou v kódu automaticky přiřazena vůbec žádná návěští, ta je teprve nutné dopočítat. Rovněž ona tabulka vypadá na první pohled jako posloupnost bytů bez zjevného smyslu. Aby toho nebylo málo, na příslušné operace se neskáče pomocí CALL nebo JP, ale tak, že se požadovaná adresa vloží na zásobník a pak se provede RET.
:suicide:

_________________
Špóngiu navlhčiť


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 44 ]  Přejít na stránku Předchozí  1, 2, 3

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 4 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz