... wie der Herr Tonn gesagt hat : impossible!
also sowas zum Beispiel :
; **********************************************************************
; 8051 Monitor 25.07.90 (Wollvieh)
; 08.08.90 (Wollvieh)
; 18.10.90 (Wollvieh) intel-hex lader
;
;
; - fuer PEC-50S Platine
;
; Timer_0 Interrupt wird alle 10 ms ausgeloest
; Timer_1 im Auto_Reload Mode zum erzeugen der Baud-Rate
;
; **********************************************************************
;
; Speicheraufteilung (Decodierung Originalplatine modifiziert!)
;
; 0000-3FFF = BOOTROM (Program) ----> EPROM
;
; 0000-3FFF = RAM (Daten) ----> RAM
; 4000-7FFF = RAM (Program) ----> RAM
; 8000-xxxx = 8255
;
; ausfuehrbare Programme im RAM muessen ab adresse 4000h beginnen !
;
cr equ 0dh ; carriage return
lf equ 0ah ; linefeed
esc equ 1bh ; escape
eot equ 04h ; Limitter end of string
ramprg equ 4000h ; start of program (RAM)
piobase equ 8000h ; Basisadresse Pio 8255
porta equ 8000h ; port a register 8255
portb equ 8001h ; port b register 8255
portc equ 8002h ; port c register 8255
ctrl8255 equ 8003h ; controlregister 8255
cmdwort equ 080H ; alles auf ausgabe 8255
msb equ 0d8h ; 65535-10000 = 55535 (d8efh)
lsb equ 0efh ; 1 Mhz / 10000 = 100 Hz (0.01s)
cascade equ 5 ; Softwarezaehler 0.01s * 5 = 0.05s
; --------------- 8051 internes RAM ----------------------
stack equ 60h ; Initialwert fuer Stackpointer
ringwr equ 59h ; Ringpuffer Schreibzeiger
ringrd equ 58h ; Ringpuffer Lesezeiger
zaehler equ 57h ; Softwarezaehler
test equ 56H
count equ 55h ; zusatzregister fuer lokale schleifen
dummy equ 54h ; zusatzregister fuer schleifen
; ----------- Bitadressierbares Ram (128 Bit 's) ----------
SERFLAG EQU 127 ; bit 127
TOGGLE EQU 126 ; bit 126
; --------------- externes Ram ----------------------------
ringba equ 00h ; Basisadresse Ringpuffer
; von adresse 00h - 0ffh externes Ram
; belegt fuer Ringpuffer !
; ---------------- Startadresse nach Reset ----------------
ORG 0000H
LJMP INIT ; RESET
; ---------------- Interrupt-Sprungtabelle ----------------
ORG 3H
LJMP EXT0 ; EXTERNER INTERUPT 0
ORG 0BH
LJMP TIM0 ; TIMER INTERUPT 0
ORG 13H
LJMP EXT1 ; EXTERNER INTERUPT 1
ORG 1BH
LJMP TIM1 ; TIMER INTERUPT1
ORG 23H
LJMP COM ; SERIELLER INTERUPT
; ----------------------------------------------------------
EXT0: RETI
EXT1: RETI
TIM1: RETI
;---------------- Timer 0 Interrupt Routine ----------------
TIM0: PUSH PSW ; save reg's !
PUSH DPH ;
PUSH DPL ;
PUSH ACC ;
CPL P1.0 ; TEST
CLR EA ; disable all interrupts
CLR TR0 ; stop timer 0
MOV A , #(lsb-11) ; adjust previous instructions !
ADD A , TL0 ; adjust timer overrun !
MOV TL0 , A ; reload tl0 !
MOV A , #msb ;
ADDC A , TH0 ; adjust timer overrun !
MOV TH0 , A ; reload th0 !
SETB TR0 ; start timer 0 !
SETB EA ; enable all interrupt's !
DJNZ zaehler,weiter ; software zaehler pruefen
MOV zaehler,#cascade ; zaehler nachladen
INC TEST ;
JNB toggle , weiter ; flag aus monitorprogramm
MOV DPTR,#porta ; aktiviert porttest !
MOV A,TEST ;
MOVX @DPTR,A ; ausgabe port a
INC DPTR ;
MOVX @DPTR,A ; " port b
INC DPTR ;
MOVX @DPTR,A ; " port c
weiter: POP ACC ; restore reg's !
POP DPL ;
POP DPH ;
POP PSW ;
RETI
; ---------------- Serieller Interrupt Routine ----------------
COM: JNB ri,transmit ; wenn nicht ri,dann transmitter int. !
receive: PUSH acc
PUSH psw
PUSH dpl
PUSH dph
MOV a,sbuf ; zeichen nach akku
MOV dptr,#ringba ; basisadresse ringpuffer nach datapointer
MOV dpl,ringwr ; offset schreibzeiger nach dptr low
MOVX @dptr,a ; byte auf ringpuffer ablegen
INC ringwr ; schreibzeiger erhoehen
CLR ri ; receiver interrupt flag loeschen !
pop dph
pop dpl
pop psw
pop acc
reti
transmit: ; transmitter als fertig kennzeichnen !
CLR ti
SETB serflag ; flag transmitter ready !
reti
ORG 0100h
; ---------------- Einsprung nach Reset ----------------
INIT: SETB toggle ; toggle flag fuer porttest
MOV SP,#stack ; Stackpointer initialisieren !
MOV DPTR,#ctrl8255 ; Init. 8255 !
MOV a,#cmdwort ;
MOVX @DPTR,A ;
MOV zaehler , #cascade ; Softwarezaehler Presetwert
MOV TMOD , #00100001b ; Timer_0 Mode_1 = 16 Bit Timer
; Timer_1 Mode_2 = Auto-Reload
MOV TH0 , #msb ; Teilfaktor = 10000 (2710h)
MOV TL0 , #lsb ; Interrupt alle 10 ms
SETB TR0 ; Timer_0 Run Control Bit
SETB EA ; Enable Interrupt's
SETB ET0 ; Enable Timer_0 Interrupt
initser:
MOV SCON,#01010010b ; 8 bit uart + enable rec + set ti
MOV TH1,#-13 ; 1 000 000 /13 = 76923 /32 = 2403 Baud
SETB TR1 ; Timer_1 Run Control Bit
MOV ringwr,#0 ; Schreibzeiger Ringpuffer loeschen
MOV ringrd,#0 ; Lesezeiger Ringpuffer loeschen
SETB ES ; enable serial interrupt
LJMP main ; Monitorschleife
; ---------------- Intel-Hexcode empfangen ----------------
intel: CLR F0 ; meldung ausgeben !
MOV DPTR,#inttxt ;
LCALL out_string ;
nxtrecord:LCALL get_char ;
CJNE A , # ':',nxtrecord ; warten bis startzeichen !
LCALL sbyte ; recordlaenge !
MOV R0 , A ; retten akku
SUBB A , #0 ; recordlaenge = 0 ?
JZ readend ; dann ende !
MOV A , R0 ; restaurieren
MOV R2 , A ; checksum laenge !
MOV R3 , A ; counter (loop)
LCALL sbyte ; adresse high
MOV DPH , A ;
LCALL sbyte ; adresse low