diff --git a/.deps/delay.S.P b/.deps/delay.S.P new file mode 100644 index 0000000..8ce9a49 --- /dev/null +++ b/.deps/delay.S.P @@ -0,0 +1,2 @@ +delay.S.o: delay.S +delay.S : diff --git a/.deps/game.c.P b/.deps/game.c.P new file mode 100644 index 0000000..1075a1f --- /dev/null +++ b/.deps/game.c.P @@ -0,0 +1,6 @@ +game.c.o: game.c /opt/mcb32tools/include/stdint.h \ + /opt/mcb32tools/lib/gcc/mipsel-mcb32-elf/4.9.2/include/stdint-gcc.h \ + /opt/mcb32tools/include/pic32mx.h snake.h +game.c /opt/mcb32tools/include/stdint.h : + /opt/mcb32tools/lib/gcc/mipsel-mcb32-elf/4.9.2/include/stdint-gcc.h : + /opt/mcb32tools/include/pic32mx.h snake.h : diff --git a/.deps/labwork.S.P b/.deps/labwork.S.P new file mode 100644 index 0000000..6887fa6 --- /dev/null +++ b/.deps/labwork.S.P @@ -0,0 +1,2 @@ +labwork.S.o: labwork.S +labwork.S : diff --git a/.deps/snake.c.P b/.deps/snake.c.P new file mode 100644 index 0000000..68d07b2 --- /dev/null +++ b/.deps/snake.c.P @@ -0,0 +1,2 @@ +snake.c.o: snake.c +snake.c : diff --git a/data.c.o b/data.c.o index 0bce175..9908c47 100644 Binary files a/data.c.o and b/data.c.o differ diff --git a/delay.S b/delay.S new file mode 100644 index 0000000..c393b11 --- /dev/null +++ b/delay.S @@ -0,0 +1,102 @@ + # labwork.S + # Written 2015-2017 by F Lundevall + # Skeleton file for IS1200/IS1500 lab 1. + # The macros PUSH and POP are in the public domain. + # Please add your own code at the end of the file. + + # + # Please keep the two macros PUSH and POP unchanged + # +.macro PUSH reg + addi $sp,$sp,-4 + sw \reg,0($sp) +.endm + +.macro POP reg + lw \reg,0($sp) + addi $sp,$sp,4 +.endm + # + # Please add your own code below this line + # +.global delay +.global time2string +.data +.text + +hexasc: + andi $a0,$a0, 0xf #Checks 4 LSB + addi $v0,$a0,0x30 + jr $ra + nop + +delay: + PUSH $s3 + li $s3, 47000 + li $t6, 0 + li $t7, 0 + j loop + nop + loop: + beq $t7, $a0, end + nop + sub $a0, $a0, 1 + j loop2 + nop + loop2: + beq $t6, $s3, loop + nop + addi $t6, $t6, 1 + j loop2 + nop + end: + + POP $s3 + + jr $ra + nop + +time2string: + PUSH $s0 + PUSH $s1 + PUSH $ra + PUSH $a0 + add $s0,$a1,$0 #Saves time info to t0 + add $s1,$a0,$0 #Saves time info address to t1 + + srl $a0,$s0,12 # Första minut-talet + jal hexasc + nop + sb $v0, 0($s1) + + srl $a0,$s0,8 # Andra minut-talet + jal hexasc + nop + sb $v0, 1($s1) + + li $t4, 0x3A #Contains ":" + nop + sb $t4, 2($s1) # Lägger till kolon + + srl $a0,$s0,4 # första sekund-talet + jal hexasc + nop + sb $v0, 3($s1) + + add $a0, $s0, $zero # andra sekund-talet + jal hexasc + nop + sb $v0, 4($s1) + + li $t5,0x00 + nop + sb $t5, 5($s1) + + POP $a0 + POP $ra + POP $s1 + POP $s0 + + jr $ra + nop + diff --git a/delay.S.o b/delay.S.o new file mode 100644 index 0000000..8953ea6 Binary files /dev/null and b/delay.S.o differ diff --git a/display.c b/display.c index fd777bc..536f928 100644 --- a/display.c +++ b/display.c @@ -1,6 +1,10 @@ +/*Written by Fredrik Lundström and Michell Dib 2021 (c)*/ + #include -#include -#include "snake.h" +#include +#include "snake.h" //Project header file + +void *stdin, *stdout, *stderr; #define DISPLAY_CHANGE_TO_COMMAND_MODE (PORTFCLR = 0x10) #define DISPLAY_CHANGE_TO_DATA_MODE (PORTFSET = 0x10) @@ -14,18 +18,25 @@ #define DISPLAY_TURN_OFF_VDD (PORTFSET = 0x40) #define DISPLAY_TURN_OFF_VBAT (PORTFSET = 0x20) +/*If any point in the array is set to one the pixel att the same position be lit*/ +uint8_t display[32][128]; //Human readable pixel position and activation +uint8_t oled_display[512]; //Computer readable pixel position and activation + +/*(TAKEN FROM LAB) Quick sleep timer*/ void quicksleep(int cyc) { int i; for(i = cyc; i > 0; i--); } -uint8_t spi_send_recv(uint8_t data) { +/*(TAKEN FROM LAB) Send data to the OLED display*/ +uint8_t spi_send_recv(uint8_t data) { //LAB while(!(SPI2STAT & 0x08)); SPI2BUF = data; while(!(SPI2STAT & 1)); return SPI2BUF; } +/*(TAKEN FROM LAB) Initialize OLED display*/ void display_init(void){ DISPLAY_CHANGE_TO_COMMAND_MODE; quicksleep(10); @@ -56,13 +67,12 @@ void display_init(void){ spi_send_recv(0xAF); } -void display_string(int line, char *s) { +void display_string(int line, char *s) { //LAB int i; if(line < 0 || line >= 4) return; if(!s) return; - for(i = 0; i < 16; i++) if(*s) { textbuffer[line][i] = *s; @@ -71,7 +81,7 @@ void display_string(int line, char *s) { textbuffer[line][i] = ' '; } -void display_update(void) { +void display_update(void) { //LAB int i, j, k; int c; for(i = 0; i < 4; i++) { @@ -94,3 +104,82 @@ void display_update(void) { } } } + +/*(TAKEN FROM LAB) This will print any image on the display with the help of an array containing the map of the active and inactive pixels*/ +void display_image(int x, const uint8_t *data) { //LAB + int i, j; + + for(i = 0; i < 4; i++) { + DISPLAY_CHANGE_TO_COMMAND_MODE; + + spi_send_recv(0x22); + spi_send_recv(i); + + spi_send_recv(x & 0xF); + spi_send_recv(0x10 | ((x >> 4) & 0xF)); + + DISPLAY_CHANGE_TO_DATA_MODE; + + for(j = 0; j < 128; j++) + spi_send_recv(data[i*128 + j]); + } +} + +void translateToImage() { + int page, column, row, c, k; + uint8_t powerOfTwo = 1; + uint8_t oledNumber = 0; + int survivalMode = 0; + + for(page = 0; page < 4; page++) { + for(column = 0; column < 128; column++) { + powerOfTwo = 1; + oledNumber = 0; + + for(row = 0; row < 8; row++) { + if(display[8 * page + row][column]) { + oledNumber |= powerOfTwo; + } + powerOfTwo <<= 1; + } + oled_display[column + page * 128] = oledNumber; + } + } +} + +void create_object(int xPos, int yPos, int width, int height) { + int row, column; + + for (row = 0; row < 32; row++) { + for (column = 0; column < 128; column++) { + if (row >= yPos && row <= (yPos + height) && column >= xPos && column <= (xPos + width)) { + display[row][column] = 1; + } + } + } +} + +void clear_display() { + int row, column, i; + + for(row = 0; row < 32; row++) { + for(column = 0; column < 128; column++) { + display[row][column] = 0; + } + } + + for (i = 0; i < 512; i++) { + oled_display[i] = 0; + } +} + +void display_start(){ + clear_display(); + snake(); + //create_object(64,16,1,1); + translateToImage(); + display_image(0, oled_display); +} + + + diff --git a/display.c.o b/display.c.o index 5d20679..cbc50fb 100644 Binary files a/display.c.o and b/display.c.o differ diff --git a/game.c b/game.c new file mode 100644 index 0000000..55b6c5e --- /dev/null +++ b/game.c @@ -0,0 +1,54 @@ +/*Written by Fredrik Lundström and Michell Dib 2021 (c)*/ + +#include +#include +#include "snake.h" //Project header file + +int score = 0; +int speed = 20; + + +int snake_length; +int snake_width = 1; +int snake_x = 64; +int snake_y = 16; + +int apple_x; +int apple_y; + +void snake(){ + snake_create(); + apple_create(); + + if(snake_x == apple_x && snake_y == apple_y){ + apple_eat(); + } + delay(speed); + snake_move(); +} + +void snake_create(){ + snake_length = 5; + create_object(snake_x, snake_y, snake_length, snake_width); +} + +void snake_move(){ + if(snake_x > 128){ + snake_x = 0; + }else{ + snake_x++; + } +} + +void apple_create(){ + //Randomize + create_object(apple_x, apple_y, 1, 1); +} + +void apple_eat(){ + display[apple_x][apple_y] = 0; //Clear apple pixel + apple_x = 5; + apple_y = 5; + apple_create(); + score++; +} diff --git a/game.c.o b/game.c.o new file mode 100644 index 0000000..d3f1c09 Binary files /dev/null and b/game.c.o differ diff --git a/main.c b/main.c index 436919a..8eac487 100644 --- a/main.c +++ b/main.c @@ -1,9 +1,15 @@ +/*Written by Fredrik Lundström and Michell Dib 2021 (c)*/ + #include #include #include "snake.h" +void user_isr(){ + return; +} + int main(void){ - /* + /* This will set the peripheral bus clock to the same frequency as the sysclock. That means 80 MHz, when the microcontroller is running at 80 MHz. Changed 2017, as recommended by Axel. @@ -44,9 +50,14 @@ int main(void){ SPI2CONSET = 0x20; /* SPI2CON bit ON = 1; */ SPI2CONSET = 0x8000; + + display_init(); //Initialize OLED display + + while(1){ + display_start(); + } - display_init(); - display_string(0, "TEST"); - display_update(); return; } + + diff --git a/main.c.o b/main.c.o index 057d54e..7752174 100644 Binary files a/main.c.o and b/main.c.o differ diff --git a/outfile.elf b/outfile.elf index bf36f76..fe9213d 100644 Binary files a/outfile.elf and b/outfile.elf differ diff --git a/outfile.hex b/outfile.hex index 6fca1fb..3c440a7 100644 --- a/outfile.hex +++ b/outfile.hex @@ -1,26 +1,284 @@ :020000040000fa :020000041d00dd -:0800f8000000009d1c18009d92 +:0800f8000000009da821009dfd :020000040000fa :020000041d00dd -:10018000009d1a3c80015a2708004003000000002f +:1001800000701a4004005a2300709a401800004280 +:1001900000000000009d1a3c94015a27080040030b +:0401a000000000005b +:020000040000fa +:020000041d00dd +:10020000009d1a3ce01f5a3700005a8f0800400337 +:1002100000000000000000000000000000000000de +:020000040000fa +:020000041d00dd +:10022000009d1a3ce01f5a3704005a8f0800400313 +:1002300000000000000000000000000000000000be +:020000040000fa +:020000041d00dd +:10024000009d1a3ce01f5a3708005a8f08004003ef +:10025000000000000000000000000000000000009e +:020000040000fa +:020000041d00dd +:10026000009d1a3ce01f5a370c005a8f08004003cb +:10027000000000000000000000000000000000007e +:020000040000fa +:020000041d00dd +:10028000009d1a3ce01f5a3710005a8f08004003a7 +:10029000000000000000000000000000000000005e +:020000040000fa +:020000041d00dd +:1002a000009d1a3ce01f5a3714005a8f0800400383 +:1002b000000000000000000000000000000000003e +:020000040000fa +:020000041d00dd +:1002c000009d1a3ce01f5a3718005a8f080040035f +:1002d000000000000000000000000000000000001e +:020000040000fa +:020000041d00dd +:1002e000009d1a3ce01f5a371c005a8f080040033b +:1002f00000000000000000000000000000000000fe +:020000040000fa +:020000041d00dd +:10030000009d1a3ce01f5a3720005a8f0800400316 +:1003100000000000000000000000000000000000dd +:020000040000fa +:020000041d00dd +:10032000009d1a3ce01f5a3724005a8f08004003f2 +:1003300000000000000000000000000000000000bd +:020000040000fa +:020000041d00dd +:10034000009d1a3ce01f5a3728005a8f08004003ce +:10035000000000000000000000000000000000009d +:020000040000fa +:020000041d00dd +:10036000009d1a3ce01f5a372c005a8f08004003aa +:10037000000000000000000000000000000000007d +:020000040000fa +:020000041d00dd +:10038000009d1a3ce01f5a3730005a8f0800400386 +:10039000000000000000000000000000000000005d +:020000040000fa +:020000041d00dd +:1003a000009d1a3ce01f5a3734005a8f0800400362 +:1003b000000000000000000000000000000000003d +:020000040000fa +:020000041d00dd +:1003c000009d1a3ce01f5a3738005a8f080040033e +:1003d000000000000000000000000000000000001d +:020000040000fa +:020000041d00dd +:1003e000009d1a3ce01f5a373c005a8f080040031a +:1003f00000000000000000000000000000000000fd +:020000040000fa +:020000041d00dd +:10040000009d1a3ce01f5a3740005a8f08004003f5 +:1004100000000000000000000000000000000000dc +:020000040000fa +:020000041d00dd +:10042000009d1a3ce01f5a3744005a8f08004003d1 +:1004300000000000000000000000000000000000bc +:020000040000fa +:020000041d00dd +:10044000009d1a3ce01f5a3748005a8f08004003ad +:10045000000000000000000000000000000000009c +:020000040000fa +:020000041d00dd +:10046000009d1a3ce01f5a374c005a8f0800400389 +:10047000000000000000000000000000000000007c +:020000040000fa +:020000041d00dd +:10048000009d1a3ce01f5a3750005a8f0800400365 +:10049000000000000000000000000000000000005c +:020000040000fa +:020000041d00dd +:1004a000009d1a3ce01f5a3754005a8f0800400341 +:1004b000000000000000000000000000000000003c +:020000040000fa +:020000041d00dd +:1004c000009d1a3ce01f5a3758005a8f080040031d +:1004d000000000000000000000000000000000001c +:020000040000fa +:020000041d00dd +:1004e000009d1a3ce01f5a375c005a8f08004003f9 +:1004f00000000000000000000000000000000000fc +:020000040000fa +:020000041d00dd +:10050000009d1a3ce01f5a3760005a8f08004003d4 +:1005100000000000000000000000000000000000db +:020000040000fa +:020000041d00dd +:10052000009d1a3ce01f5a3764005a8f08004003b0 +:1005300000000000000000000000000000000000bb +:020000040000fa +:020000041d00dd +:10054000009d1a3ce01f5a3768005a8f080040038c +:10055000000000000000000000000000000000009b +:020000040000fa +:020000041d00dd +:10056000009d1a3ce01f5a376c005a8f0800400368 +:10057000000000000000000000000000000000007b +:020000040000fa +:020000041d00dd +:10058000009d1a3ce01f5a3770005a8f0800400344 +:10059000000000000000000000000000000000005b +:020000040000fa +:020000041d00dd +:1005a000009d1a3ce01f5a3774005a8f0800400320 +:1005b000000000000000000000000000000000003b +:020000040000fa +:020000041d00dd +:1005c000009d1a3ce01f5a3778005a8f08004003fc +:1005d000000000000000000000000000000000001b +:020000040000fa +:020000041d00dd +:1005e000009d1a3ce01f5a377c005a8f08004003d8 +:1005f00000000000000000000000000000000000fb +:020000040000fa +:020000041d00dd +:10060000009d1a3ce01f5a3780005a8f08004003b3 +:1006100000000000000000000000000000000000da +:020000040000fa +:020000041d00dd +:10062000009d1a3ce01f5a3784005a8f080040038f +:1006300000000000000000000000000000000000ba +:020000040000fa +:020000041d00dd +:10064000009d1a3ce01f5a3788005a8f080040036b +:10065000000000000000000000000000000000009a +:020000040000fa +:020000041d00dd +:10066000009d1a3ce01f5a378c005a8f0800400347 +:10067000000000000000000000000000000000007a +:020000040000fa +:020000041d00dd +:10068000009d1a3ce01f5a3790005a8f0800400323 +:10069000000000000000000000000000000000005a +:020000040000fa +:020000041d00dd +:1006a000009d1a3ce01f5a3794005a8f08004003ff +:1006b000000000000000000000000000000000003a +:020000040000fa +:020000041d00dd +:1006c000009d1a3ce01f5a3798005a8f08004003db +:1006d000000000000000000000000000000000001a +:020000040000fa +:020000041d00dd +:1006e000009d1a3ce01f5a379c005a8f08004003b7 +:1006f00000000000000000000000000000000000fa +:020000040000fa +:020000041d00dd +:10070000009d1a3ce01f5a37a0005a8f0800400392 +:1007100000000000000000000000000000000000d9 +:020000040000fa +:020000041d00dd +:10072000009d1a3ce01f5a37a4005a8f080040036e +:1007300000000000000000000000000000000000b9 +:020000040000fa +:020000041d00dd +:10074000009d1a3ce01f5a37a8005a8f080040034a +:100750000000000000000000000000000000000099 +:020000040000fa +:020000041d00dd +:10076000009d1a3ce01f5a37ac005a8f0800400326 +:100770000000000000000000000000000000000079 +:020000040000fa +:020000041d00dd +:10078000009d1a3ce01f5a37b0005a8f0800400302 +:100790000000000000000000000000000000000059 +:020000040000fa +:020000041d00dd +:1007a000009d1a3ce01f5a37b4005a8f08004003de +:1007b0000000000000000000000000000000000039 +:020000040000fa +:020000041d00dd +:1007c000009d1a3ce01f5a37b8005a8f08004003ba +:1007d0000000000000000000000000000000000019 +:020000040000fa +:020000041d00dd +:1007e000009d1a3ce01f5a37bc005a8f0800400396 +:1007f00000000000000000000000000000000000f9 +:020000040000fa +:020000041d00dd +:10080000009d1a3ce01f5a37c0005a8f0800400371 +:1008100000000000000000000000000000000000d8 +:020000040000fa +:020000041d00dd +:10082000009d1a3ce01f5a37c4005a8f080040034d +:1008300000000000000000000000000000000000b8 +:020000040000fa +:020000041d00dd +:10084000009d1a3ce01f5a37c8005a8f0800400329 +:100850000000000000000000000000000000000098 +:020000040000fa +:020000041d00dd +:10086000009d1a3ce01f5a37cc005a8f0800400305 +:100870000000000000000000000000000000000078 +:020000040000fa +:020000041d00dd +:10088000009d1a3ce01f5a37d0005a8f08004003e1 +:100890000000000000000000000000000000000058 +:020000040000fa +:020000041d00dd +:1008a000009d1a3ce01f5a37d4005a8f08004003bd +:1008b0000000000000000000000000000000000038 +:020000040000fa +:020000041d00dd +:1008c000009d1a3ce01f5a37d8005a8f0800400399 +:1008d0000000000000000000000000000000000018 +:020000040000fa +:020000041d00dd +:1008e000009d1a3ce01f5a37dc005a8f0800400375 +:1008f00000000000000000000000000000000000f8 +:020000040000fa +:020000041d00dd +:10090000009d1a3ce01f5a37e0005a8f0800400350 +:1009100000000000000000000000000000000000d7 +:020000040000fa +:020000041d00dd +:10092000009d1a3ce01f5a37e4005a8f080040032c +:1009300000000000000000000000000000000000b7 +:020000040000fa +:020000041d00dd +:10094000009d1a3ce01f5a37e8005a8f0800400308 +:100950000000000000000000000000000000000097 +:020000040000fa +:020000041d00dd +:10096000009d1a3ce01f5a37ec005a8f08004003e4 +:100970000000000000000000000000000000000077 +:020000040000fa +:020000041d00dd +:10098000009d1a3ce01f5a37f0005a8f08004003c0 +:100990000000000000000000000000000000000057 +:020000040000fa +:020000041d00dd +:1009a000009d1a3ce01f5a37f4005a8f080040039c +:1009b0000000000000000000000000000000000037 +:020000040000fa +:020000041d00dd +:1009c000009d1a3ce01f5a37f8005a8f0800400378 +:1009d0000000000000000000000000000000000017 +:020000040000fa +:020000041d00dd +:1009e000009d1a3ce01f5a37fc005a8f0800400354 +:0409f0000000000003 :020000040000fa :020000041d00dd :10100000009d1a3c10105a27080040030000000001 :020000040000fa :020000041d00dd :1010100000601a40c0045a7f050040130000000021 -:10102000009d1a3cb0175a2708004003000000003a -:1010300000a01d3c0040bd2700a01c3c08009c27d0 +:10102000009d1a3c4c1e5a27080040030000000097 +:1010300000a01d3c0040bd2700a01c3c1c009c27bc :101040000260094020582001801e2a7d8449497d84 :1010500002608940c000000000e0dc4102608b407b -:10106000c0000000009d083cc417082509f80001d5 -:101070000000000000a0083c0800082500a0093c72 -:10108000480029250600001000000000000000ad07 +:10106000c0000000009d083c601e082509f8000132 +:101070000000000000a0083c1c00082500a0093c5e +:10108000741229250600001000000000000000adc9 :10109000040000ad080000ad0c0000ad10000825f4 :1010a0002b080901f9ff201400000000009d083cf6 -:1010b000881c082500a0093c0800292500a00a3c3e -:1010c00008004a25050000100000000000000b8dfc +:1010b0001026082500a0093c0800292500a00a3cac +:1010c0001c004a25050000100000000000000b8de8 :1010d00000002bad04000825040029252b082a0157 :1010e000faff20140000000000488040ffff0a249f :1010f00000588a40009d093c00002925017889405c @@ -28,195 +286,350 @@ :1011100001608a408000093c0068894000800840e6 :101120008005097d404c0900006008405800013ce2 :10113000244001012540280100608840009d083cb2 -:10114000e417082509f800010000000000600840cd +:10114000801e082509f8000100000000006008402a :10115000bfff013cffff21342440010100608840b3 -:10116000000084300000a530009d083c04180825cc +:10116000000084300000a530009d083c9021082537 :0811700008000001000000006e :020000040000fa :020000041d00dd -:10117800f0ffbd270c00beaf21f0a0031000c4afe4 -:101188001000c28f0000c2af6904400b00000000cd -:101198000000c28fffff42240000c2af0000c28fd0 -:1011a800fbff401c0000000021e8c0030c00be8fbc -:1011b8001000bd270800e00300000000f8ffbd276d -:1011c8000400beaf21f0a003211080000800c2a3d4 -:1011d8000000000080bf023c105a42340000428cdc -:1011e80008004230fbff40100000000080bf023cb6 -:1011f800205a42340800c393000043ac00000000aa -:1012080080bf023c105a42340000428c0100423038 -:10121800fbff40100000000080bf023c205a42340f -:101228000000428cff00423021e8c0030400be8f5a -:101238000800bd270800e00300000000e8ffbd2704 -:101248001400bfaf1000beaf21f0a00388bf023c5e -:101258005461423410000324000043ac0a00042403 -:101268005e04400f0000000088bf023c5461423415 -:1012780040000324000043ac0f00023c40424434c9 -:101288005e04400f00000000ae0004247104400f0b -:101298000000000088bf023c94614234000203242d -:1012a800000043ac0a0004245e04400f0000000064 -:1012b80088bf023c9861423400020324000043ac1a -:1012c8000a0004245e04400f000000008d0004247e -:1012d8007104400f00000000140004247104400f42 -:1012e80000000000d90004247104400f0000000031 -:1012f800f10004247104400f0000000088bf023c84 -:101308005461423420000324000043ac9800023c9e -:10131800809644345e04400f00000000a1000424bd -:101328007104400f00000000c80004247104400f3d -:1013380000000000da0004247104400f00000000df -:10134800200004247104400f00000000af000424b2 -:101358007104400f0000000021e8c0031400bf8f93 -:101368001000be8f1800bd270800e0030000000031 -:10137800f0ffbd270c00beaf21f0a0031000c4afe2 -:101388001400c5af1000c28f050040040000000023 -:101398001000c28f0400422803004014000000001f -:1013a8001705400b000000001400c28f0300401412 -:1013b800000000001705400b000000000000c0af4f -:1013c8001305400b000000001400c28f000042808b -:1013d80010004010000000001400c28f000043807d -:1013e80000a0023c1000c48f002904000000c48f34 -:1013f8002120a4000800422421108200000043a0fc -:101408001400c28f010042241400c2af1005400b23 -:101418000000000000a0023c1000c38f0021030060 -:101428000000c38f211883000800422421106200a5 -:1014380020000324000043a00000c28f01004224c2 -:101448000000c2af0000c28f10004228deff401427 -:101458000000000021e8c0030c00be8f1000bd276b -:101468000800e00300000000d8ffbd272400bfaf3c -:101478002000beaf21f0a0031000c0af6a05400bea -:101488000000000088bf023c54614234100003246d -:10149800000043ac220004247104400f0000000047 -:1014a8001000c28fff004230212040007104400f1d -:1014b80000000000212000007104400f000000001f -:1014c800100004247104400f0000000088bf023c93 -:1014d8005861423410000324000043ac1400c0af2c -:1014e8006305400b0000000000a0023c1000c38f01 -:1014f800002103001400c38f211883000800422430 -:1015080021106200000042801c00c2af1c00c28f84 -:101518008000423003004010000000006005400bce -:10152800000000001800c0af5c05400b0000000080 -:101538001c00c28fc01802001800c28f2118620058 -:10154800009d023c6818422421106200000042906d -:10155800212040007104400f000000001800c28fd5 -:10156800010042241800c2af1800c28f08004228a8 -:10157800efff4014000000001400c28f0100422455 -:101588001400c2af1400c28f10004228d6ff4014c6 -:10159800000000001000c28f010042241000c2affa -:1015a8001000c28f04004228b6ff4014000000005b -:1015b80021e8c0032400bf8f2000be8f2800bd276c -:1015c8000800e00300000000e8ffbd271400bfafdb -:1015d8001000beaf21f0a00380bf023c30f24234bd -:1015e80099aa033c55666334000043ac80bf023cb3 -:1015f80030f242346655033caa996334000043ac88 -:101608000000000080bf023c00f042340000438c20 -:101618002000023c24106200faff40140000000081 -:1016280080bf023c04f042341800033c000043ac85 -:101638000000000080bf023c00f042340000438cf0 -:101648002000023c24106200faff40140000000051 -:1016580080bf023c30f24234000040ac80bf023c04 -:1016680060904234ffff0334000043ac88bf023c63 -:1016780030614234000040ac88bf023c046142340f -:10168800ff000324000043ac88bf023c10614234d1 -:10169800000040ac88bf023c50614234ffff033475 -:1016a800000043ac88bf023c90614234000203242e -:1016b800000043ac88bf023c70614234000040ac7b -:1016c80088bf023cb0614234000040ac88bf023c95 -:1016d8004461423470000324000043ac88bf023cdc -:1016e8008461423400020324000043ac88bf023cfa -:1016f800c860423400010324000043ac88bf023ca8 -:101708004861423402000324000043ac80bf023c1d -:10171800005a4234000040ac80bf023c305a423488 -:1017280004000324000043ac80bf023c145a423436 -:1017380040000324000043ac80bf023c085a4234f6 -:1017480040000324000043ac80bf023c085a4234e6 -:1017580020000324000043ac80bf023c085a4234f6 -:1017680000800334000043ac9104400f00000000e7 -:1017780021200000009d023c681c4524de04400f27 -:10178800000000001c05400f0000000000000000e1 -:1017980021e8c0031400bf8f1000be8f1800bd27ba -:1017a8000800e00300000000f8ffbd270400beaffa -:1017b80021f0a003ef05400b00000000f8ffbd2753 -:1017c8000400beaf21f0a00321e8c0030400be8fcf -:1017d8000800bd270800e00300000000f8ffbd274f -:1017e8000400beaf21f0a00321e8c0030400be8faf -:1017f8000800bd270800e003000000000000843056 -:101808000000a5307405400f00000000ffff001025 -:0418180000000000cc -:020000040000fa -:020000041d00dd -:10181c004c000000ffffffff0e030001ffffffff66 -:10182c00ffffffff010002010010009d0000009d62 -:10183c0000f0010000f0019d00100000f02fc0bf6f -:10184c0010000000000000a008000000ffffffffd8 -:0c185c000002009d0002009d2000000022 -:020000040000fa -:020000041d00dd -:101868000000000000000000000000000000000070 -:101878000000000000000000000000000000000060 -:101888000000000000000000000000000000000050 -:101898000000000000000000000000000000000040 -:1018a8000000000000000000000000000000000030 -:1018b8000000000000000000000000000000000020 -:1018c8000000000000000000000000000000000010 -:1018d8000000000000000000000000000000000000 -:1018e80000000000000000000000000000000000f0 -:1018f80000000000000000000000000000000000e0 -:1019080000000000000000000000000000000000cf -:1019180000000000000000000000000000000000bf -:1019280000000000000000000000000000000000af -:10193800000000000000000000000000000000009f -:10194800000000000000000000000000000000008f -:10195800000000000000000000000000000000007f -:1019680000000000000000000000005e0000000011 -:10197800000004030403000000247e24247e2400c5 -:1019880000244aff52240000004626100864620022 -:1019980000344a4a342050000000000403000000cc -:1019a8000000007e81000000000000817e00000031 -:1019b800002a1c3e1c2a00000008083e08080000f7 -:1019c8000000008060000000000808080808000007 -:1019d8000000000060000000004020100804020021 -:1019e800003e4149413e00000000427f40000000a7 -:1019f80000006251494600000000224949360000b3 -:101a080000000e087f08000000002345453900004b -:101a180000003e494932000000000161190700003a -:101a2800000036494936000000000609097e00001a -:101a38000000006600000000000080660000000052 -:101a480000000814224100000000141414140000bf -:101a5800000041221408000000020151090600009c -:101a6800001c225959520c0000007e09097e000012 -:101a780000007f494936000000003e414122000035 -:101a880000007f41413e000000007f4949410000bd -:101a980000007f090901000000003e4151320000aa -:101aa80000007f08087f00000000417f410000001f -:101ab80000002040403f000000007f081463000041 -:101ac80000007f4040400000007f0204027f0000c9 -:101ad800007f0608307f000000003e41413e0000c4 -:101ae80000007f090906000000003e41617e4000b9 -:101af80000007f09097600000000264949320000ed -:101b08000001017f0101000000003f40403f00004c -:101b1800001f2040201f0000003f4030403f0000d1 -:101b28000000770808770000000304780403000029 -:101b3800000071494947000000007f414100000052 -:101b4800000204081020400000000041417f00000e -:101b580000040201020400000040404040404000f0 -:101b6800000001020400000000003048287800004e -:101b780000007f484830000000003048480000005e -:101b880000003048487f000000003058581000001e -:101b980000007e09010200000000509898700000c3 -:101ba80000007f08087000000000007a00000000b4 -:101bb80000004080807a000000007f102848000064 -:101bc8000000007f00000000007808100870000086 -:101bd8000000780808700000000030484830000015 -:101be8000000f828281000000000102828f800003d -:101bf8000000700808100000000048545424000039 -:101c08000000083c48200000000038402078000010 -:101c180000003840380000000038402040380000fc -:101c28000000483030480000000018a0a0780000ec -:101c380000006454544c00000000081c22410000bd -:101c48000000007e00000000000041221c08000087 -:101c580000000402040200000078444244780000b6 -:081c6800544553540000000034 -:020000040000fa -:020000041d00dd -:101c7000000020020100000300000000000000003e -:081c800001000000000000005b +:10118000f0ffbd270c00beaf21f0a0031000c4afdc +:101190001000c28f0000c2af6b04400b00000000c3 +:1011a0000000c28fffff42240000c2af0000c28fc8 +:1011b000fbff401c0000000021e8c0030c00be8fb4 +:1011c0001000bd270800e00300000000f8ffbd2765 +:1011d0000400beaf21f0a003211080000800c2a3cc +:1011e0000000000080bf023c105a42340000428cd4 +:1011f00008004230fbff40100000000080bf023cae +:10120000205a42340800c393000043ac00000000a1 +:1012100080bf023c105a42340000428c0100423030 +:10122000fbff40100000000080bf023c205a423407 +:101230000000428cff00423021e8c0030400be8f52 +:101240000800bd270800e00300000000e8ffbd27fc +:101250001400bfaf1000beaf21f0a00388bf023c56 +:101260005461423410000324000043ac0a000424fb +:101270006004400f0000000088bf023c546142340b +:1012800040000324000043ac0f00023c40424434c1 +:101290006004400f00000000ae0004247304400fff +:1012a0000000000088bf023c946142340002032425 +:1012b000000043ac0a0004246004400f000000005a +:1012c00088bf023c9861423400020324000043ac12 +:1012d0000a0004246004400f000000008d00042474 +:1012e0007304400f00000000140004247304400f36 +:1012f00000000000d90004247304400f0000000027 +:10130000f10004247304400f0000000088bf023c79 +:101310005461423420000324000043ac9800023c96 +:10132000809644346004400f00000000a1000424b3 +:101330007304400f00000000c80004247304400f31 +:1013400000000000da0004247304400f00000000d5 +:10135000200004247304400f00000000af000424a8 +:101360007304400f0000000021e8c0031400bf8f89 +:101370001000be8f1800bd270800e0030000000029 +:10138000f0ffbd270c00beaf21f0a0031000c4afda +:101390001400c5af1000c28f05004004000000001b +:1013a0001000c28f04004228030040140000000017 +:1013b0001905400b000000001400c28f0300401408 +:1013c000000000001905400b000000000000c0af45 +:1013d0001505400b000000001400c28f0000428081 +:1013e00010004010000000001400c28f0000438075 +:1013f00000a0023c1000c48f002904000000c48f2c +:101400002120a4001c10422421108200000043a0cf +:101410001400c28f010042241400c2af1205400b19 +:101420000000000000a0023c1000c38f0021030058 +:101430000000c38f211883001c1042242110620079 +:1014400020000324000043a00000c28f01004224ba +:101450000000c2af0000c28f10004228deff40141f +:101460000000000021e8c0030c00be8f1000bd2763 +:101470000800e00300000000d8ffbd272400bfaf34 +:101480002000beaf21f0a0031000c0af6c05400be0 +:101490000000000088bf023c546142341000032465 +:1014a000000043ac220004247304400f000000003d +:1014b0001000c28fff004230212040007304400f13 +:1014c00000000000212000007304400f0000000015 +:1014d000100004247304400f0000000088bf023c89 +:1014e0005861423410000324000043ac1400c0af24 +:1014f0006505400b0000000000a0023c1000c38ff7 +:10150000002103001400c38f211883001c10422403 +:1015100021106200000042801c00c2af1c00c28f7c +:101520008000423003004010000000006205400bc4 +:10153000000000001800c0af5e05400b0000000076 +:101540001c00c28fc01802001800c28f2118620050 +:10155000009d023cf42142242110620000004290d0 +:10156000212040007304400f000000001800c28fcb +:10157000010042241800c2af1800c28f08004228a0 +:10158000efff4014000000001400c28f010042244d +:101590001400c2af1400c28f10004228d6ff4014be +:1015a000000000001000c28f010042241000c2aff2 +:1015b0001000c28f04004228b6ff40140000000053 +:1015c00021e8c0032400bf8f2000be8f2800bd2764 +:1015d0000800e00300000000e0ffbd271c00bfafd3 +:1015e0001800beaf21f0a0032000c4af2400c5af97 +:1015f0001000c0afb805400b0000000088bf023cdf +:101600005461423410000324000043ac220004243f +:101610007304400f000000001000c28fff00423032 +:10162000212040007304400f000000002000c28f02 +:10163000ff0042300f004230212040007304400f71 +:10164000000000002000c28f031102002014027c61 +:101650000f0042302014027c100042342014027c1f +:10166000ff004230212040007304400f00000000c2 +:1016700088bf023c5861423410000324000043ac90 +:101680001400c0afb105400b000000001000c28f75 +:10169000c01902001400c28f2110620021184000fe +:1016a0002400c28f211043000000429021204000fe +:1016b0007304400f000000001400c28f0100422498 +:1016c0001400c2af1400c28f80004228efff401404 +:1016d000000000001000c28f010042241000c2afc1 +:1016e0001000c28f04004228c4ff40140000000014 +:1016f00021e8c0031c00bf8f1800be8f2000bd274b +:101700000800e00300000000e0ffbd271c00beafa2 +:1017100021f0a003010002240c00c2a30d00c0a30d +:101720001000c0af0000c0af0306400b0000000077 +:101730000400c0affc05400b0000000001000224c3 +:101740000c00c2a30d00c0a30800c0afec05400b05 +:10175000000000000000c28fc01802000800c28f05 +:101760002118620000a0023cc02103000400c38fc6 +:10177000211883001c0042242110620000004290c6 +:1017800005004010000000000d00c3930c00c29340 +:10179000251062000d00c2a30c00c293401002008d +:1017a0000c00c2a30800c28f010042240800c2af8f +:1017b0000800c28f08004228e6ff40140000000025 +:1017c0000000c28fc01902000400c28f21186200fd +:1017d00000a0023c5c104224211062000d00c39363 +:1017e000000043a00400c28f010042240400c2afe5 +:1017f0000400c28f80004228d0ff40140000000087 +:101800000000c28f010042240000c2af0000c28f5e +:1018100004004228c6ff40140000000021e8c00375 +:101820001c00be8f2000bd270800e0030000000060 +:10183000f0ffbd270c00beaf21f0a0031000c4af25 +:101840001400c5af1800c6af1c00c7af0000c0af82 +:101850004406400b000000000400c0af3d06400bf2 +:10186000000000000000c38f1400c28f2a10620025 +:101870001d004014000000001400c38f1c00c28f24 +:10188000211862000000c28f2a1062001600401466 +:10189000000000000400c38f1000c28f2a106200f5 +:1018a00011004014000000001000c38f1800c28f08 +:1018b000211862000400c28f2a1062000a0040143e +:1018c0000000000000a0023c0000c38fc021030004 +:1018d0000400c38f211883001c00422421106200e1 +:1018e00001000324000043a00400c28f0100422431 +:1018f0000400c2af0400c28f80004228d9ff401408 +:10190000000000000000c28f010042240000c2afae +:101910000000c28f20004228cfff401400000000ca +:1019200021e8c0030c00be8f1000bd270800e003b3 +:1019300000000000e8ffbd271400beaf21f0a003a7 +:101940000000c0af6806400b000000000400c0affc +:101950006106400b0000000000a0023c0000c38fa5 +:10196000c02103000400c38f211883001c004224ff +:1019700021106200000040a00400c28f0100422438 +:101980000400c2af0400c28f80004228f2ff40145e +:10199000000000000000c28f010042240000c2af1e +:1019a0000000c28f20004228e8ff40140000000021 +:1019b0000800c0af7706400b0000000000a0023c0a +:1019c0005c1043240800c28f21106200000040a078 +:1019d0000800c28f010042240800c2af0800c28f75 +:1019e00000024228f5ff40140000000021e8c00377 +:1019f0001400be8f1800bd270800e003000000009f +:101a0000e8ffbd271400bfaf1000beaf21f0a00358 +:101a10004d06400f000000009506400f000000003a +:101a2000c205400f000000002120000000a0023c81 +:101a30005c1045247605400f0000000021e8c0033b +:101a40001400bf8f1000be8f1800bd270800e003f0 +:101a500000000000e8ffbd271400bfaf1000beafbc +:101a600021f0a003b806400f00000000e706400f79 +:101a70000000000000a0023c7012438c00a0023c59 +:101a80001400428c090062140000000000a0023c17 +:101a90001000438c00a0023c1800428c030062142a +:101aa00000000000fb06400f0000000000a0023c08 +:101ab0000800428c21204000ad07400f00000000cc +:101ac000d106400f0000000021e8c0031400bf8fc2 +:101ad0001000be8f1800bd270800e00300000000c2 +:101ae000e8ffbd271400bfaf1000beaf21f0a00378 +:101af00000a0023c05000324681243ac00a0023c95 +:101b00007012448c00a0023c1000458c00a0023ce6 +:101b10006812438c00a0023c0c00428c2130600013 +:101b2000213840000c06400f0000000021e8c003ef +:101b30001400bf8f1000be8f1800bd270800e003ff +:101b400000000000f8ffbd270400beaf21f0a00395 +:101b500000a0023c7012428c810042280500401413 +:101b60000000000000a0023c701240ace206400bf6 +:101b70000000000000a0023c7012428c01004324cf +:101b800000a0023c701243ac21e8c0030400be8fe9 +:101b90000800bd270800e00300000000e8ffbd27a3 +:101ba0001400bfaf1000beaf21f0a00300a0023ca4 +:101bb0001400438c00a0023c1800428c21206000dd +:101bc0002128400001000624010007240c06400fd4 +:101bd0000000000021e8c0031400bf8f1000be8f7a +:101be0001800bd270800e00300000000e8ffbd2743 +:101bf0001400bfaf1000beaf21f0a00300a0023c54 +:101c00001400448c00a0023c1800438c00a0023c4d +:101c1000c0210400211883001c004224211062000e +:101c2000000040a000a0023c05000324140043acc7 +:101c300000a0023c05000324180043ace706400f57 +:101c40000000000000a0023c6c12428c0100432402 +:101c500000a0023c6c1243ac21e8c0031400bf8f0b +:101c60001000be8f1800bd270800e0030000000030 +:101c7000f8ffbd270400beaf21f0a0030000000064 +:101c800021e8c0030400be8f0800bd270800e00360 +:101c900000000000e8ffbd271400bfaf1000beaf7a +:101ca00021f0a00380bf023c30f2423499aa033ce9 +:101cb00055666334000043ac80bf023c30f24234ce +:101cc0006655033caa996334000043ac0000000051 +:101cd00080bf023c00f042340000438c2000023cf4 +:101ce00024106200faff40140000000080bf023c94 +:101cf00004f042341800033c000043ac0000000034 +:101d000080bf023c00f042340000438c2000023cc3 +:101d100024106200faff40140000000080bf023c63 +:101d200030f24234000040ac80bf023c609042344c +:101d3000ffff0334000043ac88bf023c30614234f3 +:101d4000000040ac88bf023c04614234ff00032421 +:101d5000000043ac88bf023c10614234000040ac3c +:101d600088bf023c50614234ffff0334000043aca3 +:101d700088bf023c9061423400020324000043ac5f +:101d800088bf023c70614234000040ac88bf023c16 +:101d9000b0614234000040ac88bf023c4461423430 +:101da00070000324000043ac88bf023c84614234cd +:101db00000020324000043ac88bf023cc8604234e8 +:101dc00000010324000043ac88bf023c4861423458 +:101dd00002000324000043ac80bf023c005a42349e +:101de000000040ac80bf023c305a4234040003245f +:101df000000043ac80bf023c145a4234400003242c +:101e0000000043ac80bf023c085a42344000032427 +:101e1000000043ac80bf023c085a42342000032437 +:101e2000000043ac80bf023c085a423400800334b7 +:101e3000000043ac9304400f000000008006400ff8 +:101e4000000000008f07400b00000000f8ffbd27d6 +:101e50000400beaf21f0a0039607400b0000000075 +:101e6000f8ffbd270400beaf21f0a00321e8c003a6 +:101e70000400be8f0800bd270800e003000000003a +:101e8000f8ffbd270400beaf21f0a00321e8c00386 +:101e90000400be8f0800bd270800e003000000001a +:101ea0000f008430300082200800e00300000000b2 +:101eb00000000000fcffbd230000b3af98b713344f +:101ec00000000e2400000f24b507400b00000000a6 +:101ed000000000000d00e411000000000000000000 +:101ee000ffff8420bc07400b000000000000000042 +:101ef000f8ffd31100000000000000000100ce2117 +:101f0000bc07400b00000000000000000000b38f81 +:101f10000400bd230800e0030000000000000000f2 +:101f2000fcffbd230000b0affcffbd230000b1af3c +:101f3000fcffbd230000bfaffcffbd230000a4af2a +:101f40002080a0002088800002231000a807400ff6 +:101f50000000000000000000000022a20222100089 +:101f6000a807400f0000000000000000010022a2ae +:101f70003a000c240000000002002ca202211000f4 +:101f8000a807400f0000000000000000030022a28c +:101f900020200002a807400f000000000000000001 +:101fa000040022a200000d240000000005002da264 +:101fb0000000a48f0400bd230000bf8f0400bd23d8 +:101fc0000000b18f0400bd230000b08f0400bd23ca +:101fd0000800e00300000000000000000000000016 +:101fe000e020009de020009de020009de020009d7d +:101ff000e020009de020009de020009de020009d6d +:10200000e020009de020009de020009de020009d5c +:10201000e020009de020009de020009de020009d4c +:10202000e020009de020009de020009de020009d3c +:10203000e020009de020009de020009de020009d2c +:10204000e020009de020009de020009de020009d1c +:10205000e020009de020009de020009de020009d0c +:10206000e020009de020009de020009de020009dfc +:10207000e020009de020009de020009de020009dec +:10208000e020009de020009de020009de020009ddc +:10209000e020009de020009de020009de020009dcc +:1020a000e020009de020009de020009de020009dbc +:1020b000e020009de020009de020009de020009dac +:1020c000e020009de020009de020009de020009d9c +:1020d000e020009de020009de020009de020009d8c +:1020e000b8ffbd230000bfaf0400a1af0800a2af3e +:1020f0000c00a3af1000a4af1400a5af1800a6af4a +:102100001c00a7af2000a8af2400a9af2800aaafe9 +:102110002c00abaf3000acaf3400adaf3800aeaf89 +:102120003c00afaf4000b8af4400b9af1c07400f50 +:10213000000000004400b98f4000b88f3c00af8f12 +:102140003800ae8f3400ad8f3000ac8f2c00ab8fd9 +:102150002800aa8f2400a98f2000a88f1c00a78f19 +:102160001800a68f1400a58f1000a48f0c00a38f59 +:102170000800a28f0400a18f0000bf8f4800bd237c +:1021800018000042000000000000000000000000f5 +:10219000000084300000a5302507400f000000003b +:0821a000ffff00100000000029 +:020000040000fa +:020000041d00dd +:1021a8004c000000ffffffff0e030001ffffffffd1 +:1021b800ffffffff010002010010009d0000009dcd +:1021c80000f0010000f0019d00100000f02fc0bfda +:1021d80010000000000000a008000000ffffffff43 +:0c21e8002002009d0002009d200000006d +:020000040000fa +:020000041d00dd +:1021f40000000000000000000000000000000000db +:1022040000000000000000000000000000000000ca +:1022140000000000000000000000000000000000ba +:1022240000000000000000000000000000000000aa +:10223400000000000000000000000000000000009a +:10224400000000000000000000000000000000008a +:10225400000000000000000000000000000000007a +:10226400000000000000000000000000000000006a +:10227400000000000000000000000000000000005a +:10228400000000000000000000000000000000004a +:10229400000000000000000000000000000000003a +:1022a400000000000000000000000000000000002a +:1022b400000000000000000000000000000000001a +:1022c400000000000000000000000000000000000a +:1022d40000000000000000000000000000000000fa +:1022e40000000000000000000000000000000000ea +:1022f40000000000000000000000005e000000007c +:10230400000004030403000000247e24247e24002f +:1023140000244aff5224000000462610086462008c +:1023240000344a4a34205000000000040300000036 +:102334000000007e81000000000000817e0000009b +:10234400002a1c3e1c2a00000008083e0808000061 +:102354000000008060000000000808080808000071 +:10236400000000006000000000402010080402008b +:10237400003e4149413e00000000427f4000000011 +:10238400000062514946000000002249493600001d +:1023940000000e087f0800000000234545390000b6 +:1023a40000003e49493200000000016119070000a5 +:1023b400000036494936000000000609097e000085 +:1023c40000000066000000000000806600000000bd +:1023d400000008142241000000001414141400002a +:1023e4000000412214080000000201510906000007 +:1023f400001c225959520c0000007e09097e00007d +:1024040000007f494936000000003e41412200009f +:1024140000007f41413e000000007f494941000027 +:1024240000007f090901000000003e415132000014 +:1024340000007f08087f00000000417f4100000089 +:1024440000002040403f000000007f0814630000ab +:1024540000007f4040400000007f0204027f000033 +:10246400007f0608307f000000003e41413e00002e +:1024740000007f090906000000003e41617e400023 +:1024840000007f0909760000000026494932000057 +:102494000001017f0101000000003f40403f0000b7 +:1024a400001f2040201f0000003f4030403f00003c +:1024b4000000770808770000000304780403000094 +:1024c400000071494947000000007f4141000000bd +:1024d400000204081020400000000041417f000079 +:1024e400000402010204000000404040404040005b +:1024f40000000102040000000000304828780000b9 +:1025040000007f48483000000000304848000000c8 +:1025140000003048487f0000000030585810000088 +:1025240000007e090102000000005098987000002d +:1025340000007f08087000000000007a000000001e +:1025440000004080807a000000007f1028480000ce +:102554000000007f000000000078081008700000f0 +:10256400000078080870000000003048483000007f +:102574000000f828281000000000102828f80000a7 +:1025840000007008081000000000485454240000a3 +:102594000000083c4820000000003840207800007b +:1025a4000000384038000000003840204038000067 +:1025b4000000483030480000000018a0a078000057 +:1025c40000006454544c00000000081c2241000028 +:1025d4000000007e00000000000041221c080000f2 +:1025e4000000040204020000007844424478000021 +:020000040000fa +:020000041d00dd +:1025f80000002002010000030000000000000000ad +:082608000100000000000000c9 +:020000040000fa +:020000041d00dd +:102610001400000001000000100000004000000055 +:0426200010000000a6 :00000001FF diff --git a/snake.c b/snake.c new file mode 100644 index 0000000..adcf3c1 --- /dev/null +++ b/snake.c @@ -0,0 +1,74 @@ +/* +void snake(){ + + this.length = 0; + + this.y = 0; + this.x = 0; + + this.xspeed = 1; + this.yspeed = 0; + + this.direction = "right"; +} + +void update(){ + + this.x = this.x + this.xspeed; + this.y = this.y + this.yspeed; + if(getbtns == 0xf0f0 | 0xf00f | 0x0ff0 | 0x0f0f){ + keyPress(getbtns()); + } + delay(1000); +} + +void getbtns(void){ + int btn = (PORTD >> 5) & 0x0007; + return btn; +} + +void keyPress(int buttons){ + // 0 0 0 0 = UP DOWN LEFT RIGHT + + //Svänga upp + if(buttons & 0xf000){ + if(this.direction == "down") + break; + this.xspeed = 0; + this.yspeed = 1; + this.direction = "up"; + } + + //Svänga ner + if(buttons & 0x0f00){ + if(this.direction == "up") + break; + this.xspeed = 0; + this.yspeed = -1; + this.direction = "down"; + } + + //Svänga vänster + if(buttons & 0x00f0){ + if(this.direction == "right") + break; + this.xpseed = -1; + this.yspeed = 0; + this.direction = "left"; + } + + //Svänga höger + if(buttons & 0x000f){ + if(this.direction == "left") + break; + this.xpseed = 1; + this.yspeed = 0; + this.direction = "right"; + } + +} + +void draw(){ + Snake.update(); +} +*/ \ No newline at end of file diff --git a/snake.c.o b/snake.c.o new file mode 100644 index 0000000..958f515 Binary files /dev/null and b/snake.c.o differ diff --git a/snake.h b/snake.h index 8344e4e..354befa 100644 --- a/snake.h +++ b/snake.h @@ -1,55 +1,28 @@ -/* mipslab.h - Header file for all labs. - This file written 2015 by F Lundevall - Some parts are original code written by Axel Isaksson +/*Written by Fredrik Lundström and Michell Dib 2021 (c)*/ - Latest update 2015-08-28 by F Lundevall - - For copyright and licensing, see file COPYING */ - -/* Declare display-related functions from mipslabfunc.c */ void display_image(int x, const uint8_t *data); void display_init(void); void display_string(int line, char *s); void display_update(void); uint8_t spi_send_recv(uint8_t data); -/* Declare lab-related functions from mipslabfunc.c */ -char * itoaconv( int num ); -void labwork(void); -int nextprime( int inval ); void quicksleep(int cyc); -void tick( unsigned int * timep ); - -/* Declare display_debug - a function to help debugging. - - After calling display_debug, - the two middle lines of the display show - an address and its current contents. - There's one parameter: the address to read and display. - - Note: When you use this function, you should comment out any - repeated calls to display_image; display_image overwrites - about half of the digits shown by display_debug. -*/ void display_debug( volatile int * const addr ); -/* Declare bitmap array containing font */ extern const uint8_t const font[128*8]; -/* Declare bitmap array containing icon */ extern const uint8_t const icon[128]; -/* Declare text buffer for display output */ extern char textbuffer[4][16]; -/* Declare functions written by students. - Note: Since we declare these functions here, - students must define their functions with the exact types - specified in the laboratory instructions. */ -/* Written as part of asm lab: delay, time2string */ void delay(int); -void time2string( char *, int ); -/* Written as part of i/o lab: getbtns, getsw, enable_interrupt */ -int getbtns(void); -int getsw(void); void enable_interrupt(void); + +//Egna +uint8_t display[32][128]; //Human readable pixel position and activation +uint8_t oled_display[512]; //Computer readable pixel position and activation + +void display_start(); +void clear_display(); +void translateToImage(); +void create_object(int xPos, int yPos, int width, int height); +void snake(); diff --git a/vectors.S b/vectors.S new file mode 100644 index 0000000..7847274 --- /dev/null +++ b/vectors.S @@ -0,0 +1,252 @@ + # vectors.S + # This file written 2015 by Axel Isaksson + # Modified 2015 by F Lundevall + # For copyright and licensing, see file COPYING + +.macro movi reg, val + lui \reg, %hi(\val) + ori \reg, \reg, %lo(\val) +.endm + +.macro STUB num + .align 4 + .section .vector_new_\num,"ax",@progbits + .global __vector_\num + __vector_\num: + movi $k0, _isr_primary_install + lw $k0, \num * 4($k0) + jr $k0 +.endm + +.align 4 +.global __use_isr_install +__use_isr_install: +STUB 0 +STUB 1 +STUB 2 +STUB 3 +STUB 4 +STUB 5 +STUB 6 +STUB 7 + +STUB 8 +STUB 9 +STUB 10 +STUB 11 +STUB 12 +STUB 13 +STUB 14 +STUB 15 + +STUB 16 +STUB 17 +STUB 18 +STUB 19 +STUB 20 +STUB 21 +STUB 22 +STUB 23 + +STUB 24 +STUB 25 +STUB 26 +STUB 27 +STUB 28 +STUB 29 +STUB 30 +STUB 31 + +STUB 32 +STUB 33 +STUB 34 +STUB 35 +STUB 36 +STUB 37 +STUB 38 +STUB 39 + +STUB 40 +STUB 41 +STUB 42 +STUB 43 +STUB 44 +STUB 45 +STUB 46 +STUB 47 + +STUB 48 +STUB 49 +STUB 50 +STUB 51 +STUB 52 +STUB 53 +STUB 54 +STUB 55 + +STUB 56 +STUB 57 +STUB 58 +STUB 59 +STUB 60 +STUB 61 +STUB 62 +STUB 63 + +.text + +.align 4 +.global _isr_primary_install +_isr_primary_install: +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline +.word _isr_trampoline + +# Interrupts are handled here +.align 4 +.set noreorder +.global _isr_trampoline +_isr_trampoline: + # this is an interrupt service routine + + # tell the assembler not to use $1 right now + .set noat + + # save all caller-save registers, and also ra + addi $sp,$sp,-72 + sw $ra, 0($sp) + sw $1, 4($sp) # $at + sw $2, 8($sp) # $v0 + sw $3,12($sp) # $v1 + sw $4,16($sp) # $a0 + sw $5,20($sp) # $a1 + sw $6,24($sp) # $a2 + sw $7,28($sp) # $a3 + sw $8,32($sp) # $t0 + sw $9,36($sp) # $t1 + sw $10,40($sp) # $t2 + sw $11,44($sp) # $t3 + sw $12,48($sp) # $t4 + sw $13,52($sp) # $t5 + sw $14,56($sp) # $t6 + sw $15,60($sp) # $t7 + sw $24,64($sp) # $t8 + sw $25,68($sp) # $t9 + + # Any callee-saved regs ($s0 etc) used by user's handler + # will be saved and restored by that handler + # (the C compiler will see to that). + + # call user's handler + jal user_isr + nop + + # restore saved registers + lw $25,68($sp) + lw $24,64($sp) + lw $15,60($sp) + lw $14,56($sp) + lw $13,52($sp) + lw $12,48($sp) + lw $11,44($sp) + lw $10,40($sp) + lw $9,36($sp) + lw $8,32($sp) + lw $7,28($sp) + lw $6,24($sp) + lw $5,20($sp) + lw $4,16($sp) + lw $3,12($sp) + lw $2, 8($sp) + lw $1, 4($sp) + lw $ra, 0($sp) + addi $sp,$sp,72 + + .set at + # now the assembler is allowed to use $1 again + + # standard epilogue follows + eret + nop + + +# Exceptions are handled here (trap, syscall, etc) +.section .gen_handler,"ax",@progbits +.set noreorder +.ent _gen_exception +_gen_exception: + mfc0 $k0, $14, 0 + addi $k0, $k0, 4 + mtc0 $k0, $14, 0 + eret + nop + +.end _gen_exception diff --git a/vectors.S.o b/vectors.S.o new file mode 100644 index 0000000..ac5482c Binary files /dev/null and b/vectors.S.o differ