⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s610411sw.asm

📁 这是一个段式lcd显示
💻 ASM
字号:
;***************************************************************
;       ML610Q411 start up assembly source file
;       for CCU8 version 1.xx/2.xx/3.xx
;       SMALL CODE MODEL
;       ROMWINDOW  0-03DFFh
;       Version 1.01
;       Copyright (C) 2008 OKI SEMICONDUCTOR CO., LTD.
;***************************************************************

        type(M610411)

        model   small
        romwindow       0, 03dffh

        extrn   code: _main
        extrn   data near: _$$SP
        public  $$start_up

        cseg    at 0:0h
        dw      offset _$$SP

        cseg    at 0:4h
        dw      $$brk_reset

$$NCODs610411sw  segment code    #0
        rseg    $$NCODs610411sw

$$start_up:

        bal     $begin

$$brk_reset:
        bal     $               ;endless loop

$begin:

;---------------------------------------------------------------
;       setting Memory Model
;---------------------------------------------------------------
; nothing (fixed as Small model)

;---------------------------------------------------------------
;       setting Rom Window range
;---------------------------------------------------------------
; nothing (fixed as range 0-03dffh)

;---------------------------------------------------------------
;       user SFR definition
;---------------------------------------------------------------
; nothing

;---------------------------------------------------------------
;       Data memory zero clear
;---------------------------------------------------------------
NEAR_RAM_START  equ     0e000h
NEAR_RAM_END    equ     0e3ffh

        mov     er0,    #0
        mov     er2,    #0
        mov     er4,    #0
        mov     er6,    #0

        mov     r8,     #BYTE1 NEAR_RAM_START
        mov     r9,     #BYTE2 NEAR_RAM_START
        lea     [er8]
__near_ram_loop:
        st      qr0,    [ea+]
        add     er8,    #8              ;er8 += 8
        cmp     r9,     #BYTE2 (NEAR_RAM_END+1)
        blt     __near_ram_loop
        cmp     r8,     #BYTE1 (NEAR_RAM_END+1)
        blt     __near_ram_loop

;---------------------------------------------------------------
;       WDT counter clear (for ML610Q411)
;
;       !!NOTICE!!
;       After this process, you have to clear WDT counter within 
;       the time described in "ML610Q411/Q412/Q415 user's manual 
;       Chapter12 WDT".
;---------------------------------------------------------------
        mov     r12,     #05ah
        mov     r13,     #0a5h
        tb      WDP
        bz      __wdtcounter_clear
        st      r13,     WDTCON
__wdtcounter_clear:
        st      r12,     WDTCON
        st      r13,     WDTCON

;---------------------------------------------------------------
;       data variable initialization
;---------------------------------------------------------------
        mov     r10,    #SEG $$init_info
        lea     OFFSET $$init_info
__init_loop:
        ;---------------------------------------------
        ; get source offset address and set in ER0
        ;---------------------------------------------
        l       er0,    r10:[ea+]
        cmp     r0,     #0ffh
        bne     __skip
        cmp     r1,     #0ffh
        beq     __init_end              ;if er0==0ffffh then exit
__skip:
        ;---------------------------------------------
        ; get destination offset address and set in ER2
        ;---------------------------------------------
        l       er2,    r10:[ea+]

        ;---------------------------------------------
        ; get size of objects and set in ER4
        ;---------------------------------------------
        l       er4,    r10:[ea+]

        ;---------------------------------------------
        ; get source phy_seg address and set in R6
        ;---------------------------------------------
        l       r6,     r10:[ea+]

        ;---------------------------------------------
        ; get destination phy_seg address and set in R7
        ;---------------------------------------------
        l       r7,     r10:[ea+]

        ;---------------------------------------------
        ; copy
        ;---------------------------------------------

        add     er4,    #0
        bz      __init_loop             ;if er4==0000 then next

        tb      r2.0
        bnz     __loop_by_byte
        tb      r4.0
        bnz     __loop_by_byte

__init_loop2:
        l       er8,    r6:[er0]
        add     er0,    #2              ;er0 += 2
        st      er8,    r7:[er2]
        add     er2,    #2              ;er2 += 2

        add     er4,    #-2             ;er4 -= 2
        bnz     __init_loop2
        bal     __init_loop


__loop_by_byte:
        l       r8,     r6:[er0]
        add     er0,    #1              ;er0 += 1
        st      r8,     r7:[er2]
        add     er2,    #1              ;er2 += 1

        add     er4,    #-1             ;er4 -= 1
        bnz     __loop_by_byte
        bal     __init_loop


__init_end:

;---------------------------------------------------------------
;       call initializing routine
;---------------------------------------------------------------
        bl      $$content_of_init

;---------------------------------------------------------------
;       initialize DSR zero
;---------------------------------------------------------------
;;***** mov     DSR,    #0              ;not available
        l       r0,     0:[ea]

;---------------------------------------------------------------
;       far jump to main routine
;---------------------------------------------------------------
        b       _main


;---------------------------------------------------------------
;       segment definition for initializing routine
;---------------------------------------------------------------
$$content_of_init segment code
        rseg    $$content_of_init

$$end_of_init segment code
        rseg    $$end_of_init
        rt

;---------------------------------------------------------------
;       segment definition for data variable initialization
;---------------------------------------------------------------
$$init_info segment table 2 any
        rseg    $$init_info
        dw      $$NINITTAB
        dw      $$NINITVAR
        dw      size $$NINITTAB
        db      seg $$NINITTAB
        db      seg $$NINITVAR

$$init_info_end segment table any
        rseg    $$init_info_end
        dw      0ffffh

$$NINITVAR segment data 2 #0
$$NINITTAB segment table 2 any

;---------------------------------------------------------------
;       Filling the Test area at code memory (for ML610Q411)
;---------------------------------------------------------------
        cseg at 03c00h
	dw   256 DUP   0ffffh

;---------------------------------------------------------------
;       Keeping the Mirror area at #8 (for ML610Q411)
;---------------------------------------------------------------
        tseg #8 at 0000h
        ds      03e00h

        end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -