#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 #ifndef LINUX .globl flushF #endif .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 #ifndef LINUX .globl @flush_file_buffer #endif .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 #ifndef LINUX flushF: pushl d1 call @flush_file_buffer movl 4(sp),a2 xchg d0,d1 movl $-1,4(sp) movl a2,(sp) ret #endif 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