home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1988 / 10 / toggle.asm < prev    next >
Assembly Source File  |  1988-05-30  |  4KB  |  146 lines

  1. ;=============================================================================
  2. ; TOGGLE.COM for the IBM Personal Computer - 1988 by Jeff Prosise
  3. ;
  4. ; TOGGLE allows the CapsLock, NumLock, and ScrollLock states to be
  5. ; toggled on and off in batch mode.  Syntax is:
  6. ;
  7. ;    TOGGLE [+c|-c] [+n|-n] [+s|-s]
  8. ;
  9. ; where the 'c' parameter controls the CapsLock state, 'n' controls
  10. ; NumLock, and 's' controls ScrollLock.
  11. ;=============================================================================
  12.  
  13. BIOS_DATA    SEGMENT    AT 40H
  14.         ORG    17H
  15. SHIFT_STATE    DB    ?            ;Bit 4 = ScrollLock
  16.                         ;Bit 5 = NumLock
  17.                         ;Bit 6 = CapsLock
  18. BIOS_DATA    ENDS
  19.  
  20. ;=============================================================================
  21. ; Code Segment (code and data)
  22. ;=============================================================================
  23. CODE        SEGMENT PARA PUBLIC 'CODE'
  24.         ASSUME    CS:CODE, DS:CODE
  25.         ORG    100H
  26. BEGIN:        JMP    MAIN
  27.  
  28. CR        EQU    13
  29. LF        EQU    10
  30.  
  31. PROGRAM        DB    "TOGGLE 1.0 (c) 1988 Ziff Communications Co.",CR,LF
  32.         DB    "PC Magazine ",254," Jeff Prosise",CR,LF,"$",1AH
  33.  
  34. ERRMSG        DB    CR,LF,"Usage:  TOGGLE [+c|-c] [+n|-n] [+s|-s]"
  35.         DB    CR,LF,"$"
  36.  
  37. TEXT1        DB    CR,LF
  38.                 DB    "    CapsLock   :  $"
  39. TEXT2        DB    "    NumLock    :  $"
  40. TEXT3        DB    "    ScrollLock :  $"
  41. ONTEXT        DB    "On",CR,LF,"$"
  42. OFFTEXT        DB    "Off",CR,LF,"$"
  43.  
  44. ;-----------------------------------------------------------------------------
  45. ; MAIN is the primary portion of the code.
  46. ;-----------------------------------------------------------------------------
  47. MAIN        PROC    NEAR
  48.  
  49.         MOV    AX,BIOS_DATA        ;point ES to BIOS Data Area
  50.         MOV    ES,AX
  51.         ASSUME    ES:BIOS_DATA
  52.         CLD                ;clear DF
  53.         MOV    SI,81H            ;point SI to command line
  54. ;
  55. ;Search the command line for entries, and loop until all are processed.
  56. ;
  57. MAINLOOP:    LODSB                ;search for next non-space
  58.         CMP    AL,20H
  59.         JE    MAINLOOP
  60.  
  61.         CMP    AL,0DH            ;branch if end-of-line reached
  62.         JE    END_PARSE
  63.         CMP    AL,"+"            ;branch if plus operator is
  64.         JE    PROCESS            ;  encountered
  65.         CMP    AL,"-"            ;branch if minus operator is
  66.         JE    PROCESS            ;  encountered
  67. ;
  68. ;An unrecognized entry was found.  Print correct syntax and exit.
  69. ;
  70. ERROR_EXIT:    MOV    AH,9            ;display correct syntax
  71.         MOV    DX,OFFSET ERRMSG
  72.         INT    21H
  73.         MOV    AX,4C01H        ;exit with ERRORLEVEL = 1
  74.         INT    21H
  75. ;
  76. ;Check current parameter against list of valid ones.
  77. ;
  78. PROCESS:    LODSB                ;get parameter byte
  79.         AND    AL,0DFH            ;capitalize it
  80.         MOV    AH,10H            ;branch if parameter is an "S"
  81.         CMP    AL,"S"
  82.         JE    TOGGLE_STATE_BIT
  83.         MOV    AH,20H            ;branch on "N"
  84.         CMP    AL,"N"
  85.         JE    TOGGLE_STATE_BIT
  86.         MOV    AH,40H            ;branch on "C"
  87.         CMP    AL,"C"
  88.         JNE    ERROR_EXIT
  89. ;
  90. ;Turn the indicated state bit on or off.
  91. ;
  92. TOGGLE_STATE_BIT:
  93.         CMP    BYTE PTR [SI-2],"+"    ;branch if operator was a
  94.         JNE    CLEAR_BIT        ;  minus symbol
  95.         OR    SHIFT_STATE,AH        ;turn indicated state on
  96.         JMP    MAINLOOP        ;reenter parsing loop
  97.  
  98. CLEAR_BIT:    NOT    AH            ;complement bit indicator
  99.         AND    SHIFT_STATE,AH        ;turn indicated state off
  100.         JMP    MAINLOOP        ;reenter parsing loop
  101. ;
  102. ;Display current status of all three lock states and exit.
  103. ;
  104. END_PARSE:    MOV    AH,9            ;display copyright notice
  105.         MOV    DX,OFFSET  PROGRAM
  106.         INT    21H
  107.  
  108.         MOV    AH,9            ;display CapsLock state
  109.         MOV    DX,OFFSET TEXT1
  110.         INT    21H
  111.         MOV    AH,40H
  112.         CALL    PRINT_STATE
  113.  
  114.         MOV    AH,9            ;display NumLock state
  115.         MOV    DX,OFFSET TEXT2
  116.         INT    21H
  117.         MOV    AH,20H
  118.         CALL    PRINT_STATE
  119.  
  120.         MOV    AH,9            ;display ScrollLock state
  121.         MOV    DX,OFFSET TEXT3
  122.         INT    21H
  123.         MOV    AH,10H
  124.         CALL    PRINT_STATE
  125.  
  126.         MOV    AX,4C00H        ;exit with ERRORLEVEL = 0
  127.         INT    21H
  128. MAIN        ENDP
  129.  
  130. ;-----------------------------------------------------------------------------
  131. ; PRINT_STATE is called by MAIN to display "On" or "Off" to a 1 or 0 value,
  132. ; respectively, of the bit in the BIOS shift state byte indicated in AH.
  133. ;-----------------------------------------------------------------------------
  134. PRINT_STATE    PROC    NEAR
  135.         MOV    DX,OFFSET OFFTEXT    ;preload "Off" text address 
  136.         TEST    SHIFT_STATE,AH        ;test actual state
  137.         JZ    IS_OFF            ;branch if assumption valid
  138.         MOV    DX,OFFSET ONTEXT    ;load "On" text address
  139. IS_OFF:        MOV    AH,9            ;display "On" or "Off"
  140.         INT    21H
  141.         RET
  142. PRINT_STATE    ENDP
  143.  
  144. CODE        ENDS
  145.         END BEGIN
  146.