hardware:doku:techrefguide:anhangc
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
hardware:doku:techrefguide:anhangc [19/09/2007 21:09] – typo uxt | hardware:doku:techrefguide:anhangc [Unbekanntes Datum] (aktuell) – Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ===== 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, | ||
+ | |||
+ | |||
+ | === 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.\\ | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | <code asm> | ||
+ | |||
+ | ; | ||
+ | ; ; | ||
+ | ; | ||
+ | ; | ||
+ | ; ; | ||
+ | ; DIP Pocket PC Peripheral ROM Extension ; | ||
+ | ; ; | ||
+ | ; | ||
+ | |||
+ | name XROM | ||
+ | |||
+ | assume cs: | ||
+ | |||
+ | DOSX equ 055aaH ; | ||
+ | |||
+ | cseg segment | ||
+ | |||
+ | org 0H ; | ||
+ | |||
+ | xrom_main label near ; | ||
+ | |||
+ | bixt_type dw DOSX ; | ||
+ | |||
+ | bixt_size db 0 ; | ||
+ | |||
+ | org 3H | ||
+ | bixt_gdos label byte ; | ||
+ | jmp genx_vect ; | ||
+ | |||
+ | org 40H | ||
+ | bixt_user label byte ; | ||
+ | db ' | ||
+ | |||
+ | ;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 ; | ||
+ | |||
+ | genx_vect label near | ||
+ | |||
+ | push ax ; | ||
+ | push bx ; | ||
+ | push ds ; | ||
+ | |||
+ | ;Allocate User RAM. Note that this can ONLY be done | ||
+ | ; after DOS initialisation. | ||
+ | |||
+ | mov bx, | ||
+ | mov ah, | ||
+ | int 21H | ||
+ | |||
+ | mov ds, | ||
+ | mov stak_save, | ||
+ | mov stak_save+2, | ||
+ | |||
+ | shl bx, | ||
+ | shl bx,1 | ||
+ | shl bx,1 | ||
+ | shl bx,1 | ||
+ | |||
+ | ;Set up User stack. | ||
+ | |||
+ | mov ss, | ||
+ | mov sp, | ||
+ | |||
+ | push cx ; | ||
+ | push dx ; | ||
+ | push si ; | ||
+ | push di | ||
+ | push bp | ||
+ | push es | ||
+ | |||
+ | ;Copy the ISR to the allocated area | ||
+ | |||
+ | push ds ; | ||
+ | |||
+ | push cs ; | ||
+ | pop ds | ||
+ | mov si, | ||
+ | |||
+ | push ss ; | ||
+ | pop es | ||
+ | mov di, | ||
+ | |||
+ | mov cx, | ||
+ | cld ; | ||
+ | rep movsb ; | ||
+ | |||
+ | pop ds ; | ||
+ | |||
+ | ;Get the specified vector, and set it to the ISR | ||
+ | |||
+ | mov ax, | ||
+ | int 21H | ||
+ | |||
+ | mov tick_vect, | ||
+ | mov tick_vect+2, | ||
+ | |||
+ | mov ax, | ||
+ | mov dx, | ||
+ | int 21H | ||
+ | |||
+ | mov ax, | ||
+ | int 61H | ||
+ | |||
+ | pop es ; | ||
+ | pop bp | ||
+ | pop di | ||
+ | pop si | ||
+ | pop dx | ||
+ | pop cx | ||
+ | |||
+ | mov ss, | ||
+ | mov sp, | ||
+ | |||
+ | pop ds ; | ||
+ | pop bx | ||
+ | pop ax | ||
+ | |||
+ | ret ; | ||
+ | |||
+ | xrom_proc endp | ||
+ | |||
+ | ; | ||
+ | |||
+ | PID_CODE equ 64H ; | ||
+ | LEDS_PORT equ 807fH ; | ||
+ | |||
+ | tick_code label byte ; | ||
+ | |||
+ | push ax ; | ||
+ | push dx | ||
+ | push bx | ||
+ | push ds | ||
+ | push es | ||
+ | |||
+ | mov ah, | ||
+ | int 61H | ||
+ | or al, | ||
+ | jz tick_none ; | ||
+ | |||
+ | cmp ah, | ||
+ | jne tick_none ; | ||
+ | |||
+ | ; | ||
+ | |||
+ | mov dx, | ||
+ | out dx, | ||
+ | jmp short tick_exit ; | ||
+ | tick_none: | ||
+ | assume cs: | ||
+ | |||
+ | ;Invalid Peripheral, so uninstall TSR | ||
+ | |||
+ | mov ax, | ||
+ | mov bx, | ||
+ | mov ds, | ||
+ | mov dx, | ||
+ | int 21H | ||
+ | |||
+ | ;Now vector reset, free allocated memory | ||
+ | |||
+ | push cs ; | ||
+ | pop es | ||
+ | mov ah, | ||
+ | int 21H | ||
+ | tick_exit: | ||
+ | pop es ; | ||
+ | pop ds | ||
+ | pop dx | ||
+ | pop bx | ||
+ | pop ax | ||
+ | |||
+ | jmp dword ptr cs: | ||
+ | |||
+ | CODE_SIZE equ $-tick_code ; | ||
+ | |||
+ | cseg ends | ||
+ | |||
+ | ;Data segment TEMPLATE (No initialised data here!) | ||
+ | |||
+ | dseg segment | ||
+ | |||
+ | data_sptr label byte ; | ||
+ | |||
+ | stak_save dw ? | ||
+ | dw ? | ||
+ | |||
+ | tick_vect dw ? | ||
+ | dw ? | ||
+ | |||
+ | load_base label byte ; | ||
+ | |||
+ | LOAD_SIZE equ ($-data_sptr)+CODE_SIZE ; | ||
+ | ALOC_SIZE equ LOAD_SIZE+100H ; | ||
+ | |||
+ | dseg ends | ||
+ | |||
+ | end xrom_main | ||
+ | |||
+ | </ | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | <code asm> | ||
+ | |||
+ | ; | ||
+ | ; ; | ||
+ | ; | ||
+ | ; | ||
+ | ; ; | ||
+ | ; 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: | ||
+ | |||
+ | LF equ 0aH ; | ||
+ | CR equ 0dH ; | ||
+ | |||
+ | BIOX equ 0aa55H ; | ||
+ | DOSX equ 055aaH ; | ||
+ | BIDO equ 05555H ; | ||
+ | |||
+ | cseg segment | ||
+ | |||
+ | org 0H ; | ||
+ | |||
+ | xrom_main label near | ||
+ | |||
+ | bixt_type dw BIOX ; | ||
+ | |||
+ | bixt_size db 0 ; | ||
+ | |||
+ | org 3H | ||
+ | bixt_gbio label byte ; | ||
+ | bixt_gdos label byte ; | ||
+ | jmp genx_vect ; | ||
+ | |||
+ | org 40H | ||
+ | bixt_user label byte ; | ||
+ | db ' | ||
+ | |||
+ | org 50H | ||
+ | bixt_preb: | ||
+ | |||
+ | org 55H | ||
+ | bixt_bext: | ||
+ | |||
+ | org 5aH | ||
+ | bixt_pdos: | ||
+ | |||
+ | org 5fH | ||
+ | bixt_dext: | ||
+ | |||
+ | org 64H | ||
+ | bixt_ados: | ||
+ | |||
+ | org 69H | ||
+ | bixt_pwdn: | ||
+ | |||
+ | org 6eH | ||
+ | bixt_pwup: | ||
+ | |||
+ | xrom_proc proc FAR | ||
+ | |||
+ | ; | ||
+ | |||
+ | genx_vect label near | ||
+ | |||
+ | push bp ; | ||
+ | |||
+ | cmp cs: | ||
+ | jne not_genb ; | ||
+ | |||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | not_genb: | ||
+ | cmp cs: | ||
+ | jne not_gend ; | ||
+ | |||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | not_gend: | ||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | |||
+ | |||
+ | preb_vect label near | ||
+ | |||
+ | jmp dword ptr cs: | ||
+ | |||
+ | preb_retn dw 0 | ||
+ | dw 0fffeH | ||
+ | |||
+ | bext_vect label near ; | ||
+ | |||
+ | push bp | ||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | |||
+ | pdos_vect label near ; | ||
+ | |||
+ | push bp | ||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | |||
+ | dext_vect label near ; | ||
+ | |||
+ | push bp | ||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | |||
+ | ados_vect label near ; | ||
+ | |||
+ | push bp | ||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | |||
+ | pwdn_vect label near ; | ||
+ | |||
+ | push bp | ||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | |||
+ | pwup_vect label near ; | ||
+ | |||
+ | push bp | ||
+ | mov bp, | ||
+ | jmp short xrom_disp | ||
+ | |||
+ | xrom_disp label near ; | ||
+ | |||
+ | push ax ; | ||
+ | push bx | ||
+ | push cx | ||
+ | push dx | ||
+ | push es | ||
+ | |||
+ | call disp_text ; | ||
+ | |||
+ | mov ax, | ||
+ | int 61H | ||
+ | |||
+ | or dl, | ||
+ | jnz not_norm ; | ||
+ | |||
+ | mov bp, | ||
+ | jmp short stat_disp | ||
+ | not_norm: | ||
+ | dec dl ; | ||
+ | jnz not_drva ; | ||
+ | |||
+ | mov bp, | ||
+ | jmp short stat_disp | ||
+ | not_drva: | ||
+ | dec dl ; | ||
+ | jnz not_drvb ; | ||
+ | |||
+ | mov bp, | ||
+ | jmp short stat_disp | ||
+ | not_drvb: | ||
+ | dec dl ; | ||
+ | jnz not_xrom ; | ||
+ | |||
+ | mov bp, | ||
+ | jmp short stat_disp | ||
+ | not_xrom: | ||
+ | mov bp, | ||
+ | stat_disp: | ||
+ | call disp_text ; | ||
+ | |||
+ | mov bp, | ||
+ | call disp_text | ||
+ | |||
+ | pop es ; | ||
+ | pop dx | ||
+ | pop cx | ||
+ | pop bx | ||
+ | pop ax | ||
+ | pop bp | ||
+ | |||
+ | ret ; | ||
+ | |||
+ | xrom_proc endp | ||
+ | |||
+ | ; | ||
+ | ; ; | ||
+ | ; Main Display routine ; | ||
+ | ; ; | ||
+ | ; | ||
+ | |||
+ | disp_text proc near | ||
+ | |||
+ | xor bh, | ||
+ | mov ah, | ||
+ | int 10H | ||
+ | |||
+ | push cs ; | ||
+ | pop es | ||
+ | |||
+ | xor ch, | ||
+ | mov cl, | ||
+ | inc bp ; | ||
+ | |||
+ | mov ax, | ||
+ | int 10H | ||
+ | |||
+ | ret | ||
+ | |||
+ | disp_text endp | ||
+ | |||
+ | gbio_text db gdos_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | gdos_text db bext_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | bext_text db pdos_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | pdos_text db dext_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | dext_text db ados_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | ados_text db pwdn_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | pwdn_text db pwup_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | pwup_text db norm_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | norm_text db drva_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | drva_text db drvb_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | drvb_text db xrom_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | xrom_text db invl_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | invl_text db crlf_text-$-1 | ||
+ | db ' | ||
+ | |||
+ | crlf_text db 2, | ||
+ | |||
+ | cseg ends | ||
+ | end xrom_main | ||
+ | |||
+ | </ | ||
+ | |||