home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / pcmag / vol8n17.arc / FLAGS.ASM < prev    next >
Assembly Source File  |  1989-08-29  |  4KB  |  103 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10. ;********** FLAGS.ASM
  11.  
  12. ;Syntax: CALL ClearAll                'clear all flags
  13. ;        CALL ClearFlag(FlagNum%)     'clear flag number FlagNum%
  14. ;        CALL SetFlag(FlagNum%)       'set flag number FlagNum%
  15. ;        Flag = GetFlag%(FlagNum%)    'retrieve flag number FlagNum%
  16.  
  17. .Model Medium, Basic
  18. .Code
  19.  
  20.     Public ClearAll, ClearFlag, SetFlag, GetFlag
  21.  
  22. ClearAll Proc Far
  23.      Push CS                           ;copy the code segment into ES
  24.      Pop  ES
  25.      Mov  DI,Offset CS:Flags           ;point DI to the flag words
  26.      Mov  CX,4                         ;clear 4 words
  27.      Xor  AX,AX                        ;set AX = 0
  28.      Rep  Stosw                        ;store 4 zero words
  29.      Ret                               ;return to BASIC
  30. ClearAll Endp
  31.  
  32. ClearFlag Proc Far
  33.      Push BP                           ;set BP to incoming variable
  34.      Mov  BP,SP
  35.      Mov  SI,[BP+06]                   ;get the address for FlagNum%
  36.      Call DoFlag                       ;let DoFlag handle the common code
  37.      Jc   ExitClear                    ;if carry is set, FlagNum% was illegal
  38.      Not  AL                           ;reverse to clear the flag
  39.      And  CS:Flags [BX],AL             ;set the appropriate Flag bit
  40.  
  41. ExitClear:
  42.      Pop  BP                           ;restore BP
  43.      Ret  2                            ;return to BASIC
  44. ClearFlag Endp
  45.  
  46. SetFlag Proc Far
  47.      Push BP                           ;set BP to incoming variable
  48.      Mov  BP,SP
  49.      Mov  SI,[BP+06]                   ;get the address for FlagNum%
  50.      Call DoFlag                       ;let DoFlag do the work
  51.      Jc   ExitSet                      ;if carry is set, FlagNum% was illegal
  52.      Or   CS:Flags [BX],AL             ;set the appropriate Flag bit
  53.  
  54. ExitSet:
  55.      Pop  BP                           ;restore BP
  56.      Ret  2                            ;return to BASIC
  57. SetFlag Endp
  58.  
  59. GetFlag Proc Far
  60.      Push BP                           ;set BP to incoming variable
  61.      Mov  BP,SP
  62.      Mov  SI,[BP+06]                   ;get the address for FlagNum%
  63.      Call DoFlag                       ;let DoFlag worry about it
  64.      Test CS:Flags [BX],AL             ;see if the bit is set
  65.      Mov  AX,0                         ;assume it isn't
  66.      Jz   ExitGet                      ;we were right
  67.      Dec  AX                           ;no, assign -1 for the function output
  68.  
  69. ExitGet:
  70.      Pop  BP                           ;restore BP
  71.      Ret  2                            ;return to BASIC
  72. GetFlag Endp
  73.  
  74. DoFlag Proc Near                       ;common code for the other routines
  75.      Mov  AX,[SI]                      ;put FlagNum% into AX
  76.      Dec  AX                           ;adjust 1-64 to 0-63
  77.      Cmp  AX,63                        ;see if it's too high
  78.      Ja   DoError                      ;it is, get out
  79.  
  80.      Push AX                           ;save AX for later
  81.      Mov  CX,8                         ;divide by eight
  82.      Xor  DX,DX                        ;clear DX for the divide
  83.      Div  CX                           ;now AX points to the correct flag word
  84.      Mov  BX,AX                        ;transfer to BX for an index
  85.  
  86.      Mov  AL,1                         ;make a bit
  87.      Pop  CX                           ;retrieve the flag number
  88.      Rol  AL,CL                        ;now the bit is in position
  89.      Clc                               ;clear the carry to show no error
  90.      Ret                               ;return to caller
  91.  
  92. DoError:
  93.      Stc                               ;set the carry to show an error
  94.      Ret                               ;return to caller
  95. DoFlag Endp
  96.  
  97.      Flags   DB 8 Dup (0)              ;this holds the flags
  98.  
  99. End
  100.  
  101.  
  102.  
  103.