home *** CD-ROM | disk | FTP | other *** search
- ; pcramwmov.asm
- ;
- ; 10/7/88 by Ted
- ;
- ; Low Level RAM functions for Cscape
- ;
- ; Copyright (c) 1988, 1989 Oakland Group Inc.
- ; ALL RIGHTS RESERVED
- ;
- ; This file contains the low level routines used by display code
- ; to talk to the display (waiting for retrace signals)
- ;
- ;------------------------REVISION HISTORY--------------------------------------;
- ; 6/23/89 ted changed args to ram_wmem1toseg
- ;
- ;------------------------------------------------------------------------------;
- include PCDECL.MAC
-
- DOS_DATA_PAGE equ 40h
- ADDR_6845 equ 63h
-
- ;------------------------------------------------------------------------------;
- video_wait macro ;wait for video retrace
- local wait1, wait4 ;uses dx for crt port address, trashes al
- wait1:
- in al, dx ;al = status
- test al, 1 ;low bit
- jnz wait1
- wait4:
- in al, dx ;al = status
- test al, 1 ;low bit
- jz wait4
- endm
- ;------------------------------------------------------------------------------;
- PSEG
- ;------------------------------------------------------------------------------;
- ; ram_wsegwordset(int segm, int segoffs, int bwidth, int dupword);
-
- pubproc DIGPRIV ram_wsegwordset <segm, segoffs, bwidth, dupword>
- push bp
- mov bp,sp
- pushm <ds, es, di, si>
-
- mov di, [bp].segoffs
- mov cx, [bp].bwidth
- cld ;set direction to increment
- ;---------
- mov ax, DOS_DATA_PAGE ;ax = system data area
- mov ds, ax
- mov dx, ds:[ADDR_6845] ;crt controller
- add dx, 6 ;status port
-
- mov ax, [bp].segm
- mov es, ax
-
- mov ax, [bp].dupword
-
- shr cx, 1
- jnc swword
- jcxz swjust1
- ;---------
- swdopoll:
- mov bl, al
- video_wait ;wait for retrace
- mov al, bl
- stosw ;store character and attribute
- loop swdopoll
- swjust1:
- mov bl, al
- video_wait ;wait for retrace
- mov al, bl
- stosb
- jmp short swdone
- ;---------
- swword:
- jcxz swdone
- swdopollw:
- mov bl, al
- video_wait ;wait for retrace
- mov al, bl
- stosw ;store character and attribute
- loop swdopollw
- ;---------
- swdone:
- popm <si, di, es, ds>
- pop bp
- ret
- endproc ram_wsegwordset
- ;------------------------------------------------------------------------------;
- ; ram_wsegtoseg(int segm, int soffs, int doffs, int bwidth);
-
- pubproc DIGPRIV ram_wsegtoseg <segm, soffs, doffs, bwidth>
- push bp
- mov bp,sp
- pushm <ds, es, di, si>
-
- mov si, [bp].soffs
- mov di, [bp].doffs
- mov cx, [bp].bwidth
- cld ;set direction to increment
-
- mov ax, DOS_DATA_PAGE ;ax = system data area
- mov ds, ax
- mov dx, ds:[ADDR_6845] ;crt controller
- add dx, 6 ;status port
-
- mov ax, [bp].segm
- mov ds, ax
- mov es, ax
-
- ; if (soffs < doffs) postive move
-
- cmp si, di
- jae positive
- ;---------
- ; negative move
- add si, cx ; point si and di to end of area
- dec si
- add di, cx
- dec di
-
- std
- shr cx, 1
- jnc ndow
- video_wait ;wait for retrace
- movsb
- ndow:
- jcxz ssdone
- dec si
- dec di
- ssdopolln:
- video_wait ;wait for retrace
- movsw ;store character and attribute
- loop ssdopolln
- jmp short ssdone
- ;---------
- positive:
- cld
- shr cx, 1
- jnc pdow
- video_wait ;wait for retrace
- movsb
- pdow:
- jcxz ssdone
- ssdopollp:
- video_wait ;wait for retrace
- movsw ;store character and attribute
- loop ssdopollp
- jmp short ssdone
- ;---------
- ssdone:
- cld
- popm <si, di, es, ds>
- pop bp
- ret
- endproc ram_wsegtoseg
- ;------------------------------------------------------------------------------;
- ; ram_wmem1toseg(unsigned segm, unsigned segoffs, byte *memaddr, unsigned byte1, unsigned blen);
- ; -Interleave bytes from memaddr array with byte1 at segm:segoffs.
-
- pubproc DIGPRIV ram_wmem1toseg <segm, segoffs, memaddr, dptr, byte1, blen>
- push bp
- mov bp,sp
- pushm <ds, es, di, si>
-
- mov cx, [bp].blen
- jcxz m1sdone
-
- mov si, [bp].memaddr
- mov di, [bp].segoffs
-
- mov ax, DOS_DATA_PAGE ;ax = system data area
- mov es, ax
- mov dx, es:[ADDR_6845] ;crt controller
- add dx, 6 ;status port
-
- mov ax, [bp].segm
- mov es, ax
-
- IF FAR_DATA
- mov ax, [bp].memaddr + 2 ;get memaddr segment
- mov ds, ax
- ENDIF
- ;--------------------------
- mov ax, [bp].byte1
- cld
-
- mem1s:
- mov bl, al
- video_wait ;wait for retrace
- mov al, bl
- movsb
- stosb
- loop mem1s
- ;--------------------------
- m1sdone:
- popm <si, di, es, ds>
- pop bp
- ret
- endproc ram_wmem1toseg
- ;------------------------------------------------------------------------------;
- ENDPS
- end
- ;------------------------------------------------------------------------------;
-