home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / QWIK21.ZIP / QSTORES.INC < prev    next >
Encoding:
Text File  |  1986-12-09  |  9.7 KB  |  145 lines

  1. { Qstores.inc - transfers blocks between screen and memory. ver 2.1, 12-09-86 }
  2. { These procedures do fast screen transfers of a Rows-by-Cols block to memory
  3.   and vice-versa.  It also automatically configures to your machine for Mono,
  4.   CGA, and EGA in any column format.  The upper left column is 1,1.  Cols can
  5.   range from 1 to 80 and Rows from 1 to 25 (a full screen on 80x25), but EGA
  6.   can handle more.  These are needed for pull down menus to save the display. }
  7.  
  8. { QstoreToMem - saves screen display for later use          ver 2.0, 11-24-86 }
  9. procedure QstoreToMem (Row, Col, Rows, Cols: byte; VAR Dest);
  10. begin
  11. Inline(
  12.    $8B/$5E/<ROWS         {       MOV   BX,[BP+<Rows]    ;Move number of rows}
  13.   /$8B/$4E/<COLS         {       MOV   CX,[BP+<Cols]    ;Move number of cols}
  14.                          {                              ;}
  15.   /$85/$DB               {       TEST  BX,BX            ;If Rows<=0 ...}
  16.   /$7E/$63               {       JLE   Exit             ;   nothing to do}
  17.   /$85/$C9               {       TEST  CX,CX            ;If Cols<=0 ...}
  18.   /$7E/$5F               {       JLE   Exit             ;   nothing to do}
  19.                          {                              ;}
  20.   /$31/$D2               {       XOR   DX,DX            ;Set DX=0}
  21.   /$8E/$C2               {       MOV   ES,DX            ;Set ES=0}
  22.   /$26/$8A/$16/$4A/$04   {       ES:   MOV DL,[$044A]   ;Get CRT columns}
  23.   /$8B/$46/<ROW          {       MOV   AX,[BP+<Row]     ;Move row in AX}
  24.   /$48                   {       DEC   AX               ;Convert to 0-?? range}
  25.   /$F6/$E2               {       MUL   DL               ;(CRT columns)*(Row-1)}
  26.   /$89/$C6               {       MOV   SI,AX            ;Partial offset in SI}
  27.   /$03/$76/<COL          {       ADD   SI,[BP+<Col]     ;Add Col}
  28.   /$4E                   {       DEC   SI               ;Convert to 0-?? range}
  29.   /$D1/$E6               {       SHL   SI,1             ;Source offset calc'd}
  30.   /$29/$CA               {       SUB   DX,CX            ;DX=(CRT columns)-Cols}
  31.   /$D1/$E2               {       SHL   DX,1             ;Mult by 2}
  32.   /$52                   {       PUSH  DX               ;Save # to next row}
  33.   /$51                   {       PUSH  CX               ;Save Cols}
  34.   /$1E                   {       PUSH  DS               ;Save Turbo's DS}
  35.   /$FC                   {       CLD                    ;Set DF to increment}
  36.   /$C4/$7E/<DEST         {       LES   DI,[BP+<Dest]    ;ES:DI points to Dest}
  37.   /$3A/$2E/>QWAIT        {       CMP   CH,[>Qwait]      ;Check need for wait}
  38.   /$8E/$1E/>QSEG         {       MOV   DS,[>Qseg]       ;DS:SI source pointer}
  39.   /$75/$0C               {       JNE   Color            ;  use Color routine}
  40.                          {                              ;}
  41.                          {; -- Mono routine; Attr, Char and No Wait--}
  42.   /$F2/$A5               {Mono:  REP   MOVSW            ;To dest & inc DI 2}
  43.   /$4B                   {       DEC   BX               ;Decrement rows left}
  44.   /$74/$29               {       JZ    Done             ;If Rows=0, done}
  45.   /$8B/$4E/$FA           {       MOV   CX,[BP-$06]      ;Restore Cols}
  46.   /$01/$D6               {       ADD   SI,DX            ;Source for next row}
  47.   /$EB/$F4               {       JMP   SHORT Mono       ;Next row}
  48.                          {                              ;}
  49.                          {; -- Color routine; Attr, Char and Wait --}
  50.   /$BA/$DA/$03           {Color: MOV   DX,$03DA         ;CGA port}
  51.   /$FA                   {Col1A: CLI                    ;Disable interrupts}
  52.   /$EC                   {E4in:  IN    AL,DX            ;Check CGA status}
  53.   /$A8/$08               {       TEST  AL,$08           ;If #3 bit set ...}
  54.   /$75/$09               {       JNZ   ColrB            ;  skip wait}
  55.   /$D0/$D8               {       RCR   AL,1             ;If #0 bit set ...}
  56.   /$72/$F7               {       JC    E4in             ;  try again for $E4}
  57.   /$EC                   {E5in:  IN    AL,DX            ;Check CGA status}
  58.   /$D0/$D8               {       RCR   AL,1             ;If #0 bit clear ...}
  59.   /$73/$FB               {       JNC   E5in             ;  try again for $E5}
  60.   /$AD                   {ColrB: LODSW                  ;Load char & attr}
  61.   /$FB                   {       STI                    ;Enable interrupts}
  62.   /$AB                   {       STOSW                  ;Put in dest & inc DI}
  63.   /$E2/$EC               {       LOOP  Col1A            ;Loop till CX=0}
  64.   /$4B                   {       DEC   BX               ;Decrement rows left}
  65.   /$74/$08               {       JZ    Done             ;If Rows=0, done}
  66.   /$8B/$4E/$FA           {       MOV   CX,[BP-$06]      ;Restore Cols}
  67.   /$03/$76/$FC           {       ADD   SI,[BP-$04]      ;Source for next row}
  68.   /$EB/$E1               {       JMP   SHORT Col1A      ;Next row}
  69.                          {                              ;}
  70.   /$1F                   {Done:  POP   DS               ;Restore Turbo's DS}
  71.   /$81/$C4/$04/$00       {       ADD   SP,$0004         ;Restore stack ptr}
  72.                          {Exit:}
  73. );
  74. end;
  75.  
  76. { QstoreToScr - restores screen display                    ver 2.1, 12-09-86 }
  77. procedure QstoreToScr (Row, Col, Rows, Cols: byte; VAR Source);
  78. begin
  79. Inline(
  80.    $8B/$5E/<ROWS         {       MOV   BX,[BP+<Rows]    ;Move number of rows}
  81.   /$8B/$4E/<COLS         {       MOV   CX,[BP+<Cols]    ;Move number of cols}
  82.                          {                              ;}
  83.   /$85/$DB               {       TEST  BX,BX            ;If Rows<=0 ...}
  84.   /$7E/$68               {       JLE   Exit             ;   nothing to do}
  85.   /$85/$C9               {       TEST  CX,CX            ;If Cols<=0 ...}
  86.   /$7E/$64               {       JLE   Exit             ;   nothing to do}
  87.                          {                              ;}
  88.   /$31/$D2               {       XOR   DX,DX            ;Set DX=0}
  89.   /$8E/$C2               {       MOV   ES,DX            ;Set ES=0}
  90.   /$26/$8A/$16/$4A/$04   {       ES:   MOV DL,[$044A]   ;Get CRT columns}
  91.   /$8B/$46/<ROW          {       MOV   AX,[BP+<Row]     ;Move row in AX}
  92.   /$48                   {       DEC   AX               ;Convert to 0-?? range}
  93.   /$F6/$E2               {       MUL   DL               ;(CRT columns)*(Row-1)}
  94.   /$89/$C7               {       MOV   DI,AX            ;Partial offset in DI}
  95.   /$03/$7E/<COL          {       ADD   DI,[BP+<Col]     ;Add Col}
  96.   /$4F                   {       DEC   DI               ;Convert to 0-?? range}
  97.   /$D1/$E7               {       SHL   DI,1             ;Source offset calc'd}
  98.   /$29/$CA               {       SUB   DX,CX            ;DX=(CRT columns)-Cols}
  99.   /$D1/$E2               {       SHL   DX,1             ;Mult by 2}
  100.   /$52                   {       PUSH  DX               ;Save # to next row}
  101.   /$51                   {       PUSH  CX               ;Save Cols}
  102.   /$1E                   {       PUSH  DS               ;Save Turbo's DS}
  103.   /$FC                   {       CLD                    ;Set DF to increment}
  104.   /$3A/$2E/>QWAIT        {       CMP   CH,[>Qwait]      ;Check need for wait}
  105.   /$8E/$06/>QSEG         {       MOV   ES,[>Qseg]       ;ES:DI screen pointer}
  106.   /$C5/$76/<SOURCE       {       LDS   SI,[BP+<Source]  ;DS:SI source pointer}
  107.   /$75/$0C               {       JNE   Color            ;  use Color routine}
  108.                          {                              ;}
  109.                          {; -- Mono routine; Attr, Char and No Wait--}
  110.   /$F2/$A5               {Mono:  REP   MOVSW            ;To dest & inc DI 2}
  111.   /$4B                   {       DEC   BX               ;Decrement rows left}
  112.   /$74/$2E               {       JZ    Done             ;If Rows=0, done}
  113.   /$8B/$4E/$FA           {       MOV   CX,[BP-$06]      ;Restore Cols}
  114.   /$01/$D7               {       ADD   DI,DX            ;Dest for next row}
  115.   /$EB/$F4               {       JMP   SHORT Mono       ;Next row}
  116.                          {                              ;}
  117.                          {; -- Color routine; Attr, Char and Wait --}
  118.   /$BA/$DA/$03           {Color: MOV   DX,$03DA         ;CGA port}
  119.   /$AD                   {Col1A: LODSW                  ;Load char & attr}
  120.   /$88/$C7               {       MOV   BH,AL            ;Save char in BH}
  121.   /$FA                   {       CLI                    ;Disable interrupts}
  122.   /$EC                   {E4in:  IN    AL,DX            ;Check CGA status}
  123.   /$A8/$08               {       TEST  AL,$08           ;If #3 bit set ...}
  124.   /$75/$09               {       JNZ   ColrB            ;  skip wait}
  125.   /$D0/$D8               {       RCR   AL,1             ;If #0 bit set ...}
  126.   /$72/$F7               {       JC    E4in             ;  try again for $E4}
  127.   /$EC                   {E5in:  IN    AL,DX            ;Check CGA status}
  128.   /$D0/$D8               {       RCR   AL,1             ;If #0 bit clear ...}
  129.   /$73/$FB               {       JNC   E5in             ;  try again for $E5}
  130.   /$88/$F8               {ColrB: MOV   AL,BH            ;Move char back in AL}
  131.   /$AB                   {       STOSW                  ;Put in dest & inc DI}
  132.   /$FB                   {       STI                    ;Enable interrupts}
  133.   /$E2/$E8               {       LOOP  Col1A            ;Loop till CX=0}
  134.   /$FE/$CB               {       DEC   BL               ;Decrement rows left}
  135.   /$74/$08               {       JZ    Done             ;If Rows=0, done}
  136.   /$8B/$4E/$FA           {       MOV   CX,[BP-$06]      ;Restore Cols}
  137.   /$03/$7E/$FC           {       ADD   DI,[BP-$04]      ;Dest for next row}
  138.   /$EB/$DC               {       JMP   SHORT Col1A      ;Next row}
  139.                          {                              ;}
  140.   /$1F                   {Done:  POP   DS               ;Restore Turbo's DS}
  141.   /$81/$C4/$04/$00       {       ADD   SP,$0004         ;Restore stack ptr}
  142.                          {Exit:}
  143. );
  144. end;
  145.