; from gaithersburg md ibm pc bulletin board 19mar83
;
;
		SUBTTL ROM BIOS DATA AREAS AND EQUATES
;--------------------------------
;   EQUATES
;--------------------------------
PORT_A		EQU	60H		 ; 8255 PORT A ADDR
PORT_B		EQU	61H		 ; 8255 PORT B ADDR
PORT_C		EQU	62H		 ; 8255 PORT C ADDR
CMD_PORT	EQU	63H
INTA00		EQU	20H		 ; 8259 PORT
INTA01		EQU	21H		 ; 8259 PORT
EOI		EQU	20H
TIMER		EQU	40H
TIM_CTL 	EQU	43H		 ; 8253 TIMER CONTROL PORT ADDR
TIMER0		EQU	40H		 ; 8253 TIMER/CNTER 0 PORT ADDR
TMINT		EQU	01		 ; TIMER 0 INTR RECVD MASK
DMA08		EQU	08		 ; DMA STATUS REG PORT ADDR
DMA		EQU	00		 ; DMA CHANNEL 0 ADDRESS REG PORT ADDR
MAX_PERIOD	EQU	540H
MIN_PERIOD	EQU	410H
KBD_IN		EQU	60H		 ; KEYBOARD DATA IN ADDR PORT
KBDINT		EQU	02		 ; KEYBOARD INTR MASK
KB_DATA 	EQU	60H		 ; KEYBOARD SCAN CODE PORT
KB_CTL		EQU	61H		 ; CONTROL BITS FOR KEYBOARD SENSE DATA
;--------------------------------
;  8088 INTERRUPT LOCATIONS
;--------------------------------
ABS0		SEGMENT AT 0
STG_LOC0	LABEL	BYTE
		ORG	2*4
NMI_PTR 	LABEL	WORD
		ORG	5*4
INTS_PTR	LABEL	WORD
		ORG	8*4
INT_ADDR	LABEL	WORD
INT_PTR 	LABEL	DWORD
		ORG	10H*4
VIDEO_INT	LABEL	WORD
		ORG	1DH*4
PARM_PTR	LABEL	DWORD		 ; POINTER TO VIDEO PARMS
		ORG	01EH*4		 ; INTERRUPT 1EH
DISK_PTR	LABEL	DWORD
		ORG	01FH*4		 ; LOCATION OF POINTER
EXT_PTR 	LABEL	DWORD		 ; POINTER TO EXTENSION
		ORG	7C00H
BOOT_LOCN	LABEL	FAR
ABS0		ENDS
		PAGE
;--------------------------------
;  STACK -- USED DURING INITIALIZATION ONLY
;--------------------------------
STACK		SEGMENT AT 30H
		DW	128 DUP(?)
TOS		LABEL	WORD
STACK		ENDS
;--------------------------------
;  ROM BIOS DATA AREAS
;--------------------------------
DATA		SEGMENT AT 40H
RS232_BASE	DW	4 DUP(?)	 ; ADDRESSES OF RS232 ADAPTERS
PRINTER_BASE	DW	4 DUP(?)	 ; ADDRESSES OF PRINTERS
EQUIP_FLAG	DW	?		 ; INSTALLED HARDWARE
MFG_TST 	DB	?		 ; INITIALIZATION FLAG
MEMORY_SIZE	DW	?		 ; MEMORY SIZE IN K BYTES
IO_RAM_SIZE	DW	?		 ; MEMORY IN I/O CHANNEL
		PAGE
;-------------------------------
;  KEYBOARD DATA AREAS
;-------------------------------
KB_FLAG 	DB	?
;------ SHIFT FLAG EQUATES WITHIN KB_FLAG
INS_STATE	EQU	80H		 ; INSERT STATE IS ACTIVE
CAPS_STATE	EQU	40H		 ; CAPS LOCK STATE HAS BEEN TOGGLED
NUM_STATE	EQU	20H		 ; NUM LOCK STATE HAS BEEN TOGGLED
SCROLL_STATE	EQU	10H		 ; SCROLL LOCK STATE HAS BEEN TOGGLED
ALT_STATE	EQU	08H		 ; ALTERNATE SHIFT KEY DEPRESSED
CTL_SHIFT	EQU	04H		 ; CONTROL SHIFT KEY DEPRESSED
LEFT_SHIFT	EQU	02H		 ; LEFT SHIFT KEY DEPRESSED
RIGHT_SHIFT	EQU	01H		 ; RIGHT SHIFT KEY DEPRESSED
;-------------------------------
KB_FLAG_1	DB	?		 ; SECOND BYTE OF KEYBOARD STATUS
INS_SHIFT	EQU	80H		 ; INSERT KEY IS DEPRESSED
CAPS_SHIFT	EQU	40H		 ; CAPS LOCK KEY IS DEPRESSED
NUM_SHIFT	EQU	20H		 ; NUM LOCK KEY IS DEPRESSED
SCROLL_SHIFT	EQU	10H		 ; SCROLL LOCK KEY IS DEPRESSED
HOLD_STATE	EQU	08H		 ; SUSPEND KEY HAS BEEN TOGGLED
;-------------------------------
ALT_INPUT	DB	?		 ; STORAGE FOR ALTERNATE KEYPAD ENTRY
BUFFER_HEAD	DW	?		 ; POINTER TO HEAD OF KEYBOARD BUFFER
BUFFER_TAIL	DW	?		 ; POINTER TO TAIL OF KEYBOARD BUFFER
KB_BUFFER	DW	16 DUP(?)	 ; ROOM FOR 15 ENTRIES
KB_BUFFER_END	LABEL	WORD
;------ HEAD = TAIL INDICATES THAT THE BUFFER IS EMPTY
NUM_KEY 	EQU	69		 ; SCAN CODE FOR NUMBER LOCK
SCROLL_KEY	EQU	70		 ; SCROLL LOCK KEY
ALT_KEY 	EQU	56		 ; ALTERNATE SHIFT KEY SCAN CODE
CTL_KEY 	EQU	29		 ; SCAN CODE FOR CONTROL KEY
CAPS_KEY	EQU	58		 ; SCAN CODE FOR SHIFT LOCK
LEFT_KEY	EQU	42		 ; SCAN CODE FOR LEFT SHIFT
RIGHT_KEY	EQU	54		 ; SCAN CODE FOR RIGHT SHIFT
INS_KEY 	EQU	82		 ; SCAN CODE FOR INSERT KEY
DEL_KEY 	EQU	83		 ; SCAN CODE FOR DELETE KEY
		PAGE
;-------------------------------
;   DISKETTE DATA AREAS
;-------------------------------
SEEK_STATUS	DB	?		 ; DRIVE RECALIBRATION STATUS
;					 BIT 3-0 = DRIVE 3-0 NEEDS RECAL BEFORE
;					 NEXT SEEK IF BIT IS = 0
INT_FLAG	EQU	080H		 ; INTERRUPT OCCURRENCE FLAG
MOTOR_STATUS	DB	?		 ; MOTOR STATUS
;			 BIT 3-0 = DRIVE 3-0 IS CURRENTLY RUNNING
;			 BIT 7	 = CURRENT OPERATION IS A WRITE, REQUIRES DELAY
MOTOR_COUNT	DB	?		 ; TIME OUT COUNTER FOR DRIVE TURN OFF
MOTOR_WAIT	EQU	37	   ; TWO SECONDS OF COUNTS FOR MOTOR TURN OFF
;
DISKETTE_STATUS DB	?	   ; SINGLE BYTE OF RETURN CODE INFO FOR STATUS
TIME_OUT	EQU	80H	   ; ATTACHMENT FAILED TO RESPOND
BAD_SEEK	EQU	40H	   ; SEEK OPERATION FAILED
BAD_NEC 	EQU	20H	   ; NEC CONTROLLER HAS FAILED
BAD_CRC 	EQU	10H	   ; BAD CRC ON DISKETTE READ
DMA_BOUNDARY	EQU	09H	   ; ATTEMPT TO DMA ACROSS 64K BOUNDARY
BAD_DMA 	EQU	08H	   ; DMA OVERRUN ON OPERATION
RECORD_NOT_FND	EQU	04H	   ; REQUESTED SECTOR NOT FOUND
WRITE_PROTECT	EQU	03H	   ; WRITE ATTEMPTED ON WRITE PROT DISK
BAD_ADDR_MARK	EQU	02H	   ; ADDRESS MARK NOT FOUND
BAD_CMD 	EQU	01H	   ; BAD COMMAND PASSED TO DISKETTE I/O
;
NEC_STATUS	DB	7 DUP(?)   ; STATUS BYTES FROM NEC
;--------------------------------
;   VIDEO DISPLAY DATA AREA
;--------------------------------
CRT_MODE	DB	?	   ; CURRENT CRT MODE
CRT_COLS	DW	?	   ; NUMBER OF COLUMNS ON SCREEN
CRT_LEN 	DW	?	   ; LENGTH OF REGEN IN BYTES
CRT_START	DW	?	   ; STARTING ADDRESS IN REGEN BUFFER
CURSOR_POSN	DW	8 DUP(?)   ; CURSOR FOR EACH OF UP TO 8 PAGES
CURSOR_MODE	DW	?	   ; CURRENT CURSOR MODE SETTING
ACTIVE_PAGE	DB	?	   ; CURRENT PAGE BEING DISPLAYED
ADDR_6845	DW	?	   ; BASE ADDRESS FOR ACTIVE DISPLAY CARD
CRT_MODE_SET	DB	?	   ; CURRENT SETTING OF THE 3X8 REGISTER
CRT_PALLETTE	DB	?	   ; CURRENT PALLETTE SETTING COLOR CARD
		PAGE
;--------------------------------
;   CASSETTE DATA AREA
;--------------------------------
EDGE_CNT	DW	?	   ; TIME COUNT AT DATA EDGE
CRC_REG 	DW	?	   ; CRC REGISTER
LAST_VAL	DB	?	   ; LAST INPUT VALUE
;--------------------------------
;   TIMER DATA AREA
;--------------------------------
TIMER_LOW	DW	?	   ; LOW WORD OF TIMER COUNT
TIMER_HIGH	DW	?	   ; HIGH WORD OF TIMER COUNT
TIMER_OFL	DB	?	   ; TIMER HAS ROLLED OVER SINCE LAST READ
;COUNTS_SEC	EQU	18
;COUNTS_MIN	EQU	1092
;COUNTS_HOUR	EQU	65543
;COUNTS_DAY	EQU	1573040 = 1800B0H
;-------------------------------
;   SYSTEM DATA AREA
;-------------------------------
BIOS_BREAK	DB	?	   ; BIT 7 = 1 IF BREAK KEY HAS BEEN DEPRESSED
RESET_FLAG	DW	?	   ; WORD = 1234H IF KEYBOARD RESET UNDERWAY
DATA		ENDS
;
;--------------------------------
;   EXTRA DATA AREA
;--------------------------------
XXDATA		SEGMENT AT 50H
STATUS_BYTE	DB	?
XXDATA		ENDS
;
;--------------------------------
;   VIDEO DISPLAY BUFFER
;--------------------------------
VIDEO_RAM	SEGMENT AT 0B800H
REGEN		LABEL	BYTE
REGENW		LABEL	WORD
		DB	16384 DUP(?)
VIDEO_RAM	ENDS
;
;--------------------------------
;   ROM RESIDENT CODE
;--------------------------------
ROMCODE 	SEGMENT AT 0F000H
		DB	57344 DUP(?)		 ; FILL LOWEST 56K
		DB	'5700051 CORP. IBM 1981' ; COPYRIGHT NOTICE
ROMCODE 	ENDS
;
;--------------------------------
;   PROGRAM SEGMENT PREFIX
;--------------------------------
;
PROGRAM 	SEGMENT
INT20		DW			;INT 20 for DOS return
MEMORYSIZE	DW			;TOTAL MEMORY SIZE
CALLDOS_FAR	DB	5 DUP(?)	; LONG CALL DOS DISPATCHER
TERMADDR	DB	4 DUP(?)	; TERMINATE ADDRESS (ip,cs)
CTRLBREAK	DB	4 DUP(?)	; ctrl_break EXIT ADDRESS
RESERVED	DB	4ah DUP(?)	; RESERVED AREA
FCB_ONE 	DB	10H DUP(?)	; unopened fcb #1
FCB_TWO 	DB	10H DUP(?)	; unopened fcb #2
PARM_LENGTH	DB			; LENGTH OF PARAMETERS
PARM_FIELD	DB	19 DUP(?)	; PARAMETER STRING DATA
;
		SUBTTL
		PAGE
		ORG	100H		; DEFAULT ENTRY ADDRESS
PROGRAM_ENTRY	EQU	$
ning with hex-F are ignored
;
	 PUSH	 ES