|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T b ┃
Length: 11101 (0x2b5d) Types: TextFile Names: »bitblt_apa16.h«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/libibm/bitblt/bitblt_apa16.h«
/* $Header: bitblt_apa16.h,v 10.1 86/11/19 10:51:47 jg Exp $ */ /* * Copyright (c) 1986 Brown University * * Permission to use, copy, modify and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies, and that both * that copyright notice and this permission notice appear in supporting * documentation, and that the name of Brown University not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Brown University makes no * representations about the suitability of this software for any purpose. * It is provided "as-is" without express or implied warranty. * * Written by Daniel Stone, Brown University/IRIS April 23, 1986. * * This file contains the defines to do hardware bit block transfers (bitblt's) * on the APA-16. */ /* $Header: bitblt_apa16.h,v 10.1 86/11/19 10:51:47 jg Exp $ */ /* $Source: /u1/X/libibm/bitblt/RCS/bitblt_apa16.h,v $ */ /* * Log 2 of the screen width. */ #define LOG2_BPSW 7 /* * Divide and multiply by Bytes Per Screen Width. */ #define DIV_BPSW(value) ((value) >> LOG2_BPSW) #define MUL_BPSW(value) ((value) << LOG2_BPSW) /* * Screen dimensions in pixels. */ #define SCREEN_WD 1024 #define HIDDEN_WD SCREEN_WD #define SCREEN_HT 768 #define HIDDEN_HT 256 /* * Screen dimensions in words. */ #define SCREEN_WORD_WD (SCREEN_WD/BPW) #define HIDDEN_WORD_WD (HIDDEN_WD/BPW) #define SCREEN_WORD_HT (SCREEN_HT/BPW) #define HIDDEN_WORD_HT (HIDDEN_HT/BPW) #define IO_ADDR 0xF0000000 #define MODEL_IO_ADDR (IO_ADDR | 0x04000000) /* * Hidden frame buffer address. */ #define HID_OFFSET 0x00018000 #define HID_APA16BASE (APA16BASE + HID_OFFSET) /* * Within the hidden screen area there is an area for 2 hardware locators. */ #define LOCATOR_OFFSET (HID_OFFSET + 0x800) #define LOCATOR_APA16BASE (APA16BASE + LOCATOR_OFFSET) /* * The bottom right corners of both locators. */ #define AND_LOCATOR_RT 48 #define AND_LOCATOR_BM 848 #define XOR_LOCATOR_RT (48*2) #define XOR_LOCATOR_BM AND_LOCATOR_BM #define SAVE_AND_LOCATOR_RT (48*3) #define SAVE_AND_LOCATOR_BM 848 #define SAVE_XOR_LOCATOR_RT (48*4) #define SAVE_XOR_LOCATOR_BM AND_LOCATOR_BM /* * Dimensions of the locators found in the hidden screen area. */ #define HARD_LOCATOR_WD 48 #define HARD_LOCATOR_HT 64 /* * Spot on the APA-16's memory where the hardware cursor is located. */ #define AND_LOCATOR LOCATOR_APA16BASE #define XOR_LOCATOR (LOCATOR_APA16BASE + BTOB(HARD_LOCATOR_WD)) /* * Spot on the APA-16's memory where we will save the current locator. */ #define SAVE_AND_LOCATOR (LOCATOR_APA16BASE + BTOB(HARD_LOCATOR_WD*2)) #define SAVE_XOR_LOCATOR (LOCATOR_APA16BASE + BTOB(HARD_LOCATOR_WD*3)) /* * Within the hidden screen area there is an area for hidden fonts. */ #define FONT_Y_COORD 848 #define FONT_OFFSET (HID_OFFSET + 0x2800) #define FONT_APA16BASE (APA16BASE + FONT_OFFSET) #define FONT_XBASE 1 #define FONT_YBASE 848 #define FONT_YBASE_BOTTOM 896 /* * Within the hidden screen area there is an area for a rasterop queue. */ #define QUE_Y_COORD 896 #define QUE_OFFSET (HID_OFFSET + 0x4000) #define QUE_APA16BASE (APA16BASE + QUE_OFFSET) #define RESERVE_Y_COORD 1006 #define RESERVE_OFFSET (HID_OFFSET + 0x7700) #define LAST_QUE_OFFSET (RESERVE_OFFSET - 2) #define LAST_QUE_APA16BASE (APA16BASE + LAST_QUE_OFFSET) #define QUE_WD SCREEN_WD #define QUE_HT 110 /* * Macro that builds the queue pointer using the screen address which is a * short pointer. */ #define SPTR_TO_QPTR(sptr) ((short)(DIV_2((long)sptr & 0x0000ffff) | \ 0xE000)) /* * Macro that takes a queue pointer (an unsigned short) and builds a unsigned * short pointer from it. */ #define QPTR_TO_SPTR(qptr) ((unsigned short *)(MUL_2(qptr)|QUE_APA16BASE)) /* * Macros that take a short pointer to the bitmap and return the x value in bits * and the y value in scanlines. */ #define SPTR_TO_X(sptr) (MUL_BPB((long)sptr & 0x007f)) #define SPTR_TO_Y(sptr) (DIV_BPSW((long)sptr & 0x1ff80)) #define X_LOCATOR_R ((unsigned short *)(MODEL_IO_ADDR | 0xD9F800)) #define Y_LOCATOR_R ((unsigned short *)(MODEL_IO_ADDR | 0xD9F802)) #define QUE_COUNT_R ((unsigned short *)(MODEL_IO_ADDR | 0xD9F804)) #define QUE_PTR_R ((unsigned short *)(MODEL_IO_ADDR | 0xD9f806)) #define QUE_LINK_PTR_R ((unsigned short *)(MODEL_IO_ADDR | 0xD9f814)) #define QUE_MODE_R ((unsigned short *)(MODEL_IO_ADDR | 0xD9f816)) /* * Macros and defines for the mode register. */ #define MODE_R (IO_ADDR | 0x0D10) #define ACCESS_BIT 0x8000 #define SET_ACCESS_BIT(mode) (mode |= ACCESS_BIT) #define CLR_ACCESS_BIT(mode) (mode &= ~ACCESS_BIT) #define PAGE_SELECT 0x4000 #define WR_MASK 0x0f00 #define SET_WR_MASK(mode,msk) mode = ((mode & ~WR_MASK)|((msk<<8) & WR_MASK)) #define CLR_WR_MASK(mode) mode &= ~WR_MASK #define LOGIC_FUNC 0x00f0 #define SET_LOGIC_FUNC(mode,fc) mode = ((mode & ~LOGIC_FUNC)| \ ((fc<<4) & LOGIC_FUNC)) #define CLR_LOGIC_FUNC(mode) mode &= ~LOGIC_FUNC #define START_BIT 0x000f #define SET_START_BIT(mode,sb) mode = ((mode & ~START_BIT)|(sb & START_BIT)) #define CLR_START_BIT(mode) mode &= ~START_BIT /* * More understandable names for access bit. */ #define HORZ_ACCESS(mode) SET_ACCESS_BIT(mode) #define VERT_ACCESS(mode) CLR_ACCESS_BIT(mode) /* * Control/Status register. */ #define CS_R (IO_ADDR | 0x0D12) #define BACKGRND_BIT 0x0400 #define BLACK_ON_WHITE *(unsigned short *)(CS_R) |= BACKGRND_BIT #define WHITE_ON_BLACK *(unsigned short *)(CS_R) &= ~BACKGRND_BIT #define TOGGLE_BACKGRND *(unsigned short *)(CS_R) ^= BACKGRND_BIT /* * Increment Queue register. NOTE: Reg is any register the data is ignored. */ #define INCR_QUE_R (IO_ADDR | 0x0D14) #define INCR_QUE_COUNT(reg) *(unsigned short *)INCR_QUE_R = (unsigned short)reg /* * Wait for the rasterop engine to stop. If it does not stop then kill it * after a specified time. The way this works is this, we poll the queue * counter register waiting for it to zero (which means the rasterop has * stopped), if it doesn't zero by QUE_TIME_OUT then assume something drastic * went wrong and initialize the APA-16. * * Later we will re-write this to receive an interrupt. */ #define QUE_TIME_OUT 500000 #define WAIT_QUE(c,num) { \ if (*QUE_COUNT_R != 0) { \ c = 0; \ while (*QUE_COUNT_R != 0) { \ if (c++ == QUE_TIME_OUT) { \ c = *QUE_COUNT_R; \ RESET_APA16(c); \ printf("RESET APA-16! n:%d count:%d\r\n", \ num,c); \ break; \ } \ } \ } \ } /* * Video data output. */ #define VD_OUT (IO_ADDR | 0xD1A) /* * Disable video data output (pass it a temporary register). */ #define DISABLE_VD_OUT(reg) reg = *(unsigned short *)VD_OUT /* * Enable video data output. NOTE: Reg is any register. The data in "reg" * is ignored. */ #define ENABLE_VD_OUT(reg) *(unsigned short *)VD_OUT = (unsigned short)reg /* * Reset adaptor register. */ #define RA_R (IO_ADDR | 0x0D20) #define RESET_APA16(reg) *(unsigned short *)RA_R = (unsigned short)reg; /* * Disable DMA processing. NOTE: Reg is any register the data is ignored. */ #define DISABLE_DMA (IO_ADDR | 0x0D26) #define DISABLE_DMA_PROC(reg) *(unsigned short *)DISABLE_DMA=(unsigned short)reg #define ENABLE_DMA (IO_ADDR | 0x0D28) #define ENABLE_DMA_PROC(reg) *(unsigned short *)ENABLE_DMA = (unsigned short)reg /* * Default initial values for the APA-16 registers. */ #define MODER_DEFAULT 0x8090 #define CSR_DEFAULT 0x0400 /* * Defines and macros for the rasterop commands. * ROT stands for Raster Operation Type. * LF stands for logic function. */ #define DECR_QUE_COUNT 0x0800 #define ROT_WRDST 0x02F0 #define ROT_RECTCP 0x0300 #define ROT_TDDMA 0x0370 #define LF_CLEAR 0x0000 #define LF_DSTandSRC 0x0001 #define LF_NotDSTandSRC 0x0002 #define LF_COPYDST 0x0003 #define LF_DSTandNotSRC 0x0008 #define LF_COPYSRC 0x0009 #define LF_NotDST 0x0009 #define LF_DSTxorSRC 0x000a #define LF_DSTorSRC 0x000b #define LF_NotDSTorNotSRC 0x000e #define LF_SET 0x000f #define IS_ROT_WRDST(excmd) ((excmd & 0x03f0) == ROT_WRDST) /* * Rasterop execute command instruction. */ #define BUILD_EXCMD(decrflag,ROT_type,LF_type) \ (0xD000 | decrflag | ROT_type | LF_type) #define Y_BRCH_BASE 896 #define X_BRCH_BASE 0 /* * Rasterop branch instruction. Both X and Y should be given in bits. * Y must be between 896 and 1023. X must fall on a word boundrary. */ #define BUILD_BRCH(x,y) ((Y_BRCH_BASE << 6) | ((y) << 6) | DIV_BPW(x)) #define HIGH_BYTE(addr) (((unsigned long)addr & 0x1fe0000) >> 17) #define MID_BYTE(addr) (((unsigned long)addr & 0x1fe00) >> 9) #define LOW_BYTE(addr) (((unsigned long)addr & 0x1fe) >> 1) /* * Queue command codes for the registers on the APA-16. */ #define REG_Y_LOOP 0x0000 #define REG_X_LOOP 0x1000 #define REG_GEN_A 0x2000 #define REG_GEN_B 0x3000 #define REG_Y_SRC 0x4000 #define REG_X_SRC 0x5000 #define REG_Y_DST 0x6000 #define REG_X_DST 0x7000 #define REG_Y_BACKUP 0x8000 #define REG_X_BACKUP 0x9000 #define REG_HIGHBYTE 0xa000 #define REG_LOWBYTE 0xb000 /* * Now that we've defined those names for hardware guru's lets have some * real names. Notice how the HIGHBYTE register (whatever that is) is * used as the Y destination register when dealing with rectangle copys * also notice that the Y_LOOP register is used (as expected) as the height * register during rectangle copies but that the Y_BACKUP register is used * when only dealing with the destination. */ #define XDST_REG REG_X_DST #define YDST_REG REG_Y_DST #define XSRC_REG REG_X_SRC #define YSRC_REG REG_Y_SRC #define RECT_YDST_REG REG_HIGHBYTE #define WIDTH_REG REG_X_BACKUP #define HEIGHT_REG REG_Y_BACKUP #define RECT_HEIGHT_REG REG_Y_LOOP #define MAXPARAM 1024 #define VISPARAM 768 #define MINPARAM 1 /* * Register load command. */ #define BUILD_REGLOAD(REG_type,param) (REG_type | (param & (MAXPARAM-1))) /* * Indicates a there is no bit image for this font. */ #define NULLIMAGE MAXPARAM+1 /* * A nulls for pointers. */ #define US_NIL ((unsigned short *)0) #define S_NIL ((short *)0) /* * Execute the commands set up in the queue at Qaddr but first wait for * the last command to finish, then set up the queue register pointer * and increment the count nexec number of times. */ #define EXECUTE_QUE_CMDS(Qaddr,nexec,index) \ { \ register i,tmp; \ WAIT_QUE(index); \ *QUE_PTR_R = Qaddr; \ for (i = nexec + 1; --i;) \ INCR_QUE_COUNT(tmp); \ } /* * Take an index into one of the queue instructions, wait for the last command * to finish, set up the queue register pointer and increment the count the * right number of times. */ #define DO_QUE_CMD(index) EXECUTE_QUE_CMDS(QUEinstr[index].Qaddr, \ QUEinstr[index].nexec,index) /* * Number of words needed to do a destination only command is 5 and * the number of words needed to do a rectangle copy is 7. */ #define DSTCMDWORDS 5 #define RECTCMDWORDS 7