	Page	58,132
	Title	HARDWARE.ASM	Hardware Page Access Routines
;******************************************************************************
;
;   Name:	HARDWARE.ASM	Hardware Page Access Routines
;
;   Group:	Emulator
;
;   Revision:	1.00
;
;   Date:	January 30, 1988
;
;   Author:	Randy W. Spurlock
;
;******************************************************************************
;
;  Module Functional Description:
;
;		This module contains all the code for the Apple hardware
;	page access routines.
;
;******************************************************************************
;
;  Changes:
;
;    DATE     REVISION				DESCRIPTION
;  --------   --------	-------------------------------------------------------
;   1/30/88	1.00	Original
;
;******************************************************************************
	Page
;
;  Public Declarations
;
	Public	Hardware_Read		; Hardware page read routine
	Public	Hardware_Write		; Hardware page write routine
	Public	Utility_Strobe		; Apple utility strobe routine
	Public	Output_0_Off		; Annunciator output 0 off routine
	Public	Output_0_On		; Annunciator output 0 on routine
	Public	Output_1_Off		; Annunciator output 1 off routine
	Public	Output_1_On		; Annunciator output 1 on routine
	Public	Output_2_Off		; Annunciator output 2 off routine
	Public	Output_2_On		; Annunciator output 2 on routine
	Public	Output_3_Off		; Annunciator output 3 off routine
	Public	Output_3_On		; Annunciator output 3 on routine
	Public	Do_Nothing		; Do nothing routine
;
;  External Declarations
;
	Extrn	Slot_Read:Word		; Expansion slot read table	 (DATA)
	Extrn	Slot_Write:Word 	; Expansion slot write table	 (DATA)
	Extrn	IO_Read_Table:Word	; I/O read table		 (DATA)
	Extrn	IO_Write_Table:Word	; I/O write table		 (DATA)
	Extrn	Current_Slot:Byte	; Current active slot number	 (DATA)
;
;  LOCAL Equates
;
CARD_MASK	Equ	07h		; Card slot mask value
;
;  Define any include files needed
;
	Include 	Macros.inc	; Include the macro definitions
	Include 	Equates.inc	; Include the equate definitions
	.286c				; Include 80286 instructions
	Page
;
;  Define the emulator code segment
;
Emulate Segment Word Public 'EMULATE'   ; Emulator code segment
	Assume	cs:Emulate, ds:Nothing, es:Nothing
	Subttl	Hardware_Read	Hardware Page Read
	Page	+
;******************************************************************************
;
;	Hardware_Read(Effective_Address)
;
;		If this is a card slot I/O access
;			Isolate the card slot number
;			Update the current active slot number
;			Jump to correct routine to process
;		Else this is NOT card slot I/O
;			Isolate the memory location address
;			Jump to correct routine to process
;		Endif
;		Return to the caller (Never executed)
;
;	Registers on Entry:
;
;		DS:DI - 65C02 Effective address
;
;	Registers on Exit:
;
;		BP    - Destroyed
;
;******************************************************************************
		Even			; Force procedure to even address
Hardware_Read	Proc	Near		; Hardware page read procedure
	mov	ax,di			; Get the effective address
	or	al,al			; Check for card slot I/O
	js	Card_Read		; Jump if this is card slot I/O
	xor	ah,ah			; Convert address to full word
	shl	ax,1			; Convert address to table index
	mov	bp,ax			; Setup to jump to correct routine
	jmp	cs:[bp + IO_Read_Table] ; Jump to correct routine to process
Card_Read:
	shr	al,4			; Right justify the card slot value
	and	al,CARD_MASK		; Mask off all but card slot value
	mov	cs:[Current_Slot],al	; Update the current active slot
	xor	ah,ah			; Convert slot number to full word
	shl	ax,1			; Convert slot number to table index
	mov	bp,ax			; Setup to jump to correct routine
	jmp	cs:[bp + Slot_Read]	; Jump to correct routine to process
	ret				; Return to the caller (Never Executed)
Hardware_Read	Endp			; End of the Hardware_Read procedure
	Subttl	Hardware_Write	Hardware Page Write
	Page	+
;******************************************************************************
;
;	Hardware_Write(Effective_Address, Value)
;
;		Save the required registers
;		If this is a card slot I/O access
;			Isolate the card slot number
;			Update the current active slot number
;			Restore the required registers
;			Jump to correct routine to process
;		Else this is NOT card slot I/O
;			Isolate the memory location address
;			Restore the required registers
;			Jump to correct routine to process
;		Endif
;		Return to the caller (Never executed)
;
;	Registers on Entry:
;
;		AL    - Memory value
;		DS:DI - 65C02 Effective address
;
;	Registers on Exit:
;
;		BP    - Destroyed
;
;******************************************************************************
		Even			; Force procedure to even address
Hardware_Write	Proc	Near		; Hardware page write procedure
	Save	ax			; Save the required registers
	mov	ax,di			; Get the effective address
	or	al,al			; Check for card slot I/O
	js	Card_Write		; Jump if this is card slot I/O
	xor	ah,ah			; Convert address to full word
	shl	ax,1			; Convert address to table index
	mov	bp,ax			; Setup to jump to correct routine
	Restore ax			; Restore the required registers
	jmp	cs:[bp + IO_Write_Table]; Jump to correct routine to process
Card_Write:
	shr	al,4			; Right justify the card slot value
	and	al,CARD_MASK		; Mask off all but card slot value
	mov	cs:[Current_Slot],al	; Update the current active slot
	xor	ah,ah			; Convert slot number to full word
	shl	ax,1			; Convert slot number to table index
	mov	bp,ax			; Setup to jump to correct routine
	Restore ax			; Restore the required registers
	jmp	cs:[bp + Slot_Write]	; Jump to correct routine to process
	ret				; Return to the caller (Never Executed)
Hardware_Write	Endp			; End of the Hardware_Write procedure
	Subttl	Utility_Strobe	Apple Utility Strobe Routine
	Page	+
;******************************************************************************
;
;	Utility_Strobe()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Utility_Strobe	Proc	Near		; Utility strobe procedure

	ret				; Return to the caller
Utility_Strobe	Endp			; End of the Utility_Strobe procedure
	Subttl	Output_0_Off	Annunciator Output 0 Off Routine
	Page	+
;******************************************************************************
;
;	Output_0_Off()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_0_Off	Proc	Near		; Annunciator output 0 off procedure

	ret				; Return to the caller
Output_0_Off	Endp			; End of the Output_0_Off procedure
	Subttl	Output_0_On	Annunciator Output 0 On Routine
	Page	+
;******************************************************************************
;
;	Output_0_On()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_0_On	Proc	Near		; Annunciator output 0 on procedure

	ret				; Return to the caller
Output_0_On	Endp			; End of the Output_0_On procedure
	Subttl	Output_1_Off	Annunciator Output 1 Off Routine
	Page	+
;******************************************************************************
;
;	Output_1_Off()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_1_Off	Proc	Near		; Annunciator output 1 off procedure

	ret				; Return to the caller
Output_1_Off	Endp			; End of the Output_1_Off procedure
	Subttl	Output_1_On	Annunciator Output 1 On Routine
	Page	+
;******************************************************************************
;
;	Output_1_On()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_1_On	Proc	Near		; Annunciator output 1 on procedure

	ret				; Return to the caller
Output_1_On	Endp			; End of the Output_1_On procedure
	Subttl	Output_2_Off	Annunciator Output 2 Off Routine
	Page	+
;******************************************************************************
;
;	Output_2_Off()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_2_Off	Proc	Near		; Annunciator output 2 off procedure

	ret				; Return to the caller
Output_2_Off	Endp			; End of the Output_2_Off procedure
	Subttl	Output_2_On	Annunciator Output 2 On Routine
	Page	+
;******************************************************************************
;
;	Output_2_On()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_2_On	Proc	Near		; Annunciator output 2 on procedure

	ret				; Return to the caller
Output_2_On	Endp			; End of the Output_2_On procedure
	Subttl	Output_3_Off	Annunciator Output 3 Off Routine
	Page	+
;******************************************************************************
;
;	Output_3_Off()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_3_Off	Proc	Near		; Annunciator output 3 off procedure

	ret				; Return to the caller
Output_3_Off	Endp			; End of the Output_3_Off procedure
	Subttl	Output_3_On	Annunciator Output 3 On Routine
	Page	+
;******************************************************************************
;
;	Output_3_On()
;
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Output_3_On	Proc	Near		; Annunciator output 3 on procedure

	ret				; Return to the caller
Output_3_On	Endp			; End of the Output_3_On procedure
	Subttl	Do_Nothing	Do nothing Routine
	Page	+
;******************************************************************************
;
;	Do_Nothing()
;
;		Return to the caller
;
;	Registers on Entry:
;
;		None
;
;	Registers on Exit:
;
;		None
;
;******************************************************************************
		Even			; Force procedure to even address
Do_Nothing	Proc	Near		; Do nothing procedure
	ret				; Return to the caller
Do_Nothing	Endp			; End of the Do_Nothing procedure
;******************************************************************************
;
;	Define the end of the Emulator Code Segment
;
;******************************************************************************
Emulate Ends
	End				; End of the Hardware module
