0,0 → 1,1439 |
; CODE VIEWER - Compile with FASM for Menuet |
|
;B+ System header |
use32 |
org 0x0 |
db 'MENUET00' |
dd 38 |
dd START |
dd I_END |
dd 0x100000 |
dd 0x00000000 |
|
include 'lang.inc' |
include 'macros.inc' |
;E:. |
|
;B+ Definitions |
type_begin equ 0 |
type_end_normal equ 2 |
type_not_end equ 4 |
type_end_plus equ 6 |
type_include equ 8 |
type_file_end equ 11 |
; +1, if active jump |
|
char_end equ 11 |
new_line equ 10 |
|
win_width equ (496+6*6) |
win_field equ (4+10+6*6) |
win_toptext equ 38+4 |
;B+ Keys |
KEY_UP equ (130+48) |
KEY_DOWN equ (129+48) |
KEY_PGUP equ (136+48) |
KEY_PGDOWN equ (135+48) |
;E:. |
start_data equ (I_END+10+27+16) |
;E:. |
|
;B+ Execution |
START: |
jmp load_file1 |
;B+ Main cicle |
redr: |
call draw_window |
still: |
mov eax,10 |
int 0x40 |
still_: |
cmp eax,1 |
je redr |
cmp eax,2 |
jne no_key |
mov eax,2 |
int 0x40 |
jmp key |
no_key: |
cmp eax,3 |
jne still |
mov eax,17 |
int 0x40 |
cmp ah,1 |
jne .no_close |
mov eax,-1 |
int 0x40 |
.no_close: |
jmp button |
jmp still |
;E:. |
key: |
;B+ Scroll text |
mov ebx,[top_pos] |
mov [activ_pos],ebx |
mov bx,[top_line] |
mov [activ_line],bx |
mov bx,[top_depth] |
mov [activ_depth],bx |
mov ebx,[top_file] |
mov [activ_file],ebx |
cmp ah,KEY_DOWN ;key_up |
jne .no_down |
call line_down |
jmp .save_shift |
.no_down: |
cmp ah,KEY_UP ;key down |
jne .no_up |
call line_up |
jmp .save_shift |
.no_up: |
cmp ah,KEY_PGUP ;key page up |
jne .no_pgup |
mov edi,35 |
.next_line: |
call line_up |
dec edi |
jnz .next_line |
jmp .save_shift |
.no_pgup: |
cmp ah,KEY_PGDOWN ;key page down |
jne .no_pgdown |
mov edi,35 |
.next_line1: |
call line_down |
dec edi |
jnz .next_line1 |
jmp .save_shift |
.no_pgdown: |
jmp still |
.save_shift: |
mov ebx,[activ_pos] |
mov [top_pos],ebx |
mov bx,[activ_line] |
mov [top_line],bx |
mov bx,[activ_depth] |
mov [top_depth],bx |
mov ebx,[activ_file] |
mov [top_file],ebx |
; Show new text |
mov ebx,1 |
mov eax,12 |
int 0x40 |
call show_text |
mov ebx,2 |
mov eax,12 |
int 0x40 |
jmp still |
;E:. |
button: |
;B+ Distribute button events |
shr eax,8 |
and eax,0xff |
cmp eax,100 |
jge down_buttons |
;B+ Left buttons |
;B+ Find line place |
sub eax,2 |
mov ebx,[top_pos] |
mov [activ_pos],ebx |
mov bx,[top_depth] |
mov [activ_depth],bx |
mov ebx,[top_file] |
mov [activ_file],ebx |
mov bx,[top_line] |
mov [activ_line],bx |
mov ecx,eax |
or ecx,ecx |
jz .line_find |
.next_line: |
push ecx |
call line_down |
pop ecx |
loop .next_line |
.line_find: |
mov ebx,[activ_pos] |
;E:. |
;B+ Switch, if special line |
mov cx,[ebx] |
test cx,not 15 |
jnz still |
cmp cx,type_begin |
je .is_begin_end |
cmp cx,type_begin+1 |
jne .not_begin_end |
.is_begin_end: |
xor [ebx],word 1 |
mov ebx,[ebx+4] |
add ebx,[activ_file] |
xor [ebx],word 1 |
jmp .paint |
.not_begin_end: |
cmp cx,type_include |
je .open_file |
;close file |
cmp cx,type_include+1 |
jne .not_include |
xor [ebx],word 1 |
jmp .paint |
.open_file: |
;Open file |
cmp dword [ebx+4],-1 |
je .load_file |
xor [ebx],word 1 |
jmp .paint |
.paint1: |
pop ebx |
jmp .paint |
.load_file: |
push ebx |
;B+ Prepare file name |
mov ecx,26 |
mov edi,incl_filename |
mov al,' ' |
cld |
rep stosb |
mov cl,[skoba_txt] |
mov ch,[skoba_txt+1] |
add ebx,12 |
.next_char: |
cmp [ebx],cl |
je .begin |
cmp byte [ebx],new_line |
je .paint1 |
inc ebx |
jmp .next_char |
.begin: |
inc ebx |
mov esi,ebx |
.next_char1: |
cmp [ebx],ch |
je .end |
cmp byte [ebx],new_line |
je .paint1 |
inc ebx |
jmp .next_char1 |
.end: |
sub ebx,esi |
mov edi,incl_filename |
mov ecx,ebx |
push ecx |
rep movsb |
; mov al,0 |
; stosb |
|
;Save in memory |
mov ecx,[esp] |
mov esi,incl_filename |
mov edi,[end_of_file] |
rep movsb |
pop ecx |
mov [edi],ecx |
add ecx,2 |
add [end_of_file],ecx |
|
mov ebx,[esp] |
;E:. |
mov edi,[top_free_file] |
mov [ebx+4],edi |
|
mov [activ_pos],ebx |
mov eax,[activ_file] |
sub ebx,eax |
mov [incl_line],ebx |
push eax |
call line_down |
pop eax |
mov ebx,[activ_pos] |
sub ebx,eax |
mov [incl_next],ebx |
pop ebx |
xor [ebx],word 1 |
push eax |
mov eax,[end_of_file] |
add eax,16 |
mov [activ_file],eax |
lea edi,[file_array+4*edi] |
mov [edi],eax |
mov [activ_pos],eax |
|
mov ebx,[incl_line] |
mov [eax-12],ebx |
mov bx,[activ_line] |
dec bx |
mov word [eax-6],bx |
;B+ Save number for new file |
mov ebx,[esp] |
cmp ebx,[file_array] |
jne .no_root |
mov [eax-8],word 0 |
jmp .parent_ok |
.no_root: |
mov ebx,[esp] |
mov bl,[ebx-2] |
and ebx,0xff |
mov [eax-8],bx |
.parent_ok: |
push eax |
;E:. |
call add_file |
mov edi,[block_pointer] |
mov word [edi+4],char_end |
add [block_pointer],8 |
push edi |
call fresh_file |
pop edi eax |
mov [block_pointer],edi |
|
;B+ Save newfile line count |
mov edi,[line_] |
mov word [eax-4],di |
;E:. |
pop eax |
|
mov [activ_file],eax |
inc [top_free_file] |
jmp .paint |
.not_include: |
|
.paint: |
mov ebx,1 |
mov eax,12 |
int 0x40 |
call show_text |
mov ebx,2 |
mov eax,12 |
int 0x40 |
;E:. |
jmp still |
;E:. |
down_buttons: |
;B+ If down buttons |
cmp eax,101 |
je load_file ;Button 'Load' |
sub eax,100 |
mov edx,[str_table+4*eax] |
mov [str_start],edx |
;B+ Clear old info |
push edx |
;clear text |
mov ecx,0xaa0000 |
call print_str |
pop edx |
;clear memory place |
mov ecx,[edx] |
lea edi,[edx+8] |
mov eax,' ' |
cld |
rep stosb |
;E:. |
mov ebx,[edx] |
mov [max_len],ebx |
mov ebx,[edx+4] |
jmp load_str |
save_str: |
;B+ Save in base place |
;B+ If file convert to upper case |
mov eax,it1 |
cmp eax,[str_start] |
jne .no_file |
mov ecx,0xaa0000 |
mov edx,str_ |
mov esi,[it1] |
mov ebx,[it1+4] |
mov eax,4 |
int 0x40 |
mov edx,edi |
mov eax,str_ |
dec eax |
inc edx |
.next_char: |
inc eax |
dec edx |
jz .no_file |
cmp byte [eax],'a' |
jl .next_char |
cmp byte [eax],'z' |
jg .next_char |
add byte [eax],'A'-'a' |
jmp .next_char |
.no_file: |
;E:. |
mov edx,[str_start] |
add edx,8 |
mov ecx,edi |
add edi,edx |
mov byte [edi],char_end |
mov eax,it1 |
cmp eax,[str_start] |
jne .no_null |
mov byte [edi],' ' ;0 |
.no_null: |
mov esi,str_ |
mov edi,edx |
cld |
rep movsb |
mov ecx,0xffffff |
jmp print_str |
;E:. |
;E:. |
;E:. |
;B+ String tools |
;B+ Data for load string |
curs db '_' |
str_: times 100 db ' ' |
db char_end |
max_len dd 10 |
;E:. |
load_str: |
;B+ Load text field |
xor edi,edi |
mov ecx,0xffaaaa |
mov esi,1 |
.next_char: |
mov edx,curs |
mov eax,4 |
int 0x40 |
;B+ Get key event |
mov eax,10 |
int 0x40 |
push eax |
mov ecx,0xaa0000 |
mov eax,4 |
int 0x40 |
pop eax |
cmp eax,2 |
je .yes_key |
call save_str |
jmp still_ |
.yes_key: |
mov eax,2 |
int 0x40 |
;E:. |
;B+ Test enter |
cmp ah,13 |
jne .no_ok |
call save_str |
jmp still |
.no_ok: |
;E:. |
;B+ Test backspace |
cmp ah,8 |
jne .no_backsp |
or edi,edi |
jz .next_char |
mov byte [str_+edi],' ' |
mov ecx,0xaa0000 |
mov eax,4 |
int 0x40 |
dec edi |
sub ebx,6*65536 |
lea edx,[str_+edi] |
int 0x40 |
mov ecx,0xffaaaa |
jmp .next_char |
.no_backsp: |
;E:. |
;B+ Prin 1 char |
mov [str_+edi],ah |
mov ecx,0xaa0000 |
mov eax,4 |
int 0x40 |
mov ecx,0xffaaaa |
lea edx,[str_+edi] |
cmp [max_len],edi |
je .next_char |
int 0x40 |
add ebx,6*65536 |
inc edi |
;E:. |
jmp .next_char |
;E:. |
print_str: |
;B+ Print select string |
mov ebx,[str_start] |
lea edx,[ebx+8] |
mov esi,[ebx] |
mov ebx,[ebx+4] |
mov eax,4 |
int 0x40 |
;B+ Test special strings |
pusha |
mov eax,[str_start] |
cmp eax,it2 |
jge .is_ok1 |
popa |
ret |
.is_ok1: |
cmp eax,it3 |
jle .is_ok |
popa |
ret |
.is_ok: |
;E:. |
add eax,8 |
.next_char: |
mov esi,1 |
cmp byte [eax],' ' |
jne .no_space |
;B+ Draw special space |
push eax |
mov edx,space |
mov eax,4 |
int 0x40 |
push ebx |
sub ebx,1*65536 |
mov edx,dot |
int 0x40 |
add ebx,3*65536 |
int 0x40 |
pop ebx |
pop eax |
;E:. |
.no_space: |
add ebx,6*65536 |
cmp byte [eax],char_end |
jne .no_ret |
popa |
ret |
.no_ret: |
inc eax |
jmp .next_char |
|
space db '_' |
dot db '.' |
;E:. |
;E:. |
;B+ Add / remove files |
add_file: |
;B+ Load and link file |
mov eax,[activ_file] |
push eax |
mov ebx,incl_filename |
mov ecx,0 |
mov edx,-1 |
mov esi,eax |
mov eax,6 |
int 0x40 |
|
mov ebx,[esp] |
inc eax |
mov [ebx-16],eax |
dec eax |
add ebx,eax |
add eax,16+15 +20 ;??? |
add [end_of_file],eax |
mov byte [ebx],new_line |
mov word [ebx+1],char_end |
mov ax,[activ_line] |
mov word [ebx+3],ax |
mov eax,[incl_next] |
mov [ebx+5],eax |
mov dword [ebx+9],new_line |
mov byte [ebx+13],new_line |
pop ebx |
mov eax,[top_free_file] |
mov byte [ebx-2],al ; this file num |
mov byte [ebx-1],new_line |
ret |
;E:. |
;B+ Include file data |
incl_filename db 'KERNEL.ASM' |
if_e: |
times (26+incl_filename-if_e) db ' ' |
incl_line dd 0x0 |
incl_next dd 0x0 |
;E:. |
;E:. |
;E:. |
|
;B+ Visualization tools |
draw_window: |
;B+ Redraw window |
mov ebx,1 |
mov eax,12 |
int 0x40 |
;B+ Draw window |
mov ebx,((640-win_width)/2)*65536+win_width |
mov ecx,10*65536+win_toptext+35*10+1+2*16 |
mov edx,[color_depth] |
or edx,0x03000000 |
mov esi,0x80aaaaff |
mov edi,0x00009000 |
mov eax,0x0 |
int 0x40 |
;E:. |
;B+ Draw caption |
mov ebx,8*65537 |
mov ecx,0xffffff |
mov edx,caption |
mov esi,caption_end-caption |
mov eax,4 |
int 0x40 |
;E:. |
;B+ Draw first line |
mov ebx,5*65536+win_width-9 |
mov ecx,25*65536+win_toptext-22-4 |
mov edx,0xaa0000 |
mov eax,13 |
int 0x40 |
mov ebx,21*65536+29 |
mov ecx,0xffffff |
mov edx,line1up1 |
mov esi,line1up1_end-line1up1 |
mov eax,4 |
int 0x40 |
mov ebx,(win_field+6)*65536+29 |
mov edx,line1up2 |
mov esi,line1up2_end-line1up2 |
int 0x40 |
;E:. |
;B+ Main text zone |
;B+ Fill text |
;Clear type lines |
mov edi,lines_view |
mov ecx,35 |
mov eax,0 |
cld |
repe stosd |
call show_text |
;E:. |
;B+ Define left buttons |
; mov ebx,5*65536+9 |
; mov ecx,win_toptext*65536+9 |
; mov edx,0 |
; mov esi,0x9000a0 |
; mov eax,8 |
; mov edi,35 |
;.new_button: |
; int 0x40 |
; add ecx,10*65536 |
; inc edx |
; dec edi |
; jnz .new_button |
;E:. |
;B+ Vertical line |
mov ebx,(win_field-1)*65537 |
mov ecx,24*65536+win_toptext+35*10 |
mov edx,0xffffff |
mov eax,38 |
int 0x40 |
;E:. |
;E:. |
;B+ Down controle zone |
mov ebx,5*65536+win_width-9 |
mov ecx,(35*10+win_toptext+1)*65536+28 |
mov edx,0xaa0000 |
mov eax,13 |
int 0x40 |
|
mov eax,line1down |
mov ebx,filetxt |
mov ecx,filetxt_end |
call ins_button_prep |
mov edx,100 |
mov eax,8 |
int 0x40 |
mov eax,line1down |
mov ebx,loadtxt |
mov ecx,loadtxt_end |
call ins_button_prep |
inc edx |
mov eax,8 |
int 0x40 |
mov eax,line1down |
mov ebx,begintxt |
mov ecx,begintxt_end |
call ins_button_prep |
inc edx |
mov eax,8 |
int 0x40 |
mov eax,line1down |
mov ebx,endtxt |
mov ecx,endtxt_end |
call ins_button_prep |
inc edx |
mov eax,8 |
int 0x40 |
mov eax,line2down |
mov ebx,inctxt |
mov ecx,inctxt_end |
call ins_button_prep |
add ecx,14*65536 |
inc edx |
mov eax,8 |
int 0x40 |
mov eax,line2down |
mov ebx,septxt |
mov ecx,septxt_end |
call ins_button_prep |
add ecx,14*65536 |
inc edx |
mov eax,8 |
int 0x40 |
|
mov ebx,22*65536+35*10+win_toptext+4 |
mov ecx,0xffffff |
mov edx,line1down |
mov esi,line1down_end-line1down |
mov eax,4 |
int 0x40 |
add ebx,14 |
mov edx,line2down |
mov esi,line2down_end-line2down |
int 0x40 |
;E:. |
;B+ Down controle strings |
mov ecx,0xffffff |
mov eax,it1 |
mov [str_start],eax |
call print_str |
mov eax,it2 |
mov [str_start],eax |
call print_str |
mov eax,it3 |
mov [str_start],eax |
call print_str |
mov eax,it4 |
mov [str_start],eax |
call print_str |
mov eax,it5 |
mov [str_start],eax |
call print_str |
;E:. |
mov ebx,2 |
mov eax,12 |
int 0x40 |
ret |
;E:. |
ins_button_prep: |
;B+ Insert button |
push edx |
push eax |
sub ecx,ebx |
mov eax,6 |
mul ecx |
add eax,6 |
push ax |
mov eax,[esp+2] |
sub ebx,eax |
mov eax,6 |
mul ebx |
add eax,18 |
xchg eax,ebx |
shl ebx,16 |
pop bx |
mov ecx,(35*10+win_toptext+1)*65536+13 |
mov esi,0x00a050 |
pop eax |
pop edx |
ret |
;E:. |
show_text: |
;B+ Show text |
;B+ Show file on top |
mov ebx,(win_field+45)*65536+win_width-(win_field+45+8) |
mov ecx,25*65536+win_toptext-22-4 |
mov edx,0xaa0000 |
mov eax,13 |
int 0x40 |
|
mov edx,[top_file] |
xor esi,esi |
mov si,[edx-18] |
sub edx,18 |
sub edx,esi |
mov ebx,(win_field+45)*65536+29 |
mov ecx,0xffaaaa |
mov eax,4 |
int 0x40 |
;E:. |
mov ax,[top_line] |
mov [activ_line],ax |
mov ebx,[top_pos] |
mov [activ_pos],ebx |
mov ax,[top_depth] |
mov [activ_depth],ax |
mov eax,[top_file] |
mov [activ_file],eax |
mov ecx,35 |
mov [line_],0 |
.next_line: |
cmp [activ_depth],0 |
jne .next |
cmp byte [ebx],char_end |
je .end_of_file |
.next: |
push ecx |
call show_line |
call line_down |
inc [line_] |
pop ecx |
loop .next_line |
ret |
.end_of_file: |
push ecx |
call clear_line |
|
inc [activ_pos] |
inc [line_] |
pop ecx |
loop .end_of_file |
ret |
;E:. |
;B+ Button chars |
leftchars db '-','+',' ','H' |
db '?', 0 ,'!','H' |
db '&','x',' ', 0 |
;E:. |
show_line: |
;B+ Show line |
call clear_line |
mov ebx,ecx |
shr ebx,16 |
inc ebx |
or ebx,(win_field+6)*65536 |
push ebx |
push eax |
;B+ Draw left button char |
mov eax,[activ_pos] |
mov ax,[eax] |
test ax,not 15 |
jnz .no_text |
and eax,0xff |
lea edx,[leftchars+eax] |
and ebx,0xffff |
or ebx,8*65536 |
mov ecx,0xffffff |
mov esi,1 |
mov eax,4 |
int 0x40 |
mov ebx,[esp+4] |
.no_text: |
;E:. |
;B+ Draw line number |
xor ecx,ecx |
mov cx,[activ_line] |
mov edx,(10+4+4)*65536 |
mov dx,bx |
mov ebx,5*65536 |
mov esi,0xeeeeee |
mov eax,47 |
int 0x40 |
;E:. |
;B+ Find line length |
xor esi,esi |
mov eax,[activ_pos] |
cmp byte [eax],new_line |
je .len_ok |
test word [eax],not 15 |
jnz .next_char |
add eax,12 ;sckip system zone |
.next_char: |
cmp byte [eax],new_line |
je .len_ok |
inc esi |
inc eax |
jmp .next_char |
.len_ok: |
mov eax,6 |
mul esi |
mov ecx,eax |
add ecx,6 |
pop eax |
mov [eax+2],cx |
;E:. |
mov ecx,[textcolor] |
mov edx,[activ_pos] |
xor edi,edi |
xor ebx,ebx |
mov bx,word [edx] |
cmp bl,new_line |
je .normal_show_line |
test bx,not 15 |
jnz .normal_show_line |
or edi,ebx |
mov ecx,[color_type+4*ebx] |
add edx,12 ;sckip system zone |
.normal_show_line: |
pop ebx |
mov eax,4 |
int 0x40 |
test edi,4 ;bad type close block |
jz .nobad |
add ebx,65536 |
int 0x40 |
.nobad: |
ret |
;E:. |
color_type: |
;B+ Color data |
dd 0x00dddd,0x00ee00 ;0/1 begin 00ee00 |
dd 0x00b5b5,0xffa000 ;2/3 end 00d000 |
dd 0xffffff,-1 ;4 text end |
dd 0x00b5b5,0xffa000 ;6/7 auto end |
dd 0x80ccff,0x80aaff ;8/9 include |
dd -1 ,0xffa000 ;11 file end |
textcolor dd 0xffffff |
;E:. |
clear_line: |
;B+ Clear text in line |
;B+ Find line position |
mov eax,[line_] |
mov ecx,10 |
mul cx |
mov ecx,eax |
add ecx,win_toptext |
;E:. |
;B+ Draw/clear button |
push ecx |
shl ecx,16 |
mov cx,9 |
mov ebx,5*65536+9 |
mov edx,[line_] |
add edx,2 |
mov esi,0x9000a0 |
mov eax,8 |
int 0x40 |
pop ecx |
;E:. |
;B+ Clear zone for line |
shl ecx,16 |
mov cx,10 |
mov ebx,(5+11)*65536+win_field-5-12 |
xor edx,edx |
mov dx,[activ_depth] |
mov edx,[color_depth+4*edx] |
mov eax,13 |
int 0x40 |
;E:. |
;B+ Clear main text zone |
mov ebx,(win_field)*65536+(win_width-win_field-8) |
mov eax,[line_] |
lea eax,[lines_view+4*eax] |
push eax |
mov ax,[eax] |
cmp ax,[activ_depth] |
jne .draw_all_line |
mov eax,[esp] |
cmp bx,[eax+2] |
jle .draw_all_line |
mov bx,[eax+2] |
.draw_all_line: |
mov eax,13 |
int 0x40 |
;E:. |
;B+ Update line type I |
pop eax |
mov bx,[activ_depth] |
mov [eax],bx |
;E:. |
ret |
|
activ_depth dw 0x0 |
color_depth dd 0x404040,0x606060,0x707070,0x7a7a7a |
dd 0x878787,0x909090,0x9a9a9a,0xa5a5a5 |
dd 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 |
lines_view: times 35 dd 0 |
;E:. |
line_up: |
;B+ Line up |
;B+ Test jumps I |
mov ebx,[activ_pos] |
cmp ebx,[activ_file] |
jne .yes_scroll |
cmp [activ_depth],0 |
jz .top_of_file |
dec [activ_depth] |
xor eax,eax |
mov ax,[ebx-8] |
mov eax,[file_array+4*eax] |
mov [activ_file],eax |
add eax,[ebx-12] |
mov [activ_pos],eax |
mov ax,[ebx-6] |
mov [activ_line],ax |
.top_of_file: |
ret |
;E:. |
.yes_scroll: |
sub ebx,2 |
.normal_line_up1: |
cmp byte [ebx],new_line |
je .line_ok |
dec ebx |
jmp .normal_line_up1 |
.line_ok: |
;B+ Test for special line |
cmp dword [ebx],new_line |
jne .line_ok1 |
sub ebx,9 |
;E:. |
.line_ok1: |
inc ebx |
test word [ebx],not 15 |
jnz .normal_line_up |
test word [ebx],1 |
jz .normal_line_up |
;B+ Test jumps II |
cmp word [ebx],type_end_normal+1 |
je .to_begin |
cmp word [ebx],type_end_plus+1 |
je .to_begin |
cmp word [ebx],type_include+1 |
je .to_incl |
jmp .normal_line_up |
;E:. |
.to_begin: |
mov eax,[ebx+4] |
add eax,[activ_file] |
mov [activ_pos],eax |
mov ax,[ebx+2] |
inc ax |
sub [activ_line],ax |
ret |
.to_incl: |
inc [activ_depth] |
mov eax,[ebx+4] |
mov eax,[file_array+4*eax] |
mov [activ_file],eax |
mov bx,[eax-4] |
mov [activ_line],bx |
add eax,[eax-16] |
mov [activ_pos],eax |
ret |
.normal_line_up: |
mov [activ_pos],ebx |
dec [activ_line] |
ret |
;E:. |
line_down: |
;B+ Line down |
mov ebx,[activ_pos] |
cmp byte [ebx],char_end |
jne .yes_scroll |
cmp [activ_depth],0 |
jne .yes_scroll |
ret |
.yes_scroll: |
cmp byte [ebx],new_line |
je .normal_line_down |
test word [ebx],not 15 |
jnz .normal_line_down |
test word [ebx],1 |
jz .not_activated |
;B+ Test jumps |
cmp word [ebx],type_begin+1 |
jne .no_begin |
mov eax,[ebx+4] |
add eax,[activ_file] |
mov [activ_pos],eax |
mov ax,[ebx+2] |
add [activ_line],ax |
call line_down |
ret |
.no_begin: |
cmp word [ebx],type_end_normal+1 |
je .not_activated |
cmp word [ebx],type_end_plus+1 |
je .not_activated |
;goto include |
cmp word [ebx],type_include+1 |
jne .no_incl |
inc [activ_depth] |
mov eax,[ebx+4] |
mov eax,[file_array+4*eax] |
mov [activ_file],eax |
mov [activ_pos],eax |
mov [activ_line],1 |
ret |
.no_incl: |
;return from include |
cmp word [ebx],type_file_end |
jne .no_end |
;CHECK FOR FIRST |
mov ax,[ebx+2] |
mov [activ_line],ax |
dec [activ_depth] |
mov ecx,[activ_file] |
xor eax,eax |
mov ax,[ecx-8] |
mov eax,[file_array+4*eax] |
mov [activ_file],eax |
add eax,[ebx+4] |
mov [activ_pos],eax |
mov ebx,eax |
ret |
.no_end: |
;E:. |
.not_activated: |
add ebx,12 ;sckip system zone |
.normal_line_down: |
cmp byte [ebx],new_line |
je .line_ok |
cmp byte [ebx],char_end |
inc ebx |
jmp .normal_line_down |
.line_ok: |
inc ebx |
mov [activ_pos],ebx |
inc [activ_line] |
ret |
;E:. |
;B+ File possition var. |
line_ dd 0x0 ;Line on screen |
|
top_pos dd start_data |
top_line dw 1 |
top_depth dw 0x0 |
activ_pos dd start_data |
activ_line dw 0x0 ;Abs line in file |
;E:. |
;E:. |
|
;B+ Load file tools |
load_file: |
;B+ Main |
;B+ Init parameters |
mov [top_pos],start_data |
mov [activ_pos],start_data |
mov [top_file],start_data |
mov [activ_file],start_data |
mov [file_array],start_data |
mov [top_free_file],1 |
mov [end_of_file],start_data |
mov [top_line],1 |
mov esi,file_txt |
mov edi,incl_filename |
mov ecx,25 |
cld |
rep movsb |
;E:. |
load_file1: |
;B+ Load and fresh file |
mov eax,[end_of_file] |
push eax |
call add_file |
mov edi,[esp] |
mov esi,incl_filename |
sub edi,16+25+2 |
mov ecx,27 |
cld |
rep movsb |
pop edi |
mov word [edi-18],25 |
mov eax,[top_pos] |
mov [activ_pos],eax |
call fresh_file |
|
call draw_window |
|
jmp still |
;E:. |
;E:. |
fresh_file: |
;B+ Fresh file |
mov [line_],0 |
mov [next_],next |
.fresh_next: |
inc [line_] |
;Test open block |
mov eax,[begin_txt] |
mov ebx,[activ_pos] |
cmp [ebx],eax |
je block_begin |
;Test close block |
mov eax,[end_txt] |
cmp [ebx],eax |
je block_end |
;B+ Test include |
mov esi,ebx |
mov edi,include_txt |
mov ecx,20 |
cld |
rep cmpsb |
cmp byte [edi-1],char_end |
je include_file |
;E:. |
next: |
;B+ Go to next line |
mov ebx,[activ_pos] |
.next_char: |
cmp byte [ebx],new_line |
je yes_next |
cmp byte [ebx],char_end |
je file_end |
inc ebx |
jmp .next_char |
yes_next: |
inc ebx |
inc [activ_line] |
mov [activ_pos],ebx |
jmp fresh_file.fresh_next |
;E:. |
file_end: |
;B+ Auto set close block |
mov [next_],.try_fill_next |
sub ebx,5 |
dec [activ_line] |
mov [activ_pos],ebx |
.try_fill_next: |
add [activ_pos],5 |
inc [activ_line] |
mov ebx,[activ_pos] |
mov eax,[end_txt] |
mov ecx,[block_pointer] |
cmp word [ecx-4],char_end |
je .fill_ok |
inc [line_] |
call ins_5_bytes |
mov dword [ebx],eax |
mov byte [ebx+4],new_line |
mov byte [ebx+5],char_end |
mov [activ_pos],ebx |
jmp block_end |
;E:. |
.fill_ok: |
ret |
;E:. |
;B+ Specify line markers |
block_begin: |
;B+ Mark block begin |
;B+ Mark info in stack |
mov eax,[activ_pos] |
mov ebx,[block_pointer] |
push eax |
sub eax,[activ_file] |
mov [ebx],eax |
pop eax |
mov word [ebx+4],0 |
mov cx,[activ_line] |
mov word [ebx+6],cx |
add ebx,8 |
mov [block_pointer],ebx |
;E:. |
call ins_12_bytes |
;line / possition not ready |
mov word [eax],type_begin+1 |
mov dword [eax+8],new_line |
add [activ_pos],12 |
jmp [next_] |
;E:. |
block_end: |
;B+ Mark block end |
;B+ Mark end type I |
mov eax,[activ_pos] |
call ins_12_bytes |
mov ecx,[block_pointer] |
cmp word [ecx-4],char_end |
je .normal_line |
;E:. |
;Pop stack |
sub [block_pointer],8 |
sub ecx,8 |
;B+ Form this (END) line/place to BEGIN |
mov edx,[ecx] |
add edx,[activ_file] |
mov eax,[activ_pos] |
sub eax,[activ_file] |
mov [edx+4],eax |
mov bx,[activ_line] |
sub bx,[ecx+6] |
mov [edx+2],bx |
;E:. |
;B+ From stack line/place to this (END) |
mov eax,[activ_pos] |
mov edx,[ecx] |
mov [eax+4],edx |
mov [eax+2],bx |
;E:. |
;B+ Mark end type II |
mov word [eax],type_end_normal+1 |
mov ecx,[next_] |
cmp ecx,next |
je .yes_normal |
mov word [eax],type_end_plus+1 |
.yes_normal: |
mov dword [eax+8],new_line |
add [activ_pos],12 |
jmp [next_] |
.normal_line: |
mov word [eax],type_not_end |
mov dword [eax+8],new_line |
add [activ_pos],12 |
jmp [next_] |
;E:. |
;E:. |
include_file: |
;B+ Include and attach file |
mov eax,[activ_pos] |
push eax |
call ins_12_bytes |
pop eax |
mov word [eax],type_include |
mov word [eax+2],0 |
mov dword [eax+4],-1 |
mov dword [eax+8],new_line |
dec [line_] |
jmp [next_] |
;E:. |
|
next_ dd next |
;E:. |
;B+ Additional tools |
ins_12_bytes: |
mov ecx,[end_of_file] |
add [end_of_file],12 |
mov esi,ecx |
add ecx,12 |
mov edi,ecx |
sub ecx,11 |
sub ecx,eax |
std |
rep movsb |
mov ecx,[activ_file] |
add dword [ecx-16],12 |
ret |
|
ins_5_bytes: |
mov ecx,[end_of_file] |
add [end_of_file],5 |
mov esi,ecx |
add ecx,5 |
mov edi,ecx |
sub ecx,4 |
sub ecx,ebx |
std |
rep movsb |
mov ecx,[activ_file] |
add dword [ecx-16],5 |
ret |
|
ins_1_byte: |
mov ecx,[end_of_file] |
inc [end_of_file] |
mov esi,ecx |
inc ecx |
mov edx,ecx |
sub ecx,ebx |
std |
rep movsb |
mov ecx,[activ_file] |
inc dword [ecx-16] |
ret |
;E:. |
;E:. |
|
;B+ Data section |
|
;B+ View data |
caption db 'CODE VIEWER - ver. 0.2' |
caption_end: |
|
line1up1 db 'LINE' |
line1up1_end: |
line1up2 db 'FILE:' |
line1up2_end: |
|
line1down: |
filetxt db 'FILE->' |
filetxt_end: |
times 28 db ' ' |
loadtxt db 'LOAD' |
loadtxt_end: |
db ' BLOCK: ' |
begintxt db 'BEGIN->' |
begintxt_end: |
times 10 db ' ' |
db '...' |
times 10 db ' ' |
endtxt db '<-END' |
endtxt_end: |
line1down_end: |
|
line2down: |
inctxt db 'INCLUDE KEYWORD->' |
inctxt_end: |
times 46 db ' ' |
septxt db 'SEPARATORS->' |
septxt_end: |
line2down_end: |
;E:. |
;B+ Parameter strings |
str_start dd it1 |
str_table dd it1,0,it2,it3,it4,it5 |
;align |
it1: |
dd 25 |
dd (20+6*7)*65536+35*10+win_toptext+3 |
file_txt: |
db 'KERNEL.ASM ',char_end |
;align 4 |
it2: |
dd 4 |
dd (20+56*6)*65536+35*10+win_toptext+3 |
begin_txt: |
db ';B+ ',char_end |
;align 4 |
it3: |
dd 4 |
dd (20+71*6)*65536+35*10+win_toptext+3 |
end_txt: |
db ';E:.',char_end |
;align 4 |
it4: |
dd 43 |
dd (20+18*6)*65536+35*10+win_toptext+3+14 |
include_txt: |
db 'include ',char_end,' ' |
;align 4 |
it5: |
dd 2 |
dd (20+76*6)*65536+35*10+win_toptext+3+14 |
skoba_txt: |
db '"" ',char_end |
;E:. |
|
block_pointer dd block_stack+8 |
block_stack dw 0,0,char_end,0 |
times 10*2 dd 0x0 |
|
; STACK BOX: |
; ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÏ |
; Óabs placeÓ 0 ÓlineÓ |
; ÀÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÙ |
; or 0000 'char_end' 00 - bottom |
|
top_file dd start_data |
activ_file dd start_data |
top_free_file dd 1 |
file_array dd start_data |
times 50 dd 0x0 |
|
end_of_file dd start_data |
|
; TEXT MARKER: |
; ÚÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÏ |
; ÓtypeÓn.l.Ónew placeÓ 13 Ó |
; ÀÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÙ |
|
;E:. |
|
;B+ Program preview |
;ÚÄÄÄÄÄ |
;ÓCODE VIEWER - ver. 0.2 o _ x |
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ |
;Ó Line | File: |
;Ó---------+--------------------- |
;Ó[+] | |
;Ó[-] | |
;Ó[ ] | |
;Ó[#] | |
;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ |
;Ó [FILE->]___________ [LOAD] BLOCK: [BEGIN->];B+ú ... ;E:.[<-END] Ó |
;Ó [INCLUDE KEYWORD->]include [SEPARATORS->]"" |
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ |
;E:. |
|
I_END: |
|
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |