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

  1. ; pcrammov.asm
  2. ;
  3. ; 5/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 (without waiting for retrace signals)
  12. ;
  13. ;------------------------REVISION HISTORY--------------------------------------;
  14. ;  8/30/88 Ted  Changed Order of args to ram_memtoseg to extract ram_CopyBox.
  15. ; 10/07/88 Ted  Split into two files: rammov and ramwmov for retrace waiting.
  16. ;  6/23/89 ted    changed args to ram_mem1toseg
  17. ;
  18. ;------------------------------------------------------------------------------;
  19.  
  20. include    PCDECL.MAC
  21.  
  22.     PSEG
  23. ;------------------------------------------------------------------------------;
  24. ; ram_segwordset(int segm, int segoffs, int bwidth, int dupword);
  25.  
  26. pubproc DIGPRIV    ram_segwordset <segm, segoffs, bwidth, dupword>
  27.     push bp
  28.     mov bp,sp
  29.     pushm <ds, es, di, si>
  30.  
  31.     mov di, [bp].segoffs
  32.     mov cx, [bp].bwidth
  33.     cld                            ;set direction to increment
  34. ;---------
  35.     mov ax, [bp].segm
  36.     mov es, ax
  37.  
  38.     mov ax, [bp].dupword
  39.  
  40. ;---------
  41.     shr cx, 1
  42.     jcxz swjust1
  43.     rep stosw    ;store character and attribute
  44. swjust1:
  45.     jnc    swdone
  46.     stosb
  47. swdone:
  48.     popm <si, di, es, ds>
  49.     pop    bp
  50.     ret
  51. endproc ram_segwordset
  52. ;------------------------------------------------------------------------------;
  53. ; ram_segtoseg(int segm, int soffs, int doffs, int bwidth);
  54.  
  55. pubproc DIGPRIV    ram_segtoseg <segm, soffs, doffs, bwidth>
  56.     push bp
  57.     mov bp,sp
  58.     pushm <ds, es, di, si>
  59.  
  60.     mov si, [bp].soffs
  61.     mov di, [bp].doffs
  62.     mov cx, [bp].bwidth
  63.     cld                            ;set direction to increment
  64.  
  65.     mov ax, [bp].segm
  66.     mov ds, ax
  67.     mov es, ax
  68.  
  69.     ; if (soffs < doffs) postive move
  70.  
  71.     cmp    si, di
  72.     jae    positive
  73. ;---------
  74. ; negative move
  75.     add    si, cx        ; point si and di to end of area
  76.     dec    si
  77.     add    di, cx
  78.     dec    di
  79.  
  80.     std
  81. ;;    shr cx, 1
  82. ;;    jnc ndow
  83. ;;    movsb
  84. ;;ndow:
  85. ;;    jcxz ssdone
  86. ;;    dec    si
  87. ;;    dec    di
  88. ;;    rep    movsw
  89.     rep movsb    ;; move only a byte at a time so ega scroll will work
  90.     jmp short ssdone
  91. ;---------
  92. positive:
  93.     cld
  94. ;;    shr cx, 1
  95. ;;    jnc pdow
  96. ;;    movsb
  97. ;;pdow:
  98. ;;    jcxz ssdone
  99. ;;    rep    movsw
  100.     rep movsb    ;; move only a byte at a time so ega scroll will work
  101. ;--------------------------
  102. ssdone:
  103.     cld
  104.     popm <si, di, es, ds>
  105.     pop    bp
  106.     ret
  107. endproc ram_segtoseg
  108. ;------------------------------------------------------------------------------;
  109. ; ram_mem1toseg(unsigned segm, unsigned segoffs, byte *memaddr, unsigned byte1, unsigned blen);
  110. ; -Interleave bytes from memaddr array with byte1 at segm:segoffs.
  111.  
  112. pubproc DIGPRIV    ram_mem1toseg <segm, segoffs, memaddr, dptr, byte1, blen>
  113.     push bp
  114.     mov bp,sp
  115.     pushm <ds, es, di, si>
  116.  
  117.     mov cx, [bp].blen
  118.     jcxz m1sdone
  119.  
  120.     mov di, [bp].segoffs
  121.     mov ax, [bp].segm
  122.     mov es, ax
  123.  
  124.     mov si, [bp].memaddr
  125. IF FAR_DATA
  126.     mov ax, [bp].memaddr+2        ;get memaddr segment
  127.     mov ds, ax
  128. ENDIF
  129. ;--------------------------
  130.     mov ax, [bp].byte1
  131.     cld                            ;set direction to increment
  132. mem1s:
  133.     movsb
  134.     stosb
  135.     loop mem1s
  136. ;--------------------------
  137. m1sdone:
  138.     popm <si, di, es, ds>
  139.     pop    bp
  140.     ret
  141. endproc ram_mem1toseg
  142. ;------------------------------------------------------------------------------;
  143. ; ram_memtoseg(int segm, int segoffs, byte *memaddr, int bwidth);
  144.  
  145. pubproc DIGPRIV    ram_memtoseg <segm, segoffs, memaddr, dptr, bwidth>
  146.     push bp
  147.     mov bp,sp
  148.     pushm <ds, es, di, si>
  149.  
  150.     mov si, [bp].memaddr
  151.     mov di, [bp].segoffs
  152.     mov cx, [bp].bwidth
  153.     cld                            ;set direction to increment
  154.  
  155.     mov ax, [bp].segm
  156.     mov es, ax
  157.  
  158. IF FAR_DATA
  159.     mov ds, [bp].memaddr+2        ;get memaddr segment
  160. ENDIF
  161. ;--------------------------
  162.     shr cx, 1
  163.     jnc    msword
  164.     movsb
  165. msword:
  166.     jcxz msdone
  167.     rep movsw                    ;store character and attribute
  168. ;--------------------------
  169. msdone:
  170.     popm <si, di, es, ds>
  171.     pop    bp
  172.     ret
  173. endproc ram_memtoseg
  174. ;------------------------------------------------------------------------------;
  175. ; ram_segtomem(int segm, int segoffs, byte *memaddr, int bwidth);
  176.  
  177. pubproc DIGPRIV    ram_segtomem <segm, segoffs, memaddr, dptr, bwidth>
  178.     push bp
  179.     mov bp,sp
  180.     pushm <ds, es, di, si>
  181.  
  182. IFE FAR_DATA
  183.     mov bx, ds
  184. ENDIF
  185.     mov si, [bp].segoffs
  186.     mov di, [bp].memaddr
  187.     mov cx, [bp].bwidth
  188.     cld                            ;set direction to increment
  189. ;--------------------------
  190.     mov ax, [bp].segm
  191.     mov ds, ax
  192.  
  193. IF FAR_DATA
  194.     mov es, [bp].memaddr+2        ;get memaddr segment
  195. ELSE
  196.     mov es, bx
  197. ENDIF
  198.  
  199.     shr cx, 1
  200.     jnc    smword
  201.     movsb
  202. smword:
  203.     jcxz smdone
  204.     rep movsw                    ;store character and attribute
  205. ;--------------------------
  206. smdone:
  207.     popm <si, di, es, ds>
  208.     pop    bp
  209.     ret
  210. endproc ram_segtomem
  211. ;------------------------------------------------------------------------------;
  212.     ENDPS
  213.     end
  214. ;------------------------------------------------------------------------------;
  215.  
  216.