View difference between Paste ID: deNyxJfB and 46y4dfyj
SHOW: | | - or go back to the newest paste.
1-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1+
2-
; ZoomDraw Routine for Screen 13h BSAVE ;
2+
3-
; Graphics                              ;
3+
4-
;                                       ;
4+
5-
; (C) Copyright Graham Downey 2016      ;
5+
6-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6+
7
8
			;Start pos on VRAM is [MinX + (MinY*320)]
9
MOV BX, WORD [BP+4+16]	;Get MinY
10-
PUSH BP
10+
11
ADD AX, WORD [BP+6+16]	;Get MinX
12
MOV DI, AX		;Set DI to start position for drawing
13
 
14
15
MOV DS, WORD [BP+12+16]    ;Bitmap Segment
16-
                        ;Start pos on VRAM is [MinX + (MinY*320)]
16+
MOV SI, WORD [BP+10+16]    ;Bitmap Address
17-
MOV BX, WORD [BP+6]     ;Get MinY
17+
18
MOV BX, WORD [SI]	;Read width*8
19-
ADD AX, WORD [BP+8]     ;Get MinX
19+
SHR BX, 3		;Shift bits right 3 (Same as divide by 8)
20-
MOV DI, AX              ;Set DI to start position for drawing
20+
21
SUB DX, BX		;BX = 320-width
22
MOV BH, BYTE [SI+2]	;Get height
23-
MOV DS, WORD [BP+14]    ;Bitmap Segment
23+
24-
MOV SI, WORD [BP+12]    ;Bitmap Address
24+
ADD SI, 4		;Goto bitmap pixels
25
26-
MOV BX, WORD [SI]       ;Read width*8
26+
27-
SHR BX, 3               ;Shift bits right 3 (Same as divide by 8)
27+
MOV AX, 0A000h		;Set screen Segment
28
MOV DS, AX
29-
SUB DX, BX              ;BX = 320-width
29+
mov AX, SS
30-
MOV BH, BYTE [SI+2]     ;Get height
30+
mov ES, AX
31
32-
ADD SI, 4               ;Goto bitmap pixels
32+
cli
33
MOV AL, BYTE [BP+8+16]	;Get scale mode
34-
MOV ES, WORD [BP+14]    ;Bitmap Segment
34+
MOV SS, WORD [BP+12+16]    ;Bitmap Segment
35
MOV BP, SI
36-
MOV AX, 0A000h          ;Set screen Segment
36+
37
CMP AL, 2
38
JE Zoomx2
39-
MOV AL, BYTE [BP+10]    ;Get scale mode
39+
40
JE Zoomx3
41
CMP AL, 4
42
JE Zoomx4
43
 
44
;;;;;;;;;;;;;;;;;;;;;;;;
45
; 2x Zoom Draw Routine ;
46
;;;;;;;;;;;;;;;;;;;;;;;;
47
Zoomx2:
48
ADD DX, Dx		;How many lines to skip
49
50
.NextY:
51-
ADD DX, Dx              ;How many lines to skip
51+
MOV CL, BL		;Set counter to X pixel amount
52
53
.NextX:
54-
MOV CL, BL              ;Set counter to X pixel amount
54+
MOV AL, [BP]       	;Read a pixel
55
MOV AH, AL
56
MOV [DI], AX     	;Draw first row
57-
MOV AL, [ES:SI]         ;Read a pixel
57+
MOV [DI+320], AX 	;Draw second row
58
INC BP
59-
MOV [DI], AX            ;Draw first row
59+
60-
MOV [DI+320], AX        ;Draw second row
60+
61-
INC SI
61+
DEC CL			;One pixel, still more?
62
JNZ .NextX		;Yes? Draw next pixel
63
ADD DI, DX		;Adjust target to next line
64-
DEC CL                  ;One pixel, still more?
64+
DEC BH			;One line done, still more?
65-
JNZ .NextX              ;Yes? Draw next pixel
65+
JNZ .NextY		;Yes? Go back until done
66-
ADD DI, DX              ;Adjust target to next line
66+
JMP End			;Done
67-
DEC BH                  ;One line done, still more?
67+
68-
JNZ .NextY              ;Yes? Go back until done
68+
69-
JMP End                 ;Done
69+
70
;;;;;;;;;;;;;;;;;;;;;;;;
71
Zoomx3:
72
IMUL DX, 3		;How far to move when finished a line
73
74
.NextY:
75-
IMUL DX, 3              ;How far to move when finished a line
75+
MOV CL, BL		;Set counter to x pixel amount
76
77
.NextX:
78-
MOV CL, BL              ;Set counter to x pixel amount
78+
MOV AL, [BP]		;Read a pixel
79
MOV AH, AL
80
MOV [DI], AX		;Draw first row
81-
MOV AL, [ES:SI]         ;Read a pixel
81+
82
MOV [DI+320], AX	;Draw second row
83-
MOV [DI], AX            ;Draw first row
83+
84
MOv [DI+640], AX	;Draw third row
85-
MOV [DI+320], AX        ;Draw second row
85+
86
INC BP
87-
MOv [DI+640], AX        ;Draw third row
87+
ADD DI, 3		;Move 3 pixels forward on screen
88
89-
INC SI
89+
DEC CL			;One pixel, still more?
90-
ADD DI, 3               ;Move 3 pixels forward on screen
90+
JNZ .NextX		;Yes? Draw next pixel
91
ADD DI, DX		;Adjust target to next line
92-
DEC CL                  ;One pixel, still more?
92+
DEC BH			;One line done, still more?
93-
JNZ .NextX              ;Yes? Draw next pixel
93+
JNZ .NextY		;Yes? Go back until done
94-
ADD DI, DX              ;Adjust target to next line
94+
JMP End			;Done
95-
DEC BH                  ;One line done, still more?
95+
96-
JNZ .NextY              ;Yes? Go back until done
96+
97-
JMP End                 ;Done
97+
98
; 4x Zoom Draw Routine ;
99
;;;;;;;;;;;;;;;;;;;;;;;;
100
Zoomx4:
101
SHL DX, 2		;How far to jump after a line
102
103
.NextY:
104-
SHL DX, 2               ;How far to jump after a line
104+
MOV CL, BL		;Set counter to x pixel amount
105
106
.NextX:
107-
MOV CL, BL              ;Set counter to x pixel amount
107+
MOV AL, [BP]		;Read a pixel
108
MOV AH, AL		;AX full for 2 pixel write
109
MOV SI, AX		;Copy AX to BP
110-
MOV AL, [ES:SI]         ;Read a pixel
110+
SHL EAX, 16		;Shift EAX over 2 bytes left
111-
MOV AH, AL              ;AX full for 2 pixel write
111+
MOV AX, SI		;Copy BP back to the newly free'd AX
112-
MOV BP, AX              ;Copy AX to BP
112+
MOV [DI], EAX		;Draw first row
113-
SHL EAX, 16             ;Shift EAX over 2 bytes left
113+
MOV [DI+320], EAX	;Draw second row
114-
MOV AX, BP              ;Copy BP back to the newly free'd AX
114+
MOV [DI+640], EAX	;Draw third row
115-
MOV [DI], EAX           ;Draw first row
115+
MOV [DI+960], EAX	;Draw fith row
116-
MOV [DI+320], EAX       ;Draw second row
116+
INC BP
117-
MOV [DI+640], EAX       ;Draw third row
117+
ADD DI, 4		;Move 4 pixels forward on screen
118-
MOV [DI+960], EAX       ;Draw fith row
118+
119-
INC SI
119+
DEC CL			;One pixel, still more?
120-
ADD DI, 4               ;Move 4 pixels forward on screen
120+
JNZ .NextX		;Yes? Draw next pixel
121
ADD DI, DX		;Adjust target to next line
122-
DEC CL                  ;One pixel, still more?
122+
DEC BH			;One line, still more?
123-
JNZ .NextX              ;Yes? Draw next pixel
123+
JNZ .NextY		;Yes? Repeat until done
124-
ADD DI, DX              ;Adjust target to next line
124+
125-
DEC BH                  ;One line, still more?
125+
126-
JNZ .NextY              ;Yes? Repeat until done
126+
mov AX, ES
127
mov SS, AX
128
sti
129
POP DS
130
POP ES
131
POPA
132-
POP BP
132+