Metropoli BBS
VIEWER: func.asm MODE: TEXT (ASCII)
.code
align 4
g_putch proc,x:dword,y:dword,char:byte
  pushad
  mov edi,_v_buffer
  xor eax,eax
  mov al,char
  mul fontcharsiz
  mov esi,eax
  add esi,font
  add esi,sizeof g_fnthead
  mov eax,y
  mul _v_xb
  add edi,eax
  mov eax,x
  mul _v_bypp
  add edi,eax
  mov eax,fontx
  mov ecx,eax
  mul _v_bypp
  mov ebx,fonty
  mov edx,_v_xb
  sub edx,eax
  mov eax,fontclr
  .if _v_bypp==1
topa:
    push cx
gputch_1a:
    cmp bptr[esi],0
    .if zero?
      inc esi
      inc edi
      jmp gputch_2a
    .endif
    .if !fonttyp
      movsb
      jmp gputch_2a
    .endif
    inc esi
    stosb
gputch_2a:
    dec cx
    jnz gputch_1a
    pop cx
    add edi,edx
    dec ebx
    jnz topa
    popad
    ret
  .endif
  .if _v_bypp==2
topb:
    push cx
gputch_1b:
    cmp wptr[esi],0
    .if zero?
      inc esi
      inc esi
      inc edi
      inc edi
      jmp gputch_2b
    .endif
    .if !fonttyp
      movsw
      jmp gputch_2b
    .endif
    inc esi
    inc esi
    stosw
gputch_2b:
    dec cx
    jnz gputch_1b
    pop cx
    add edi,edx
    dec ebx
    jnz topb
    popad
    ret
  .endif
  .if _v_bypp==3      ;24bit
topc:
    push cx
gputch_1c:
    cmp wptr[esi],0
    jnz @f
    cmp bptr[esi+2],0 
    .if zero?
      add esi,3
      add edi,3
      jmp gputch_2c
    .endif
@@:
    .if !fonttyp
      movsw
      movsb
      jmp gputch_2c
    .endif
    add esi,3
    stosw
    ror eax,16
    stosb
    ror eax,16
gputch_2c:
    dec cx
    jnz gputch_1c
    pop cx
    add edi,edx
    dec ebx
    jnz topc
    popad
    ret
  .endif
;32bit
topd:
    push cx
gputch_1d:
    cmp dptr[esi],0
    .if zero?
      add esi,4
      add edi,4
      jmp gputch_2d
    .endif
    .if !fonttyp
      movsd
      jmp gputch_2d
    .endif
    add esi,4
    stosd
gputch_2d:
    dec cx
    jnz gputch_1d
    pop cx
    add edi,edx
    dec ebx
    jnz topd
    popad
    ret
g_putch endp

align 4
g_printxy proc,x:dword,y:dword,s:dword
  pushad
  mov esi,s
  mov ebx,x
  mov ecx,y
  jmp gputstr_1
gputstr_2:
  callp g_putch,ebx,ecx,dl
  add ebx,fontx
  inc esi
gputstr_1:
  mov dl,[esi]
  cmp dl,13
  jz enter1
  cmp dl,10
  jz ignore
  cmp dl,0
  jnz gputstr_2
  popad
  ret
enter1:
  inc s
  mov x,0
  mov eax,fonty
  add y,eax
  jmp gputstr_1
ignore:
  inc s
  jmp gputstr_1
g_printxy endp

align 4
g_printf proc,x:dword,y:dword,str1:dword,argv:vararg
  local siz:dword
  pushad

  lea eax,argv
  callp _vprintf_siz,str1,eax

  mov siz,eax
  sub esp,eax
  lea eax,argv
  mov edi,esp
  callp vsprintf,edi,str1,eax

  callp g_printxy,x,y,esp

  callp strlen,esp

  mov ecx,fontx
  mul ecx
  add x,eax

  add esp,siz
  popad
  xor eax,eax
  ret
g_printf endp

align 4
g_hline proc,x1:dword,y1:dword,x2:dword,col:dword
  local l:dword
  pushad
  mov eax,x2
  .if x1>eax
    xchg eax,x1
    mov x2,eax
  .endif
  sub eax,x1
  inc eax
  mov l,eax

  mov edi,_v_buffer
  mov eax,y1
  mul _v_xb
  add edi,eax
  mov eax,x1
  mul _v_bypp
  add edi,eax
  .if wptr[_v_bypp]==1
    mov ecx,l
    mov al,bptr[col]
    rep stosb
  .elseif wptr[_v_bypp]==2
    mov ecx,l
    mov ax,wptr[col]
    rep stosw
  .elseif wptr[_v_bypp]==4  ;;added in v2.03:Beta #5
    mov ecx,l
    mov eax,col
    rep stosd
  .else
    mov eax,l
    mov ebx,_v_bypp
@@:
    lea esi,col             ;;FIX : v2.03 Beta #5 : this was above the @@:
    mov ecx,ebx
    rep movsb
    sub esi,ebx
    dec eax
    jnz @b
  .endif
  popad
  ret
g_hline endp

align 4
g_vline proc,x1:dword,y1:dword,y2:dword,col:dword
  pushad
  mov eax,y2
  .if y1>eax
    xchg eax,y1
    mov y2,eax
  .endif
  sub eax,y1
  inc eax
  mov ebx,eax

  mov edi,_v_buffer
  mov eax,y1
  mul _v_xb
  add edi,eax
  mov eax,x1
  mul _v_bypp
  add edi,eax
  lea esi,col
  mov edx,_v_bypp
@@:
  mov ecx,edx
  rep movsb
  sub esi,edx
  add edi,_v_xb
  sub edi,edx
  dec ebx
  jnz @b
  popad
  ret
g_vline endp

align 4
g_box proc,x1:dword,y1:dword,x2:dword,y2:dword,col:dword
  callp g_hline,x1,y1,x2,col
  callp g_vline,x1,y1,y2,col
  callp g_vline,x2,y1,y2,col
  callp g_hline,x1,y2,x2,col
  ret
g_box endp

align 4
g_boxfill proc,x1:dword,y1:dword,x2:dword,y2:dword,col:dword
  local xl:dword,yl:dword
  pushad
  mov eax,x2
  .if x1>eax
    xchg eax,x1
    mov x2,eax
  .endif
  sub eax,x1
  inc eax
  mul _v_bypp
  mov xl,eax
  mov eax,y2
  .if y1>eax
    xchg eax,y1
    mov y2,eax
  .endif
  sub eax,y1
  inc eax
  mov yl,eax

  mov edi,_v_buffer
  mov eax,y1
  mul _v_xb          ;FIX : v2.03 Beta #5
  add edi,eax
  mov eax,x1
  mul _v_bypp
  add edi,eax
  mov eax,_v_x
  sub eax,xl
  mul _v_bypp   ;FIX : v2.03 Beta #5
  mov ebx,yl
top:
  mov edx,xl
@@:
  lea esi,col
  mov ecx,_v_bypp
  rep movsb
  dec edx
  jnz @b
  add edi,eax
  dec ebx
  jnz top
  popad
  ret
g_boxfill endp

[ RETURN TO DIRECTORY ]