===== 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 eingeschaltetem Gerät betreibbar * als Terminating Peripheral * Erweiterung schaltet sich mit ausgeschalteter 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 einen 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 gespeist * 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 Einschalten 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.\\ {{:hardware:doku:techrefguide:periphexamp.jpg|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