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) , , 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 alignb 16 245 246 bss_start: 247 248 vstate: 249 00000250 resb 4096 250 251 bss_end: