;
;   Port to KolibliOS
;   (jacekm.pl@gmail.com)
;

;B+ System header
use32
org    0x0
  db	 'MENUET01'
  dd	 0x01
  dd	 START
  dd	 I_END
  dd	 0x500000
  dd	 0x7fff0
  dd	 0x0,0x0
;E:.

;B+ Include C files
  ; Compiler tools
  include "INTRINS.ASM"

  ; C Library ("stdio.asm")
  include "LIBSTD.ASM"

  ; MenuetOS implement
  include "OSFUNC.ASM"

_fopen	equ _OS_fopen
_fputc	equ _OS_fputc
_fgetc	equ _OS_fgetc
_fclose equ _OS_fclos

  ;Main program (compiled from C)
  include "GETARG.ASM"
  include "CC1.ASM"
  include "CC2.ASM"
  include "CC3.ASM"
  include "CC4.ASM"
;E:.

START:
;B+ Main cycle
  call draw_window
still:
  mov  eax,10
  int  0x40
still1:

  cmp  eax,1
  je   red
  cmp  eax,2
  je   key
  cmp  eax,3
  je   button
  jmp  still

red:
  call draw_window
  jmp  still

key:
  mov  eax,2
  int  0x40
  jmp  still

button:
  mov  eax,17
  int  0x40

  cmp  ah,1
  jne  .noclose
  mov  eax,-1
  int  0x40
.noclose:

  cmp  ah,2
  jne  .no_run
;  call begin_osfunc
;B+ Copy file path
  mov  esi,inp_path
  mov  edi,filepath
  mov  ecx,[p_len]
 push ecx
  cld
rep movsb
 pop  ecx
  add  ecx,filepath
  mov  [p_filename],ecx
;E:.
;B+ Clear word area
  mov  ebx,10 shl 16 + 280
  mov  ecx,60 shl 16 + 250
  mov  edx,0x303030
  mov  eax,13
  int  0x40
;E:.
;B+ Init parameters
  mov  ecx,_input
  sub  ecx,_nogo
  mov  edi,_nogo
  xor  eax,eax
  cld
rep stosb
  mov  [_input],-1
  mov  [_input2],-1
  mov  [_usexpr],1
  mov  [_ccode],1
  mov  [_quote],34
  mov  [test_outch.y_coord],60
;E:.
  call init_osfunc
 push dword 4
 push args
;B+ Save exit ESP
  mov  [exit_esp],esp
;E:.
  call _main
  add  esp,8
;  call end_osfunc
.no_run:

  cmp  ah,3
  jne  .no_path
  mov  eax,inp_path
  mov  bx,27
  call read_string
  mov  edx,[r_pos]
  mov  [p_len],edx
  ;
  cmp  ah,10
  je   still
  jmp  still1
.no_path:

  cmp  ah,4
  jne  .no_file
  mov  eax,inp_file
  mov  bx,42
  call read_string
  mov  edx,[r_pos]
  mov  [f_len],edx
  ;
  cmp  ah,10
  je   still
  jmp  still1
.no_file:

  jmp  still
;E:.

read_string:
;B+ Read string
  mov  [c_place],eax
  mov  [r_pos],0
  mov  [rel_x],60
  mov  [rel_y],bx

  mov  ebx,60
  shl  ebx,16
  mov  bx,6*26+1
  movzx ecx,[rel_y]
  shl  ecx,16
  mov  cx,10
  mov  edx,0x000000
  mov  eax,13
  int  0x40

  add  ecx,11 shl 16
  mov  cx,2
  mov  edx,0x999999
  int  0x40

.next:
  mov  ebx,[rel_x]
  shl  ebx,16
  mov  bx,7
  movzx ecx,[rel_y]
  shl  ecx,16
  mov  cx,10
  mov  edx,0x000000
  mov  eax,13
  int  0x40

  mov  ebx,[c_place]
  mov  byte [ebx],0

  mov  eax,10
  int  0x40
  cmp  eax,2
  je   .key
  jmp  .to_ret
.key:

  mov  eax,2
  int  0x40
  cmp  ah,13
  jne  .no_enter
  jmp  .to_ret
.no_enter:

  cmp  ah,8
  jne  .no_back
  cmp  [r_pos],0
  je   .next
  dec  [r_pos]
  dec  [c_place]
  sub  [rel_x],6
  jmp  .next
.no_back:

  cmp  [r_pos],25
  je   .next

  cmp  ah,'a'
  jb   .no_sm_l
  cmp  ah,'z'
  ja   .no_sm_l
  add  ah,'A'-'a'
.no_sm_l:

  mov  byte [ebx],ah
  mov  [char],ah
  inc  [c_place]
  inc  [r_pos]

  mov  ebx,[rel_x]
  inc  ebx
  shl  ebx,16
  mov  bx,[rel_y]
  inc  bx
  mov  ecx,0x00ffff
  mov  edx,char
  mov  esi,1
  mov  eax,4
  int  0x40

  add  [rel_x],6
  jmp  .next

.to_ret:
 push eax
  mov  ebx,60
  shl  ebx,16
  mov  bx,6*26+1
  movzx ecx,[rel_y]
  add  ecx,11
  shl  ecx,16
  mov  cx,2
  mov  edx,0x000000
  mov  eax,13
  int  0x40
 pop  eax
  ret

rel_x dd 60
rel_y dw 0x0
c_place dd 0x0
r_pos dd 0x0
char db '?'
;E:.

draw_window:
;B+ Draw window
  mov  eax,12
  mov  ebx,1
  int  0x40

  mov  ebx,100*65536+320
  mov  ecx,100*65536+320
  mov  edx,0x035555DD
  mov  esi,0x805080d0
  mov  edi,0x005080d0
  mov  eax,0
  int  0x40

  mov  ebx,8*65536+8
  mov  ecx,0x10ddeeff
  mov  edx,caption
  mov  esi,caption_end-caption
  mov  eax,4
  int  0x40

  ;mov  ebx,(300-19)*65536+12
  ;mov  ecx,5*65536+12
  ;mov  edx,1
  ;mov  esi,0x6688dd
  ;mov  eax,8
  ;int  0x40

;B+ Hot buttons
  mov  ebx,220 shl 16 + 70
  mov  ecx,25 shl 16 + 29
  mov  edx,2 ; compile
  mov  esi,0x6688dd
  mov  eax,8
  int  0x40

  mov  ebx,10 shl 16 + 47
  mov  ecx,26 shl 16 + 12
  mov  edx,3 ; path
  mov  esi,0x6688dd
  mov  eax,8
  int  0x40

  mov  ebx,10 shl 16 + 47
  mov  ecx,41 shl 16 + 12
  mov  edx,4 ; file name
  mov  esi,0x6688dd
  mov  eax,8
  int  0x40
;E:.

;B+ Text in buttons
  mov  ebx,231 shl 16 + 36
  mov  ecx,0x10ffffff
  mov  edx,txt_compile
  mov  esi,txt_compile_end-txt_compile
  mov  eax,4
  int  0x40

  mov  ebx,14 shl 16 + 28
  mov  ecx,0xffffff
  mov  edx,txt_path
  mov  esi,txt_path_end-txt_path
  int  0x40

  mov  ebx,14 shl 16 + 43
  mov  edx,txt_file
  mov  esi,txt_file_end-txt_file
  int  0x40
;E:.

;B+ Draw path / file name
  mov  ebx,61 shl 16 + 28
  mov  ecx,0x00ffff
  mov  edx,inp_path
  mov  esi,[p_len]
  mov  eax,4
  int  0x40

  mov  ebx,61 shl 16 + 43
  mov  ecx,0x00ffff
  mov  edx,inp_file
  mov  esi,[f_len]
  mov  eax,4
  int  0x40
;E:.

  mov  eax,12
  mov  ebx,2
  int  0x40

  ret
;E:.

;B+ Data area

;B+ Interface
inp_path: times 100 db '/RD/1/',0
p_len dd 6
inp_file: times 100 db 'EXAMPLE',0
f_len dd 7

txt_compile db 'Compile'
txt_compile_end:
txt_path    db 'Path ->'
txt_path_end:
txt_file    db 'File ->'
txt_file_end:
;E:.

;B+ Main arguments
args dd arg_str0,inp_file,arg_str2,arg_str3,arg_str4

arg_str0 db 'CC',0
arg_str1 db 'prog',0
arg_str2 db '-m',0
arg_str3 db '-a',0
arg_str4 db '-p',0
;E:.

;B+ System parameters
exit_esp dd 0x0
;E:.

caption db  'Small C compiler for KolibriOS v 0.5.3'
caption_end:

times 8-($ mod 8) db 0
;E:.

I_END:
