$OPTIMIZE(2) LARGE DEBUG NOINTVECTOR NOOVERFLOW TYPE MOD186 $NOCODE NOXREF NOSYMBOLS PAGEWIDTH(80) /*============================================================*/ $TITLE ('DVID.PLM DWG:636-635 REV: -') /*-------------------------------------------------------------- NAME: Professional Digital Camera Video Board Firmware REVISIONS: --REV-- --DATE-- --AUTHOR-- --DESCRIPTION-- - 3/11/91 JEM PRODUCTION BASELINE ==============================================================*/ DVID: DO; $INCLUDE (DLIT.INC) $INCLUDE (DMAS.INC) $INCLUDE (DSYS.INC) $INCLUDE (DPNL.INC) $INCLUDE (DVIDA.INC) $INCLUDE (DVIDB.INC) /* Literals */ DCL SN LIT 'SIGNED'; DCL UN LIT 'UNSIGN'; DCL BOARD_ID LIT '17'; DCL XFR_DONE LIT '((INT_REQ AND 00100000B) > 0)'; /* Variables */ DCL MY_SLOT BYTE; DCL VT BYTE; DCL SAMPLE BYTE; DCL TXT_ROW WORD; DCL TXT_COL WORD; DCL TXT_TOP_LINE WORD; DCL TXT_H_ORG WORD; DCL TXT_V_ORG WORD; DCL TXT_V_ADR0 WORD; DCL TXT_V_ADR1 WORD; DCL RASTER_ON BYTE; DCL CURSOR_ON BYTE; DCL IMAGE_ON BYTE; DCL GRAPH_ON BYTE; DCL VID_ENABLE BYTE; DCL BROW_BFR (14) STRUCTURE (CHAR (40) WORD); DCL ROW_BFR (14) STRUCTURE (CHAR (80) BYTE) AT (@BROW_BFR); DCL GRAPH_BFR_A (80) BYTE; DCL GRAPH_BFR_B (80) BYTE; DCL GRAPH_BFR_C (80) BYTE; DCL GRAPH_BFR_D (80) BYTE; DCL CUR_PIX_VAL BYTE; DCL CUR_H_POS INTEGER; DCL CUR_V_POS INTEGER; DCL IMG_BEG_ADR DWORD; DCL IMG_END_ADR DWORD; DCL IMG_H_SIZE INTEGER; DCL IMG_V_SIZE INTEGER; DCL H_SIZE INTEGER; DCL V_SIZE INTEGER; DCL VID_H_POS INTEGER; DCL VID_V_POS INTEGER; DCL VID_H_ADR INTEGER; DCL VID_V_ADR0 INTEGER; DCL VID_V_ADR1 INTEGER; DCL MEM_H_POS INTEGER; DCL MEM_V_POS INTEGER; /* Register definitions */ DCL ID_BUS_REG LIT 'REG(1)'; DCL FUNCTION_REG LIT 'REG(2)'; DCL GRAPH_REG LIT 'REG(3)'; DCL IMAGE_PLANE_ON LIT 'REG(4)'; DCL GRAPH_PLANE_ON LIT 'REG(5)'; DCL CURSOR_PLANE_ON LIT 'REG(6)'; DCL FIELD_REG LIT 'REG(7)'; DCL IMAGE_H_ADR_REG INTEGER AT(@REG(8)); DCL IMAGE_V_ADR_REG INTEGER AT(@REG(10)); DCL GRAPH_H_ADR_REG WORD AT(@REG(12)); DCL GRAPH_V_ADR_REG WORD AT(@REG(14)); /* ID Control Codes */ DCL ID_OFF LIT '0000B'; DCL ID_SND LIT '1100B'; DCL ID_RCV LIT '0100B'; /* Function Codes */ DCL CLEAR LIT '0000B'; DCL IDLE LIT '0001B'; DCL BLANK LIT '0010B'; DCL UNBLANK LIT '0011B'; DCL IWRITE LIT '0100B'; DCL IWRITE2 LIT '0101B'; DCL TWRITE LIT '0110B'; DCL GWRITE LIT '0111B'; /* Graphics Codes */ DCL DACOFF LIT '1000B'; DCL SYNCONLY LIT '1001B'; DCL P_VIDEO LIT '1010B'; DCL N_VIDEO LIT '1011B'; DCL G_TWRITE LIT '1110B'; DCL G_GWRITE LIT '1111B'; /*------------------------------------------------------------*/ VIDEO_TASK: PROCEDURE PUBLIC; CUR_SLOT,MY_SLOT = FIND_BOARD (BOARD_ID); SLOT = CUR_SLOT; IF MY_SLOT = 255 THEN CALL WAIT (NEVER); CALL INITIALIZE; X = WAIT_FLAG (FLAG_RUN,TRUE,NEVER); DO FOREVER; IF C.EXPOSURE_FEEDBACK AND RASTER_ON THEN DO; CALL SLEEP (200000); CALL VIDEO_ENABLE_CURSOR; CALL SLEEP (200000); CALL VIDEO_DISABLE_CURSOR; END; ELSE CALL SLEEP (1000000); END; END; /*------------------------------------------------------------*/ INITIALIZE: PROCEDURE; VT = ASSIGN_TIMER; FUNCTION_REG = CLEAR; FUNCTION_REG = IDLE; ID_BUS_REG = ID_OFF; RASTER_ON = FALSE; IMAGE_ON,CURSOR_ON,GRAPH_ON = FALSE; VID_ENABLE = FALSE; SAMPLE = 1; IMG_BEG_ADR = 0; IMG_END_ADR = 327679; IMG_H_SIZE = 640; IMG_V_SIZE = 512; H_SIZE = 640; V_SIZE = 512; VID_H_POS = 0; VID_V_POS = 14; MEM_H_POS = -192; MEM_V_POS = 14; TXT_H_ORG,TXT_V_ORG = 0; TXT_TOP_LINE = 0; VID_V_ADR0 = 0; VID_V_ADR1 = 1; VID_H_ADR = 0; END; /*------------------------------------------------------------*/ VIDEO_DISPLAY_ON: PROCEDURE PUBLIC REENTRANT; DCL OLD_SLOT BYTE; IF RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; FUNCTION_REG = CLEAR; FUNCTION_REG = BLANK; GRAPH_REG = P_VIDEO; GRAPH_REG = 0; VID_ENABLE = FALSE; IMAGE_ON,CURSOR_ON,GRAPH_ON = FALSE; IF MY_SLOT <= 15 THEN RASTER_ON = TRUE; FIELD_REG = 0; CALL TIMER (VT,20000); DO WHILE ((FIELD_REG AND 010B) = 000B) AND RASTER_ON; IF TIMEOUT (VT) THEN RASTER_ON = FALSE; END; DO WHILE ((FIELD_REG AND 010B) = 010B) AND RASTER_ON; IF TIMEOUT (VT) THEN RASTER_ON = FALSE; END; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ VIDEO_DISPLAY_OFF: PROCEDURE PUBLIC REENTRANT; DCL OLD_SLOT BYTE; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; FUNCTION_REG = CLEAR; RASTER_ON = FALSE; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ VIDEO_ENABLE: PROCEDURE PUBLIC REENTRANT; VID_ENABLE = TRUE; CALL CONTROL_DISPLAY; END; /*------------------------------------------------------------*/ VIDEO_DISABLE: PROCEDURE PUBLIC REENTRANT; VID_ENABLE = FALSE; CALL CONTROL_DISPLAY; END; /*------------------------------------------------------------*/ VIDEO_ENABLE_IMAGE: PROCEDURE PUBLIC REENTRANT; IMAGE_ON = TRUE; CALL CONTROL_DISPLAY; END; /*------------------------------------------------------------*/ VIDEO_ENABLE_TEXT: PROCEDURE PUBLIC REENTRANT; GRAPH_ON = TRUE; CALL CONTROL_DISPLAY; END; /*------------------------------------------------------------*/ VIDEO_DISABLE_TEXT: PROCEDURE PUBLIC REENTRANT; GRAPH_ON = FALSE; CALL CONTROL_DISPLAY; END; /*------------------------------------------------------------*/ VIDEO_ENABLE_CURSOR: PROCEDURE; IF NOT RASTER_ON THEN RETURN; CURSOR_ON = TRUE; GRAPH_REG = VID_ENABLE AND ((IMAGE_ON AND 0001B) OR (GRAPH_ON AND 0010B) OR (CURSOR_ON AND 0100B)); END; /*------------------------------------------------------------*/ VIDEO_DISABLE_CURSOR: PROCEDURE; IF NOT RASTER_ON THEN RETURN; CURSOR_ON = FALSE; GRAPH_REG = VID_ENABLE AND ((IMAGE_ON AND 0001B) OR (GRAPH_ON AND 0010B) OR (CURSOR_ON AND 0100B)); END; /*------------------------------------------------------------*/ VIDEO_THUMBNAIL: PROCEDURE (ADR) PUBLIC REENTRANT; DCL ADR DWORD, LINE WORD, L BYTE, COUNT BYTE, OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; ADR = ADR + (4 * 160); VID_V_ADR0 = 0; VID_V_ADR1 = 1; VID_H_ADR = 0; /* Setup for image data transfer */ ID_BUS_REG = ID_RCV; CALL SET_XFER_COUNT (640); DO WHILE (FIELD_REG AND 010B) = 010B; END; DO WHILE (FIELD_REG AND 010B) = 000B; END; DO LINE = 0 TO 483 BY 4; DO L = 0 TO 3; IMAGE_H_ADR_REG = 0; IMAGE_V_ADR_REG = SN(LINE + L); FUNCTION_REG = IWRITE; CALL ENABLE_MEMORY_READ_EXPAND (ADR); CALL RELOAD_XFER_COUNT; /* Transfer starts */ DO COUNT = 0 TO 100; IF XFR_DONE THEN COUNT = 200; END; END; ADR = ADR + 160; END; CALL DISABLE_MEMORY; CALL DISABLE_XFER; ID_BUS_REG = ID_OFF; CALL RESTART_DISPLAY; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ VIDEO_IMAGE: PROCEDURE (ADR,HSZ,VSZ,H,V,S) PUBLIC REENTRANT; DCL ADR DWORD, HSZ WORD, VSZ WORD, H WORD, V WORD, S BYTE; SAMPLE = S; IF NOT C.EXPOSURE_FEEDBACK THEN ADR = ADR + 1; IMG_BEG_ADR = ADR; IMG_END_ADR = ADR - 1 + (DOUBLE (HSZ) * VSZ); IMG_H_SIZE = SN(HSZ); IMG_V_SIZE = SN(VSZ); H_SIZE = SN(HSZ / S); V_SIZE = SN(VSZ / S); CUR_H_POS = SN(H / S); CUR_V_POS = SN(V / S); VID_H_POS = SN((H / S) - 320); VID_V_POS = SN((V / S) - 242); IF VID_V_POS >= 0 THEN VID_V_ADR0 = VID_V_POS MOD 484; ELSE VID_V_ADR0 = 484 + (VID_V_POS MOD 484); VID_V_ADR1 = (VID_V_ADR0 + 1) MOD 484; VID_H_ADR = VID_H_POS; MEM_H_POS = VID_H_POS - 192; MEM_V_POS = VID_V_POS; CALL LOAD_IMAGE_TILE (MEM_H_POS,MEM_V_POS,1024,484); END; /*------------------------------------------------------------*/ VIDEO_POSITION: PROCEDURE (H,V) PUBLIC REENTRANT; DCL H WORD, V WORD; IF H > 32767 THEN H = 0; ELSE IF H >= UN(IMG_H_SIZE) THEN H = UN(IMG_H_SIZE - 1); IF V > 32767 THEN V = 0; ELSE IF V >= UN(IMG_V_SIZE) THEN V = UN(IMG_V_SIZE - 1); CUR_H_POS = SN(H / SAMPLE); CUR_V_POS = SN(V / SAMPLE); VID_H_POS = SN((H / SAMPLE) - 320); VID_V_POS = SN((V / SAMPLE) - 242); IF VID_V_POS >= 0 THEN VID_V_ADR0 = VID_V_POS MOD 484; ELSE VID_V_ADR0 = 484 + (VID_V_POS MOD 484); VID_V_ADR1 = (VID_V_ADR0 + 1) MOD 484; VID_H_ADR = VID_H_POS; IF NOT RASTER_ON THEN RETURN; IF (VID_H_POS >= MEM_H_POS) AND (VID_H_POS <= MEM_H_POS + 383) AND (VID_V_POS = MEM_V_POS) THEN DO; CALL STOP_DISPLAY; CALL RESTART_DISPLAY; END; ELSE DO; DCL MHP INTEGER, MVP INTEGER, DH INTEGER, DV INTEGER; MHP = MEM_H_POS; MVP = MEM_V_POS; IF VID_H_POS < MEM_H_POS THEN MEM_H_POS = VID_H_POS - 320; ELSE IF VID_H_POS > MEM_H_POS + 383 THEN MEM_H_POS = VID_H_POS - 63; MEM_V_POS = VID_V_POS; DH = MEM_H_POS - MHP; DV = MEM_V_POS - MVP; IF (DH <> 0) AND (DV <> 0) THEN CALL LOAD_IMAGE_TILE (MEM_H_POS,MEM_V_POS,1024,484); ELSE IF DH > 0 THEN CALL LOAD_IMAGE_TILE (MHP + 1024,MVP,DH,484); ELSE IF DH < 0 THEN CALL LOAD_IMAGE_TILE (MEM_H_POS,MVP,-DH,484); ELSE IF DV > 0 THEN CALL LOAD_IMAGE_TILE (MHP,MVP + 484,1024,DV); ELSE CALL LOAD_IMAGE_TILE (MHP,MEM_V_POS,1024,-DV); END; END; /*------------------------------------------------------------*/ VIDEO_TEXT_ORIGIN: PROCEDURE (H,V) PUBLIC REENTRANT; DCL H WORD, V WORD; TXT_H_ORG = H; TXT_V_ORG = V; TXT_TOP_LINE = 0; TXT_COL,TXT_ROW = 0; TXT_V_ADR0 = 0; TXT_V_ADR1 = 1; END; /*------------------------------------------------------------*/ VIDEO_TEXT_POSITION: PROCEDURE (C,R) PUBLIC REENTRANT; DCL R WORD, C WORD; TXT_ROW = R; TXT_COL = C; END; /*------------------------------------------------------------*/ VIDEO_TEXT_FILL: PROCEDURE (VAL,H,V,HS,VS) PUBLIC REENTRANT; DCL VAL BYTE, H WORD, V WORD, HS WORD, VS WORD; CALL LOAD_FILL ((VAL MOD 8) + 8,H,V,HS,VS); END; /*------------------------------------------------------------*/ VIDEO_ON: PROCEDURE BYTE PUBLIC REENTRANT; RETURN RASTER_ON; END; /*------------------------------------------------------------*/ CURSOR_HOR_POS: PROCEDURE WORD PUBLIC REENTRANT; RETURN UN(CUR_H_POS) * SAMPLE; END; /*------------------------------------------------------------*/ CURSOR_VER_POS: PROCEDURE WORD PUBLIC REENTRANT; RETURN UN(CUR_V_POS) * SAMPLE; END; /*------------------------------------------------------------*/ LOAD_IMAGE_TILE: PROCEDURE (H,V,HSZ,VSZ); DCL H INTEGER, V INTEGER, HSZ INTEGER, VSZ INTEGER; DCL LINE WORD, FR BYTE, AI WORD, ADR DWORD, N BYTE, COUNT BYTE; DCL IMG_H_ADR INTEGER, IMG_V_ADR INTEGER; DCL IMG_H_LEN INTEGER, IMG_V_LEN INTEGER; DCL BACK_H_LEN INTEGER, BACK_V_LEN INTEGER; DCL BACK_H_ADR INTEGER, BACK_V_ADR INTEGER; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; /* Calculate horizontal parameters */ IF (0 <= H) AND (H < H_SIZE) THEN IMG_H_ADR = H; ELSE IMG_H_ADR = 0; IF (H >= H_SIZE) OR (H + HSZ <= 0) THEN IMG_H_LEN = 0; ELSE IF (0 < H + HSZ) AND (H + HSZ <= H_SIZE) THEN IMG_H_LEN = H + HSZ - IMG_H_ADR; ELSE IMG_H_LEN = H_SIZE - IMG_H_ADR; IF (H < H_SIZE) AND (H_SIZE < H + HSZ) THEN BACK_H_ADR = H_SIZE; ELSE BACK_H_ADR = H; IF VSZ = 484 THEN BACK_H_LEN = HSZ - IMG_H_LEN; ELSE BACK_H_LEN = 0; /* Calculate vertical parameters */ IF (0 <= V) AND (V < V_SIZE) THEN IMG_V_ADR = V; ELSE IMG_V_ADR = 0; IF (V >= V_SIZE) OR (V + VSZ <= 0) THEN IMG_V_LEN = 0; ELSE IF (0 < V + VSZ) AND (V + VSZ <= V_SIZE) THEN IMG_V_LEN = V + VSZ - IMG_V_ADR; ELSE IMG_V_LEN = V_SIZE - IMG_V_ADR; IF (V < V_SIZE) AND (V_SIZE < V + VSZ) THEN BACK_V_ADR = V_SIZE; ELSE BACK_V_ADR = V; IF HSZ = 1024 THEN BACK_V_LEN = VSZ - IMG_V_LEN; ELSE BACK_V_LEN = 0; ADR = PIXEL_ADDRESS (IMG_H_ADR,IMG_V_ADR); IF IMG_V_ADR >= 0 THEN IMG_V_ADR = IMG_V_ADR MOD 484; ELSE IMG_V_ADR = 484 + (IMG_V_ADR MOD 484); IF BACK_V_ADR >= 0 THEN BACK_V_ADR = BACK_V_ADR MOD 484; ELSE BACK_V_ADR = 484 + (BACK_V_ADR MOD 484); /* Setup for image data transfer */ ID_BUS_REG = ID_RCV; AI = UN(IMG_H_SIZE) * SAMPLE; IF SAMPLE = 1 THEN FR = IWRITE; ELSE FR = IWRITE2; CALL SET_XFER_COUNT (UN(IMG_H_LEN) * SAMPLE); V = IMG_V_ADR; DO WHILE (FIELD_REG AND 010B) = 010B; END; DO WHILE (FIELD_REG AND 010B) = 000B; END; /* Transfer image data */ IF IMG_H_LEN > 0 THEN DO; DO LINE = 1 TO IMG_V_LEN; IMAGE_H_ADR_REG = IMG_H_ADR; IMAGE_V_ADR_REG = V; FUNCTION_REG = FR; CALL ENABLE_MEMORY_READ (ADR); CALL RELOAD_XFER_COUNT; /* Transfer starts */ ADR = ADR + AI; IF V >= 483 THEN V = 0; ELSE V = V + 1; DO COUNT = 0 TO 100; IF XFR_DONE THEN COUNT = 200; END; END; END; CALL DISABLE_MEMORY; CUR_SLOT,SLOT = MY_SLOT; CALL DRIVE_BUS (64); /* Load side background */ IF BACK_H_LEN > 0 THEN DO; CALL SET_XFER_COUNT (UN(BACK_H_LEN)); V = IMG_V_ADR; DO LINE = 1 TO IMG_V_LEN; IMAGE_H_ADR_REG = BACK_H_ADR; IMAGE_V_ADR_REG = V; FUNCTION_REG = IWRITE; CALL RELOAD_XFER_COUNT; /* Transfer starts */ IF V >= 483 THEN V = 0; ELSE V = V + 1; DO COUNT = 0 TO 100; IF XFR_DONE THEN COUNT = 200; END; END; END; /* Load top/bottom background */ IF BACK_V_LEN > 0 THEN DO; CALL SET_XFER_COUNT (1024); V = BACK_V_ADR; DO LINE = 1 TO BACK_V_LEN; IMAGE_H_ADR_REG = 0; IMAGE_V_ADR_REG = V; FUNCTION_REG = IWRITE; CALL RELOAD_XFER_COUNT; /* Transfer starts */ IF V >= 483 THEN V = 0; ELSE V = V + 1; DO COUNT = 0 TO 100; IF XFR_DONE THEN COUNT = 200; END; END; END; CALL DISABLE_XFER; ID_BUS_REG = ID_OFF; CALL RESTART_DISPLAY; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ LOAD_FILL: PROCEDURE (VAL,H,V,HSZ,VSZ); DCL VAL BYTE, H WORD, V WORD, HSZ WORD, VSZ WORD; DCL N WORD; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; H = TXT_H_ORG + H; V = TXT_V_ORG + V; CALL STOP_DISPLAY; ID_BUS_REG = ID_RCV; DO N = 1 TO VSZ; CALL SCROLL (V); GRAPH_H_ADR_REG = H; GRAPH_V_ADR_REG = V MOD 484; FUNCTION_REG = GWRITE; GRAPH_REG = G_GWRITE; CALL FILL_BLOCK (VAL,HSZ); V = V + 1; END; ID_BUS_REG = ID_OFF; CALL RESTART_DISPLAY; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ LOAD_IMAGE_FILL: PROCEDURE (VAL,H,V,HSZ,VSZ); DCL VAL BYTE, H WORD, V WORD, HSZ WORD, VSZ WORD; DCL N WORD; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; CALL STOP_DISPLAY; ID_BUS_REG = ID_RCV; DO N = 1 TO VSZ; CALL SCROLL (V); IMAGE_H_ADR_REG = SN (H); IMAGE_V_ADR_REG = SN (V MOD 484); FUNCTION_REG = IWRITE; CALL FILL_BLOCK (VAL,HSZ); V = V + 1; END; ID_BUS_REG = ID_OFF; CALL RESTART_DISPLAY; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ VIDEO_TEXT: PROCEDURE (STR,LEN) PUBLIC REENTRANT; DCL H WORD, V WORD, STR POINTER, LEN BYTE; DCL (STRING BASED STR) (*) BYTE; DCL LINE BYTE, POS BYTE, V_ADR WORD, START_LINE BYTE, END_LINE BYTE; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; H = TXT_H_ORG + (TXT_COL * 8); V = TXT_V_ORG + (TXT_ROW * 14); V_ADR = V MOD 484; IF V < TXT_TOP_LINE THEN DO; TXT_TOP_LINE = V; TXT_V_ADR0 = TXT_TOP_LINE MOD 484; TXT_V_ADR1 = (TXT_TOP_LINE + 1) MOD 484; END; ELSE IF V > TXT_TOP_LINE + 470 THEN DO; TXT_TOP_LINE = V - 470; TXT_V_ADR0 = TXT_TOP_LINE MOD 484; TXT_V_ADR1 = (TXT_TOP_LINE + 1) MOD 484; END; /* Fill buffer with character dot patterns */ DO LINE = 0 TO 6; DO POS = 0 TO LEN - 1; ROW_BFR(LINE).CHAR(POS) = CHAR(STRING(POS)).ROW(LINE); END; END; /* Write buffer to video memory */ CALL ENABLE_BUS_WRITE; IF VID_ENABLE THEN CALL STOP_DISPLAY; IMAGE_V_ADR_REG = 486; /* Unused image line */ ID_BUS_REG = ID_RCV; DO LINE = 0 TO 6; GRAPH_H_ADR_REG = H; GRAPH_V_ADR_REG = V_ADR; GRAPH_REG = G_TWRITE; GRAPH_REG = 0; FUNCTION_REG = TWRITE; CALL MOVB (@ROW_BFR(LINE),@IDBUS,LEN); V_ADR = (V_ADR + 1) MOD 484; END; ID_BUS_REG = ID_OFF; IF VID_ENABLE THEN CALL RESTART_DISPLAY; /* Fill buffer with character dot patterns */ DO LINE = 7 TO 13; DO POS = 0 TO LEN - 1; ROW_BFR(LINE).CHAR(POS) = CHAR(STRING(POS)).ROW(LINE); END; END; /* Write buffer to video memory */ IF VID_ENABLE THEN CALL STOP_DISPLAY; IMAGE_V_ADR_REG = 486; /* Unused image line */ ID_BUS_REG = ID_RCV; DO LINE = 7 TO 13; GRAPH_H_ADR_REG = H; GRAPH_V_ADR_REG = V_ADR; GRAPH_REG = G_TWRITE; GRAPH_REG = 0; FUNCTION_REG = TWRITE; CALL MOVB (@ROW_BFR(LINE),@IDBUS,LEN); V_ADR = (V_ADR + 1) MOD 484; END; ID_BUS_REG = ID_OFF; IF VID_ENABLE THEN CALL RESTART_DISPLAY; CALL DISABLE_XFER; TXT_ROW = TXT_ROW + 1; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ VIDEO_TEXT_BIG: PROCEDURE (STR,TLEN,INV) PUBLIC REENTRANT; DCL STR POINTER, LEN BYTE, INV BYTE; DCL TLEN WORD; DCL (STRING BASED STR) (*) BYTE; DCL POS WORD; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; IF NOT VID_ENABLE THEN CALL STOP_DISPLAY; POS = 0; DO WHILE TLEN > 0; IF TLEN > 40 THEN LEN = 40; ELSE LEN = TLEN; CALL LOAD_TEXT_BIG (@STRING(POS),LEN,INV); TLEN = TLEN - LEN; POS = POS + LEN; END; IF NOT VID_ENABLE THEN CALL RESTART_DISPLAY; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ LOAD_TEXT_BIG: PROCEDURE (STR,LEN,INV) PUBLIC REENTRANT; DCL H WORD, V WORD, STR POINTER, LEN BYTE, INV BYTE, L BYTE; DCL (STRING BASED STR) (*) BYTE; DCL LINE BYTE, POS BYTE, V_ADR WORD, START_LINE BYTE, END_LINE BYTE; DCL OLD_SLOT BYTE, LINES BYTE; DCL POL WORD; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; H = TXT_H_ORG + (TXT_COL * 16); V = TXT_V_ORG + (TXT_ROW * 28); V_ADR = V MOD 484; IF V < TXT_TOP_LINE THEN DO; TXT_TOP_LINE = V; TXT_V_ADR0 = TXT_TOP_LINE MOD 484; TXT_V_ADR1 = (TXT_TOP_LINE + 1) MOD 484; END; ELSE IF V > TXT_TOP_LINE + 470 THEN DO; TXT_TOP_LINE = V - 470; TXT_V_ADR0 = TXT_TOP_LINE MOD 484; TXT_V_ADR1 = (TXT_TOP_LINE + 1) MOD 484; END; IF INV THEN POL = 0FFFFH; ELSE POL = 00000H; IF LEN <= 4 THEN LINES = 7; ELSE IF LEN <= 20 THEN LINES = 5; ELSE LINES = 4; L = LEN * 2; START_LINE = 0; END_LINE = 0; DO WHILE END_LINE < 13; END_LINE = START_LINE + LINES - 1; IF END_LINE > 13 THEN END_LINE = 13; /* Fill buffer with character dot patterns */ DO LINE = START_LINE TO END_LINE; DO POS = 0 TO LEN - 1; BROW_BFR(LINE).CHAR(POS) = POL XOR BCHAR(STRING(POS)).ROW(LINE); END; END; /* Write buffer to video memory */ CALL ENABLE_BUS_WRITE; IF VID_ENABLE THEN CALL STOP_DISPLAY; IMAGE_V_ADR_REG = 486; /* Unused image line */ ID_BUS_REG = ID_RCV; DO LINE = START_LINE TO END_LINE; GRAPH_H_ADR_REG = H; GRAPH_V_ADR_REG = V_ADR; GRAPH_REG = G_TWRITE; GRAPH_REG = 0; FUNCTION_REG = TWRITE; CALL MOVB (@BROW_BFR(LINE),@IDBUS,L); V_ADR = V_ADR + 1; GRAPH_H_ADR_REG = H; GRAPH_V_ADR_REG = V_ADR; GRAPH_REG = G_TWRITE; GRAPH_REG = 0; FUNCTION_REG = TWRITE; CALL MOVB (@BROW_BFR(LINE),@IDBUS,L); V_ADR = V_ADR + 1; END; ID_BUS_REG = ID_OFF; IF VID_ENABLE THEN CALL RESTART_DISPLAY; START_LINE = START_LINE + LINES; END; CALL DISABLE_XFER; TXT_ROW = TXT_ROW + 1; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ SCROLL: PROCEDURE (L); DCL L WORD; IF L < TXT_TOP_LINE THEN DO; TXT_TOP_LINE = L; TXT_V_ADR0 = TXT_TOP_LINE MOD 484; TXT_V_ADR1 = (TXT_TOP_LINE + 1) MOD 484; END; ELSE IF L > TXT_TOP_LINE + 483 THEN DO; TXT_TOP_LINE = L - 483; TXT_V_ADR0 = TXT_TOP_LINE MOD 484; TXT_V_ADR1 = (TXT_TOP_LINE + 1) MOD 484; END; END; /*------------------------------------------------------------*/ STOP_DISPLAY: PROCEDURE; DCL N BYTE; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; DO WHILE (FIELD_REG AND 010B) = 010B; END; DO WHILE (FIELD_REG AND 010B) = 000B; END; IF (FIELD_REG AND 100B) = 000B THEN DO N = 0 TO 6; END; FUNCTION_REG = IDLE; CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ RESTART_DISPLAY: PROCEDURE; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; GRAPH_REG = P_VIDEO; DO WHILE (FIELD_REG AND 010B) = 000B; END; IF (FIELD_REG AND 100B) = 000B THEN IMAGE_V_ADR_REG = VID_V_ADR0; ELSE IMAGE_V_ADR_REG = VID_V_ADR1; IMAGE_H_ADR_REG = VID_H_ADR; IF (FIELD_REG AND 100B) = 000B THEN GRAPH_V_ADR_REG = TXT_V_ADR0; ELSE GRAPH_V_ADR_REG = TXT_V_ADR1; GRAPH_H_ADR_REG = 0; FUNCTION_REG = BLANK; IF ((FIELD_REG AND 010B) = 000B) THEN DO; FUNCTION_REG = IDLE; DO WHILE (FIELD_REG AND 010B) = 000B; END; IF (FIELD_REG AND 100B) = 000B THEN IMAGE_V_ADR_REG = VID_V_ADR0; ELSE IMAGE_V_ADR_REG = VID_V_ADR1; IMAGE_H_ADR_REG = VID_H_ADR; IF (FIELD_REG AND 100B) = 000B THEN GRAPH_V_ADR_REG = TXT_V_ADR0; ELSE GRAPH_V_ADR_REG = TXT_V_ADR1; GRAPH_H_ADR_REG = 0; FUNCTION_REG = BLANK; END; GRAPH_REG = P_VIDEO; GRAPH_REG = VID_ENABLE AND ((IMAGE_ON AND 0001B) OR (GRAPH_ON AND 0010B) OR (CURSOR_ON AND 0100B)); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ CONTROL_DISPLAY: PROCEDURE; DCL OLD_SLOT BYTE; IF NOT RASTER_ON THEN RETURN; OLD_SLOT = CUR_SLOT; CUR_SLOT = MY_SLOT; SLOT = CUR_SLOT; DO WHILE (FIELD_REG AND 010B) = 010B; END; DO WHILE (FIELD_REG AND 010B) = 000B; END; GRAPH_REG = VID_ENABLE AND ((IMAGE_ON AND 0001B) OR (GRAPH_ON AND 0010B) OR (CURSOR_ON AND 0100B)); CUR_SLOT = OLD_SLOT; SLOT = CUR_SLOT; END; /*------------------------------------------------------------*/ PIXEL_ADDRESS: PROCEDURE (H,V) DWORD; DCL H INTEGER, V INTEGER, ADR DWORD; IF V >= 0 THEN ADR = IMG_BEG_ADR + (DOUBLE (UN(V)) * SAMPLE * UN(IMG_H_SIZE)); ELSE ADR = IMG_BEG_ADR - (DOUBLE (UN(-V)) * SAMPLE * UN(IMG_H_SIZE)); IF H >= 0 THEN RETURN ADR + (UN(H) * SAMPLE); ELSE RETURN ADR - (UN(-H) * SAMPLE); END; /*------------------------------------------------------------*/ TEST_VIDEO: PROCEDURE PUBLIC; DCL N BYTE, L BYTE; DCL TEST_TEXT (*) BYTE DATA (' ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 '); DCL TEST_BOX (*) BYTE DATA (0,0,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0, 0,0,1,0,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,1,0, 0,0,1,0,1,0,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,1,0,1,0, 0,0,1,0,1,0,1,0,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,1,0,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,1,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,1,0,1,0,3,2,2,2,2,2,2,2,2,2,2,2,4,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,2,2,2,2,2,2,2,4,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,2,2,2,2,2,2,2,6,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,1,0,1,0,5,2,2,2,2,2,2,2,2,2,2,2,6,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,1,0,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,0,1,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,1,0,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,0,1,0,1,0,1,0,1,0, 0,0,1,0,1,0,1,0,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,0,1,0,1,0,1,0, 0,0,1,0,1,0,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,0,1,0,1,0, 0,0,1,0,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,0,1,0, 0,0,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,0); CALL SEND_CHAR (13); CUR_SLOT,MY_SLOT = FIND_BOARD (BOARD_ID); SLOT = CUR_SLOT; IF MY_SLOT = 255 THEN DO; CALL TEST_FAIL (@('Video board not found',0)); RETURN; END; CALL INITIALIZE; CALL SEND_STRING (@('-- Video Board Test --',13)); CALL VIDEO_DISPLAY_ON; CALL VIDEO_PWR_ON; CALL VIDEO_DISABLE; CALL VIDEO_TEXT_FILL (0,0,0,640,512); CALL VIDEO_TEXT_ORIGIN (0,1); CALL VIDEO_ENABLE_IMAGE; /* - Text box test - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL VIDEO_DISABLE; CALL VIDEO_TEXT_POSITION (0,0); CALL VIDEO_TEXT_BIG (@TEST_BOX,SIZE (TEST_BOX),FALSE); CALL VIDEO_ENABLE_TEXT; CALL VIDEO_ENABLE; CALL SEND_STRING (@('Nested box display, Press SPACE BAR if OK',7,13)); DO N = 1 TO 10; CALL WAIT (500000); IF DIAGNOSTIC_INT THEN N = -1; END; IF N <> 0 THEN CALL TEST_FAIL (@('Video Board - Text box test',0)); /* - Big text test - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL VIDEO_DISABLE; CALL VIDEO_TEXT_POSITION (0,0); DO N = 1 TO 17; CALL VIDEO_TEXT_BIG (@TEST_TEXT,40,FALSE); END; CALL VIDEO_ENABLE_TEXT; CALL VIDEO_ENABLE; CALL SEND_STRING (@('Text display, Press SPACE BAR if OK',7,13)); DO N = 1 TO 10; CALL WAIT (500000); IF DIAGNOSTIC_INT THEN N = -1; END; IF N <> 0 THEN CALL TEST_FAIL (@('Video Board - Text test',0)); /* - Text overwrite test - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL SEND_STRING (@('Text overwrite, Press SPACE BAR if OK',7,13)); DO N = 2 TO 27; DO L = 0 TO 16; CALL VIDEO_TEXT_POSITION (N,L); CALL VIDEO_TEXT_BIG (@(' '),1,FALSE); END; IF DIAGNOSTIC_INT THEN N = -1; END; IF N <> 0 THEN CALL TEST_FAIL (@('Video Board - Text overwrite test',0)); /* - Image gray boxes - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL VIDEO_DISABLE; CALL VIDEO_DISABLE_TEXT; CALL LOAD_IMAGE_FILL ( 0, 0, 0, 640, 484); CALL LOAD_IMAGE_FILL ( 64, 60, 64, 532, 376); CALL LOAD_IMAGE_FILL (128, 114, 118, 424, 268); CALL LOAD_IMAGE_FILL (192, 168, 172, 316, 160); CALL LOAD_IMAGE_FILL (255, 222, 226, 208, 52); CALL VIDEO_ENABLE; CALL SEND_STRING (@('Gray box display, Press SPACE BAR if OK',7,13)); DO N = 1 TO 10; CALL WAIT (500000); IF DIAGNOSTIC_INT THEN N = -1; END; IF N <> 0 THEN CALL TEST_FAIL (@('Video Board - Image gray box test',0)); /* - Flashing boxes - - - - - - - - - - - - - - - - - - - - - */ CALL SEND_CHAR (13); CALL VIDEO_DISABLE; CALL VIDEO_DISABLE_TEXT; CALL LOAD_IMAGE_FILL (0,0,0,640,484); CALL LOAD_IMAGE_FILL (255,91,106,91,96); CALL LOAD_IMAGE_FILL (255,273,106,91,96); CALL LOAD_IMAGE_FILL (255,455,106,91,96); CALL LOAD_IMAGE_FILL (255,91,298,91,96); CALL LOAD_IMAGE_FILL (255,273,298,91,96); CALL LOAD_IMAGE_FILL (255,455,298,91,96); CALL VIDEO_ENABLE; CALL SEND_STRING (@('Flashing box display, Press SPACE BAR if OK',7,13)); DO N = 1 TO 10; CALL WAIT (250000); CALL VIDEO_ENABLE_CURSOR; CALL WAIT (250000); CALL VIDEO_DISABLE_CURSOR; IF DIAGNOSTIC_INT THEN N = -1; END; IF N <> 0 THEN CALL TEST_FAIL (@('Video Board - Flashing box test',0)); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ CALL VIDEO_DISABLE; CALL VIDEO_DISPLAY_OFF; CALL VIDEO_PWR_OFF; END; /*------------------------------------------------------------*/ END;