211 lines
4.1 KiB
Python
211 lines
4.1 KiB
Python
def ds2_file_seek_read(self, fstype, whence):
|
|
testdir = self.mkworkdir('d')
|
|
|
|
ename = "ds2seek"
|
|
|
|
if fstype == "MFS":
|
|
config = """\
|
|
$_hdimage = "dXXXXs/c:hdtype1 dXXXXs/d:hdtype1 +1"
|
|
$_floppy_a = ""
|
|
"""
|
|
else: # FAT
|
|
config = """\
|
|
$_hdimage = "dXXXXs/c:hdtype1 %s +1"
|
|
$_floppy_a = ""
|
|
""" % self.mkimage("12", cwd=testdir)
|
|
|
|
dosfunc, seekval, expected = {
|
|
"SET": (0x4200, 3, "3456"),
|
|
"CUR": (0x4201, 3, "CBA9"),
|
|
"END": (0x4202, -4, "3210"),
|
|
}[whence]
|
|
|
|
testdata = "0123456789abcdefFEDCBA9876543210"
|
|
|
|
self.mkfile("testit.bat", """\
|
|
d:
|
|
c:\\%s
|
|
DIR
|
|
rem end
|
|
""" % ename, newline="\r\n")
|
|
|
|
# compile sources
|
|
self.mkcom_with_nasm(ename, r"""
|
|
bits 16
|
|
cpu 386
|
|
|
|
org 100h
|
|
|
|
section .text
|
|
|
|
push cs
|
|
pop ds
|
|
|
|
mov ax, 3c00h ; create file
|
|
mov cx, 0
|
|
mov dx, fname
|
|
int 21h
|
|
jc prfailcreate
|
|
|
|
mov word [fhndl], ax
|
|
|
|
mov ax, 4000h ; write testdata
|
|
mov bx, word [fhndl]
|
|
mov cx, fdatalen
|
|
mov dx, fdata
|
|
int 21h
|
|
jc prfailwrite
|
|
cmp ax, fdatalen
|
|
jne prnumwrite
|
|
|
|
mov ax, 3e00h ; close file
|
|
mov bx, word [fhndl]
|
|
int 21h
|
|
|
|
mov ax, 3d00h ; open file readonly
|
|
mov dx, fname
|
|
int 21h
|
|
jc prfailopen
|
|
|
|
mov word [fhndl], ax
|
|
|
|
mov ax, 3f00h ; read from file to middle
|
|
mov bx, word [fhndl]
|
|
mov cx, 16
|
|
mov dx, ftemp
|
|
int 21h
|
|
jc prfailread
|
|
cmp ax, 16
|
|
jne prnumread
|
|
|
|
mov ax, %xh ; seek from whence to somewhere
|
|
mov bx, word [fhndl]
|
|
mov si, seekval
|
|
mov cx, [ds:si + 2]
|
|
mov dx, [ds:si]
|
|
int 21h
|
|
jc prcarryset
|
|
|
|
mov ax, 3f00h ; read 4 chars from new position
|
|
mov bx, word [fhndl]
|
|
mov cx, 4
|
|
mov dx, fdata2
|
|
int 21h
|
|
jc prfailread2
|
|
cmp ax, 4
|
|
jne prnumread2
|
|
|
|
jmp prsucc
|
|
|
|
prfailcreate:
|
|
mov dx, failcreate
|
|
jmp @1
|
|
|
|
prfailwrite:
|
|
mov dx, failwrite
|
|
jmp @2
|
|
|
|
prnumwrite:
|
|
mov dx, numwrite
|
|
jmp @2
|
|
|
|
prfailopen:
|
|
mov dx, failopen
|
|
jmp @1
|
|
|
|
prfailread:
|
|
mov dx, failread
|
|
jmp @2
|
|
|
|
prnumread:
|
|
mov dx, numread
|
|
jmp @2
|
|
|
|
prcarryset:
|
|
mov dx, carryset
|
|
jmp @2
|
|
|
|
prfailread2:
|
|
mov dx, failread2
|
|
jmp @2
|
|
|
|
prnumread2:
|
|
mov dx, numread2
|
|
jmp @2
|
|
|
|
prsucc:
|
|
mov byte [fdata2 + 4], ')'
|
|
mov byte [fdata2 + 5], 13
|
|
mov byte [fdata2 + 6], 10
|
|
mov byte [fdata2 + 7], '$'
|
|
mov dx, success
|
|
jmp @2
|
|
|
|
@2:
|
|
mov ax, 3e00h ; close file
|
|
mov bx, word [fhndl]
|
|
int 21h
|
|
|
|
@1:
|
|
mov ah, 9 ; print string
|
|
int 21h
|
|
|
|
exit:
|
|
mov ah, 4ch
|
|
int 21h
|
|
|
|
section .data
|
|
|
|
seekval:
|
|
dd %d
|
|
|
|
fname:
|
|
db "%s", 0
|
|
|
|
fhndl:
|
|
dw 0
|
|
|
|
fdata:
|
|
db "%s"
|
|
fdatalen equ $ - fdata
|
|
|
|
success:
|
|
db "Operation Success("
|
|
fdata2:
|
|
times 64 db 0
|
|
ftemp:
|
|
times 64 db 0
|
|
failcreate:
|
|
db "Create Operation Failed",13,10,'$'
|
|
failwrite:
|
|
db "Write Operation Failed",13,10,'$'
|
|
numwrite:
|
|
db "Write Incorrect Length",13,10,'$'
|
|
failopen:
|
|
db "Open Operation Failed",13,10,'$'
|
|
failread:
|
|
db "Read Operation Failed",13,10,'$'
|
|
numread:
|
|
db "Read Not 16 Chars",13,10,'$'
|
|
carryset:
|
|
db "Seek Carry Set",13,10,'$'
|
|
failread2:
|
|
db "Read2 Operation Failed",13,10,'$'
|
|
numread2:
|
|
db "Read2 Not 4 Chars",13,10,'$'
|
|
|
|
""" % (dosfunc, seekval, "test.fil", testdata))
|
|
|
|
results = self.runDosemu("testit.bat", config=config)
|
|
|
|
self.assertNotIn("Create Operation Failed", results)
|
|
self.assertNotIn("Write Operation Failed", results)
|
|
self.assertNotIn("Write Incorrect Length", results)
|
|
self.assertNotIn("Open Operation Failed", results)
|
|
self.assertNotIn("Read Operation Failed", results)
|
|
self.assertNotIn("Read Not 16 Chars", results)
|
|
self.assertNotIn("Seek Carry Set", results)
|
|
self.assertNotIn("Read2 Operation Failed", results)
|
|
self.assertNotIn("Read2 Not 4 Chars", results)
|
|
self.assertIn("Operation Success(%s)" % expected, results)
|