Forum » Programiranje » assebmler risanje črte
assebmler risanje črte
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Monster ::
kok prek assemblerja(kodo bi prosu) narisat črto čez cel ekran(belo črto), prek BIOSOVIH interupih. Rposu bi za kodo za mal komentov :))). Hvala
Ka zaboga...
![](https://static.slo-tech.com/stili/avatar_gray.gif)
vuego ::
Pozdrav.
Risanje črt v assemblerju ni tako preprosto opravilo. Nisi povedal, če rabiš samo horizontalno črto, na kakšni resoluciji, kako in še vse ostale podatke.
Me pa tale post spominja na tiste čase demo programiranja v 320x200 in vse bolj ali manj optimizirane rutine.
Sploh pa se preko biosa takrat ni risalo. Vseskupaj je bilo direkt v memorijo - na screen $A000 oz na virtualne screene.
Tukaj je ena od njih (pascal assembler 32bit), nekomentirana, zelo hitra in najpomembneje večkrat preizkušena. Če ti kaj pomaga, pa presodi sam.
Procedure XLine(X1,Y1,X2,Y2 : Integer; Color : Byte; VideoSeg : Word); Assembler;
Var
XX1,XX2 : LongInt;
YY1,YY2 : LongInt;
DDX,DDY : LongInt;
X,Y : LongInt;
LastX : Integer;
LastY : Integer;
Asm
MOV DX,[Y1]
CMP DX,[Y2]
JNE @@NONHORIZ
TEST DX,DX
JL @@EXIT
CMP DX,199
JG @@EXIT
MOV AX,[X1]
MOV BX,[X2]
CMP AX,BX
JLE @@OK1
XCHG AX,BX
@@OK1:
CMP AX,319
JG @@EXIT
TEST BX,BX
JL @@EXIT
TEST AX,AX
JGE @@OK2
SUB AX,AX
@@OK2:
MOV CX,BX
CMP CX,319
JLE @@OK3
MOV CX,319
@@OK3:
SUB CX,AX
INC CX
MOV DI,DX
SHL DI,6
SHL DX,8
ADD DI,DX
ADD DI,AX
MOV ES,[VideoSeg]
MOV AL,[Color]
MOV AH,AL
MOV BX,AX
DB $66; SHL AX,16
MOV AX,BX
CLD
SHR CX,1
DB $0F, $92, $C3 { SETC BL }
SHR CX,1
DB $66; REP STOSW
JNC @@SKIP1
STOSW
@@SKIP1:
OR BL,BL
JZ @@SKIP2
STOSB
@@SKIP2:
JMP @@EXIT
@@NONHORIZ:
MOV DX,[X1]
CMP DX,[X2]
JNE @@NONVERTIC
MOV DX,[X1]
TEST DX,DX
JL @@EXIT
CMP DX,319
JG @@EXIT
MOV AX,[Y1]
MOV BX,[Y2]
CMP AX,BX
JLE @@OK4
XCHG AX,BX
@@OK4:
CMP AX,199
JG @@EXIT
TEST BX,BX
JL @@EXIT
TEST AX,AX
JGE @@OK5
SUB AX,AX
@@OK5:
MOV CX,BX
CMP CX,199
JLE @@OK6
MOV CX,199
@@OK6:
SUB CX,AX
INC CX
MOV DI,AX
SHL DI,6
SHL AX,8
ADD DI,AX
ADD DI,DX
MOV ES,[VideoSeg]
MOV AL,[Color]
@@LOOP:
MOV [ES:DI],AL
ADD DI,320
DEC CX
JNZ @@LOOP
JMP @@EXIT
@@NONVERTIC:
MOV AX,[Y2]
SUB AX,[Y1]
JNS @@OK6_1
NEG AX
@@OK6_1:
MOV BX,[X2]
SUB BX,[X1]
JNS @@OK6_2
NEG BX
@@OK6_2:
CMP AX,BX
JLE @@LINE_2
MOV AX,[Y1]
CMP AX,[Y2]
JLE @@OK7
XCHG AX,[Y2]
MOV [Y1],AX
MOV AX,[X1]
XCHG AX,[X2]
MOV [X1],AX
@@OK7:
DB $66; DB $0F, $BF, $5E, OFFSET X1 { MOVSX EAX,[WORD PTR Y1] }
DB $66; SHL BX,Scaler
DB $66; MOV [WORD PTR XX1],BX
DB $66; DB $0F, $BF, $46, OFFSET X2 { MOVSX EAX,[WORD PTR Y2] }
DB $66; SHL AX,Scaler
DB $66; MOV [WORD PTR XX2],AX
DB $66; SUB AX,BX
DB $66; CWD
DB $66; DB $0F, $BF, $5E, OFFSET Y2
DB $66; DB $0F, $BF, $4E, OFFSET Y1
DB $66; SUB BX,CX
DB $66; IDIV BX
DB $66; MOV [WORD PTR DDX],AX
MOV AX,[X1]
TEST AX,AX
JGE @@OK8
SUB AX,AX
@@OK8:
CMP AX,319
JLE @@OK8_2
MOV AX,319
@@OK8_2:
MOV [LASTX],AX
MOV DI,AX
MOV AX,[Y1]
TEST AX,AX
JGE @@OK9
SUB AX,AX
@@OK9:
CMP AX,199
JLE @@OK9_2
MOV AX,199
@@OK9_2:
MOV BX,AX
SHL AX,6
SHL BX,8
ADD DI,AX
ADD DI,BX
MOV DX,[Y1]
MOV CL,[Color]
MOV ES,[VideoSeg]
DB $66; MOV BX,[WORD PTR XX1]
DB $66; MOV SI,[WORD PTR DDX]
@@LOOP2:
DB $66; MOV AX,BX
DB $66; SAR AX,Scaler
JNC @@NOTROUND
DB $66; INC AX
@@NOTROUND:
CMP AX,0
JL @@NEXTPIXEL
CMP AX,319
JG @@NEXTPIXEL
CMP AX,[LASTX]
JE @@OK10
JG @@GORIGHT
DEC DI
JMP @@ADJUSTED
@@GORIGHT:
INC DI
@@ADJUSTED:
MOV [LASTX],AX
@@OK10:
CMP DX,0
JL @@NEXTPIXEL
CMP DX,199
JG @@EXIT
MOV [ES:DI],CL
@@NEXTPIXEL:
CMP DX,0
JL @@NEXTHORZ
CMP DX,199
JG @@EXIT
ADD DI,320
@@NEXTHORZ:
DB $66; ADD BX,SI
INC DX
CMP DX,[Y2]
JLE @@LOOP2
JMP @@EXIT
@@LINE_2:
MOV AX,[X1]
CMP AX,[X2]
JLE @@OK7_2
XCHG AX,[X2]
MOV [X1],AX
MOV AX,[Y1]
XCHG AX,[Y2]
MOV [Y1],AX
@@OK7_2:
DB $66; DB $0F, $BF, $5E, OFFSET Y1 { MOVSX EAX,[WORD PTR Y1] }
DB $66; SHL BX,Scaler
DB $66; MOV [WORD PTR YY1],BX
DB $66; DB $0F, $BF, $46, OFFSET Y2 { MOVSX EAX,[WORD PTR Y2] }
DB $66; SHL AX,Scaler
DB $66; MOV [WORD PTR YY2],AX
DB $66; SUB AX,BX
DB $66; CWD
DB $66; DB $0F, $BF, $5E, OFFSET X2
DB $66; DB $0F, $BF, $4E, OFFSET X1
DB $66; SUB BX,CX
DB $66; IDIV BX
DB $66; MOV [WORD PTR DDY],AX
MOV AX,[X1]
TEST AX,AX
JGE @@OK8_3
SUB AX,AX
@@OK8_3:
MOV DI,AX
MOV AX,[Y1]
TEST AX,AX
JGE @@OK9_3
SUB AX,AX
@@OK9_3:
CMP AX,199
JLE @@OK9_4
MOV AX,199
@@OK9_4:
MOV [LASTY],AX
MOV BX,AX
SHL AX,6
SHL BX,8
ADD DI,AX
ADD DI,BX
MOV DX,[X1]
MOV CL,[Color]
MOV ES,[VideoSeg]
DB $66; MOV BX,[WORD PTR YY1]
DB $66; MOV SI,[WORD PTR DDY]
@@LOOP3:
DB $66; MOV AX,BX
DB $66; SAR AX,Scaler
JNC @@NOTROUND2
DB $66; INC AX
@@NOTROUND2:
CMP AX,0
JL @@NEXTPIXEL2
CMP AX,199
JG @@NEXTPIXEL2
CMP AX,[LASTY]
JE @@OK10_2
JG @@GODOWN
SUB DI,320
JMP @@ADJUSTED2
@@GODOWN:
ADD DI,320
@@ADJUSTED2:
MOV [LASTY],AX
@@OK10_2:
CMP DX,0
JL @@NEXTPIXEL2
CMP DX,319
JG @@EXIT
MOV [ES:DI],CL
@@NEXTPIXEL2:
CMP DX,0
JL @@NEXTVERT
CMP DX,319
JG @@EXIT
INC DI
@@NEXTVERT:
DB $66; ADD BX,SI
INC DX
CMP DX,[X2]
JLE @@LOOP3
@@EXIT:
End;
Risanje črt v assemblerju ni tako preprosto opravilo. Nisi povedal, če rabiš samo horizontalno črto, na kakšni resoluciji, kako in še vse ostale podatke.
Me pa tale post spominja na tiste čase demo programiranja v 320x200 in vse bolj ali manj optimizirane rutine.
Sploh pa se preko biosa takrat ni risalo. Vseskupaj je bilo direkt v memorijo - na screen $A000 oz na virtualne screene.
Tukaj je ena od njih (pascal assembler 32bit), nekomentirana, zelo hitra in najpomembneje večkrat preizkušena. Če ti kaj pomaga, pa presodi sam.
Procedure XLine(X1,Y1,X2,Y2 : Integer; Color : Byte; VideoSeg : Word); Assembler;
Var
XX1,XX2 : LongInt;
YY1,YY2 : LongInt;
DDX,DDY : LongInt;
X,Y : LongInt;
LastX : Integer;
LastY : Integer;
Asm
MOV DX,[Y1]
CMP DX,[Y2]
JNE @@NONHORIZ
TEST DX,DX
JL @@EXIT
CMP DX,199
JG @@EXIT
MOV AX,[X1]
MOV BX,[X2]
CMP AX,BX
JLE @@OK1
XCHG AX,BX
@@OK1:
CMP AX,319
JG @@EXIT
TEST BX,BX
JL @@EXIT
TEST AX,AX
JGE @@OK2
SUB AX,AX
@@OK2:
MOV CX,BX
CMP CX,319
JLE @@OK3
MOV CX,319
@@OK3:
SUB CX,AX
INC CX
MOV DI,DX
SHL DI,6
SHL DX,8
ADD DI,DX
ADD DI,AX
MOV ES,[VideoSeg]
MOV AL,[Color]
MOV AH,AL
MOV BX,AX
DB $66; SHL AX,16
MOV AX,BX
CLD
SHR CX,1
DB $0F, $92, $C3 { SETC BL }
SHR CX,1
DB $66; REP STOSW
JNC @@SKIP1
STOSW
@@SKIP1:
OR BL,BL
JZ @@SKIP2
STOSB
@@SKIP2:
JMP @@EXIT
@@NONHORIZ:
MOV DX,[X1]
CMP DX,[X2]
JNE @@NONVERTIC
MOV DX,[X1]
TEST DX,DX
JL @@EXIT
CMP DX,319
JG @@EXIT
MOV AX,[Y1]
MOV BX,[Y2]
CMP AX,BX
JLE @@OK4
XCHG AX,BX
@@OK4:
CMP AX,199
JG @@EXIT
TEST BX,BX
JL @@EXIT
TEST AX,AX
JGE @@OK5
SUB AX,AX
@@OK5:
MOV CX,BX
CMP CX,199
JLE @@OK6
MOV CX,199
@@OK6:
SUB CX,AX
INC CX
MOV DI,AX
SHL DI,6
SHL AX,8
ADD DI,AX
ADD DI,DX
MOV ES,[VideoSeg]
MOV AL,[Color]
@@LOOP:
MOV [ES:DI],AL
ADD DI,320
DEC CX
JNZ @@LOOP
JMP @@EXIT
@@NONVERTIC:
MOV AX,[Y2]
SUB AX,[Y1]
JNS @@OK6_1
NEG AX
@@OK6_1:
MOV BX,[X2]
SUB BX,[X1]
JNS @@OK6_2
NEG BX
@@OK6_2:
CMP AX,BX
JLE @@LINE_2
MOV AX,[Y1]
CMP AX,[Y2]
JLE @@OK7
XCHG AX,[Y2]
MOV [Y1],AX
MOV AX,[X1]
XCHG AX,[X2]
MOV [X1],AX
@@OK7:
DB $66; DB $0F, $BF, $5E, OFFSET X1 { MOVSX EAX,[WORD PTR Y1] }
DB $66; SHL BX,Scaler
DB $66; MOV [WORD PTR XX1],BX
DB $66; DB $0F, $BF, $46, OFFSET X2 { MOVSX EAX,[WORD PTR Y2] }
DB $66; SHL AX,Scaler
DB $66; MOV [WORD PTR XX2],AX
DB $66; SUB AX,BX
DB $66; CWD
DB $66; DB $0F, $BF, $5E, OFFSET Y2
DB $66; DB $0F, $BF, $4E, OFFSET Y1
DB $66; SUB BX,CX
DB $66; IDIV BX
DB $66; MOV [WORD PTR DDX],AX
MOV AX,[X1]
TEST AX,AX
JGE @@OK8
SUB AX,AX
@@OK8:
CMP AX,319
JLE @@OK8_2
MOV AX,319
@@OK8_2:
MOV [LASTX],AX
MOV DI,AX
MOV AX,[Y1]
TEST AX,AX
JGE @@OK9
SUB AX,AX
@@OK9:
CMP AX,199
JLE @@OK9_2
MOV AX,199
@@OK9_2:
MOV BX,AX
SHL AX,6
SHL BX,8
ADD DI,AX
ADD DI,BX
MOV DX,[Y1]
MOV CL,[Color]
MOV ES,[VideoSeg]
DB $66; MOV BX,[WORD PTR XX1]
DB $66; MOV SI,[WORD PTR DDX]
@@LOOP2:
DB $66; MOV AX,BX
DB $66; SAR AX,Scaler
JNC @@NOTROUND
DB $66; INC AX
@@NOTROUND:
CMP AX,0
JL @@NEXTPIXEL
CMP AX,319
JG @@NEXTPIXEL
CMP AX,[LASTX]
JE @@OK10
JG @@GORIGHT
DEC DI
JMP @@ADJUSTED
@@GORIGHT:
INC DI
@@ADJUSTED:
MOV [LASTX],AX
@@OK10:
CMP DX,0
JL @@NEXTPIXEL
CMP DX,199
JG @@EXIT
MOV [ES:DI],CL
@@NEXTPIXEL:
CMP DX,0
JL @@NEXTHORZ
CMP DX,199
JG @@EXIT
ADD DI,320
@@NEXTHORZ:
DB $66; ADD BX,SI
INC DX
CMP DX,[Y2]
JLE @@LOOP2
JMP @@EXIT
@@LINE_2:
MOV AX,[X1]
CMP AX,[X2]
JLE @@OK7_2
XCHG AX,[X2]
MOV [X1],AX
MOV AX,[Y1]
XCHG AX,[Y2]
MOV [Y1],AX
@@OK7_2:
DB $66; DB $0F, $BF, $5E, OFFSET Y1 { MOVSX EAX,[WORD PTR Y1] }
DB $66; SHL BX,Scaler
DB $66; MOV [WORD PTR YY1],BX
DB $66; DB $0F, $BF, $46, OFFSET Y2 { MOVSX EAX,[WORD PTR Y2] }
DB $66; SHL AX,Scaler
DB $66; MOV [WORD PTR YY2],AX
DB $66; SUB AX,BX
DB $66; CWD
DB $66; DB $0F, $BF, $5E, OFFSET X2
DB $66; DB $0F, $BF, $4E, OFFSET X1
DB $66; SUB BX,CX
DB $66; IDIV BX
DB $66; MOV [WORD PTR DDY],AX
MOV AX,[X1]
TEST AX,AX
JGE @@OK8_3
SUB AX,AX
@@OK8_3:
MOV DI,AX
MOV AX,[Y1]
TEST AX,AX
JGE @@OK9_3
SUB AX,AX
@@OK9_3:
CMP AX,199
JLE @@OK9_4
MOV AX,199
@@OK9_4:
MOV [LASTY],AX
MOV BX,AX
SHL AX,6
SHL BX,8
ADD DI,AX
ADD DI,BX
MOV DX,[X1]
MOV CL,[Color]
MOV ES,[VideoSeg]
DB $66; MOV BX,[WORD PTR YY1]
DB $66; MOV SI,[WORD PTR DDY]
@@LOOP3:
DB $66; MOV AX,BX
DB $66; SAR AX,Scaler
JNC @@NOTROUND2
DB $66; INC AX
@@NOTROUND2:
CMP AX,0
JL @@NEXTPIXEL2
CMP AX,199
JG @@NEXTPIXEL2
CMP AX,[LASTY]
JE @@OK10_2
JG @@GODOWN
SUB DI,320
JMP @@ADJUSTED2
@@GODOWN:
ADD DI,320
@@ADJUSTED2:
MOV [LASTY],AX
@@OK10_2:
CMP DX,0
JL @@NEXTPIXEL2
CMP DX,319
JG @@EXIT
MOV [ES:DI],CL
@@NEXTPIXEL2:
CMP DX,0
JL @@NEXTVERT
CMP DX,319
JG @@EXIT
INC DI
@@NEXTVERT:
DB $66; ADD BX,SI
INC DX
CMP DX,[X2]
JLE @@LOOP3
@@EXIT:
End;
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Brane2 ::
Monster:
Nafehtaj ksnga soseda al prijatla, ki ima stare stevilke edine racunalniske revije "Racunari".
Tam jevse lepo razloženo, pa tud algoritni in programi niso debilni.
Drugace pa poisci na netu "Bresenheim algorithm", ki je nekako najhitrejsi v navadnih situacijah....
Ahh, vse skupaj me spominja na otrostvo, ko sem hotu iz svoje megamashine "QL"-a (Sinclairjevo čudo, naslednik spectruma, celih 128 Kb RAM, dva microdrivea s po 128 Kb vsak) nardit CAD program za risanje tiskanih vezij....
Ena prvih rutin, s kero sem se namatru, je blo valjda risane vektorjev. To je bil moj prvi program v assemblerju sploh!
Tok kcajta sem se drku s tem, dokler ni bil- mislim da celih 14x hitrejsi od Sinclairjevga...
Kljub vsemu nisem naredu Bresenheima, ampak neko svoje cudo...
Ehh, 68000-ka je bla stroj, ni kej...
Nafehtaj ksnga soseda al prijatla, ki ima stare stevilke edine racunalniske revije "Racunari".
Tam jevse lepo razloženo, pa tud algoritni in programi niso debilni.
Drugace pa poisci na netu "Bresenheim algorithm", ki je nekako najhitrejsi v navadnih situacijah....
Ahh, vse skupaj me spominja na otrostvo, ko sem hotu iz svoje megamashine "QL"-a (Sinclairjevo čudo, naslednik spectruma, celih 128 Kb RAM, dva microdrivea s po 128 Kb vsak) nardit CAD program za risanje tiskanih vezij....
Ena prvih rutin, s kero sem se namatru, je blo valjda risane vektorjev. To je bil moj prvi program v assemblerju sploh!
Tok kcajta sem se drku s tem, dokler ni bil- mislim da celih 14x hitrejsi od Sinclairjevga...
Kljub vsemu nisem naredu Bresenheima, ampak neko svoje cudo...
Ehh, 68000-ka je bla stroj, ni kej...
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Monster ::
hvala za odziv sm sem jest mal totalni begienr za assebmler(btw vete za kake dobre tutoriale), prek biosa bi rad delu zato(se envem e se tk reče), kr bi rad da bi bli program neodvisem od OSa pa da bi bin-arno skompilu...
Ka zaboga...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | program v zbirnikuOddelek: Programiranje | 1952 (1715) | Spura |
» | Firefox vrača 64-bitno verzijo za WindowsOddelek: Novice / Brskalniki | 9101 (7028) | techfreak :) |
» | GrafikaOddelek: Programiranje | 1721 (1073) | aaaaa93 |
» | [ASM] Pomoč, ne najdem napakeOddelek: Programiranje | 1119 (995) | c0dehunter |
» | [Naloge]ProblemOddelek: Programiranje | 1900 (1543) | OwcA |