home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / dpl.zip / EDITM.D < prev    next >
Text File  |  1988-07-11  |  5KB  |  198 lines

  1. ; Doug's Programming Language  -- DPL, Version 2.22
  2. ; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
  3. ;------------------------------------------------
  4. ; EDITM  -- EDIT A MASK OF CHARACTERS
  5. ;
  6. ; Entry conditions:
  7. ;    AX points to the mask string
  8. ;    BX points to the target string
  9. ; Exit conditions:
  10. ;    Target string holds the input
  11. ;
  12. SUBPGM    EDITM
  13. ;
  14. INTEGER    ROW            ; HOLDS THE CURRENT VIDEO ROW POSITION
  15. INTEGER COL            ; HOLDS THE CURRENT VIDEO COLUMN POSITION
  16. ;
  17. ATTR    DB    0        ; HOLDS THE MOST RECENT VIDEO ATTRIBUTE
  18. ;
  19. BEGIN    EDITM
  20.     EXTRN    _STRLEN:NEAR
  21. ;
  22.     PUSH    ES
  23.     PUSH    SI
  24.     PUSH    DI
  25. ;
  26.     PUSH    DS
  27.     POP    ES
  28.     MOV    DI,BX            ; DI POINTS TO THE TARGET STRING
  29.     MOV    SI,AX            ; SI POINTS TO THE MASK
  30.     CALL    _STRLEN            ; CX HOLDS THE MASK LENGTH
  31.     PUSH    CX            ; + 4
  32.     PUSH    DI
  33.     ADD    DI,CX            ; POINT TO THE END OF THE STRING
  34.     SUB    AL,AL            ; & SET THE NEW TERMINATOR
  35.     STOSB
  36. ;
  37.     MOV    AH,0FH
  38.     INT    10H
  39.     MOV    AH,03
  40.     INT    10H
  41.     SUB    AH,AH
  42.     MOV    AL,DH            ; SAVE THE ROW
  43.     MOV    [ROW],AX
  44.     MOV    AL,DL
  45.     MOV    [COL],AX        ; SAVE THE COLUMN
  46. ;
  47.     POP    DI            ; GET THE TARGET STRING BACK
  48.     SUB    AX,AX            ; AX = THE STORED COUNT
  49.     PUSH    AX            ; + 2
  50.     PUSH    BP
  51.     MOV    BP,SP            ; FRAME IT...
  52. ;
  53. ; PERFORM THE INPUT...
  54. ;
  55. EDM_00:
  56.     MOV    AH,08            ; GET THE ATTRIBUTE
  57.     INT    10H
  58.     MOV    [ATTR],AH
  59. ;
  60.     MOV    AL,20H
  61.     CMP    [SI],AL            ; SPACE?
  62.     JZ    EDM_05S            ; YES, MOVE TO THE NEXT NON-BLANK
  63. ;
  64. EDM_05:
  65.     INKEY    ,WAIT
  66.     CMP    AL,0            ; GOOD CHARACTER?
  67.     JZ    EDM_05            ; NO, CONTINUE WAITING
  68. ;
  69.     CMP    AL,08            ; BACKSPACE?
  70.     JZ    EDM_10            ; YES, GO ATTEMPT A BACKSPACE
  71. ;
  72.     CMP    AL,0DH            ; CARRIAGE RETURN?
  73.     JZ    EDM_15            ; YES, EXIT HOME
  74. ;
  75.     CMP    WORD PTR [BP+4],0    ; ARE WE OUT OF ROOM?
  76.     JZ    EDM_05            ; YES, TOSS THE CHARACTER
  77. ;
  78.     CALL    VALIDATE        ; CHECK FOR PROPER INPUT
  79.     JC    EDM_05            ; TOSS IT IF NOT RIGHT
  80. ;
  81. EDM_05S:
  82.     STOSB                ; STORE IN THE TARGET STRING
  83. ;
  84.     MOV    CX,01            ; DO JUST ONE CHARACTER
  85.     MOV    BL,[ATTR]        ; GET THE ATTRIBUTE
  86.     MOV    AH,09
  87.     INT    10H            ; GO SEND IT TO THE SCREEN
  88. ;
  89.     DEC    WORD PTR [BP+4]        ; ONE LESS TO GO...
  90.     INC    WORD PTR [BP+2]        ; ONE ADDED TO THE TARGET
  91.     INC    SI            ; MOVE TO THE NEXT CHARACTER
  92.     INC    [COL]
  93.     CURSOR    ROW,COL            ; MOVE THE CURSOR
  94.     JMP    EDM_00            ; CONTINUE THE INPUT...
  95. ;
  96. ; BACKSPACE PROCESSING...
  97. ;
  98. EDM_10:
  99.     CMP    WORD PTR [BP+2],0    ; ARE WE AT THE START?
  100.     JZ    EDM_05            ; YES, TOSS THE BACKSPACE
  101. ;
  102.     DEC    WORD PTR [BP+2]        ; SUBTRACT ONE FROM THE STORAGE COUNT
  103.     INC    WORD PTR [BP+4]        ; ADD ONE TO THE AVAILABLE COUNT
  104.     DEC    SI            ; BACKSTEP THE MASK POINTER
  105.     DEC    DI            ; BACKSTEP THE TARGET POINTER
  106.     DEC    [COL]            ; MOVE THE CURSOR
  107.     CURSOR    ROW,COL
  108.     CMP    BYTE PTR [SI],20H    ; IS THE CHARACTER A SPACE?
  109.     JZ    EDM_10            ; YES, SKIP IT
  110.     JMP    EDM_00            ; NO, GO BACK TO INPUTTING...
  111. ;
  112. EDM_15:
  113.     POP    BP            ; RESTORE ALL
  114.     ADD    SP,4            ; FLUSH THE TWO WORDS
  115. ;
  116.     POP    DI
  117.     POP    SI
  118.     POP    ES
  119.     RET
  120. ;
  121. ;
  122. ;----------------------------------------
  123. ; VALIDATE THE CHARACTER FROM INPUT
  124. ;
  125. ; Entry conditions:
  126. ;    AL holds the character
  127. ; Exit conditions:
  128. ;    CARRY set   = bad character
  129. ;    CARRY clear = good character
  130. ;    BX modified
  131. ;
  132. VALIDATE    PROC    NEAR
  133.     CMP    BYTE PTR [SI],'X'    ; ANY INPUT OKAY?
  134.     JZ    VAL_GOOD        ; YES, KEEP IT...
  135. ;
  136.     MOV    BL,0DFH            ; CONVERT TO UPPERCASE
  137.     AND    BL,AL            ; BL WILL HOLD THE UPPERCASE CHARACTER
  138. ;
  139.     CMP    BYTE PTR [SI],'A'    ; ALPHA INPUT ONLY?
  140.     JNZ    VAL_05            ; NO, CONTINUE ON...
  141.     CMP    BL,'A'            ; LOWER THAN AN A?
  142.     JB    VAL_BAD            ; YES
  143.     CMP    BL,'Z'            ; GREATER THAN A Z?
  144.     JA    VAL_BAD            ; YES, YES FLUSH IT
  145.     JMP    SHORT VAL_GOOD        ; NO, KEEP IT...
  146. ;
  147. VAL_05:
  148.     CMP    BYTE PTR [SI],'B'    ; BINARY INPUT?
  149.     JNZ    VAL_10            ; NO, CONTINUE ON...
  150.     CMP    AL,'0'            ; ZERO?
  151.     JZ    VAL_GOOD        ; YES
  152.     CMP    AL,'1'            ; ONE?
  153.     JZ    VAL_GOOD        ; YES
  154.     JMP    SHORT VAL_BAD        ; NO, FLUSH IT...
  155. ;
  156. VAL_10:
  157.     CMP    BYTE PTR [SI],'D'    ; DECIMAL INPUT?
  158.     JNZ    VAL_15            ; NO, CONTINUE ON...
  159.     CMP    AL,'0'            ; LESS THAN ZERO?
  160.     JB    VAL_BAD            ; YES
  161.     CMP    AL,'9'            ; GT 9?
  162.     JA    VAL_BAD            ; YES
  163.     JMP    SHORT VAL_GOOD        ; NO, KEEP IT...
  164. ;
  165. VAL_15:
  166.     CMP    BYTE PTR [SI],'H'    ; HEXADECIMAL INPUT?
  167.     JNZ    VAL_20            ; NO, CONTINUE ON...
  168.     CMP    AL,'0'            ; LESS THAN ZERO?
  169.     JB    VAL_BAD            ; YES
  170.     CMP    AL,'9'            ; GE 9?
  171.     JLE    VAL_GOOD        ; YES, IT RANGES FROM 0 TO 9
  172.     CMP    AL,'A'            ; LESS THAN 'A'?
  173.     JB    VAL_BAD            ; YES, EXIT BAD
  174.     CMP    AL,'F'            ; GT 'F'
  175.     JA    VAL_BAD            ; YES
  176.     JMP    SHORT VAL_GOOD        ; NO, KEEP IT...
  177. ;
  178. VAL_20:
  179.     CMP    BYTE PTR [SI],'O'    ; OCTAL INPUT?
  180.     JNZ    VAL_BAD            ; NO, CONTINUE ON...
  181.     CMP    AL,'0'            ; LESS THAN ZERO?
  182.     JB    VAL_BAD            ; YES
  183.     CMP    AL,'7'            ; GT 7?
  184.     JA    VAL_BAD            ; YES
  185. ;
  186. VAL_GOOD:
  187.     CLC                ; CARRY CLEAR = GOOD
  188.     RET
  189. ;
  190. VAL_BAD:
  191.     STC                ; CARRY SET = BAD
  192.     RET
  193.  
  194. VALIDATE    ENDP
  195. ;
  196. ENDPGM    EDITM
  197. ;
  198.