📄 startup400.lst
字号:
430
431 ;
432 ; Make sure we are in contiguous mode
433 ;
400009 75C7AA 434 mov ta, #0xAA ; Enable access to ACON
40000C 75C755 435 mov ta, #0x55
40000F 439D02 436 orl acon, #2 ; 24 bit mode
400012 02000000 F 437 ljmp far sanity_check ; Sanity check: Make sure 24
bit mode is on
400016 438 sanity_check:
400016 75C7AA 439 mov ta, #0xAA ; Enable access to MCON
400019 75C755 440 mov ta, #0x55
40001C 75C6AF 441 mov mcon, #0xAF ; Relocate RAM, data memory
40001F 75C7AA 442 mov ta, #0xAA ; Enable access to ACON
400022 75C755 443 mov ta, #0x55
400025 439D04 444 orl acon, #0x04 ; Extended stack
445
446 ;
447 ; Use the minimum number of stretch cycles on MOVX memory
448 ;
400028 538EF8 449 anl ckcon, #0f8h
AX51 MACRO ASSEMBLER STARTUP400 25/06/04 10:50:38 PAGE 8
450
451 ;
452 ; Make sure we are in a known state with respect to
453 ; our fancy data pointers and register banks
454 ;
40002B 758600 455 mov dps, #0
40002E 75D000 456 mov psw, #0
457
458 ;
459 ; Set stack to 0 (we lose one byte, but don't
460 ; have to know the size)
461 ;
400031 758100 462 mov sp,#0
400034 759B00 463 mov esp,#0
464
465 ;
466 ; Do the Crystal Multiplier
467 ;
468 $if XTALMULT = 2
startup_setxtal_mult_2:
;
; Multiply crystal frequency by 2
;
mov pmr, #10000010b ; Set for crystal * 2
mov pmr, #10010010b ; Enable multiplier
WaitCrystal:
mov a, exif ; Wait for multiplier to be r
eady
jnb acc.3, WaitCrystal ; Jump if CKRY is low
mov pmr, #00010010b ; Go to crystal * 2
$elseif XTALMULT = 4
startup_setxtal_mult_4:
;
; Multiply crystal frequency by 4
;
mov pmr, #10000010b ; Set to power up value
mov pmr, #10001010b ; Set for crystal * 4
mov pmr, #10011010b ; Enable multiplier
WaitCrystal4:
mov a, exif ; Wait for multiplier to be r
eady
jnb acc.3, WaitCrystal4 ; Jump if CKRY is low
mov pmr, #00011010b ; Go to crystal * 4
$endif
493
494 $if (INITIALIZE_SERIAL0 <> 0)
495 ; Enable the serial0, using timer 2 at 115200
496 ; Use this equation for the reloads:
497 ; reload H:L = 65536 - (oscillator / (32 * baud))
498 ; We now use User Configurable Equates for the serial
499 ; port settings. The default is for 115200, which
500 ; yeilds the following:
501 ; 65536 - (14745600 / (32 * 115200)) = 65536 - (14745600 / 3686400)
502 ; = 65536 - 4
503 ; = 65532
504 ; = 0xFFFC
400037 75985A 505 mov scon0, #5Ah ; 10 bit serial 0, use timer
baud rate, enable recieving
40003A 75CBFF 506 mov rcap2h, #High(TIMER_RELOAD) ; Set timer reload high byte
40003D 75CAFC 507 mov rcap2l, #Low(TIMER_RELOAD) ; Set timer reload low bye
400040 75C830 508 mov t2con, #30h ; Enable timer 2 for serial p
ort
400043 D2CA 509 setb tr2 ; Set timer 2 to run
510
511 ; Make sure that we can output to the serial port
AX51 MACRO ASSEMBLER STARTUP400 25/06/04 10:50:38 PAGE 9
400045 D299 512 setb ti
513 $else
clr tr2 ; Disable serial 0 output if
configured by ROM loader
$endif
516
517 $if (USE_REENTRANT_STACK <> 0)
mov ?C_XBP,#HIGH XBPSTACKTOP
mov ?C_XBP+1,#LOW XBPSTACKTOP
$endif
521
522
523 $if SETMAC = 1
mov r0, #MAC_LSB
mov r1, #MAC_2
mov r2, #MAC_3
mov r3, #MAC_4
mov r4, #MAC_5
mov r5, #MAC_MSB
$endif
532
533 $if SETMAC = 2
;
; User MAC Code
;
; Insert code here that will get a MAC address in registers
; r5:r4:r3:r2:r1:r0, with r5 the MSB.
;
$endif
542
543 $if SETMAC > 0
; Push registers r0 to r5
push 0
push 1
push 2
push 3
push 4
push 5
mov a, #'C'
push acc
mov a, #'A'
push acc
mov a, #'M'
push acc
$endif
559
560
561
562
563 IF ERASE_XDATA_LEN <> 0
mov dptr, #ERASE_XDATA_ADDR
mov r7, #BYTE0 (ERASE_XDATA_LEN)
IF (BYTE0 (ERASE_XDATA_LEN)) <> 0
mov r6, #(BYTE1 ERASE_XDATA_LEN) +1
ELSE
mov r6, #BYTE1 (ERASE_XDATA_LEN)
ENDIF
IF (BYTE1 (ERASE_XDATA_LEN)) <> 0
mov r5, #(BYTE2 ERASE_XDATA_LEN) +1
ELSE
mov r5, #BYTE2 (ERASE_XDATA_LEN)
ENDIF
clr a
AX51 MACRO ASSEMBLER STARTUP400 25/06/04 10:50:38 PAGE 10
erase_xdata_loop:
movx @dptr, a
inc dptr
djnz r7, erase_xdata_loop
djnz r6, erase_xdata_loop
djnz r5, erase_xdata_loop
endif
584
585
400047 12000000 E 586 lcall init_romexport
587
588
589 if ERASE_IDATA <> 0
mov r0, #ERASE_IDATA - 1
clr a
erase_idata_loop:
mov @r0, a
djnz r0, erase_idata_loop
endif
596
597
598
40004B 02000000 E 599 ljmp ?C_START
600 end
AX51 MACRO ASSEMBLER STARTUP400 25/06/04 10:50:38 PAGE 11
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
?C_CPURESET?0 . . . . . . . . C SEG 40004FH REL=ABS, ALN=BYTE
?C_START. . . . . . . . . . . C ADDR ------- EXT
?C_STARTUP. . . . . . . . . . C ADDR 00400000H R SEG=?C_CPURESET?0
AC. . . . . . . . . . . . . . B ADDR 00D0H.6 A
ACC . . . . . . . . . . . . . D ADDR 00E0H A
ACON. . . . . . . . . . . . . D ADDR 009DH A
AP. . . . . . . . . . . . . . D ADDR 009CH A
B . . . . . . . . . . . . . . D ADDR 00F0H A
C0C . . . . . . . . . . . . . D ADDR 00A3H A
C0IE. . . . . . . . . . . . . B ADDR 00E8H.6 A
C0IP. . . . . . . . . . . . . B ADDR 00F8H.6 A
C0IR. . . . . . . . . . . . . D ADDR 00A5H A
C0M10C. . . . . . . . . . . . D ADDR 00B7H A
C0M11C. . . . . . . . . . . . D ADDR 00BBH A
C0M12C. . . . . . . . . . . . D ADDR 00BCH A
C0M13C. . . . . . . . . . . . D ADDR 00BDH A
C0M14C. . . . . . . . . . . . D ADDR 00BEH A
C0M15C. . . . . . . . . . . . D ADDR 00BFH A
C0M1C . . . . . . . . . . . . D ADDR 00ABH A
C0M2C . . . . . . . . . . . . D ADDR 00ACH A
C0M3C . . . . . . . . . . . . D ADDR 00ADH A
C0M4C . . . . . . . . . . . . D ADDR 00AEH A
C0M5C . . . . . . . . . . . . D ADDR 00AFH A
C0M6C . . . . . . . . . . . . D ADDR 00B3H A
C0M7C . . . . . . . . . . . . D ADDR 00B4H A
C0M8C . . . . . . . . . . . . D ADDR 00B5H A
C0M9C . . . . . . . . . . . . D ADDR 00B6H A
C0RE. . . . . . . . . . . . . D ADDR 00A7H A
C0RMS0. . . . . . . . . . . . D ADDR 0096H A
C0RMS1. . . . . . . . . . . . D ADDR 0097H A
C0S . . . . . . . . . . . . . D ADDR 00A4H A
C0TE. . . . . . . . . . . . . D ADDR 00A6H A
C0TMA0. . . . . . . . . . . . D ADDR 009EH A
C0TMA1. . . . . . . . . . . . D ADDR 009FH A
C1C . . . . . . . . . . . . . D ADDR 00E3H A
C1IE. . . . . . . . . . . . . B ADDR 00E8H.5 A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -