144 lines
7.7 KiB
Text
144 lines
7.7 KiB
Text
1 ;ptree.asm 24-Aug-2025
|
|
2 ;translation of xpl0
|
|
3 ;Assemble with: tasm; tlink /t
|
|
4
|
|
5 0000 .model tiny
|
|
6 0000 .code
|
|
7 .486
|
|
8 org 100h
|
|
9 ;ax=0, bx=0, cx=00FFh, dx=cs, si=0100h, di=-2, bp=09xx, sp=-2
|
|
10 =0140 ScrW equ 320 ;screen width and height
|
|
11 =00C8 ScrH equ 200
|
|
12 0100 B0 13 start: mov al, 13h ;SetVid($13)
|
|
13 0102 CD 10 int 10h
|
|
14
|
|
15 0104 68 A000 push 0A000h ;es:= video memory segment
|
|
16 0107 07 pop es
|
|
17
|
|
18 ;DrawTree(9*ScrW/20, 3*ScrH/4, 11*ScrW/20, 3*ScrH/4, 0)
|
|
19 0108 68 9690 push 9*ScrW/20 + (3*ScrH/4)*100h
|
|
20 010B 68 96B0 push 11*ScrW/20 + (3*ScrH/4)*100h
|
|
21 010E 6A 2A push 0 + 2Ah ;Depth:= 0 + 2Ah (Color)
|
|
22 0110 E8 000A call DrawTree
|
|
23
|
|
24 0113 33 C0 xor ax, ax ;wait for keystroke
|
|
25 0115 CD 16 int 16h
|
|
26 0117 B8 0003 mov ax, 0003h ;restore text mode
|
|
27 011A CD 10 int 10h
|
|
28 011C C3 ret
|
|
29
|
|
30 ;------------------------------------------------------------
|
|
31 ;DrawTree(X1,Y1, X2,Y2, Depth)
|
|
32 ;
|
|
33 ;Offsets relative to bp:
|
|
34 =0008 P1 equ 8 ;equ X1,Y1
|
|
35 =0006 P2 equ 6 ;equ X2,Y2
|
|
36 =0004 Depth equ 4
|
|
37 ; ret equ 2
|
|
38 ; bp equ 0
|
|
39 =-0002 P3 equ -2 ;equ X3,Y3
|
|
40 =-0004 P4 equ -4 ;equ X4,Y4
|
|
41 =-0006 P5 equ -6 ;equ X5,Y5
|
|
42
|
|
43 011D DrawTree:
|
|
44 011D C8 0006 00 enter 3*2, 0 ;set up stack frame for P3, P4, P5
|
|
45
|
|
46 0121 83 7E 0 cmp word ptr [bp+Depth], 7 + 2Ah
|
|
47 0125 7D 62 jge dt90 ;limit depth of recursion
|
|
48
|
|
49 0127 8B 5E 0 mov bx, [bp+P1] ;Move(X1, Y1)
|
|
50 012A 8B 46 06 mov ax, [bp+P2]
|
|
51
|
|
52 012D 8A D0 mov dl, al ;DX:= X2 - X1;
|
|
53 012F 2A D3 sub dl, bl ;(DX # dx)
|
|
54 0131 8A F7 mov dh, bh ;DY:= Y1 - Y2
|
|
55 0133 2A F4 sub dh, ah
|
|
56
|
|
57 0135 2A C6 sub al, dh ;X3:= X2 - DY
|
|
58 0137 2A E2 sub ah, dl ;Y3:= Y2 - DX
|
|
59 0139 89 46 FE mov [bp+P3], ax
|
|
60
|
|
61 013C 8B C3 mov ax, bx
|
|
62 013E 2A C6 sub al, dh ;X4:= X1 - DY
|
|
63 0140 2A E2 sub ah, dl ;Y4:= Y1 - DX
|
|
64 0142 89 46 FC mov [bp+P4], ax
|
|
65
|
|
66 0145 52 push dx
|
|
67 0146 2A D6 sub dl, dh ;(DX-DY)/2
|
|
68 0148 D0 FA sar dl, 1
|
|
69 014A 02 C2 add al, dl ;X5:= X4 + (DX-DY)/2
|
|
70 014C 5A pop dx
|
|
71
|
|
72 014D 02 D6 add dl, dh ;(DX+DY)/2
|
|
73 014F D0 FA sar dl, 1
|
|
74 0151 2A E2 sub ah, dl ;Y5:= Y4 - (DX+DY)/2
|
|
75 0153 89 46 FA mov [bp+P5], ax
|
|
76
|
|
77 0156 8B 46 0 mov ax, [bp+P2] ;Line(X2, Y2, Color)
|
|
78 0159 E8 0031 call DrawLine
|
|
79 015C 8B 46 FE mov ax, [bp+P3] ;Line(X3, Y3, Color)
|
|
80 015F E8 002B call DrawLine
|
|
81 0162 8B 46 FC mov ax, [bp+P4] ;Line(X4, Y4, Color)
|
|
82 0165 E8 0025 call DrawLine
|
|
83 0168 8B 46 08 mov ax, [bp+P1] ;Line(X1, Y1, Color)
|
|
84 016B E8 001F call DrawLine
|
|
85
|
|
86 016E FF 76 F push word ptr [bp+P4] ;DrawTree(X4, Y4, X5, Y5, Depth+1)
|
|
87 0171 FF 76 FA push word ptr [bp+P5]
|
|
88 0174 FF 46 04 inc word ptr [bp+Depth]
|
|
89 0177 FF 76 04 push word ptr [bp+Depth]
|
|
90 017A E8 FFA0 call DrawTree
|
|
91
|
|
92 017D FF 76 F push word ptr [bp+P5] ;DrawTree(X5, Y5, X3, Y3, Depth+1)
|
|
93 0180 FF 76 FE push word ptr [bp+P3]
|
|
94 0183 FF 76 04 push word ptr [bp+Depth]
|
|
95 0186 E8 FF94 call DrawTree
|
|
96 0189 dt90:
|
|
97 0189 C9 leave ;release local variable stack frame
|
|
98 018A C2 0006 ret 3*2 ;drop 3 args
|
|
99
|
|
100 ;------------------------------------------------------------
|
|
101 ;Draw horizontal, vertical or diagonal line from X0,Y0 to X,Y
|
|
102 ; Line(X, Y, Color)
|
|
103 ; al=X; ah=Y; Color= 2Ah+[bp+Depth]
|
|
104 ; bl=X0; bh=Y0; di=Y0*ScrW+X0
|
|
105 ;
|
|
106 018D DrawLine:
|
|
107 018D 50 push ax ;save end of line X,Y
|
|
108
|
|
109 018E 33 F6 xor si, si ;Step:= 0
|
|
110 0190 2A E7 sub ah, bh ;DY:= Y - Y0
|
|
111 0192 74 09 je dl10 ;if DY # 0 then
|
|
112 0194 BE 0140 mov si, ScrW ; Step:= ScrW
|
|
113 0197 77 04 ja dl10 ; if DY < 0 then
|
|
114 0199 F7 DE neg si ; Step:= -ScrW
|
|
115 019B F6 DC neg ah ; abs(DY)
|
|
116 019D 2A C3 dl10: sub al, bl ;DX:= X - X0
|
|
117 019F 74 07 je dl20 ;if DX # 0 then
|
|
118 01A1 77 04 ja dl15 ; if DX < 0 then
|
|
119 01A3 4E dec si ; Step--
|
|
120 01A4 F6 D8 neg al ; abs(DX)
|
|
121 01A6 3C db 3Ch ; cmp al, imm; skips one byte
|
|
122 01A7 46 dl15: inc si ; else Step++
|
|
123 01A8 dl20:
|
|
124 01A8 0F B6 FF movzx di, bh ;di:= Y1*ScrW + X1
|
|
125 01AB 69 FF 0140 imul di, ScrW
|
|
126 01AF 0F B6 DB movzx bx, bl
|
|
127 01B2 03 FB add di, bx
|
|
128
|
|
129 01B4 5B pop bx ;X0:= X; Y0:= Y; = new end of line
|
|
130
|
|
131 01B5 8A CC mov cl, ah ;cl:= Max(DY,DX)
|
|
132 01B7 3A E0 cmp ah, al
|
|
133 01B9 73 02 jae dl70
|
|
134 01BB 8A C8 mov cl, al
|
|
135 01BD dl70:
|
|
136 01BD 8A 46 04 mov al, [bp+Depth] ;Color:= $2A + Depth
|
|
137 01C0 AA dl80: stosb ;es:[di++]:= al
|
|
138 01C1 4F dec di ;undo di++
|
|
139 01C2 03 FE add di, si ;+ Step
|
|
140 01C4 E2 FA loop dl80 ;cx--
|
|
141 01C6 AA stosb ;draw end point
|
|
142 01C7 dl90:
|
|
143 01C7 C3 ret
|
|
144 end start
|