' *** DEFSG_EX.BAS -- DEF SEG statement programming example ***
' This program uses DEF SEG, PEEK, and POKE to turn
' the CAPS LOCK on and off.
'
' NOTE: This program contains hardware-specific instructions.
'       It works correctly on IBM PC, PC/XT, and PC/AT computers.
'
DECLARE SUB CapsOn ()
DECLARE SUB CapsOff ()
DECLARE SUB PrntMsg (R%, C%, M$)

CLS
CapsOn
PrntMsg 24, 1, "<Caps Lock On>"
LOCATE 12, 10
LINE INPUT "Enter a string (all characters are caps): ", S$
CapsOff
PrntMsg 24, 1, " Caps Lock Off"
LOCATE 13, 10
LINE INPUT "Enter another string (normal type): ", S$
END

SUB CapsOff STATIC
' Turn Caps Lock off
   DEF SEG = 0
   ' Set Caps Lock off (turn off bit 6 of &H0417)
   POKE &H417, PEEK(&H417) AND &HBF
   DEF SEG
END SUB

SUB CapsOn STATIC
' Turn Caps Lock on
   ' Set segment to low memory
   DEF SEG = 0
   ' Set Caps Lock on (turn on bit 6 of &H0417)
   POKE &H417, PEEK(&H417) OR &H40
   ' Restore segment
   DEF SEG
END SUB

SUB PrntMsg (Row%, Col%, Message$) STATIC
' Print message at Row%, Col% without changing cursor
   ' Save cursor position
   CurRow% = CSRLIN: CurCol% = POS(0)
   LOCATE Row%, Col%: PRINT Message$;
   ' Restore cursor
   LOCATE CurRow%, CurCol%
END SUB

