New firmware with PWM support. It uses the GPIF of the board to stream
authorBernd Porr <Bernd.Porr@f2s.com>
Sun, 25 Nov 2007 21:17:14 +0000 (21:17 +0000)
committerBernd Porr <Bernd.Porr@f2s.com>
Sun, 25 Nov 2007 21:17:14 +0000 (21:17 +0000)
out the bit streams.

etc/hotplug/usb/usbdux/fx2-include.asm
etc/hotplug/usb/usbdux/usbdux_firmware.asm
etc/hotplug/usb/usbdux/usbdux_firmware.hex

index a39a887cd5e5960ea91c7660a379e981ff09bc97..c583161f435db10e11cac24159e70475c4947dab 100644 (file)
@@ -61,6 +61,7 @@
        .equ    EP8FIFOCFG,0E61BH
        ;; 
        .equ    INPKTEND,0E648H
+       .equ    OUTPKTEND,0E649H
        .equ    GPIFCTLCFG,0E6C3H
        .equ    GPIFABORT,0E6F5H
        .equ    GPIFIDLECTL,0E6C2H
        .equ    EP6GPIFFLGSEL,0E6E2H
        .equ    EP6GPIFPDFSTOP,0E6E3H
        .equ    EP6GPIFTRIG,0E6E4H
+       .equ    GPIFTCB3,0E6CEH
+       .equ    GPIFTCB2,0E6CFH
+       .equ    GPIFTCB1,0E6D0H
+       .equ    GPIFTCB0,0E6D1H
+       .equ    EP4GPIFFLGSEL,0E6DAH
+       .equ    EP4GPIFPFSTOP,0E6DBH
        ;; 
        ;; endpoint control
        .equ    EP2CS,0E6A3H
index ccec8c6616d35b1a8bf2fa2c8faedc876749184c..b0aa6ff12a5563654e52fa2bd4049aec699068b3 100644 (file)
@@ -34,6 +34,7 @@
        
        .equ    CMD_FLAG,90h    ; flag if next IN transf is DIO
        .equ    SGLCHANNEL,91h  ; channel for INSN
+       .equ    PWMFLAG,92h     ; PWM
        
        .equ    DIOSTAT0,98h    ; last status of the digital port
        .equ    DIOSTAT1,99h    ; same for the second counter
@@ -128,7 +129,6 @@ spare_isr:
 ep0in_isr:     
 ep0out_isr:    
 ep1in_isr:     
-ep1out_isr:    
 ibn_isr:       
 ep0ping_isr:   
 ep1ping_isr:   
@@ -143,7 +143,7 @@ ep6isoerr_isr:
 ep8isoerr_isr:
 ep6_isr:
 ep2_isr:
-
+ep4_isr:       
 
        push    dps
        push    dpl
@@ -195,16 +195,197 @@ main:
        lcall   init_timer
        
 mloop2:        nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
+
+;;; pwm
+       mov     r0,#PWMFLAG     ; pwm on?
+       mov     a,@r0           ; get info
+       jz      mloop2          ; it's off
+
+       mov     a,GPIFTRIG      ; GPIF status
+       anl     a,#80h          ; done bit
+       jz      mloop2          ; GPIF still busy
+
+        mov     a,#01h         ; WR,EP4, 01 = EP4
+        mov     GPIFTRIG,a     ; restart it
 
        sjmp    mloop2          ; loop for ever
 
 
+;;; GPIF waveform for PWM
+waveform:
+       ;;      0     1     2     3     4     5     6     7(not used)
+       ;; len (gives 50.007Hz)
+       .db     195,  195,  195,  195,  195,  195,  1,    1
+
+       ;; opcode
+       .db     002H, 006H, 002H, 002H, 002H, 002H, 002H, 002H
+       
+       ;; out
+       .db     0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH
+
+       ;; log
+       .db     000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H
+
+
+stopPWM:
+       mov     r0,#PWMFLAG     ; flag for PWM
+       mov     a,#0            ; PWM (for the main loop)
+       mov     @r0,a           ; set it
+
+       mov     dptr,#IFCONFIG  ; switch off GPIF
+       mov     a,#10000000b    ; gpif, 30MHz, internal IFCLK
+       lcall   syncdelaywr
+       ret
+       
+
+;;; init PWM
+startPWM:
+       mov     dptr,#IFCONFIG  ; switch on IFCLK signal
+       mov     a,#10000010b    ; gpif, 30MHz, internal IFCLK
+       lcall   syncdelaywr
+
+       mov     OEB,0FFH        ; output to port B
+
+       mov     DPTR,#EP4CFG
+       mov     a,#10100000b    ; valid, out, bulk
+       movx    @DPTR,a
+
+       ;; reset the endpoint
+       mov     dptr,#FIFORESET
+       mov     a,#80h          ; NAK
+       lcall   syncdelaywr
+       mov     a,#84h          ; reset EP4 + NAK
+       lcall   syncdelaywr
+       mov     a,#0            ; normal op
+       lcall   syncdelaywr
+
+       mov     dptr,#EP4BCL
+       mov     a,#0H           ; discard packets
+       lcall   syncdelaywr     ; empty FIFO buffer
+       lcall   syncdelaywr     ; empty FIFO buffer
+
+       ;; aborts all transfers by the GPIF
+       mov     dptr,#GPIFABORT
+       mov     a,#0ffh         ; abort all transfers
+       lcall   syncdelaywr
+
+       ;; wait for GPIF to finish
+wait_f_abort:
+       mov     a,GPIFTRIG      ; GPIF status
+       anl     a,#80h          ; done bit
+       jz      wait_f_abort    ; GPIF busy
+
+        mov     dptr,#GPIFCTLCFG
+        mov     a,#10000000b    ; tri state for CTRL
+        lcall   syncdelaywr
+
+        mov     dptr,#GPIFIDLECTL
+        mov     a,#11110000b    ; all CTL outputs low
+        lcall   syncdelaywr
+
+       ;; abort if FIFO is empty
+        mov     a,#00000001b    ; abort if empty
+        mov     dptr,#EP4GPIFFLGSEL
+        lcall   syncdelaywr
+
+       ;; 
+        mov     a,#00000001b    ; stop if GPIF flg
+        mov     dptr,#EP4GPIFPFSTOP
+        lcall   syncdelaywr
+
+       ;; transaction counter
+       mov     a,#0ffH
+       mov     dptr,#GPIFTCB3
+       lcall   syncdelaywr
+
+       ;; transaction counter
+       mov     a,#0ffH
+       mov     dptr,#GPIFTCB2
+       lcall   syncdelaywr
+
+       ;; transaction counter
+       mov     a,#0ffH         ; 512 bytes
+       mov     dptr,#GPIFTCB1
+       lcall   syncdelaywr
+
+       ;; transaction counter
+       mov     a,#0ffH
+       mov     dptr,#GPIFTCB0
+       lcall   syncdelaywr
+
+       ;; RDY pins. Not used here.
+        mov     a,#0
+        mov     dptr,#GPIFREADYCFG
+        lcall   syncdelaywr
+
+       ;; drives the output in the IDLE state
+        mov     a,#1
+        mov     dptr,#GPIFIDLECS
+        lcall   syncdelaywr
+
+       ;; direct data transfer from the EP to the GPIF
+       mov     dptr,#EP4FIFOCFG
+       mov     a,#00010000b    ; autoout=1, byte-wide
+       lcall   syncdelaywr
+
+       ;; waveform 0 is used for FIFO out
+       mov     dptr,#GPIFWFSELECT
+       mov     a,#00000000b
+       movx    @dptr,a
+       lcall   syncdelay
+
+       ;; transfer the delay byte from the EP to the waveform
+       mov     dptr,#0e781h    ; EP1 buffer
+       movx    a,@dptr         ; get the delay
+       mov     dptr,#waveform  ; points to the waveform
+       mov     r2,#6           ; fill 6 bytes
+timloop:
+       movx    @dptr,a         ; save timing in a xxx
+       inc     dptr
+       djnz    r2,timloop      ; fill the 6 delay bytes
+
+       ;; load waveform
+        mov     AUTOPTRH2,#0E4H ; XDATA0H
+        lcall   syncdelay
+        mov     AUTOPTRL2,#00H  ; XDATA0L
+        lcall   syncdelay
+
+       mov     dptr,#waveform  ; points to the waveform
+       
+        mov     AUTOPTRSETUP,#7 ; autoinc and enable
+        lcall   syncdelay
+
+        mov     r2,#20H         ; 32 bytes to transfer
+
+wavetr:
+        movx    a,@dptr
+       inc     dptr
+       push    dpl
+       push    dph
+       push    dpl1
+       push    dph1
+        mov     dptr,#XAUTODAT2
+        movx    @dptr,a
+        lcall   syncdelay
+       pop     dph1 
+       pop     dpl1
+       pop     dph 
+       pop     dpl
+        djnz    r2,wavetr
+
+       mov     dptr,#OUTPKTEND
+       mov     a,#084H
+       lcall   syncdelaywr
+       lcall   syncdelaywr
+
+       mov     r0,#PWMFLAG     ; flag for PWM
+       mov     a,#1            ; PWM (for the main loop)
+       mov     @r0,a           ; set it
+
+       ret
+
+
+
 ;;; initialise the ports for the AD-converter
 initAD:
        mov     OEA,#27H        ;PortA0,A1,A2,A5 Outputs
@@ -352,15 +533,11 @@ initeps:
        movx    @DPTR,a         ; can receive data
        lcall   syncdelay       ; wait to sync
        
-       mov     DPTR,#EP4CFG
+       mov     DPTR,#EP1OUTCFG
        mov     a,#10100000b    ; valid
        movx    @dptr,a
 
-       mov     dptr,#EP4FIFOCFG
-       mov     a,#00000000b    ; manual
-       movx    @dptr,a
-
-       mov     dptr,#EP4BCL    ; "arm" it
+       mov     dptr,#EP1OUTBC  ; "arm" it
        mov     a,#00h
        movx    @DPTR,a         ; can receive data
        lcall   syncdelay       ; wait until we can write again
@@ -376,7 +553,7 @@ initeps:
        movx    @DPTR,a         ;
 
        mov     dptr,#EPIE      ; interrupt enable
-       mov     a,#10100000b    ; enable irq for ep4,8
+       mov     a,#10001000b    ; enable irq for ep1out,8
        movx    @dptr,a         ; do it
 
        mov     dptr,#EPIRQ     ; clear IRQs
@@ -591,10 +768,9 @@ reset_ep6:
        lcall   syncdelaywr
        ret
 
-       
-;;; interrupt-routine for ep4
+;;; interrupt-routine for ep1out
 ;;; receives the channel list and other commands
-ep4_isr:
+ep1out_isr:
        push    dps
        push    dpl
        push    dph
@@ -611,17 +787,17 @@ ep4_isr:
        push    06h             ; R6
        push    07h             ; R7
                
-       mov     dptr,#0f400h    ; FIFO buffer of EP4
+       mov     dptr,#0E780h    ; FIFO buffer of EP1OUT
        movx    a,@dptr         ; get the first byte
        mov     r0,#CMD_FLAG    ; pointer to the command byte
        mov     @r0,a           ; store the command byte for ep8
 
-       mov     dptr,#ep4_jmp   ; jump table for the different functions
+       mov     dptr,#ep1out_jmp; jump table for the different functions
        rl      a               ; multiply by 2: sizeof sjmp
        jmp     @a+dptr         ; jump to the jump table
        ;; jump table, corresponds to the command bytes defined
        ;; in usbdux.c
-ep4_jmp:
+ep1out_jmp:
        sjmp    storechannellist; a=0
        sjmp    single_da       ; a=1
        sjmp    config_digital_b; a=2
@@ -629,6 +805,16 @@ ep4_jmp:
        sjmp    storesglchannel ; a=4
        sjmp    readcounter     ; a=5
        sjmp    writecounter    ; a=6
+       sjmp    pwm_on          ; a=7
+       sjmp    pwm_off         ; a=8
+
+pwm_on:
+       lcall   startPWM
+       sjmp    over_da
+
+pwm_off:
+       lcall   stopPWM
+       sjmp    over_da
 
        ;; read the counter
 readcounter:
@@ -638,7 +824,7 @@ readcounter:
 
        ;; write zeroes to the counters
 writecounter:
-       mov     dptr,#0f401h    ; buffer
+       mov     dptr,#0e781h    ; buffer
        mov     r0,#CTR0        ; r0 points to counter 0
        movx    a,@dptr         ; channel number
        jz      wrctr0          ; first channel
@@ -659,7 +845,7 @@ wrctr0:
 
 storesglchannel:
        mov     r0,#SGLCHANNEL  ; the conversion bytes are now stored in 80h
-       mov     dptr,#0f401h    ; FIFO buffer of EP4
+       mov     dptr,#0e781h    ; FIFO buffer of EP1OUT
        movx    a,@dptr         ; 
        mov     @r0,a
 
@@ -681,7 +867,7 @@ storesglchannel:
 storechannellist:
        mov     r0,#CHANNELLIST ; the conversion bytes are now stored in 80h
        mov     r2,#9           ; counter
-       mov     dptr,#0f401h    ; FIFO buffer of EP4
+       mov     dptr,#0e781h    ; FIFO buffer of EP1OUT
 chanlloop:     
        movx    a,@dptr         ; 
        mov     @r0,a
@@ -701,13 +887,13 @@ chanlloop:
 
 ;;; Single DA conversion. The 2 bytes are in the FIFO buffer
 single_da:
-       mov     dptr,#0f401h    ; FIFO buffer of EP4
+       mov     dptr,#0e781h    ; FIFO buffer of EP1OUT
        lcall   dalo            ; conversion
        sjmp    over_da
 
 ;;; configure the port B as input or output (bitwise)
 config_digital_b:
-       mov     dptr,#0f401h    ; FIFO buffer of EP4
+       mov     dptr,#0e781h    ; FIFO buffer of EP1OUT
        movx    a,@dptr         ; get the second byte
        mov     OEB,a           ; set the output enable bits
        sjmp    over_da
@@ -715,7 +901,7 @@ config_digital_b:
 ;;; Write one byte to the external digital port B
 ;;; and prepare for digital read
 write_digital_b:
-       mov     dptr,#0f401h    ; FIFO buffer of EP4
+       mov     dptr,#0e781h    ; FIFO buffer of EP1OUT
        movx    a,@dptr         ; get the second byte
        mov     OEB,a           ; output enable
        inc     dptr            ; next byte
@@ -735,7 +921,7 @@ write_digital_b:
        ;; 
        ;; for all commands the same
 over_da:       
-       mov     dptr,#EP4BCL
+       mov     dptr,#EP1OUTBC
        mov     a,#00h
        lcall   syncdelaywr     ; arm
        lcall   syncdelaywr     ; arm
@@ -747,7 +933,7 @@ over_da:
        mov     EXIF,a          ; Note: EXIF reg is not 8051 bit-addressable
 
        mov     DPTR,#EPIRQ     ; 
-       mov     a,#00100000b    ; clear the ep4irq
+       mov     a,#00001000b    ; clear the ep1outirq
        movx    @DPTR,a
 
        pop     07h
index b69ee8340939d2b29e8a8bc37a6be2c0f489d43f..3227792a9d5b51135b3e60e8ac1e74d042337ebf 100644 (file)
@@ -1,80 +1,99 @@
 :030000000201A258
-:03000B000202F8F6
+:03000B00020416D6
 :03004300020100B7
-:1001000002017F000203390002017F0002017F002B
+:1001000002017F000204570002017F0002017F000C
 :1001100002017F0002017F0002017F0002017F00D7
-:1001200002017F0002017F0002017F0002017F00C7
-:1001300002017F000203E40002017F000205630068
+:1001200002017F0002017F0002017F000205020040
+:1001300002017F0002017F0002017F0002068F00A2
 :1001400002017F0002017F0002017F0002017F00A7
 :1001500002017F0002017F0002017F0002017F0097
 :1001600002017F0002017F0002017F0002017F0087
 :1001700002017F0002017F0002017F0002017FC0B7
 :1001800086C082C083C084C085C0E0C0D0E591C273
 :10019000E4F591D0D0D0E0D085D084D083D082D087
-:1001A000863290E60074101205B990E60B740312C3
-:1001B00005B975B80075F8FF90E66874081205B9BE
-:1001C0001201D212025A1201D900000000000000F0
-:1001D00080F775B22775802222758E01758A107599
-:1001E0008C0075A882758900D28C22547C4481C20F
-:1001F000817A0830E704D2828002C282D280C28033
-:1002000023DAF0C2827A05D280C280DAFA7C007AE0
-:10021000047D08D280C280E58030E403EC4DFCED23
-:1002200003FDDAEF7B007A087D80D280C280E58012
-:1002300030E403EB4DFBED03FDDAEFD28122759A3A
-:10024000F8759B0075AF077880E6F990E67B08E6C5
-:100250001201EBEBF0ECF0D9F52290E6047480F09B
-:100260007402F07404F07406F07408F07400F090F6
-:10027000E6127492F090E6187400F090E691740023
-:10028000F01205AFF01205AFF01205AF90E613744F
-:10029000A0F090E6197400F090E6957400F0120555
-:1002A000AFF01205AF90E61474D2F090E61574E04A
-:1002B000F090E65E74A0F090E65F74A0F090E65CCB
-:1002C0007402F075E80175A88022E590FD5B600678
-:1002D000E4F70CF7801FE66D5D5C6019ED5A700C59
-:1002E000E714F7B4FF0F09E714F78009E704F77084
-:1002F0000409E704F7EDF622C086C0E0C0D0C000D4
-:10030000C001C002C003C004C005789879A0740180
-:10031000FC23FA23FB1202CA080909EB2323FC235E
-:10032000FA23FB1202CAD005D004D003D002D001B8
-:10033000D000D0D0D0E0D08632C086C082C083C08A
-:1003400084C085C0E0C0D0C000C001C002C003C0EE
-:1003500004C005C006C007E5AA5420701312023E6F
-:1003600090E69874001205B990E69974101205B9D8
-:10037000E5AA5401701190F0001204B790E6917450
-:10038000001205B91205B9E591C2E4F59190E65D58
-:100390007402F0D007D006D005D004D003D002D02C
-:1003A00001D000D0D0D0E0D085D084D083D082D00E
-:1003B000863290E60474801205B990E6047408123F
-:1003C00005B990E60474001205B92290E604748021
-:1003D0001205B990E60474061205B990E60474009B
-:1003E0001205B922C086C082C083C084C085C0E027
-:1003F000C0D0C000C001C002C003C004C005C00618
-:10040000C00790F400E07890F690040E23738039D2
-:10041000804C805280588022800280081203B212E1
-:10042000050B805A90F40178A0E06005F90808D91E
-:10043000FCA3E0F608A3E0F68044789190F401E094
-:10044000F61203B212050B803578807A0990F40118
-:10045000E0F6A308DAFA1203CB1204F7802090F436
-:10046000011204B7801890F401E0F5B3801090F405
-:1004700001E0F5B3A3E0F5901203B212050B90E68C
-:100480009574001205B91205B91205B9E591C2E4D7
-:10049000F59190E65F7420F0D007D006D005D00427
-:1004A000D003D002D001D000D0D0D0E0D085D0840D
-:1004B000D083D082D08632E0A3F8E0FBA3E0FCA397
-:1004C000E0A31204C8D8F32254C044304CC2857A49
-:1004D0000830E704D2828002C282D280C28023DA4E
-:1004E000F0EB7A0830E704D2828002C282D280C266
-:1004F0008023DAF0D2852212023E90E69874001230
-:1005000005B990E69974101205B92290FC01E4F047
-:1005100090FC007890E6F090051C237380448042A4
-:100520008040802580138002803878A090FC02797A
-:1005300008E6F008A3D9FA80197891E61201EB9049
-:10054000FC02EBF0A3ECF0800990FC02E590F0A334
-:10055000E4F090E69C74001205B990E69D741012C8
-:1005600005B922C086C082C083C084C085C0E0C0F7
-:10057000D0C000C001C002C003C004C005C006C096
-:100580000712050BE591C2E4F59190E65F7480F0E7
-:10059000D007D006D005D004D003D002D001D000BF
-:1005A000D0D0D0E0D085D084D083D082D086320025
-:0E05B000000000000000000022F01205AF2243
+:1001A000863290E60074101206E590E60B74031296
+:1001B00006E575B80075F8FF90E66874081206E564
+:1001C0001202F612037E1202FD007892E660FAE552
+:1001D000BB548060F47401F5BB80EEC3C3C3C3C3DA
+:1001E000C301010206020202020202FFFFFFFFFF3B
+:1001F000FFFFFF000000000000000078927400F68E
+:1002000090E60174801206E52290E60174821206DF
+:10021000E585FFB390E61374A0F090E604748012B5
+:1002200006E574841206E574001206E590E69574FE
+:10023000001206E51206E590E6F574FF1206E5E504
+:10024000BB548060FA90E6C374801206E590E6C263
+:1002500074F01206E5740190E6DA1206E574019076
+:10026000E6DB1206E574FF90E6CE1206E574FF9019
+:10027000E6CF1206E574FF90E6D01206E574FF9013
+:10028000E6D11206E5740090E6F31206E5740190DB
+:10029000E6C11206E590E61974101206E590E6C074
+:1002A0007400F01206DB90E781E09001DB7A06F043
+:1002B000A3DAFC759DE41206DB759E001206DB9046
+:1002C00001DB75AF071206DB7A20E0A3C082C08392
+:1002D000C084C08590E67CF01206DBD085D084D047
+:1002E00083D082DAE590E64974841206E51206E5C9
+:1002F00078927401F62275B22775802222758E01DC
+:10030000758A10758C0075A882758900D28C22546C
+:100310007C4481C2817A0830E704D2828002C282A2
+:10032000D280C28023DAF0C2827A05D280C280DA1B
+:10033000FA7C007A047D08D280C280E58030E40334
+:10034000EC4DFCED03FDDAEF7B007A087D80D28076
+:10035000C280E58030E403EB4DFBED03FDDAEFD224
+:100360008122759AF8759B0075AF077880E6F99041
+:10037000E67B08E612030FEBF0ECF0D9F52290E6ED
+:10038000047480F07402F07404F07406F07408F0E1
+:100390007400F090E6127492F090E6187400F090F9
+:1003A000E6917400F01206DBF01206DBF01206DBB9
+:1003B00090E61074A0F090E68D7400F01206DBF069
+:1003C0001206DB90E61474D2F090E61574E0F0901B
+:1003D000E65E7488F090E65F74A0F090E65C7402CC
+:1003E000F075E80175A88022E590FD5B6006E4F7F2
+:1003F0000CF7801FE66D5D5C6019ED5A700CE71418
+:10040000F7B4FF0F09E714F78009E704F770040950
+:10041000E704F7EDF622C086C0E0C0D0C000C001FE
+:10042000C002C003C004C005789879A07401FC2301
+:10043000FA23FB1203E8080909EB2323FC23FA2320
+:10044000FB1203E8D005D004D003D002D001D000C5
+:10045000D0D0D0E0D08632C086C082C083C084C0F5
+:1004600085C0E0C0D0C000C001C002C003C004C04D
+:1004700005C006C007E5AA5420701312036290E677
+:100480009874001206E590E69974101206E5E5AA44
+:100490005401701190F0001205E390E6917400127F
+:1004A00006E51206E5E591C2E4F59190E65D740279
+:1004B000F0D007D006D005D004D003D002D001D0B0
+:1004C00000D0D0D0E0D085D084D083D082D0863206
+:1004D00090E60474801206E590E60474081206E5BE
+:1004E00090E60474001206E52290E6047480120679
+:1004F000E590E60474061206E590E6047400120620
+:10050000E522C086C082C083C084C085C0E0C0D060
+:10051000C000C001C002C003C004C005C006C007BF
+:1005200090E780E07890F690052C23738047805AFE
+:100530008060806680308010801680028005120204
+:100540000980671201FB80621204D0120637805ABC
+:1005500090E78178A0E06005F90808D9FCA3E0F6EF
+:1005600008A3E0F68044789190E781E0F61204D089
+:10057000120637803578807A0990E781E0F6A30883
+:10058000DAFA1204E9120623802090E7811205E3CB
+:10059000801890E781E0F5B3801090E781E0F5B333
+:1005A000A3E0F5901204D012063790E68D74001285
+:1005B00006E51206E51206E5E591C2E4F59190E63E
+:1005C0005F7408F0D007D006D005D004D003D00265
+:1005D000D001D000D0D0D0E0D085D084D083D082DC
+:1005E000D08632E0A3F8E0FBA3E0FCA3E0A3120571
+:1005F000F4D8F32254C044304CC2857A0830E70462
+:10060000D2828002C282D280C28023DAF0EB7A08E2
+:1006100030E704D2828002C282D280C28023DAF024
+:10062000D2852212036290E69874001206E590E6E5
+:100630009974101206E52290FC01E4F090FC007819
+:1006400090E6F090064823738044804280408025E5
+:1006500080138002803878A090FC027908E6F008C8
+:10066000A3D9FA80197891E612030F90FC02EBF0FF
+:10067000A3ECF0800990FC02E590F0A3E4F090E692
+:100680009C74001206E590E69D74101206E522C0E7
+:1006900086C082C083C084C085C0E0C0D0C000C016
+:1006A00001C002C003C004C005C006C0071206375F
+:1006B000E591C2E4F59190E65F7480F0D007D00632
+:1006C000D005D004D003D002D001D000D0D0D0E0EB
+:1006D000D085D084D083D082D08632000000000044
+:0A06E0000000000022F01206DB22E9
 :00000001FF