You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1802 lines
39 KiB
1802 lines
39 KiB
push bp
|
|
mov bp,sp
|
|
push 10[bp]
|
|
push 8[bp]
|
|
push 6[bp]
|
|
call _main
|
|
add sp, #0x6
|
|
pop bp
|
|
retf
|
|
! 1
|
|
! 1 # 1 "main.c"
|
|
! 1 # 5
|
|
! 5 #include "std_singos/stdio.h"
|
|
! 1
|
|
! 1 void print(string);
|
|
!BCC_EOS
|
|
! 2 void* dump_ax_return(input);
|
|
!BCC_EOS
|
|
! 3
|
|
! 4 void print(string)
|
|
! 5 char* string;
|
|
export _print
|
|
_print:
|
|
!BCC_EOS
|
|
! 6 {
|
|
! 7 #asm
|
|
!BCC_ASM
|
|
_print.string set 2
|
|
|
|
push bp
|
|
mov bp,sp
|
|
mov si,4[bp]
|
|
call 0x0000:0x7C47
|
|
pop bp
|
|
! 13 endasm
|
|
!BCC_ENDASM
|
|
! 14 }
|
|
ret
|
|
! 15
|
|
! 16 void print_stack(argument)
|
|
! 17 {
|
|
export _print_stack
|
|
_print_stack:
|
|
! 18 #asm
|
|
!BCC_ASM
|
|
_print_stack.argument set 2
|
|
|
|
push bp
|
|
mov bp,sp
|
|
push ds
|
|
push ax
|
|
|
|
mov ax, ss
|
|
mov ds, ax
|
|
mov si,4[bp]
|
|
call 0x0000:0x7C47
|
|
|
|
pop ax
|
|
pop ds
|
|
pop bp
|
|
! 32 endasm
|
|
!BCC_ENDASM
|
|
! 33 }
|
|
ret
|
|
! 34
|
|
! 35 void* dump_ax_return(input)
|
|
! 36 void* input;
|
|
export _dump_ax_return
|
|
_dump_ax_return:
|
|
!BCC_EOS
|
|
! 37 {
|
|
! 38 return input;
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
mov ax,4[bp]
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
!BCC_EOS
|
|
! 39 }
|
|
! 40
|
|
! 41 void dump_ax(input)
|
|
! 42 void* input;
|
|
export _dump_ax
|
|
_dump_ax:
|
|
!BCC_EOS
|
|
! 43 {
|
|
! 44 dump_ax_return(input)
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
! 45 #asm
|
|
! Debug: list * void input = [S+6+2] (used reg = )
|
|
push 4[bp]
|
|
! Debug: func () * void = dump_ax_return+0 (used reg = )
|
|
call _dump_ax_return
|
|
inc sp
|
|
inc sp
|
|
!BCC_EOS
|
|
!BCC_ASM
|
|
_dump_ax.input set 8
|
|
.dump_ax.input set 4
|
|
push bp
|
|
mov bp,sp
|
|
call 0x000:0x7C2A
|
|
pop bp
|
|
! 50 endasm
|
|
!BCC_ENDASM
|
|
!BCC_EOS
|
|
! 51 }
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
! 52
|
|
! 53 void print_newline()
|
|
! 54 {
|
|
export _print_newline
|
|
_print_newline:
|
|
! 55 #asm
|
|
!BCC_ASM
|
|
|
|
printCRLF:
|
|
mov ah, #0xE
|
|
mov al, #13
|
|
int #0x10
|
|
mov al, #10
|
|
int #0x10
|
|
ret
|
|
! 63 endasm
|
|
!BCC_ENDASM
|
|
! 64 }
|
|
ret
|
|
! 65
|
|
! 6 # 1 "std_singos/stdlib.h"
|
|
! 1 unsigned int global_heap_start = 0;
|
|
export _global_heap_start
|
|
_global_heap_start:
|
|
.word 0
|
|
!BCC_EOS
|
|
! 2 unsigned int global_heap_end = 0;
|
|
export _global_heap_end
|
|
_global_heap_end:
|
|
.word 0
|
|
!BCC_EOS
|
|
! 3 unsigned int global_heap_next = 0;
|
|
export _global_heap_next
|
|
_global_heap_next:
|
|
.word 0
|
|
!BCC_EOS
|
|
! 4
|
|
! 5 void* malloc(num_bytes);
|
|
!BCC_EOS
|
|
! 6 int set_heap_settings(param_start, param_end);
|
|
!BCC_EOS
|
|
! 7 unsigned int get_heap_next();
|
|
!BCC_EOS
|
|
! 8
|
|
! 9 void* malloc(num_bytes)
|
|
! 10 int num_bytes;
|
|
.text
|
|
export _malloc
|
|
_malloc:
|
|
!BCC_EOS
|
|
! 11 {
|
|
! 12 unsigned int allocated_pointer = global_heap_next;
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
dec sp
|
|
dec sp
|
|
! Debug: eq unsigned int = [global_heap_next+0] to unsigned int allocated_pointer = [S+8-8] (used reg = )
|
|
mov ax,[_global_heap_next]
|
|
mov -6[bp],ax
|
|
!BCC_EOS
|
|
! 13 global_heap_next = global_heap_next + num_bytes;
|
|
! Debug: add int num_bytes = [S+8+2] to unsigned int = [global_heap_next+0] (used reg = )
|
|
mov ax,[_global_heap_next]
|
|
add ax,4[bp]
|
|
! Debug: eq unsigned int = ax+0 to unsigned int = [global_heap_next+0] (used reg = )
|
|
mov [_global_heap_next],ax
|
|
!BCC_EOS
|
|
! 14 if (global_heap_next > global_heap_end)
|
|
! Debug: gt unsigned int = [global_heap_end+0] to unsigned int = [global_heap_next+0] (used reg = )
|
|
mov ax,[_global_heap_next]
|
|
cmp ax,[_global_heap_end]
|
|
jbe .1
|
|
.2:
|
|
! 15 {
|
|
! 16 return 0;
|
|
xor ax,ax
|
|
inc sp
|
|
inc sp
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
!BCC_EOS
|
|
! 17 }
|
|
! 18
|
|
! 19 return allocated_pointer;
|
|
.1:
|
|
mov ax,-6[bp]
|
|
inc sp
|
|
inc sp
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
!BCC_EOS
|
|
! 20 }
|
|
! 21
|
|
! 22 int set_heap_settings(param_start, param_end)
|
|
! 23 unsigned int param_start;
|
|
export _set_heap_settings
|
|
_set_heap_settings:
|
|
!BCC_EOS
|
|
! 24 unsigned int param_end;
|
|
!BCC_EOS
|
|
! 25 {
|
|
! 26 global_heap_start = param_start;
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
! Debug: eq unsigned int param_start = [S+6+2] to unsigned int = [global_heap_start+0] (used reg = )
|
|
mov ax,4[bp]
|
|
mov [_global_heap_start],ax
|
|
!BCC_EOS
|
|
! 27 global_heap_next = param_start;
|
|
! Debug: eq unsigned int param_start = [S+6+2] to unsigned int = [global_heap_next+0] (used reg = )
|
|
mov ax,4[bp]
|
|
mov [_global_heap_next],ax
|
|
!BCC_EOS
|
|
! 28 global_heap_end = param_end;
|
|
! Debug: eq unsigned int param_end = [S+6+4] to unsigned int = [global_heap_end+0] (used reg = )
|
|
mov ax,6[bp]
|
|
mov [_global_heap_end],ax
|
|
!BCC_EOS
|
|
! 29 return 0;
|
|
xor ax,ax
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
!BCC_EOS
|
|
! 30 }
|
|
! 31
|
|
! 32 unsigned int get_heap_next()
|
|
! 33 {
|
|
export _get_heap_next
|
|
_get_heap_next:
|
|
! 34 return global_heap_next;
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
mov ax,[_global_heap_next]
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
!BCC_EOS
|
|
! 35 # 6 "main.c"
|
|
! 6 }
|
|
! 7 # 3 "std_singos/string.h"
|
|
! 3 typedef struct Length_String {
|
|
! 4 short dynamic;
|
|
!BCC_EOS
|
|
! 5 unsigned int length;
|
|
!BCC_EOS
|
|
! 6 char *chars;
|
|
!BCC_EOS
|
|
! 7 } Length_String;
|
|
!BCC_EOS
|
|
! 8
|
|
! 9 typedef struct String_Array {
|
|
! 10 unsigned int length;
|
|
!BCC_EOS
|
|
! 11 Length_String **strings;
|
|
!BCC_EOS
|
|
! 12 } String_Array;
|
|
!BCC_EOS
|
|
! 13
|
|
! 14 void strcpy (destination, destination_segment, source, source_segment );
|
|
!BCC_EOS
|
|
! 15 int strlen (source, source_segment);
|
|
!BCC_EOS
|
|
! 16 void memcpy (destination, destination_segment, source, source_segment, num_bytes );
|
|
!BCC_EOS
|
|
! 17
|
|
! 18
|
|
! 19 String_Array *string_split_c(string, delim, keep_delim);
|
|
!BCC_EOS
|
|
! 20 Length_String *make_length_string(length, chars);
|
|
!BCC_EOS
|
|
! 21 Length_String *make_length_string_c(cstring);
|
|
!BCC_EOS
|
|
! 22 String_Array *length_string_split(string, delim, keep_delim);
|
|
!BCC_EOS
|
|
! 23 String_Array *create_length_string_array(array_size);
|
|
!BCC_EOS
|
|
! 24 Length_String *create_length_string(length, chars);
|
|
!BCC_EOS
|
|
! 25
|
|
! 26
|
|
! 27
|
|
! 28 int strlen (source, source_segment)
|
|
! 29 {
|
|
export _strlen
|
|
_strlen:
|
|
! 30 #asm
|
|
!BCC_ASM
|
|
_strlen.source set 2
|
|
_strlen.source_segment set 4
|
|
|
|
|
|
push bp
|
|
mov bp,sp
|
|
push ds
|
|
push bx
|
|
|
|
mov ax, 6[bp];
|
|
mov ds, ax
|
|
|
|
mov bx, 4[bp];
|
|
|
|
label_strlen:
|
|
mov cx, #0x0 ; Set counte to zero
|
|
.label_strlen_loop:
|
|
mov BYTE al, [bx]
|
|
cmp al, #0x0
|
|
je .label_strlen_done
|
|
inc cx ; Count 1
|
|
inc bx ; Look at next char
|
|
jmp .label_strlen_loop
|
|
.label_strlen_done:
|
|
mov ax, cx
|
|
|
|
pop bx
|
|
pop ds
|
|
pop bp
|
|
! 58 endasm
|
|
!BCC_ENDASM
|
|
! 59 }
|
|
ret
|
|
! 60
|
|
! 61 void strcpy (destination, destination_segment, source, source_segment )
|
|
! 62 char *destination;
|
|
export _strcpy
|
|
_strcpy:
|
|
!BCC_EOS
|
|
! 63 int destination_segment;
|
|
!BCC_EOS
|
|
! 64 char *source;
|
|
!BCC_EOS
|
|
! 65 int source_segment;
|
|
!BCC_EOS
|
|
! 66 {
|
|
! 67 #asm
|
|
!BCC_ASM
|
|
_strcpy.source set 6
|
|
_strcpy.destination set 2
|
|
_strcpy.source_segment set 8
|
|
_strcpy.destination_segment set 4
|
|
; copy two strings
|
|
; IN si: the first (zero terminated) string
|
|
; IN di: the second (zero terminated) string
|
|
; OUT SF and ZF (same semantics as cmp)
|
|
|
|
! 73 77
|
|
|
|
push bp
|
|
mov bp,sp
|
|
label_strcpy:
|
|
push ax
|
|
push bx
|
|
push di
|
|
push es
|
|
push si
|
|
push ds
|
|
mov ax, 4[bp]; ;
|
|
mov di, ax
|
|
mov ax, 6[bp]; ;
|
|
mov es, ax
|
|
mov ax, 8[bp]; ;
|
|
mov si, ax
|
|
mov ax, 10[bp]; ;
|
|
mov ds, ax
|
|
mov cx, 0x050
|
|
.label_strcpy_loop:
|
|
movsb
|
|
cmp cx, 0x0
|
|
je .label_strcpy_end
|
|
dec cx
|
|
jmp .label_strcpy_loop
|
|
.label_strcpy_end:
|
|
pop ds
|
|
pop si
|
|
pop es
|
|
pop di
|
|
pop bx
|
|
pop ax
|
|
pop bp
|
|
|
|
! 111 endasm
|
|
!BCC_ENDASM
|
|
! 112 }
|
|
ret
|
|
! 113
|
|
! 114 void memcpy (destination, destination_segment, source, source_segment, num_bytes)
|
|
! 115 void *destination;
|
|
export _memcpy
|
|
_memcpy:
|
|
!BCC_EOS
|
|
! 116 int destination_segment;
|
|
!BCC_EOS
|
|
! 117 void *source;
|
|
!BCC_EOS
|
|
! 118 int source_segment;
|
|
!BCC_EOS
|
|
! 119 int num_bytes;
|
|
!BCC_EOS
|
|
! 120 {
|
|
! 121 #asm
|
|
!BCC_ASM
|
|
_memcpy.source set 6
|
|
_memcpy.destination set 2
|
|
_memcpy.num_bytes set $A
|
|
_memcpy.source_segment set 8
|
|
_memcpy.destination_segment set 4
|
|
; copy two strings
|
|
; IN si: the first (zero terminated) string
|
|
; IN di: the second (zero terminated) string
|
|
; OUT SF and ZF (same semantics as cmp)
|
|
|
|
! 127 132
|
|
|
|
push bp
|
|
mov bp,sp
|
|
label_memcpy:
|
|
push ax
|
|
push bx
|
|
push di
|
|
push es
|
|
push si
|
|
push ds
|
|
mov ax, 4[bp]; ;
|
|
mov di, ax
|
|
mov ax, 6[bp]; ;
|
|
mov es, ax
|
|
mov ax, 8[bp]; ;
|
|
mov si, ax
|
|
mov ax, 10[bp]; ;
|
|
mov ds, ax
|
|
mov cx, 12[bp];
|
|
.label_memcpy_loop:
|
|
movsb
|
|
cmp cx, 0x0
|
|
je .label_memcpy_end
|
|
dec cx
|
|
jmp .label_memcpy_loop
|
|
.label_memcpy_end:
|
|
pop ds
|
|
pop si
|
|
pop es
|
|
pop di
|
|
pop bx
|
|
pop ax
|
|
pop bp
|
|
|
|
! 166 endasm
|
|
!BCC_ENDASM
|
|
! 167 }
|
|
ret
|
|
! 168
|
|
! 169 String_Array *string_split_c(string, delim, keep_delim)
|
|
! 170 char *string;
|
|
export _string_split_c
|
|
_string_split_c:
|
|
!BCC_EOS
|
|
! 171 char delim
|
|
! 171 ;
|
|
!BCC_EOS
|
|
! 172 short keep_delim;
|
|
!BCC_EOS
|
|
! 173 {
|
|
! 174 return length_string_split(make_length_string_c(string), delim, keep_delim);
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
! Debug: list short keep_delim = [S+6+6] (used reg = )
|
|
push 8[bp]
|
|
! Debug: list char delim = [S+8+4] (used reg = )
|
|
mov al,6[bp]
|
|
xor ah,ah
|
|
push ax
|
|
! Debug: list * char string = [S+$A+2] (used reg = )
|
|
push 4[bp]
|
|
! Debug: func () * struct Length_String = make_length_string_c+0 (used reg = )
|
|
call _make_length_string_c
|
|
inc sp
|
|
inc sp
|
|
! Debug: list * struct Length_String = ax+0 (used reg = )
|
|
push ax
|
|
! Debug: func () * struct String_Array = length_string_split+0 (used reg = )
|
|
call _length_string_split
|
|
add sp,*6
|
|
! Debug: cast * struct String_Array = const 0 to * struct String_Array = ax+0 (used reg = )
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
!BCC_EOS
|
|
! 175 }
|
|
! 176
|
|
! 177 Length_String *make_length_string_c(cstring)
|
|
! 178 char *cstring;
|
|
export _make_length_string_c
|
|
_make_length_string_c:
|
|
!BCC_EOS
|
|
! 179 {
|
|
! 180 return make_length_string(strlen(cstring, 0x7e0), cstring);
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
! Debug: list * char cstring = [S+6+2] (used reg = )
|
|
push 4[bp]
|
|
! Debug: list int = const $7E0 (used reg = )
|
|
mov ax,#$7E0
|
|
push ax
|
|
! Debug: list * char cstring = [S+$A+2] (used reg = )
|
|
push 4[bp]
|
|
! Debug: func () int = strlen+0 (used reg = )
|
|
call _strlen
|
|
add sp,*4
|
|
! Debug: list int = ax+0 (used reg = )
|
|
push ax
|
|
! Debug: func () * struct Length_String = make_length_string+0 (used reg = )
|
|
call _make_length_string
|
|
add sp,*4
|
|
! Debug: cast * struct Length_String = const 0 to * struct Length_String = ax+0 (used reg = )
|
|
pop si
|
|
pop di
|
|
pop bp
|
|
ret
|
|
!BCC_EOS
|
|
! 181 }
|
|
! 182
|
|
! 183 Length_String *make_length_string(length, chars)
|
|
! 184 unsigned int length;
|
|
export _make_length_string
|
|
_make_length_string:
|
|
!BCC_EOS
|
|
! 185 char *chars;
|
|
!BCC_EOS
|
|
! 186 {
|
|
! 187
|
|
! 188 Length_String *legth_string = malloc(sizeof(Length_String));
|
|
push bp
|
|
mov bp,sp
|
|
push di
|
|
push si
|
|
dec sp
|
|
dec sp
|
|
! Debug: list int = const 6 (used reg = )
|
|
mov ax,*6
|
|
push ax
|
|
! Debug: func () * void = malloc+0 (used reg = )
|
|
call _malloc
|
|
inc sp
|
|
inc sp
|
|
! Debug: eq * void = ax+0 to * struct Length_String legth_string = [S+8-8] (used reg = )
|
|
mov -6[bp],ax
|
|
!BCC_EOS
|
|
! 189
|
|
! 190 char *copy = malloc(length + 1);
|
|
dec sp
|
|
dec sp
|
|
! Debug: add int = const 1 to unsigned int length = [S+$A+2] (used reg = )
|
|
mov ax,4[bp]
|
|
! Debug: list unsigned int = ax+1 (used reg = )
|
|
inc ax
|
|
push ax
|
|
! Debug: func () * void = malloc+0 (used reg = )
|
|
call _malloc
|
|
inc sp
|
|
inc sp
|
|
! Debug: eq * void = ax+0 to * char copy = [S+$A-$A] (used reg = )
|
|
mov -8[bp],ax
|
|
!BCC_EOS
|
|
! 191 memcpy(copy, 0x7e0, chars, 0x7e0, length);
|
|
! Debug: list unsigned int length = [S+$A+2] (used reg = )
|
|
push 4[bp]
|
|
! Debug: list int = const $7E0 (used reg = )
|
|
mov ax,#$7E0
|
|
push ax
|
|
! Debug: list * char chars = [S+$E+4] (used reg = )
|
|
push 6[bp]
|
|
! Debug: list int = const $7E0 (used reg = )
|
|
mov ax,#$7E0
|
|
push ax
|
|
! Debug: list * char copy = [S+$12-$A] (used reg = )
|
|
push -8[bp]
|
|
! Debug: func () void = memcpy+0 (used reg = )
|
|
call _memcpy
|
|
add sp,*$A
|
|
!BCC_EOS
|
|
! 192 copy[length] = ' |