PofoWiki

Die ultimative Informationsquelle zum ATARI Portfolio

Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:doku:techrefguide:anhangc

Dies ist eine alte Version des Dokuments!


ANHANG C: Beispiel einer Peripherieschaltung

Zur Illustrierung einer Atari Portfolio typischen Erweiterung haben wir eine Erweiterung entwickelt die eine LED bei jedem System-Tick aufleuchten lässt. Um dem Benutzer die Funktionsweise transparent darstellen zu können haben wir eine ROM-Extension verwendet.

SPEZIFIKATIONEN DER ERWEITERUNG

  • eine einzige LED die im System-Takt blinkt
  • mit einer PID von 64H
  • mit sämtlicher Software auf einem Extension-ROM
  • Nur bei eingeschaltenem Gerät betreibbar
  • als Terminating Peripheral
  • Erweiterung schaltet sich mit ausgeschaltener LED ein

Hardwareentwicklung (siehe Schaltplan und Abschnitte 2.6 und 2.7)

  • es ist eine Dekodierlogik vorhanden um die PID in 807FH einzulesen. (Da es nicht nötig ist festzustellen ob die LED an ist, wird der Latch für eienen Schreibvorgang in 807FH dekodiert um Dekodier-Logik zu sparen.)
  • jeder weitere Schreibvorgang in 807FH schaltet die LED ein oder aus
  • Wenn der Latch gesetzt ist leuchtet die LED
  • Wenn der Latch zurückgesetzt wird geht die LED aus
  • Die Schaltung wird von 5VS gespeißt
  • Die Puffersignale ABUF/BBUF und PDET werden ebenfalls benutzt

Softwareentwicklung (siehe PDEM.ASM)

  • Es wird eine ROM-Extension verwendet um ein TSR in den Int 1CH zu hängen
  • Jeder Aufruf von Int 1CH wird durch Schreiben in I/O 807FH die LED ein- oder ausschalten
  • Das TSR deinstalliert sich selbst wenn die Erweiterung entfernt wird
  • Es wird vorausgesetzt, dass biem Einschlaten die LED zurückgesetzt wird

ROM-Extensions (siehe XROM.ASM)

Dieses Programm illustriert wie eine einfache ROM-Extension entwickelt wird. Es kann entweder als spezifische BIOS, DOS, oder als allgemeine Erweiterung dienen, dem ID-Code bei 0C000:0 entsprechend. Jedes Erweiterungsmodul gibt sich zu erkennen und wo es aufgerufen wurde. Es ist eine gute Ausführung um die Möglichkeiten der ROM-Extensions darzustellen.

Anmerkung: ROM-Extensions dürfen AL niemals mit einem Wert von 0 zurücklassen. Dieser Gebrauch ist Atari und DIP vorbehalten.

Beispiel Erweiterung

;***************************************************************;
;								;
;	Module:		PDEM.ASM				;
;	Copyright:	DIP Ltd, 1989				;
;								;
;	DIP Pocket PC Peripheral ROM Extension			;
;								;
;***************************************************************;
 
name		XROM
 
		assume	cs:cseg,ds:dseg
 
DOSX		equ	055aaH			;Specific DOS extension
 
cseg		segment
 
		org	0H			;Extension Vector table
 
xrom_main	label	near			;Start label for MASM
 
bixt_type	dw	DOSX			;Identification code
 
bixt_size	db	0			;Num 512 byte blocks in ROM
 
		org	3H
bixt_gdos	label	byte			;Specific DOS extension
		jmp	genx_vect		;Specific extension vector
 
		org	40H
bixt_user	label	byte			;OEM user text
		db	'Crt Plant Periph'
 
		;The plan is to allocate some memory, Copy a section
		; of code to memory, and then point the Specified
		; vector to that code.
 
xrom_proc	proc	FAR
 
INTR_NUMB	equ	1cH			;TIMER TICK
 
genx_vect	label	near
 
		push	ax			;Preserve registers
		push	bx			; required to set up
		push	ds			; local stack
 
		;Allocate User RAM. Note that this can ONLY be done
		; after DOS initialisation.
 
		mov	bx,(ALOC_SIZE+0fH)/10H	;Paras to allocate
		mov	ah,48H			;Allocate memory
		int	21H
 
		mov	ds,ax			;Set DS to allocated RAM
		mov	stak_save,ss		;Preserve Caller stack
		mov	stak_save+2,sp
 
		shl	bx,1			;Convert size to bytes
		shl	bx,1
		shl	bx,1
		shl	bx,1
 
		;Set up User stack.
 
		mov	ss,ax			;Set up stack at top
		mov	sp,bx			; of allocated memory
 
		push	cx			;Preserve registers
		push	dx			; YOU MUST ALWAYS PRESERVE
		push	si			; ALL USER REGS
		push	di
		push	bp
		push	es
 
		;Copy the ISR to the allocated area
 
		push	ds			;Preserve DS
 
		push	cs			;Set up Source
		pop	ds
		mov	si,offset tick_code
 
		push	ss			;Set up destination
		pop	es
		mov	di,offset load_base
 
		mov	cx,CODE_SIZE		;Bytes to copy
		cld				;Initialise flag
		rep	movsb			;Copy TSR to RAM
 
		pop	ds			;Restore DS
 
		;Get the specified vector, and set it to the ISR
 
		mov	ax,3500H+INTR_NUMB	;Get current Int 1CH
		int	21H
 
		mov	tick_vect,bx		;Preserve vector
		mov	tick_vect+2,es
 
		mov	ax,2500H+INTR_NUMB	;Set interrupt vector
		mov	dx,offset load_base
		int	21H
 
		mov	ax,1501H		;Generate Confidence BEEP
		int	61H
 
		pop	es			;Restore registers
		pop	bp
		pop	di
		pop	si
		pop	dx
		pop	cx
 
		mov	ss,stak_save		;Restore Caller STACK
		mov	sp,stak_save+2
 
		pop	ds			;Restore remaining regs
		pop	bx
		pop	ax
 
		ret				;FAR return to caller
 
xrom_proc	endp
 
		;Interrupt Service Routine (ISR)
 
PID_CODE	equ	64H			;Peripheral PID code
LEDS_PORT	equ	807fH			;LEDs I/O address
 
tick_code	label	byte			;TSR code
 
		push	ax			;Preserve registers
		push	dx
		push	bx
		push	ds
		push	es
 
		mov	ah,1aH			;Get Peripheral PID
		int	61H
		or	al,al			;Peripheral installed?
		jz	tick_none		;No, so uninstall
 
		cmp	ah,PID_CODE		;Correct peripheral?
		jne	tick_none		;No, so uninstall
 
		;Peripheral installed, so toggle LEDs
 
		mov	dx,LEDS_PORT		;Toggle LED address
		out	dx,al			;AL unimportant
		jmp	short tick_exit		;Exit
tick_none:
		assume	cs:dseg			;Force DSEG offset
 
		;Invalid Peripheral, so uninstall TSR
 
		mov	ax,2500H+INTR_NUMB	;Set interrupt vector
		mov	bx,offset tick_vect	;Get old vector
		mov	ds,cs:[bx+2]
		mov	dx,cs:[bx]
		int	21H
 
		;Now vector reset, free allocated memory
 
		push	cs			;Segment of block
		pop	es
		mov	ah,49H			;Free memory
		int	21H
tick_exit:
		pop	es			;Restore registers
		pop	ds
		pop	dx
		pop	bx
		pop	ax
 
		jmp	dword ptr cs:tick_vect	;Jump to old TSR
 
CODE_SIZE	equ	$-tick_code		;Size of ISR
 
cseg		ends
 
		;Data segment TEMPLATE (No initialised data here!)
 
dseg		segment
 
data_sptr	label	byte			;Start of Data
 
stak_save	dw	?			;Caller stack stored here
		dw	?
 
tick_vect	dw	?			;Old vector stored here
		dw	?
 
load_base	label	byte			;Start of ISR
 
LOAD_SIZE	equ	($-data_sptr)+CODE_SIZE	;Load module size
ALOC_SIZE	equ	LOAD_SIZE+100H		;Load module + Stack
 
dseg		ends
 
		end	xrom_main








;***************************************************************;
;								;
;	Module:		XROM.ASM				;
;	Copyright:	DIP Ltd, 1989				;
;								;
;	DIP Pocket PC ROM Extension DEMO program		;
;								;
;								;
;	A ROM extension may be run from a Credit Card Memory	;
;	or an Extension ROM.					;
;								;
;	The Extension code must preserve ALL registers! 	;
;								;
;	The Pre-BIOS vector MUST return by a FAR JMP to 	;
;	0FFFE:0, as no stack is set up at this stage		;
;								;
;***************************************************************;
 
name		XROM
 
		assume	cs:cseg
 
LF		equ	0aH			;Line feed
CR		equ	0dH			;Carriage return
 
BIOX		equ	0aa55H			;Specific BIOS extension
DOSX		equ	055aaH			;Specific DOS extension
BIDO		equ	05555H			;Complete control
 
cseg		segment
 
		org	0H			;Extension Vector table
 
xrom_main	label	near
 
bixt_type	dw	BIOX			;Identification code
 
bixt_size	db	0			;Num 512 byte blocks in ROM
 
		org	3H
bixt_gbio	label	byte			;Specific BIOS extension
bixt_gdos	label	byte			;Specific DOS extension
		jmp	genx_vect		;Specific extension vector
 
		org	40H
bixt_user	label	byte			;OEM user text
		db	'Test ROM (C) DIP'
 
		org	50H
bixt_preb:	jmp	preb_vect		;Pre-bios jmp vector
 
		org	55H
bixt_bext:	jmp	bext_vect		;Bios-ext jmp vector
 
		org	5aH
bixt_pdos:	jmp	pdos_vect		;Pre-dos jmp vector
 
		org	5fH
bixt_dext:	jmp	dext_vect		;Dos-ext jmp vector
 
		org	64H
bixt_ados:	jmp	ados_vect		;Post-dos jmp vector
 
		org	69H
bixt_pwdn:	jmp	pwdn_vect		;Power down jmp vector
 
		org	6eH
bixt_pwup:	jmp	pwup_vect		;Power up jmp vector
 
xrom_proc	proc	FAR
 
		;Determine extension type
 
genx_vect	label	near
 
		push	bp			;Preserve BP
 
		cmp	cs:[0],BIOX		;Specific BIOS extension ?
		jne	not_genb		;No
 
		mov	bp,offset gbio_text	;Specific BIOS extn text
		jmp	short xrom_disp
not_genb:
		cmp	cs:[0],DOSX		;Specific DOS extension ?
		jne	not_gend		;No
 
		mov	bp,offset gdos_text	;Specific DOS extn text
		jmp	short xrom_disp
not_gend:
		mov	bp,offset invl_text	;Invalid text
		jmp	short xrom_disp
 
 
preb_vect	label	near
 
		jmp	dword ptr cs:preb_retn	;Pre-BIOS extension
 
preb_retn	dw	0
		dw	0fffeH
 
bext_vect	label	near			;Post-BIOS extension
 
		push	bp
		mov	bp,offset bext_text
		jmp	short xrom_disp
 
pdos_vect	label	near			;Pre-DOS extension
 
		push	bp
		mov	bp,offset pdos_text
		jmp	short xrom_disp
 
dext_vect	label	near			;DOS extension
 
		push	bp
		mov	bp,offset dext_text
		jmp	short xrom_disp
 
ados_vect	label	near			;Post-DOS extension
 
		push	bp
		mov	bp,offset ados_text
		jmp	short xrom_disp
 
pwdn_vect	label	near			;Power-Down extension
 
		push	bp
		mov	bp,offset pwdn_text
		jmp	short xrom_disp
 
pwup_vect	label	near			;Power-Up extension
 
		push	bp
		mov	bp,offset pwup_text
		jmp	short xrom_disp
 
xrom_disp	label	near			;Main display routine
 
		push	ax			;Preserve registers
		push	bx
		push	cx
		push	dx
		push	es
 
		call	disp_text		;Display text in BP
 
		mov	ax,2400H		;Get ROM state
		int	61H
 
		or	dl,dl			;Normal ROM ?
		jnz	not_norm		;No, so skip
 
		mov	bp,offset norm_text	;Get normal ROM text
		jmp	short stat_disp
not_norm:
		dec	dl			;Drive A ?
		jnz	not_drva		;No, so skip
 
		mov	bp,offset drva_text	;Get Drive A text
		jmp	short stat_disp
not_drva:
		dec	dl			;Drive B ?
		jnz	not_drvb		;No, so skip
 
		mov	bp,offset drvb_text	;Get Drive B text
		jmp	short stat_disp
not_drvb:
		dec	dl			;Drive B ?
		jnz	not_xrom		;No, so skip
 
		mov	bp,offset xrom_text	;Get Drive B text
		jmp	short stat_disp
not_xrom:
		mov	bp,offset invl_text
stat_disp:
		call	disp_text		;Display text in BP
 
		mov	bp,offset crlf_text	;Finally CR, LF
		call	disp_text
 
		pop	es			;Restore registers
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		pop	bp
 
		ret				;FAR return
 
xrom_proc	endp
 
;***************************************************************;
;								;
;	Main Display routine					;
;								;
;***************************************************************;
 
disp_text	proc	near
 
		xor	bh,bh			;Page 0
		mov	ah,3			;Get cursor position in DX
		int	10H
 
		push	cs			;Access text
		pop	es
 
		xor	ch,ch			;Initialise
		mov	cl,es:[bp]		;Get length
		inc	bp			;Advance to text
 
		mov	ax,1301H		;Write string
		int	10H
 
		ret
 
disp_text	endp
 
gbio_text	db	gdos_text-$-1
		db	'Spec BIOS Extension - '
 
gdos_text	db	bext_text-$-1
		db	'Spec DOS  Extension - '
 
bext_text	db	pdos_text-$-1
		db	'Com BIOS Extension - '
 
pdos_text	db	dext_text-$-1
		db	'Pre-DOS  Extension - '
 
dext_text	db	ados_text-$-1
		db	'Com DOS  Extension - '
 
ados_text	db	pwdn_text-$-1
		db	'Post-DOS Extension - '
 
pwdn_text	db	pwup_text-$-1
		db	'Power Down Extension - '
 
pwup_text	db	norm_text-$-1
		db	'Power Up Extension - '
 
norm_text	db	drva_text-$-1
		db	'Normal ROM'
 
drva_text	db	drvb_text-$-1
		db	'CCM Drive A'
 
drvb_text	db	xrom_text-$-1
		db	'CCM Drive B'
 
xrom_text	db	invl_text-$-1
		db	'Extn ROM'
 
invl_text	db	crlf_text-$-1
		db	'Invalid'
 
crlf_text	db	2,CR,LF
 
cseg		ends
		end	xrom_main
hardware/doku/techrefguide/anhangc.1185486301.txt.gz · Zuletzt geändert: 19/09/2007 00:09 (Externe Bearbeitung)