PSW     EQU 0D0H
P1      EQU 090H
P3      EQU 0B0H
DPL     EQU 082H
DPH     EQU 083H
IE      EQU 0A8H
ACC     EQU 0E0H
BCC     EQU 0F0H
SP      EQU 081H
;
PCON    EQU 087H
TCON    EQU 088H
TMOD    EQU 089H
TL1     EQU 08BH
TH1     EQU 08DH

;
SCON    EQU 098H
SBUF    EQU 099H
;
; Bit Definitions
;
T0     EQU 0B4H
T1     EQU 0B5H


LEN     EQU     050H            ;Internal RAM variabele definitions
ADL     EQU     051H
ADH     EQU     052H


        ORG     0000H
        LJMP    START

INTSER  MOV     PCON,#080H
;Timer 2 is being used to generate baud rates.
        MOV     TMOD,#022H
        MOV     TH1,#243
        MOV     TL1,#243
        SETB    TCON.6          ; Start Timer 1
        MOV     SCON,#052H      ; Enable Reception, Mode1 8-bit UART
        RET

START   LCALL   INTSER
        MOV     R0,#0
        MOV     DPTR,#TEXT
        MOV     P3,#05FH	; Start condition of I/O pins

TITLE   MOV     P1,#055H
        JNB     SCON.1,TITLE        ; wait until character transmitted
        CLR     SCON.1              ; reset transmit interrupt
        MOV     P1,#054H
        MOV     A,R0
        MOVC    A,@A+DPTR
        JZ      ETITLE
        MOV     SBUF,A
        INC     R0
        SJMP    TITLE
ETITLE
;       Receive INTEL-INELLEX line
STWAIT  LCALL   RCV                     ; Receive #':'
        CJNE    A,#':',STWAIT
        ACALL   RCVB
        MOV     LEN,A                   ; Receive Length of DATA
        ACALL   RCVB                    ; Receive Address
        MOV     DPH,A
        ACALL   RCVB
        MOV     DPL,A
        ACALL   RCVB
        CJNE    A,#00,EOL               ; Record Type NOT DATA?
        MOV     R7,LEN
DATA    ACALL   RCVB                    ; A = data
        MOV     P1,DPL
        SETB    P3.7
        CLR     P3.7                    ; Latch A0..A7
        MOV     P1,DPH
        SETB    P3.5                    ; Latch A8..A15
        CLR     P3.5
        MOV     P1,A                    ; Put DATA on DATA-BUS
        CLR     P3.3                    ; Store in RAM (pulse on /WR)
        SETB    P3.3
        INC     DPTR                    ; New adress in DPTR
        DJNZ    R7,DATA
        MOV     SBUF,#'.'               ; Send '.'
        SJMP    STWAIT                  ; New Line of INTEL Hex-file
        
        


EOL                                     ; End of INTEL-file....
        MOV     SBUF,#'!'
        CLR     P3.2                    ; Enable IC7 & IC8 to connect
                                        ; external adress-bus to RAM
        CLR     P3.4                    ; Output Enable RAM

ENDP    SJMP    ENDP                    ; Endless loop. Emulator now active



; Receive character
; Return : A = character

RCV     JNB     SCON.0,RCV              ; Wait for receiving character
        CLR     SCON.0                  ; Clear receive-bit
        MOV     A,SBUF
        RET

; Receive hex-byte.
;
; Changed : R0
; Return  : A = received byte

RCVB    ACALL   RCV                     ; MSB
        CLR     C
        SUBB    A,#'A'
        JNC     A1
        ADD     A,#17                   ; 17 = 'A'-'0'
        SJMP    A2
A1      ADD     A,#0AH
A2      RL      A
        RL      A
        RL      A
        RL      A
        MOV     R0,A

        ACALL   RCV                     ; LSB
        CLR     C
        SUBB    A,#'A'
        JNC     A3
        ADD     A,#17                   ; 17 = 'A'-'0'
        SJMP    A4
A3      ADD     A,#0AH
A4      ADD     A,R0
        RET
        


TEXT    DB  13,10,'EPROM EMULATOR',13,10,'(c) ELEKTOR 2000',13,10,0
        END
