Подсчитайте с помощью линейного алгоритма Брезенхэма в реальном режиме, сборка - PullRequest
0 голосов
/ 16 апреля 2011

Эй!
Я хотел бы нарисовать линии в сборке. Я написал алгоритм на C, теперь мне нужно собрать его в сборку.
Я в 16-битном режиме; графический режим: 12 часов (640 * 480 16 цветов)
Источник C:

//x1/y1/x2/y2 = start x, start y, end x, end y
void draw_line(int x1, int y1, int x2, int y2)
{
    double delta_l = (x2-x1)/(y2-y1);
         //delta_l = like graph slope; maybe it's negative and/or not integer
         // it can be also type 'float'
    double y;

    for(int x = x1; x <= x2; x++)
    {
        y = y1 + ( x * delta_l );
        Round_To_Integer(y);
        Put_Pixel(x, y, color);
    }
}

Моя проблема в том, что я не могу считать с числами с плавающей запятой (или двойными) в сборке.
Пожалуйста, помогите мне "перевести" этот код C на ASM.
Спасибо.

Ответы [ 3 ]

5 голосов
/ 16 апреля 2011

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

Эта страница содержит пошаговое объяснение.

1 голос
/ 16 апреля 2011

Использовать арифметику с фиксированной точкой.В реальном режиме для регистрового значения используется пара регистров.Обычно один содержит целую часть числа, а другой содержит дробь.Используйте add с переносом для каждого шага.

0 голосов
/ 16 марта 2013
 MOV AX,0A000
 MOV DS,AX
 MOV AX,013    ; GRAPHICS MODE 13H 320X200
 INT 010
 MOV SI,0
 MOV CX,0
L4:
 MOV B[SI],31  ; DRAW PIXEL OF LINE 0,0 TO 320,200 USING BRESENHAM 
 ADD CX,200
 MOV AX,CX
 SHL AX,1
 CMP AX,320
 JB L5
 ADD SI,320
 SUB CX,320
L5:
 ADD SI,1
 CMP SI,64000
 JB L4
L2:
 MOV AX,0     ; HOLD SCREEN
 INT 016
 CMP AH,1
 JE L3
 JMP L2
L3:
 MOV AX,2     ; RESET MODE 2
 INT 010
 MOV AX,04C00 ; NORMAL EXIT
 INT 021
...