Prosba o překlad z ASM – Visual Basic – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Prosba o překlad z ASM – Visual Basic – Fórum – Programujte.comProsba o překlad z ASM – Visual Basic – Fórum – Programujte.com

 

12. 10. 2015   #1
-
0
-

Zdravím zdejší. Jsem programovací lama. Píšu program pro Atmegu8. Jde mi  o zobrazení digitálního kompasu na CRT v PAL. Dostat nějaké data do CRT není problém a děje se tak skrz SPI potažmo 8bit registr SPDR. Font je dosovský a v podstatě potřebuju  vykreslit jen čísla 0-9, SZJV a znaménko %. procesor běží na 16MHz. Jednotlivé znaky jsou uloženy v tabulce. např: 

D1:

Data 0 , 16 , 48 , 240 , 48 , 48 , 48 , 48 , 48 , 120 , 0

vykreslí znak 1. (font je 8x11). V podstatě k vykreslení se posílá do SPDR bajt po bajtu (0, pak 16, pak 48, ...) až to vykreslí do určeného řádku znak.

Problém je že klasický postup kdy ve stringu kdy chci jen zkušebně na obrazovku dostat "123456789" jsou tak šílený režie na procesorový čas že to prostě zobrazuje úplný nesmysly. Takže by to chtělo nějaký triky v ASM

V céčku který samozřejmě totálně neovládám to mají vyřešený přes pgm_Read_byte který když rozškatulkuju až do kódu tak to vypadá následovně:

#define __lpm_enhanced__(addr) \
__extension__({ \
    Uint16_t __addr16 =(uint16_t)(addr) ; \
    Uint8_t __result ; \
    __asm__                     \
    (                           \
        "lpm %0, Z" "\n\t"      \
        : "=r" (__result)       \
        : "z" (__addr16)        \
    );                          \
    __result;                   \
}))

Je mi jasný že je zde použitý assembler. Problém mi dělá jakýsi překlad toho do bascomu který používám.

toto: Uint16_t __addr16 =(uint16_t)(addr) ; \ zde je mi jasný dimenzování lokální proměnné addr16 typu word, zbytek bude asi přiřazení proměnné addr taktéž typu word číli addr16 = addr

pak bude dimenzování: local result as byte

ale tohle už prostě nedokážu přelouskat:

       "lpm %0, Z" "\n\t"      \
        : "=r" (__result)       \
        : "z" (__addr16)        \

LPM jsem si ještě dohledal, ale v basomu prostě ty přípony (/n /t)  k tomu nejsou a navíc to %0 co si pod tím mám tak představit?

"=r" (__result)  -   co to proboha je? kde se tu vzalo jaký r? Jedná se snad o R0?

"z" (__addr16) - Z tuším že je součástí LPM čili nositel hodnoty který se pak přepíše do addr16

jinak v tom C je úryvek toho programu který se snažím plagiátovat:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "vgafont.h"

#define HSYNC PORTB=0;
#define BLACK PORTB=1;
#define COLUMN(r) SPDR=pgm_read_byte(&font[(uint8_t)text[textrow][r]][fontline]);

/* This is our text buffer.  Populate this as you please. */

char *text[17] =
    {
        "************************************",
        "*                                  *",
        "* ATmega NTSC Video Text Generator *",
        "* Version 0.9                      *",
        "*                                  *",
        "* For more info please visit       *",
        "* http://jmp.no/…;  ; *",
        "*                                  *",
        "************************************",
        "                                    ",
        "                                    ",
        "                                    ",
        "                                    ",
        "                                    ",
        "                                    ",
        "                                    ",
        "                               Cool!",
    };

Může mě někdo něják nasměrovat? Prostě narážím na nedostatek zkušeností s touto problematikou. Jinak to co chci zobrazit na CRT vypadá následovně.

S                              J                                       Z 

|                                |                                        |

------------------------------------------------------------   100%

Nahlásit jako SPAM
IP: 85.207.89.–
Ovrscout
~ Anonymní uživatel
113 příspěvků
13. 10. 2015   #2
-
0
-

#1 madeindoma
Mno to záleží co je to za překladač pro který je tek kód určen, inspirovat se můžeš třeba zápisem GCC https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5

Ty dvě řádky s dvojtečkou  se starají o předání Cčkových proměnných z/do asembleru:

Odhaduju že : "z" (__addr16) naplní registr Z hodnotou proměnné addr16 před vstupem do asm bloku.
A : "=r" (__result) zřejmně vezme některý z registrů r (např r0 - výběr je na překladači podle aktuální situace)  ten se vloží do asm kódu místo značky %0 a následně po provedení asm bloku hodnotu z registru uloží do proměnné result.

Nahlásit jako SPAM
IP: 193.165.79.–
KIIV
~ Moderátor
+43
God of flame
13. 10. 2015   #3
-
0
-

Kazdopadne instrukce lpm vezme adresu v registru Z (coz je r31:r30) a nacte data z flash pameti (pameti programu) na te pozici do registru, ve kterem je __result. V bascomu to ale fakt neznam.

Jinak jestli je CRT mysleno jako klasicky display s D-Sub konektorem, tak bych spis doporucil nejake gameduino, ktere se o zobrazovani postara samo. Musis tam naposilat akorat spravne data.

Tak mozna to bude prehlednejsi nez v C: http://avrhelp.mcselec.com/index.html?mixing_asm_and_basic.htm

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
13. 10. 2015   #4
-
0
-

díky za příspěvky. CRT je opravdu CRT takže krmeníčko je přes kompozitní vstup.

KIIV: ano ten odkaz mám v BASOMu taky vlastně je to jeden kus z velmi obsáhlé nápovědy k tomu programu.

Nahlásit jako SPAM
IP: 85.207.89.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Asm v C++ — založil Sir_E

Asm 8086: OUT DX,AX — založil Mircosoft

Násobení v ASM — založil AIPHEE

Podminka v ASM — založil Mutagen

čtení single v ASM — založil xanyt

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý