     1                                  ; ****************************************************************************
     2                                  ; circle2.s - TRDOS 386 (TRDOS v2.0.3) Test Program - 'sysvideo' pixel tests
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 14/02/2021
     6                                  ;
     7                                  ; ****************************************************************************
     8                                  ; nasm circle2.s -l circle2.txt -o CIRCLE2.PRG -Z error.txt
     9                                  ; (modified from 'circle1.s', 14/02/2021)
    10                                  
    11                                  ; Draw circle by using 'sysvideo' bh=3 (VESA VBE mode version)
    12                                  
    13                                  ; 14/07/2020
    14                                  ; 31/12/2017
    15                                  ; TRDOS 386 (v2.0) system calls
    16                                  _ver 	equ 0
    17                                  _exit 	equ 1
    18                                  _fork 	equ 2
    19                                  _read 	equ 3
    20                                  _write	equ 4
    21                                  _open	equ 5
    22                                  _close 	equ 6
    23                                  _wait 	equ 7
    24                                  _create	equ 8
    25                                  _rename	equ 9
    26                                  _delete	equ 10
    27                                  _exec	equ 11
    28                                  _chdir	equ 12
    29                                  _time 	equ 13
    30                                  _mkdir 	equ 14
    31                                  _chmod	equ 15
    32                                  _rmdir	equ 16
    33                                  _break	equ 17
    34                                  _drive	equ 18
    35                                  _seek	equ 19
    36                                  _tell 	equ 20
    37                                  _memory	equ 21
    38                                  _prompt	equ 22
    39                                  _path	equ 23
    40                                  _env	equ 24
    41                                  _stime	equ 25
    42                                  _quit	equ 26	
    43                                  _intr	equ 27
    44                                  _dir	equ 28
    45                                  _emt 	equ 29
    46                                  _ldrvt 	equ 30
    47                                  _video 	equ 31
    48                                  _audio	equ 32
    49                                  _timer	equ 33
    50                                  _sleep	equ 34
    51                                  _msg    equ 35
    52                                  _geterr	equ 36
    53                                  _fpstat	equ 37
    54                                  _pri	equ 38
    55                                  _rele	equ 39
    56                                  _fff	equ 40
    57                                  _fnf	equ 41
    58                                  _alloc	equ 42
    59                                  _dalloc equ 43
    60                                  _calbac equ 44
    61                                  _dma	equ 45	
    62                                  
    63                                  %macro sys 1-4
    64                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    65                                      ; 03/09/2015	
    66                                      ; 13/04/2015
    67                                      ; Retro UNIX 386 v1 system call.		
    68                                      %if %0 >= 2   
    69                                          mov ebx, %2
    70                                          %if %0 >= 3    
    71                                              mov ecx, %3
    72                                              %if %0 = 4
    73                                                 mov edx, %4   
    74                                              %endif
    75                                          %endif
    76                                      %endif
    77                                      mov eax, %1
    78                                      ;int 30h
    79                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    80                                  %endmacro
    81                                  
    82                                  ; Retro UNIX 386 v1 system call format:
    83                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    84                                  
    85                                  [BITS 32] ; We need 32-bit intructions for protected mode
    86                                  
    87                                  [ORG 0] 
    88                                  
    89                                  START_CODE:
    90                                  	; clear bss
    91 00000000 BF[8C050000]            	mov	edi, bss_start
    92 00000005 B908020000              	mov	ecx, (bss_end - bss_start)/4
    93                                  	;xor	eax, eax
    94 0000000A F3AB                    	rep	stosd
    95                                  
    96                                  	; program message
    97 0000000C BE[40040000]            	mov	esi, program_msg
    98 00000011 E8D4010000              	call	print_msg
    99                                  
   100 00000016 30E4                    	xor	ah, ah
   101                                  	;int	16h	; KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
   102                                  			; Return: AH = scan code, AL = character
   103 00000018 CD32                    	int	32h	; TRDOS 386 Keyboard interrupt 
   104                                  
   105                                  	; edx = 0 (do not return LFB Info)
   106                                  
   107                                  	; Set Video Mode to 101h ; 640x480, 256 colors
   108                                  	sys	_video, 08FFh, 101h
   108                              <1> 
   108                              <1> 
   108                              <1> 
   108                              <1> 
   108                              <1>  %if %0 >= 2
   108 0000001A BBFF080000          <1>  mov ebx, %2
   108                              <1>  %if %0 >= 3
   108 0000001F B901010000          <1>  mov ecx, %3
   108                              <1>  %if %0 = 4
   108                              <1>  mov edx, %4
   108                              <1>  %endif
   108                              <1>  %endif
   108                              <1>  %endif
   108 00000024 B81F000000          <1>  mov eax, %1
   108                              <1> 
   108 00000029 CD40                <1>  int 40h
   109 0000002B 09C0                    	or	eax, eax
   110                                  	;jz	short terminate
   111                                  	;mov	[LFB_ADDR], edx ; pointer to LFB info table/structure
   112 0000002D 744D                    	jz	short terminate
   113                                  
   114                                  set_vesa_mode_101h_ok:
   115                                  	; Set squares of number from 0 to 255
   116 0000002F BF[8C050000]            	mov	edi, _squares
   117 00000034 B900010000              	mov	ecx, 256
   118 00000039 BB01000000              	mov	ebx, 1
   119                                  _ss_x:
   120 0000003E 89D8                    	mov	eax, ebx
   121 00000040 F7E3                    	mul	ebx
   122 00000042 AB                      	stosd
   123 00000043 43                      	inc	ebx
   124 00000044 E2F8                    	loop	_ss_x
   125                                  reset_color:
   126 00000046 C605[98090000]8E        	mov	byte [color], 142 ; initial color
   127                                  reset_diameter:
   128 0000004D B8F0000000              	mov	eax, 240 ; initial diameter 
   129                                  newdiameter:	
   130                                  	; Set radius to 240
   131                                  	;mov	dword [radius], 240
   132                                  	;mov	dword [_r2], 57600
   133 00000052 A3[90090000]            	mov	[radius], eax
   134 00000057 89C3                    	mov	ebx, eax
   135 00000059 F7E3                    	mul	ebx
   136 0000005B A3[94090000]            	mov	[_r2], eax ; square of circle radius
   137                                  	; x2+y2 = r2	
   138                                  	; Set Y values for X values from 1 to Radius - 1
   139 00000060 BF[AC090000]            	mov	edi, _fx
   140                                  _yy_x:	
   141 00000065 4B                      	dec	ebx
   142 00000066 7422                    	jz	short center
   143 00000068 89D8                    	mov	eax, ebx
   144 0000006A F7E0                    	mul	eax
   145                                  	; eax = square of ebx
   146 0000006C 8B15[94090000]          	mov	edx, [_r2]
   147 00000072 29C2                    	sub	edx, eax
   148 00000074 E8A6030000              	call	get_squareroot
   149 00000079 AB                      	stosd
   150 0000007A EBE9                    	jmp	short _yy_x
   151                                  
   152                                  	; ***
   153                                  
   154                                  terminate:
   155 0000007C E8B8030000              	call	set_text_mode
   156                                  	sys	_exit
   156                              <1> 
   156                              <1> 
   156                              <1> 
   156                              <1> 
   156                              <1>  %if %0 >= 2
   156                              <1>  mov ebx, %2
   156                              <1>  %if %0 >= 3
   156                              <1>  mov ecx, %3
   156                              <1>  %if %0 = 4
   156                              <1>  mov edx, %4
   156                              <1>  %endif
   156                              <1>  %endif
   156                              <1>  %endif
   156 00000081 B801000000          <1>  mov eax, %1
   156                              <1> 
   156 00000086 CD40                <1>  int 40h
   157                                  halt:
   158 00000088 EBFE                    	jmp	short halt
   159                                  
   160                                  	; ***
   161                                  
   162                                  	; move circle to center of screen
   163                                  center:
   164 0000008A E8D9020000              	call	movecenter
   165                                  _0:
   166 0000008F E867010000              	call	drawcircle
   167                                  waitforkey:
   168 00000094 B401                    	mov	ah, 1
   169 00000096 CD32                    	int	32h
   170 00000098 740A                    	jz	short getkey
   171 0000009A 66FF05[8C090000]        	inc	word [counter]
   172 000000A1 90                      	nop
   173 000000A2 EBF0                    	jmp	short waitforkey
   174                                  getkey:
   175 000000A4 30E4                    	xor	ah, ah
   176 000000A6 CD32                    	int	32h
   177                                  
   178 000000A8 663D032E                	cmp	ax, 2E03h
   179 000000AC 74CE                    	je	short terminate
   180 000000AE 3C1B                    	cmp	al, 1Bh ; ESC key
   181 000000B0 74CA                    	je	short terminate	
   182                                  
   183 000000B2 3C2B                    	cmp	al, '+'
   184 000000B4 7511                    	jne	short _1
   185                                  	
   186 000000B6 A1[90090000]            	mov	eax, [radius]
   187                                  
   188 000000BB 3CEF                    	cmp	al, 239
   189 000000BD 734C                    	jnb	short _3_  ; beep
   190                                  	
   191                                  	; delete circle by drawing black circle
   192                                  	; with same diameter and at same coordinate
   193 000000BF E833030000              	call	black_circle
   194                                  	; increase radius of the circle
   195 000000C4 40                      	inc	eax	
   196                                  	;mov	[radius], eax
   197 000000C5 EB8B                    	jmp	newdiameter ; draw with new diameter
   198                                  _1:
   199 000000C7 3C2D                    	cmp	al, '-'
   200 000000C9 7514                    	jne	short _2
   201                                  
   202 000000CB A1[90090000]            	mov	eax, [radius]
   203                                  
   204 000000D0 3C01                    	cmp	al, 1
   205 000000D2 7637                    	jna	short _3_ ; beep
   206                                  	
   207                                  	; delete circle by drawing black circle
   208                                  	; with same diameter and at same coordinate
   209 000000D4 E81E030000              	call	black_circle
   210                                  	; decrease radius of the circle
   211 000000D9 48                      	dec	eax	
   212                                  	;mov	[radius], eax
   213 000000DA E973FFFFFF              	jmp	newdiameter ; draw with new diameter
   214                                  _2:
   215 000000DF 3C20                    	cmp	al, 20h  ; space
   216 000000E1 7509                    	jne	short _3
   217 000000E3 8005[98090000]08        	add	byte [color], 8 	
   218 000000EA EBA3                    	jmp	short _0
   219                                  _3:
   220 000000EC 80FC4B                  	cmp	ah, 4Bh
   221 000000EF 7521                    	jne	short _4
   222                                  	; left arrow
   223 000000F1 A1[90090000]            	mov	eax, [radius]
   224 000000F6 3B05[9C090000]          	cmp	eax, [_x0]
   225 000000FC 730D                    	jnb	short _3_
   226 000000FE E8F4020000              	call	black_circle ; clear current position 
   227 00000103 FF0D[9C090000]          	dec	dword [_x0]
   228 00000109 EB84                    	jmp	_0 ; draw 
   229                                  _3_:
   230 0000010B E8FD020000              	call	beep
   231 00000110 EB82                    	jmp	waitforkey
   232                                  _4:
   233 00000112 80FC4D                  	cmp	ah, 4Dh
   234 00000115 7522                    	jne	short _5
   235                                  
   236                                  	; right arrow
   237 00000117 A1[90090000]            	mov	eax, [radius]
   238 0000011C 0305[9C090000]          	add	eax, [_x0]
   239 00000122 3D7F020000              	cmp	eax, 639
   240 00000127 73E2                    	jnb	short _3_
   241 00000129 E8C9020000              	call	black_circle ; clear current position 
   242 0000012E FF05[9C090000]          	inc	dword [_x0]
   243 00000134 E956FFFFFF              	jmp	_0 ; draw 
   244                                  _5:
   245 00000139 80FC50                  	cmp	ah, 50h
   246 0000013C 7522                    	jne	short _6
   247                                  	; down arrow
   248 0000013E A1[90090000]            	mov	eax, [radius]
   249 00000143 0305[A0090000]          	add	eax, [_y0]
   250 00000149 3DDF010000              	cmp	eax, 479
   251 0000014E 73BB                    	jnb	short _3_
   252 00000150 E8A2020000              	call	black_circle ; clear current position 
   253 00000155 FF05[A0090000]          	inc	dword [_y0]
   254 0000015B E92FFFFFFF              	jmp	_0 ; draw 
   255                                  _6:
   256 00000160 80FC48                  	cmp	ah, 48h
   257 00000163 751D                    	jne	short _7
   258                                  	; up arrow
   259 00000165 A1[90090000]            	mov	eax, [radius]
   260 0000016A 3B05[A0090000]          	cmp	eax, [_y0]
   261 00000170 7399                    	jnb	short _3_
   262 00000172 E880020000              	call	black_circle ; clear current position 
   263 00000177 FF0D[A0090000]          	dec	dword [_y0]
   264 0000017D E90DFFFFFF              	jmp	_0 ; draw 
   265                                  _7:
   266 00000182 80FC47                  	cmp	ah, 47h ; Home key
   267 00000185 750F                    	jne	short _8
   268 00000187 E86B020000              	call	black_circle ; clear current position 
   269 0000018C E87C020000              	call	beep
   270 00000191 E9B7FEFFFF              	jmp	reset_diameter
   271                                  		; reset diameter, move to center
   272                                  _8:
   273 00000196 80FC4F                  	cmp	ah, 4Fh ; End key
   274 00000199 750F                    	jne	short _9
   275 0000019B E857020000              	call	black_circle ; clear current position 
   276 000001A0 E868020000              	call	beep
   277 000001A5 E99CFEFFFF              	jmp	reset_color 
   278                                  		; reset color and diameter, move to center
   279                                  _9:	
   280 000001AA 663D0D1C                	cmp	ax, 1C0Dh
   281 000001AE 7509                    	jne	short _10
   282 000001B0 8005[98090000]04        	add	byte [color], 4
   283 000001B7 EB22                    	jmp	short _14
   284                                  _10:	
   285 000001B9 80FC53                  	cmp	ah, 53h ; INSERT
   286 000001BC 741D                    	je	short _14
   287                                  _11:
   288 000001BE 80FC52                  	cmp	ah, 52h  ; DEL
   289 000001C1 7418                    	je	short _14
   290                                  _12:
   291 000001C3 80FC49                  	cmp	ah, 49h  ; Page UP
   292 000001C6 7508                    	jne	short _13
   293 000001C8 FE0D[98090000]          	dec	byte [color]
   294 000001CE EB0B                    	jmp	short _14
   295                                  _13:
   296 000001D0 80FC51                  	cmp	ah, 51h  ; Page Down
   297 000001D3 7510                    	jne	short _15
   298 000001D5 FE05[98090000]          	inc	byte [color]
   299                                  _14:
   300 000001DB E82D020000              	call	beep
   301 000001E0 E9AAFEFFFF              	jmp	_0
   302                                  _15:
   303 000001E5 E9AAFEFFFF              	jmp	waitforkey
   304                                  
   305                                  print_msg:
   306 000001EA B40E                    	mov	ah, 0Eh
   307 000001EC BB07000000              	mov	ebx, 7
   308                                  	;mov	bl, 7 ; char attribute & color
   309                                  p_next_chr:
   310 000001F1 AC                      	lodsb
   311 000001F2 08C0                    	or	al, al
   312 000001F4 7404                    	jz	short p_retn ; retn	
   313 000001F6 CD31                    	int	31h
   314 000001F8 EBF7                    	jmp	short p_next_chr
   315                                  p_retn:
   316 000001FA C3                      	retn
   317                                  
   318                                  drawcircle:
   319                                  	; INPUT:
   320                                  	;	[_x0]
   321                                  	;	[_y0]
   322                                  	;	[radius]
   323                                  	;	[color]
   324                                  	;
   325                                  	; Modified registers: esi, eax, ecx, ebx, edx	
   326                                  _dc_ph0:
   327                                  	; quarter 1	
   328                                  	; start from y = 0, x = radius
   329 000001FB 31C0                    	xor	eax, eax
   330 000001FD A3[A8090000]            	mov	[_y1], eax ; 0
   331 00000202 A2[8E090000]            	mov	[phase], al ; 0
   332 00000207 8B2D[90090000]          	mov	ebp, [radius]
   333 0000020D 892D[A4090000]          	mov	[_x1], ebp ; y = 0, x = r
   334 00000213 BE[AC090000]            	mov	esi, _fx
   335                                  _dc_ph0_n:
   336 00000218 FF0D[A4090000]          	dec	dword [_x1]
   337 0000021E AD                      	lodsd
   338                                  _dc_ph0_x:
   339 0000021F 8B15[A8090000]          	mov	edx, [_y1]
   340 00000225 42                      	inc	edx
   341 00000226 39C2                    	cmp	edx, eax
   342 00000228 7314                    	jnb	short _dc_ph0_y
   343 0000022A 50                      	push	eax
   344 0000022B 8915[A8090000]          	mov	[_y1], edx
   345 00000231 E847010000              	call	get_start_offset
   346 00000236 E818010000              	call	write_pixel
   347 0000023B 58                      	pop	eax
   348 0000023C EBE1                    	jmp	short _dc_ph0_x	
   349                                  _dc_ph0_y:
   350 0000023E A3[A8090000]            	mov	[_y1], eax
   351 00000243 E835010000              	call	get_start_offset
   352 00000248 E806010000              	call	write_pixel
   353 0000024D 4D                      	dec	ebp
   354 0000024E 75C8                    	jnz	short _dc_ph0_n
   355                                  _dc_ph1:
   356                                  	; quarter 2	
   357                                  	; start from y = radius, x = 0
   358 00000250 FE05[8E090000]          	inc	byte [phase]
   359 00000256 31C0                    	xor	eax, eax
   360 00000258 A3[A4090000]            	mov	[_x1], eax ; 0
   361 0000025D 8B2D[90090000]          	mov	ebp, [radius]
   362 00000263 892D[A8090000]          	mov	[_y1], ebp ; y = r, x = 0
   363 00000269 BE[AC090000]            	mov	esi, _fx
   364                                  _dc_ph1_n:
   365 0000026E FF0D[A8090000]          	dec 	dword [_y1]
   366 00000274 AD                      	lodsd
   367                                  _dc_ph1_x:
   368 00000275 8B15[A4090000]          	mov	edx, [_x1]
   369 0000027B 42                      	inc	edx
   370 0000027C 39C2                    	cmp	edx, eax
   371 0000027E 7314                    	jnb	short _dc_ph1_y
   372 00000280 50                      	push	eax
   373 00000281 8915[A4090000]          	mov	[_x1], edx
   374 00000287 E8F1000000              	call	get_start_offset
   375 0000028C E8C2000000              	call	write_pixel
   376 00000291 58                      	pop	eax
   377 00000292 EBE1                    	jmp	short _dc_ph1_x	
   378                                  _dc_ph1_y:
   379 00000294 A3[A4090000]            	mov	[_x1], eax
   380 00000299 E8DF000000              	call	get_start_offset
   381 0000029E E8B0000000              	call	write_pixel
   382 000002A3 4D                      	dec	ebp
   383 000002A4 75C8                    	jnz	short _dc_ph1_n
   384                                  _dc_ph2:
   385                                  	; quarter 3	
   386                                  	; start from y = 0, x = radius
   387 000002A6 FE05[8E090000]          	inc	byte [phase]
   388 000002AC 31C0                    	xor	eax, eax
   389 000002AE A3[A8090000]            	mov	[_y1], eax ; 0
   390 000002B3 8B2D[90090000]          	mov	ebp, [radius]
   391 000002B9 892D[A4090000]          	mov	[_x1], ebp ; y = 0, x = r
   392 000002BF BE[AC090000]            	mov	esi, _fx
   393                                  _dc_ph2_n:
   394 000002C4 FF0D[A4090000]          	dec	dword [_x1]
   395 000002CA AD                      	lodsd
   396                                  _dc_ph2_x:
   397 000002CB 8B15[A8090000]          	mov	edx, [_y1]
   398 000002D1 42                      	inc	edx
   399 000002D2 39C2                    	cmp	edx, eax
   400 000002D4 7314                    	jnb	short _dc_ph2_y
   401 000002D6 50                      	push	eax
   402 000002D7 8915[A8090000]          	mov	[_y1], edx
   403 000002DD E89B000000              	call	get_start_offset
   404 000002E2 E86C000000              	call	write_pixel
   405 000002E7 58                      	pop	eax
   406 000002E8 EBE1                    	jmp	short _dc_ph2_x	
   407                                  _dc_ph2_y:
   408 000002EA A3[A8090000]            	mov	[_y1], eax
   409 000002EF E889000000              	call	get_start_offset
   410 000002F4 E85A000000              	call	write_pixel
   411 000002F9 4D                      	dec	ebp
   412 000002FA 75C8                    	jnz	short _dc_ph2_n
   413                                  _dc_ph3:
   414                                  	; quarter 4	
   415                                  	; start from y = radius, x = 0
   416 000002FC FE05[8E090000]          	inc	byte [phase]
   417 00000302 31C0                    	xor	eax, eax
   418 00000304 A3[A4090000]            	mov	[_x1], eax ; 0
   419 00000309 8B2D[90090000]          	mov	ebp, [radius]
   420 0000030F 892D[A8090000]          	mov	[_y1], ebp ; y = r, x = 0
   421 00000315 BE[AC090000]            	mov	esi, _fx
   422                                  _dc_ph3_n:
   423 0000031A FF0D[A8090000]          	dec	dword [_y1]
   424 00000320 AD                      	lodsd
   425                                  _dc_ph3_x:
   426 00000321 8B15[A4090000]          	mov	edx, [_x1]
   427 00000327 42                      	inc	edx
   428 00000328 39C2                    	cmp	edx, eax
   429 0000032A 7314                    	jnb	short _dc_ph3_y
   430 0000032C 50                      	push	eax
   431 0000032D 8915[A4090000]          	mov	[_x1], edx
   432 00000333 E845000000              	call	get_start_offset
   433 00000338 E816000000              	call	write_pixel
   434 0000033D 58                      	pop	eax
   435 0000033E EBE1                    	jmp	short _dc_ph3_x	
   436                                  _dc_ph3_y:
   437 00000340 A3[A4090000]            	mov	[_x1], eax
   438 00000345 E833000000              	call	get_start_offset
   439 0000034A E804000000              	call	write_pixel
   440 0000034F 4D                      	dec	ebp
   441 00000350 75C8                    	jnz	short _dc_ph3_n
   442                                  _dc_ph4:
   443 00000352 C3                      	retn	
   444                                  
   445                                  write_pixel:
   446                                  	sys	_video, 0301h, [color], eax
   446                              <1> 
   446                              <1> 
   446                              <1> 
   446                              <1> 
   446                              <1>  %if %0 >= 2
   446 00000353 BB01030000          <1>  mov ebx, %2
   446                              <1>  %if %0 >= 3
   446 00000358 8B0D[98090000]      <1>  mov ecx, %3
   446                              <1>  %if %0 = 4
   446 0000035E 89C2                <1>  mov edx, %4
   446                              <1>  %endif
   446                              <1>  %endif
   446                              <1>  %endif
   446 00000360 B81F000000          <1>  mov eax, %1
   446                              <1> 
   446 00000365 CD40                <1>  int 40h
   447 00000367 C3                      	retn  
   448                                  
   449                                  movecenter:
   450 00000368 C705[9C090000]4001-     	mov	dword [_x0], 640/2
   450 00000370 0000               
   451 00000372 C705[A0090000]F000-     	mov	dword [_y0], 480/2
   451 0000037A 0000               
   452 0000037C C3                      	retn
   453                                  
   454                                  get_start_offset:
   455 0000037D B880020000              	mov	eax, 640
   456 00000382 8B15[A0090000]          	mov	edx, [_y0]
   457 00000388 803D[8E090000]00        	cmp	byte [phase], 0
   458 0000038F 7715                    	ja	short gso_1
   459                                  gso_0:
   460                                  	; quarter 1
   461 00000391 2B15[A8090000]          	sub	edx, [_y1] ; y = 0 -> r
   462 00000397 F7E2                    	mul	edx
   463 00000399 0305[9C090000]          	add	eax, [_x0]
   464 0000039F 0305[A4090000]          	add	eax, [_x1] ; x = r -> 0
   465 000003A5 C3                      	retn
   466                                  gso_1:
   467 000003A6 803D[8E090000]01        	cmp	byte [phase], 1
   468 000003AD 7715                    	ja	short gso_2
   469                                  	; quarter 2
   470 000003AF 2B15[A8090000]          	sub	edx, [_y1] ; y = r -> 0
   471 000003B5 F7E2                    	mul	edx
   472 000003B7 0305[9C090000]          	add	eax, [_x0]
   473 000003BD 2B05[A4090000]          	sub	eax, [_x1] ; x = 0 -> -r
   474 000003C3 C3                      	retn
   475                                  gso_2:
   476 000003C4 803D[8E090000]02        	cmp	byte [phase], 2
   477 000003CB 7715                    	ja	short gso_3
   478                                  	; quarter 3
   479 000003CD 0315[A8090000]          	add	edx, [_y1] ; y = 0 -> -r 
   480 000003D3 F7E2                    	mul	edx
   481 000003D5 0305[9C090000]          	add	eax, [_x0]
   482 000003DB 2B05[A4090000]          	sub	eax, [_x1] ; x = -r -> 0
   483 000003E1 C3                      	retn
   484                                  gso_3:
   485                                  	; quarter 4
   486 000003E2 0315[A8090000]          	add	edx, [_y1] ; y = -r -> 0
   487 000003E8 F7E2                    	mul	edx
   488 000003EA 0305[9C090000]          	add	eax, [_x0]
   489 000003F0 0305[A4090000]          	add	eax, [_x1] ; x = 0 -> r
   490 000003F6 C3                      	retn
   491                                  
   492                                  black_circle:
   493 000003F7 30E4                    	xor	ah, ah
   494 000003F9 8625[98090000]          	xchg	[color], ah ; color = 0 
   495 000003FF 50                      	push	eax
   496 00000400 E8F6FDFFFF              	call	drawcircle
   497 00000405 58                      	pop	eax
   498 00000406 8625[98090000]          	xchg	[color], ah ; restore color
   499 0000040C C3                      	retn
   500                                  
   501                                  beep:
   502                                  	; call beep function (16/64 second, 886Hz)
   503                                  	sys	_audio, 16, 1331
   503                              <1> 
   503                              <1> 
   503                              <1> 
   503                              <1> 
   503                              <1>  %if %0 >= 2
   503 0000040D BB10000000          <1>  mov ebx, %2
   503                              <1>  %if %0 >= 3
   503 00000412 B933050000          <1>  mov ecx, %3
   503                              <1>  %if %0 = 4
   503                              <1>  mov edx, %4
   503                              <1>  %endif
   503                              <1>  %endif
   503                              <1>  %endif
   503 00000417 B820000000          <1>  mov eax, %1
   503                              <1> 
   503 0000041C CD40                <1>  int 40h
   504 0000041E C3                      	retn
   505                                  
   506                                  get_squareroot:
   507                                  	; input: edx = square of the number (y)
   508                                  	; output: eax = approx. square root of ebx 
   509 0000041F BE[8C050000]            	mov	esi, _squares
   510 00000424 53                      	push	ebx
   511 00000425 31DB                    	xor	ebx, ebx
   512                                  	;mov	ecx, 256
   513 00000427 8B0D[90090000]          	mov	ecx, [radius] ; max. value of radius is 256
   514                                  q_sr_x:	
   515 0000042D AD                      	lodsd
   516 0000042E 39D0                    	cmp	eax, edx
   517 00000430 7303                    	jnb	short q_sr_ok
   518 00000432 43                      	inc	ebx
   519 00000433 E2F8                    	loop	q_sr_x
   520                                  q_sr_ok:
   521 00000435 89D8                    	mov	eax, ebx
   522 00000437 5B                      	pop	ebx
   523 00000438 C3                      	retn
   524                                  
   525                                  set_text_mode:
   526 00000439 30E4                    	xor    ah, ah
   527 0000043B B003                    	mov    al, 3                        
   528                                   	;int   10h	; al = 03h text mode, int 10 video
   529 0000043D CD31                    	int    31h ; TRDOS 386 - Video interrupt
   530 0000043F C3                      	retn
   531                                  		
   532                                  program_msg:
   533 00000440 5452444F5320333836-     	db "TRDOS 386 v2.0.3 - ('sysvideo') Test Program - Draw Circle"
   533 00000449 2076322E302E33202D-
   533 00000452 202827737973766964-
   533 0000045B 656F27292054657374-
   533 00000464 2050726F6772616D20-
   533 0000046D 2D2044726177204369-
   533 00000476 72636C65           
   534 0000047A 0D0A                    	db 0Dh, 0Ah
   535 0000047C 6279204572646F6761-     	db "by Erdogan Tan - 14/02/2021"
   535 00000485 6E2054616E202D2031-
   535 0000048E 342F30322F32303231 
   536                                  	;db 0Dh, 0Ah, 0
   537 00000497 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
   538                                  
   539 0000049B 557365204172726F77-     	db "Use Arrow Keys, Home, End to move the CIRCLE .."
   539 000004A4 204B6579732C20486F-
   539 000004AD 6D652C20456E642074-
   539 000004B6 6F206D6F7665207468-
   539 000004BF 6520434952434C4520-
   539 000004C8 2E2E               
   540 000004CA 0D0A                    	db 0Dh, 0Ah
   541 000004CC 557365202B2C2D206B-     	db "Use +,- keys to increase and decrease DIAMETER .."		
   541 000004D5 65797320746F20696E-
   541 000004DE 63726561736520616E-
   541 000004E7 642064656372656173-
   541 000004F0 65204449414D455445-
   541 000004F9 52202E2E           
   542 000004FD 0D0A                    	db 0Dh, 0Ah
   543 000004FF 55736520454E544552-     	db "Use ENTER key to draw CIRCLE .."
   543 00000508 206B657920746F2064-
   543 00000511 72617720434952434C-
   543 0000051A 45202E2E           
   544 0000051E 0D0A                    	db 0Dh, 0Ah
   545 00000520 557365205350414345-     	db "Use SPACE, Pg Up, Pg Down keys to change COLOR .."
   545 00000529 2C2050672055702C20-
   545 00000532 506720446F776E206B-
   545 0000053B 65797320746F206368-
   545 00000544 616E676520434F4C4F-
   545 0000054D 52202E2E           
   546 00000551 0D0A                    	db 0Dh, 0Ah	
   547 00000553 507265737320455343-     	db "Press ESC to exit .."
   547 0000055C 20746F206578697420-
   547 00000565 2E2E               
   548 00000567 0D0A                    	db 0Dh, 0Ah
   549 00000569 0D0A                    	db 0Dh, 0Ah
   550 0000056B 507265737320616E79-     	db "Press any key to continue .."
   550 00000574 206B657920746F2063-
   550 0000057D 6F6E74696E7565202E-
   550 00000586 2E                 
   551                                  nextline:
   552 00000587 0D0A00                  	db 0Dh, 0Ah, 0	
   553                                  
   554                                  bss:
   555                                  
   556                                  ABSOLUTE bss
   557                                  
   558 0000058A <res 00000002>          alignb 4
   559                                  
   560                                  bss_start:
   561                                  _squares:
   562 0000058C <res 00000400>          	resd 256 ; squares of numbers from 0 t0 255	
   563                                  counter:
   564 0000098C <res 00000002>          	resw 1
   565 0000098E <res 00000002>          phase:	resw 1
   566 00000990 <res 00000004>          radius:	resd 1 ; Current Radius value
   567 00000994 <res 00000004>          _r2:	resd 1 ; Square of R
   568 00000998 <res 00000004>          color:	resd 1
   569 0000099C <res 00000004>          _x0:	resd 1
   570 000009A0 <res 00000004>          _y0:	resd 1
   571 000009A4 <res 00000004>          _x1:	resd 1
   572 000009A8 <res 00000004>          _y1:	resd 1
   573 000009AC <res 00000400>          _fx:	resd 256 ; For every X values from 0 to 255
   574                                  bss_end:
