'===========================================================================
' Subject: 132-COLUMNS TEXT MODE              Date: 09-29-98 (13:22)       
'  Author: Anders Olofsson                    Code: QB, QBasic, PDS        
'  Origin: anders.olofsson@mail.bip.net     Packet: TEXT.ABC
'===========================================================================
' 132-columns, by Anders Olofsson 1998.
'                 e-mail: anders.olofsson@mail.bip.net
'
'  Here's a collection of routines needed to access and write
'  characters in the 132-columns mode. You may also use the "Getscr"
'  and "Putscr" to save screens to arrays (like get/put).
'
'  Compile it for maximum speed!

DEFINT A-Z
DECLARE SUB ResetScreen ()
DECLARE SUB Center (Row%, Text$, ForeColour%, BackColour%)
DECLARE SUB pPrint (Row%, Col%, S$, ForeColour%, BackColour%)
DECLARE SUB Set132 (Rows%)
DECLARE SUB ClearScreen ()
DECLARE SUB PutScr (Row%, Col%, Buffer%(), Scrnum%)
DECLARE SUB GetScr (Row1%, Col1%, Wid%, Hei%, Buffer%(), Scrnum%)

' Change these to suit your needs.
 COMMON SHARED ScreenWid, ScreenHei, ScreenSeg
 ScreenWid = 132: ScreenHei = 43: ScreenSeg = &HB800

 ' Buffer to store screens:
 DIM ScreenBuf(1 TO 4, (ScreenWid * ScreenHei) \ 2) AS INTEGER

 ' Set 132-columns and 43 rows.
  Set132 43
  
   Center 10, " Hello and welcome to 132 columns and 43 rows! ", 10, 1

   Center 13, "The routines in this program gives you abilities to write high-resolution text-applications,", 12, 0
   Center 14, "using 132 columns. If you're using big monitors (like 19 and 21 inches...), I know think 'll be a good surprise.", 10, 0
   Center 15, "You can save screens in buffers and put them back.", 11, 0
   Center 17, "Press a key for a 'GET SCREEN' and 'PUT SCREEN' demo.", 14, 0

  DO: LOOP UNTIL LEN(INKEY$)
 
 
 GetScr 10, 15, 105, 10, ScreenBuf(), 1
 PutScr 1, 1, ScreenBuf(), 1

RANDOMIZE TIMER * TIMER
 Row = RND * 15: Col = RND * 25: RP = 1: CP = 1

 DO
ReAdd:
  Row = Row + RP: Col = Col + CP
  IF Row + 10 > 43 THEN RP = -1: GOTO ReAdd
  IF Col + 105 > 132 THEN CP = -1: GOTO ReAdd
  IF Row < 1 THEN RP = 1: GOTO ReAdd
  IF Col < 1 THEN CP = 1: GOTO ReAdd
 
  ClearScreen
 
  PutScr Row, Col, ScreenBuf(), 1
  
   T! = TIMER: DO: LOOP UNTIL TIMER <> T!
   'FOR I = 1 TO 10
   ' WAIT &H3DA, 8: WAIT &H3DA, 8, 1: WAIT &H3DA, 8: WAIT &H3DA, 8, 1
   'NEXT
 
 LOOP UNTIL LEN(INKEY$)

 ResetScreen ' use this after to restore the screen...

SUB Center (Row, Text$, ForeColour, BackColour)
pPrint Row, (ScreenWid \ 2) - (LEN(Text$) \ 2), Text$, ForeColour, BackColour
END SUB

SUB ClearScreen
DEF SEG = ScreenSeg
FOR I = 0 TO ScreenHei * ScreenWid * 2
 POKE I, 0
NEXT
END SUB

SUB GetScr (Row1, Col1, Wid, Hei, Buffer%(), Scrnum)
DEF SEG = ScreenSeg
Buffer%(Scrnum, 0) = 256 * Wid + Hei
FOR R = Row1 TO Row1 + Hei - 1
FOR C = Col1 TO Col1 + Wid - 1
  Chrcode = PEEK(((R - 1) * ScreenWid + C - 1) * 2)
  ColrCode = PEEK(((R - 1) * ScreenWid + C - 1) * 2 + 1)
  Counter = Counter + 1
  Buffer%(Scrnum, Counter) = -32768 + 256& * ColrCode + Chrcode
NEXT
NEXT
END SUB

SUB pPrint (Row, Col, S$, ForeColour, BackColour)
IF Row > ScreenHei OR Row < 1 OR Col > ScreenWid OR Col < 1 THEN EXIT SUB
DEF SEG = ScreenSeg: Memloc = ScreenWid * (Row - 1) + (Col - 1): Memloc = Memloc + Memloc
FOR T = 0 TO LEN(S$) - 1
 IF Col + T > ScreenWid THEN EXIT FOR
 POKE Memloc, ASC(MID$(S$, T + 1, 1))
 POKE Memloc + 1, BackColour * 16 + ForeColour
 Memloc = Memloc + 2
NEXT T
DEF SEG
END SUB

SUB PutScr (Row, Col, Buffer%(), Scrnum)
Wid = Buffer%(Scrnum, 0) \ 256: Hei = Buffer%(Scrnum, 0) MOD 128
DEF SEG = ScreenSeg
FOR R = Row TO Row + Hei - 1
FOR C = Col TO Col + Wid - 1
  Counter = Counter + 1
  IF C <= ScreenWid AND C >= 1 THEN
   Chrcode = Buffer(Scrnum, Counter) MOD 256
   ColrCode = (Buffer(Scrnum, Counter) + 32768) \ 256
   POKE (((R - 1) * ScreenWid + C - 1) * 2), Chrcode
   POKE (((R - 1) * ScreenWid + C - 1) * 2) + 1, ColrCode
  END IF
NEXT
NEXT
END SUB

SUB ResetScreen
asm$ = CHR$(&HB8) + CHR$(3) + CHR$(0)
asm$ = asm$ + CHR$(&HCD) + CHR$(&H10) + CHR$(&HCB)
DEF SEG = VARSEG(asm$): CALL absolute(SADD(asm$))
END SUB

SUB Set132 (Rows)
IF Rows = 43 THEN Vidmode = &H54
IF Rows = 25 THEN Vidmode = &H55
IF Vidmode = 0 THEN EXIT SUB
asm$ = asm$ + CHR$(&HB8) + CHR$(Vidmode) + CHR$(0)
asm$ = asm$ + CHR$(&HCD) + CHR$(&H10) + CHR$(&HCB)
DEF SEG = VARSEG(asm$): CALL absolute(SADD(asm$))
END SUB
