From: Leo Date: Sun, 4 Jul 2010 18:13:12 +0000 (+0000) Subject: use lookup table for parity flag computation X-Git-Tag: forum-2010-07-01~4 X-Git-Url: http://cloudbase.mooo.com/gitweb/avrcpm.git/commitdiff_plain/37617bd8cf0870c2b8566694a5038a1d0a2716a2 use lookup table for parity flag computation as we now have the table, use it for sign and zero flag too changed flags to 8080 behavior DRAM read/write routines changed to use A8 to select low/high nibble. added USART RX buffer with Interrupt added timer routines more magic number eliminations git-svn-id: svn://cu.loc/avr-cpm/trunk@6 57430480-672e-4586-8877-bcf8adbbf3b7 --- diff --git a/avrcpm/avr/z80.asm b/avrcpm/avr/z80.asm index 9911e8c..873c922 100755 --- a/avrcpm/avr/z80.asm +++ b/avrcpm/avr/z80.asm @@ -16,17 +16,23 @@ ; You should have received a copy of the GNU General Public License ; along with this program. If not, see . - +;.nolist #if defined atmega8 .include "m8def.inc" - -#elif defined atmega48 - .include "m48def.inc" +#elif defined atmega168 + .include "m8def.inc" #else /* default */ .include "m88def.inc" ;FUSE_H=0xDF ;FUSE_L=0xF7 #endif +.list + + +#ifndef DRAM_DQ_ORDER /* If this is set to 1, the portbits */ + #define DRAM_DQ_ORDER 0 /* for DRAM D1 and WE are swapped. */ +#endif + #ifndef F_CPU #define F_CPU 20000000 /* system clock in Hz; defaults to 20MHz */ @@ -35,10 +41,13 @@ #define BAUD 38400 /* console baud rate */ #endif -; -.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever rounding -#define REFR_RATE 64000 /* dram refresh rate. most drams need 1/15.6µs */ +#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) /* clever rounding */ + +#define RXBUFSIZE 64 /* USART recieve buffer size. Must be power of 2 */ + +#define REFR_RATE 64000 /* dram refresh rate in cycles/s. */ + /* Most drams need 1/15.6µs. */ #define REFR_PRE 8 /* timer prescale factor */ #define REFR_CS 0x02 /* timer clock select for 1/8 */ #define REFR_CNT F_CPU / REFR_RATE / REFR_PRE @@ -51,10 +60,12 @@ #endif +#define EM_Z80 0 /* we don't have any z80 instructions yet */ + .equ MMC_DEBUG = 0 .equ INS_DEBUG = 0 -.equ MEMTEST = 0 -.equ BOOTWAIT = 0 +.equ MEMTEST = 1 +.equ BOOTWAIT = 1 .equ PORT_DEBUG = 0 .equ DISK_DEBUG = 0 .equ MEMFILL_CB = 1 @@ -73,26 +84,40 @@ .equ ram_a6 = 6 .equ ram_a7 = 7 +.equ RAM_AH_MASK = 0xE0 ; ram_a[7..5] +.equ PD_OUTPUT_MASK = 0xFE + ;Port B -.equ ram_a4 = 0 -.equ ram_a3 = 1 -.equ ram_a2 = 2 -.equ ram_a1 = 3 -.equ mmc_mosi= 3 -.equ ram_a0 = 4 -.equ mmc_miso= 4 -.equ ram_ras= 5 -.equ mmc_sck= 5 +.equ ram_a4 = 0 +.equ ram_a3 = 1 +.equ ram_a2 = 2 +.equ ram_a1 = 3 +.equ mmc_mosi = 3 +.equ ram_a0 = 4 +.equ mmc_miso = 4 +.equ ram_ras = 5 +.equ mmc_sck = 5 + +.equ RAM_AL_MASK = 0x1F ; ram_a[4..0] +.equ PB_OUTPUT_MASK = 0x3F ;Port C -.equ ram_d1 = 0 -.equ ram_w = 1 -.equ ram_d2 = 2 -.equ ram_d4 = 3 -.equ ram_d3 = 4 +#if DRAM_DQ_ORDER == 1 +.equ ram_d1 = 1 +.equ ram_w = 4 +#else /* original */ +.equ ram_d1 = 4 +.equ ram_w = 1 +#endif +.equ ram_d0 = 0 +.equ ram_d2 = 2 +.equ ram_d3 = 3 .equ ram_cas= 5 +.equ RAM_DQ_MASK = (1<{CY,m} | ;|RRA |--0-0*|Rotate Right Acc. |A=->{CY,A} | @@ -1972,72 +2705,11 @@ opjumps: ;|SRA m |**0P0*|Shift Right Arith. |m=m/2 | ;|SRL m |**0P0*|Shift Right Logical |m=->{0,m,CY} | ;|SUB s |***V1*|Subtract |A=A-s | -;|XOR s |***P00|Logical Exclusive OR |A=Axs | +;|XOR s |**0P00|Logical Exclusive OR |A=Axs | ;|----------+------+--------------------------------------------| -;| F |-*01? |Flag unaffected/affected/reset/set/unknown | -;| S |S |Sign flag (Bit 7) | -;| Z | Z |Zero flag (Bit 6) | -;| HC | H |Half Carry flag (Bit 4) | -;| P/V | P |Parity/Overflow flag (Bit 2, V=overflow) | -;| N | N |Add/Subtract flag (Bit 1) | -;| CY | C|Carry flag (Bit 0) | -;|-----------------+--------------------------------------------| -;| n |Immediate addressing | -;| nn |Immediate extended addressing | -;| e |Relative addressing (PC=PC+2+offset) | -;| [nn] |Extended addressing | -;| [xx+d] |Indexed addressing | -;| r |Register addressing | -;| [rr] |Register indirect addressing | -;| |Implied addressing | -;| b |Bit addressing | -;| p |Modified page zero addressing (see RST) | -;|-----------------+--------------------------------------------| -;|DEFB n(,...) |Define Byte(s) | -;|DEFB 'str'(,...) |Define Byte ASCII string(s) | -;|DEFS nn |Define Storage Block | -;|DEFW nn(,...) |Define Word(s) | -;|-----------------+--------------------------------------------| -;| A B C D E |Registers (8-bit) | -;| AF BC DE HL |Register pairs (16-bit) | -;| F |Flag register (8-bit) | -;| I |Interrupt page address register (8-bit) | -;| IX IY |Index registers (16-bit) | -;| PC |Program Counter register (16-bit) | -;| R |Memory Refresh register | -;| SP |Stack Pointer register (16-bit) | -;|-----------------+--------------------------------------------| -;| b |One bit (0 to 7) | -;| cc |Condition (C,M,NC,NZ,P,PE,PO,Z) | -;| d |One-byte expression (-128 to +127) | -;| dst |Destination s, ss, [BC], [DE], [HL], [nn] | -;| e |One-byte expression (-126 to +129) | -;| m |Any register r, [HL] or [xx+d] | -;| n |One-byte expression (0 to 255) | -;| nn |Two-byte expression (0 to 65535) | -;| pp |Register pair BC, DE, IX or SP | -;| qq |Register pair AF, BC, DE or HL | -;| qq' |Alternative register pair AF, BC, DE or HL | -;| r |Register A, B, C, D, E, H or L | -;| rr |Register pair BC, DE, IY or SP | -;| s |Any register r, value n, [HL] or [xx+d] | -;| src |Source s, ss, [BC], [DE], [HL], nn, [nn] | -;| ss |Register pair BC, DE, HL or SP | -;| xx |Index register IX or IY | -;|-----------------+--------------------------------------------| -;| + - * / ^ |Add/subtract/multiply/divide/exponent | -;| & ~ v x |Logical AND/NOT/inclusive OR/exclusive OR | -;| <- -> |Rotate left/right | -;| [ ] |Indirect addressing | -;| [ ]+ -[ ] |Indirect addressing auto-increment/decrement| -;| { } |Combination of operands | -;| # |Also BC=BC-1,DE=DE-1 | -;| ## |Only lower 4 bits of accumulator A used | -;---------------------------------------------------------------- - - -;ToDo: Parity at more instructions... + +.equ AVR_T = 6 .equ AVR_H = 5 .equ AVR_S = 4 .equ AVR_V = 3 @@ -2045,6 +2717,81 @@ opjumps: .equ AVR_Z = 1 .equ AVR_C = 0 +;------------------------------------------------; +; Move single bit between two registers +; +; bmov dstreg,dstbit,srcreg.srcbit + +.macro bmov + bst @2,@3 + bld @0,@1 +.endm + + +;------------------------------------------------; +; Load table value from flash indexed by source reg. +; +; ldpmx dstreg,tablebase,indexreg +; +; (6 words, 8 cycles) + +.macro ldpmx + ldi zl,low (@1*2) + ldi zh,high(@1*2) + add zl,@2 + brcc PC+2 + inc zh + lpm @0,z +.endm + +.macro do_z80_flags_HP +#if EM_Z80 + bmov z_flags, ZFL_P, temp, AVR_V + bmov z_flags, ZFL_H, temp, AVR_H +#endif +.endm + +.macro do_z80_flags_set_N +#if EM_Z80 + ori z_flags, (1<A | +;|----------|SZHP C|---------- 8080 ----------------------------| +;|RRCA |---- *|Rotate Right Circular|A=->A | +; ; -; OK do_op_rrc: ;Rotate Right Cyclical. All bits move 1 to the ;right, the lsb becomes c and msb. - andi z_flags, ~( (1<{CY,A} | +;|----------|SZHP C|---------- 8080 ----------------------------| +;|RRA |---- *|Rotate Right Acc. |A=->{CY,A} | ; -; OK +; do_op_rr: ;Rotate Right. All bits move 1 to the right, the lsb ;becomes c, c becomes msb. - clc + clc ; get z80 carry to avr carry sbrc z_flags,ZFL_C sec + do_z80_flags_op_rotate ; (clear ZFL_C, doesn't change AVR_C) + bmov z_flags,ZFL_C, opl,0 ; Bit 0 --> CY ror opl - in temp,sreg - andi z_flags,~( (1< CY rol opl - in temp,sreg - andi z_flags,0b11101100 - bst temp,AVR_C - bld z_flags,ZFL_C ret ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|ADD A,s |***V0*|Add |A=A+s | +;|----------|SZHP C|---------- 8080 ----------------------------| +;|ADD A,s |***P *|Add |A=A+s | +; ; -; Not yet checked do_op_adda: - ldi z_flags,0 add opl,z_a in temp,sreg - bst temp,AVR_Z - bld z_flags,ZFL_Z - bst temp,AVR_S - cpi opl,$80 - brne adda_no_s - ori z_flags,(1< todo - rcall do_op_inv - mov temp,opl + ldi oph,0 ; what to add + sbrc z_flags,ZFL_H ; if H-Flag + rjmp op_da_06 + mov temp,opl + andi temp,0x0f ; ... or lower digit > 9 + cpi temp,0x0a + brlo op_da_06n +op_da_06: + ori oph,0x06 +op_da_06n: + sbrc z_flags,(1< 9 + brlo do_op_da_h ; + ori temp2,0x06 ; add 6 to lower digit +do_op_da_h: ; + sbrc z_flags,ZFL_H ; ... or H-Flag + ori temp2,0x06 ; + add opl,temp2 ; + + ldi temp2,0 ; + mov temp,opl ; + andi temp,0xf0 ; + cpi temp,0xa0 ; + brlo do_op_da_c ; + ori temp2,0x60 ; +do_op_da_c: ; else sub-op + sbrc z_flags,ZFL_C ; + ori temp2,0x60 ; + andi z_flags, ~( (1<HL | +;|EX DE,HL |------|Exchange |DE<->HL | ; -; Not yet checked +; do_op_exhl: mov temp,z_h mov z_h,oph @@ -2565,7 +3436,7 @@ do_op_exhl: ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- ; -; Not yet checked +; TODO: Implement IFF1, IFF2 do_op_di: ret @@ -2573,15 +3444,18 @@ do_op_di: ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- ; -; Not yet checked +; TODO: Implement IFF1, IFF2 do_op_ei: ret ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifnz: sbrs z_flags, ZFL_Z ret @@ -2592,8 +3466,11 @@ do_op_ifnz: ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifz: sbrc z_flags, ZFL_Z ret @@ -2604,11 +3481,14 @@ do_op_ifz: ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifnc: sbrs z_flags, ZFL_C - ret + ret ldi insdech, 0 ldi insdecl, 0 ret @@ -2616,8 +3496,11 @@ do_op_ifnc: ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifc: sbrc z_flags, ZFL_C ret @@ -2628,11 +3511,13 @@ do_op_ifc: ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifpo: - rcall do_op_calcparity - sbrs temp2, 0 + sbrs z_flags, ZFL_P ret ldi insdech, 0 ldi insdecl, 0 @@ -2641,11 +3526,13 @@ do_op_ifpo: ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifpe: - rcall do_op_calcparity - sbrc temp2, 0 + sbrc z_flags, ZFL_P ret ldi insdech, 0 ldi insdecl, 0 @@ -2654,8 +3541,11 @@ do_op_ifpe: ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifp: ;sign positive, aka s=0 sbrs z_flags, ZFL_S ret @@ -2666,8 +3556,11 @@ do_op_ifp: ;sign positive, aka s=0 ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|CALL cc,nn|------|Conditional Call |If cc CALL | +;|JP cc,nn |------|Conditional Jump |If cc JP | +;|RET cc |------|Conditional Return |If cc RET | +; ; -; Not yet checked do_op_ifm: ;sign negative, aka s=1 sbrc z_flags, ZFL_S ret @@ -2678,8 +3571,9 @@ do_op_ifm: ;sign negative, aka s=1 ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|OUT [n],A |------|Output |[n]=A | +; ; -; Not yet checked ;Interface with peripherials goes here :) do_op_outa: ; out (opl),a .if PORT_DEBUG @@ -2702,8 +3596,9 @@ do_op_outa: ; out (opl),a ;---------------------------------------------------------------- ;|Mnemonic |SZHPNC|Description |Notes | ;---------------------------------------------------------------- +;|IN A,[n] |------|Input |A=[n] | +; ; -; Not yet checked do_op_in: ; in a,(opl) .if PORT_DEBUG rcall printstr @@ -2726,6 +3621,8 @@ do_op_in: ; in a,(opl) ret ;---------------------------------------------------------------- + +#if 0 do_op_calcparity: ldi temp2,1 sbrc parityb,0 @@ -2746,6 +3643,7 @@ do_op_calcparity: inc temp2 andi temp2,1 ret +#endif ;---------------------------------------------------------------- do_op_inv: @@ -2760,6 +3658,45 @@ do_op_inv: haltinv: rjmp haltinv +;---------------------------------------------------------------- +; Lookup table, stolen from z80ex, Z80 emulation library. +; http://z80ex.sourceforge.net/ + +; The S, Z, 5 and 3 bits and the parity of the lookup value +sz53p_tab: + .db 0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00 + .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c + .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04 + .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08 + .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24 + .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28 + .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20 + .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c + .db 0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04 + .db 0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08 + .db 0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00 + .db 0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c + .db 0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20 + .db 0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c + .db 0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24 + .db 0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28 + .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84 + .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88 + .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80 + .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c + .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0 + .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac + .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4 + .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8 + .db 0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80 + .db 0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c + .db 0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84 + .db 0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88 + .db 0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4 + .db 0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8 + .db 0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0 + .db 0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac + ; ----------------------- Opcode decoding ------------------------- @@ -3026,3 +3963,6 @@ inst_table: .dw (FETCH_NOP | OP_INV | STORE_NOP) ; FD (Z80 specific) .dw (FETCH_DIR8 | OP_SUBFA | STORE_NOP) ; FE nn CP n .dw (FETCH_RST | OP_NOP | STORE_CALL) ; FF RST 38H + +; vim:set ts=8 noet nowrap + diff --git a/avrcpm/avr/z80.hex b/avrcpm/avr/z80.hex deleted file mode 100644 index 63a0a3f..0000000 --- a/avrcpm/avr/z80.hex +++ /dev/null @@ -1,201 +0,0 @@ -:020000020000FC -:0200000012C02C -:02000600A8C28E -:100026000FE50DBF04E00EBFA89500E004BF08E190 -:1000360001BD00E101BD0FE307BB0EEF01BB02E20C -:1000460004BBA99AAD9AC59A929A949A08E10AB9FC -:1000560006E800BD00E000BD0CE009B908E103BDFB -:100066000AE005BD00E809BF78948BD243504D20C5 -:100076006F6E20616E204156522C2076312E300D47 -:1000860000007FD2496E6974696E67206D6D632EBC -:100096002E2E0D0024D150E060E00BEC23D201E0BF -:1000A60010E0500F611FC8F760E050E067D1E0E64E -:1000B600F0E060E250E00191FF93EF9313D2EF91ED -:1000C600FF9101E010E0500F611FE03EA1F7F03014 -:1000D60091F700E0802F00E2902F20E052D20D4FE2 -:1000E6006B2C20435055206973206C697665210D71 -:1000F600000020E0913018F09C3D08F421E0582FD4 -:10010600692FC9D1019610E0E0E7FAE0E00FF11F90 -:10011600E00FF11F7591A491072F0F71003059F070 -:1001260010E0000FE2ECF5E0E00FF11F05911491ED -:10013600E02FF12F09950A2F0C7F0695003051F01C -:10014600E4E6F7E010E0E00FF11F05911491E02FCF -:10015600F12F09957295A295072F0E70A0730A2BA1 -:10016600003051F0E6E9F6E010E0E00FF11F0591EE -:100176001491E02FF12F0995BCCF103091F011307A -:10018600A1F00895103099F01230D1F01031D1F06D -:100196001231D1F01431D1F01531D1F01631D1F040 -:1001A600089500E05F990FEF089500D20895E9D110 -:1001B60044656275673A2000DFD1E3D10D000895EA -:1001C600F9D10895B02E0895C02E0895E02E089511 -:1001D600D02E08950F935C2D60E01B2D103031F06A -:1001E6000AE1500F00E0601F1A95F8CF0F91013019 -:1001F60011F0023019F15F936695579566955795FC -:10020600BDD05F91E0E6F0E000E810E050FDE00FC1 -:1002160050FDF11F51FDF3956D2D5E2D10E81F93D6 -:100226000191FF93EF935ED1EF91FF9101E010E012 -:10023600500F611F1F911A9591F708955F936F9361 -:10024600669557956695579599D06F915F915F938F -:100256006F93E0E6F0E000E810E050FDE00F50FD9F -:10026600F11F51FDF3956D2D5E2D10E81F93FF9341 -:10027600EF9311D1EF91FF91019301E010E0500F40 -:10028600611F1F911A9591F76F915F91669557952A -:10029600669557959BD008950FEF0FB90EB107FFDE -:1002A600FDCF0FB10895E0E0F0E0F6DF0F3F21F457 -:1002B6003196FF3F11F0F9CF0895012F5DD161D13D -:1002C6003A204572726F723A204D4D432072657323 -:1002D600702074696D656F7574210D00A3C003E508 -:1002E6000DB9949A14E1012FD8DF1A95E1F7949885 -:1002F600D3DFD2DFD1DFD0DFCFDFCEDF949ACCDF02 -:10030600CBDFCADFC9DF94980FEFC7DF0FEFC5DF7A -:1003160000E4C3DF00E0C1DF00E0BFDF00E0BDDFD7 -:1003260000E0BBDF05E9B9DF0FEFB7DF10E0BBDFA9 -:10033600949AB2DF16E91F9394980FEFAEDF01E4AB -:10034600ACDF00E0AADF00E0A8DF00E0A6DF00E007 -:10035600A4DF05E9A2DFA0DF11E0A5DF003041F050 -:10036600949A9ADF1F911A95103029F704E0A5CFC9 -:100376001F91949A91DF00E00DB9089500E50DB93B -:1003860094988ADF01E589DF00E0550F661F001F9C -:1003960084DF062F82DF052F80DF00E07EDF05E9A0 -:1003A6007CDF0FEF7ADF12E07EDF13E07CDFE0E632 -:1003B600F0E072DF0193E036E1F7F230D1F76CDF5F -:1003C6006BDF949A69DF00E00DB9089500E50DB979 -:1003D600949862DF08E561DF00E0550F661F001F95 -:1003E6005CDF062F5ADF052F58DF00E056DF05E9F0 -:1003F60054DF0FEF52DF11E056DF0EEF4EDFE0E67F -:10040600F0E001914ADFE036E1F7F230D1F744DF60 -:1004160043DF42DF41DF0F3FE9F7949A3DDF00E01B -:100426000DB90895F89400E101BD0EE701BDFFCFB7 -:100436000F9302B3077102BB08B3007E08BBE0FD51 -:10044600C49AE1FDC39AE2FDC29AE3FDC19AE4FDB6 -:10045600C09AE5FD959AE6FD969AE7FD979AF0FD16 -:10046600939A0F910895007F989901609A99026076 -:100476009C9904609B99086008951F9315B3127E9A -:1004860000FD116001FD146002FD106103FD18609E -:1004960015BB1F910895F894E62FF0E0152F110F64 -:1004A600EE1FFF1FC5DFC598F0E0E52FEF77C0DF31 -:1004B6000000AD980000000092980000D4DF929AE8 -:1004C6000295AD9AF0E0E52FE068B2DF0000AD9846 -:1004D6000000929800000000C6DF929AAD9AC59A75 -:1004E60078940895F89414B31D6114BBC6DFE62F03 -:1004F600F0E0152F110FEE1FFF1F9ADF000000001E -:10050600C598F0E0E52FE06893DF00000000AD98A5 -:1005160000000000A998000000000000A99AAD9A0A -:10052600F0E0E52FEF7784DF0295A7DFAD980000B6 -:100536000000A99800000000A99A00000000AD9AEA -:10054600C59A04B3027E04BB05B3027E05BB78944C -:1005560008950000AD98C5980000AD9AC59A189503 -:100566000F930F700A3020F0095C24D00F91089584 -:10057600005D20D00F9108950295F2DF0295F0DF1D -:100586000895FF91EF910F93EE0FFF1F0591003035 -:1005960031F010D00D30D1F70AE00CD0F7CF3196FC -:1005A600F695E7950F91EF93FF9308955F9BFECF26 -:1005B6000CB108955D9BFECF0CB90895F502F602C5 -:1005C600F802FA02FC02FE020003020304030B0314 -:1005D6000E031103140317031C032103260333031D -:1005E600390344030895322D0895332D0895342D8B -:1005F6000895352D0895362D0895382D0895372DF3 -:1006060008953B2F422D0DD23B7F10FF3460089595 -:10061600342D432D0895362D452D0895372D482D1B -:100626000895392D4A2D0895632D542D34DF302F2A -:100636000895652D562D2FDF302F0895682D572DDF -:100646002ADF302F08956A2D592D25DF302F6A2D88 -:10065600592D01E010E0500F611F1DDF402F089556 -:10066600582F692F18DF0196302F0895582F692FBC -:1006760012DF302F0196582F692F0DDF0196402F7C -:100686000895582F692F07DF087340E0302F08952B -:100696006003610363036503670369036B036D030B -:1006A6006F03760379037C039B039E037F03840316 -:1006B60089038E03A103A503AD030895232E089590 -:1006C600332E0895432E0895532E0895632E0895CC -:1006D600832E0895732E0895242EB32F00E0F02E56 -:1006E600B2FFF3940895342E432E0895542E632EAC -:1006F6000895842E732E0895632D542D032FF2DE54 -:100706000895652D562D032FEDDE0895682D572D7E -:10071600032FE8DE08956A2D592D032FE3DE6A2D97 -:10072600592D01E010E0500F611F042FDBDE089504 -:10073600A42E932E0895942F832F089526D1832FC8 -:10074600942F08953F934F93382F492F0DD19F91A2 -:100756008F910895642F532F022DC4DE0895DA0376 -:10076600DB03E903F803FD03020408040E0417047F -:100776002004300442045204670472047D04880491 -:100786008F049C04A704AC04AF04B404B104C804E9 -:10079600B704E204E704EC04F104F604FC040205E1 -:1007A60007050C051005D904E004E10427050895A2 -:1007B600B17001E0300F0FB7F32E01FBB6F937FD2C -:1007C600B06805FBB4F900FBB2F90895B170B260E8 -:1007D60001E0301B0FB7F32E01FBB6F904FBB7F9A6 -:1007E60005FBB4F900FBB2F9089501E010E0300F03 -:1007F600411F089501E010E0301B410B0895BC7EB7 -:10080600330F10F43160B1600895BC7E369510F454 -:100816003068B16008958894B0FD089437950FB795 -:10082600BC7E00FBB0F908958894B0FD0894331F90 -:100836000FB7BC7E00FBB0F90895B0E0320D0FB7DC -:1008460001FBB6F904FB303809F4B06805FBB4F9CE -:1008560003FBB2F900FBB0F908958894B0FD089443 -:10086600321D0FB7B0E001FBB6F937FDB06805FBE6 -:10087600B4F903FBB2F900FBB0F9BD7F0895022D70 -:10088600031B302F0FB701FBB6F904FBB7F905FBC5 -:10089600B4F903FBB2F900FBB0F9B2600895022D7A -:1008A6008894B0FD0894030B302F0FB704FBB7F9FB -:1008B60005FBB4F903FBB2F900FBB0F930300FB712 -:1008C60001FBB6F9B2600895B0E032210FB701FB23 -:1008D600B6F904FBB7F905FBB4F9032F0895B0E0A8 -:1008E60032290FB701FBB6F904FBB7F905FBB4F9DA -:1008F600032F0895B0E032250FB701FBB6F904FBCC -:10090600B7F905FBB4F9032F0895370D481D0FB746 -:1009160000FBB0F9BD7F0895532F642F072DE2DD4C -:1009260001E010E0300F411F532F642F082DDADD50 -:100936000895532F642FAFDD302F01E0500F00E0F4 -:10094600601FA9DD402F0895532F642FA4DD302F9B -:1009560008957AD0032F0895B160089501E0B02775 -:1009660008953095B261089501E010E0901AA10A49 -:10097600592D6A2D042FB6DD01E010E0901AA10A68 -:10098600592D6A2D032FAEDD0895592D6A2D83DD6D -:10099600302F01E010E0900EA11E592D6A2D7BDD4F -:1009A600402F01E010E0900EA11E0895082D842E20 -:1009B600402F072D732E302F089508950895B6FF02 -:1009C6000895A0E070E00895B6FD0895A0E070E0F7 -:1009D6000895B0FF0895A0E070E00895B0FD089571 -:1009E600A0E070E008951DD010FF0895A0E070E02B -:1009F600089517D010FD0895A0E070E00895B7FFA0 -:100A06000895A0E070E00895B7FD0895A0E070E0B5 -:100A16000895022D132FB6DB0895132FAEDB302F6A -:100A2600089511E0F0FC1395F1FC1395F2FC139573 -:100A3600F3FC1395F4FC1395F5FC1395F6FC13954E -:100A4600F7FC1395117008959CDD496E76616C690B -:100A560064206F70636F646520402050433D000042 -:100A6600092F8ADD082F88DDFFCF00003201C10182 -:100A7600290D4204420851002114009C69412D00B1 -:100A860029116304630871002118009C5201E101D9 -:100A96004A0D8404840891002120009C6A412E009E -:100AA6004A11A504A508B100211C009C720112443C -:100AB6006B0DC604C608D1002150009C6B417249DB -:100AC6006B11E704E708F1002158009C920192029D -:100AD6008C0D0F060F0A11020054009C6C41324C1B -:100AE6008C11210421083100005C420043004400BF -:100AF6004500460047004F00410062006300640065 -:100B06006500660067006F00610082008300840054 -:100B16008500860087008F008100A200A300A40044 -:100B2600A500A600A700AF00A100C200C300C40034 -:100B3600C500C600C700CF00C100E200E300E40024 -:100B4600E500E600E700EF00E1000202030204020E -:100B5600050206020702000001022200230024000B -:100B66002500260027002F002100222423242424E8 -:100B76002524262427242F24212422282328242818 -:100B86002528262827282F282128222C232C242CE8 -:100B9600252C262C272C2F2C212C223023302430B8 -:100BA6002530263027302F30213022342334243488 -:100BB6002534263427342F342134223C233C243C4C -:100BC600253C263C273C2F3C213C22382338243820 -:100BD6002538263827382F382138022C032C042CA8 -:100BE600052C062C072C0F2C012C406A2061B269BB -:100BF600B201726A096431247302406E4002B26D1A -:100C0600009C726E72023128730240724061B271AA -:100C1600118872720A64312C73024076009CB27598 -:100C2600318C7276009C31307302407A6061B27901 -:100C36003092727A0B6431347302407EAB01B27D1E -:100C46004A91727E009C313C730240820061B281FF -:100C56000094728208643138730240868B01B28533 -:0A0C660000987286009C112C7302A6 -:00000001FF