· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Помогите демомейкеру самоучке...

Посл.отвђт Сообщен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