Subversion Repositories NedoOS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

1986┬┼1╥
╩юф ьюцэю шёяюыэ Є№ Єюы№ъю шч ╧╟╙ ш юсырёЄш ╬╟╙ 0x20100000 (16K), шч тэх°эхую ╬╟╙ (ё рфЁхёр, эряЁшьхЁ, 0x60000000, эю эх 0x50000000).
└фЁхё яхЁхїюфр фюыцхэ с√Є№ эхў╕Єэ√ь, шэрўх hardfault.
╫Єхэшх ёыют Єюы№ъю т√Ёютэхээюьє рфЁхёє, шэрўх hardfault.
╤шёЄхьр ъюьрэф Thumb1 ё эхсюы№°шьш фюяюыэхэш ьш (шёяюы№чєхь Єюы№ъю Thumb1).
╧юёых ёсЁюёр ўшЄрхЄ PC=[4]

─ы  ЁрсюЄ√ ё тэх°эхщ ярь Є№■ эрфю эрёЄЁюшЄ№ ьэюую ЁхушёЄЁют.

┬эх°э   ярь Є№ ╬╟╙ ЁрчьхЁюь 1╠ тшфэр ё рфЁхёют 0x50000000, 0x60000000 ш фЁ.
╤ЄрЁ°шщ сшЄ рфЁхёр (A19) яхЁхъЁ√трхЄ ъэюяъє RIGHT.
╧Ёш яюсрщЄютющ чряшёш яєЄрхЄ ў╕Єэ√х-эхў╕Єэ√х срщЄ√.
═х ЁрсюЄрхЄ т Ёхцшьх LOW8 (ё ы■с√ьш LOW16, ENDIAN).
┬ Ёхцшьх LOW16 фєсышЁєхЄ ярЁ√ срщЄ, Єръ ЁрсюЄрЄ№ эхы№ч .
┬ Ёхцшьх ENDIAN яЁюЎхёёюЁ ьхэ хЄ 0..3<->3..0, Єръ ўЄю яюёых ¤Єюую єцх яєЄр■Єё  ў╕Єэ√х-эхў╕Єэ√х ёыютр, ўЄю Єюцх схёяюыхчэю.

╩ръ шёяЁртшЄ№:
эрфю т√эєЄ№ яхЁхь√ўъш PC9-BE0, PC10-BE1, PC11-BE2, PC12-BE3
ш єёЄрэютшЄ№ яЁютюфр PC9-BE1, PC10-BE0, PC11-BE3, PC12-BE2.
╧юёых ¤Єюую тё╕ яЁртшы№эю ўшЄрхЄё  яю срщЄрь ш яю ёыютрь.
╠юцэю яюёЄртшЄ№ ярь Є№ сюы№°х, Є.ъ. CS эр A20,A21 ь√ т√ёЄрты хь тЁєўэє■.
═р юЄырфюўэющ яырЄх A19 яхЁхёхърхЄё  ё ъэюяъющ RIGHT, эю ЄхюЁхЄшўхёъш ьюцэю ёфхырЄ№ яЁютюфюъ юЄ ъэюяъш эр фЁєує■ эюцъє (яюёЄртшы эр PF2 тьхёЄю A31).

╤ яЁютюфрьш яЁш CPU_CLK = 96 ╠├Ў (эрёЄЁющър шч яЁшьхЁр) яюыєўшыё  фхышЄхы№ WAIT_STATE ьшэшьєь "7" (2+4+2), Є.х. 12 ╠├Ў (>83 эё). ─рцх яЁш "4" (2+2+1) ЁрсюЄрхЄ Єюы№ъю яюыютшэр ЄхёЄр ярь Єш (ё яЁютюфрьш).
╧Ёш CPU_CLK = 128 ╠├Ў (ъръ яюыєўшЄ№ 144 ╠├Ў шч 8 ╠├Ў? эрфю фЁєующ юёЎшыы ЄюЁ HSE?) фхышЄхы№ WAIT_STATE ьшэшьєь "8" (3+4+2), Є.х. 14.2 ╠├Ў (>70 эё) - тшфшью, яЁш "6" (2+3+2) ш "7" (2+4+2) эхєфрўэ√х ЁрёЄръЄютъш.
╤рьр ьшъЁюёїхьр ярь Єш шьххЄ "┬Ёхь  т√сюЁъш яю рфЁхёє ш ёшуэрыє n╤┼1
ш CE2 эх сюыхх 30 эё", "┬Ёхь  Ўшъыр ёўшЄ√трэш  шэЇюЁьрЎшш ьшэ 30 эё", "┬Ёхь  Ўшъыр чряшёш шэЇюЁьрЎшш ьшэ 30 эё".
╧ю фюъх эр ьшъЁюёїхьє ╬╟╙ ш яЁш ўЄхэшш, ш яЁш чряшёш эх эєцэр чрфхЁцър рфЁхёр яюёых ёэ Єш  єяЁрты ■∙шї ёшуэрыют.
╠шэшьры№эр  ЁрсюЄр■∙р  Ёєўэр  ЁрёЄръЄютър 2+4+0, Є.х. 21.3 ╠├Ў (47 эё). ═х ЁрсюЄрхЄ 1+4+0, Є.х. 25.6 ╠├Ў (39 эё).
─ы  ёЁртэхэш , ёъюЁюёЄ№ тёЄЁюхээюую ╧╟╙: 16 срщЄ чр 40 эё (ёЄЁрээю, ўЄю ЁрсюЄрхЄ, ъюуфр т EEPROM_CMD Delay=0!!!).

╩¤°шЁєхЄё  ыш фюёЄєя ъ тэх°эхьє ╬╟╙? ┬ фюъєьхэЄрЎшш эр 1986┬┼1╥ єяюьшэр■Єё  Єюы№ъю эрёЄЁющъш ъ¤°шЁютрэш  ш сєЇхЁшчрЎшш фы  DMA.

┬ J-Em v2 ё ╘шЄюэюь ьюцэю єёЄрэютшЄ№ Єюы№ъю 2 сЁ ъяющэЄр ш Єюы№ъю т ╧╟╙. ╧ю¤Єюьє Єюўъш юёЄрэютр ёЄртшь ышсю тЁєўэє■ т яЁюуЁрььх, ышсю тЁєўэє■ т юъэх фшчрёьр шыш фрьяр.




фы  ARM thumb яюэрфюсшЄё  ЄрсышЎр ъюэёЄрэЄ, схч ъюЄюЁющ эшъръ
т thumb эхЄ ёяюёюср яЁшётрштрэш  яю ўрёЄ ь!!!
сюыхх Єюую, т эхъюЄюЁ√ї рЁшЇьхЄшўхёъшї юяхЁрЎш ї хёЄ№ юуЁрэшўхэшх эр срщЄют√х ъюэёЄрэЄ√ (ASR/LSL фю 31, фтєїрфЁхёэ√щ ADD/SUB фю 7, р MOV,CMP ш юфэюрфЁхёэ√щ ADD/SUB фю 0xff)
AND,ORR,EOR Єюы№ъю т ЁхушёЄЁрї фтєїрфЁхёэю
шыш фхырЄ№ тёх ъюэёЄрэЄ√ ўхЁхч ld:jr:dw? яЁхфёърч√трхЄё  шфхры№эю, т ъ¤° ыюцшЄё  шфхры№эю, Єюы№ъю юфэр ыш°э   ъюьрэфр ш эрфю єўшЄ√трЄ№ т√Ёртэштрэшх эр 4 (.ALIGN  2 эр т√їюфх т√ЁртэштрхЄ эр 4, ьюцэю яЁ ью хую ш шёяюы№чютрЄ№, Єюы№ъю Єюуфр эрфю єэшъры№эє■ ьхЄъє фы  фцрьяр!)
LDR Rr,[PC,#0xNN] NN = 0x000...0x3fc (ъЁрЄэю 4) Єюы№ъю тяхЁ╕ф!!! шэЄхЁхёэю, юЄ ъръюую PC
%0100 1rrr NNNN NNNN
эр рфЁхёх 062a ъюьрэфр LDR Rr,[PC,#0x00] ўшЄрхЄ шч 062c (Єрь ыхцшЄ 44ff,42ba, т ЁхушёЄЁ яюярфрхЄ 42ba44ff)
эр рфЁхёх 061c ъюьрэфр LDR Rr,[PC,#0x00] ўшЄрхЄ шч 0620 (Єрь ыхцшЄ d00f,07d9, т ЁхушёЄЁ яюярфрхЄ 07d9d00f)

т PUSH ьюцэю єърчрЄ№ ёяшёюъ ЁхушёЄЁют (Єюы№ъю R0..R7 ш LR):
PUSH {R0,R2,R7,LR}
%1011 010L 7654 3210
т POP ьюцэю єърчрЄ№ ёяшёюъ ЁхушёЄЁют (Єюы№ъю R0..R7 ш PC):
POP {R0,R2,R7,PC}
%1011 110P 7654 3210


ъюЁюЄъшщ яхЁхїюф (-800..+800):
B addr
%1110 0sLL LLLL LLLL (S ё фюяюыэхэшхь фю 2)
L фюьэюцрхЄё  фю 2 ш яЁшсрты хЄё  ъ PC+4!!! (схч юъЁєуыхэш  фю 4)

фышээ√щ яхЁхїюф (-400000..+400000):
BL addr
%1111 0sHH HHHH HHHH
%1111 1LLL LLLL LLLL
HL фюьэюцрхЄё  фю 2 ш яЁшсрты хЄё  ъ PC яюёых ъюэЎр ъюьрэф√, Є.х. PC+4 (схч юъЁєуыхэш  фю 4)

тёх тхЄтыхэш  ъюЁюЄъшх:
BEQ addr (==)
%1101 0000 sLLL LLLL
BNE addr (!=)
%1101 0001 sLLL LLLL
BCS 2
BCC 3
BMI 4
BPL 5
BVS 6
BVC 7
BHI 8
BLS 9
BGE a (>=)
BLT b (<)
BGT c (>)
BLE d (<=)
L фюьэюцрхЄё  фю 2 ш яЁшсрты хЄё  ъ PC+4!!! (схч юъЁєуыхэш  фю 4)
чрЁрэхх эх єчэрЄ№, фрыхъю ыш эрфю яЁ√урЄ№ тяхЁ╕ф - Єю хёЄ№ т if/while эрфю фышээ√щ яхЁхїюф ё ъюЁюЄъшь юсїюфюь

яхЁхїюф яю ЁхушёЄЁє:
BX Rr
%0100 0111 0rrr r000
BLX Rr
%0100 0111 1rrr r000

switch?
SWI n
%1101 1111 nnnn nnnn
ўЄю фхырхЄ?
т ╠шырэфЁх Єрь svc #N


MOVS R,r
%0000 0000 00rr rRRR
MOV R,r
%0100 0110 Rrrr rRRR
MVNS R,r
%0100 0011 11rr rRRR


LDR R,[r,N*4]
%0110 1NNN NNrr rRRR
STR R,[r,N*4]
%0110 0NNN NNrr rRRR


ADDS R,r,a
%0001 100a aarr rRRR 

ADDS R,r,N
%0001 110N NNrr rRRR 

todo уЁєчшЄ№ R0 т эрўрых яЁюЎхфєЁ√, р яхЁхьхээ√х рфЁхёютрЄ№ юЄэюёшЄхы№эю эрўрыр шї сыюър (є ¤Єющ яЁюЎхфєЁ√). ┼ёыш яхЁхьхээр  ёыш°ъюь фрыхъю, Єю рфЁхёютрЄ№ ўхЁхч фЁєующ ЁхушёЄЁ (Єюуфр єц яЁшётюшЄ№ хую), р R0 эх яюЁЄшЄ№.
└ ъръ цх Єюуфр т√чют√? ╧юёых т√чютют эрфю юя Є№ уЁєчшЄ№ R0, цхырЄхы№эю шч Єющ цх ъюэёЄрэЄ√, эю хёыш юэр фрыхъю, Єю шч эютющ Єръющ цх.

todo ёфтшуш шэырщэ ъюьрэфрьш

todo фюсртшЄ№ эхфюёЄр■∙шх ъюьрэф√ Єшяр REV



Keil:
  Example 9.  Placing literal pools

        AREA     Loadcon, CODE, READONLY
        ENTRY                              ; Mark first instruction to execute
start
        BL       func1                     ; Branch to first subroutine
        BL       func2                     ; Branch to second subroutine
stop
        MOV      r0, #0x18                 ; angel_SWIreason_ReportException
        LDR      r1, =0x20026              ; ADP_Stopped_ApplicationExit
        SVC      #0x123456                 ; ARM semihosting (formerly SWI)
func1
        LDR      r0, =42                   ; => MOV R0, #42
        LDR      r1, =0x55555555           ; => LDR R1, [PC, #offset to
                                           ; Literal Pool 1]
        LDR      r2, =0xFFFFFFFF           ; => MVN R2, #0
        BX       lr
        LTORG                              ; Literal Pool 1 contains
                                           ; literal Ox55555555
func2
        LDR      r3, =0x55555555           ; => LDR R3, [PC, #offset to
                                           ; Literal Pool 1]
        ; LDR r4, =0x66666666              ; If this is uncommented it
                                           ; fails, because Literal Pool 2
                                           ; is out of reach
        BX       lr
LargeTable
        SPACE    4200                      ; Starting at the current location,
                                           ; clears a 4200 byte area of memory
                                           ; to zero
        END                                ; Literal Pool 2 is empty

        
        
        
Procedure Call Standard for the ARM Architecture (AAPCS).
4 Using Assembly and Intrinsics in C or C++ Code 4.3 Calling assembly functions from C and C++
The AAPCS describes a contract between caller functions and callee functions. For example, for integer or pointer types, it specifies that:
Х Registers R0-R3 pass argument values to the callee function, with subsequent arguments passed on the stack.
Х Register R0 passes the result value back to the caller function.
Х Caller functions must preserve R0-R3 and R12, because these registers are allowed to be corrupted by the callee function.
Х Callee functions must preserve R4-R11 and LR, because these registers are not allowed to be corrupted by the callee function. 
R13=SP
R14=LR (link register, рфЁхё тючтЁрЄр)
R15=PC

є эрё ёхщўрё эх Єръ: r0=rtemp, r1..r4 - ЁхушёЄЁ√ фрээ√ї (r1=Ёхчєы№ЄрЄ), ярЁрьхЄЁ√ эх яхЁхфр■Єё  т ЁхушёЄЁрї
r7=0xff
r8=0x00
r5,r6 ётюсюфэ√