     1                                  ; ****************************************************************************
     2                                  ; setmode3.s - TRDOS 386 (TRDOS v2.0) Test Program - Set Video Mode
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 19/11/2020 (Erdogan Tan)
     6                                  ;
     7                                  ; ****************************************************************************
     8                                  
     9                                  ; 14/07/2020
    10                                  ; 31/12/2017
    11                                  ; TRDOS 386 (v2.0) system calls
    12                                  _ver 	equ 0
    13                                  _exit 	equ 1
    14                                  _fork 	equ 2
    15                                  _read 	equ 3
    16                                  _write	equ 4
    17                                  _open	equ 5
    18                                  _close 	equ 6
    19                                  _wait 	equ 7
    20                                  _create	equ 8
    21                                  _rename	equ 9
    22                                  _delete	equ 10
    23                                  _exec	equ 11
    24                                  _chdir	equ 12
    25                                  _time 	equ 13
    26                                  _mkdir 	equ 14
    27                                  _chmod	equ 15
    28                                  _rmdir	equ 16
    29                                  _break	equ 17
    30                                  _drive	equ 18
    31                                  _seek	equ 19
    32                                  _tell 	equ 20
    33                                  _memory	equ 21
    34                                  _prompt	equ 22
    35                                  _path	equ 23
    36                                  _env	equ 24
    37                                  _stime	equ 25
    38                                  _quit	equ 26	
    39                                  _intr	equ 27
    40                                  _dir	equ 28
    41                                  _emt 	equ 29
    42                                  _ldrvt 	equ 30
    43                                  _video 	equ 31
    44                                  _audio	equ 32
    45                                  _timer	equ 33
    46                                  _sleep	equ 34
    47                                  _msg    equ 35
    48                                  _geterr	equ 36
    49                                  _fpstat	equ 37
    50                                  _pri	equ 38
    51                                  _rele	equ 39
    52                                  _fff	equ 40
    53                                  _fnf	equ 41
    54                                  _alloc	equ 42
    55                                  _dalloc equ 43
    56                                  _calbac equ 44
    57                                  _dma	equ 45	
    58                                  
    59                                  %macro sys 1-4
    60                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    61                                      ; 03/09/2015	
    62                                      ; 13/04/2015
    63                                      ; Retro UNIX 386 v1 system call.	
    64                                      %if %0 >= 2   
    65                                          mov ebx, %2
    66                                          %if %0 >= 3    
    67                                              mov ecx, %3
    68                                              %if %0 = 4
    69                                                 mov edx, %4   
    70                                              %endif
    71                                          %endif
    72                                      %endif
    73                                      mov eax, %1
    74                                      ;int 30h
    75                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    76                                  %endmacro
    77                                  
    78                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    79                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    80                                  
    81                                  ;========================================================================
    82                                  ; SET VIDEO MODE
    83                                  ;========================================================================
    84                                  
    85                                  ; Modified from setmod2.s (19/11/2020)
    86                                  
    87                                  [BITS 32] ; We need 32-bit intructions for protected mode
    88                                  
    89                                  [ORG 0] 
    90                                  START_CODE:
    91 00000000 BE[69000000]            		mov	esi, message1
    92 00000005 E850000000              		call	print_msg
    93                                  
    94 0000000A 30E4                    		xor	ah, ah
    95 0000000C CD32                    		int	32h	; real mode: int 16h
    96                                  
    97 0000000E 66B80100                		mov	ax, 1	; mode 1 ; 
    98 00000012 CD31                    		int	31h	; real mode: int 10h
    99                                  
   100                                  		;; DIRECT ACCESS TO VIDEO MEMORY
   101                                  		;;xor	ebx, ebx
   102                                  		;mov	bh, 4 ; Direct access/map to CGA memory (0B8000h)
   103                                  		;;mov	eax, _video ; 1Fh
   104                                  		;mov	ax, 1Fh ; sys _video ; TRDOS 386 Video functions
   105                                  		;int	40h   ; TRDOS 386 system call
   106                                  
   107                                  		; eax = 0B8000h
   108                                  		;and	eax, eax
   109                                  		;jz	terminate ; error (eax = 0)
   110                                  
   111 00000014 BE[9A000000]            		mov	esi, message2
   112                                  		;call	print_msg_x
   113 00000019 E83C000000              		call	print_msg	
   114                                  key_loop:
   115 0000001E 30E4                    		xor	ah, ah
   116 00000020 CD32                    		int	32h	; real mode: int 16h
   117                                  
   118 00000022 3C0D                    		cmp	al, 13 ; ENTER key
   119 00000024 7418                    		je	short crlf
   120                                  			
   121 00000026 3C1B                    		cmp	al, 27 ; ESCape key
   122 00000028 7420                    		je	short terminate
   123                                  
   124 0000002A 3C03                    		cmp	al, 3 ; CTRL+C
   125 0000002C 741C                    		je	short terminate
   126                                  
   127 0000002E 6683F800                		cmp	ax, 0 ; CTRL+BREAK
   128 00000032 7416                    		je	short terminate
   129                                  _next_char:
   130                                  		; 17/11/2020
   131                                  		;call	print_char
   132                                  
   133                                  print_char:
   134 00000034 B40E                    		mov	ah, 0Eh
   135 00000036 66BB0700                		mov	bx, 07h
   136 0000003A CD31                    		int	31h	; real mode: int 10h
   137 0000003C EBE0                    		jmp	short key_loop 
   138                                  crlf:
   139 0000003E B40E                    		mov	ah, 0Eh	
   140                                  		;mov	al, 0Dh ; Carriage return
   141 00000040 66BB0700                		mov	bx, 07h
   142 00000044 CD31                    		int	31h 	; real mode: int 10h
   143 00000046 B00A                    		mov	al, 0Ah ; Line feed
   144                                  
   145 00000048 EBEA                    		jmp	short print_char
   146                                  
   147                                  		; 17/11/2020
   148                                  ;		jmp	short key_loop
   149                                  ;crlf:
   150                                  ;		call	print_char
   151                                  ;		mov	al, 10
   152                                  ;		jmp	short _next_char 	
   153                                  
   154                                  terminate:
   155 0000004A 66B80300                		mov	ax, 3	; mode 3 ; 
   156 0000004E CD31                    		int	31h	; real mode: int 10h	
   157                                  
   158                                  		sys	_exit
   158                              <1> 
   158                              <1> 
   158                              <1> 
   158                              <1> 
   158                              <1>  %if %0 >= 2
   158                              <1>  mov ebx, %2
   158                              <1>  %if %0 >= 3
   158                              <1>  mov ecx, %3
   158                              <1>  %if %0 = 4
   158                              <1>  mov edx, %4
   158                              <1>  %endif
   158                              <1>  %endif
   158                              <1>  %endif
   158 00000050 B801000000          <1>  mov eax, %1
   158                              <1> 
   158 00000055 CD40                <1>  int 40h
   159                                  here:
   160 00000057 EBFE                    		jmp	short here
   161                                  
   162                                  _return:
   163 00000059 C3                      		retn
   164                                  
   165                                  		; 19/11/2020
   166                                  print_msg:
   167                                  		;sys 	_msg, esi, 255, 0Fh 
   168                                  		;		; message with white color 
   169                                  		;		; (max. 255 chars)
   170                                  		;retn
   171                                  
   172 0000005A B40E                    		mov	ah, 0Eh
   173 0000005C 66BB0F00                		mov	bx, 0Fh
   174                                  p_loop:
   175 00000060 AC                      		lodsb
   176 00000061 08C0                    		or	al, al
   177 00000063 74F4                    		jz	short _return
   178 00000065 CD31                    		int	31h		
   179 00000067 EBF7                    		jmp	short p_loop
   180                                  
   181                                  ;		; 17/11/2020
   182                                  ;print_msg_x:
   183                                  ;		mov	edi, eax  ; 0B8000h
   184                                  ;		xor	eax, eax
   185                                  ;		xor	edx, edx
   186                                  ;		mov	bh, 0Fh	; color (attribute)
   187                                  ;_0:	
   188                                  ;		lodsb
   189                                  ;		or	al, al
   190                                  ;		jz	short _ok
   191                                  ;		
   192                                  ;		call	print_char
   193                                  ;_ok:
   194                                  ;		retn
   195                                  ;
   196                                  ;print_char:
   197                                  ;		cmp	al, 13	; Carriage return
   198                                  ;		je	short cr
   199                                  ;		cmp	al, 10	; Line feed
   200                                  ;		je	short lf
   201                                  ;
   202                                  ;		cmp	al, 8 ; Backspace
   203                                  ;		jne	short _alfanumeric
   204                                  ;
   205                                  ;		mov	bl, al
   206                                  ;		mov	al, 80	; columns * 2
   207                                  ;		mul	dh	; * row
   208                                  ;		shl	dl, 1
   209                                  ;		add	al, dl	; column * 2
   210                                  ;		adc	ah, 0	; +
   211                                  ;		shr	dl, 1
   212                                  ;
   213                                  ;		mov	word [edi+eax], 0720h ; clear current char
   214                                  ;
   215                                  ;		dec	dl
   216                                  ;		jns	short _retn
   217                                  ;		mov	dl, 39 ; column 39
   218                                  ;		dec	dh
   219                                  ;		jns	short _retn
   220                                  ;		xor	edx, edx
   221                                  ;		retn
   222                                  ;_alfanumeric:
   223                                  ;		mov	bl, al
   224                                  ;		mov	al, 80	; columns * 2
   225                                  ;		mul	dh	; * row
   226                                  ;		shl	dl, 1
   227                                  ;		add	al, dl	; column * 2
   228                                  ;		adc	ah, 0	; +
   229                                  ;		shr	dl, 1
   230                                  ;		
   231                                  ;		mov	bh, 0Fh		
   232                                  ;		mov	[edi+eax], bx ; char and color/attrib
   233                                  ;
   234                                  ;		inc	dl  ; next column
   235                                  ;		cmp	dl, 40
   236                                  ;		jb	short _retn
   237                                  ;
   238                                  ;		xor	dl, dl ; column 0
   239                                  ;		inc	dh  ; next row	
   240                                  ;		cmp	dh, 25
   241                                  ;		jb	short _retn
   242                                  ;		xor	dh, dh ; row 0
   243                                  ;_retn:
   244                                  ;		retn
   245                                  ;cr:
   246                                  ;		xor	dl, dl
   247                                  ;		jmp	short _retn
   248                                  ;lf:
   249                                  ;		inc	dh
   250                                  ;		cmp	dh, 25		
   251                                  ;		jb	short _retn
   252                                  ;		xor	dh, dh
   253                                  ;		jmp	short _retn		
   254                                  
   255                                  ;-----------------------------------------------------------------
   256                                  ;  MESSAGES
   257                                  ;-----------------------------------------------------------------
   258                                  
   259                                  message1:
   260 00000069 0D0A                    	db	0Dh, 0Ah
   261 0000006B 50726573732061206B-     	db	"Press a key to set video mode 1 (40x25 text)"
   261 00000074 657920746F20736574-
   261 0000007D 20766964656F206D6F-
   261 00000086 646520312028343078-
   261 0000008F 3235207465787429   
   262 00000097 0D0A00                  	db	0Dh, 0Ah, 0
   263                                  message2:
   264                                  	;db	0Dh, 0Ah, 0Dh, 0Ah
   265 0000009A 507265737320455343-     	db	"Press ESC to exit"
   265 000000A3 20746F2065786974   
   266 000000AB 0D0A00                  	db	0Dh, 0Ah, 0
