-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfarblock.asm
108 lines (96 loc) · 4.71 KB
/
farblock.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
;---------------------------------------------------------------------------
;
; FARBLOCK.ASM
;
; Stand : 15.03.92
;
; Diese Funktion zeichnet einen Farbblock in einer beliebigen GrӇe und einer
; beliebigen Farbe auf den Bildschirm. Der Aufruf erfolgt folgerdermaáen:
;
; mov bl,SPALTEA
; mov bh,ZEILEA
; mov dl,SPALTEB
; mov dh,ZEILEB
; mov al,FARBE 0-000-0000 (Blink-hinter-vorder)
; CALL RAHMEN4
;
; bl = Spalte des linken Punktes
; bh = Zeile des oberen Punktes
; dl = Spalte des rechten Punktes
; dh = Zeile des unteren Punktes
; al = Farbe des Farbblockes
;
;---------------------------------------------------------------------------
.286
PUBLIC FARBLOCK
ASSUME CS:CODE,DS:CODE,SS:CODE,ES:BILD
BILD SEGMENT AT 0b800h
BILD ENDS
CODE SEGMENT
FARBLOCK proc Near
pusha ;Ax,Cx,Dx,Bx,Hilf,Bp,Si,Di
push es ;ES,
push ds ;DS alle Register aus Stack
mov cx,BILD ;Segmentanfang nach CX
mov es,cx ;und dann nach ES(b800h)
;---------------------------------------------------------------------------
xchg bh,dl ;vertausch BH mit DL Register
;---------------------------------------------------------------------------
push bx
Spalte_A_B:
shl bl,1 ;BL wird mit Zwei Multi.
shl bh,1 ;BH wird mit Zwei Multi.
;---------------------------------------------------------------------------
push ax ;sichere Wert fr Farbe aus Stack
Zeile_A: mov ax,160d ;160d (abstand einer Zeile)
mul dl ;Zeile A wird mit 160 multiplizier
mov si,ax ;sichere Wert nach SI (Zeile_A)
Zeile_B: mov ax,160d ;
mul dh ;Zeile B wird mit 160 multi.
mov di,ax ;sichere Wert nach DI (Zeile_B)
pop ax ;hole Farb-Wert vom Stack zurck
;---------------------------------------------------------------------------
Punkt_DI: push bx ;sichere BX (Spalte A_B)
xor bh,bh ;l”sche HI - Byte BH
mov dx,di ;Wert von DI nach DX
add dx,bx ;Addiere BX mit DX (Spalte A + Zeile B)
mov di,dx ;neuer Wert DX nach DI
pop bx ;hole alten Wert zurck
;---------------------------------------------------------------------------
Punkt_SI: push bx ;sicher BX (Spalte A-B)
xor bh,bh ;l”sche BH
mov dx,si ;Wert SI nach DX
add dx,bx ;Addiere DX mit BX (Spalte A + Zeile A)
mov si,dx ;DX nach SI
pop bx ;hole Wert BX vom Stack zurck
;--------------------------------------------------------------------------
pop bx ;hole ursprnglichen Wert zurck
Strecke: sub bh,bl ;subtrahiere Spalte B - Spalte A
xor bl,bl ;l”sche bl
xchg bh,bl ;vertausche BH mit BL
schleife1:mov cx,bx ;Strecke ins CX Reg.
push bx ;sichere Streckenwert auf Stack
;---------------------------------------------------------------------------
xor bx,bx ;l”sche BX fr Adressierung
add cx,1d
schleife: mov byte ptr es:[si+bx+1],al
inc bx
inc bx
loop schleife
;--------------------------------------------------------------------------
add si,160d ;wenn nicht rcke eine Zeile runter
cmp di,si
jb ende1 ;wenn kleiner dann Ende1
pop bx ;hole Wert fr CX vom Stack
jmp schleife1 ;gehe schleife1
;--------------------------------------------------------------------------
ende: pop ds ;ofizieles Ende
pop es ;ES Zurck
popa ;Di,Si,Bp,Hilf,Bx,Dx,Cx,Ax
ret ;Rcksprung zum Aufrufer
ende1: pop bx ;hole letzten Wert vom Stack sauberer
;Abgang
jmp ende ;gehe nach ende
FARBLOCK endp
CODE ENDS
END