diff options
Diffstat (limited to 'ifileIO3.s')
-rw-r--r-- | ifileIO3.s | 744 |
1 files changed, 744 insertions, 0 deletions
diff --git a/ifileIO3.s b/ifileIO3.s new file mode 100644 index 0000000..5ffc0aa --- /dev/null +++ b/ifileIO3.s @@ -0,0 +1,744 @@ + +#define d0 %eax +#define d1 %ebx +#define a0 %ecx +#define a1 %edx +#define a2 %ebp +#define a3 %esi +#define a4 %edi +#define a5 %esp +#define sp %esp + +// # saved registers: %ebx %esi %edi %ebp +// # d1 a3 a4 a2 + + .data +#if defined (DOS) || defined (_WINDOWS_) || defined (ELF) + .align 8 +#else + .align 3 +#endif + +tmp_real: .double 0 +freadstring_error: + .ascii "Error in freadsubstring parameters." + .byte 10,0 + .byte 0,0,0 +fwritestring_error: + .ascii "Error in fwritesubstring parameters." + .byte 10,0 + .byte 0,0 + .text + + .globl stdioF + .globl stderrF + .globl openF + .globl closeF + .globl reopenF + .globl readFC + .globl readFI + .globl readFR + .globl readFS +#ifndef LINUX + .globl readFString +#endif + .globl readLineF + .globl writeFC + .globl writeFI + .globl writeFR + .globl writeFS +#ifndef LINUX + .globl writeFString +#endif + .globl endF + .globl errorF + .globl positionF + .globl seekF + .globl shareF + + .globl openSF + .globl readSFC + .globl readSFI + .globl readSFR + .globl readSFS + .globl readLineSF + .globl endSF + .globl positionSF + .globl seekSF + +// # imports + + .globl @open_file + .globl @open_stdio + .globl @open_stderr + .globl @re_open_file + .globl @close_file + .globl @file_read_char + .globl @file_read_int + .globl @file_read_real +#ifdef LINUX + .globl @file_read_string +#else + .globl @file_read_characters +#endif + .globl @file_read_line + .globl @file_write_char + .globl @file_write_int + .globl @file_write_real +#ifdef LINUX + .globl @file_write_string +#else + .globl @file_write_characters +#endif + .globl @file_end + .globl @file_error + .globl @file_position + .globl @file_seek + .globl @file_share + + .globl @open_s_file + .globl @file_read_s_char + .globl @file_read_s_int + .globl @file_read_s_real + .globl @file_read_s_string + .globl @file_read_s_line + .globl @file_s_end + .globl @file_s_position + .globl @file_s_seek + + .globl collect_0 + .globl collect_1 + + .globl __STRING__ + +stdioF: call @open_stdio + movl d0,d1 + movl $-1,d0 + ret + +stderrF: call @open_stderr + movl d0,d1 + movl $-1,d0 + ret + +openF: pushl d0 + addl $4,a0 + pushl a0 + call @open_file + addl $8,sp + + xorl d1,d1 + testl d0,d0 + setns %bl + movl (sp),a2 + movl $-1,(sp) + jmp *a2 + +closeF: pushl d1 + call @close_file + addl $4,sp + ret + +reopenF: +// # popl d0 +// # pushl d0 + pushl d1 + call @re_open_file + addl $8,sp + + xchg d0,d1 + + movl (sp),a2 + movl $-1,(sp) + jmp *a2 + +readFC: + pushl d1 + + pushl d1 + call @file_read_char + addl $4,sp + + movl 4(sp),a2 + movl $-1,4(sp) + + cmpl $-1,d0 + je readFC_eof + + movl $1,d1 + jmp *a2 + +readFC_eof: + xorl d0,d0 + xorl d1,d1 + jmp *a2 + +readFI: + pushl d1 + + subl $8,sp + lea 4(sp),a2 + movl a2,(sp) + pushl d1 + call @file_read_int + addl $8,sp + + movl d0,d1 + popl d0 + + movl 4(sp),a2 + movl $-1,4(sp) + jmp *a2 + +readFR: + pushl $tmp_real + pushl d1 + finit + call @file_read_real + addl $8,sp + + fldl tmp_real + fstp %st(1) + + xchg d0,d1 + + movl (sp),a2 + movl $-1,(sp) + jmp *a2 + +#ifndef LINUX +readFString: + movl 4(a0),a2 + cmpl a2,d1 + jae readFString_error + + subl d1,a2 + cmpl a2,d0 + ja readFString_error + + movl (sp),a1 + pushl a0 + + pushl d0 + movl sp,a2 + lea 8(a0,d1),a0 + + pushl a0 + pushl a2 + pushl a1 + call @file_read_characters + addl $12+4,sp + + popl a0 + + movl d0,d1 + popl d0 + + addl $4,sp + popl a2 + pushl $-1 + jmp *a2 + +readFString_error: + movl $freadstring_error,a2 + jmp print_error +#endif + +readFS: popl a1 + lea 3(a1),a2 + andl $-4,a2 + lea -32+8(a4,a2),a2 + cmpl end_heap,a2 + ja readFS_gc +readFS_r_gc: + +#ifdef LINUX + movl $__STRING__+2,(a4) + addl $4,a4 + + pushl a4 + pushl a1 + pushl d1 + call @file_read_string + addl $12,sp +#else + movl $__STRING__+2,(a4) + + lea 8(a4),a2 + addl $4,a4 + + pushl a2 + movl a1,(a4) + pushl a4 + pushl d1 + call @file_read_characters + addl $12,sp +#endif +readFS_end: + lea -4(a4),a0 + + addl $3,d0 + andl $-4,d0 + lea 4(a4,d0),a4 + + movl $-1,d0 + ret + +readFS_gc: pushl a1 + call collect_0l + popl a1 + jmp readFS_r_gc + +readLineF: + lea -32+(4*(32+2))(a4),a2 + cmpl end_heap,a2 + ja readLineF_gc + +readLineF_r_gc: + movl $__STRING__+2,(a4) + lea 8(a4),a0 + addl $4,a4 + + pushl a0 + movl end_heap,a1 + addl $32-4,a1 + subl a4,a1 + pushl a1 + pushl d1 + call @file_read_line + addl $12,sp + + movl d0,(a4) + + testl d0,d0 + jns readFS_end + + lea -4(a4),a0 + +readLineF_again: + movl end_heap,a1 + addl $32,a1 + lea -8(a1),d0 + subl a0,d0 + movl d0,4(a0) + movl a1,a4 + + lea -32+4*(32+2)(a4,d0),a2 + call collect_1l + + movl 4(a0),d0 + lea 8(a0),a1 + + pushl a4 + + movl $__STRING__+2,(a4) + + lea 3(d0),a0 + shr $2,a0 + + movl d0,4(a4) + addl $8,a4 + jmp st_copy_string1 + +copy_st_lp1: + movl (a1),a2 + addl $4,a1 + movl a2,(a4) + addl $4,a4 +st_copy_string1: + subl $1,a0 + jnc copy_st_lp1 + + pushl a4 + movl end_heap,a2 + addl $32,a2 + subl a4,a2 + pushl a2 + pushl d1 + call @file_read_line + addl $12,sp + + popl a0 + + testl d0,d0 + js readLineF_again + + addl d0,4(a0) + addl $3,d0 + andl $-4,d0 + addl d0,a4 + + movl $-1,d0 + ret + +readLineF_gc: + call collect_0l + jmp readLineF_r_gc + +writeFC: + movl d0,(sp) + pushl d1 + movl d0,d1 + call @file_write_char + addl $8,sp + + movl $-1,d0 + ret + +writeFI: + movl d0,(sp) + pushl d1 + movl d0,d1 + call @file_write_int + addl $8,sp + + movl $-1,d0 + ret + +writeFR: + pushl d1 + subl $8,sp + fstpl (sp) + finit + call @file_write_real + addl $12,sp + + movl $-1,d0 + ret + +writeFS: + pushl d1 +#ifdef LINUX + addl $4,a0 + pushl a0 + call @file_write_string + addl $8,sp +#else + pushl 4(a0) + addl $8,a0 + pushl a0 + call @file_write_characters + addl $12,sp +#endif + movl $-1,d0 + ret + +#ifndef LINUX +writeFString: + movl 4(a0),a2 + cmpl a2,d1 + jae writeFString_error + + subl d1,a2 + cmpl a2,d0 + ja writeFString_error + + lea 8(a0,d1),a0 + movl (sp),d1 + + pushl d0 + pushl a0 + call @file_write_characters + addl $12+4,sp + + movl $-1,d0 + + ret + +writeFString_error: + movl $fwritestring_error,a2 + jmp print_error +#endif + +endF: + pushl d1 + call @file_end + addl $4,sp + + xchg d0,d1 + + movl (sp),a2 + movl $-1,(sp) + jmp *a2 + +errorF: + pushl d1 + call @file_error + addl $4,sp + + xchg d0,d1 + + movl (sp),a2 + movl $-1,(sp) + jmp *a2 + +positionF: + pushl d1 + call @file_position + addl $4,sp + + xchg d0,d1 + + movl (sp),a2 + movl $-1,(sp) + jmp *a2 + +seekF: + pushl d1 + call @file_seek + addl $12,sp + + xchg d0,d1 + + movl (sp),a2 + movl $-1,(sp) + jmp *a2 + +shareF: + pushl d1 + call @file_share + addl $4,sp + + movl $-1,d0 + ret + +openSF: pushl d0 + addl $4,a0 + pushl a0 + call @open_s_file + addl $8,sp + + xorl d1,d1 + testl d0,d0 + setns %bl + + movl (sp),a2 + movl $0,(sp) + jmp *a2 + +readSFC: + pushl d0 + movl sp,a2 + pushl a2 + pushl d1 + call @file_read_s_char + addl $8,sp + + popl a0 + popl a2 + + pushl a0 + pushl d1 + + cmpl $-1,d0 + je readSFC_eof + + movl $1,d1 + jmp *a2 + +readSFC_eof: + xorl d0,d0 + xorl d1,d1 + jmp *a2 + +readSFI: + pushl d0 + movl sp,a2 + subl $4,sp + pushl a2 + subl $4,a2 + pushl a2 + pushl d1 + call @file_read_s_int + addl $12,sp + + popl a0 + popl a1 + popl a2 + + pushl a1 + pushl d1 + movl d0,d1 + movl a0,d0 + jmp *a2 + +readSFR: + pushl d0 + movl sp,a2 + pushl a2 + pushl $tmp_real + pushl d1 + finit + call @file_read_s_real + addl $12,sp + + fldl tmp_real + xchg d0,d1 + fstp %st(1) + + popl a0 + movl (sp),a2 + movl a0,(sp) + jmp *a2 + +readSFS: + popl a1 + lea 3(a1),a2 + andl $-4,a2 + lea -32+8(a4,a2),a2 + cmpl end_heap,a2 + ja readSFS_gc + +readSFS_r_gc: + movl $__STRING__+2,(a4) + addl $4,a4 + + pushl d0 + movl sp,a2 + pushl a2 + pushl a4 + pushl a1 + pushl d1 + call @file_read_s_string + addl $16,sp + +readSFS_end: + lea -4(a4),a0 + + addl $3,d0 + andl $-4,d0 + lea 4(a4,d0),a4 + + popl d0 + ret + +readSFS_gc: pushl a1 + call collect_0l + popl a1 + jmp readSFS_r_gc + +readLineSF: + lea -32+(4*(32+2))(a4),a2 + cmpl end_heap,a2 + ja readLineSF_gc + +readLineSF_r_gc: + movl $__STRING__+2,(a4) + lea 8(a4),a0 + addl $4,a4 + + pushl d0 + movl sp,a2 + pushl a2 + pushl a0 + movl end_heap,a1 + addl $32-4,a1 + subl a4,a1 + pushl a1 + pushl d1 + call @file_read_s_line + addl $16,sp + + movl d0,(a4) + + testl d0,d0 + jns readSFS_end + + lea -4(a4),a0 + +readLineSF_again: + movl end_heap,a1 + addl $32,a1 + lea -8(a1),d0 + subl a0,d0 + movl d0,(a4) + movl a1,a4 + + lea -32+4*(32+2)(a4,d0),a2 + call collect_1l + + movl 4(a0),d0 + lea 8(a0),a1 + + pushl a4 + + movl $__STRING__+2,(a4) + + lea 3(d0),a0 + shr $2,a0 + + movl d0,4(a4) + addl $8,a4 + jmp st_copy_string2 + +copy_st_lp2: + movl (a1),a2 + addl $4,a1 + movl a2,(a4) + addl $4,a4 +st_copy_string2: + subl $1,a0 + jnc copy_st_lp2 + + lea 4(sp),a2 + pushl a2 + pushl a4 + movl end_heap,a2 + addl $32,a2 + subl a4,a2 + pushl a2 + pushl d1 + call @file_read_s_line + addl $16,sp + + popl a0 + + testl d0,d0 + js readLineSF_again + + addl d0,4(a0) + addl $3,d0 + andl $-4,d0 + addl d0,a4 + + popl d0 + ret + +readLineSF_gc: + call collect_0l + jmp readLineSF_r_gc + +endSF: + pushl d0 + pushl d1 + call @file_s_end + addl $8,sp + ret + +positionSF: + pushl d0 + pushl d1 + call @file_s_position + addl $8,sp + ret + +seekSF: + popl a1 + popl a0 + + pushl d0 + movl sp,a2 + pushl a2 + pushl a0 + pushl a1 + pushl d1 + call @file_s_seek + addl $16,sp + + popl a0 + + xchg d0,d1 + + movl (sp),a2 + movl a0,(sp) + jmp *a2 |