Added a DOS test to kernel32 based on assembler code.
Morten Rønne
morten.roenne at tdcadsl.dk
Mon Apr 26 03:25:23 CDT 2010
---
dlls/kernel32/tests/dosasm.c | 129 +++++
dlls/kernel32/tests/int21.asm | 1069 +++++++++++++++++++++++++++++++++++++++
dlls/kernel32/tests/rep_dat.inc | 4 +
dlls/kernel32/tests/report.inc | 48 ++
4 files changed, 1250 insertions(+), 0 deletions(-)
create mode 100644 dlls/kernel32/tests/dosasm.c
create mode 100644 dlls/kernel32/tests/int21.asm
create mode 100644 dlls/kernel32/tests/rep_dat.inc
create mode 100644 dlls/kernel32/tests/report.inc
diff --git a/dlls/kernel32/tests/dosasm.c b/dlls/kernel32/tests/dosasm.c
new file mode 100644
index 0000000..5b1e7f0
--- /dev/null
+++ b/dlls/kernel32/tests/dosasm.c
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2010 Morten Rønne
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wine/test.h"
+#include <winbase.h>
+
+static DWORD pos, end;
+char buffer[8192];
+
+static int read_line (HANDLE *file, char *text)
+{
+ DWORD o;
+
+ o = 0;
+ if(pos == end) {
+ ReadFile(file, buffer, 8192, &end, NULL);
+ pos = 0;
+ }
+ while(pos < end) {
+ switch(buffer[pos]) {
+ case '\n':
+ text[o++] = '\n';
+ text[o++] = '\0';
+ pos++;
+ return 1;
+ case '\r': break;
+ default:
+ if(o < 510)
+ text[o++] = buffer[pos];
+ }
+ pos++;
+ if(pos == end) {
+ ReadFile(file, buffer, 8192, &end, NULL);
+ pos = 0;
+ }
+ }
+ return 0;
+}
+
+static int read_test_file(char *name) {
+ HANDLE file;
+ char line[512];
+
+ file = CreateFileA("test.rep", GENERIC_READ, 0, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+ ok(file != INVALID_HANDLE_VALUE, "CreateFile failed for test.rep: %08x\n",
+ GetLastError());
+ if(file == INVALID_HANDLE_VALUE)
+ return 0;
+
+ pos = 0;
+ end = 0;
+
+ /* Read each line and make report */
+ while(read_line(file, line)) {
+ if(line[1] == ':' && line[2] == ' ') {
+ switch(line[0]) {
+ case 't':
+ todo_wine {
+ ok(FALSE, "%s: %s", name, &line[3]);
+ }
+ break;
+ case 'w':
+ ok(TRUE, "%s: %s", name, &line[3]);
+ break;
+ default:
+ ok(FALSE, "%s: %s", name, &line[3]);
+ }
+ }
+ }
+
+ CloseHandle(file);
+ return 1;
+}
+
+static int run_program(LPSTR name)
+{
+ STARTUPINFOA si;
+ PROCESS_INFORMATION pi;
+
+ /* The file is not found, then tests are not run, so we return TRUE */
+ if(GetFileAttributes(name) == INVALID_FILE_ATTRIBUTES)
+ return TRUE;
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ if (CreateProcessA(NULL, name, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
+ {
+ /* Wait for the process to finish */
+ WaitForSingleObject( pi.hProcess, INFINITE );
+ CloseHandle(pi.hThread);
+ CloseHandle(pi.hProcess);
+ if(read_test_file(name))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+START_TEST(dosasm)
+{
+ /*
+ * We are testing DOS functions which requires 16 bit mode.
+ * But this program runs in 32 bit mode.
+ * So we load a 16 bit test program to do the actual testing.
+ * After that reports are gathered and tested based on file created
+ * by the run program.
+ * So to affect todo's, change the 16 bit program not this.
+ */
+
+ /* First test int 21 which are required by all the others */
+ ok(run_program((LPSTR)"int21.com") == TRUE,
+ "Failed to run int 21 tests. Last Error: 0x%04x", GetLastError());
+}
+
diff --git a/dlls/kernel32/tests/int21.asm b/dlls/kernel32/tests/int21.asm
new file mode 100644
index 0000000..57450b6
--- /dev/null
+++ b/dlls/kernel32/tests/int21.asm
@@ -0,0 +1,1069 @@
+;
+; Copyright 2010 Morten Rønne
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Lesser General Public
+; License as published by the Free Software Foundation; either
+; version 2.1 of the License, or (at your option) any later version.
+;
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+; Lesser General Public License for more details.
+;
+; You should have received a copy of the GNU Lesser General Public
+; License along with this library; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+;
+; Test of selected int21 functions
+;
+; File open/write/close functions are expected to work in order
+; to write the report file.
+; But more extensive tests will be done.
+;
+
+section .text
+ org 100h;
+
+_start:
+
+ call open_report
+
+ call test_version_number
+
+ call test_stdin
+
+ call test_curr_drive
+
+ call test_free_spc
+
+ call test_sys_time
+
+ ;call test_country
+
+ call test_mem_alloc
+
+ ;===============================================================
+ ;
+ ; Test file FCB functions
+ ; Should we do this?
+ ; Also Get/Set Disk Transfer Area
+ ;
+ ;===============================================================
+
+ ;===============================================================
+ ;
+ ; Get/Set interrupt vector
+ ;
+ ;===============================================================
+
+ ; 25/35
+
+ ;===============================================================
+ ;
+ ; Create New program segment prefix
+ ;
+ ;===============================================================
+
+ ; 26h, DX = segment at which to create PSP
+
+
+ ;===============================================================
+ ;
+ ; Close report file
+ ;
+ ;===============================================================
+
+ call close_report
+
+ ; Exit the program
+
+ mov ax,4C00h
+ int 21h
+ retn
+
+ ;===============================================================
+ ;
+ ; Test version number
+ ;
+ ;===============================================================
+
+test_version_number:
+
+ ; Get version number
+ mov ax,3000h
+ int 21h
+
+ ; AL = Major, AH = Minor, BH = flag, BL:CX = Serial number
+ or bl,bl
+ jnz .ser_err
+ or cx,cx
+ jnz .ser_err
+ mov byte [serial_err_str],'w'
+.ser_err:
+ push ax
+ mov dx,serial_err_str
+ mov cx,serial_err_len
+ call report
+ pop ax
+
+check_version:
+ mov bp,known_versions
+.loop:
+ mov dx,[bp]
+ add bp,2
+ cmp dx,0
+ jz .version_error
+
+ cmp ax,dx
+ jz .dos_version_ok
+ jmp .loop
+
+.dos_version_ok:
+ mov byte [version_err_str],'w'
+
+.version_error:
+ mov di,version_output
+ call ax_as_hex
+
+ mov dx,version_err_str
+ mov cx,version_err_len
+ call report
+
+test_oem:
+ ; Get OEM version number
+ mov ax,3001h
+ int 21h
+
+.check_version:
+ mov bp,known_oem_versions
+.loop:
+ mov dx,[bp]
+ add bp,2
+ cmp dx,0
+ jz .version_error
+
+ cmp ax,dx
+ jz .oem_version_ok
+ jmp .loop
+
+.oem_version_ok:
+ mov byte [vers_oem_err_str],'w'
+
+.version_error:
+ mov di,vers_oem_err_out
+ call ax_as_hex
+
+ mov dx,vers_oem_err_str
+ mov cx,vers_oem_err_len
+ call report
+ retn
+
+ ;===============================================================
+ ;
+ ; Test system date/time
+ ;
+ ;===============================================================
+
+test_sys_time:
+ mov cx,0ffffh
+ mov dx,0ffffh
+ mov al,0ffh
+
+ ; Get system date
+ mov ah,2ah
+ int 21h
+ ; CX = Year, DH = Month, DL = Day, AL = Day of Week
+
+ mov byte [sysdate_check],'1'
+ cmp cx,2009
+ jc .sys_date_fail
+
+ mov byte [sysdate_check],'2'
+ cmp cx,2050
+ jnc .sys_date_fail
+
+ mov byte [sysdate_check],'3'
+ cmp al,7
+ jnc .sys_date_fail
+
+ mov byte [sysdate_check],'4'
+ cmp dh,13
+ jnc .sys_date_fail
+
+ mov byte [sysdate_check],'5'
+ cmp dl,32
+ jnc .sys_date_fail
+
+ mov byte [sysdate_str],'w'
+.sys_date_fail:
+
+ mov dx,sysdate_str
+ mov cx,sysdate_len
+ call report
+
+test_systime:
+
+ mov cx,0ffffh
+ mov dx,0ffffh
+
+ ; Get System time
+ mov ah,2ch
+ int 21h
+ ; CH = Hour, CL = Min, DH = sec, DL = millisec
+
+ mov byte [systime_check],'1'
+ cmp ch,24
+ jnc .sys_time_fail
+
+ mov byte [systime_check],'2'
+ cmp cl,60
+ jnc .sys_time_fail
+
+ mov byte [systime_check],'3'
+ cmp dh,60
+ jnc .sys_time_fail
+
+ mov byte [systime_str],'w'
+
+.sys_time_fail:
+ mov dx,systime_str
+ mov cx,systime_len
+ call report
+ retn
+
+ ;===============================================================
+ ;
+ ; Test stdin status
+ ; Should return no character available
+ ;
+ ;===============================================================
+
+test_stdin:
+ mov ah,0bh
+ mov al,20h
+ int 21h
+ cmp al,00h
+ jz .ok_status
+ cmp al,0ffh
+ jnz .err_status
+.ok_status:
+ mov byte [stdin_err_str],'w'
+
+.err_status:
+ mov di,stdin_status
+ call al_as_hex
+
+ mov dx,stdin_err_str
+ mov cx,stdin_err_len
+ call report
+ retn
+
+ ;===============================================================
+ ;
+ ; Test current drive
+ ;
+ ;===============================================================
+
+test_curr_drive:
+ mov ax,19ffh
+ int 21h
+ mov [current_drive],al
+
+ cmp al,26
+ jnc .drive_err
+
+ mov byte [curr_drive_str],'w'
+
+.drive_err:
+ mov di,curr_drive_hex
+ call al_as_hex
+
+ mov dx,curr_drive_str
+ mov cx,curr_drive_len
+ call report
+
+ ; TODO: 0eh - Set current drive
+
+ retn
+
+ ;===============================================================
+ ;
+ ; Test free space of C:
+ ;
+ ;===============================================================
+
+test_free_spc:
+ mov ah,36h
+ mov dl,[current_drive]
+ inc dl
+ cmp dl,25
+ jnz .notz
+ mov dl,3 ; If run from wine Z: use disk C: instead
+.notz:
+ int 21h
+ cmp ax,0ffffh
+ jz .free_err
+
+ mov byte [freespace_str],'w'
+
+.free_err:
+ mov di,freespace_sector
+ call ax_as_hex
+
+ mov di,freespace_free
+ mov ax,bx
+ call ax_as_hex
+
+ mov di,freespace_bytes
+ mov ax,cx
+ call ax_as_hex
+
+ mov di,freespace_total
+ mov dx,ax
+ call ax_as_hex
+
+ mov dx,freespace_str
+ mov cx,freespace_len
+ call report
+ retn
+
+ ;===============================================================
+ ;
+ ; Check country information
+ ;
+ ;===============================================================
+
+test_country:
+ ; Get default country
+ mov ax,3800h
+ mov dx,country_default
+ int 21h
+ jc country_error
+
+ ; Check all the known languages
+ mov dx,0ffffh
+ mov bp,country_known
+.country_loop:
+ mov ax,[bp]
+ cmp ax,0ffffh
+ jz country_error
+
+ cmp ax,0ffh
+ jc .lowval
+ mov bx,ax
+ mov al,0ffh
+.lowval:
+ mov ah,38h
+ mov dx,country_buffer
+ int 21h
+ jnc country_ok
+ inc bp
+ inc bp
+ jmp .country_loop
+
+country_ok:
+ mov byte [country_err],'w'
+
+country_error:
+ mov dx,country_err
+ mov cx,country_len
+ call report
+ retn
+
+ ;===============================================================
+ ;
+ ; Test memory functions
+ ;
+ ;===============================================================
+
+test_mem_alloc:
+
+ ; Get segment of first byte after from PSP
+ mov ax,[2]
+
+ ; Do some size calculation based on PSP values.
+ mov bx,es
+ sub ax,bx
+ mov [psp_mem_size],ax ; Size of largest block
+
+ mov ax,[2]
+ call dump_mcb
+
+ ; Check that it points to valid end MCB
+
+ ; As .COM program we should have all low memory
+ ; So we resize to 64K first
+ mov ah,4ah
+ mov bx,4096
+ int 21h
+ jc .cant_decrease1
+
+ mov ax,bx
+
+ mov di,resize_out
+ call ax_as_hex
+
+ mov dx,resize_str
+ mov ah,9
+ int 21h
+
+ ; Resize to max should reallocate all memory again
+ mov ah,4ah
+ mov bx,0ffffh
+ int 21h
+ jnc .unexpected_succes
+
+ cmp bx,[psp_mem_size]
+ jnz .resize_wrong
+
+ ; And resize to 64K again, so we can check memory alloc
+
+ mov ah,4ah
+ mov bx,4096
+ int 21h
+ jc .cant_decrease2
+
+ mov ax,bx
+
+ mov di,resize_out
+ call ax_as_hex
+
+ mov dx,resize_str
+ mov ah,9
+ int 21h
+
+ ;
+ ; Allocate 1M. This should fail
+ mov bx,0ffffh
+ mov ah,48h
+ int 21h
+ jnc .unexpected_succes
+
+ mov [largest],bx
+
+ mov ax,bx
+
+ mov di,large
+ call ax_as_hex
+
+ mov dx,large_str
+ mov ah,9
+ int 21h
+
+ ; Calculate the size we should have gotten
+ mov ax,[psp_mem_size]
+ sub ax,1001h
+ cmp ax,[largest]
+ jnz .memory_failed
+
+ ; Allocate a fresh 4K block
+ mov ah,48h
+ mov bx,100h
+ int 21h
+ jc .memory_failed
+ mov [new_memory],ax
+ mov es,ax
+
+ ; Try resize above possible
+ mov ah,4ah
+ mov bx,0ffffh
+ int 21h
+ jnc .unexpected_succes
+
+ ; BX should be largest
+ cmp bx,[largest]
+ jnz .resize_failed
+
+ ; Now we should have all normal memory
+
+ ; We should get a upper memory block now
+ mov ah,4ah
+ mov bx,100h
+ int 21h
+ jc .upper_failed
+
+ cmp ax,0a000h
+ jnc .upper_failed
+
+ jmp .memory_ok
+
+ ; Now lets resize the original memory (which can't expand)
+ mov ax,ds
+ mov es,ax
+
+ mov ah,48h
+ mov bx,2000h
+ int 21h
+ jnc .resize_didnt_fail
+
+ cmp bx,1000h
+ jnz .resize_size_err
+ mov byte [resize_no_out],'w'
+.resize_size_err:
+
+ mov ax,bx
+ mov di,resize_no_out
+ call ax_as_hex
+
+ mov dx,resize_no_str
+ mov cx,resize_no_len
+ call report
+
+.unexpected_succes:
+ ; This may succed if run in protected mode
+ mov dx,memory_ok_err
+ mov cx,memory_ok_len
+ call report
+
+ jmp .memory_ok
+
+.resize_wrong:
+ mov ax,bx
+ mov di,resize_up1_got
+ call ax_as_hex
+
+ mov ax,[psp_mem_size]
+ mov di,resize_up1_expect
+ call ax_as_hex
+
+ mov dx,resize_up1_err
+ mov cx,resize_up1_len
+ call report
+
+ jmp .memory_ok
+
+.cant_decrease1:
+ mov dx,decrease1_err
+ mov cx,decrease1_len
+ call report
+ jmp .memory_ok
+
+.cant_decrease2:
+ mov dx,decrease2_err
+ mov cx,decrease2_len
+ call report
+ jmp .memory_ok
+
+.resize_failed:
+ mov dx,resize_fail_err
+ mov cx,resize_fail_len
+ call report
+ jmp .memory_ok
+
+.resize_didnt_fail:
+ mov dx,no_resize_err
+ mov cx,no_resize_len
+ call report
+ jmp .memory_ok
+
+.upper_failed:
+ mov dx,upper_fail_err
+ mov cx,upper_fail_len
+ call report
+ jmp .memory_ok
+
+.memory_failed:
+ mov dx,memory_fail_err
+ mov cx,memory_fail_len
+ call report
+
+.memory_ok:
+ ; Cleanup
+ mov ax,[new_memory]
+ or ax,ax
+ jz .free_upper
+ mov es,ax
+ ; We clear new_memory now, to avoid trying freeing it again
+ xor ax,ax
+ mov [new_memory],ax
+
+ mov ah,49h
+ int 21h
+ jc .memory_failed
+
+.free_upper:
+ mov ax,[upper_mem]
+ or ax,ax
+ jz .free_done
+
+ mov es,ax
+ ; We clear uper_mem now, to avoid trying freeing it again
+ xor ax,ax
+ mov [upper_mem],ax
+
+ mov ah,49h
+ int 21h
+ jc .upper_failed
+
+.free_done:
+ mov ax,ds
+ mov es,ax
+ retn
+
+dump_mcb:
+
+ mov si,0
+ mov di,mcb_dump
+ mov bx,ax
+
+.loop:
+ push ds
+ mov ds,bx
+ mov al,[si]
+ pop ds
+ call al_as_hex
+ inc di
+ inc si
+ cmp si,16
+ jnz .loop
+
+ mov dx,mcb_str
+ mov ah,09h
+ int 21h
+ retn
+
+ ;===============================================================
+ ;
+ ; Test file handle functions
+ ;
+ ;===============================================================
+
+test_file_handle:
+ ; 3ch create or truncate file
+ ; 3dh open file
+ ; 3eh close file
+ ; 3fh read from file
+ ; 40h write to file
+ ; 41h delete file
+ ; 42h Set current file position
+ ; 43h Get file attributes
+ ; 43h Set file attributes
+ ; 3bh Set current directory
+ ; 39h Create directory
+ ; 3ah Delete directory
+ ; 47h Get current directory
+ ; 56h Rename file
+ ; 57h Get last-written date and time
+ ; 57h Set last-written date and time
+
+ ; Open file for writing
+ ; Write a string to file
+ ; Close file
+
+ ; Open file for reading
+ ; Read string from file
+ ; Close file
+
+ ; Compare to stored string
+ ; Create directory
+ ; Change to directory
+ ; Repeat file test above
+ ; Delete file
+ ; Change to old current directory
+ ; Delete directory
+
+ ; Position checking
+
+ ; Get verify flag
+ ; Set verify flag
+ retn
+
+move_string:
+ push si
+.loop:
+ mov al,[si]
+ cmp al,0
+ jz .clear
+ inc si
+ mov [di],al
+ inc di
+ dec cx
+ jz .exit
+ jmp .loop
+
+.clear:
+ mov byte [di],' '
+ inc di
+ dec cx
+ jnz .clear
+.exit:
+ pop si
+ retn
+
+ax_as_hex:
+ push ax
+ mov al,ah
+ call al_as_hex
+ pop ax
+al_as_hex:
+ push ax
+ ror al,4
+ call .digit
+ pop ax
+.digit:
+ and al,0fh
+ add al,48
+ cmp al,58
+ jc .nothex
+ add al,7
+.nothex:
+ mov [di],al
+ inc di
+ retn
+
+%include "report.inc"
+
+section .data
+
+output_handle dw 0
+largest dw 0
+avail dw 0
+new_memory dw 0
+upper_mem dw 0
+
+psp_mem_size dw 0
+resize_mem_size dw 0
+
+current_drive db 0
+
+
+country_known dw 001h ; (1) United States
+ dw 002h ; (2) Canadian-French
+ dw 003h ; (3) Latin America
+ dw 004h ; (4) Canada (English)
+ dw 007h ; (7) Russia
+ dw 014h ; (20) Egypt
+ dw 01Bh ; (27) South Africa
+ dw 01Eh ; (30) Greece
+ dw 01Fh ; (31) Netherlands
+ dw 020h ; (32) Belgium
+ dw 021h ; (33) France
+ dw 022h ; (34) Spain
+ dw 023h ; (35) Bulgaria???
+ dw 024h ; (36) Hungary (not supported by DR DOS 5.0)
+ dw 026h ; (38) Yugoslavia (not supported by DR DOS 5.0) -- obsolete
+ dw 027h ; (39) Italy / San Marino / Vatican City
+ dw 028h ; (40) Romania
+ dw 029h ; (41) Switzerland / Liechtenstein
+ dw 02Ah ; (42) Czechoslovakia / Tjekia / Slovakia (not supported by DR DOS 5.0)
+ dw 02Bh ; (43) Austria (DR DOS 5.0)
+ dw 02Ch ; (44) United Kingdom
+ dw 02Dh ; (45) Denmark
+ dw 02Eh ; (46) Sweden
+ dw 02Fh ; (47) Norway
+ dw 030h ; (48) Poland (not supported by DR DOS 5.0)
+ dw 031h ; (49) Germany
+ dw 033h ; (51) Peru
+ dw 034h ; (52) Mexico
+ dw 035h ; (53) Cuba
+ dw 036h ; (54) Argentina
+ dw 037h ; (55) Brazil (not supported by DR DOS 5.0)
+ dw 038h ; (56) Chile
+ dw 039h ; (57) Columbia
+ dw 03Ah ; (58) Venezuela
+ dw 03Ch ; (60) Malaysia
+ dw 03Dh ; (61) International English / Australia
+ dw 03Eh ; (62) Indonesia / East Timor
+ dw 03Fh ; (63) Philippines
+ dw 040h ; (64) New Zealand
+ dw 041h ; (65) Singapore
+ dw 042h ; (66) Thailand (or Taiwan???)
+ dw 051h ; (81) Japan (DR DOS 5.0, MS-DOS 5.0+)
+ dw 052h ; (82) South Korea (DR DOS 5.0)
+ dw 054h ; (84) Vietnam
+ dw 056h ; (86) China (MS-DOS 5.0+)
+ dw 058h ; (88) Taiwan (MS-DOS 5.0+)
+ dw 05Ah ; (90) Turkey (MS-DOS 5.0+)
+ dw 05Bh ; (91) India
+ dw 05Ch ; (92) Pakistan
+ dw 05Dh ; (93) Afghanistan
+ dw 05Eh ; (94) Sri Lanka
+ dw 062h ; (98) Iran
+ dw 063h ; (99) Asia (English)
+ dw 066h ; (102) ??? (Hebrew MS-DOS 5.0)
+ dw 070h ; (112) Belarus
+ dw 0C8h ; (200) Thailand (PC DOS 6.1+)
+ ; (reported as 01h due to a bug in PC DOS COUNTRY.SYS)
+ dw 0D4h ; (212) Morocco
+ dw 0D5h ; (213) Algeria
+ dw 0D8h ; (216) Tunisia
+ dw 0DAh ; (218) Libya
+ dw 0DCh ; (220) Gambia
+ dw 0DDh ; (221) Senegal
+ dw 0DEh ; (222) Maruitania
+ dw 0DFh ; (223) Mali
+ dw 0E0h ; (224) African Guinea
+ dw 0E1h ; (225) Ivory Coast
+ dw 0E2h ; (226) Burkina Faso
+ dw 0E3h ; (227) Niger
+ dw 0E4h ; (228) Togo
+ dw 0E5h ; (229) Benin
+ dw 0E6h ; (230) Mauritius
+ dw 0E7h ; (231) Liberia
+ dw 0E8h ; (232) Sierra Leone
+ dw 0E9h ; (233) Ghana
+ dw 0EAh ; (234) Nigeria
+ dw 0EBh ; (235) Chad
+ dw 0ECh ; (236) Centra African Republic
+ dw 0EDh ; (237) Cameroon
+ dw 0EEh ; (238) Cape Verde Islands
+ dw 0EFh ; (239) Sao Tome and Principe
+ dw 0F0h ; (240) Equatorial Guinea
+ dw 0F1h ; (241) Gabon
+ dw 0F2h ; (242) Congo
+ dw 0F3h ; (243) Zaire
+ dw 0F4h ; (244) Angola
+ dw 0F5h ; (245) Guinea-Bissau
+ dw 0F6h ; (246) Diego Garcia
+ dw 0F7h ; (247) Ascension Isle
+ dw 0F8h ; (248) Seychelles
+ dw 0F9h ; (249) Sudan
+ dw 0FAh ; (250) Rwhanda
+ dw 0FBh ; (251) Ethiopia
+ dw 0FCh ; (252) Somalia
+ dw 0FDh ; (253) Djibouti
+ dw 0FEh ; (254) Kenya
+ dw 0FFh ; (255) Tanzania
+ dw 100h ; (256) Uganda
+ dw 101h ; (257) Burundi
+ dw 103h ; (259) Mozambique
+ dw 104h ; (260) Zambia
+ dw 105h ; (261) Madagascar
+ dw 106h ; (262) Reunion Island
+ dw 107h ; (263) Zimbabwe
+ dw 108h ; (264) Namibia
+ dw 109h ; (265) Malawi
+ dw 10Ah ; (266) Lesotho
+ dw 10Bh ; (267) Botswana
+ dw 10Ch ; (268) Swaziland
+ dw 10Dh ; (269) Comoros
+ dw 10Eh ; (270) Mayotte
+ dw 122h ; (290) St. Helena
+ dw 129h ; (297) Aruba
+ dw 12Ah ; (298) Faroe Islands
+ dw 12Bh ; (299) Greenland
+ dw 15Eh ; (350) Gibraltar
+ dw 15Fh ; (351) Portugal
+ dw 160h ; (352) Luxembourg
+ dw 161h ; (353) Ireland
+ dw 162h ; (354) Iceland
+ dw 163h ; (355) Albania
+ dw 164h ; (356) Malta
+ dw 165h ; (357) Cyprus
+ dw 166h ; (358) Finland
+ dw 167h ; (359) Bulgaria
+ dw 172h ; (370) Lithuania (reported as 372 due to a bug in MS-DOS COUNTRY.SYS)
+ dw 173h ; (371) Latvia (reported as 372 due to a bug in MS-DOS COUNTRY.SYS)
+ dw 174h ; (372) Estonia
+ dw 175h ; (373) Moldova
+ dw 177h ; (375) ??? (MS-DOS 7.10 / Windows98)
+ dw 17Ch ; (380) Ukraine
+ dw 17Dh ; (381) Serbia / Montenegro
+ dw 180h ; (384) Croatia
+ dw 181h ; (385) Croatia (PC DOS 7+)
+ dw 182h ; (386) Slovenia
+ dw 183h ; (387) Bosnia-Herzegovina (Latin)
+ dw 184h ; (388) Bosnia-Herzegovina (Cyrillic) (PC DOS 7+)
+ ; (reported as 381 due to a bug in PC DOS COUNTRY.SYS)
+ dw 185h ; (389) FYR Macedonia
+ dw 1A5h ; (421) Czech Republic / Tjekia (PC DOS 7+)
+ dw 1A6h ; (422) Slovakia
+ ; (reported as 421 due to a bug in COUNTRY.SYS)
+ dw 1F4h ; (500) Falkland Islands
+ dw 1F5h ; (501) Belize
+ dw 1F6h ; (502) Guatemala
+ dw 1F7h ; (503) El Salvador
+ dw 1F8h ; (504) Honduras
+ dw 1F9h ; (505) Nicraragua
+ dw 1FAh ; (506) Costa Rica
+ dw 1FBh ; (507) Panama
+ dw 1FCh ; (508) St. Pierre and Miquelon
+ dw 1FDh ; (509) Haiti
+ dw 24Eh ; (590) Guadeloupe
+ dw 24Fh ; (591) Bolivia
+ dw 250h ; (592) Guyana
+ dw 251h ; (593) Ecuador
+ dw 252h ; (594) rench Guiana
+ dw 253h ; (595) Paraguay
+ dw 254h ; (596) Martinique / French Antilles
+ dw 255h ; (597) Suriname
+ dw 256h ; (598) Uruguay
+ dw 257h ; (599) Netherland Antilles
+ dw 29Ah ; (666) Russia??? (PTS-DOS 6.51 KEYB)
+ dw 29Bh ; (667) Poland??? (PTS-DOS 6.51 KEYB)
+ dw 29Ch ; (668) Poland??? (Slavic???) (PTS-DOS 6.51 KEYB)
+ dw 29Eh ; (670) Saipan / N. Mariana Island
+ dw 29Fh ; (671) Guam
+ dw 2A0h ; (672) Norfolk Island (Australia) / Christmas Island/Cocos Islands / Antartica
+ dw 2A1h ; (673) Brunei Darussalam
+ dw 2A2h ; (674) Nauru
+ dw 2A3h ; (675) Papua New Guinea
+ dw 2A4h ; (676) Tonga Islands
+ dw 2A5h ; (677) Solomon Islands
+ dw 2A6h ; (678) Vanuatu
+ dw 2A7h ; (679) Fiji
+ dw 2A8h ; (680) Palau
+ dw 2A9h ; (681) Wallis & Futuna
+ dw 2AAh ; (682) Cook Islands
+ dw 2ABh ; (683) Niue
+ dw 2ACh ; (684) American Samoa
+ dw 2ADh ; (685) Western Samoa
+ dw 2AEh ; (686) Kiribati
+ dw 2AFh ; (687) New Caledonia
+ dw 2B0h ; (688) Tuvalu
+ dw 2B1h ; (689) French Polynesia
+ dw 2B2h ; (690) Tokealu
+ dw 2B3h ; (691) Micronesia
+ dw 2B4h ; (692) Marshall Islands
+ dw 2C7h ; (711) ??? (currency = EA$, code pages 437,737,850,852,855,857)
+ dw 311h ; (785) Arabic (Middle East/Saudi Arabia/etc.)
+ dw 324h ; (804) Ukraine
+ dw 329h ; (809) Antigua and Barbuda and more
+ dw 352h ; (850) North Korea
+ dw 354h ; (852) Hong Kong
+ dw 355h ; (853) Macao
+ dw 357h ; (855) Cambodia
+ dw 358h ; (856) Laos
+ dw 370h ; (880) Bangladesh
+ dw 376h ; (886) Taiwan (MS-DOS 6.22+)
+ dw 3C0h ; (960) Maldives
+ dw 3C1h ; (961) Lebanon
+ dw 3C2h ; (962) Jordan
+ dw 3C3h ; (963) Syria / Syrian Arab Republic
+ dw 3C4h ; (964) Iraq
+ dw 3C5h ; (965) Kuwait
+ dw 3C6h ; (966) Saudi Arabia
+ dw 3C7h ; (967) Yemen
+ dw 3C8h ; (968) Oman
+ dw 3C9h ; (969) Yemen??? (Arabic MS-DOS 5.0)
+ dw 3CBh ; (971) United Arab Emirates
+ dw 3CCh ; (972) Israel (Hebrew) (DR DOS 5.0,MS-DOS 5.0+)
+ dw 3CDh ; (973) Bahrain
+ dw 3CEh ; (974) Qatar
+ dw 3CFh ; (975) Bhutan
+ dw 3D0h ; (976) Mongolia
+ dw 3D1h ; (977) Nepal
+ dw 3E3h ; (995) Myanmar (Burma)
+ dw 0ffffh ; End marker
+
+;
+; Each known version takes 2 words
+; The order is minor/major with 2 hexdigits for each
+; This is due to way the value is returned
+;
+known_versions:
+ dw 0005h
+ dw 0006h
+ dw 0007h
+ dw 0 ; end marker
+
+known_oem_versions:
+ dw 0005h
+ dw 0006h
+ dw 0007h
+ dw 0 ; end marker
+
+%include "rep_dat.inc"
+
+serial_err_str db "t: Serial number is zero",13,10
+serial_err_len equ $ - serial_err_str
+
+version_err_str db "t: DOS version match known list: "
+version_output db '????'
+ db 13,10
+version_err_len equ $ - version_err_str
+
+vers_oem_err_str db "t: OEM Version match known list: "
+vers_oem_err_out db '????'
+ db 13,10
+vers_oem_err_len equ $ - vers_oem_err_str
+
+stdin_err_str db 'e: Stdin status 00 or FFh, Got '
+stdin_status db '??'
+ db 13,10
+stdin_err_len equ $- stdin_err_str
+
+curr_drive_str db 'e: Current drive in expected range 0x00-0x19.'
+ db ' Return: '
+curr_drive_hex db '??h.'
+ db 13,10
+curr_drive_len equ $- curr_drive_str
+
+sysdate_str db 'e: System date ok. Check no '
+sysdate_check db '?',13,10
+sysdate_len equ $- sysdate_str
+
+systime_str db 'e: System time ok. Check no '
+systime_check db '?',13,10
+systime_len equ $- systime_str
+
+freespace_str db 'e: Free disk space check. Sectors pr. Cluster: '
+freespace_sector db '????h. Bytes pr. sector: '
+freespace_bytes db '????h. Free clusters: '
+freespace_free db '????h. Total clusters: '
+freespace_total db '????h.'
+ db 13,10
+freespace_len equ $- freespace_str
+
+country_err db 't: No specific country returned information.',13,10
+country_len equ $ - country_err
+
+upper_fail_err db 't: Failed to allocate upper memory block.',13,10
+upper_fail_len equ $ - upper_fail_err
+
+resize_fail_err db "t: Resize failure. Didn't return correct size",13,10
+resize_fail_len equ $ - resize_fail_err
+
+no_resize_err db "e: Resize didn',39,'t fail as it should.",13,10
+no_resize_len equ $ - no_resize_err
+
+memory_fail_err db 'e: Memory allocation failed',13,10
+memory_fail_len equ $ - memory_fail_err
+
+memory_ok_err db 'e: Unexpect succes of memory allocation.',13,10
+memory_ok_len equ $ - memory_ok_err
+
+decrease1_err db 'e: Couldn',39,'t decrease size to 64K first time.',13,10
+decrease1_len equ $ - decrease1_err
+
+decrease2_err db 'e: Couldn',39,'t decrease size to 64K second time.',13,10
+decrease2_len equ $ - decrease2_err
+
+resize_up1_err db 't: Couldn',39,'t resize original size to max. Expected '
+resize_up1_expect db '????. Got '
+resize_up1_got db '????.',13,10
+resize_up1_len equ $ - resize_up1_err
+
+resize_no_str db 't: Resize to 128K and no memory available.'
+ db ' Expected 1000h, BX='
+resize_no_out db '????h.',13,10
+resize_no_len equ $ - resize_no_str
+
+avail_str db 'Available '
+avail_out db '????',13,10,'$'
+
+psp_str db 'PSP size '
+psp_out db '????',13,10,'$'
+
+resize_str db 'Resize to 64K, BX='
+resize_out db '????',13,10,'$'
+
+maxsize_str db 'Resize to max alloc, BX='
+maxsize_out db '????',13,10,'$'
+
+large_str db 'Largest '
+large db '????',13,10,'$'
+
+mcb_str db 'MCB: '
+mcb_dump db '?? ?? ?? ?? ?? ?? ?? ?? '
+ db '?? ?? ?? ?? ?? ?? ?? ??'
+ db 13,10,'$'
+section .bss
+
+ ; Buffer for country information
+country_buffer resb 64
+country_default resb 64
+
+stack resb 1024
diff --git a/dlls/kernel32/tests/rep_dat.inc b/dlls/kernel32/tests/rep_dat.inc
new file mode 100644
index 0000000..3dd741b
--- /dev/null
+++ b/dlls/kernel32/tests/rep_dat.inc
@@ -0,0 +1,4 @@
+output_filename db 'test.rep',0
+
+failed_output db "Can't create report file test.rep",13,10,'$'
+failed_write db "Can't write to report file test.rep",13,10,'$'
diff --git a/dlls/kernel32/tests/report.inc b/dlls/kernel32/tests/report.inc
new file mode 100644
index 0000000..44dbe16
--- /dev/null
+++ b/dlls/kernel32/tests/report.inc
@@ -0,0 +1,48 @@
+
+open_report:
+ ; Open test output report file
+ mov ah,3ch
+ mov cx,0000h
+ mov dx,output_filename
+ int 21h
+ jnc test_go
+
+ ; Can't write to output file
+ mov ah,09h
+ mov dx,failed_output
+ int 21h
+
+ mov ax,4c01h
+ int 21h
+
+test_go:
+
+ mov [output_handle],ax
+ retn
+
+ ; Report the string pointer at dx, length cx
+ ; String is written to report file
+
+report:
+ mov ah,40h
+ mov bx,[output_handle]
+ int 21h
+ jc .err
+ retn
+
+.err:
+ mov dx,failed_write
+ mov ah,9
+ int 21h
+
+ ; Terminate
+ mov ax,4c01h
+ int 21h
+ retn
+
+close_report:
+ mov ah,2eh
+ mov bx,[output_handle]
+ int 21h
+ retn
+
--
1.6.3.3
--------------070603070805080108080708
Content-Type: text/plain;
name="0002-Added-needed-definitions-to-detect-and-use-assembler-t.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename*0="0002-Added-needed-definitions-to-detect-and-use-assembler-t.";
filename*1="txt"
More information about the wine-devel
mailing list