home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / CEXPRESS.ZIP / KEYBOARD.ASM / INPRIGHT.ASM < prev    next >
Assembly Source File  |  1989-05-03  |  6KB  |  181 lines

  1. ;void  input_right(col,row,color,max_len,char_case,return_strg);
  2. ;  unsigned short  col,row,color,max_len;
  3. ;  char  char_case,*ret_strg;
  4.  
  5.     EXTRN  _memory_model:byte
  6.     EXTRN  _error_code:byte
  7.     EXTRN  _beep_on:byte
  8.  
  9. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  10.     ASSUME CS:_TEXT
  11.     PUBLIC _input_right
  12. _input_right proc near
  13.     mov  _error_code,1    ;1 = parameter out of range
  14.     push bp            ;
  15.     mov  bp,sp        ;set up stack frame
  16.     push di            ;
  17.     push si            ;
  18.     cmp  _memory_model,0    ;near or far?
  19.     jle  begin        ;jump if near
  20.     inc  bp            ;else add 2 to BP
  21.     inc  bp            ;
  22. begin:  cmp  _memory_model,2    ;data near or far?
  23.     jb   A0            ;jump if near
  24.     les  di,dword ptr[bp+14] ;point ES:DI to return string
  25.     jmp  short A00        ;jump ahead
  26. A0:    mov  ax,ds        ;move DS to ES
  27.     mov  es,ax        ;
  28.     mov  di,[bp+14]        ;
  29. A00:    mov  byte ptr es:[di],0    ;clear descriptor in case error
  30.     sub  al,al        ;clear AL
  31.     mov  dl,[bp+4]        ;col to DL
  32.     dec  dl            ;count from 0
  33.     cmp  dl,79        ;in range?
  34.     jna  B1            ;jump ahead if so
  35. A1:    jmp  U1            ;else quit
  36. B1:    mov  dh,[bp+6]        ;row to DH
  37.     dec  dh            ;count from 0
  38.     cmp  dh,24        ;in range?
  39.     ja   A1            ;quit if not
  40.     mov  bl,[bp+8]        ;attribute to BL
  41.     sub  bh,bh        ;page 0
  42.     mov  al,[bp+10]        ;max string length to AL
  43.     or   al,al        ;test for zero length
  44.     jz   A1            ;quit if zero
  45.     dec  _error_code    ;0 = no error
  46.     mov  ah,[bp+12]        ;character case to AH
  47.     mov  bp,di        ;let BP point to string
  48.     mov  di,ax        ;store both in DI
  49.     mov  ah,2        ;function to set cursor
  50.     int  10h        ;set the cursor
  51.     sub  si,si        ;SI points to ret string
  52.     sub  al,al        ;initial string length
  53.     mov  es:[bp],al        ;set the descriptor
  54. C1:    inc  si            ;forward string pointer
  55. D1:    mov  cx,1        ;num chars to write
  56.     sub  ah,ah        ;func to read keystroke
  57.     int  16h        ;wait for keystroke
  58.     cmp  al,0        ;test for extended code
  59.     jne  E1            ;jump if not extended
  60.     cmp  ah,83        ;is it the Del key?
  61.     jne  D1            ;next keystroke if not
  62.     jmp  short I1        ;else jmp to backspc code
  63. E1:    cmp  al,13        ;test for carriage return
  64.     jne  F1            ;jump ahead if not CR
  65.     jmp  S1            ;else quit routine
  66. F1:    cmp  al,27        ;test for Escape
  67.     jne  H1            ;jump ahead if not Escape
  68.     mov  cl,es:[bp]        ;string length to CX
  69.     or   cl,cl        ;test for null string
  70.     je   D1            ;ignore keystroke if null
  71.     mov  es:[bp],ch        ;zero out strg length
  72.     sub  si,si        ;clear string pointer
  73.     sub  dl,cl        ;col pos - string length
  74. G1:    inc  dl            ;inc cursor column
  75.     mov  ah,2        ;function to set cursor
  76.     int  10h        ;reset the cursor
  77.     mov  al,32        ;erase with spc character
  78.     push cx            ;save strg len counter
  79.     mov  cx,1        ;number chars to write
  80.     mov  ah,9        ;function to write char
  81.     int  10h        ;erase a char
  82.     pop  cx            ;restore counter
  83.     loop G1            ;go erase next char
  84.     jmp  short C1        ;go get next keystroke
  85. H1:    cmp  al,8        ;test for backspace
  86.     jne  J1            ;jump ahead if not bkspc
  87. I1:    cmp  es:[bp],ch        ;start of string?
  88.     je   K1            ;go beep, get next key
  89.     sub  es:[bp],cl        ;dec string descriptor
  90.     dec  si            ;dec string pointer
  91.     push dx            ;save cursor position
  92.     mov  ax,si        ;string length to AX
  93.     sub  dl,al        ;subtract from cursor pos
  94.     inc  dl            ;back one column
  95.     mov  ah,2        ;function to set cursor
  96.     int  10h        ;reset cursor
  97.     pop  dx            ;restore prior cursor pos
  98.     mov  al,32        ;erase with space char
  99.     mov  ah,9        ;function to write char
  100.     int  10h        ;erase a char
  101.     cmp  si,1        ;single char left?
  102.     je   D1            ;no need to rewrite line
  103.     jmp  short Q1        ;else go rewrite line
  104. J1:    cmp  al,32        ;some other ctrl code?
  105.     jb   D1            ;skip it if so
  106.     push dx            ;test right margin...
  107.     sub  dh,dh        ;DX = col position
  108.     inc  dx            ;adjust
  109.     cmp  si,dx        ;line length equals?
  110.     pop  dx            ;restore row/col
  111.     jnbe K1            ;skip char, beep
  112.     xchg di,cx        ;fetch MaxLen
  113.     cmp  es:[bp],cl        ;comp to strg descriptor
  114.     xchg di,cx        ;restore CX
  115.     jne  L1            ;jump if string not full
  116. K1:    push dx            ;save cursor setting
  117.     mov  ah,2        ;DOS func to write char
  118.     mov  dl,7        ;bell character
  119.     cmp  _beep_on,0        ;test whether beep enabled
  120.     je   K2            ;jump if not
  121.     int  21h        ;beep!
  122. K2:    pop  dx            ;restore cursor setting
  123.     jmp  D1            ;go get next keystroke
  124. L1:    xchg cx,di        ;move case type to CH
  125.     cmp  ch,'u'        ;upper case?
  126.     je   M1            ;jump if so
  127.     cmp  ch,'U'        ;upper case?
  128.     jne  N1            ;jump ahead if not
  129. M1:    cmp  al,'a'        ;below 'a'?
  130.     jb   P1            ;move on if out of range
  131.     cmp  al,'z'        ;above 'z'?
  132.     ja   P1            ;move on if out of range
  133.     sub  al,32        ;convert to upper case
  134.     jmp  short P1        ;go write it
  135. N1:    cmp  ch,'l'        ;lower case?
  136.     je   O1            ;jump if so
  137.     cmp  ch,'L'        ;lower case?
  138.     jne  P1            ;no adjustment if not
  139. O1:    cmp  al,'A'        ;below 'A'?
  140.     jb   P1            ;move on if out of range
  141.     cmp  al,'Z'        ;above 'Z'?
  142.     ja   P1            ;move on if out of range
  143.     add  al,32        ;convert to upper case
  144. P1:    xchg cx,di        ;restore CX count
  145.     mov  es:[bp][si],al    ;set keystroke for return
  146.     add  es:[bp],cl        ;inc string descriptor
  147. Q1:    mov  cl,es:[bp]        ;string length to CX
  148.     sub  dl,cl        ;cursor col-number chars
  149.     sub  si,si        ;point SI to descriptor
  150. R1:    inc  dl            ;forward cursor position
  151.     mov  ah,2        ;function to set cursor
  152.     int  10h        ;reset the cursor
  153.     push cx            ;save strg len counter
  154.     mov  cx,1        ;number chars to write
  155.     inc  si            ;inc string pointer
  156.     mov  al,es:[bp][si]    ;get char to write
  157.     mov  ah,9        ;function to write char
  158.     int  10h        ;write the char
  159.     pop  cx            ;restore strg len counter
  160.     loop R1            ;go write next char
  161.     jmp  C1            ;go get next character
  162. S1:    sub  cx,cx        ;convert to C string
  163.     mov  cl,es:[bp]        ;get string length
  164.     or   cl,cl        ;test for zero length
  165.     jz   U1            ;quit if null string
  166. T1:    mov  al,es:[bp+1]    ;get a char
  167.     mov  es:[bp],al        ;shift downward
  168.     inc  bp            ;forward ptr
  169.     loop T1            ;move whole string
  170.     mov  byte ptr es:[bp],0    ;terminating byte
  171. U1:    pop  si            ;
  172.     pop  di            ;
  173.     pop  bp            ;
  174.     cmp  _memory_model,0    ;quit
  175.     jle  quit        ;
  176.     db   0CBh        ;RET far
  177. quit:    ret            ;RET near
  178. _input_right ENDP
  179. _TEXT    ENDS
  180.     END
  181.