home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / PCRAMWMO.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-02-03  |  4.4 KB  |  207 lines

  1. ; pcramwmov.asm
  2. ;
  3. ; 10/7/88 by Ted
  4. ;
  5. ; Low Level RAM functions for Cscape
  6. ;
  7. ; OWL-PCA 1.2
  8. ; Copyright (c) 1988, 1989 Oakland Group Inc.
  9. ; ALL RIGHTS RESERVED
  10. ;
  11. ; This file contains the low level routines used by display code
  12. ; to talk to the display (waiting for retrace signals)
  13. ;
  14. ;------------------------REVISION HISTORY--------------------------------------;
  15. ; 6/23/89 ted    changed args to ram_wmem1toseg
  16. ;
  17. ;------------------------------------------------------------------------------;
  18. include    PCDECL.MAC
  19.  
  20. DOS_DATA_PAGE    equ    40h
  21. ADDR_6845        equ    63h
  22.  
  23. ;------------------------------------------------------------------------------;
  24. video_wait macro                ;wait for video retrace
  25.     local wait1, wait4            ;uses dx for crt port address, trashes al
  26. wait1:
  27.     in     al, dx                ;al = status
  28.     test al, 1                ;low bit
  29.     jnz  wait1
  30. wait4:
  31.     in   al, dx                ;al = status
  32.     test al, 1                ;low bit
  33.     jz   wait4
  34. endm
  35. ;------------------------------------------------------------------------------;
  36.     PSEG
  37. ;------------------------------------------------------------------------------;
  38. ; ram_wsegwordset(int segm, int segoffs, int bwidth, int dupword);
  39.  
  40. pubproc DIGPRIV    ram_wsegwordset <segm, segoffs, bwidth, dupword>
  41.     push bp
  42.     mov bp,sp
  43.     pushm <ds, es, di, si>
  44.  
  45.     mov di, [bp].segoffs
  46.     mov cx, [bp].bwidth
  47.     cld                            ;set direction to increment
  48. ;---------
  49.     mov    ax, DOS_DATA_PAGE        ;ax = system data area
  50.     mov    ds, ax
  51.     mov    dx, ds:[ADDR_6845]        ;crt controller
  52.     add    dx, 6                    ;status port
  53.  
  54.     mov ax, [bp].segm
  55.     mov es, ax
  56.  
  57.     mov ax, [bp].dupword
  58.  
  59.     shr cx, 1
  60.     jnc    swword
  61.     jcxz swjust1
  62. ;---------
  63. swdopoll:
  64.     mov bl, al
  65.     video_wait                    ;wait for retrace
  66.     mov al, bl
  67.     stosw                        ;store character and attribute
  68.     loop swdopoll
  69. swjust1:
  70.     mov bl, al
  71.     video_wait                    ;wait for retrace
  72.     mov al, bl
  73.     stosb
  74.     jmp short swdone
  75. ;---------
  76. swword:
  77.     jcxz swdone
  78. swdopollw:
  79.     mov bl, al
  80.     video_wait                    ;wait for retrace
  81.     mov al, bl
  82.     stosw                        ;store character and attribute
  83.     loop swdopollw
  84. ;---------
  85. swdone:
  86.     popm <si, di, es, ds>
  87.     pop    bp
  88.     ret
  89. endproc ram_wsegwordset
  90. ;------------------------------------------------------------------------------;
  91. ; ram_wsegtoseg(int segm, int soffs, int doffs, int bwidth);
  92.  
  93. pubproc DIGPRIV    ram_wsegtoseg <segm, soffs, doffs, bwidth>
  94.     push bp
  95.     mov bp,sp
  96.     pushm <ds, es, di, si>
  97.  
  98.     mov si, [bp].soffs
  99.     mov di, [bp].doffs
  100.     mov cx, [bp].bwidth
  101.     cld                            ;set direction to increment
  102.  
  103.     mov    ax, DOS_DATA_PAGE        ;ax = system data area
  104.     mov    ds, ax
  105.     mov    dx, ds:[ADDR_6845]        ;crt controller
  106.     add    dx, 6                    ;status port
  107.  
  108.     mov ax, [bp].segm
  109.     mov ds, ax
  110.     mov es, ax
  111.  
  112.     ; if (soffs < doffs) postive move
  113.  
  114.     cmp    si, di
  115.     jae    positive
  116. ;---------
  117. ; negative move
  118.     add    si, cx        ; point si and di to end of area
  119.     dec    si
  120.     add    di, cx
  121.     dec    di
  122.  
  123.     std
  124.     shr cx, 1
  125.     jnc ndow
  126.     video_wait                    ;wait for retrace
  127.     movsb
  128. ndow:
  129.     jcxz ssdone
  130.     dec    si
  131.     dec    di
  132. ssdopolln:
  133.     video_wait                    ;wait for retrace
  134.     movsw                        ;store character and attribute
  135.     loop ssdopolln
  136.     jmp short ssdone
  137. ;---------
  138. positive:
  139.     cld
  140.     shr cx, 1
  141.     jnc pdow
  142.     video_wait                    ;wait for retrace
  143.     movsb
  144. pdow:
  145.     jcxz ssdone
  146. ssdopollp:
  147.     video_wait                    ;wait for retrace
  148.     movsw                        ;store character and attribute
  149.     loop ssdopollp
  150.     jmp short ssdone
  151. ;---------
  152. ssdone:
  153.     cld
  154.     popm <si, di, es, ds>
  155.     pop    bp
  156.     ret
  157. endproc ram_wsegtoseg
  158. ;------------------------------------------------------------------------------;
  159. ; ram_wmem1toseg(unsigned segm, unsigned segoffs, byte *memaddr, unsigned byte1, unsigned blen);
  160. ; -Interleave bytes from memaddr array with byte1 at segm:segoffs.
  161.  
  162. pubproc DIGPRIV    ram_wmem1toseg <segm, segoffs, memaddr, dptr, byte1, blen>
  163.     push bp
  164.     mov bp,sp
  165.     pushm <ds, es, di, si>
  166.  
  167.     mov cx, [bp].blen
  168.     jcxz m1sdone
  169.  
  170.     mov si, [bp].memaddr
  171.     mov di, [bp].segoffs
  172.  
  173.     mov    ax, DOS_DATA_PAGE        ;ax = system data area
  174.     mov    es, ax
  175.     mov    dx, es:[ADDR_6845]        ;crt controller
  176.     add    dx, 6                    ;status port
  177.  
  178.     mov ax, [bp].segm
  179.     mov es, ax
  180.  
  181. IF FAR_DATA
  182.     mov ax, [bp].memaddr + 2    ;get memaddr segment
  183.     mov ds, ax
  184. ENDIF
  185. ;--------------------------
  186.     mov ax, [bp].byte1
  187.     cld
  188.  
  189. mem1s:
  190.     mov bl, al
  191.     video_wait                    ;wait for retrace
  192.     mov al, bl
  193.     movsb
  194.     stosb
  195.     loop mem1s
  196. ;--------------------------
  197. m1sdone:
  198.     popm <si, di, es, ds>
  199.     pop    bp
  200.     ret
  201. endproc ram_wmem1toseg
  202. ;------------------------------------------------------------------------------;
  203.     ENDPS
  204.     end
  205. ;------------------------------------------------------------------------------;
  206.  
  207.