Hello,
I would like to use an existing function with assembly code in a C program.
By this I mean that I want to insert and use an existing function from an old program with assembly code into my new C program (C source file, assembly code inside a C source file).
How should register R1 (or a general variable) be declared in my assembler code in order to be able to use R1 in the C source file?
My function (Assembler-Code)
1 |
NAME KEY_BOARD
|
2 |
|
3 |
TASTEN_PORT EQU P1 ; benuetzter PORT
|
4 |
P_ANZ EQU 03H ; Anzahl Portleitungen
|
5 |
;TASTATUR_MODUS BIT [0] ; Steuerbit fuer Modus (20.0)
|
6 |
EINGAENGE EQU 00010111B ; Maske fuer Tastaturport:
|
7 |
; Tastaturpins = 1
|
8 |
; unbenuetzte Portpins:
|
9 |
; Eingaenge : 1
|
10 |
; Ausgaenge : 0
|
11 |
TASTEN_NUMMER EQU 01H ; Register 1
|
12 |
SPALTEN_ZAEHLER EQU 02H ; 2
|
13 |
ZEILEN_ZAEHLER EQU 03H ; 3
|
14 |
AUSGABE_MASKE EQU 04H ; 4
|
15 |
EINLESE_MASKE EQU 05H ; 5
|
16 |
|
17 |
ZAHLEN EQU 00H
|
18 |
FERTIG EQU 03H
|
19 |
LOESCHEN EQU 05H
|
20 |
|
21 |
REGISTER_1 EQU R1
|
22 |
;REGISTER_2 EQU R2
|
23 |
|
24 |
CARRY_BIT BIT PSW.7 ;CY
|
25 |
|
26 |
;public Register
|
27 |
|
28 |
;?DT?DATA_SEG segment data
|
29 |
; RSEG ?DT?DATA_SEG
|
30 |
|
31 |
;Register ds 1
|
32 |
|
33 |
?PR?key_board?KEY_BOARD SEGMENT CODE
|
34 |
EXTRN CODE (c_func)
|
35 |
EXTRN CODE (key_input)
|
36 |
EXTRN DATA (key_in)
|
37 |
PUBLIC CARRY_BIT
|
38 |
PUBLIC key_board
|
39 |
|
40 |
RSEG ?PR?key_board?KEY_BOARD
|
41 |
key_board:
|
42 |
;****************************************************************
|
43 |
MOV A,TASTEN_PORT ; Pruefen, ob Taste noch
|
44 |
ANL A,R5 ; aktiv ist
|
45 |
JZ TADA ; Sprung, falls Taste aktiv
|
46 |
SJMP WARTE ; Modus 0+1 : Taste wieder inaktiv
|
47 |
|
48 |
TADA:
|
49 |
SJMP KEINE_TASTE1 ; Modus = 1 : alte Taste noch aktiv
|
50 |
|
51 |
WARTE:
|
52 |
LCALL ENTPRELL ; Entprellzeit abwarten
|
53 |
MOV A,TASTEN_PORT ; Pruefen ob Taste noch aktiv ist
|
54 |
ANL A,R5
|
55 |
JZ WARTE ; Sprung, falls Taste noch prellt
|
56 |
|
57 |
STARTE_ZYKLUS:
|
58 |
MOV R4,#0FEH ; Startwert fuer Ausgabemaske
|
59 |
MOV R1,#00H ; Startwert fuer Tastennummer
|
60 |
MOV R2,#P_ANZ ; Startwert fuer Spaltenzaehler
|
61 |
|
62 |
....
|
63 |
RET
|
64 |
|
65 |
END
|
My C-Programm
1 |
extern void key_board(void);
|
2 |
extern unsigned char R1; // ?
|
3 |
|
4 |
main {
|
5 |
....
|
6 |
if (R1 == 0x03) { ….. }
|
7 |
....
|
8 |
}
|
I use the Compiler "Keil-C"
Kind Regards
Juergen B.