Metropoli BBS
VIEWER: outchip.asm MODE: TEXT (ASCII)
; OUTCHIP.ASM

; Adlib Inc, 20-avr-89


  INCLUDE VERSION.INC      ;*** compilation flags are defined in this file ***

  IF MICROSOFT
	INCLUDE CMICRO.MAC     ;memory model & equates for Microsoft environment
  ELSE
	INCLUDE DOS.MAC        ;memory model & equates for Lattice environment
  ENDIF

  INCLUDE COMMON.MAC       ;macros common to both environments


; ========================= DATA SEGMENT =========================
; data segment
	DSEG
IF MICROSOFT
extrn   _genAddr:WORD        ; address of sound chip.
  ELSE
extrn   genAddr:WORD         ; address of sound chip.
  ENDIF
	ENDDS



;========================== CODE SEGMENT ============================

  IF MICROSOFT
	PSEG  <TIMER>
  ELSE
	PSEG
  ENDIF



; void SndOutput( addr, dataVal)
;	int addr, dataVal;
;
;	Set the register at address 'addr' to the value 'data'.
;	Take care of data register to data register write delay.

BEGIN SndOutput
SO_F struc
	dw	(?)	; old bp
	db	CPSIZE DUP (?)	; return addr
addr	dw	(?)	; register adress in sound chip
dataVal	dw	(?)	; data to be written
SO_F ends

; AX & DX lost.

	push	bp
	mov	bp, sp

IF MICROSOFT
	mov dx, _genAddr ; get address register of sound chip
ELSE
	mov dx, genAddr ; get address register of sound chip
ENDIF
	mov	ax, [ bp].addr
	out	dx, al

; 12 cyles delay ( 3.6 Mhz )
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx

	inc	dx		; get data reg. of sound chip
	mov	ax, [ bp].dataVal
	out	dx, al
	dec dx

; 84 cyles delay ( 3.6 Mhz )
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx

	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx

	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx

	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx
	in	al, dx

	pop	bp
	ret

P_END SndOutput

  IF MICROSOFT
	ENDPS  <TIMER>
  ELSE
	ENDPS
  ENDIF

	end


[ RETURN TO DIRECTORY ]