Code compacter maken

Status
Niet open voor verdere reacties.

poelske88

Gebruiker
Lid geworden
2 aug 2008
Berichten
36
Hallo
Ik heb een stukje code gemaakt , maar het is nogal lang en ik gebruik steeds dezelfde code, maar ik weet niet goed hoe ik dit korter kan maken

ik heb hieronder de code staan (ze werkt dus wel , maar is nogal lang en altijd hetzelfde)

en ik wil dus 4 vierkanten tekenen (eerst alle 4 in centrale geheugen en dan kopieren naar videogeheugen), en voor elk van deze 4 vierkanten gebruik ik dezelfde code maar met andere waarden

posblokjes is dus een word array dat de x1,y1,x2,y2,x3,y3,x4,y4 van de linkerbovenhoek van de 4 vierkanten bevat
soort staat gedefinieerd in het data segment zodat hij een vierkantje kan tekenen in het groen met een rode rand

ik dacht er dus aan in cx 4 te zetten en dan een loop te maken (dus tot cx nul is en dan stoppen), maar dan moet de index in de array van posblokjes van deze cx afhangen en als ik bijvoorbeeld een "dw index ?" doe en deze de goede waarde geef bv "mov index,0" en ik zet deze in de code dus "mov ax,posblokjes[index]" geeft hij de fout "cannot add 2 relocatable files"

ook dacht ik eraan de code die ik steeds hergebruik in een macro te zetten, maar ik zie niet goed hoe de loop dan moet staan en hoe deze dan moet werken

Als iemand kan helpen, zou ik hem/haar zeer dankbaar zijn


PHP:
tekenblok macro soort		

  local asciimodeex1_wait1,asciimodeex1_wait2,teken_alle_lijnen,teken_alle_lijnen2,teken_alle_lijnen3,teken_alle_lijnen4

  push bp		
  mov bp,sp
  
  push ax
  push bx
  push dx
  push si

  mov ax,@data
  mov ds,ax

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      
  mov si,offset soort
  mov di,seg videobuffer
  mov es,di
  mov di,offset videobuffer    
  
  mov ax,posblokjes[2]
  mov bx,schermlengte
  mul bx
  add ax,posblokjes[0]
  mov di,ax
 
  mov cx,zijde
  teken_alle_lijnen:
    push cx 
    mov cx,zijde
    rep movsb
    add di,schermlengte-zijde
    pop cx
  loop teken_alle_lijnen 
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  mov si,offset soort
  mov di,seg videobuffer
  mov es,di
  mov di,offset videobuffer
  
  mov ax,posblokjes[6]
  mov bx,schermlengte
  mul bx
  add ax,posblokjes[4]
  mov di,ax
   
  mov cx,zijde
  
  teken_alle_lijnen2:
    push cx 
    mov cx,zijde
    rep movsb
    add di,schermlengte-zijde
    pop cx
  loop teken_alle_lijnen2 
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  mov si,offset soort
  mov di,seg videobuffer
  mov es,di
  mov di,offset videobuffer
  
  mov ax,posblokjes[10]
  mov bx,schermlengte
  mul bx
  add ax,posblokjes[8]
  mov di,ax
   
  mov cx,zijde
  
  teken_alle_lijnen3:
    push cx 
    mov cx,zijde
    rep movsb
    add di,schermlengte-zijde
    pop cx
  loop teken_alle_lijnen3  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  mov si,offset soort
  mov di,seg videobuffer
  mov es,di
  mov di,offset videobuffer
  
  mov ax,posblokjes[14]
  mov bx,schermlengte
  mul bx
  add ax,posblokjes[12]
  mov di,ax
   
  mov cx,zijde
  
  teken_alle_lijnen4:
    push cx 
    mov cx,zijde
    rep movsb
    add di,schermlengte-zijde
    pop cx
  loop teken_alle_lijnen4  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  
     
  mov dx,seg videobuffer
  mov ds,dx
  mov si,offset videobuffer
  mov dx,0A000h
  mov es,dx
  xor di,di
  
  mov dx, 03dah 
  asciimodeex1_wait1:                        
    in al, dx
    and al, 8
    jnz asciimodeex1_wait1                  
  asciimodeex1_wait2:                        
    in al, dx
    and al, 8
    jz asciimodeex1_wait2                    
  mov cx,64000
  rep movsb 
  
  pop ax
  pop bx
  pop dx
  pop si  
  
  ;restore bp
  pop bp
  
  mov ax,@data
  mov ds,ax
  
endm
 
ik heb het probleem zelf af opgelost door het op te spiltsen in 3 macros
- 1 om 1 keer te tekenen
- een andere om te kopieren naar het videogeheugen
- de laatste om 4 keer dede eerste op te roepen en daarna de 1 keer de tweede
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan