; Doug's Programming Language  -- DPL, Version 2.22
; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
;-----------------------------------------
; S C R N B K  --  BACKUP THE CURRENT STATE OF THE VIDEO DISPLAY,
;		   ASSUMING THAT IT IS IN TEXT MODE.
;
; Entry conditions:
;	AX points to the start of the video buffer
; Exit conditions:
;	DX Holds the old row/column position of the cursor
;	CX holds the cursor size
;	Assume AX,BX,CX,DX registers destroyed
;
;
; S C R N R S  --  RESTORES THE VIDEO TO THE PREVIOUS STATE.
;
; Entry conditions:
;	None
; Exit conditions:
;	Assume AX,BX,CX,DX registers destroyed
;
SUBPGM	SCRNBK
;
;-------------------------===========================--------------------------
;-------------------------====< BEGIN EXECUTION >====--------------------------
;-------------------------===========================--------------------------
;
BEGIN	SCRNBK
	PUSH	DI			; SAVE THE INDEXES
	PUSH	ES
	PUSH	DS
;
; MOVE THE BUFFER POINTER INTO DI
;
	MOV	DI,AX			; DI WILL POINT TO THE TARGET BUFFER
;
; GET & SAVE THE CURRENT VIDEO STATE
;
	MOV	AH,0FH			; GET THE CURRENT VIDEO DATA
	INT	10H
	MOV	[VIDPAGE],BH		; SAVE THE PAGE
	MOV	AH,03H
	INT	10H
;
	PUSH	DX			; SAVE THE CURSOR & SCAN LINES
	PUSH	CX
;
; SETUP THE SEGMENTS
;
	PUSH	DS			; PLACE DS IN ES
	POP	ES
	MOV	AX,0B000H
	TEST	[CRTFLAG],01		; MONO BOARD?
	JE	BKSC_05			; YES, CONTINUE ON...
	MOV	AX,0B800H		; NO, CGA
;
BKSC_05:
	MOV	DS,AX
;
; CALCUATE THE STARTING PAGE NUMBER
;
	SUB	BL,BL
	XCHG	BH,BL			; PLACE THE PAGE # IN BL
	MOV	AX,2048*2
	MOV	CX,AX			; MOVE A COPY FOR THE BLOCK MOVE
	MUL	BX
	MOV	SI,AX			; SI POINTS TO START OF VID RAM
	CLD
	REP	MOVSB			; BACK IT UP!!!
;
	POP	CX			; RETURN WITH THE X,Y & CURSOR SIZE
	POP	DX
;
	POP	DS
	POP	ES
	POP	DI
	RETURN
;
;
;---------------------------------------
; S C R N R S  --  RESTORE THE SCREEN
;
; Entry conditions:
;	AX points to the screen backup buffer
;	DX holds the cursor X,Y coordinates
;	CX holds the cursor shape
; Exit conditions:
;	Assume all working registers modified
;
	PUBLIC	SCRNRS
SCRNRS	PROC
	PUSH	ES			; DO NOT DISTURB
	PUSH	DX			; SAVE THE ROW/COL & CURSOR SIZE
	PUSH	CX
	MOV	SI,AX			; SI POINTS TO THE SCREEN BUFFER
;
; GET THE PROPER VIDEO SEGMENT
;
	MOV	AX,0B000H
	TEST	[CRTFLAG],01		; MONO BOARD?
	JE	RSSC_05			; YES, CONTINUE ON...
	MOV	AX,0B800H		; NO, CGA
;
RSSC_05:
	MOV	ES,AX
;
; CALCULATE THE STARTING PAGE NUMBER
;
	SUB	BH,BH
	MOV	BL,[VIDPAGE]		; BX = VIDEO PAGE
	MOV	AX,2048*2
	MOV	CX,AX			; CX HOLDS THE SIZE TO BE MOVED
	MUL	BX
	MOV	DI,AX			; DI POINTS TO START OF VID RAM
;
; MOVE IT...
;
	CLD
	REP	MOVSB			; BACK IT UP!!!
;
; RESTORE THE PREVIOUS VIDEO STATE
;
	POP	CX			; GET THE CURSOR SIZE
	POP	DX			; GET THE ROW/COL
;
	MOV	BH,[VIDPAGE]
	MOV	AH,02H			; SET THE CURSOR POSITION
	INT	10H
;
	POP	ES
	RETURN

SCRNRS	ENDP
;
ENDPGM	SCRNBK
;
