     1                                  ; ****************************************************************************
     2                                  ; srvs3.s - TRDOS 386 (TRDOS v2.0.3) Test Program - Save/Restore Video State
     3                                  ; ----------------------------------------------------------------------------
     4                                  ;
     5                                  ; 24/01/2021
     6                                  ;
     7                                  ; ****************************************************************************
     8                                  ; nasm srvs3.s -l srvs3.txt -o SRVS3.PRG -Z error.txt
     9                                  
    10                                  ; save and restore video state (correctness test)
    11                                  
    12                                  ; 14/07/2020
    13                                  ; 31/12/2017
    14                                  ; TRDOS 386 (v2.0) system calls
    15                                  _ver 	equ 0
    16                                  _exit 	equ 1
    17                                  _fork 	equ 2
    18                                  _read 	equ 3
    19                                  _write	equ 4
    20                                  _open	equ 5
    21                                  _close 	equ 6
    22                                  _wait 	equ 7
    23                                  _create	equ 8
    24                                  _rename	equ 9
    25                                  _delete	equ 10
    26                                  _exec	equ 11
    27                                  _chdir	equ 12
    28                                  _time 	equ 13
    29                                  _mkdir 	equ 14
    30                                  _chmod	equ 15
    31                                  _rmdir	equ 16
    32                                  _break	equ 17
    33                                  _drive	equ 18
    34                                  _seek	equ 19
    35                                  _tell 	equ 20
    36                                  _memory	equ 21
    37                                  _prompt	equ 22
    38                                  _path	equ 23
    39                                  _env	equ 24
    40                                  _stime	equ 25
    41                                  _quit	equ 26	
    42                                  _intr	equ 27
    43                                  _dir	equ 28
    44                                  _emt 	equ 29
    45                                  _ldrvt 	equ 30
    46                                  _video 	equ 31
    47                                  _audio	equ 32
    48                                  _timer	equ 33
    49                                  _sleep	equ 34
    50                                  _msg    equ 35
    51                                  _geterr	equ 36
    52                                  _fpstat	equ 37
    53                                  _pri	equ 38
    54                                  _rele	equ 39
    55                                  _fff	equ 40
    56                                  _fnf	equ 41
    57                                  _alloc	equ 42
    58                                  _dalloc equ 43
    59                                  _calbac equ 44
    60                                  _dma	equ 45	
    61                                  
    62                                  %macro sys 1-4
    63                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    64                                      ; 03/09/2015	
    65                                      ; 13/04/2015
    66                                      ; Retro UNIX 386 v1 system call.		
    67                                      %if %0 >= 2   
    68                                          mov ebx, %2
    69                                          %if %0 >= 3    
    70                                              mov ecx, %3
    71                                              %if %0 = 4
    72                                                 mov edx, %4   
    73                                              %endif
    74                                          %endif
    75                                      %endif
    76                                      mov eax, %1
    77                                      ;int 30h
    78                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    79                                  %endmacro
    80                                  
    81                                  ; Retro UNIX 386 v1 system call format:
    82                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    83                                  
    84                                  [BITS 32] ; We need 32-bit intructions for protected mode
    85                                  
    86                                  [ORG 0] 
    87                                  
    88                                  START_CODE:
    89                                  	; clear bss
    90 00000000 BF[50020000]            	mov	edi, bss_start
    91 00000005 B900040000              	mov	ecx, (bss_end - bss_start)/4
    92                                  	;xor	eax, eax
    93 0000000A F3AB                    	rep	stosd
    94                                  
    95                                  	; program message
    96 0000000C BE[F9000000]            	mov	esi, program_msg
    97 00000011 E8D2000000              	call	print_msg
    98                                  
    99                                  	; save video state
   100                                  
   101 00000016 B8044F0000              	mov	eax, 4F04h
   102 0000001B 31D2                    	xor	edx, edx ; dl = 0 ; get buffer size  
   103 0000001D B90F000000              	mov	ecx, 0Fh
   104 00000022 CD31                    	int	31h 
   105 00000024 83F84F                  	cmp	eax, 4Fh
   106 00000027 7424                    	je	short _0
   107                                  _save_err1:
   108 00000029 BE[CD010000]            	mov	esi, save_error_msg
   109 0000002E EB0F                    	jmp	short _save_err3
   110                                  _save_err2:
   111 00000030 BE[CD010000]            	mov	esi, save_error_msg
   112 00000035 E8AE000000              	call	print_msg
   113 0000003A BE[80010000]            	mov	esi, vstate_size_msg
   114                                  _save_err3:
   115 0000003F E8A4000000              	call	print_msg
   116                                  _terminate:
   117                                  	sys	_exit
   117                              <1> 
   117                              <1> 
   117                              <1> 
   117                              <1> 
   117                              <1>  %if %0 >= 2
   117                              <1>  mov ebx, %2
   117                              <1>  %if %0 >= 3
   117                              <1>  mov ecx, %3
   117                              <1>  %if %0 = 4
   117                              <1>  mov edx, %4
   117                              <1>  %endif
   117                              <1>  %endif
   117                              <1>  %endif
   117 00000044 B801000000          <1>  mov eax, %1
   117                              <1> 
   117 00000049 CD40                <1>  int 40h
   118                                  _hang:
   119 0000004B EBFE                    	jmp	short _hang
   120                                  _0:
   121 0000004D 89D8                    	mov	eax, ebx
   122 0000004F 66C1E006                	shl	ax, 6 ; * 64
   123 00000053 E86F000000              	call	write_number
   124                                  
   125 00000058 B8044F0000              	mov	eax, 4F04h
   126 0000005D B201                    	mov	dl, 1 ; save video state  
   127 0000005F B90F000000              	mov	ecx, 0Fh
   128 00000064 BB[50020000]            	mov	ebx, vstate
   129 00000069 CD31                    	int	31h 
   130 0000006B 83F84F                  	cmp	eax, 4Fh
   131 0000006E 75C0                    	jne	short _save_err2
   132                                  
   133 00000070 BE[5E010000]            	mov	esi, save_ok_msg
   134 00000075 E86E000000              	call	print_msg
   135                                   
   136 0000007A BE[E9010000]            	mov	esi, press_any_key_msg
   137 0000007F E864000000              	call	print_msg
   138                                  
   139 00000084 30E4                    	xor	ah, ah
   140 00000086 CD32                    	int	32h
   141                                  
   142 00000088 BE[07020000]            	mov	esi, nextline
   143 0000008D E856000000              	call	print_msg
   144                                  
   145                                  	; restore video state
   146 00000092 B8044F0000              	mov	eax, 4F04h
   147 00000097 B202                    	mov	dl, 2 ; restore video state  
   148 00000099 B90F000000              	mov	ecx, 0Fh
   149 0000009E BB[50020000]            	mov	ebx, vstate
   150 000000A3 CD31                    	int	31h 
   151 000000A5 83F84F                  	cmp	eax, 4Fh
   152 000000A8 7516                    	jne	short _restore_err
   153                                  
   154 000000AA BE[29020000]            	mov	esi, restore_ok_msg
   155 000000AF E834000000              	call	print_msg
   156 000000B4 BE[AE010000]            	mov	esi, msg_ok
   157                                  _1:
   158 000000B9 E82A000000              	call	print_msg
   159 000000BE EB84                    	jmp	short _terminate 
   160                                  _restore_err:
   161 000000C0 BE[0A020000]            	mov	esi, restore_error_msg
   162 000000C5 EBF2                    	jmp	short _1 
   163                                  
   164                                  write_number:
   165 000000C7 B908000000              	mov	ecx, 8
   166 000000CC 89C2                    	mov	edx, eax
   167 000000CE BF[9C010000]            	mov	edi, number_txt
   168                                  wn_0:	
   169 000000D3 C1C204                  	rol	edx, 4 ; move highest 4 bits to lowest pos
   170 000000D6 88D0                    	mov	al, dl
   171 000000D8 240F                    	and	al, 0Fh ; isolate lowest 4 bits
   172 000000DA 3C09                    	cmp	al, 9
   173 000000DC 7604                    	jna	short wn_1
   174 000000DE 0437                    	add	al, 'A'-10
   175 000000E0 EB02                    	jmp	short wn_2
   176                                  wn_1:
   177 000000E2 0430                    	add	al, '0'
   178                                  wn_2:
   179 000000E4 AA                      	stosb
   180 000000E5 E2EC                    	loop	wn_0
   181                                  
   182 000000E7 C3                      	retn
   183                                  
   184                                  print_msg:
   185 000000E8 B40E                    	mov	ah, 0Eh
   186 000000EA BB07000000              	mov	ebx, 7
   187                                  	;mov	bl, 7 ; char attribute & color
   188                                  pmsg_next_chr:
   189 000000EF AC                      	lodsb
   190 000000F0 08C0                    	or	al, al
   191 000000F2 7404                    	jz	short pmsg_ok ; retn	
   192 000000F4 CD31                    	int	31h
   193 000000F6 EBF7                    	jmp	short pmsg_next_chr
   194                                  pmsg_ok:
   195 000000F8 C3                      	retn
   196                                  
   197                                  program_msg:
   198 000000F9 5452444F5320333836-     	db "TRDOS 386 v2.0.3 - Save/Restore Video State ('sysvideo') Test Program"
   198 00000102 2076322E302E33202D-
   198 0000010B 20536176652F526573-
   198 00000114 746F72652056696465-
   198 0000011D 6F2053746174652028-
   198 00000126 27737973766964656F-
   198 0000012F 272920546573742050-
   198 00000138 726F6772616D       
   199 0000013E 0D0A                    	db 0Dh, 0Ah
   200 00000140 6279204572646F6761-     	db "by Erdogan Tan - 24/01/2021"
   200 00000149 6E2054616E202D2032-
   200 00000152 342F30312F32303231 
   201 0000015B 0D0A00                  	db 0Dh, 0Ah, 0
   202                                  save_ok_msg:
   203 0000015E 0D0A                    	db 0Dh, 0Ah
   204 00000160 566964656F20537461-     	db "Video State has been saved ..."
   204 00000169 746520686173206265-
   204 00000172 656E20736176656420-
   204 0000017B 2E2E2E             
   205 0000017E 0D0A                    	db 0Dh, 0Ah
   206                                  vstate_size_msg:
   207 00000180 0D0A                    	db 0Dh, 0Ah
   208 00000182 566964656F20537461-     	db "Video State Buffer Size : "
   208 0000018B 746520427566666572-
   208 00000194 2053697A65203A20   
   209                                  number_txt:
   210 0000019C 585858585858585868-     	db "XXXXXXXXh bytes"
   210 000001A5 206279746573       
   211 000001AB 0D0A00                  	db 0Dh, 0Ah, 0
   212                                  
   213                                  msg_ok:
   214                                  	;db 0Dh, 0Ah
   215 000001AE 2852657475726E2074-     	db "(Return to parent is) OK."
   215 000001B7 6F20706172656E7420-
   215 000001C0 697329204F4B2E     
   216 000001C7 0D0A00                  	db 0Dh, 0Ah, 0
   217 000001CA 0D0A00                  	db 0Dh, 0Ah, 0
   218                                  
   219                                  save_error_msg:
   220 000001CD 0D0A                    	db 0Dh, 0Ah
   221 000001CF 566964656F20537461-     	db "Video State Save Error!"
   221 000001D8 746520536176652045-
   221 000001E1 72726F7221         
   222 000001E6 0D0A00                  	db 0Dh, 0Ah, 0
   223                                  
   224                                  press_any_key_msg:
   225 000001E9 0D0A                    	db 0Dh, 0Ah
   226 000001EB 507265737320616E79-     	db "Press any key to continue .."
   226 000001F4 206B657920746F2063-
   226 000001FD 6F6E74696E7565202E-
   226 00000206 2E                 
   227                                  nextline:
   228 00000207 0D0A00                  	db 0Dh, 0Ah, 0	
   229                                  
   230                                  restore_error_msg:
   231 0000020A 0D0A                    	db 0Dh, 0Ah
   232 0000020C 566964656F20537461-     	db "Video State Restore Error!"
   232 00000215 746520526573746F72-
   232 0000021E 65204572726F7221   
   233 00000226 0D0A00                  	db 0Dh, 0Ah, 0
   234                                  
   235                                  restore_ok_msg:
   236 00000229 0D0A                    	db 0Dh, 0Ah
   237 0000022B 566964656F20537461-     	db "Video State has been restored ..."
   237 00000234 746520686173206265-
   237 0000023D 656E20726573746F72-
   237 00000246 6564202E2E2E       
   238 0000024C 0D0A00                  	db 0Dh, 0Ah, 0
   239                                  
   240                                  bss:
   241                                  
   242                                  ABSOLUTE bss
   243                                  
   244 0000024F <res 00000001>          alignb 16
   245                                  
   246                                  bss_start:
   247                                  
   248                                  vstate:
   249 00000250 <res 00001000>          	resb 4096
   250                                  
   251                                  bss_end:
