view VPOST.INC @ 7:ad2c0d320f08 default tip

Moved comments that were shifted down by a line.
author Michal Necasek <mnecasek@yahoo.com>
date Tue, 24 Oct 2023 15:39:00 +0200
parents 9142dc5b276a
children
line wrap: on
line source

	SUBTTL	VPOST.INC
	PAGE

;----- POST

	ASSUME	CS:CODE,DS:ABS0
	ORG	0H
	DB	055H				; SIGNATURE
	DB	0AAH				;  BYTES
	DB	020H				; LENGTH INDICATOR

;----- NOTE : DO NOT USE THE SIGNATURE BYTES AS A PRESENCE TEST

;	PLANAR VIDEO SWITCH SETTINGS

;	0 0 - UNUSED
;	0 1 - 40 X 25 COLOR
;	1 0 - 80 X 25 COLOR
;	1 1 - 80 X 25 MONOCHROME
; NOTE : 0 0 MUST BE SET WHEN THIS ADAPTER IS INSTALLED.

;	VIDEO ADAPTER SWITCH SETTINGS

;	0 0 0 0 - MONOC PRIMARY, EGA COLOR, 40X25
;	0 0 0 1 - MONOC PRIMARY, EGA COLOR, 80X25
;	0 0 1 0 - MONOC PRIMARY, EGA HI RES EMULATE (SAME AS 0001)
;	0 0 1 1 - MONOC PRIMARY, EGA HI RES ENHANCED
;	0 1 0 0 - COLOR 40 PRIMARY, EGA MONOCHROME
;	0 1 0 1 - COLOR 80 PRIMARY, EGA MONOCHROME

;	0 1 1 0 - MONOC SECONDARY, EGA COLOR, 40X25
;	0 1 1 1 - MONOC SECONDARY, EGA COLOR, 80X25
;	1 0 0 0 - MONOC SECONDARY, EGA HI RES EMULATE (SAME AS 0111)
;	1 0 0 1 - MONOC SECONDARY, EGA HI RES ENHANCED
;	1 0 1 0 - COLOR 40 SECONDARY, EGA MONOCHROME
;	1 0 1 1 - COLOR 80 SECONDARY, EGA MONOCHROME

;	1 1 0 0 - RESERVED
;	1 1 0 1 - RESERVED
;	1 1 1 0 - RESERVED
;	1 1 1 1 - RESERVED

;----- SETUP ROUTINE FOR THIS MODULE

VIDEO_SETUP	PROC	FAR
	JMP	SHORT	L1
	DB	'2400'
	DB	'6277356 (C)COPYRIGHT IBM 1984'




	DB	'9/13/84'


;----- SET UP VIDEO VECTORS

L1:
	MOV	DH,3
	MOV	DL,INPUT_STATUS
	IN	AL,DX
	MOV	DL,INPUT_STATUS_B
	IN	AL,DX
	MOV	DL,ATTR_WRITE
	MOV	AL,0
	OUT	DX,AL

	SRLOAD	DS,0
	CLI
	MOV	WORD PTR VIDEO,OFFSET COMBO_VIDEO
	MOV	WORD PTR VIDEO+2, CS
	MOV	WORD PTR PLANAR_VIDEO,0F065H
	MOV	WORD PTR PLANAR_VIDEO+2,0F000H
	MOV	WORD PTR SAVE_PTR,OFFSET SAVE_TBL
	MOV	WORD PTR SAVE_PTR+2, CS
	MOV	WORD PTR EXT_PTR, OFFSET INT_1F_1
	MOV	WORD PTR EXT_PTR+2, CS
	MOV	WORD PTR GRX_SET, OFFSET CGDDOT
	MOV	WORD PTR GRX_SET+2, CS
	STI
	
;----- POST FOR COMBO VIDEO CARD

	MOV	INFO,00000100B
	CALL	RD_SWS
	MOV	INFO_3,BL
	CALL	F_BTS
	OR	INFO_3,AL
	MOV	BL,INFO_3
	CALL	MK_ENV
	JMP	POST
SKIP:
	RET
VIDEO_SETUP	ENDP


POR_1	PROC	NEAR
	OUT	DX,AL
	PUSH	AX
	POP	AX
	IN	AL,DX
	AND	AL,010H
	SHR	AL,1
	RET
POR_1	ENDP

;----- READ THE SWITCH SETTINGS ON THE CARD

RD_SWS	PROC	NEAR
	ASSUME	DS:ABS0
	MOV	DH,3
	MOV	DL,MISC_OUTPUT
	MOV	AL,1
	OUT	DX,AL

;----- COULD BE 0,4,8,C

	MOV	AL,0DH
	CALL	POR_1
	SHR	AL,1
	SHR	AL,1
	SHR	AL,1
	MOV	BL,AL

	MOV	AL,9
	CALL	POR_1
	SHR	AL,1
	SHR	AL,1
	OR	BL,AL

	MOV	AL,5
	CALL	POR_1
	SHR	AL,1
	OR	BL,AL

	MOV	AL,1
	CALL	POR_1
	OR	BL,AL

	AND	BL,0FH
	RET
RD_SWS	ENDP

;----- OBTAIN THE FEATURE BITS FROM DAUGHTER CARD

F_BTS	PROC	NEAR
	MOV	DH,3
	MOV	DL,0BAH
	MOV	AL,1
	OUT	DX,AL
	MOV	DL,0DAH
	OUT	DX,AL
	MOV	DL,IN_STAT_0
	IN	AL,DX				; READ FEATURE BITS
	AND	AL,060H
	SHR	AL,1
	MOV	BL,AL
	MOV	DL,0BAH
	MOV	AL,2
	OUT	DX,AL
	MOV	DL,0DAH
	OUT	DX,AL
	MOV	DL,IN_STAT_0
	IN	AL,DX				; READ FEATURE BITS
	AND	AL,060H
	SHL	AL,1
	OR	AL,BL
	RET
F_BTS	ENDP

;----- ESTABLISH THE VIDEO ENVIRONMENT, KEYED OFF OF THE SWITCHES

MK_ENV	PROC	NEAR
	ASSUME	DS:ABS0
	SUB	BH,BH
	AND	BL,0FH
	SAL	BX,1
	PUSH	DX
	MOV	DH,3
	MOV	AH,DH
	POP	DX
	AND	AH,1
	INC	AH
	NOT	AH
	JMP	WORD PTR CS:[BX + OFFSET T5]

SAVE_TBL	LABEL	DWORD
	DW	OFFSET	VIDEO_PARMS		; PARMS
	DW	0C000H				; PARMS
	DW	0				; PAL SAVE AREA
	DW	0				; PAL SAVE AREA
	DW	0				; ALPHA TABLES
	DW	0				; ALPHA TABLES
	DW	0				; GRAPHICS TABLES
	DW	0				; GRAPHICS TABLES

	DW	0
	DW	0
	DW	0
	DW	0
	DW	0
	DW	0
	
T5	LABEL	WORD
	DW	OFFSET PST_0
	DW	OFFSET PST_1
	DW	OFFSET PST_2
	DW	OFFSET PST_3
	DW	OFFSET PST_4
	DW	OFFSET PST_5
	DW	OFFSET PST_6
	DW	OFFSET PST_7

	DW	OFFSET PST_8
	DW	OFFSET PST_9
	DW	OFFSET PST_A
	DW	OFFSET PST_B
	DW	OFFSET PST_OUT
	DW	OFFSET PST_OUT
	DW	OFFSET PST_OUT
	DW	OFFSET PST_OUT

ENV_X	PROC	NEAR				; SET 40X25 COLOR ALPHA
	AND	EQUIP_LOW,0CFH
	OR	EQUIP_LOW,010H
	MOV	AX,1H
	INT	10H
	RET
ENV_X	ENDP

ENV_0	PROC	NEAR				; SET 80X25 COLOR ALPHA
	AND	EQUIP_LOW,0CFH
	OR	EQUIP_LOW,020H
	MOV	AX,03H
	INT	10H
	RET
ENV_0	ENDP

ENV_3	PROC	NEAR				; SET MONOCHROME ALPHA
	OR	EQUIP_LOW,030H
	MOV	AX,07H
	INT	10H
	RET
ENV_3	ENDP


PST_0:
	AND	INFO,AH
	CALL	ENV_X
	CALL	ENV_3
	RET
PST_1:
PST_2:
	AND	INFO,AH
	CALL	ENV_0
	CALL	ENV_3
	RET
PST_3:
	AND	INFO,AH
	CALL	ENV_0
	CALL	ENV_3
	RET
PST_4:
	MOV	DH,3
	MOV	DL,MISC_OUTPUT
	MOV	AL,0
	OUT	DX,AL
	NOT	AH
	OR	INFO,AH
	CALL	ENV_3
	CALL	ENV_X
	RET
PST_5:
	MOV	DH,3
	MOV	DL,MISC_OUTPUT
	MOV	AL,0
	OUT	DX,AL
	NOT	AH
	OR	INFO,AH
	CALL	ENV_3
	CALL	ENV_0
	RET
PST_6:
	AND	INFO,AH
	CALL	ENV_3
	CALL	ENV_X
	RET
PST_7:
PST_8:
	AND	INFO,AH
	CALL	ENV_3
	CALL	ENV_0
	RET
PST_9:
	AND	INFO,AH
	CALL	ENV_3
	CALL	ENV_0
	RET
PST_A:
	MOV	DH,3
	MOV	DL,MISC_OUTPUT
	MOV	AL,0
	OUT	DX,AL
	NOT	AH
	OR	INFO,AH
	CALL	ENV_X
	CALL	ENV_3
	RET
PST_B:
	MOV	DH,3
	MOV	DL,MISC_OUTPUT
	MOV	AL,0
	OUT	DX,AL
	NOT	AH
	OR	INFO,AH
	CALL	ENV_0
	CALL	ENV_3
PST_OUT:
	RET
MK_ENV	ENDP

;------------------------------------------------------------------------
; THIS ROUTINE TESTS THE CRT CARD INTERNAL DATA BUS AND IN A LIMITED	:
; WAY TESTS THE CRTC VIDEO CHIP BY WRITING/READING FROM CURSOR REGISTER :
; CARRY IS SET IF AN ERROR IS FOUND					:
;									:
; REGISTERS BX,SI,ES,DS ARE PRESERVED.					:
; REGISTERS AX,CX,DX ARE MODIFYED.					:
;------------------------------------------------------------------------
CD_PRESENCE_TST PROC	NEAR
	PUSH	BX			; SAVE BX
	MOV	BX,07FH			; INITIAL WORD PATTERN BYTE
	MOV	DI,BX
	PUSH	AX			; SAVE PORT ADDRESS
	CALL	RD_CURSOR		;
	MOV	SI,AX			; SAVE ORIGINAL VALUE
	POP	AX			; RECOVER PORT ADDRESS
	PUSH	AX			; SAVE PORT ADDRESS
	CALL	WR_CURSOR		; WRITE CURSOR
	POP	AX			; RECOVER PORT ADDRESS
	PUSH	AX			; SAVE PORT ADDRESS
	CALL	RD_CURSOR		; READ IT BACK
	CMP	AX,DI			; SAME?
	POP	AX
	JNZ	NOT_PRESENT		; EXIT IF NOT EQUAL
	JMP	TST_EX
NOT_PRESENT:
	XOR	AX,AX			; SET NOT PRESENT
	POP	BX
	RET
TST_EX:
	MOV	AX,1			; SET PRESENT ON EXIT
	POP	BX			; RESTORE BX
	RET
CD_PRESENCE_TST ENDP

;------------------------------------------------------------------------
; MODULE NAME  RD_CURSOR						:
;  READ CURSOR POSITION [ADDRESS] (FROM CRTC) TO  AX			:
;									:
; REGISTER AX IS MODIFIED.						:
;------------------------------------------------------------------------
RD_CURSOR	PROC	NEAR
	PUSH	DX			; SAVE REGS USED
	MOV	DX,AX
	MOV	AL,C_CRSR_LOC_HGH
	OUT	DX,AL
	INC	DX
	IN	AL,DX
					; RETURN WITH CURSOR POS IN AX
					; RESTORE REGS USED
	POP	DX
	RET
RD_CURSOR	ENDP

;------------------------------------------------------------------------
; MODULE NAME  WR_CURSOR						:
;  WRITE CURSOR POSITION [ADDRESS] (TO CRTC) WITH CONTENTS OF AX	:
;									:
; ALL REGISTERS PRESERVED						:
;------------------------------------------------------------------------
WR_CURSOR	PROC NEAR
					; SAVE REGS USED
	PUSH	AX
	PUSH	DX
	MOV	DX,AX
	MOV	AH,C_CRSR_LOC_HGH	; CURSOR LOCATION HIGH INDEX
	MOV	AL,07FH			; TEST VALUE
	CALL	OUT_DX
					; RETURN WITH CURSOR POS IN AX
					; RESTORE REGS USED
	POP	DX
	POP	AX
	RET
WR_CURSOR	ENDP

POST:
;--------------------------------------------------------
;	INITIALIZE AND START CRT CONTROLLER (6845)	:
;	ON COLOR GRAPHICS AND MONOCHROME CARDS		:
;	TEST VIDEO READ/WRITE STORAGE.			:
; DESCRIPTION						:
;	RESET THE VIDEO ENABLE SIGNAL.			:
;	SELECT ALPHANUMERIC MODE, 40 * 25, B & W.	:
;	READ/WRITE DATA PATTERNS TO STG. CHECK STG	:
;	ADDRESSABILITY.					:
;--------------------------------------------------------
	ASSUME	DS:ABS0,ES:ABS0
	CALL	DDS
	TEST	INFO,2
	JNZ	COLOR_PRESENCE_TST
	MOV	AX,03B4H
	CALL	CD_PRESENCE_TST
	CMP	AX,1
	JE	CONT1
	JMP	POD14
CONT1:
	MOV	AH,30H			; MONOCHROME CARD INSTALLED
	JMP	SHORT OVER
COLOR_PRESENCE_TST:
	MOV	AX,03D4H
	CALL	CD_PRESENCE_TST
	CMP	AX,1
	JE	CONT2
	JMP	POD14
CONT2:
	MOV	AH,20H			; COLOR GRAPHICS CARD INSTALLED
OVER:
	PUSH	AX			; RESAVE VALUE
	MOV	BX,0B000H		; BEG VIDEO RAM ADDR B/W CD
	MOV	DX,3B8H			; MODE CONTROL B/W
	MOV	CX,4096			; RAM BYTE CNT FOR B/W CD
	MOV	AL,1			; SET MODE FOR BW CARD
	CMP	AH,30H			; B/W VIDEO CARD ATTACHED?
	JE	E9			; GO TEST VIDEO STG
	MOV	BH,0B8H			; BEG VIDEO RAM ADDR COLOR CD
	MOV	DL,0D8H			; MODE CONTROL COLOR
	MOV	CH,40H			; RAM BYTE CNT FOR COLOR CD
	DEC	AL			; SET MODE TO 0 FOR COLOR CD
E9:					; TEST_VIDEO_STG:
	OUT	DX,AL			; DISABLE VIDEO FOR COLOR CD

	MOV	BP,DS:RESET_FLAG	; POD INITIALIZED BY KBD RESET

	CMP	BP,1234H		; POD INITIATED BY KBD RESET?
	MOV	ES,BX			; POINT ES TO VIDEO RAM STG
	JE	E10			; YES - SKIP VIDEO RAM TEST
	MOV	DS,BX			; POINT DS TO VIDEO RAM STG
	ASSUME	DS:NOTHING,ES:NOTHING
	CALL	STGTST_CNT		; GO TEST VIDEO R/W STG
	JNE	E17			; R/W STG FAILURE - BEEP SPK
;----------------------------------------------------------------
;	SETUP VIDEO DATA ON SCREEN FOR VIDEO LINE TEST.		:
; DESCRIPTION							:
;	ENABLE VIDEO SIGNAL AND SET MODE.			:
;	DISPLAY A HORIZONTAL BAR ON SCREEN.			:
;----------------------------------------------------------------
E10:
	POP	AX			; GET VIDEO SENSE SWS (AH)
	PUSH	AX			; SAVE IT
	MOV	AX,7020H		; WRT BLANKS IN REVERSE VIDEO
	SUB	DI,DI			; SETUP STARTING LOC
	MOV	CX,40			; NO. OF BLANKS TO DISPLAY
	REP	STOSW			; WRITE VIDEO STORAGE
;--------------------------------------------------------
;	CRT INTERFACE LINES TEST			:
; DESCRIPTION						:
;	SENSE ON/OFF TRANSITION OF THE VIDEO ENABLE	:
;	AND HORIZONTAL SYNC LINES.			:
;--------------------------------------------------------
	POP	AX			; GET VIDEO SENSE SW INFO
	PUSH	AX			; SAVE IT
	CMP	AH,30H			; B/W CARD ATTACHED?
	MOV	DX,03BAH		; SETUP ADDR OF B/W STATUS PORT
	JE	E11			; YES - GO TEST LINES
	MOV	DL,0DAH			; COLOR CARD IS ATTACHED
E11:					; LINE_TST:
	MOV	AH,8
E12:					; OFLOOP_CNT
	SUB	CX,CX
E13:
	IN	AL,DX			; READ CRT STATUS PORT
	AND	AL,AH			; CHECK VIDEO/HORZ LINE
	JNZ	E14			; ITS ON - CHECK IF IT GOES OFF
	LOOP	E13			; LOOP TILL ON OR TIMEOUT
	JMP	SHORT E17		; GO PRINT ERROR MSG
E14:
	SUB	CX,CX
E15:
	IN	AL,DX			; READ CRT STATUS PORT
	AND	AL,AH			; CHECK VIDEO/HORZ LINE
	JZ	E16			; ITS ON - CHECK NEXT LINE
	LOOP	E15			; LOOP IF OFF TILL IT GOES ON
E17:					;  CRT_ERR
	MOV	DX,102H
	CALL	ERR_BEEP		; GO BEEP SPEAKER
	JMP	SHORT E18
E16:					; NXT_LINE
	MOV	CL,3			; GET NEXT BIT TO CHECK
	SHR	AH,CL
	JNZ	E12			; GO CHECK HORIZONTAL LINE
E18:					;  DISPLAY_CURSOR:
	POP	AX			; GET VIDEO SENSE SWS (AH)
	JMP	SHORT	POD14

;------------------------------------------------------------------------
;	THIS SUBROUTINE PERFORMS A READ/WRITE STORAGE TEST ON		:
;	A 16K BLOCK OF STORAGE.						:
; ENTRY REQUIREMENTS:							:
;	ES = ADDRESS OF STORAGE SEGMENT BEING TESTED			:
;	DS = ADDRESS OF STORAGE SEGMENT BEING TESTED			:
;	WHEN ENTERING AT STGTST_CNT, CX MUST BE LOADED WITH		:
;	THE BYTE COUNT.							:
; EXIT PARAMETERS:							:
;	ZERO FLAG = 0 IF STORAGE ERROR (DATA COMPARE OR PARITY CHECK.	:
;	       AL = 0 DENOTES A PARITY CHECK. ELSE AL=XOR'ED BIT        :
;		      PATTERN OF THE EXPECTED DATA PATTERN VS THE	:
;		      ACTUAL DATA READ.					:
;	AX,BX,CX,DX,DI, AND SI ARE ALL DESTROYED.			:
;------------------------------------------------------------------------
STGTST	PROC	NEAR
	MOV	CX,4000H		; SETUP CNT TO TEST A 16K BLK
STGTST_CNT:
	CLD				; SET DIR FLAG TO INCREMENT
	MOV	BX,CX			; SAVE CNT (4K FOR VIDEO OR 16K)
	MOV	AX,0AAAAH		; GET DATA PATTERN TO WRITE
	MOV	DX,0FF55H		; SETUP OTHER DATA PATTERNS TO USE
	SUB	DI,DI			; DI = OFFSET 0 RELATIVE TO ES REG
	REP	STOSB			; WRITE STORAGE LOCATIONS
C3:					;  STG01
	DEC	DI			; POINT TO LAST BYTE JUST WRITTEN
	STD				; SET DIR FLAG TO GO BACKWARDS
C4:
	MOV	SI,DI
	MOV	CX,BX			; SETUP BYTE CNT
C5:					; INNER TEST LOOP
	LODSB				; LOAD OLD TEST BYTE [SI]+
	XOR	AL,AH			; DATA READ AS EXPECTED ?
	JNE	C7			;  NO - GO TO ERROR ROUTINE
	MOV	AL,DL			; GET NEXT DATA PATTERN TO WRITE
	STOSB				; WRITE INTO LOCATION JUST READ
	LOOP	C5			;  DECREMENT COUNT AND LOOP CX

	AND	AH,AH			; ENDING 0 PATTERN WRITTEN TO STG?
	JZ	C6X			; YES - RETURN TO CALLER WITH AL=0
	MOV	AH,AL			; SETUP NEW VALUE FOR COMPARE
	XCHG	DH,DL			; MOVE NEXT DATA PATTERN TO DL
	AND	AH,AH			; READING ZERO PATTERN THIS PASS ?
	JNZ	C6			; CONTINUE TEST SEQUENCE TILL 0
	MOV	DL,AH			;  ELSE SET 0 FOR END READ PATTERN
	JMP	C3			;  AND MAKE FINAL BACKWARDS PASS
C6:
	CLD				; SET DIR FLAG TO GO FORWARD
	INC	DI			; SET POINTER TO BEG LOCATION
	JZ	C4			; READ/WRITE FORWARD IN STG
	DEC	DI			; ADJUST POINTER
	JMP	C3			; READ/WRITE BACKWARD IN STG
C6X:
	MOV	AL,000H			; AL=0 DATA COMPARE OK
C7:
	CLD				; SET DIRECTION FLAG BACK TO INC
	RET
STGTST	ENDP

;--------------------------------------------------------
;		EGA CRT ATTACHMENT TEST			:
;							:
; 1. INIT CRT TO 40X25 - BW  ****SET TO MODE****	:
; 2. CHECK FOR VERTICAL AND VIDEO ENABLES, AND CHECK	:
;    TIMING OF SAME					:
; 3. CHECK VERTICAL INTERRUPT				:
; 4. CHECK RED, BLUE, GREEN, AND INTENSIFY DOTS		:
; 5. INIT TO 40X25 - COLOR/MONO ****SET TO MODE****	:
;--------------------------------------------------------

;----- NOMINAL TIME IS B286H FOR 60 HZ.
;----- NOMINAL TIME IS A2FEH FOR 50 HZ.

MAX_VERT_COLOR	EQU	0A0ACH			; MAX TIME FOR VERT/VERT
						;  (NOMINAL + 10%)
MIN_VERT_COLOR	EQU	0C460H			; MIN TIME FOR VERT/VERT
						;  (NOMINAL - 10%)
CENAB_PER_FRAME EQU	200			; NUM OF ENABLES PER FRAME
MAX_VERT_MONO	EQU	08D99H			; MAX TIME FOR VERT/VERT
						;  (NOMINAL + 10%)
MIN_VERT_MONO	EQU	0B862H			; MIN TIME FOR VERT /VERT
						; (NOMINAL - 10%)
EENAB_PER_FRAME EQU	350			; ENHANCED ENABLES PER FRAME
MENAB_PER_FRAME EQU	350			; NUM OF ENABLES PER FRAME

TIM_CTL		EQU	043H			; 8253 TIMER CONTROL PORT
TIMER0		EQU	040H			; 8253 TIMER/CNTER 0 PORT

POD14	PROC	NEAR
	SUB	SP,0AH				; RESERVE 5 WORDS ON STACK
	MOV	BP,SP				; INIT SCRATCH PAD POINTER

	ASSUME	DS:ABS0,ES:ABS0
	CALL	DDS
	MOV	AL,00110000B			; SET TIMER 0 TO MODE 0

	OUT	TIM_CTL,AL
	MOV	AL,00H
	OUT	TIMER0,AL			; SEND FIRST BYTE TO TIMER
	TEST	INFO,2
	JZ	COLOR_EGA_V
	CALL	ENV_3				; SET UP IN MONOCHROME
	MOV	WORD PTR[BP][2],MENAB_PER_FRAME ; NUM. OF FRAMES FOR MONO
	MOV	WORD PTR[BP][4],MAX_VERT_MONO	; MAX TIME FOR VERT/VERT
	MOV	WORD PTR[BP][6],MIN_VERT_MONO	; MIN TIME FOR VERT/VERT
	MOV	DL,CRTC_ADDR_B			; MONO CRTC REG
	MOV	AH,C_HRZ_DSP			; HORIZ. TOTAL DIPLAY
	MOV	AL,27H				;  TO 40 COL
	CALL	OUT_DX
	MOV	DL,INPUT_STATUS_B		; 3BA
	JMP	SHORT	COMMON
COLOR_EGA_V:
	CALL	ENV_X				; SET UP IN 40X25 COLOR
	CALL	BRST_DET			; ENHANCED MODE
	JNC	COLOR_V				; NO,40X25
	MOV	DL,CRTC_ADDR			; BRST MODE ONLY!
	MOV	AH,1				; HRZ DSP END
	MOV	AL,20				; MODIFY FOR TEST ONLY
	CALL	OUT_DX
	MOV	WORD PTR[BP][2],EENAB_PER_FRAME ; NUM. OF FRAMES FOR COLOR
	JMP	BRST_COLOR_V
COLOR_V:

	MOV	WORD PTR[BP][2],CENAB_PER_FRAME ; NUM. OF FRAMES FOR COLOR
BRST_COLOR_V:
	MOV	WORD PTR[BP][4],MAX_VERT_COLOR	; MAX TIME FOR VERT/VERT
	MOV	WORD PTR[BP][6],MIN_VERT_COLOR	; MIN TIME FOR VERT /VERT
	MOV	DL,INPUT_STATUS			; SET ADDRESSING TO VIDEO
						;  ATTR STATUS
COMMON:
	MOV	AX,0500H			; SET TO VIDEO PAGE 0
	INT	10H
	SUB	CX,CX

;----- LOOK FOR VERTICAL

POD14_1:
	IN	AL,DX				; GET STATUS
	TEST	AL,00001000B			; VERTICAL THERE YET?
	JNE	POD14_2				; CONTINUE IF IT IS
	LOOP	POD14_1				; KEEP LOOKING TILL COUNT
	MOV	BL,00				;  EXHAUSTED
	JMP	POD14_ERR			; NO VERTICAL

;----- GOT VERTICAL - START TIMER

POD14_2:
	MOV	AL,0
	OUT	TIMER0,AL			; SEND 2ND BYTE TO TIMER TO
						; START IT
	SUB	BX,BX				; INIT. ENABLE COUNTER
;----- WAIT FOR VERTICAL TO GO AWAY
	XOR	CX,CX
POD14_25:
	IN	AL,DX				; GET STATUS
	TEST	AL,00001000B			; VERTICAL STILL THERE
	JZ	POD14_3				; CONTINUE IF IT'S GONE
	LOOP	POD14_25			; KEEP LOOKING TILL COUNT
	MOV	BL,01H				;  EXHAUSTED
	JMP	POD14_ERR			; VERTICAL STUCK ON

;----- NOW START LOOKING FOR ENABLE TRANSITIONS

POD14_3:
	SUB	CX,CX
POD14_4:
	IN	AL,DX				; GET STATUS
	TEST	AL,00000001B			; ENABLE ON YET?
	JE	POD14_5				; GO ON IF IT IS
	TEST	AL,00001000B			; VERTICAL ON AGAIN?
	JNE	POD14_75			; CONTINUE IF IT IS
	LOOP	POD14_4				; KEEP LOOKING IF NOT
	MOV	BL,02H
	JMP	POD14_ERR			; ENABLE STUCK OFF
POD14_4A:
	MOV	BL,03H
	JMP	POD14_ERR			; VERTICAL STUCK ON
POD14_4B:
	MOV	BL,04H
	JMP	POD14_ERR			; ENABLE STUCK ON

;----- MAKE SURE VERTICAL WENT OFF WITH ENABLE GOING ON

POD14_5:
	TEST	AL,00001000B			; VERTICAL OFF?
	JNZ	POD14_4A			; GO ON IF IT IS
;----- NOW WAIT FOR ENABLE TO GO OFF		;  (ERROR IF NOT)
POD14_6:
	IN	AL,DX				; GET STATUS
	TEST	AL,00000001B			; ENABLE OFF YET?
	LOOPE	POD14_6				; KEEP LOOKING IF NOT
	JCXZ	POD14_4B			;  YET LOW
;----- ENABLE HAS TOGGLED, BUMP COUNTER AND TEST FOR NEXT VERTICAL
POD14_7:
	INC	BX				; BUMP ENABLE COUNTER
	JZ POD14_75				; IF COUNTER WRAPS,
						;  SOMETHING IS WRONG
	TEST	AL,00001000B			; DID ENABLE GO LOW
						;  BECAUSE OF VERTICAL
	JZ	POD14_3				; IF NOT, LOOK FOR ANOTHER
						;  ENABLE TOGGLE
;----- HAVE HAD COMPLETE VERTICAL-VERTICAL CYCLE, NOW TEST RESULTS
POD14_75:
	MOV	AL,00				; LATCH TIMER0
	OUT	TIM_CTL,AL
	CMP	BX,WORD PTR[BP][2]		; NUMBER OF ENABLES BETWEEN
						;  VERTICALS O.K.?
	JE	POD14_8
	MOV	BL,05H
	JMP	SHORT POD14_ERR
POD14_8:
	IN	AL,TIMER0			; GET TIMER VALUE LOW
	MOV	AH,AL				; SAVE IT
	NOP
	IN	AL,TIMER0			; GET TIMER HIGH
	XCHG	AH,AL
	NOP
	NOP
	CMP	AX,WORD PTR[BP][4]		; MAXIMUM VERTICAL TIMING
	JGE	POD14_9
	MOV	BL,06H
	JMP	SHORT POD14_ERR
POD14_9:
	CMP	AX,WORD PTR[BP][6]		; MINIMUM VERTICAL TIMING
	JLE	POD14_10
	MOV	BL,07H
	JMP	SHORT POD14_ERR

;----- SEE IF RED, GREEN, BLUE AND INTENSIFY DOTS WORK

;----- FIRST, SET A LINE OF REVERSE VIDEO, INTENSIFIED BLANKS INTO BUFFER
POD14_10:
	MOV	AX,09DBH			; WRITE CHARS, BLANKS
	MOV	BX,000FH			; PAGE 0, REVERSE VIDEO,
						;  HIGH INTENSITY
	MOV	CX,80				; 80 CHARACTERS
	INT	10H
	IN	AL,DX
	PUSH	DX				; SAVE INPUT STATUS
	MOV	DL,ATTR_WRITE			; ATTRIBUTE ADDRESSS
	MOV	AH,0FH				; PALETTE REG 'F'
	MOV	AL,03FH				; TEST VALUE
	CALL	OUT_DX				; VIDEO STATUS MUX
	MOV	AX,0FH				; START WITH BLUE DOTS
	POP	DX
POD14_13:
	PUSH	AX				; SAVE
	PUSH	DX				; SAVE INPUT STATUS
	MOV	DL,ATTR_WRITE			; ATTRIBUTE ADDRESSS
	MOV	AH,32H				; COLOR PLANE ENABLE
	CALL	OUT_DX				; VIDEO STATUS MUX
	POP	DX				; RECOVER INPUT STATUS
	POP	AX
	SUB	CX,CX
;----- SEE IF DOT COMES ON
POD14_14:
	IN	AL,DX				; GET STATUS
	TEST	AL,00110000B			; DOT THERE?
	JNZ	POD14_15			; LOOK FOR DOT TO TURN OFF
	LOOP	POD14_14			; CONTINUE TEST FOR DOT ON
	MOV	BL,10H
	OR	BL,AH				; OR IN DOT BEING TESTED
	JMP	POD14_ERR			; DOT NOT COMING ON
;----- SEE IF DOT GOES OFF
POD14_15:
	SUB	CX,CX
POD14_16:
	IN	AL,DX				; GET STATUS
	TEST	AL,00110000B			; IS DOT STILL ON?
	JE	POD14_17			; GO ON IF DOT OFF
	LOOP	POD14_16			; ELSE, KEEP WAITING FOR
						;  DOT TO GO OFF
	MOV	BL,20H
	OR	BL,AH				; OR IN DOT BEING TESTED
	JMP	SHORT POD14_ERR

;----- ADJUST TO POINT TO NEXT DOT

POD14_17:
	INC	AH
	CMP	AH,030H				; ALL 3 DOTS DONE?
	JE	POD14_18			; GO END
	OR	AH,0FH				; MAKE 0F,1F,2F
	MOV	AL,AH
	JMP	POD14_13			; GO LOOK FOR ANOTHER DOT
POD14_ERR:
	MOV	CX,6
	MOV	DX,0103H			; ONE LONG AND THREE SHORT
	CALL	ERR_BEEP
	ADD	SP,0AH				; BALANCE STACK
	MOV	AL,00110110B			; RE-INIT TIMER 0
	OUT	TIM_CTL,AL
	SUB	AL,AL
	OUT	TIMER0,AL
	NOP
	NOP
	OUT	TIMER0,AL
	MOV	BP,1
	JMP	SKIP
	ASSUME	DS:ABS0
POD14_18:
	CALL	DDS
	MOV	AX,0500H			; SET TO VIDEO PAGE 0
	INT	10H
	MOV	AL,00110110B			; RE-INIT TIMER 0
	OUT	TIM_CTL,AL
	SUB	AL,AL
	OUT	TIMER0,AL
	NOP
	NOP
	OUT	TIMER0,AL
	ADD	SP,0AH				; REMOVE SCRATCH PAD
	MOV	BP,0				; MAKE BP NON ZERO
POD14	ENDP

;----- TEST STORAGE

MEM_TEST:
	PUSH	DS
	CALL	DDS
	ASSUME	DS:ABS0
	TEST	INFO,2
	JZ	D_COLOR_M
	OR	EQUIP_LOW,030H
	MOV	AX,0FH
	OR	INFO,060H
	MOV	AX,0FH
	JMP	SHORT D_OUT_M
D_COLOR_M:
	AND	EQUIP_LOW,0CFH
	OR	EQUIP_LOW,020H
	MOV	AX,0EH				; INTERNAL COLOR MODE
D_OUT_M:					; TEST IN COLOR
	INT	10H
	SUB	SP,6				; RESERVE 3 WORDS ON STACK
	MOV	BP,SP				; SET BP
	MOV	AX,0A000H			; PUT BUFFER ADDRESS IN AX
	ASSUME	DS:NOTHING,ES:NOTHING
	MOV	DS,AX				; SET UP SEG REGS TO POINT
	MOV	ES,AX				; TO BUFFER AREA
	MOV	WORD PTR[BP][2],0		; INITIALIZE
	MOV	WORD PTR[BP][4],0		; INITIALIZE
	MOV	DH,3
	MOV	DL,SEQ_ADDR
	MOV	AX,0201H
	CALL	OUT_DX
	MOV	DL,GRAPH_ADDR			; ADDRESS READ MAP SELECT
	MOV	AX,0400H
	CALL	OUT_DX
	PUSH	DX
	MOV	DL,ATTR_READ			; SET UP ATTRIBUTE
	IN	AL,DX
	MOV	DL,ATTR_WRITE			; ATTRIBUTE WRITE ADDRESS
	MOV	AX,3200H
	CALL	OUT_DX
	CALL	HOW_BIG				; GO FIND AMOUNT OF MEMORY
	CMP	AH,0
	JZ	AA1
	JMP	EGA_MEM_ERROR
AA1:
	CALL	MEMORY_OK			; GO TEST IT
	CMP	AH,0
	JZ	AA2
	JMP	EGA_MEM_ERROR
AA2:
	POP	DX
	MOV	DL,SEQ_ADDR
	MOV	AX,0202H
	CALL	OUT_DX
	MOV	DL,GRAPH_ADDR			; ADDRESS OF READ MAP
	MOV	AX,0401H
	CALL	OUT_DX
	PUSH	DX
	MOV	DL,ATTR_READ			; SET UP ATTRIBUTE
	IN	AL,DX
	MOV	DL,ATTR_WRITE			; ATTRIBUTE WRITE ADDRESS
	MOV	AX,3200H
	CALL	OUT_DX
	MOV	WORD PTR [BP][4],0		; INITIALIZE
	CALL	HOW_BIG				; GO FIND AMOUNT OF MEMORY
	CMP	AH,0
	JZ	AA3
	JMP	EGA_MEM_ERROR
AA3:
	CALL	MEMORY_OK			; GO TEST IT
	CMP	AH,0
	JZ	AA4
	JMP	EGA_MEM_ERROR
AA4:
	POP	DX
	MOV	DL,SEQ_ADDR
	MOV	AX,0204H
	CALL	OUT_DX
	PUSH	DX
	MOV	DL,GRAPH_ADDR			; ADDRESS OF READ MAP
	MOV	AX,0402H
	CALL	OUT_DX
	MOV	DL,ATTR_READ			; SET UP ATTRIBUTE
	IN	AL,DX
	MOV	DL,ATTR_WRITE			; ATTRIBUTE WRITE ADDRESS
	MOV	AX,3200H
	CALL	OUT_DX
	MOV	WORD PTR[BP][4],0		; INITIALIZE
	CALL	HOW_BIG				; GO FIND AMOUNT OF MEMORY
	CMP	AH,0
	JZ	AA5
	JMP	EGA_MEM_ERROR
AA5:
	CALL	MEMORY_OK			; GO TEST IT
	CMP	AH,0
	JZ	AA6
	JMP	EGA_MEM_ERROR
AA6:
	POP	DX
	MOV	DL,SEQ_ADDR
	MOV	AX,0208H
	CALL	OUT_DX
	MOV	DL,GRAPH_ADDR			; ADDRESS OF READ MAP
	MOV	AX,0403H
	CALL	OUT_DX
	PUSH	DX
	MOV	DL,ATTR_READ			; SET UP ATTRIBUTE
	IN	AL,DX
	MOV	DL,ATTR_WRITE			; ATTRIBUTE WRITE ADDRESS
	MOV	AX,3200H
	CALL	OUT_DX
	MOV	WORD PTR[BP][4],0		; INITIALIZE
	CALL	HOW_BIG				; GO FIND AMOUNT OF MEMORY
	CMP	AH,0
	JNZ	EGA_MEM_ERROR
	CALL	MEMORY_OK			; GO TEST IT
	CMP	AH,0
	JNZ	EGA_MEM_ERROR
	PUSH	BP				; SAVE SCRATCH PAD POINTER
	MOV	BP,0				; RESET BP FOR XT
EGA_MEM_EXIT:
	POP	SI				; RESTORE
	POP	DX
	CALL	DDS				; SET DATA SEGMENT
	ASSUME	DS:ABS0
	MOV	BX,WORD PTR SS:[SI][2]		; GET EGA MEMORY SIZE
	MOV	CL,06H				; DIVIDE BY 64 TO GET
	SHR	BX,CL				;  NUMBER OF 64KB BLOCKS
	DEC	BX
	MOV	CL,05H
	SHL	BX,CL
	AND	BL,01100000B			; ISOLATE BITS 5 AND 6

	AND	INFO,10011111B

	OR	INFO,BL

	OR	INFO,00000100B			; 04H  SET 3XX ACTIVE
	MOV	BL,INFO_3
	CALL	MK_ENV
	ADD	SP,6				; RESTORE STACK
	POP	DS
	JMP	SKIP				; GO TO END
EGA_MEM_ERROR:
	MOV	DX,0103H			; ONE LONG AND THREE SHORT
	CALL	ERR_BEEP
	PUSH	BP				; SAVE SCRATCH PAD POINTER
	MOV	BP,1				; INDICATE ERROR FOR XT
	JMP	EGA_MEM_EXIT

;----- THIS ROUTINE FINDS AMOUNT OF MEMORY GOOD

MEMORY_OK	PROC	NEAR
	MOV	BX,0A000H			; SET PTR. TO BUFFER SEG
	MOV	DS,BX				; SET SEG. REG.
	MOV	ES,BX
	MOV	AX,WORD PTR[BP][4]		; SET COUNT FOR 32K WORDS
	MOV	CH,AL				; SET AMOUNT OF BUFFER
	SUB	CL,CL				; TO BE TESTED
	SHL	CX,1				; MULTIPLY BY TWO
	CALL	PODSTG
	CMP	AH,0				; TEST FOR ERROR
	JNZ	MEMORY_OK_ERR			; IF ERROR GO PRINT IT
MEMORY_OK_EX:
	MOV	AX,WORD PTR[BP][4]		; AMOUNT OF MEMORY FOUND
	ADD	WORD PTR[BP][2],AX		; AMOUNT OF MEMORY GOOD
	MOV	AX,0
MEMORY_OK_ERR:
	RET
MEMORY_OK	ENDP

;----------------------------------------------------------------
; THIS ROUTINE PERFORMS A READ/WRITE TEST ON A BLOCK OF STORAGE :
; (MAX SIZE = 32KW).  IF "WARM START", FILL BLOCK WITH 0000 AND :
; RETURN.							:
; ON ENTRY:							:
;   ES = ADDRESS OF STORAGE TO BE TESTED			:
;   DS = ADDRESS OF STORAGE TO BE TESTED			:
;   CX = WORD COUNT OF STORAGE BLOCK TO BE TESTED		:
;	(MAX. = 8000H (32K WORDS))				:
; ON EXIT:							:
;   ZERO FLAG = OFF IF STORAGE ERROR				:
; AX,BX,CX,DX,DI,SI ARE ALL DESTROYED.				:
;----------------------------------------------------------------
PODSTG	PROC	NEAR
	PUSH	BP
	CLD					; SET DIR TO INCREMENT
	SUB	DI,DI				; SET DI=0000 REL TO START
						;  OF SEGMENT
	SUB	AX,AX				; INITIAL DATA PATTERN FOR
						;  00-FF TEST
	CALL	DDS
	ASSUME	DS:ABS0
	MOV	BX,DS:RESET_FLAG		; WARM START?
	CMP	BX,1234H
	MOV	DX,ES
	MOV	DS,DX				; RESTORE DS
	JE	PODSTG_5			; GO DO FILL WITH 0000
						;  IF WARM START
	CMP	BX,4321H			; DCP WARM START?
	JE	PODSTG_5			; DO FILL IF SO
PODSTG_1:
	MOV	[DI],AL				; WRITE TEST DATA
	MOV	AL,[DI]				; GET IT BACK
	XOR	AL,AH				; COMPARE TO EXPECTED
	JNZ	PODSTG_ERRO			; ERROR EXIT IF MISCOMPARE
	INC	AH				; FORM NEW DATA PATTERN
	MOV	AL,AH
	JNZ	PODSTG_1			; LOOP TILL ALL 256 DATA
						;  PATTERNS DONE
	MOV	BP,CX				; SAVE WORD COUNT
	MOV	AX,0AA55H			; LOAD DATA PATTERN
	MOV	BX,AX
	MOV	DX,055AAH			; LOAD OTHER DATA PATTERN
	REP	STOSW				; FILL WORDS FROM LOW TO
						;  HIGH WITH AAAA
	DEC	DI				; POINT TO LAST WORD
	DEC	DI				;  WRITTEN
	STD					; SET DIR FLAG TO GO DOWN
	MOV	SI,DI				; SET INDEX REGS. EQUAL
	MOV	CX,BP				; RECOVER WORD COUNT
PODSTG_2:					; GO FROM HIGH TO LOW
	LODSW					; GET WORD FROM MEMORY
	XOR	AX,BX				; EQUAL WHAT S/B THERE?
	JNZ	PODSTG_ERRO			; GO ERROR EX IT IF NOT
	MOV	AX,DX				; GET 55 DATA PATTERN AND
	STOSW					;  STORE IN LOC JUST READ
	LOOP	PODSTG_2			; LOOP TILL ALL BYTES DONE
	MOV	CX,BP				; RECOVER WORD COUNT
	CLD					; BACK TO INCREMENT
	INC	SI				; ADJUST PTRS
	INC	SI
	MOV	DI,SI
PODSTG_3:					; LOW TO HIGH DOING WORDS
	LODSW					; GET A WORD
	XOR	AX,DX				; SHOULD COMPARE TO DX
	JNZ	PODSTG_ERRO			; GO ERROR IF NOT
	STOSW					; WRITE 0000 BACK TO LOC
						;  JUST READ
	LOOP	PODSTG_3			; LOOP TILL DONE

	STD					; BACK TO DECREMENT
	DEC	SI				; ADJUST POINTER DOWN TO
						;  LAST WORD WRITTEN
	DEC	SI
	MOV	CX,BP				; GET WORD COUNT
PODSTG_4:
	LODSW					; GET WORD
	OR	AX,AX				; = TO 0000
	JNZ	PODSTG_ERRO			; ERROR IF NOT
	LOOP	PODSTG_4			; LOOP TILL DONE
	JMP	SHORT PODSTG_ERR2
PODSTG_ERRO:
	MOV	CX,AX				; SAVE BITS IN ERROR
	XOR	AH,AH
	OR	CH,CH				; HIGH BYTE ERROR?
	JZ	PODSTG_ERR1
	MOV	AH,1				; SET HIGH BYTE ERROR
PODSTG_ERR1:
	OR	CL,CL				; LOW BYTE ERROR?
	JZ	PODSTG_ERR2
	ADD	AH,2
PODSTG_ERR2:
	POP	BP
	CLD					; SET DIR FLAG BACK TO INC
	RET					; RETURN TO CALLER
PODSTG_5:					; SIMPLE FILL WITH 0000 ON
						;  WARM-START
	PUSH	AX				; SAVE
	PUSH	DX				; SAVE VALUE
	MOV	DH,3
	MOV	DL,SEQ_ADDR			; SEQ_ADDR  REGISTER
	MOV	AX,020FH
	CALL	OUT_DX				; DO IT
	POP	DX				; RESTORE
	POP	AX				; RESTORE
	REP	STOSW
	CALL	DDS
	ASSUME	DS:ABS0
	MOV	DS:RESET_FLAG,BX
	MOV	DS,DX				; RESTORE DS
	JMP	PODSTG_ERR2			; AND EXIT
PODSTG	ENDP

;----- DETERMINE SIZE OF BUFFER

HOW_BIG		PROC NEAR
	MOV	DX,DS				; SET PNTR TO BUFFER LOC
	SUB	BX,BX				; BASIC COUNT OF 00K
FILL_LOOP:
	MOV	ES,DX				; SET SEG. REG
	SUB	DI ,DI
	MOV	AX,0AA55H			; TEST PATTERN
	MOV	CX,AX
	MOV	ES:[DI],AX			; SEND TO MEMORY
	MOV	AL,0FH				; PUT SOMETHING IN AL
	MOV	AX,ES:[DI]			; GET PATTERN FROM MEMORY
	XOR	AX,CX				; COMPARE PATTERNS
	JNZ	HOW_BIG_END			; GO END IF NO COMPARE
	MOV	CX,2000H			; SET COUNT FOR 8K WORDS
	REP	STOSW				; FILL 8K WORDS
	ADD	DX,0400H			; POINT TO NEXT 16K BLOCK
	ADD	BX,16				; BUMP COUNT BY 16KB
	CMP	DH,0B0H
	JNZ	FILL_LOOP			; AREA YET ?(B0000H)
	JMP	HOW_BIG_END
HOW_BIG_END:
	CMP	DH,0A0H				; 1ST 16KB OK
	JZ	HB_ERROR_EXIT
RESUME:
	ADD	WORD PTR[BP][4],BX		; SAVE BUFFER FOUND
	MOV	AX,0
HB_ERROR_EXIT:
	RET
HOW_BIG ENDP

;---------------------------------------
;SUBROUTINES FOR POWER ON DIAGNOSTICS  :
;-----------------------------------------------------------------
;THIS PROCEDURE WILL ISSUE ONE LONG TONE (3 SEC) AND ONE OR	 :
;MORE SHORT TONES (1 SEC) TO INDICATE A FAILURE ON THE PLANAR	 :
;BOARD ,A BAD RAM MODULE,OR A PROBLEM WITH THE CRT.		 :
;ENTRY REQUIREMENTS:						 :
;	DH=NUMBER OF LONG TONES TO BEEP				 :
;	DL=NUMBER OF SHORT TONES TO BEEP.			 :
;-----------------------------------------------------------------
ERR_BEEP   PROC	   NEAR
	PUSHF					; SAVE FLAGS
	CLI					; DISABLE SYSTEM INTS
	PUSH	DS
	CALL	DDS
	ASSUME	DS:ABS0
	OR	DH,DH				; ANY LONG TONES TO BEEP
	JZ	G3				; NO, DO THE SHORT ONES
G1:						; LONG BEEP
	MOV	BL,6				; COUNTER FOR BEEPS
	CALL	BEEP				; DO THE BEEP
G2:
	LOOP	G2				; DELAY BETWEEN BEEPS
	DEC	DH				; ANY MORE TO DO
	JNZ	G1				; DO IT
G3:
	MOV	BL,1				; COUNTER FOR A SHORT BEEP
	CALL	BEEP				; DO IT
G4:
	LOOP	G4				; DELAY BETWEEN BEEPS
	DEC	DL				; DONE WITH SHORT BEEPS
	JNZ	G3				; DO MORE
G5:
	LOOP G5					; DELAY BEFORE RETURN
G6:
	LOOP G6
	POP	DS				; RESTORE CONTENTS OF DS
	POPF					; RESTORE FLAGS
	RET
ERR_BEEP	ENDP

	SUBTTL