Metropoli BBS
VIEWER: key.asm MODE: TEXT (ASCII)
include qlib.inc
include dos.inc
include string.inc
include conio.inc
include stdio.inc
include process.inc
include video.inc

.data
;parts copied from key.asm in "\lib\src"
align 4
;16 per line!
toascii db 0,27,'1234567890-=',14,15                      ;0
        db 'qwertyuiop[]',13,25,'as'                      ;16
        db 'dfghjkl;''`',22,'\zxcv'                       ;32
        db 'bnm,./',23,'*',24,' ',0,1,2,3,4,5             ;48
        db 6,7,8,9,10,0,0,18,88h,20,'-',84h,26,86h,'+',19 ;64
        db 82h,21,16,17,0,0,0,11,12,0,0,0,0,0,0,0         ;80
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0                ;96
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0                ;112

temp db 0,0
print1 proto,off:dword

tp dd ?
tx dw ?
ty dw ?
on db ?
q db 0 ;quit?
dis db 1   ;disable CTRL+BRK and CTRL+ALT+DEL
pp db 1

.code
main proc
  mov ax,3
  int 10h
  callp setcursor,512  ;no cursor!
  callp print,"Testing KBD ... Press F1+F2 to quit\n"
  callp printf,"Block CTRL+BREAK and CTRL+ALT+DEL :          (SPACE to toggle)"
  callp gotoxy,1,23
  callp printf,"getch:"
  callp key_lights,0  ;shut off lights
  .if eax
     callp printf,"KBD error: Unable to send data to kbd\n"
     callp exit,0
  .endif
  jmp prn_dis
top:
  call kbhit
  .if al
    call getch
  .endif
  .if al
    mov bl,al
    callp gotoxy,pp,24
    callp printf,"%c",bl
    inc pp
    .if pp>80
      mov pp,1
    .endif
    .if bl==32
      xor dis,1
prn_dis:
      callp key_block,dis
      callp gotoxy,37,2
      .if dis
        callp printf,"enabled "
      .else
        callp printf,"disabled"
      .endif
      jmp top
    .endif
  .endif
  mov tx,9  ;X pos
  mov ty,6  ;Y pos
  mov tp,0  ;offset (counter)
  mov q,0
@@:
  mov ebx,tp
  mov al,key_tab[ebx]  ;is it on?
  mov dl,key_tab1[ebx]  ;w/o e0h prefix
  mov dh,key_tab2[ebx]  ;w/  e0h prefix
  mov cl,toascii[ebx]   ;what is it?
  mov bx,dx
  .if ((cl>32)&&(cl<128))
    mov temp,cl
    .if cl=='+'
      callp gotoxy,72,7
    .elseif cl=='-' && tp==74
      callp gotoxy,72,6
    .elseif cl=='*'
      callp gotoxy,70,6
    .elseif
      callp gotoxy,tx,ty
    .endif
    mov on,bl
    callp print1,offset temp
    .if cl=='/'
      mov on,bh
      callp gotoxy,68,6
      callp print1,offset temp
    .endif
  .else
    ;specials based on al
    .if bl
      mov on,1
    .else
      mov on,0
    .endif
    .if cl==1
      .if bx
        inc q
      .endif
      callp gotoxy,6,5
      callp print1,"F1"
    .elseif cl==2
      .if bx
        inc q
      .endif
      callp gotoxy,9,5
      callp print1,"F2"
    .elseif cl==3
      callp gotoxy,12,5
      callp print1,"F3"
    .elseif cl==4
      callp gotoxy,15,5
      callp print1,"F4"
    .elseif cl==5
      callp gotoxy,18,5 
      callp print1,"F5"
    .elseif cl==6
      callp gotoxy,21,5
      callp print1,"F6"
    .elseif cl==7
      callp gotoxy,24,5
      callp print1,"F7"
    .elseif cl==8
      callp gotoxy,27,5
      callp print1,"F8"
    .elseif cl==9
      callp gotoxy,30,5
      callp print1,"F9"
    .elseif cl==10
      callp gotoxy,33,5
      callp print1,"F10"
    .elseif cl==11
      callp gotoxy,36,5
      callp print1,"F11"
    .elseif cl==12
      callp gotoxy,39,5
      callp print1,"F12"
    .elseif cl==13
      mov on,bl
      callp gotoxy,41,8
      callp print1,"Enter"
      mov on,bh
      callp gotoxy,72,10
      callp print1,"Enter"
    .elseif cl==14
      callp gotoxy,41,6
      callp print1,"BS"
    .elseif cl==15
      callp gotoxy,2,7
      callp print1,"Tab"
    .elseif cl==16
      mov on,bh
      callp gotoxy,47,6
      callp print1,"Ins"
      mov on,bl
      callp gotoxy,66,10
      callp print1,"0"
    .elseif cl==17
      mov on,bh
      callp gotoxy,47,7
      callp print1,"Del"
      mov on,bl
      callp gotoxy,70,10
      callp print1,"."
    .elseif cl==18
      mov on,bh
      callp gotoxy,51,6
      callp print1,"Home"
      mov on,bl
      callp gotoxy,66,7
      callp print1,"7"
    .elseif cl==19
      mov on,bh
      callp gotoxy,51,7
      callp print1,"End"
      mov on,bl
      callp gotoxy,66,9
      callp print1,"1"
    .elseif cl==20
      mov on,bh
      callp gotoxy,55,6
      callp print1,"PgUp"
      mov on,bl
      callp gotoxy,70,7
      callp print1,"9"
    .elseif cl==21
      mov on,bh
      callp gotoxy,55,7
      callp print1,"PgDn"
      mov on,bl
      callp gotoxy,70,9
      callp print1,"3"
    .elseif cl==22
      callp gotoxy,2,9
      callp print1,"L.Shft"
    .elseif cl==23
      callp gotoxy,41,9
      callp print1,"R.Shft"
    .elseif cl==24
      mov on,bl
      callp gotoxy,7,10
      callp print1,"Alt"
      mov on,bh
      callp gotoxy,36,10
      callp print1,"Alt"
    .elseif cl==25
      mov on,bl
      callp gotoxy,3,10
      callp print1,"Ctrl"
      mov on,bh
      callp gotoxy,40,10
      callp print1,"Ctrl"
    .elseif cl==26
      callp gotoxy,68,8 ;keypad 5
      callp print1,"5"
    .elseif cl==27
      callp gotoxy,2,5
      callp print1,"ESC"
    .elseif cl==32
      callp gotoxy,13,10
      callp print1," --- Space Bar --- "
    .elseif cl==88h
      mov on,bh
      callp gotoxy,51,9
      callp print1,"Up"
      mov on,bl
      callp gotoxy,68,7
      callp print1,"8"
    .elseif cl==82h
      mov on,bh
      callp gotoxy,51,10
      callp print1,"Dn"
      mov on,bl
      callp gotoxy,68,9
      callp print1,"2"
    .elseif cl==84h
      mov on,bh
      callp gotoxy,45,10
      callp print1,"Left"
      mov on,bl
      callp gotoxy,66,8
      callp print1,"4"
    .elseif cl==86h
      mov on,bh
      callp gotoxy,54,10
      callp print1,"Right"
      mov on,bl
      callp gotoxy,70,8
      callp print1,"6"
    .endif
  .endif
  add tx,2
  .if tx>34
    mov tx,8
    inc ty
  .endif
  inc tp
  cmp tp,128
  jnz @b
  .if q==2
    mov ax,3
    int 3
    ret
  .endif
  mov tp,0
  jmp top
main endp

.data
temp2 db 80 dup (?)

.code
print1 proc uses ecx ebx,off:dword
  ;must preserve BX
  .if on==1
    callp strcpy,offset temp2,off
  .else
    callp strlen,off
    mov ecx,eax
    mov edi,offset temp2
    mov al,32
    rep stosb
    mov al,0
    stosb
  .endif
  callp print,offset temp2
  ret
print1 endp

end
[ RETURN TO DIRECTORY ]