home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / PCRAMWMO.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-06-30  |  4.4 KB  |  206 lines

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