Advertisement
Mysoft

Untitled

Nov 24th, 2022 (edited)
1,678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; designed for NASM generating .com file...
  2.  
  3. cpu 386
  4. org 100h
  5.  
  6. section .text
  7. Start:      
  8.  
  9.     mov ax,0x13 ;SetVideoMode: 320x200x8
  10.     int 0x10
  11.        
  12.     ;array assumes ds=ss
  13.     mov bp, LineArrayStart
  14. .NextLine:
  15.     xchg bp,sp    ; array <-> stack
  16.     pop si ;X0
  17.     pop di ;Y0
  18.     pop cx ;X1
  19.     pop dx ;Y1
  20.     pop ax ;Color  
  21.     xchg bp,sp    ; stack <-> array
  22.     call DrawLine
  23.     cmp bp, LineArrayEnd
  24.     jl .NextLine
  25.     mov sp, bp ;restore sp
  26.    
  27.     mov ah,0x7  ;wait for a key
  28.     int 0x21
  29.    
  30.     mov ax,0x3  ;SetVideoMode: 80x25 (text)
  31.     int 0x10
  32.    
  33.     int 0x20    ;end program
  34.  
  35. LineArrayStart:
  36.     ;   X0  Y0   X1  Y1  Color
  37.     dw   1,  0, 318,  0 , 9
  38.     dw 319,  1, 319,198 ,11
  39.     dw 318,199,   1,199 ,13
  40.     dw   0,198,   0,  1 ,15
  41.     dw   8,  8, 311,191 ,10
  42.     dw 311,  8,   8,191 ,14
  43. LineArrayEnd:
  44. ;=========================================================================
  45. ;=========================================================================
  46. ;=========================================================================
  47.    
  48. ;-----------------------------------------------
  49. ; Draw Line (si,di) to (cx,dx) with color (al) ;
  50. ; ----------------------------------------------
  51. ; unused... AH,BP,SP (selfmod is using CS: to not assume CS=DS)
  52. DrawLine:
  53.     push ds                  ;save old DS
  54.     push 0xA000              ;make new DS to be screen segment
  55.     pop ds
  56.    
  57.     ;   dx = abs(x1 - x0)
  58.     ;   dy = abs(y1 - y0)
  59.     ;   (x0 < x1) ? sx = 1 : sx = -1
  60.     ;   (y0 < y1) ? sx = 1 : sx = -1
  61.     ;   err = dx - dy
  62.    
  63.     mov bx, dx               ; bx = Y1*320+X1
  64.     imul bx, 320             ; (end position)
  65.     add bx, cx               ;
  66.     mov [cs:.EndOff-2], bx   ; self-mod ending offset for the line!
  67.    
  68.     mov bx, 1                ; SX = 1
  69.     sub cx,si                ; cx = (X1-X0)
  70.     jnb .ChkH                ; jump if not negative
  71.     neg bx                   ; SX = -1
  72.     neg cx                   ; cx = -cx (abs DX)
  73. .ChkH:
  74.     mov [cs:.SX-2], bx       ; self-mod setting (in code SX)
  75.    
  76.     mov bx, -320             ; SY = "-1"  (inverse because -DY , 320 because 'row')
  77.     sub dx,di                ; dx = (Y1-Y0)
  78.     jb .ChkV                 ; jump if negative
  79.     neg bx                   ; SY = "1"
  80.     neg dx                   ; dx = -dx (-abs DY)
  81. .ChkV:
  82.     mov [cs:.SY-2], bx       ; self-mod setting (in code SY)   
  83.    
  84.     imul di, 320             ; di = Y0*320+X0
  85.     add di, si               ; (start position)
  86.    
  87.     ;mov si, cx               ; ERR = DX+DY
  88.     ;add si, dx               ; (add because DY was negated)       
  89.     lea bx,[ecx+edx]
  90.     add bx,bx
  91.  
  92. ;   loop
  93. ;     printPixel(x0, y0, colour)
  94. ;     if (x0 = x1) and (y0 = y1) exit loop
  95. ;     e2 = 2 * err
  96. ;     if (e2 > -dy) then
  97. ;       err = err - dy
  98. ;       x0 = x0 + sx
  99. ;     end if
  100. ;     if (e2 < dx) then
  101. ;       err = err + dx
  102. ;       y0 = y0 + sy
  103. ;     end if
  104. ;   end loop
  105.    
  106. .NextPixel:
  107.     mov [di], al             ; store pixel
  108.     cmp di, 0x5555           ; check if done drawing the line (SELF-MOD!)
  109. .EndOff:
  110.     je .Done
  111.    
  112.     ;lea bx,[esi+esi]
  113.     ;;mov bx, si               ; E2 = ERR*2
  114.     ;;add bx, bx
  115.    
  116.     cmp bx, dx               ; if (E2 > -DY) then
  117.     jle .NoAddY              ; (inverse jump)
  118.     ;add si, dx              ; ERR = ERR - DY (DY negativated)
  119.     add di, 0x5555           ; X0 = X0 + SX (Self-Mod SX (-1 or 1))
  120. .SX:
  121.     cmp bx, cx               ; if (E2 < DX) then
  122.     lea bx,[ebx+edx*2]       ; duplicate code because both DX/DY comparsion must use the same BX
  123.     jl .DoAdd                ; so i do it before the lea (which does not change registers)
  124.     jmp .NextPixel           ; and jump to add part in positive case (better!!)
  125. .NoAddY:                   
  126.     cmp bx, cx               ; if (E2 < DX) then
  127.     jge .NextPixel           ; (inverse jump) (optimized jump)
  128.     ;add si, cx               ; ERR = ERR + DX
  129. .DoAdd:
  130.     lea bx,[ebx+ecx*2] 
  131.     add di, 0x5555           ; Y0 = Y0 + SY (Self-Mod SX {-1(-320) or 1(320)}
  132. .SY:
  133.     jmp .NextPixel          
  134. .Done:
  135.     pop ds                   ; restore previous DS
  136.     ret                      ; and return
  137.    
  138. ;-----------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement