
    80: ?C_STARTUP:     LJMP STARTUP1 
C:0x0000    020007   LJMP     STARTUP1(C:0007)
    22:           JMP   Boot 
    23: ; #pragma endasm 
    24: ; }               ; SOURCE LINE # 7 
C:0x0003    020050   LJMP     BOOT(C:0050)
    25:         RET      
C:0x0006    22       RET      
   139:                 MOV     SP,#?STACK-1 
C:0x0007    758107   MOV      SP(0x81),#0x07
   140:                 LJMP    ?C_START 
C:0x000A    02000D   LJMP     main(C:000D)
     6: main() 
C:0x000D    80F4     SJMP     asmBoot(C:0003)

    25: MOV     SP,#0x35 
    26:  
    27:  
    28: ; Détecte et configure le baudrate 
    29: ; La mesure utilise T2 qui à une horloge de fosc/2 
    30: Detect: 
C:0x0050    758135   MOV      SP(0x81),#0x35
    31:         MOV      TMOD,#0x02 
C:0x0053    758902   MOV      TMOD(0x89),#0x02
    32:         MOV      T2CON,#0x30 
C:0x0056    75C830   MOV      T2CON(0xC8),#0x30
    33:         CLR      A 
C:0x0059    E4       CLR      A
    34:         MOV      TH2,A 
C:0x005A    F5CD     MOV      TH2(0xCD),A
    35:         MOV      TL2,A 
C:0x005C    F5CC     MOV      TL2(0xCC),A
    36:         JNB      RXD,$ 
C:0x005E    30B0FD   JNB      RXD(0xB0.0),C:005E
    37:         JB       RXD,$ 
C:0x0061    20B0FD   JB       RXD(0xB0.0),C:0061
    38:         SETB     TR2 
C:0x0064    D2CA     SETB     TR2(0xC8.2)
    39:         JNB      RXD,$ 
C:0x0066    30B0FD   JNB      RXD(0xB0.0),C:0066
    40:         CLR      TR2 
    41: ; Charge le Timer avec 65536 - tm/16 
C:0x0069    C2CA     CLR      TR2(0xC8.2)
    42:         MOV      A,TL2 
C:0x006B    E5CC     MOV      A,TL2(0xCC)
    43:         SWAP     A 
    44:         ; Arrondi au demi; le carry contient l'incrément si un arrondi supérieur est nécessaire 
C:0x006D    C4       SWAP     A
    45:         RLC      A      ; Mémorise l'arrondi 
C:0x006E    33       RLC      A
    46:         RR       A 
C:0x006F    03       RR       A
    47:         ANL      A,#0x0F 
C:0x0070    540F     ANL      A,#0x0F
    48:         MOV      R0,A 
C:0x0072    F8       MOV      R0,A
    49:         MOV      A,TH2 
C:0x0073    E5CD     MOV      A,TH2(0xCD)
    50:         SWAP     A 
C:0x0075    C4       SWAP     A
    51:         ANL      A,#0xF0 
C:0x0076    54F0     ANL      A,#B(0xF0)
    52:         ORL      A,R0 
C:0x0078    48       ORL      A,R0
    53:         ADDC     A,#0   ; Ajoute le carry 
C:0x0079    3400     ADDC     A,#0x00
    54:         MOV      R0,A 
C:0x007B    F8       MOV      R0,A
    55:         MOV      A,TH2 
C:0x007C    E5CD     MOV      A,TH2(0xCD)
    56:         SWAP     A 
C:0x007E    C4       SWAP     A
    57:         ANL      A,#0x0F 
C:0x007F    540F     ANL      A,#0x0F
    58:         ADDC     A,#0   ; Ajoute le report de l'addition précédente 
C:0x0081    3400     ADDC     A,#0x00
    59:         MOV      R1,A 
    60:         ; compl. à 2 
C:0x0083    F9       MOV      R1,A
    61:         CLR      C 
C:0x0084    C3       CLR      C
    62:         CLR      A 
C:0x0085    E4       CLR      A
    63:         SUBB     A,R0 
C:0x0086    98       SUBB     A,R0
    64:         MOV      TL2,A 
C:0x0087    F5CC     MOV      TL2(0xCC),A
    65:         MOV      RCAP2L,A 
C:0x0089    F5CA     MOV      RCAP2L(0xCA),A
    66:         CLR      A 
C:0x008B    E4       CLR      A
    67:         SUBB     A,R1 
C:0x008C    99       SUBB     A,R1
    68:         MOV      TH2,A 
C:0x008D    F5CD     MOV      TH2(0xCD),A
    69:         MOV      RCAP2H,A 
C:0x008F    F5CB     MOV      RCAP2H(0xCB),A
    70:         SETB     TR2 
C:0x0091    D2CA     SETB     TR2(0xC8.2)
    71:         MOV      SCON,#0x52      
    72:  
    73: Wait_Uchar: 
    74: ; Attend le 1er caractère 
C:0x0093    759852   MOV      SCON(0x98),#0x52
    75:         JNB      RI,$ 
C:0x0096    3098FD   JNB      RI(0x98.0),WAIT_UCHAR(C:0096)
    76:         CLR      RI 
C:0x0099    C298     CLR      RI(0x98.0)
    77:         MOV      A,SBUF 
    78:         ; Dans la valeur reçue, les 2 LSB n'on pas été pris car on les a déjà utilisé pour la detection du baudrate 
C:0x009B    E599     MOV      A,SBUF(0x99)
    79:         CLR      C 
C:0x009D    C3       CLR      C
    80:         RLC      A 
C:0x009E    33       RLC      A
    81:         SETB     C 
C:0x009F    D3       SETB     C
    82:         RLC      A 
    83: ; Renvoie le caractère 
C:0x00A0    33       RLC      A
    84:         JNB      TI,$ 
C:0x00A1    3099FD   JNB      TI(0x98.1),C:00A1
    85:         CLR      TI 
C:0x00A4    C299     CLR      TI(0x98.1)
    86:         MOV      SBUF,A 
    87:  
C:0x00A6    F599     MOV      SBUF(0x99),A
    88:         MOV      R0,#2  ; Nombre de relecture avant de recommancer une détection 
    89: Detect_tst: 
    90: ; Check to see if uppercase "U" 
C:0x00A8    7802     MOV      R0,#0x02
    91:         CJNE     A,#'U',Not_U   ; Check to see if uppercase "U" 
C:0x00AA    B45502   CJNE     A,#0x55,NOT_U(C:00AF)
    92:         JMP      Intel_Hex 
    93: Not_U: 
C:0x00AD    8019     SJMP     INTEL_HEX(C:00C8)
    94:         DJNZ     R0,Not_U1 
    95: ; Dans ce cas on recommence la détection 
C:0x00AF    D807     DJNZ     R0,NOT_U1(C:00B8)
    96:         MOV      SCON,#0 
C:0x00B1    759800   MOV      SCON(0x98),#0x00
    97:         CLR      TR2 
C:0x00B4    C2CA     CLR      TR2(0xC8.2)
    98:         JMP      Detect     
    99: Not_U1: 
   100: ; On teste encore un caractère car avec des débits élevés, on manque partiellement le premier 
C:0x00B6    809B     SJMP     DETECT(C:0053)
   101:         JNB      RI,$ 
C:0x00B8    3098FD   JNB      RI(0x98.0),NOT_U1(C:00B8)
   102:         CLR      RI 
C:0x00BB    C298     CLR      RI(0x98.0)
   103:         MOV      A,SBUF 
   104: ; Renvoie le caractère 
C:0x00BD    E599     MOV      A,SBUF(0x99)
   105:         JNB      TI,$ 
C:0x00BF    3099FD   JNB      TI(0x98.1),C:00BF
   106:         CLR      TI 
C:0x00C2    C299     CLR      TI(0x98.1)
   107:         MOV      SBUF,A 
C:0x00C4    F599     MOV      SBUF(0x99),A
   108:         JMP      Detect_tst 
   109:  
   110:  
   111: ;***** Intel Hex File Load routine ***** 
   112: ;This routine loads an Intel Hex formatted file into  
   113: ;the buffer memory. The hex file is received as a series 
   114: ;of ASCII characters on the serial input line of the 
   115: ;serial port. A record type of 00H is considered to be 
   116: ;a data field. Any other type of record is considered 
   117: ;to be an End-of-File marker. This routine also calculates 
   118: ;the checksum on the field as it is received and compares 
   119: ;this calculated checksum with the checksum field received 
   120: ;in the record. 
   121: Intel_Hex: 
   122:  
C:0x00C6    80E2     SJMP     DETECT_TST(C:00AA)
   123: MOV A,#'s'  
C:0x00C8    7473     MOV      A,#0x73
   124: call CO 
   125:  
   126: ; It will be NECESSARY for the end-user’s code to set the ENBOOT bit prior to 
   127: ;  calling the common entry point for IAP operations 
C:0x00CA    3104     ACALL    CO(C:0104)
   128:         ORL     AUXR1,#ENBOOT        ; enable boot 
   129:  
   130: ; Fill Stack 
C:0x00CC    43A220   ORL      AUXR1(0xA2),#0x20
   131: MOV A,#0x5A 
C:0x00CF    745A     MOV      A,#0x5A
   132: MOV R0,SP 
C:0x00D1    A881     MOV      R0,SP(0x81)
   133: INC R0 
   134: Fill: 
C:0x00D3    08       INC      R0
   135: MOV @R0,A 
C:0x00D4    F6       MOV      @R0,A
   136: INC R0 
C:0x00D5    08       INC      R0
   137: CJNE R0,#0,Fill 
   138:  
   139: ; ERASE BLOCK 
C:0x00D6    B800FB   CJNE     R0,#0x00,FILL(C:00D4)
   140: MOV R0,#11      ; R0 = osc freq (integer) 
C:0x00D9    780B     MOV      R0,#0x0B
   141: MOV R1,#01h 
C:0x00DB    7901     MOV      R1,#0x01
   142: MOV DPH,#20h    ;block code, block 1 , 8k~16k 
C:0x00DD    758320   MOV      DPH(0x83),#0x20
   143: MOV DPL,#0 
C:0x00E0    758200   MOV      DPL(0x82),#0x00
   144: LCALL PGM_MTP   ; 0FFF0h 
   145: ; It never returne here!? 
   146:  
C:0x00E3    12FFF0   LCALL    C:FFF0
   147: MOV A,#'e'  
C:0x00E6    7465     MOV      A,#0x65
   148:         JNB      TI,$ 
C:0x00E8    3099FD   JNB      TI(0x98.1),C:00E8
   149:         CLR      TI 
C:0x00EB    C299     CLR      TI(0x98.1)
   150:         MOV      SBUF,A 
   151:  
   152: ;Display Stack 
C:0x00ED    F599     MOV      SBUF(0x99),A
   153: MOV R0,SP 
C:0x00EF    A881     MOV      R0,SP(0x81)
   154: INC R0 
   155: Disp: 
C:0x00F1    08       INC      R0
   156: MOV A,#' '  
C:0x00F2    7420     MOV      A,#0x20
   157:         JNB      TI,$ 
C:0x00F4    3099FD   JNB      TI(0x98.1),C:00F4
   158:         CLR      TI 
C:0x00F7    C299     CLR      TI(0x98.1)
   159:         MOV      SBUF,A 
C:0x00F9    F599     MOV      SBUF(0x99),A
   160: MOV A,@R0 
C:0x00FB    E6       MOV      A,@R0
   161: JMP OUTBYT 
   162: Disp2: 
C:0x00FC    8016     SJMP     OUTBYT(C:0114)
   163: INC R0 
C:0x00FE    08       INC      R0
   164: CJNE R0,#0,Disp 
   165:  
   166:  
C:0x00FF    B800F0   CJNE     R0,#0x00,DISP(C:00F2)
   167: jmp $  
   168:  
   169:  
   170: ;***** console output routine ***** 
   171: ;Outputs character in the ACC to  
   172: ;the serial output line. 
   173: CO: 
C:0x0102    80FE     SJMP     C:0102
   174:         JNB      TI,$ 
C:0x0104    3099FD   JNB      TI(0x98.1),CO(C:0104)
   175:         CLR      TI 
C:0x0107    C299     CLR      TI(0x98.1)
   176:         MOV      SBUF,A 
C:0x0109    F599     MOV      SBUF(0x99),A
   177:         RET 
   178:  
   179: ;***** console input routine ***** 
   180: ;Waits until character has been received 
   181: ;and then returns char in ACC. 
   182: CI: 
C:0x010B    22       RET      
   183:         JNB      RI,$ 
C:0x010C    3098FD   JNB      RI(0x98.0),CI(C:010C)
   184:         CLR      RI 
C:0x010F    C298     CLR      RI(0x98.0)
   185:         MOV      A,SBUF 
C:0x0111    E599     MOV      A,SBUF(0x99)
   186:         RET 
   187:  
   188:  
   189:  
   190: OUTBYT: 
C:0x0113    22       RET      
   191:         MOV     R4,A  ;"push acc" 
C:0x0114    FC       MOV      R4,A
   192:         SWAP    A 
C:0x0115    C4       SWAP     A
   193:         JMP     HEX2A1 
   194: OUTBYT1: 
   195: ;       CALL   CO 
C:0x0116    8013     SJMP     HEX2A1(C:012B)
   196:         JNB      TI,$ 
C:0x0118    3099FD   JNB      TI(0x98.1),OUTBYT1(C:0118)
   197:         CLR      TI 
C:0x011B    C299     CLR      TI(0x98.1)
   198:         MOV      SBUF,A 
C:0x011D    F599     MOV      SBUF(0x99),A
   199:         MOV     A,R4  ;"pop acc" 
C:0x011F    EC       MOV      A,R4
   200:         JMP     HEX2A2 
   201: OUTBYT2: 
   202: ;       CALL   CO 
C:0x0120    8018     SJMP     HEX2A2(C:013A)
   203:         JNB      TI,$ 
C:0x0122    3099FD   JNB      TI(0x98.1),OUTBYT2(C:0122)
   204:         CLR      TI 
C:0x0125    C299     CLR      TI(0x98.1)
   205:         MOV      SBUF,A 
C:0x0127    F599     MOV      SBUF(0x99),A
   206:         JMP Disp2 
   207:  
   208:  
   209:  
   210: ;***** HEX to ASCII routine ***** 
   211: ;This routine receives a single hex digit 
   212: ;(a four bit nibble) in the ACC and returns 
   213: ;the equivilent ASCII char in the ACC. 
   214: HEX2A1: 
C:0x0129    80D3     SJMP     DISP2(C:00FE)
   215:         ANL     A,#0FH 
C:0x012B    540F     ANL      A,#0x0F
   216:         CLR     C        ;carry affects the testing 
C:0x012D    C3       CLR      C
   217:         SUBB    A,#0AH      ;test for range of 0-9, A-F 
C:0x012E    940A     SUBB     A,#0x0A
   218:         JNC     HAHIGH1      ;no carry then A-F range 
C:0x0130    5004     JNC      HAHIGH1(C:0136)
   219:         ADD     A,#3AH       ;add offset for 0-9 range 
C:0x0132    243A     ADD      A,#0x3A
   220:         JMP OUTBYT1 
   221: HAHIGH1: 
C:0x0134    80E2     SJMP     OUTBYT1(C:0118)
   222:         ADD     A,#41H       ;add in offset for A-F range 
C:0x0136    2441     ADD      A,#0x41
   223:         JMP OUTBYT1 
   224:  
   225:  
   226: HEX2A2: 
C:0x0138    80DE     SJMP     OUTBYT1(C:0118)
   227:         ANL     A,#0FH 
C:0x013A    540F     ANL      A,#0x0F
   228:         CLR     C        ;carry affects the testing 
C:0x013C    C3       CLR      C
   229:         SUBB    A,#0AH      ;test for range of 0-9, A-F 
C:0x013D    940A     SUBB     A,#0x0A
   230:         JNC     HAHIGH2      ;no carry then A-F range 
C:0x013F    5004     JNC      HAHIGH2(C:0145)
   231:         ADD     A,#3AH       ;add offset for 0-9 range 
C:0x0141    243A     ADD      A,#0x3A
   232:         JMP OUTBYT2 
   233: HAHIGH2: 
C:0x0143    80DD     SJMP     OUTBYT2(C:0122)
   234:         ADD     A,#41H       ;add in offset for A-F range 
C:0x0145    2441     ADD      A,#0x41
   235:         JMP OUTBYT2 
C:0x0147    80D9     SJMP     OUTBYT2(C:0122)
