BCX Console Demonstration Program s90.bas

'----------------------------------------------------------------- 
' BCX Console mode demonstration by Kevin Diggins (2000) 
' Uses pointer arithmetic to grab screen text and color attributes 
' Clears the screen and then restores the original text screen 
'----------------------------------------------------------------- 

DIM Buffer$ * (80 * 25 * 2) + 1
GetText(1, 1, 80, 24, Buffer$)
Say("Press a key to Clear the screen")
CLS
Say("Press a key to Restore the screen")
PutText(1, 1, 80, 24, Buffer$)


SUB Say (A$)
  LOCAL EatKey
  PRINT A$
  WHILE NOT INSTAT
  WEND
  EatKey = KEYPRESS
END SUB

SUB GetText (x1, y1, x2, y2, dest$)
  LOCAL  i      AS DWORD
  LOCAL  ilen   AS DWORD
  LOCAL  width  AS DWORD
  LOCAL  coord  AS COORD
  LOCAL  pwattr AS LPWORD
  LOCAL  y      AS INTEGER
  LOCAL  pstr   AS LPSTR

  width = (x2 - x1 + 1)
  pwattr = (USHORT *)malloc(width * SIZEOF(*pwattr) + 1)

  IF NOT pwattr THEN
    EXIT SUB
  END IF

  pstr = (CHAR *)malloc(width)

  IF NOT pstr THEN
    EXIT SUB
  END IF

  FOR y = y1 TO y2
    coord.X = x1 - 1
    coord.Y = y - 1
    ReadConsoleOutputCharacterA(hConsole, pstr, width, coord, &ilen)
    ReadConsoleOutputAttribute(hConsole, pwattr, width, coord, &ilen)
    FOR i = 0 TO width
      *dest$ = *(pstr + i)
      dest++
      *dest$ = (CHAR)*(pwattr + i)
      dest++
    NEXT
  NEXT
END SUB

SUB PutText (x1, y1, x2, y2, srce$)
  LOCAL i      AS DWORD
  LOCAL ilen   AS DWORD
  LOCAL width  AS DWORD
  LOCAL coord  AS COORD
  LOCAL pwattr AS LPWORD
  LOCAL y      AS INTEGER
  LOCAL pstr   AS LPSTR

  width = (x2 - x1 + 1)
  pwattr = (USHORT *)malloc(width * SIZEOF(*pwattr))

  IF NOT pwattr THEN
    EXIT SUB
  END IF

  pstr = (CHAR *)malloc(width + 1)

  IF NOT pstr THEN
    EXIT SUB
  END IF

  FOR y = y1 TO y2
    FOR i = 0 TO width
      *(pstr + i) = *srce$
      srce++
      *(pwattr + i) = *srce$
      srce++
    NEXT i
    coord.X = x1 - 1
    coord.Y = y - 1
    WriteConsoleOutputCharacterA(hConsole, pstr, width, coord, &ilen)
    WriteConsoleOutputAttribute(hConsole, pwattr, width, coord, &ilen)
  NEXT y
END SUB

Result:

Result not displayed for this example.