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

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