DC-SWAT Forum
Ассемблер - Версия для печати

+- DC-SWAT Forum (http://www.dc-swat.ru/forum)
+-- Форум: Sega Dreamcast (/forum-2.html)
+--- Форум: Programming (/forum-8.html)
+--- Тема: Ассемблер (/thread-1451.html)

Страниц: 1 2


Ассемблер - zzPSIXzz - 16.01.2011 20:19

Sad Ребята у меня есть просьба есть задачка кто может её помочь решить..

Напишите программу, которая запрашивает имена двух файлов с клавиатуры, затем открывает первый файл на чтение, а второй на запись, после чего переписывает во второй файл все предложения, так чтобы во втором файле одно предложение занимало одну строку. Разделителями предложений считать точки, восклицательный и вопросительный знаки, многоточие.

Я уже не знаю что с ней делать а завтра вечером сдавать нужно..


RE: Ассемблер - sc_maxim - 16.01.2011 23:43

Вообще то ты даже не в тот раздел написал и явно не в тот форум попал. Здесь спрашивают про программирование под Sega Dreamcast.


RE: Ассемблер - Rio - 16.01.2011 23:58

Да еще и на ассемблере... под sh4 :-D


RE: Ассемблер - zzPSIXzz - 17.01.2011 01:03

Мэ.. ну ассемблер есть он... он идёт как в биосе.. и я хз ребят куда уже писать, не сочтите за наглость... просто куда уже только не обращался...


RE: Ассемблер - sc_maxim - 17.01.2011 01:17

Извини, конечно, но с ассемблером не хочу иметь дела, это долго парится. Могу только книгу Зубкова посоветовать http://gogsite.ucoz.ru/load/0-0-0-2-20, но она тебе вряд ли поможет Smile, там много примеров.


RE: Ассемблер - Rio - 17.01.2011 01:33

Да, мне тоже с ассемблером париться не охота...


RE: Ассемблер - zzPSIXzz - 17.01.2011 02:53

Вот вот.. в этом то и проблема главная... не кто не хочет заморачивать себя забытым Богов языком программирования.. а помощь так нужна Sad


RE: Ассемблер - sc_maxim - 17.01.2011 03:05

Можно нескромный вопрос, а что мне будет за такую помощь? Просто сам сейчас занят написанием курсового, в другом случае обязательно помог бы Smile


RE: Ассемблер - Rio - 19.01.2011 16:34

Вот тут все и закрываются наглухо)) Деньги платить никто не хочет, хотя это и нормально, т.к. любая работа должна оплачиваться, и помогать в нашем мире сейчас кому-то за бесплатно...


RE: Ассемблер - sc_maxim - 09.09.2013 23:31

Решил не создавать новую тему по ассемблеру. Вобщем, решил я разобраться с sh4 ассемблером и возникли некоторые неясности. Взял за основу код из dcload, собственно сам код с начальной инициализацией crt0 и dcload syscalls. В функции main сделал простенький hello-world. Вот код (пишу по памяти, т.к. нет при себе компа с тулчейном для проверки):
Код:
.global .section .text
           .global _main
_main:
            mov.l write_k,r0
            mov.l #1,r4 // Номер файла для сис.вызова write
            mov.l msg_k,r5
            jsr   @r0
            mov   #13,r6 // Длина сообщения
            nop
            mov.l write_k,r0
            mov.l #1,r4
            mov.l msg_k,r5
            jsr   @r0
            mov   #13,r6
            nop
write_k:
            .long _write
msg_k:
            .long msg
msg:
            .ascii "Hello, world!"
Программа выводит сообщение один раз, после чего вылетает с сообщением о том,
что переход в NULL не возможен. Собственно, как я понимаю,
в регистре PR содержится 0 из-за чего возникает ошибка при выполнении команды rts.
Судя по документации sh4, команда jsr перед переходом сохраняет текущее значение PC в PR для последующего возвращения,
однако этого не происходит. Проверяю все в эмуляторе lxdream в режиме интерпретатора,
т.к. нет пока возможности использовать Windows или сам Дрим.
Это я неправильно понял эту команду или все таки эмулятор сильно неточен?
Пробовал также добавить сохранение pr в стек, sts.l pr,@-r15 , но это не дало результата или опять же я не допонял как использовать.
Хотелось бы узнать о полезных советах и неочевидных нюансах дримовского ассемблера.


RE: Ассемблер - SWAT - 10.09.2013 07:16

Да кто бы на нем писал тут Smile)) Лично у меня до него руки так и не доходят толком, да и незачем особо. К слову "rts" я в твоем коде вообще не вижу.


RE: Ассемблер - sc_maxim - 10.09.2013 10:18

Виноват, rts в конце функции write находится. Особо писать на ассемблере не собирають, просто стало интересно как устроенно все на самом низком уровне. Сишный компилятор в абсолютном большинстве случаев удовлетворяет всем потребностям.


RE: Ассемблер - sc_maxim - 10.09.2013 22:07

Короче. Сам определил проблему :-) Проблема в неправильной настройке стека, из-за этого регистр pr не сохранялся, а вместо него восстанавливались нули и возникало исключение. Пришлось вручную переписать функцию write так что-бы она хранила предыдущее значение pr в регистре r15(стек не используется) и восстанавливаться из него же.
Поговорил, что называеться, с собой :-) Может кому-то будет полезно.


RE: Ассемблер - SWAT - 11.09.2013 08:51

Конечно полезно. Если хочешь я могу подкинуть несколько задачек для тренировки с пользой.


RE: Ассемблер - sc_maxim - 11.09.2013 09:10

Подкинь. Пока время свободное есть, буду заниматься.


RE: Ассемблер - SWAT - 11.09.2013 13:28

Можешь переписать soft SPI на ASM, конечно врятли это особо ускорит процесс, но все же не помешало бы мне кажется.
Так же вот еще пара задач для ffmpeg плеера в DS:

Деление буфера (это аудио, AICA не умеет играть такие, ей нужны раздельные каналы):
PHP код:
int16 *sep_buffer[2] = {NULLNULL};

void sep_data(void *bufferint len) {

    
register int16 *bufsrc, *bufdst_left, *bufdst_right;
    
register int cnt;
    
    
cnt len 2;
    
bufsrc = (int16*)buffer;
    
bufdst_left sep_buffer[0];
    
bufdst_right sep_buffer[1];
    
    while(
cnt) {
        *
bufdst_left++ = *bufsrc++;
        *
bufdst_right++ = *bufsrc++;
        
cnt -= 2;
    }


Конвертация YUV420P в UYVY422:
PHP код:
void yuvtex(uint16 *tbuf,int tstride,unsigned width,unsigned height,uint8 *ybuf,int ystride,uint8 *ubuf,int ustride,uint8 *vbuf,int vstride) {
    
int h height/2;
    
uint8 uv;

    do {
        
uint8 *uptr,*vptr,*yptr,*yptr2;
        
uint8 *tex,*tex2;
        
int w width/2;

        
tex  = (uint8*)tbuftbuf+=tstride;
        
tex2 = (uint8*)tbuftbuf+=tstride;
        
yptr  ybufybuf +=ystride;
        
yptr2 ybufybuf +=ystride;
        
uptr ubufubuf +=ustride;
        
vptr vbufvbuf +=vstride;
        do {
            
= *uptr++;
            
= *vptr++;
            
tex[0] = u;
            
tex[1] = *yptr++;
            
tex[2] = v;
            
tex[3] = *yptr++;
            
tex2[0] = u;
            
tex2[1] = *yptr2++;
            
tex2[2] = v;
            
tex2[3] = *yptr2++;
            
tex+=4;
            
tex2+=4;
        } while(--
w);
    } while(--
h);
}

            
yuvtex(txr->backbuftxr->widthcodec->widthcodec->height,
                
frame->data[0], frame->linesize[0],
                
frame->data[1], frame->linesize[1],
                
frame->data[2], frame->linesize[2]
            ); 

Либо если получится, то можешь попробовать не конвертировать в UYVY422, а просто поделить YUV420P на макроблоки размером 16х16 пикселей. Тогда бы я смог бы использовать хардварный конвертер что есть в PVR (он зараза не кушает ее как есть).
Код:
        ++++++-----------------
        ++++++-----------------
        ++++++-----------------
        -----------------------
        -----------------------

В идеале во всех задачах нужно задействовать кэш SH4, так как они ОЧЕНЬ чувствительны к производительности.


RE: Ассемблер - sc_maxim - 11.09.2013 22:09

В общем пока просто перепишу на ассемблер, а уже потом попробую задействоват кеш, т.к. не разбирался пока с его использованием.


RE: Ассемблер - uncle - 19.09.2013 17:34

Помнится я когда-то использовал аппаратный YUV конвертер. Только макроблоками вроде медленно получается. Какой-то там другой режим есть. Не помню, надо залезть в архивы...


RE: Ассемблер - SWAT - 19.09.2013 20:46

Нету там другого режима...


RE: Ассемблер - uncle - 21.09.2013 12:04

Надо же вспомнил. Хоть это и было триста лет тому назад.
https://drive.google.com/folderview?id=0B70bJ1GwUZydOHJ5anpVTUdRbEk&usp=sharing
По ссылке бенчмарк трансфера через YUV конвертер. Выкладываю в том виде в котором нашел в архиве, но должен быть актуальным. Для DMA трансфера взят за основу косовский. Оригинальный чем-то мне не угодил не помню чем. Режима таки два - этот медленнее, но так как это DMA для проигрывания видео годится. Для использования в реальных условиях еще надо сбросить кэш перед DMA трансфером (угадайте зачем) и это создаст дополнительный овехед плюс к делению на макроблоки.
Существует еще одна марсианская техника вывода на экран YUV фрейма методом смешения палитровых текстур. Она потенциально быстрее, в ней оверхеда на подготовительные операции меньше. Кому интересно читаем это:
http://www.multimedia.cx/yuv-3d-rgb.txt
там и пример есть.

Вот теперь точка.