|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 9, 2003 16:50:31 Здравствуйте все. У меня возникли проблемы с моей первой демкой(прога выводит звезды но они не двигаются и еще программа !виснет!). Пожалуйста помогите устранить баги. ;cut here: ======================== ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Project: Star version 0.1 ; ; Author: HexMan ; ; Mail to: HexMan@rambler.ru ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Sorry for my bad English ; tasm star.asm ; tlink star.obj /t /x model tiny .code .386 org 100h Start: ; Set Video mode 320*200*256 mov al,13h int 10h ; Palette mov si,offset Palette mov dx,03C8h xor al,al out dx,al inc dx mov cx,12h rep outsb ; Randomize call randomize ; Generate random Star(x,y) and their color mov cx,0ffh NextStar: pusha mov ax,64000 call random mov di,ax mov ax,6 call random mov offset [Buffer+di],al popa loop NextStar ; Main Loop push 0A000h pop es MainLoop: ; Wait retrace mov dx,03DAh WR1: in al,dx and al,08h jnz WR1 WR2: in al,dx and al,08h jz WR2 ; Output Buffer on Screen mov cx,64000 mov si,offset Buffer xor di,di rep movsb ;;;;;;;;;; ; This not optimizing code(it contains errors please correct their) ; it must displace star in right mov cx,0ffffh qwer: mov al,byte ptr [Buffer+di] cmp al,0 je qwer1 mov byte ptr [Buffer+di],0 push ax mov ax,di mov bx,2 ;How place in bx 0.1??? Without use FPU??? mul bx mov di,ax pop ax mov offset [Buffer+di],al ;And what delete the star if she was beyond the scope of screen? qwer1: loop qwer ;;;;;;;;;; ; Wait until the user have pressed ESC in al,60h dec al jnz MainLoop; ; Set textmode mov ax, 03 int 10h ; Exit ret ; Proc randomize Randomize Proc ; Get time and push their in Seed mov ah,2Ch int 21h mov Word ptr cs:[RandSeed],cx mov Word ptr cs:[RandSeed+2],dx ret Randomize endP ; Random function return number [0,ax-1] Random proc mov cx,ax mov ax,Word ptr cs:[RandSeed+2] mov bx,Word ptr cs:[RandSeed] mov si,ax mov di,bx mov dl,ah mov ah,al mov al,bh mov bh,bl xor bl,bl rcr dl,1 rcr ax,1 rcr bx,1 add bx,di adc ax,si add bx,62e9h adc ax,3619h mov word ptr cs:[RandSeed],bx mov word ptr cs:[RandSeed+2],ax xor dx,dx div cx mov ax,dx ret Random EndP ; Program Data RandSeed dd 0 Palette db 3 dup(0) db 3 dup (12) db 3 dup (24) db 3 dup (36) db 3 dup (48) db 3 dup (63) Buffer db 64000 dup (?) end Start ========================== ;EOF С уважением, HexMan. |
|
|
Дата: Июн 10, 2003 04:49:12 HexMan 1. Замените: mov offset [Buffer+di],al на mov [Buffer+di],al 2. Определитесь с регистром в названии подпрограмм Random/random и Randomize/randomize 3. Imho проверять наличие Esc в буфере клавиатуры лучше при помощи Int16h AH=1 и AH=0, т.е. вместо: [code] in al,60h dec al jnz MainLoop; [/code] использовать [code] mov ah,1 int 16h jz MainLoop xor ah,ah int 16h cmp ah,1 jnz MainLoop [/code] 4. Если я правильно понял, то цикл: [code] mov cx,0ffffh qwer: mov al,byte ptr [Buffer+di] ... qwer1: loop qwer [/code] задумен чтобы "гасить" старые звезды и "зажигать" новые. Тогда, как Вы считаете, чему равно значение регистре DI на входе в цикл и как оно меняется внутри него? 5. Код: [code] mov ax,di mov bx,2 mul bx mov di,ax [/code] аналогичен [code] shl di,1 [/code] Итого: Ваш код почти работает, только алгоритм обновления звезд не продуман. |
|
|
Дата: Июн 11, 2003 10:11:17 Вначале слова благодарности: Thankz: P2M за уделеное мне время. Надеюсь тебе не составит труда ответить на нижеследующие вопросы: 3. Это почему??? Помойму in al,60h dec al jnz MainLoop Меньше занимет и выполняется быстрее в отличии от Int16h AH=1 и AH=0!? 4. Нет не правильно. Цикл должен сдвигать звезды вправо. 5. mov ax,di в регистр ax помещается цвет звезды mov bx,2 а сюда коффициент смещения звезд mul bx тут умножаю его на коф-ент и получаю новую координату звезды(чем темнее звезда тем меньшее приращение она получит - это для создания 3-д эффекта. В последствии я хотел проверять вышла ли звезда за пределы экрана(x>320) и если это true то создавать новыю случайную звезду с координатами y=любое x=0 цвет= любой.) mov di,ax Так вот вопрос как поместить в bx вещественное число например число без использования FPU? МОИ ПРИНЦЫПЫ: я оптимизирую программу(и продумываю алгоритмы) когда она полностью работоспособна! |
|
|
Дата: Июн 11, 2003 10:46:14 Извините меня за невнимательность я пропустил "0.1" в предложении(см. выше) вот исправленое предложение: Так вот вопрос как поместить в bx вещественное число например 0.1 без использования FPU? Ну и напутал же я с пунктом 5 вот исправленый кусок кода: mov cx,0ffffh qwer: mov al,byte ptr [Buffer+di] cmp al,0 je qwer1 mov byte ptr [Buffer+di],0 push ax mov ax,[Buffer+di] ;Цвет в ax mov bx,?0.1? mul bx ;Умножаю его на 0.1? add di,ax ;результат добавляю к старому смещению ;Тут будет проверка(я еще не думал как это осуществить) x>320 тогда создать новую звезду об этом я писал выше; mov offset [Buffer+di],al ; вывожу новую точку pop ax qwer1: loop qwer |
|
|
Дата: Июн 11, 2003 11:16:15 HexMan 3. Это почему??? a) Куда денется нажатый Esc, после завершения работы вышей программы? b) Что будет, если пользователь будет нажимать не Esc, а другие клавиши? c) Imho Int16h(AH=1+AH=0) не настолько медленны, чтобы повлиять на производительность Вашей программы. Afaik их работа заключается не более чем в анализе/изменении состояния буфера клавиатуры, т.е. чуть-чуть поработать с памятью в 0x0400:XXXX. 4. Нет не правильно. Цикл должен сдвигать звезды вправо ... Ну и напутал же я с пунктом 5 Я пока ничего не понял. Например, Вы пишите: [code] je qwer1 mov byte ptr [Buffer+di],0 push ax mov ax,[Buffer+di] ;Цвет в ax [/code] Afaik цвет - это байт. Умножение на 0.1 можно заменить делением на 10 и взятием целой части. |
|
|
Дата: Июн 11, 2003 12:54:38 Делением нельзя заменить так как я умножаю цвет а он определен в промежутке [0,5] Так что при деление на 10 целая часть всегда будет 0. Ниже я снова публикую код демки(да звезды стали двигатся но очень быстро надо срочно умножать на 0.1 вместо 1 но как??? Помогите кто может и еще дема после нескольких запусков начинает косячить(например выдает ошибки по адресу такомуто память только read?)), но с более полными комментариями в непонятных местах: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Project: Star version 0.1 ; ; Author: HexMan ; ; Mail to: HexMan@rambler.ru ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; model tiny .code .386 org 100h Start: mov al,13h int 10h mov si,offset Palette mov dx,03C8h xor al,al out dx,al inc dx mov cx,12h rep outsb mov cx,0FA00h mov di,offset Buffer xor al,al rep stosb ;забиваю буфер 0 если этого не сделать то на экран выведится вся возожная палитра, а еще это можно было осуществить так: Buffer db 64000 dup (0) но тогда файл растолстеет на 64кб! call Randomize mov cx,0ffh NextStar: pusha mov ax,0FA00h call Random mov di,ax mov ax,6h call random mov [Buffer+di],al popa loop NextStar push 0A000h pop es MainLoop: mov cx,0FA00h Next: mov di,cx mov al,byte ptr [Buffer+di] ;получаю цвет точки из буфера cmp al,0 ; если там черный цвет то следующею звезду je SkipStar mov byte ptr [Buffer+di],0 ; а если нет то затираю текущею точку mov bl,1 push ax mul bl ;умножаю(al*bl) цвет точки на коффициент смещения add di,ax ;добавляю полученое смещение к di pop ax mov [Buffer+di],al ; вывожу точку по новой коорденате старым цветом SkipStar: loop Next mov dx,03DAh WR1: in al,dx and al,08h jnz WR1 WR2: in al,dx and al,08h jz WR2 mov cx,64000 mov si,offset Buffer xor di,di rep movsb mov ah,1 int 16h jz MainLoop xor ah,ah int 16h cmp ah,1 jnz MainLoop mov ax, 03 int 10h ret Randomize Proc mov ah,2Ch int 21h mov word ptr [RandSeed],cx mov word ptr [RandSeed+2],dx ret Randomize endP Random proc mov cx,ax mov ax,word ptr [RandSeed+2] mov bx,word ptr [RandSeed] mov si,ax mov di,bx mov dl,ah mov ah,al mov al,bh mov bh,bl xor bl,bl rcr dl,1 rcr ax,1 rcr bx,1 add bx,di adc ax,si add bx,62e9h adc ax,3619h mov word ptr [RandSeed],bx mov word ptr [RandSeed+2],ax xor dx,dx div cx mov ax,dx ret Random EndP RandSeed dd 0 Palette db 3 dup(0) db 3 dup (12) db 3 dup (24) db 3 dup (36) db 3 dup (48) db 3 dup (63) Buffer db 64000 dup (?) end Start |
|
|
Дата: Июн 11, 2003 14:47:11 HexMan, вы пишете: mov bl,1 push ax mul bl ;умножаю(al*bl) цвет точки на коффициент смещения add di,ax ;добавляю полученое смещение к di pop ax mov [Buffer+di],al ; вывожу точку по новой коорденате старым цветом зачем вам умножать на 0.1 ?! Вывести точки с дробными координатами нельзя. Если вам нужно чтоб звезды двигались плавно, а не скачками, то нужно хранить координаты звезд ввиде числа с плавающей или фиксированной точкой, а при выводе округлять. А если вам нужна сверхточность, то можно учесть и дробную часть путем изменения яркости нескольких ближайших точек. |
|
|
Дата: Июн 16, 2003 05:29:45 HexMan снова публикую код демки Симпатично (на PII-450). звезды стали двигатся но очень быстро Что в Вашем понимании быстро? Afaik надо синхронизировать по времени, а то на разных процессорах скорость будет разная. Зачем где-то 0FA00h, а где-то 64000? Буфер заполнять и передавать можно словами, т.е. stosW и movsW. Как Вы думаете, не обрабатываются ли отдельные звезды по два раза за цикл? Искать не черную точку можно scasb'ом, а лучше вообще не искать, а помнить смещения и цвета всех 0FFh звезд и работать только с ними. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |