;
;   COMMUNICATING WITH MODEM: PORTS & IRQ
;
;   Compile with FASM for Menuet
;

include "lang.inc"
include "..\..\..\..\macros.inc"

  use32
  org    0x0

  db     'MENUET01'  ; 8 byte id
  dd     0x01        ; header version
  dd     START       ; start of code
  dd     I_END       ; size of image
  dd     0x1000      ; memory for app
  dd     0x1000      ; esp
  dd     0x0 , 0x0   ; I_Param , I_Icon


START:                          ; start of execution


    mov  eax,45                 ; reserve irq 4
    mov  ebx,0
    mov  ecx,4
    mcall

    mov  eax,46                 ; reserve ports 0x3f8-0x3ff
    mov  ebx,0
    mov  ecx,0x3f8
    mov  edx,0x3ff
    mcall

    mov  eax,44                 ; read these ports at interrupt/irq 4
    mov  ebx,irqtable
    mov  ecx,4
    mcall

    mov  eax,40                 ; enable event for interrupt/irq 4
    mov  ebx,10000b shl 16 + 111b
    mcall

    call program_com1

    mov  eax, 48
    mov  ebx, 3
    mov  ecx, sc
    mov  edx, sizeof.system_colors
    mcall

  red: 
    call draw_window

still:

    mov  eax,10                 ; wait here for event
    mcall

    cmp  eax,1                  ; redraw request ?
    je   red
    cmp  eax,2                  ; key in buffer ?
    je   key
    cmp  eax,3                  ; button in buffer ?
    je   button
    cmp  eax,16+4               ; data read by interrupt ?
    je   irq4

    jmp  still

  key:                          ; key
    mov  eax,2                  ; just read it and ignore
    mcall

    mov  al,ah
    mov  dx,0x3f8
    out  dx,al

    jmp  still

  button:                       ; button
    or   eax,-1                 ; close this program
    mcall


  irq4:

    mov  eax,42
    mov  ebx,4
    mcall

    ; eax = number of bytes left
    ; ecx = 0 success, =1 fail
    ; bl  = byte

    inc   [pos]
    and   [pos],31
    mov   eax,[pos]

    mov   [string+eax], bl
    call  draw_string

    jmp  still


baudrate_9600   equ 12
baudrate_57600  equ  2

program_com1:

    mov  dx,0x3f8+3
    mov  al,0x80
    out  dx,al

    mov  dx,0x3f8+1
    mov  al,0x00
    out  dx,al

    mov  dx,0x3f8+0
    mov  al,baudrate_9600
    out  dx,al

    mov  dx,0x3f8+3
    mov  al,0x3
    out  dx,al

    mov  dx,0x3f8+4
    mov  al,0xb
    out  dx,al

    mov  dx,0x3f8+1
    mov  al,0x1
    out  dx,al

    ret



;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   *********************************************


draw_window:

    mov  eax, 12                   ; function 12:tell os about windowdraw
    mov  ebx, 1                    ; 1, start of draw
    mcall

                                   ; DRAW WINDOW
    mov  eax, 0                    ; function 0 : define and draw window
    mov  ebx, 100*65536+250        ; [x start] *65536 + [x size]
    mov  ecx, 100*65536+85         ; [y start] *65536 + [y size]
    mov  edx, [sc.work]
    or   edx, 0x03000000           ; color of work area RRGGBB,8->color gl
    mcall

                                   ; WINDOW LABEL
    mov  eax, 4                    ; function 4 : write text to window
    mov  ebx, 8*65536+8            ; [x start] *65536 + [y start]
    mov  ecx, [sc.grab_text]
    or   ecx, 0x10000000           ; font 1 & color ( 0xF0RRGGBB )
    mov  edx, title               ; pointer to text beginning
    mov  esi, title.len           ; text length
    mcall

    mov  eax, 4                    ; draw text
    mov  ebx, 20*65536+33
    mov  ecx, [sc.work_text]
    mov  edx, text+4
  .nextstr:
    mov  esi, [edx-4]
    test esi, 0xFF000000
    jnz  .finstr
    mcall
    add  edx, esi
    add  edx, 4
    add  ebx, 10
    jmp  .nextstr
  .finstr:

    call draw_string

    mov  eax,12                    ; function 12:tell os about windowdraw
    mov  ebx,2                     ; 2, end of draw
    mcall

    ret


draw_string:
    mov  eax, 4
    mov  ebx, 20*65536+65
    mov  ecx, [sc.work_text]
    mov  edx, string
    mov  esi, 32
    mcall
ret


; DATA AREA


if lang eq ru
   text mstr "�������� ������� ���������� ������.",\
             "������ �� ������ ����������� ��",\
             "���������� IRQ4 � ������������ ����."
   title:
        db   '����� �� COM1'
    .len = $ - title
else
   text mstr "TYPED CHARACTERS ARE SENT TO MODEM.",\
             "DATA FROM MODEM IS READ BY IRQ4",\
             "INTERRUPT AND DISPLAYED BELOW."
   title:
        db   'MODEM AT COM1'
    .len = $ - title
end if

pos  dd  0x0

irqtable:
       ; port    ; 1=byte, 2=word
  dd   0x3f8 +0x01000000   ; read byte from port 0x3f8 at interrupt/irq 4
  dd   0x0                 ; no more ports ( max 15 ) to read


I_END:

string rb 32
sc system_colors