Lösungen des RA- Praktikums an der TU-Ilmenau vom 10.12.2003.
;Aufgabe a name mainfile public main APP_CODE32 SEGMENT PUBLIC USE32 ER ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32 main: MOV dl,0x00 wmatr: CALL matr CMP dl,dh JZ wmatr CMP dl,0x00 ;Wird die Taste los gelassen, entsteht eine 0, diese wollen wir nicht anzeigen JZ wmatr CALL SLEEP ;entprellung MOV al,dl ;ausgabe in led-zeile OUT 0x5c,al PUSH cx ;für den Zugriff auf die Daten wird ein X-Reg gebraucht, leider haben wir keins mehr :-( MOV ecx,0x00 MOV cl,dl SUB cl,0x01 MOV al,[segment+ecx];siehe TI Script POP cx ; den Wer von CX wiederherstellen PUSH dx ;und das selbe mit DX MOV dx,0 MOV dl,ch OUT dx,al POP dx DEC ch CMP cd,0xaf ;max Anzahl der Segmente JNZ weiter MOV ch,0xbb ;höchster Adresswert der Segmentanzeigen weiter: JMP wmatr ;matr ;Abfrage der dl ;Übergabe der gedrückten Taste matr: MOV dh,dl MOV dl,0x00 MOV ah,0x08 MOV cl,0x0f ;4*4+1 matry: MOV al,ah OUT 0x5a,al IN al,0x5b CALL COMPAREI SUB cl,0x04 ;CL=CL-4 SHR ah,0x01 ;AH=AH/2 JNZ matry ;until AH!=0 RET COMPAREI: ;Init MOV bh,0x08 MOV bl,0x04 COMPARE: CMP al,bh JZ KEYPRESS DEC bl ;BL-- SHR bh,0x01 ;BH=BH/2 JNZ COMPARE ;until BH!=0 ;k.A. ob Zero Flag gesetzt wird JMP NOKEY KEYPRESS: ADD bl,cl MOV dl,bl MOV ah,0x00 NOKEY: RET SLEEP: MOV ax,0xFFFF SLEEPL: DEC ax ;ax-- JNZ SLEEPL RET ;Bsp. ; <-x->^ ; 1000 | 01 ; 0000 y 02 ; 0000 | 04 ; 0000 v 08 ; *** Ab hier den Programmbereich einfuegen *** ; *** Ende des Programmbereiches - ab hier nichts veraendern! *** finish: jmp finish ; vorbereitete Endlosschleife APP_CODE32 ENDS APP_DATA32 SEGMENT PUBLIC USE32 RW ; *** Ab hier den Datenbereich einfuegen *** ; 0 1 2 3 4 5 6 7 8 9 segment db 0x3f,0x03,0x6d,0x67,0x53,0x76,0x7e,0x23,0x7f,0x77 ; *** Ende des Datenbereichs - ab hier nichts veraendern! *** DB 0 ; Datenbereich soll nicht leer sein APP_DATA32 ENDS END main
;Aufgabe a name mainfile public main APP_CODE32 SEGMENT PUBLIC USE32 ER ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32 main: ;kanal=0 mode=3 ;0011.0110 MOV AL,0x36 OUT 0x57,AL ;f[out]=440Hz ;Realisierung durch f-Teilung eines 2MHz Oszillators ;2000000/440=4545.4545... ; = 11c1.745D... ; ;sequientiell erst MSB, dann LSB setzen MOV AL,0xc1 OUT 0x54,AL MOV AL,0x11 OUT 0x54,AL ;Digitalisierungsfehler -> f[neu]=440.044044...Hz
;Aufgabe b name mainfile public main APP_CODE32 SEGMENT PUBLIC USE32 ER ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32 main: ;kanal=1 mode=3 ;0111.0110 MOV AL,0x76 OUT 0x57,AL ;kanal=2 mode=3 ;1011.0110 MOV AL,0xb6 OUT 0x57,AL ;f[out]=2Hz ;Realisierung durch f-Teilung eines 2MHz Oszillators ;2000000/2 =f.4240 -> es werden mehr als 2 byte benörigt -> kaskadierung ; =10*f424 ; ;kanal1=f424 MOV AL,0x24 OUT 0x55,AL MOV AL,0xf4 OUT 0x55,AL ;kanal2=0010 MOV AL,0x10 OUT 0x56,AL MOV AL,0x00 OUT 0x56,AL ; *** Ende des Programmbereiches - ab hier nichts veraendern! *** finish: jmp finish ; vorbereitete Endlosschleife APP_CODE32 ENDS APP_DATA32 SEGMENT PUBLIC USE32 RW ; *** Ab hier den Datenbereich einfuegen *** ; *** Ende des Datenbereichs - ab hier nichts veraendern! *** DB 0 ; Datenbereich soll nicht leer sein APP_DATA32 ENDS END main
;Aufgabe c name mainfile public main APP_CODE32 SEGMENT PUBLIC USE32 ER ASSUME DS:APP_DATA32, ES:APP_DATA32, FS:APP_DATA32, GS:APP_DATA32, SS:APP_DATA32 ledinit: ;LED MOV AL,0x76 OUT 0x57,AL MOV AL,0xb6 OUT 0x57,AL ;kanal1 MOV AL,0x24 OUT 0x55,AL MOV AL,0xf4 OUT 0x55,AL ;kanal2 MOV AL,0x10 OUT 0x56,AL MOV AL,0x00 OUT 0x56,AL loop: CALL checkkey CMP DL,CL ;tastendruck? JZ loop CMP DL,0x00 ;tastendruck=0? JZ reset ;eine taste wurde gedrückt MOV AL,0x36 OUT 0x57,AL MOV AL,[tonleiterLSB+edx-1] OUT 0x54,AL MOV AL,[tonleiterMSB+edx-1] OUT 0x54,AL JMP loop reset: MOV AL,0x34 OUT 0x57,AL MOV AL,0x00 OUT 0x54,AL OUT 0x54,AL JMP loop checkkey: ;DL=1,2,3,4,5,6,7,8 0-nokey MOV CL,DL IN AL,0x59 MOV BH,0x80 MOV BL,0x08 MOV EDX,0x00 compare: CMP AL,BH JZ keypress DEC BL ;BL-- SHR BH,0x01 ;BH=BH/2 JNZ compare ;until BH!=0 ;k.A. ob Zero Flag gesetzt wird JMP nokey keypress: MOV DL,BL nokey: RET ; *** Ende des Programmbereiches - ab hier nichts veraendern! *** finish: jmp finish ; vorbereitete Endlosschleife APP_CODE32 ENDS APP_DATA32 SEGMENT PUBLIC USE32 RW ; *** Ab hier den Datenbereich einfuegen *** ;261.6Hz => 1dee ;293.7Hz => 1aa9 ;329.6Hz => 17bf ;349.2Hz => 1662 ;392.0Hz => 13ee ;440.0Hz => 11c1 ;493.9Hz => 0fd8 ;523.2Hz => 0ef0 tonleiterMSB db 0xld,0xla,0x17,0x16,0x13,0x11,0x0f,0x0e tonleiterLSB db 0xee,0xa9,0xbf,0x62,0xee,0xc1,0xd8,0xf0 ; *** Ende des Datenbereichs - ab hier nichts veraendern! *** DB 0 ; Datenbereich soll nicht leer sein APP_DATA32 ENDS END main