From 63f35ed24539d095487cfb009b75dfe0a92dde70 Mon Sep 17 00:00:00 2001 From: Dutsadi Bunliang <dutbu586@student.liu.se> Date: Tue, 26 May 2020 09:41:45 +0200 Subject: [PATCH] Passed all labs --- chap1/Makefile | 16 ++ chap1/embedded.bin | Bin 0 -> 7462 bytes chap1/floppy.img | Bin 0 -> 1474560 bytes chap1/link.map | 157 +++++++++++ chap1/main.c | 14 + chap1/main.o | Bin 0 -> 2380 bytes chap1/makeNrun.sh | 16 ++ chap1/mtools.conf | 6 + chap2/a.out | Bin 0 -> 13008 bytes chap2/displayLog.txt | 121 +++++++++ chap2/displayLog_Correct.txt | 121 +++++++++ chap2/diss.txt | 33 +++ chap2/inputData.txt | 40 +++ chap2/main.c | 370 ++++++++++++++++++++++++++ chap2/main.c.save | 334 +++++++++++++++++++++++ chap2/main.c.save.1 | 368 ++++++++++++++++++++++++++ chap2/outputLog.txt | 41 +++ chap2/outputLog_Correct.txt | 41 +++ chap3.1/Makefile | 16 ++ chap3.1/chapter3_1.txt | 51 ++++ chap3.1/embedded.bin | Bin 0 -> 8875 bytes chap3.1/floppy.img | Bin 0 -> 1474560 bytes chap3.1/link.map | 188 +++++++++++++ chap3.1/main.c | 89 +++++++ chap3.1/main.o | Bin 0 -> 4196 bytes chap3.1/makeNrun.sh | 16 ++ chap3.1/mtools.conf | 6 + chap3.2/a.out | Bin 0 -> 12904 bytes chap3.2/main.c | 71 +++++ chap3.2/main.c~ | 71 +++++ chap3.2/questions3_2.txt | 31 +++ chap3.2/questions3_2.txt~ | 0 chap4/Makefile | 27 ++ chap4/embedded.bin | Bin 0 -> 8731 bytes chap4/floppy.img | Bin 0 -> 1474560 bytes chap4/link.map | 160 +++++++++++ chap4/llmultiply.asm | 100 +++++++ chap4/main.c | 246 +++++++++++++++++ chap4/main.o | Bin 0 -> 5400 bytes chap4/makeNrun.sh | 16 ++ chap4/mtools.conf | 6 + chap5/Makefile | 22 ++ chap5/embedded.bin | Bin 0 -> 12265 bytes chap5/floppy.img | Bin 0 -> 1474560 bytes chap5/floppy_copy.img | Bin 0 -> 1474560 bytes chap5/inbound.c | 21 ++ chap5/inbound.o | Bin 0 -> 3112 bytes chap5/link.map | 268 +++++++++++++++++++ chap5/main.c | 63 +++++ chap5/main.o | Bin 0 -> 3612 bytes chap5/makeNrun.sh | 23 ++ chap5/mtools.conf | 6 + chap5/outbound.c | 36 +++ chap5/outbound.o | Bin 0 -> 3516 bytes chap5/serial.asm | 93 +++++++ chap5/serial.h | 28 ++ chap5/serial.o | Bin 0 -> 1024 bytes chap6/Makefile | 22 ++ chap6/embedded.bin | Bin 0 -> 34560 bytes chap6/floppy.img | Bin 0 -> 1474560 bytes chap6/floppy_copy.img | Bin 0 -> 1474560 bytes chap6/inbound.c | 24 ++ chap6/inbound.o | Bin 0 -> 3784 bytes chap6/link.map | 430 ++++++++++++++++++++++++++++++ chap6/main.c | 92 +++++++ chap6/main.o | Bin 0 -> 6552 bytes chap6/makeNrun.sh | 25 ++ chap6/mtools.conf | 6 + chap6/outbound.c | 49 ++++ chap6/outbound.o | Bin 0 -> 4192 bytes chap6/serial.asm | 94 +++++++ chap6/serial.h | 28 ++ chap6/serial.o | Bin 0 -> 1024 bytes chap7/Makefile | 22 ++ chap7/elapsed.c | 106 ++++++++ chap7/elapsed.h | 11 + chap7/elapsed.o | Bin 0 -> 8600 bytes chap7/embedded.bin | Bin 0 -> 27450 bytes chap7/floppy.img | Bin 0 -> 1474560 bytes chap7/floppy_copy.img | Bin 0 -> 1474560 bytes chap7/inbound.c | 42 +++ chap7/inbound.h | 3 + chap7/inbound.o | Bin 0 -> 6732 bytes chap7/isr.asm | 64 +++++ chap7/isr.o | Bin 0 -> 1024 bytes chap7/link.map | 497 +++++++++++++++++++++++++++++++++++ chap7/main.c | 45 ++++ chap7/main.o | Bin 0 -> 6396 bytes chap7/makeNrun.sh | 25 ++ chap7/mtools.conf | 6 + chap7/outbound.c | 80 ++++++ chap7/outbound.o | Bin 0 -> 7724 bytes chap7/packet.c | 79 ++++++ chap7/packet.h | 6 + chap7/packet.o | Bin 0 -> 6748 bytes chap7/serial.c | 67 +++++ chap7/serial.h | 30 +++ chap7/serial.o | Bin 0 -> 6928 bytes 98 files changed, 5185 insertions(+) create mode 100644 chap1/Makefile create mode 100644 chap1/embedded.bin create mode 100644 chap1/floppy.img create mode 100644 chap1/link.map create mode 100644 chap1/main.c create mode 100644 chap1/main.o create mode 100644 chap1/makeNrun.sh create mode 100644 chap1/mtools.conf create mode 100644 chap2/a.out create mode 100644 chap2/displayLog.txt create mode 100644 chap2/displayLog_Correct.txt create mode 100644 chap2/diss.txt create mode 100644 chap2/inputData.txt create mode 100644 chap2/main.c create mode 100644 chap2/main.c.save create mode 100644 chap2/main.c.save.1 create mode 100644 chap2/outputLog.txt create mode 100644 chap2/outputLog_Correct.txt create mode 100644 chap3.1/Makefile create mode 100644 chap3.1/chapter3_1.txt create mode 100644 chap3.1/embedded.bin create mode 100644 chap3.1/floppy.img create mode 100644 chap3.1/link.map create mode 100644 chap3.1/main.c create mode 100644 chap3.1/main.o create mode 100644 chap3.1/makeNrun.sh create mode 100644 chap3.1/mtools.conf create mode 100644 chap3.2/a.out create mode 100644 chap3.2/main.c create mode 100644 chap3.2/main.c~ create mode 100644 chap3.2/questions3_2.txt create mode 100644 chap3.2/questions3_2.txt~ create mode 100644 chap4/Makefile create mode 100644 chap4/embedded.bin create mode 100644 chap4/floppy.img create mode 100644 chap4/link.map create mode 100644 chap4/llmultiply.asm create mode 100644 chap4/main.c create mode 100644 chap4/main.o create mode 100644 chap4/makeNrun.sh create mode 100644 chap4/mtools.conf create mode 100644 chap5/Makefile create mode 100644 chap5/embedded.bin create mode 100644 chap5/floppy.img create mode 100644 chap5/floppy_copy.img create mode 100644 chap5/inbound.c create mode 100644 chap5/inbound.o create mode 100644 chap5/link.map create mode 100644 chap5/main.c create mode 100644 chap5/main.o create mode 100644 chap5/makeNrun.sh create mode 100644 chap5/mtools.conf create mode 100644 chap5/outbound.c create mode 100644 chap5/outbound.o create mode 100644 chap5/serial.asm create mode 100644 chap5/serial.h create mode 100644 chap5/serial.o create mode 100644 chap6/Makefile create mode 100644 chap6/embedded.bin create mode 100644 chap6/floppy.img create mode 100644 chap6/floppy_copy.img create mode 100644 chap6/inbound.c create mode 100644 chap6/inbound.o create mode 100644 chap6/link.map create mode 100644 chap6/main.c create mode 100644 chap6/main.o create mode 100644 chap6/makeNrun.sh create mode 100644 chap6/mtools.conf create mode 100644 chap6/outbound.c create mode 100644 chap6/outbound.o create mode 100644 chap6/serial.asm create mode 100644 chap6/serial.h create mode 100644 chap6/serial.o create mode 100644 chap7/Makefile create mode 100644 chap7/elapsed.c create mode 100644 chap7/elapsed.h create mode 100644 chap7/elapsed.o create mode 100644 chap7/embedded.bin create mode 100644 chap7/floppy.img create mode 100644 chap7/floppy_copy.img create mode 100644 chap7/inbound.c create mode 100644 chap7/inbound.h create mode 100644 chap7/inbound.o create mode 100644 chap7/isr.asm create mode 100644 chap7/isr.o create mode 100644 chap7/link.map create mode 100644 chap7/main.c create mode 100644 chap7/main.o create mode 100644 chap7/makeNrun.sh create mode 100644 chap7/mtools.conf create mode 100644 chap7/outbound.c create mode 100644 chap7/outbound.o create mode 100644 chap7/packet.c create mode 100644 chap7/packet.h create mode 100644 chap7/packet.o create mode 100644 chap7/serial.c create mode 100644 chap7/serial.h create mode 100644 chap7/serial.o diff --git a/chap1/Makefile b/chap1/Makefile new file mode 100644 index 0000000..a2dbd6f --- /dev/null +++ b/chap1/Makefile @@ -0,0 +1,16 @@ +OBJ = main.o +COURSE = /courses/TDDI11/sw +LDSCRIPT = $(COURSE)/lib/link.cmd +BOOTSECT = $(COURSE)/lib/bootload.bin +INCLUDES = -I "$(COURSE)/include" -I "$(COURSE)/include/djgpp" $(EXTRA_INCLUDES) +CC = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-gcc +CFLAGS += -Wall -g $(INCLUDES) +LD = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-ld +LDFLAGS = -T$(LDSCRIPT) -static -ustart -Map link.map + +embedded.bin: $(OBJ) + $(LD) $(OBJ) $(LIBS) $(LDFLAGS) +%.o: %.c + $(CC) $(CFLAGS) -c $< +clean: + \rm -f link.map embedded.bin *~ *.o diff --git a/chap1/embedded.bin b/chap1/embedded.bin new file mode 100644 index 0000000000000000000000000000000000000000..1ca83dd3f559b15ea06e5ad340acfb2697531c56 GIT binary patch literal 7462 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 GVgLZ$tYVV@ literal 0 HcmV?d00001 diff --git a/chap1/floppy.img b/chap1/floppy.img new file mode 100644 index 0000000000000000000000000000000000000000..cd374a55ca8f5c5a71a94dfe5eb643954bd05e45 GIT binary patch literal 1474560 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 zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFbYOPU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V+JV2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQKHo z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVB~qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? O8UmvsFd72X3jqKiuX4Wt literal 0 HcmV?d00001 diff --git a/chap1/link.map b/chap1/link.map new file mode 100644 index 0000000..3b9e041 --- /dev/null +++ b/chap1/link.map @@ -0,0 +1,157 @@ +Archive member included to satisfy reference by file (symbol) + +/courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + (start) +/courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_IDT) +/courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_CRT) +/courses/TDDI11/sw/lib/elf/libepc.a(display.o) + main.o (SetCursorPosition) +/courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8259) +/courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8253) +/courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Check_CPU) +/courses/TDDI11/sw/lib/elf/libepc.a(io.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) (ISR_PIC1) +/courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + /courses/TDDI11/sw/lib/elf/libepc.a(io.o) (Enqueue) + +Discarded input sections + + .eh_frame 0x0000000000000000 0x44 main.o + +Memory Configuration + +Name Origin Length Attributes +conventional 0x0000000000000000 0x00000000000a0000 +reserved 0x00000000000a0000 0x0000000000060000 +extended 0x0000000000100000 0x00000000fff00000 +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD main.o +LOAD /courses/TDDI11/sw/lib/elf/libepc.a +LOAD /courses/TDDI11/sw/lib/elf/djgpp/libc.a +LOAD /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a + +.text 0x0000000000000000 0x165c + 0x0000000000000000 text_frst = . + *(.start) + .start 0x0000000000000000 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000000 start + *(.init) + *(.text) + .text 0x0000000000000008 0x7a main.o + 0x0000000000000008 main + *fill* 0x0000000000000082 0x2 + .text 0x0000000000000084 0x50 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000084 Init_CPU + .text 0x00000000000000d4 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + 0x00000000000004e4 IRQ2INT + 0x00000000000004f8 _GetISR + 0x000000000000053c SetISR + 0x0000000000000574 Init_IDT + .text 0x0000000000000674 0x110 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + 0x0000000000000674 Init_CRT + 0x00000000000006a8 _LastMemoryAddress + .text 0x0000000000000784 0x6e0 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + 0x0000000000000784 SetCursorVisible + 0x0000000000000808 _GetCursorRow + 0x000000000000081c _GetCursorCol + 0x0000000000000830 SetCursorPosition + 0x00000000000008d4 ClearScreen + 0x000000000000093c _PutAttb + 0x0000000000000988 _PutCharAt + 0x00000000000009b4 _PutChar + 0x0000000000000a38 PutString + 0x0000000000000a70 PutUnsigned + 0x0000000000000aa8 FormatUnsigned + 0x0000000000000b38 Unsigned2Ascii + 0x0000000000000bbc _Cell + .text 0x0000000000000e64 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + 0x0000000000000e64 Init8259 + .text 0x0000000000000f44 0xb0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + 0x0000000000000f44 Init8253 + .text 0x0000000000000ff4 0x98 /courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + 0x0000000000000ff4 Check_CPU + .text 0x000000000000108c 0x60 /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x000000000000108c TimerTickISR + 0x0000000000001098 KeyboardISR + 0x00000000000010b8 ISR_PIC1 + 0x00000000000010bf ISR_PIC2 + 0x00000000000010c8 ___main + 0x00000000000010c9 inportb + 0x00000000000010d3 outportb + 0x00000000000010e5 _exit + .text 0x00000000000010ec 0x570 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + 0x00000000000010ec ScanCodeRdy + 0x0000000000001110 GetScanCode + 0x0000000000001140 ScanCode2Ascii + 0x0000000000001300 SetsKybdState + 0x00000000000014f0 Enqueue + 0x000000000000165b text_last = (. - 0x1) + +.data 0x000000000000165c 0x6ca + 0x000000000000165c data_frst = . + *(.data) + .data 0x000000000000165c 0x0 main.o + .data 0x000000000000165c 0x20 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x000000000000167a code_selector + .data 0x000000000000167c 0x90 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .data 0x000000000000170c 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .data 0x000000000000171c 0x30 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .data 0x000000000000174c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .data 0x000000000000174c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .data 0x000000000000174c 0xc /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x000000000000174c msec + 0x0000000000001750 old_tick_isr + 0x0000000000001754 old_kybd_isr + .data 0x0000000000001758 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + *(.rodata) + .rodata 0x0000000000001cf8 0x2e main.o + *(.rodata.str1.1) + *(.rodata.str1.32) + 0x0000000000001d25 data_last = (. - 0x1) + +.bss 0x0000000000001d28 0x83c + 0x0000000000001d28 bss_frst = . + *(.bss) + .bss 0x0000000000001d28 0x0 main.o + .bss 0x0000000000001d28 0x800 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .bss 0x0000000000002528 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .bss 0x0000000000002528 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .bss 0x0000000000002530 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .bss 0x0000000000002530 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .bss 0x0000000000002530 0x34 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + *(COMMON) + 0x0000000000002563 bss_last = (. - 0x1) + +/DISCARD/ + *(.eh_frame) + 0x0000000000002564 stack_frst = (bss_last + 0x1) + 0x000000000000a563 stack_last = (bss_last + 0x8000) + 0x000000000000a564 heap_frst = (stack_last + 0x1) +OUTPUT(embedded.bin binary) + +.debug_info 0x0000000000000000 0xa0 + .debug_info 0x0000000000000000 0xa0 main.o + +.debug_abbrev 0x0000000000000000 0x5e + .debug_abbrev 0x0000000000000000 0x5e main.o + +.debug_aranges 0x0000000000000000 0x20 + .debug_aranges + 0x0000000000000000 0x20 main.o + +.debug_line 0x0000000000000000 0x3d + .debug_line 0x0000000000000000 0x3d main.o + +.debug_str 0x0000000000000000 0xc1 + .debug_str 0x0000000000000000 0xc1 main.o + +.comment 0x0000000000000000 0x12 + .comment 0x0000000000000000 0x12 main.o diff --git a/chap1/main.c b/chap1/main.c new file mode 100644 index 0000000..7f62263 --- /dev/null +++ b/chap1/main.c @@ -0,0 +1,14 @@ +#include <libepc.h> + +int main(int argc, char *argv[]) +{ + ClearScreen(0x07); + SetCursorPosition(0, 0); + + PutString("dutbu586 and alehe451\r\n"); + PutString("Date: "); + PutString(__DATE__); + PutString("\r\n"); + + return 0; +} diff --git a/chap1/main.o b/chap1/main.o new file mode 100644 index 0000000000000000000000000000000000000000..58abd1f3468b9db8e5ec2e778c1b1e35640a5e76 GIT binary patch literal 2380 zcmb<-^>JflWMqH=Mh0dE1doA1hYccQ0;V(=L>Pn_dVN$_nxB05U-&1q^J!r78<yrb zJX!27{`~*{zxjwj^BayVhAajImnQ?H7nv`?z<?qzkH*(V;_m=y?)Lq2vN!S1;gr&n zq*7B0Glj&w6otf`)QnUUQ$t=Z2A9N=R4WAr$ATgS1#<->10w?lUM_|?3=9k`Angn+ zjDZXc3_LOn3=CCZ0R+v&!kU>^!obYP!N<VBz|6$H5=61EYk(*Yb}JCY!a5s7aj=5) zGBdJG0~xH$z`(%BtO^o>8p}9mG6Mqx>k_yG(?kZ=JzyS4f@vZP0~^as1_lN;mN1Yu zMnOhZK4ETVK50HdMj<u<aRvq^6$Wl@J8otU1_ov*laGOcMUT;5l9|tn+nQTl(o-0u z*g;~NlO&@s0|P5714PDCm`Q?xfsLPmo7+>Efq?<!StgJ*&@ccoVV(!EEkRylkOeu9 z@i!kY10y6EFfuSOGUO&^=IJGaR538Hf(;Sn5I*_r^XJcBBAGZC7#VZ&^U@W-1Ss%I z^NKUm^HNh3k~0#EV46W@Fo2c7r9o=JB47eV*xfHw!P(GI!CcQ+&p<&px1=;L)i%@E z!c0LoH?b%=1IkWk(9g)vP1T1b1pN>f7f(Y&{p5_q0z(F{^<c9>HYFCNCo>dh<QJ7F zpjeeylwQWb;O^{frJ&*N7pe)dlYxOj1ma-^#;PC&#u^SrX&x4q4n_tBP*MPeCP*3_ zf-XFa4DJG~Or;FY{LG~_Y)t7qj0}!Poq1Rw$ql3sijngY3&Y3%P+>5In$s8<m>HPC z;xK|4Dds?8%naZJ2x5XUGXpepf_WhQ98ea7VrJlkFrXwe12>cfp_mzXAq*(V%)k$2 zK`3ShJ_eYHAb$%nFrw%XU|?X7geV1*AU-JTf;kKf3?M#AYH-d;O)LsdE=o<!V+c+y zaV{+?&MykcFU~B<%+F&8C@l#tDay=C2k94QU|?Y4V_;AN(fkYyhM;uH%D`X-;tMb^ zI70buP(CPsGqN%;fHD@700ToJR6Y$V4+<$pb_NC>kT@3ugCLX^h0-8@FfuVPD1!K$ z3=H}pnhRndBNqdMEtKy9rM;na5R{ID(s584ROW%qD~Ix1p)}YXY>==4$!mecnHU%p zK<)(PG`-@=+>*p32EF2vA_$!UV-=<5=#`{alrZR}B$gyH=p_{wGw2oNLpUJGl+>is z^!UuYw0s6V2s<$;sVKFKK@TCDSd^HTo(j^KngdmolbM$a(@<Pe#Gsd)pPQSSR|3(N znh~E?l$e_eiWTB8s5l3udyrp2IzV*?DE)xgAPkZN(b5bI;1ucr;xI5U%wS<)2w;H5 z4XB7^U;w8-P#Fu-1Ir!jpz2{1NDjmXr9Du3C8W*(6y~7t25DkoU;vq?2W5jOn0Yo( zbs#YizQe%4umHq>VwgG$G=IEcVPNQh`U4aOph5xUE)O*GY8V+9K<Nc)9K7C*LQ{8( z5t2U8)q&DFD2KzsuYeVju0UxUBo4DT7tOq1jF9w<ZeAvuKN?se;SVwoRC2(~tAv^d z3P+F`=1dF>2SE%d289a<x1g!}!NkBI1XTl~Kx#mEB2*nH`GdrHm>C#A`3%GcVUWEb zx);rT9Z2p2m0Tcopl}A62{Q|%FMyeWL4XlrH>kt|sRNZwpfG}^6_C0F76t}W5Ce)q Y=75+W|0AoLz{<b?Y7l_rKp3VD08s8CIRF3v literal 0 HcmV?d00001 diff --git a/chap1/makeNrun.sh b/chap1/makeNrun.sh new file mode 100644 index 0000000..cdc1361 --- /dev/null +++ b/chap1/makeNrun.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +clear +echo "This script includes commands to make the project and run it" + +echo "clean up the directory with make clean" +make clean +echo "make the project with make." +make +echo "Guiding mtools mcopy to its configuration file" +export MTOOLSRC=mtools.conf +echo "Copying the binary to floppy image" +mcopy embedded.bin a: +echo "Starting Qemu with given binary in the floppy image" +qemu-system-i386 -drive format=raw,file=floppy.img,if=floppy + diff --git a/chap1/mtools.conf b/chap1/mtools.conf new file mode 100644 index 0000000..c387b85 --- /dev/null +++ b/chap1/mtools.conf @@ -0,0 +1,6 @@ +MTOOLS_NO_VFAT=1 +drive a: + file="floppy.img" + fat_bits=12 + cylinders=80 heads=2 sectors=18 + mformat_only diff --git a/chap2/a.out b/chap2/a.out new file mode 100644 index 0000000000000000000000000000000000000000..4049cd98b2014569dca6a26752b7057689670805 GIT binary patch literal 13008 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 LKL`aU(e(oWo`TSm literal 0 HcmV?d00001 diff --git a/chap2/displayLog.txt b/chap2/displayLog.txt new file mode 100644 index 0000000..4c37e22 --- /dev/null +++ b/chap2/displayLog.txt @@ -0,0 +1,121 @@ +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1 +inputs: Lock=1, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=0, Red=1, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=15 +inputs: Lock=1, Fan=7, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=0, Red=1, Fan=0, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=7 +inputs: Lock=1, Fan=3, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=0, Red=1, Fan=1, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=10 +inputs: Lock=0, Fan=5, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=2, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=16 +inputs: Lock=0, Fan=0, AC=1, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=1, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=32 +inputs: Lock=0, Fan=0, AC=0, Desired=15.000000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=64 +inputs: Lock=0, Fan=0, AC=0, Desired=15.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=416 +inputs: Lock=0, Fan=0, AC=0, Desired=21.000000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=640 +inputs: Lock=0, Fan=0, AC=0, Desired=24.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=672 +inputs: Lock=0, Fan=0, AC=0, Desired=25.000000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1024 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.200000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=158720 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=19.600000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=180224 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=22.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=245760 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=30.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=253952 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=-1.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=261120 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=31.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=262144 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=4 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=524288 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=8 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=786432 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=11 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1048576 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=14 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1310720 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=17 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=3670016 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=44 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=1 +inputCurrent=6815744 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=80 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7077888 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=83 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7340032 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=87 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7602176 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=91 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7864320 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=95 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=8126464 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=100 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=172464 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=21.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=159152 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=19.600000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=1, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=180656 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=22.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=1, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=159152 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=19.600000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=1, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=172464 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=21.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=246192 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=30.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=1, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=172464 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=21.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +Reached end of input file! sampleIndex=40 diff --git a/chap2/displayLog_Correct.txt b/chap2/displayLog_Correct.txt new file mode 100644 index 0000000..4c37e22 --- /dev/null +++ b/chap2/displayLog_Correct.txt @@ -0,0 +1,121 @@ +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1 +inputs: Lock=1, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=0, Red=1, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=15 +inputs: Lock=1, Fan=7, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=0, Red=1, Fan=0, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=7 +inputs: Lock=1, Fan=3, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=0, Red=1, Fan=1, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=10 +inputs: Lock=0, Fan=5, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=2, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=16 +inputs: Lock=0, Fan=0, AC=1, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=1, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=32 +inputs: Lock=0, Fan=0, AC=0, Desired=15.000000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=64 +inputs: Lock=0, Fan=0, AC=0, Desired=15.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=416 +inputs: Lock=0, Fan=0, AC=0, Desired=21.000000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=640 +inputs: Lock=0, Fan=0, AC=0, Desired=24.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=672 +inputs: Lock=0, Fan=0, AC=0, Desired=25.000000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1024 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.200000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=158720 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=19.600000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=180224 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=22.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=245760 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=30.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=253952 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=-1.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=261120 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=31.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=0 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=262144 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=4 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=524288 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=8 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=786432 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=11 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1048576 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=14 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=1310720 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=17 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=3670016 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=44 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=1 +inputCurrent=6815744 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=80 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7077888 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=83 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7340032 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=87 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7602176 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=91 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=7864320 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=95 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=8126464 +inputs: Lock=0, Fan=0, AC=0, Desired=14.500000, Measured=0.000000, Humidity=100 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=0, Humidity2L_n=1 +inputCurrent=172464 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=21.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=159152 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=19.600000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=1, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=180656 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=22.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=1, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=159152 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=19.600000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=1, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=172464 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=21.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=246192 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=30.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=1, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +inputCurrent=172464 +inputs: Lock=0, Fan=0, AC=1, Desired=21.000000, Measured=21.000000, Humidity=0 +outputs: Green=1, Red=0, Fan=3, Cooler=0, Heater=0, Humidity2H_n=1, Humidity2L_n=0 +Reached end of input file! sampleIndex=40 diff --git a/chap2/diss.txt b/chap2/diss.txt new file mode 100644 index 0000000..aa50904 --- /dev/null +++ b/chap2/diss.txt @@ -0,0 +1,33 @@ +1) +Yes, its work as long their wont be any carry in the operation because +the outputRegister start out as zero, which only set the outputRegister bits position. + +Example: When adding (X is ignored) +XXXX XXII +XXII IIXX +IIXX XXXX + +The regions don't overlap, so adding them together won't produce a carry and such +it will have the same result as the bitwise OR. + +2) + Do a brief research(perhaps on the web) on Bang-bang (Hysteresis) + controllers in relation to equations 4and 5. Answer the following questions in a few words: + +Hysteresis controller are 2-step controller (on or off state) and it used in system with +limited state, such as the heater in this lab which turns on/off depend on a formula (set point). + +Hysteresis controller is not just depending on the input values but also the direction of change, +while the system is trying to reach the target or if it is outside of the target. The behaviour can make the +input have two output possibilities, above the target or below the target depending on the direction. +Because of this hysteresis depend on the history of the state of the system. + +2.a) +A limit with this controller is the switching speed between on/off state or also called "hysteresis gap". +In this case the constant 0.3 is the "hysteresis". + +2.b) +We need it because our system is limited to two states (on/off) which make the system more simple and +more responsive. If the "hysteresis" is zero and the value changes just a little it will switch its state. +This can cause unnecessary strain on the system. + diff --git a/chap2/inputData.txt b/chap2/inputData.txt new file mode 100644 index 0000000..e1d8339 --- /dev/null +++ b/chap2/inputData.txt @@ -0,0 +1,40 @@ +0 +1 +15 +7 +10 +0 +0 +16 +32 +64 +416 +640 +672 +0 +1024 +158720 +180224 +245760 +253952 +261120 +0 +262144 +524288 +786432 +1048576 +1310720 +3670016 +6815744 +7077888 +7340032 +7602176 +7864320 +8126464 +172464 +159152 +180656 +159152 +172464 +246192 +172464 diff --git a/chap2/main.c b/chap2/main.c new file mode 100644 index 0000000..a2e82fc --- /dev/null +++ b/chap2/main.c @@ -0,0 +1,370 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdbool.h> + +// Room Controls, in an infinite loops polls input switches, selectors, and sensors. Then it interprets the row data. Based on acquired information, the system +// makes decisions. These decisions are then used to set appropriate values for signals and warning lights as well as actuators such as cooler and heater. + +// In order to extract the row data from the input register and in order to figure out what row data means, please refer to the lab manual chapter 3. +// In order to figure out how to actuate the lights and AC system and in order to know which bits in the output register control which of the devices, please refer to the lab manual chapter 3. + +// In reality, such an embedded application runs in an "infinite" loop. Moreover, the input and output directly communicate with pins on the processing unit's IC. +// this program, is adapted for simulation purpose, therefore the loop is stopped at the end for user to allow it to proceed. Moreover, the inputs and outputs are +// connected to files instead of the physical world. + +// compile and run: +// gcc main.c -std=c99 +// ./a.out +// ./a.out >> displayLog.txt + +// some notes: +// binary to hex conversion: +// Group binaries in packs of four 0000 0000 0000 0000 +// From 0 to 9 in a pack maps to 0 to 9 in the corresponding hex digit +// example: +// binary packs: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 +// hex digits: 0 1 2 3 4 5 6 7 8 9 +// From 10 to 15 in a pack maps to A, B, C, D, E, and F in the corresponding hex digit +// example: +// binary packs: 1010 1011 1100 1101 1110 1111 +// hex digits: A B C D E F + +unsigned int readInput(unsigned int sampleIndex) +{ + char *line = NULL; + size_t len = 0; + ssize_t read; + unsigned int inputCurrent = 0; + FILE *inputFile; + inputFile = fopen("inputData.txt", "r"); + + if (inputFile == NULL) + { + printf("Cannot open the file!\n"); + return(0x00000001 << 23); // bit 23 is not used by the switches or sensors. So can be used to report an error. + } + + for(int currentIndex = 0; ;currentIndex++) + { + fscanf (inputFile, "%d", &inputCurrent); + + if (feof(inputFile)) + { + fclose(inputFile); + printf("Reached end of input file! sampleIndex=%d\n", sampleIndex); + return(0x00000001 << 24); // bit 24 is not used by the switches or sensors. So can be used to report an error. + } + if(sampleIndex == currentIndex) + { + printf("inputCurrent=%d\n", inputCurrent); + break; + } + } + fclose(inputFile); + return(inputCurrent); +} + +int writeOutput(unsigned int outputCurrent, unsigned int sampleIndex) +{ + FILE *outputFile = fopen("outputLog.txt", "a"); + + if (outputFile == NULL) + { + printf("Cannot open the file!\n"); + return(9); + } + if(sampleIndex == 0) + fprintf(outputFile, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); + + fprintf(outputFile, "%d : Output Register = %d\n", sampleIndex, outputCurrent); + + fclose(outputFile); + return(0); +} + +int main(int argc, char **argv) +{ + // variables related to input and sensors + unsigned int inputRegister = 0; + bool isLocked = false; + unsigned int fanSpeedSelector = 0; + bool isAcOn = false; + float temperatureDesired = 0; + float temperatureMeasured = 0; + unsigned int humiditySensor = 0; + unsigned int humidityMeasured = 0; + + // variables related to decisions + bool isGreenOn = false; + bool isRedOn = false; + unsigned int fanSpeed = 0; + bool isHeaterOn = false; + bool isCoolerOn = false; + bool isHumidity2Low_n = true; + bool isHumidity2High_n = true; + + // variables related to outputs + unsigned int outputRegister = 0; + + // constants defining system behaviour + static float Hysteresis_Cooler = 0.3; + static float Hysteresis_Heater = 0.3; + static unsigned int Humidity_2Low = 25; + static unsigned int Humidity_2High = 60; + + // Other + unsigned int sampleIndex = 0; + + while(true) + { + //++++++ Section 1. Read inputs and sensor data. Convert sensor data to meaningful information. ++++++// + inputRegister = readInput(sampleIndex); + // check if input is correctly read + if(inputRegister >= (0x00000001 << 23)) + break; + + // Lock : XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXI , assuming that "I" is input bit (Lock) and "X" is a don't-care bit. + // to extract isLocked which is the bit 0, we use a mask that is all 0 but at bit 0. Bit 0 is 1. + // the mask is: 00...00 00001 in binary, which is a decimal 1. The hex equivalent is 0x00000001. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". What remains is the isLocked value which must be converted to a boolean + // comparison operations always return a boolean. (x == 1) returns "true" if x is one, otherwise it returns "false". The return value is assigned to "isLocked". + isLocked = ((inputRegister & 0x00000001) == 0x00000001); + + // Fan Speed Selector : XXXX XXXX XXXX XXXX XXXX XXXX XXXX IIIX , assuming that "I" is an input bit (for Fan) and "X" is a don't-care bit. + // to extract fan speed selector value, we use a mask that is all 0 but at bits 1 to 3. + // the mask is: 00...00 0000 0000 0000 1110 in binary. The hex equivalent is 0x0000000E. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". Then we shift the remaining bits to end up with sensor data. + // What remains is the speed selector value which must be interpreted according the table given in the lab manual. + + //fanSpeedSelector = (inputRegister & 0x0000000E) >> 1; + + // A better alternative is to fist shift the fan selector bits to LSB (Least Significant Bit) position and then filter unwanted remaining bits. + // selector data is XX...XX XXXX IIIX in binary, assuming that "I" are selector bits and "X" don't-care bits. We shift by 1, ending up as: XX...XX XXXX XIII. + // The mask will be: 00...00 0000 0111. The hex equivalent is 0x0000007. + fanSpeedSelector = inputRegister >> 1; + fanSpeedSelector &= 0x00000007; + + // AC Selector : XXXX XXXX XXXX XXXX XXXX XXII IIII XXXX , assuming that "I" is an input bit (for AC) and "X" is a don't-care bit. + // bit number 4 is AC on/off switch + //isAcOn = false; // Assignment + isAcOn = (((inputRegister >> 4) &0x00000001) == 0x00000001); + + // bits 5 to 9 indicate desired temperature + //unsigned int temperatureDesired_tmp = 0; // Assignment + unsigned int temperatureDesired_tmp = inputRegister >> 5; + temperatureDesired_tmp &= 0x0000001F; + //temperatureDesired_tmp = 0x00000000; // Assignment + //printf("temperatureDesired_tmp casted to float=%f\n",(float)temperatureDesired_tmp); //for debug + // According to equation 1: + //temperatureDesired = 0.0 ; // Assignment + temperatureDesired = 14.5 + ((temperatureDesired_tmp) * 0.5); + // Temperature sensor : XXXX XXXX XXXX XXII IIII IIXX XXXX XXXX , assuming that "I" is an input bit (temperature sensor) and "X" is a don't-care bit. + // bits 10 to 17 indicate temperature value read from sensor + // bits 10 to 12 are fractional part + //unsigned int temperatureMeasured_fractional = 0; // Assignment + //temperatureMeasured_fractional = 0x00000000; // Assignment + unsigned int temperatureMeasured_fractional = inputRegister >> 10; + temperatureMeasured_fractional &= 0x00000007; + // bits 13 to 17 are decimal part + //unsigned int temperatureMeasured_decimal = inputRegister ; // Assignment + //temperatureMeasured_decimal = 0x00000000; // Assignment + unsigned int temperatureMeasured_decimal = inputRegister >> 13; + temperatureMeasured_decimal &= 0x0000001F; + + if((temperatureMeasured_decimal == 0x0000001F) && (temperatureMeasured_fractional == 0x00000000)) + { + temperatureMeasured = -1; + } + else if((temperatureMeasured_decimal == 0x0000001F) && (temperatureMeasured_fractional == 0x00000007)) + { + temperatureMeasured = 31; + } + else + { + temperatureMeasured = temperatureMeasured_decimal * 1.0 + temperatureMeasured_fractional * 0.2; + } + + // According to equation 2: + // Assignment + // Assignment + //temperatureMeasured = 0; // Assignment + // Assignment + // Assignment + + // Humidity sensor : XXXX XXXX XIII IIXX XXXX XXXX XXXX XXXX , assuming that "I" is an input bit (humidity sensor) and "X" is a don't-care bit. + // to extract humidity value, we use a mask that is all 0 but at bits 18 to 22. + // the mask is: 00...0 0111 1100 0000 0000 0000 0000 in binary. The hex equivalent is 0x007C0000. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". Then we shift the remaining bits to end up with sensor data. + // What remains is the humidity sensor data value which must be converted to humidity percentage. + + //humiditySensor = (inputRegister & 0x007C0000) >> 18; + + // A better alternative is to fist shift the sensor data to LSB (Least Significant Bit) position and then filter unwanted remaining bits. + // sensor data is XX...XX XIII IIXX XXXX XXXX XXXX XXXX in binary, assuming that "I" are sensor data bits and "X" don't-care bits. We shift by 18, ending up as: XX...XX XXXI IIII. + // The mask will be: 00...00 0001 1111. The hex equivalent is 0x0000001F. + humiditySensor = inputRegister >> 18; + humiditySensor &= 0x0000001F; + + // Converting sensor data (humiditySensor) to humidityValue percentage using equation 3. + // Here we use shift and sum operations to implement multiplication. Some examples: + // (a * 2) = (a << 1) // (a * 3) = ((a << 1) + a) + // (a * 4) = (a << 2) + if (humiditySensor < 3) + humidityMeasured = humiditySensor << 2; + else if (humiditySensor < 28) + humidityMeasured = 8 + ((humiditySensor - 2) << 1) + (humiditySensor - 2); + else if (humiditySensor < 31) + humidityMeasured = 83 + ((humiditySensor - 27) << 2); + else + humidityMeasured = 100; + + //++++++ Section 2. Decide on outputs. ++++++// + // signal lights for lock + if(isLocked) + { + isGreenOn = false; + isRedOn = true; + } + else + { + isGreenOn = true; + isRedOn = false; + } + + // fan control + // according tables given in the manual + if(fanSpeedSelector == 0x00000007) + fanSpeed = 0x00000000; // Assignment + else if (fanSpeedSelector == 0x00000003) // Assignment + fanSpeed = 0x00000001; // Assignment + else if (fanSpeedSelector == 0x00000005) // Assignment + fanSpeed = 0x00000002; // Assignment + else + fanSpeed = 0x00000003; // Assignment + + // temperature and AC control + if (isAcOn) + { + if((temperatureMeasured - temperatureDesired) > Hysteresis_Cooler) + { + isCoolerOn = true; + isHeaterOn = false; + } + else if(temperatureMeasured < (temperatureDesired - Hysteresis_Heater)) + { + isCoolerOn = false; + isHeaterOn = true; + } + else + { + isCoolerOn = false; + isHeaterOn = false; + } + // Assignment + // Assignment + } + else + { + // Assignment + isCoolerOn = false; + isHeaterOn = false; + } + if (isCoolerOn && (temperatureMeasured <= temperatureDesired)) + { + isCoolerOn = false; + isHeaterOn = false; + } + else if (isHeaterOn && (temperatureMeasured >= temperatureDesired)) + { + isCoolerOn = false; + isHeaterOn = false; + } + // Assignment + // Assignment + + // humidity warning: + if(humidityMeasured < Humidity_2Low) + { + isHumidity2Low_n = false; + isHumidity2High_n = true; + } + else if(humidityMeasured > Humidity_2High) + { + isHumidity2Low_n = true; + isHumidity2High_n = false; + } + else + { + isHumidity2Low_n = true; + isHumidity2High_n = true; + } + + //++++++ Section 3. Write outputs. ++++++// + // clear previous outputs + outputRegister = 0; + + // Green light : YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYYO , assuming that "O" is the output bit (green light) and "Y" is a don't-touch bit. + // "Y" bits are don't-touch meaning that we must not change their values. + // If it is off, since outputRegister is already made 0 (all bits 0) we do nothing. + // If it is on, since the "on" state corresponds with a "1" according to the lab manual, then we can add 1 to change bit 0 to "1". This will not change the value of other bits. + + //if(isGreenOn) + // outputRegister += 0x00000001; + + // Alternatively we can use bitwise OR operator: + if(isGreenOn) + outputRegister |= 0x00000001; + + // Red light : YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYOY , assuming that "O" is the output bit (red light) and "Y" is a don't-touch bit. + // If it is off, since outputRegister is already made 0 (all bits 0) we do nothing. + // If it is on, since the "on" state corresponds with a "1" at bit 1, according to the lab manual, then we shift "1" to bit 1 location and perform a bitwise OR. + if(isRedOn) + outputRegister |= (0x00000001 << 1); + + // Fan speed at bit 2 to 3 : YYYY YYYY YYYY YYYY YYYY YYYY YYYY OOYY , assuming that "O" is the output bit (fan speed) and "Y" is a don't-touch bit. + // The values are defined in the lab manual. These are already converetd from selector readout in "fanSpeedSelector" into the proper format "fanSpeed". + // Shift to place and perform a bitwise OR. + //outputRegister = fanSpeed ; // Assignment + outputRegister |= (fanSpeed << 2); + // Cooler control at bit 4 : YYYY YYYY YYYY YYYY YYYY YYYY YYYO YYYY , assuming that "O" is the output bit (Cooler control) and "Y" is a don't-touch bit. + // Assignment + if(isCoolerOn) + outputRegister |= (0x00000001 << 4); + + // Heater control at bit 5 : YYYY YYYY YYYY YYYY YYYY YYYY YYOY YYYY , assuming that "O" is the output bit (Heater control) and "Y" is a don't-touch bit. + // Assignment + if(isHeaterOn) + outputRegister |= (0x00000001 << 5); + + // Humidity too high warning at bit 6 : YYYY YYYY YYYY YYYY YYYY YYYY YOYY YYYY , assuming that "O" is the output bit and "Y" is a don't-touch bit. + // Pay attention that writing 1 actually turns off the light, as defined in the lab manual. + // Make sure the light is off normally. Here we can not rely on the fact that previously we set outputRegister = 0 since the light is actually "on" when its control bit is "0". + // Instead we use the fact that we previously set outputRegister = 0 to light up the warning light (by writing nothing for the case that it is too humid) + if(isHumidity2High_n) + outputRegister |= (0x00000001 << 6); + + // Humidity too low warning at bit 7 : YYYY YYYY YYYY YYYY YYYY YYYY OYYY YYYY , assuming that "O" is the output bit and "Y" is a don't-touch bit. + // Pay attention that writing 1 actually turns off the light, as defined in the lab manual. + // Make sure the light is off normally. Here we can not rely on the fact that, previously, we set outputRegister = 0 since the light is actually "on" when its control bit is "0". + // Instead we use the fact that we previously set outputRegister = 0 to light up the warning light (by writing nothing for the case that humidity is too low) + if(isHumidity2Low_n) + outputRegister |= (0x00000001 << 7); + + writeOutput(outputRegister, sampleIndex); + + // write to the screen. Redirect it later on to the log file. + printf("inputs: Lock=%d, Fan=%d, AC=%d, Desired=%f, Measured=%f, Humidity=%d\n", (int)isLocked, fanSpeedSelector, (int)isAcOn, temperatureDesired, temperatureMeasured, humidityMeasured); + printf("outputs: Green=%d, Red=%d, Fan=%d, Cooler=%d, Heater=%d, Humidity2H_n=%d, Humidity2L_n=%d\n", (int)isGreenOn, (int)isRedOn, fanSpeed, (int)isCoolerOn, (int)isHeaterOn, (int)isHumidity2High_n, (int)isHumidity2Low_n); + + // This keeps the loop from going fast, allowing us to see the output for debugging purpose. Press "Enter" to proceed. + // int dummy = getchar(); //for debug + + // increment sample index used for simulation + sampleIndex++; + } + return 0; +} + + + diff --git a/chap2/main.c.save b/chap2/main.c.save new file mode 100644 index 0000000..a31cedf --- /dev/null +++ b/chap2/main.c.save @@ -0,0 +1,334 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdbool.h> + +// Room Controls, in an infinite loops polls input switches, selectors, and sensors. Then it interprets the row data. Based on acquired information, the system +// makes decisions. These decisions are then used to set appropriate values for signals and warning lights as well as actuators such as cooler and heater. + +// In order to extract the row data from the input register and in order to figure out what row data means, please refer to the lab manual chapter 3. +// In order to figure out how to actuate the lights and AC system and in order to know which bits in the output register control which of the devices, please refer to the lab manual chapter 3. + +// In reality, such an embedded application runs in an "infinite" loop. Moreover, the input and output directly communicate with pins on the processing unit's IC. +// this program, is adapted for simulation purpose, therefore the loop is stopped at the end for user to allow it to proceed. Moreover, the inputs and outputs are +// connected to files instead of the physical world. + +// compile and run: +// gcc main.c -std=c99 +// ./a.out +// ./a.out >> displayLog.txt + +// some notes: +// binary to hex conversion: +// Group binaries in packs of four 0000 0000 0000 0000 +// From 0 to 9 in a pack maps to 0 to 9 in the corresponding hex digit +// example: +// binary packs: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 +// hex digits: 0 1 2 3 4 5 6 7 8 9 +// From 10 to 15 in a pack maps to A, B, C, D, E, and F in the corresponding hex digit +// example: +// binary packs: 1010 1011 1100 1101 1110 1111 +// hex digits: A B C D E F + +unsigned int readInput(unsigned int sampleIndex) +{ + char *line = NULL; + size_t len = 0; + ssize_t read; + unsigned int inputCurrent = 0; + FILE *inputFile; + inputFile = fopen("inputData.txt", "r"); + + if (inputFile == NULL) + { + printf("Cannot open the file!\n"); + return(0x00000001 << 23); // bit 23 is not used by the switches or sensors. So can be used to report an error. + } + + for(int currentIndex = 0; ;currentIndex++) + { + fscanf (inputFile, "%d", &inputCurrent); + + if (feof(inputFile)) + { + fclose(inputFile); + printf("Reached end of input file! sampleIndex=%d\n", sampleIndex); + return(0x00000001 << 24); // bit 24 is not used by the switches or sensors. So can be used to report an error. + } + if(sampleIndex == currentIndex) + { + printf("inputCurrent=%d\n", inputCurrent); + break; + } + } + fclose(inputFile); + return(inputCurrent); +} + +int writeOutput(unsigned int outputCurrent, unsigned int sampleIndex) +{ + FILE *outputFile = fopen("outputLog.txt", "a"); + + if (outputFile == NULL) + { + printf("Cannot open the file!\n"); + return(9); + } + if(sampleIndex == 0) + fprintf(outputFile, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); + + fprintf(outputFile, "%d : Output Register = %d\n", sampleIndex, outputCurrent); + + fclose(outputFile); + return(0); +} + +int main(int argc, char **argv) +{ + // variables related to input and sensors + unsigned int inputRegister = 0; + bool isLocked = false; + unsigned int fanSpeedSelector = 0; + bool isAcOn = false; + float temperatureDesired = 0; + float temperatureMeasured = 0; + unsigned int humiditySensor = 0; + unsigned int humidityMeasured = 0; + + // variables related to decisions + bool isGreenOn = false; + bool isRedOn = false; + unsigned int fanSpeed = 0; + bool isHeaterOn = false; + bool isCoolerOn = false; + bool isHumidity2Low_n = true; + bool isHumidity2High_n = true; + + // variables related to outputs + unsigned int outputRegister = 0; + + // constants defining system behaviour + static float Hysteresis_Cooler = 0.3; + static float Hysteresis_Heater = 0.3; + static unsigned int Humidity_2Low = 25; + static unsigned int Humidity_2High = 60; + + // Other + unsigned int sampleIndex = 0; + + while(true) + { + //++++++ Section 1. Read inputs and sensor data. Convert sensor data to meaningful information. ++++++// + inputRegister = readInput(sampleIndex); + // check if input is correctly read + if(inputRegister >= (0x00000001 << 23)) + break; + + // Lock : XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXI , assuming that "I" is input bit (Lock) and "X" is a don't-care bit. + // to extract isLocked which is the bit 0, we use a mask that is all 0 but at bit 0. Bit 0 is 1. + // the mask is: 00...00 00001 in binary, which is a decimal 1. The hex equivalent is 0x00000001. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". What remains is the isLocked value which must be converted to a boolean + // comparison operations always return a boolean. (x == 1) returns "true" if x is one, otherwise it returns "false". The return value is assigned to "isLocked". + isLocked = ((inputRegister & 0x00000001) == 0x00000001); + + // Fan Speed Selector : XXXX XXXX XXXX XXXX XXXX XXXX XXXX IIIX , assuming that "I" is an input bit (for Fan) and "X" is a don't-care bit. + // to extract fan speed selector value, we use a mask that is all 0 but at bits 1 to 3. + // the mask is: 00...00 0000 0000 0000 1110 in binary. The hex equivalent is 0x0000000E. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". Then we shift the remaining bits to end up with sensor data. + // What remains is the speed selector value which must be interpreted according the table given in the lab manual. + + //fanSpeedSelector = (inputRegister & 0x0000000E) >> 1; + + // A better alternative is to fist shift the fan selector bits to LSB (Least Significant Bit) position and then filter unwanted remaining bits. + // selector data is XX...XX XXXX IIIX in binary, assuming that "I" are selector bits and "X" don't-care bits. We shift by 1, ending up as: XX...XX XXXX XIII. + // The mask will be: 00...00 0000 0111. The hex equivalent is 0x0000007. + fanSpeedSelector = inputRegister >> 1; + fanSpeedSelector &= 0x00000007; + + // AC Selector : XXXX XXXX XXXX XXXX XXXX XXII IIII XXXX , assuming that "I" is an input bit (for AC) and "X" is a don't-care bit. + // bit number 4 is AC on/off switch + //isAcOn = false; // Assignment + isAcOn = inputRegister >> 4; + isAcOn =((isAcOn & 0x00000001) == 0x00000001); + // bits 5 to 9 indicate desired temperature + //unsigned int temperatureDesired_tmp = 0; // Assignment + unsigned int temperatureDesired_tmp = inputRegister >> 5; + temperatureDesired_tmp &= 0x0000001F; //temperatureDesired_tmp = 0x00000000; // Assignment + //printf("temperatureDesired_tmp casted to float=%f\n",(float)temperatureDesired_tmp); //for debug + // According to equation 1: + //temperatureDesired = 0.0 ; // Assignment + temperatureDesired = 14.5 + ((temperatureDesired) * 0.5); + // Temperature sensor : XXXX XXXX XXXX XXII IIII IIXX XXXX XXXX , assuming that "I" is an input bit (temperature sensor) and "X" is a don't-care bit. + // bits 10 to 17 indicate temperature value read from sensor + // bits 10 to 12 are fractional part + //unsigned int temperatureMeasured_fractional = 0; // Assignment + //temperatureMeasured_fractional = 0x00000000; // Assignment + unsigned int temperatureMeasured_fractional = inputRegister >> 10; + temperatureMeasured_fractional &= 0x00000007; + // bits 13 to 17 are decimal part + //unsigned int temperatureMeasured_decimal = inputRegister ; // Assignment + //temperatureMeasured_decimal = 0x00000000; // Assignment + unsigned int temperatureMeasured_decimal = inputRegister >> 13; + temperatureMeasured_decimal &= 0x0000001F; + // According to equation 2: + // Assignment + // Assignment + temperatureMeasured = 0; // Assignment + // Assignment + // Assignment + // Humidity sensor : XXXX XXXX XIII IIXX XXXX XXXX XXXX XXXX , assuming that "I" is an input bit (humidity sensor) and "X" is a don't-care bit. + // to extract humidity value, we use a mask that is all 0 but at bits 18 to 22. + // the mask is: 00...0 0111 1100 0000 0000 0000 0000 in binary. The hex equivalent is 0x007C0000. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". Then we shift the remaining bits to end up with sensor data. + // What remains is the humidity sensor data value which must be converted to humidity percentage. + + //humiditySensor = (inputRegister & 0x007C0000) >> 18; + + // A better alternative is to fist shift the sensor data to LSB (Least Significant Bit) position and then filter unwanted remaining bits. + // sensor data is XX...XX XIII IIXX XXXX XXXX XXXX XXXX in binary, assuming that "I" are sensor data bits and "X" don't-care bits. We shift by 18, ending up as: XX...XX XXXI IIII. + // The mask will be: 00...00 0001 1111. The hex equivalent is 0x0000001F. + humiditySensor = inputRegister >> 18; + humiditySensor &= 0x0000001F; + + // Converting sensor data (humiditySensor) to humidityValue percentage using equation 3. + // Here we use shift and sum operations to implement multiplication. Some examples: + // (a * 2) = (a << 1) // (a * 3) = ((a << 1) + a) + // (a * 4) = (a << 2) + if (humiditySensor < 3) + humidityMeasured = humiditySensor << 2; + else if (humiditySensor < 28) + humidityMeasured = 8 + ((humiditySensor - 2) << 1) + (humiditySensor - 2); + else if (humiditySensor < 31) + humidityMeasured = 83 + ((humiditySensor - 27) << 2); + else + humidityMeasured = 100; + + //++++++ Section 2. Decide on outputs. ++++++// + // signal lights for lock + if(isLocked) + { + isGreenOn = false; + isRedOn = true; + } + else + { + isGreenOn = true; + isRedOn = false; + } + + // fan control + // according tables given in the manual + if(fanSpeedSelector == 0x0) + fanSpeed = 0x0; // Assignment + else if (fanSpeedSelector == 0x0) // Assignment + fanSpeed = 0x0; // Assignment + else if (fanSpeedSelector == 0x0) // Assignment + fanSpeed = 0x0; // Assignment + else + fanSpeed = 0x0; // Assignment + + // temperature and AC control + if (isAcOn) + { + if((temperatureMeasured - temperatureDesired) > Hysteresis_Cooler) + { + isCoolerOn = true; + isHeaterOn = false; + } + // Assignment + // Assignment + } + else + { + // Assignment + isHeaterOn = false; + } + if (isCoolerOn && (temperatureMeasured <= temperatureDesired)) + { + isCoolerOn = false; + isHeaterOn = false; + } + // Assignment + // Assignment + + // humidity warning: + if(humidityMeasured < Humidity_2Low) + { + isHumidity2Low_n = false; + isHumidity2High_n = true; + } + else if(humidityMeasured > Humidity_2High) + { + isHumidity2Low_n = true; + isHumidity2High_n = false; + } + else + { + isHumidity2Low_n = true; + isHumidity2High_n = true; + } + + //++++++ Section 3. Write outputs. ++++++// + // clear previous outputs + outputRegister = 0; + + // Green light : YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYYO , assuming that "O" is the output bit (green light) and "Y" is a don't-touch bit. + // "Y" bits are don't-touch meaning that we must not change their values. + // If it is off, since outputRegister is already made 0 (all bits 0) we do nothing. + // If it is on, since the "on" state corresponds with a "1" according to the lab manual, then we can add 1 to change bit 0 to "1". This will not change the value of other bits. + + //if(isGreenOn) + // outputRegister += 0x00000001; + + // Alternatively we can use bitwise OR operator: + if(isGreenOn) + outputRegister |= 0x00000001; + + // Red light : YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYOY , assuming that "O" is the output bit (red light) and "Y" is a don't-touch bit. + // If it is off, since outputRegister is already made 0 (all bits 0) we do nothing. + // If it is on, since the "on" state corresponds with a "1" at bit 1, according to the lab manual, then we shift "1" to bit 1 location and perform a bitwise OR. + if(isRedOn) + outputRegister |= (0x00000001 << 1); + + // Fan speed at bit 2 to 3 : YYYY YYYY YYYY YYYY YYYY YYYY YYYY OOYY , assuming that "O" is the output bit (fan speed) and "Y" is a don't-touch bit. + // The values are defined in the lab manual. These are already converetd from selector readout in "fanSpeedSelector" into the proper format "fanSpeed". + // Shift to place and perform a bitwise OR. + outputRegister = fanSpeed ; // Assignment + + // Cooler control at bit 4 : YYYY YYYY YYYY YYYY YYYY YYYY YYYO YYYY , assuming that "O" is the output bit (Cooler control) and "Y" is a don't-touch bit. + // Assignment + + // Heater control at bit 5 : YYYY YYYY YYYY YYYY YYYY YYYY YYOY YYYY , assuming that "O" is the output bit (Heater control) and "Y" is a don't-touch bit. + // Assignment + + // Humidity too high warning at bit 6 : YYYY YYYY YYYY YYYY YYYY YYYY YOYY YYYY , assuming that "O" is the output bit and "Y" is a don't-touch bit. + // Pay attention that writing 1 actually turns off the light, as defined in the lab manual. + // Make sure the light is off normally. Here we can not rely on the fact that previously we set outputRegister = 0 since the light is actually "on" when its control bit is "0". + // Instead we use the fact that we previously set outputRegister = 0 to light up the warning light (by writing nothing for the case that it is too humid) + if(isHumidity2High_n) + outputRegister |= (0x00000001 << 6); + + // Humidity too low warning at bit 7 : YYYY YYYY YYYY YYYY YYYY YYYY OYYY YYYY , assuming that "O" is the output bit and "Y" is a don't-touch bit. + // Pay attention that writing 1 actually turns off the light, as defined in the lab manual. + // Make sure the light is off normally. Here we can not rely on the fact that, previously, we set outputRegister = 0 since the light is actually "on" when its control bit is "0". + // Instead we use the fact that we previously set outputRegister = 0 to light up the warning light (by writing nothing for the case that humidity is too low) + if(isHumidity2Low_n) + outputRegister |= (0x00000001 << 7); + + writeOutput(outputRegister, sampleIndex); + + // write to the screen. Redirect it later on to the log file. + printf("inputs: Lock=%d, Fan=%d, AC=%d, Desired=%f, Measured=%f, Humidity=%d\n", (int)isLocked, fanSpeedSelector, (int)isAcOn, temperatureDesired, temperatureMeasured, humidityMeasured); + printf("outputs: Green=%d, Red=%d, Fan=%d, Cooler=%d, Heater=%d, Humidity2H_n=%d, Humidity2L_n=%d\n", (int)isGreenOn, (int)isRedOn, fanSpeed, (int)isCoolerOn, (int)isHeaterOn, (int)isHumidity2High_n, (int)isHumidity2Low_n); + + // This keeps the loop from going fast, allowing us to see the output for debugging purpose. Press "Enter" to proceed. + // int dummy = getchar(); //for debug + + // increment sample index used for simulation + sampleIndex++; + } + return 0; +} + + + diff --git a/chap2/main.c.save.1 b/chap2/main.c.save.1 new file mode 100644 index 0000000..94092c9 --- /dev/null +++ b/chap2/main.c.save.1 @@ -0,0 +1,368 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdbool.h> + +// Room Controls, in an infinite loops polls input switches, selectors, and sensors. Then it interprets the row data. Based on acquired information, the system +// makes decisions. These decisions are then used to set appropriate values for signals and warning lights as well as actuators such as cooler and heater. + +// In order to extract the row data from the input register and in order to figure out what row data means, please refer to the lab manual chapter 3. +// In order to figure out how to actuate the lights and AC system and in order to know which bits in the output register control which of the devices, please refer to the lab manual chapter 3. + +// In reality, such an embedded application runs in an "infinite" loop. Moreover, the input and output directly communicate with pins on the processing unit's IC. +// this program, is adapted for simulation purpose, therefore the loop is stopped at the end for user to allow it to proceed. Moreover, the inputs and outputs are +// connected to files instead of the physical world. + +// compile and run: +// gcc main.c -std=c99 +// ./a.out +// ./a.out >> displayLog.txt + +// some notes: +// binary to hex conversion: +// Group binaries in packs of four 0000 0000 0000 0000 +// From 0 to 9 in a pack maps to 0 to 9 in the corresponding hex digit +// example: +// binary packs: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 +// hex digits: 0 1 2 3 4 5 6 7 8 9 +// From 10 to 15 in a pack maps to A, B, C, D, E, and F in the corresponding hex digit +// example: +// binary packs: 1010 1011 1100 1101 1110 1111 +// hex digits: A B C D E F + +unsigned int readInput(unsigned int sampleIndex) +{ + char *line = NULL; + size_t len = 0; + ssize_t read; + unsigned int inputCurrent = 0; + FILE *inputFile; + inputFile = fopen("inputData.txt", "r"); + + if (inputFile == NULL) + { + printf("Cannot open the file!\n"); + return(0x00000001 << 23); // bit 23 is not used by the switches or sensors. So can be used to report an error. + } + + for(int currentIndex = 0; ;currentIndex++) + { + fscanf (inputFile, "%d", &inputCurrent); + + if (feof(inputFile)) + { + fclose(inputFile); + printf("Reached end of input file! sampleIndex=%d\n", sampleIndex); + return(0x00000001 << 24); // bit 24 is not used by the switches or sensors. So can be used to report an error. + } + if(sampleIndex == currentIndex) + { + printf("inputCurrent=%d\n", inputCurrent); + break; + } + } + fclose(inputFile); + return(inputCurrent); +} + +int writeOutput(unsigned int outputCurrent, unsigned int sampleIndex) +{ + FILE *outputFile = fopen("outputLog.txt", "a"); + + if (outputFile == NULL) + { + printf("Cannot open the file!\n"); + return(9); + } + if(sampleIndex == 0) + fprintf(outputFile, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); + + fprintf(outputFile, "%d : Output Register = %d\n", sampleIndex, outputCurrent); + + fclose(outputFile); + return(0); +} + +int main(int argc, char **argv) +{ + // variables related to input and sensors + unsigned int inputRegister = 0; + bool isLocked = false; + unsigned int fanSpeedSelector = 0; + bool isAcOn = false; + float temperatureDesired = 0; + float temperatureMeasured = 0; + unsigned int humiditySensor = 0; + unsigned int humidityMeasured = 0; + + // variables related to decisions + bool isGreenOn = false; + bool isRedOn = false; + unsigned int fanSpeed = 0; + bool isHeaterOn = false; + bool isCoolerOn = false; + bool isHumidity2Low_n = true; + bool isHumidity2High_n = true; + + // variables related to outputs + unsigned int outputRegister = 0; + + // constants defining system behaviour + static float Hysteresis_Cooler = 0.3; + static float Hysteresis_Heater = 0.3; + static unsigned int Humidity_2Low = 25; + static unsigned int Humidity_2High = 60; + + // Other + unsigned int sampleIndex = 0; + + while(true) + { + //++++++ Section 1. Read inputs and sensor data. Convert sensor data to meaningful information. ++++++// + inputRegister = readInput(sampleIndex); + // check if input is correctly read + if(inputRegister >= (0x00000001 << 23)) + break; + + // Lock : XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXI , assuming that "I" is input bit (Lock) and "X" is a don't-care bit. + // to extract isLocked which is the bit 0, we use a mask that is all 0 but at bit 0. Bit 0 is 1. + // the mask is: 00...00 00001 in binary, which is a decimal 1. The hex equivalent is 0x00000001. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". What remains is the isLocked value which must be converted to a boolean + // comparison operations always return a boolean. (x == 1) returns "true" if x is one, otherwise it returns "false". The return value is assigned to "isLocked". + isLocked = ((inputRegister & 0x00000001) == 0x00000001); + + // Fan Speed Selector : XXXX XXXX XXXX XXXX XXXX XXXX XXXX IIIX , assuming that "I" is an input bit (for Fan) and "X" is a don't-care bit. + // to extract fan speed selector value, we use a mask that is all 0 but at bits 1 to 3. + // the mask is: 00...00 0000 0000 0000 1110 in binary. The hex equivalent is 0x0000000E. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". Then we shift the remaining bits to end up with sensor data. + // What remains is the speed selector value which must be interpreted according the table given in the lab manual. + + //fanSpeedSelector = (inputRegister & 0x0000000E) >> 1; + + // A better alternative is to fist shift the fan selector bits to LSB (Least Significant Bit) position and then filter unwanted remaining bits. + // selector data is XX...XX XXXX IIIX in binary, assuming that "I" are selector bits and "X" don't-care bits. We shift by 1, ending up as: XX...XX XXXX XIII. + // The mask will be: 00...00 0000 0111. The hex equivalent is 0x0000007. + fanSpeedSelector = inputRegister >> 1; + fanSpeedSelector &= 0x00000007; + + // AC Selector : XXXX XXXX XXXX XXXX XXXX XXII IIII XXXX , assuming that "I" is an input bit (for AC) and "X" is a don't-care bit. + // bit number 4 is AC on/off switch + //isAcOn = false; // Assignment + isAcOn = inputRegister >> 4; + isAcOn =((isAcOn & 0x00000001) == 0x00000001); + // bits 5 to 9 indicate desired temperature + //unsigned int temperatureDesired_tmp = 0; // Assignment + unsigned int temperatureDesired_tmp = inputRegister >> 5; + temperatureDesired_tmp &= 0x0000001F; + //temperatureDesired_tmp = 0x00000000; // Assignment + //printf("temperatureDesired_tmp casted to float=%f\n",(float)temperatureDesired_tmp); //for debug + // According to equation 1: + //temperatureDesired = 0.0 ; // Assignment + temperatureDesired = 14.5 + ((temperatureDesired_tmp) * 0.5); + // Temperature sensor : XXXX XXXX XXXX XXII IIII IIXX XXXX XXXX , assuming that "I" is an input bit (temperature sensor) and "X" is a don't-care bit. + // bits 10 to 17 indicate temperature value read from sensor + // bits 10 to 12 are fractional part + //unsigned int temperatureMeasured_fractional = 0; // Assignment + //temperatureMeasured_fractional = 0x00000000; // Assignment + unsigned int temperatureMeasured_fractional = inputRegister >> 10; + temperatureMeasured_fractional &= 0x00000007; + // bits 13 to 17 are decimal part + //unsigned int temperatureMeasured_decimal = inputRegister ; // Assignment + //temperatureMeasured_decimal = 0x00000000; // Assignment + unsigned int temperatureMeasured_decimal = inputRegister >> 13; + temperatureMeasured_decimal &= 0x0000001F; + + if((temperatureMeasured_decimal == 0x0000001F) && (temperatureMeasured_fractional == 0x00000000)) + { + temperatureMeasured = -1; + } + else if((temperatureMeasured_decimal == 0x0000001F) && (temperatureMeasured_fractional == 0x00000007)) + { + temperatureMeasured = 31; + } + else + { + temperatureMeasured = temperatureMeasured_decimal * 1.0 + temperatureMeasured_fractional * 0.2; + } + + // According to equation 2: + // Assignment + // Assignment + //temperatureMeasured = 0; // Assignment + // Assignment + // Assignment + + // Humidity sensor : XXXX XXXX XIII IIXX XXXX XXXX XXXX XXXX , assuming that "I" is an input bit (humidity sensor) and "X" is a don't-care bit. + // to extract humidity value, we use a mask that is all 0 but at bits 18 to 22. + // the mask is: 00...0 0111 1100 0000 0000 0000 0000 in binary. The hex equivalent is 0x007C0000. + // we use bitwise "and" operation to filter out all irrelevant bits in the "inputRegister". Then we shift the remaining bits to end up with sensor data. + // What remains is the humidity sensor data value which must be converted to humidity percentage. + + //humiditySensor = (inputRegister & 0x007C0000) >> 18; + + // A better alternative is to fist shift the sensor data to LSB (Least Significant Bit) position and then filter unwanted remaining bits. + // sensor data is XX...XX XIII IIXX XXXX XXXX XXXX XXXX in binary, assuming that "I" are sensor data bits and "X" don't-care bits. We shift by 18, ending up as: XX...XX XXXI IIII. + // The mask will be: 00...00 0001 1111. The hex equivalent is 0x0000001F. + humiditySensor = inputRegister >> 18; + humiditySensor &= 0x0000001F; + + // Converting sensor data (humiditySensor) to humidityValue percentage using equation 3. + // Here we use shift and sum operations to implement multiplication. Some examples: + // (a * 2) = (a << 1) // (a * 3) = ((a << 1) + a) + // (a * 4) = (a << 2) + if (humiditySensor < 3) + humidityMeasured = humiditySensor << 2; + else if (humiditySensor < 28) + humidityMeasured = 8 + ((humiditySensor - 2) << 1) + (humiditySensor - 2); + else if (humiditySensor < 31) + humidityMeasured = 83 + ((humiditySensor - 27) << 2); + else + humidityMeasured = 100; + + //++++++ Section 2. Decide on outputs. ++++++// + // signal lights for lock + if(isLocked) + { + isGreenOn = false; + isRedOn = true; + } + else + { + isGreenOn = true; + isRedOn = false; + } + + // fan control + // according tables given in the manual + if(fanSpeedSelector == 0x00000007) + fanSpeed = 0x00000000; // Assignment + else if (fanSpeedSelector == 0x00000003) // Assignment + fanSpeed = 0x00000001; // Assignment + else if (fanSpeedSelector == 0x00000005) // Assignment + fanSpeed = 0x00000002; // Assignment + else + fanSpeed = 0x00000003; // Assignment + + // temperature and AC control + if (isAcOn) + { + if((temperatureMeasured - temperatureDesired) > Hysteresis_Cooler) + { + isCoolerOn = true; + isHeaterOn = false; + } + else if(temperatureMeasured < (temperatureDesired - Hysteresis_Heater)) + { + isCoolerOn = false; + isHeaterOn = true; + } + else + { + isCoolerOn = false; + isHeaterOn = false; + } + // Assignment + // Assignment + } + else + { + // Assignment + isCoolerOn = false; + isHeaterOn = false; + } + if (isCoolerOn && (temperatureMeasured <= temperatureDesired)) + { + isCoolerOn = false; + isHeaterOn = false; + } + else if (isHeaterOn && (temperatureMeasured >= temperatureDesired)) + { + isCoolerOn = false; + isHeaterOn = false; + } + // Assignment + // Assignment + + // humidity warning: + if(humidityMeasured < Humidity_2Low) + { + isHumidity2Low_n = false; + isHumidity2High_n = true; + } + else if(humidityMeasured > Humidity_2High) + { + isHumidity2Low_n = true; + isHumidity2High_n = false; + } + else + { + isHumidity2Low_n = true; + isHumidity2High_n = true; + } + + //++++++ Section 3. Write outputs. ++++++// + // clear previous outputs + outputRegister = 0; + + // Green light : YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYYO , assuming that "O" is the output bit (green light) and "Y" is a don't-touch bit. + // "Y" bits are don't-touch meaning that we must not change their values. + // If it is off, since outputRegister is already made 0 (all bits 0) we do nothing. + // If it is on, since the "on" state corresponds with a "1" according to the lab manual, then we can add 1 to change bit 0 to "1". This will not change the value of other bits. + + //if(isGreenOn) + // outputRegister += 0x00000001; + + // Alternatively we can use bitwise OR operator: + if(isGreenOn) + outputRegister |= 0x00000001; + + // Red light : YYYY YYYY YYYY YYYY YYYY YYYY YYYY YYOY , assuming that "O" is the output bit (red light) and "Y" is a don't-touch bit. + // If it is off, since outputRegister is already made 0 (all bits 0) we do nothing. + // If it is on, since the "on" state corresponds with a "1" at bit 1, according to the lab manual, then we shift "1" to bit 1 location and perform a bitwise OR. + if(isRedOn) + outputRegister |= (0x00000001 << 1); + + // Fan speed at bit 2 to 3 : YYYY YYYY YYYY YYYY YYYY YYYY YYYY OOYY , assuming that "O" is the output bit (fan speed) and "Y" is a don't-touch bit. + // The values are defined in the lab manual. These are already converetd from selector readout in "fanSpeedSelector" into the proper format "fanSpeed". + // Shift to place and perform a bitwise OR. + //outputRegister = fanSpeed ; // A + +ssignment + outputRegister |= (fanSpeed << 2); + // Cooler control at bit 4 : YYYY YYYY YYYY YYYY YYYY YYYY YYYO YYYY , assuming that "O" is the output bit (Cooler control) and "Y" is a don't-touch bit. + // Assignment + + // Heater control at bit 5 : YYYY YYYY YYYY YYYY YYYY YYYY YYOY YYYY , assuming that "O" is the output bit (Heater control) and "Y" is a don't-touch bit. + // Assignment + + // Humidity too high warning at bit 6 : YYYY YYYY YYYY YYYY YYYY YYYY YOYY YYYY , assuming that "O" is the output bit and "Y" is a don't-touch bit. + // Pay attention that writing 1 actually turns off the light, as defined in the lab manual. + // Make sure the light is off normally. Here we can not rely on the fact that previously we set outputRegister = 0 since the light is actually "on" when its control bit is "0". + // Instead we use the fact that we previously set outputRegister = 0 to light up the warning light (by writing nothing for the case that it is too humid) + if(isHumidity2High_n) + outputRegister |= (0x00000001 << 6); + + // Humidity too low warning at bit 7 : YYYY YYYY YYYY YYYY YYYY YYYY OYYY YYYY , assuming that "O" is the output bit and "Y" is a don't-touch bit. + // Pay attention that writing 1 actually turns off the light, as defined in the lab manual. + // Make sure the light is off normally. Here we can not rely on the fact that, previously, we set outputRegister = 0 since the light is actually "on" when its control bit is "0". + // Instead we use the fact that we previously set outputRegister = 0 to light up the warning light (by writing nothing for the case that humidity is too low) + if(isHumidity2Low_n) + outputRegister |= (0x00000001 << 7); + + writeOutput(outputRegister, sampleIndex); + + // write to the screen. Redirect it later on to the log file. + printf("inputs: Lock=%d, Fan=%d, AC=%d, Desired=%f, Measured=%f, Humidity=%d\n", (int)isLocked, fanSpeedSelector, (int)isAcOn, temperatureDesired, temperatureMeasured, humidityMeasured); + printf("outputs: Green=%d, Red=%d, Fan=%d, Cooler=%d, Heater=%d, Humidity2H_n=%d, Humidity2L_n=%d\n", (int)isGreenOn, (int)isRedOn, fanSpeed, (int)isCoolerOn, (int)isHeaterOn, (int)isHumidity2High_n, (int)isHumidity2Low_n); + + // This keeps the loop from going fast, allowing us to see the output for debugging purpose. Press "Enter" to proceed. + // int dummy = getchar(); //for debug + + // increment sample index used for simulation + sampleIndex++; + } + return 0; +} + + + diff --git a/chap2/outputLog.txt b/chap2/outputLog.txt new file mode 100644 index 0000000..1c3054a --- /dev/null +++ b/chap2/outputLog.txt @@ -0,0 +1,41 @@ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +0 : Output Register = 77 +1 : Output Register = 78 +2 : Output Register = 66 +3 : Output Register = 70 +4 : Output Register = 73 +5 : Output Register = 77 +6 : Output Register = 77 +7 : Output Register = 109 +8 : Output Register = 77 +9 : Output Register = 77 +10 : Output Register = 77 +11 : Output Register = 77 +12 : Output Register = 77 +13 : Output Register = 77 +14 : Output Register = 77 +15 : Output Register = 77 +16 : Output Register = 77 +17 : Output Register = 77 +18 : Output Register = 77 +19 : Output Register = 77 +20 : Output Register = 77 +21 : Output Register = 77 +22 : Output Register = 77 +23 : Output Register = 77 +24 : Output Register = 77 +25 : Output Register = 77 +26 : Output Register = 205 +27 : Output Register = 141 +28 : Output Register = 141 +29 : Output Register = 141 +30 : Output Register = 141 +31 : Output Register = 141 +32 : Output Register = 141 +33 : Output Register = 77 +34 : Output Register = 109 +35 : Output Register = 93 +36 : Output Register = 109 +37 : Output Register = 77 +38 : Output Register = 93 +39 : Output Register = 77 diff --git a/chap2/outputLog_Correct.txt b/chap2/outputLog_Correct.txt new file mode 100644 index 0000000..1c3054a --- /dev/null +++ b/chap2/outputLog_Correct.txt @@ -0,0 +1,41 @@ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +0 : Output Register = 77 +1 : Output Register = 78 +2 : Output Register = 66 +3 : Output Register = 70 +4 : Output Register = 73 +5 : Output Register = 77 +6 : Output Register = 77 +7 : Output Register = 109 +8 : Output Register = 77 +9 : Output Register = 77 +10 : Output Register = 77 +11 : Output Register = 77 +12 : Output Register = 77 +13 : Output Register = 77 +14 : Output Register = 77 +15 : Output Register = 77 +16 : Output Register = 77 +17 : Output Register = 77 +18 : Output Register = 77 +19 : Output Register = 77 +20 : Output Register = 77 +21 : Output Register = 77 +22 : Output Register = 77 +23 : Output Register = 77 +24 : Output Register = 77 +25 : Output Register = 77 +26 : Output Register = 205 +27 : Output Register = 141 +28 : Output Register = 141 +29 : Output Register = 141 +30 : Output Register = 141 +31 : Output Register = 141 +32 : Output Register = 141 +33 : Output Register = 77 +34 : Output Register = 109 +35 : Output Register = 93 +36 : Output Register = 109 +37 : Output Register = 77 +38 : Output Register = 93 +39 : Output Register = 77 diff --git a/chap3.1/Makefile b/chap3.1/Makefile new file mode 100644 index 0000000..a2dbd6f --- /dev/null +++ b/chap3.1/Makefile @@ -0,0 +1,16 @@ +OBJ = main.o +COURSE = /courses/TDDI11/sw +LDSCRIPT = $(COURSE)/lib/link.cmd +BOOTSECT = $(COURSE)/lib/bootload.bin +INCLUDES = -I "$(COURSE)/include" -I "$(COURSE)/include/djgpp" $(EXTRA_INCLUDES) +CC = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-gcc +CFLAGS += -Wall -g $(INCLUDES) +LD = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-ld +LDFLAGS = -T$(LDSCRIPT) -static -ustart -Map link.map + +embedded.bin: $(OBJ) + $(LD) $(OBJ) $(LIBS) $(LDFLAGS) +%.o: %.c + $(CC) $(CFLAGS) -c $< +clean: + \rm -f link.map embedded.bin *~ *.o diff --git a/chap3.1/chapter3_1.txt b/chap3.1/chapter3_1.txt new file mode 100644 index 0000000..9a03c4a --- /dev/null +++ b/chap3.1/chapter3_1.txt @@ -0,0 +1,51 @@ +1) +Because stopTime is set to milliseconds using system timer value +and this value is DWORD32 long. + +2) +Because finalCount is set to the current CPU count/cycles, +which is a large number and counts up very fast. + +3) +Now_Plus takes an int as argument (seconds) and returns the current +system time plus the amount of seconds in milliseconds. + +4) +CPU_Clock_Cycles return the current CPU clock cycle. The cycle count is +incremented each CPU clock cycle. + +5) +"x" represent how much the CPU cycle has increased since "initialCount" or +the number of instructions since "ininitialCount". +"xM" represent number of instruction divided by one million (MIPS, Millions of +instructions per seconds). + +6) +Milliseconds return how long the program has been executed in milliseconds. + +7) +7.1) Yes. +7.2) Yes. Section 3 is depened on section two which has been executed circa on + second. When section 3 starts it execution the program has lived circa + one second it will also run in circa + one second. + + Both Milliseconds and Now_Plus should run as fast in theory. + +7.3) Interrups within the host system when running the program in QEMU makes + the two section report different values. + +7.4) Section 2 is better because we are adding exactly one second and because of + that its more clear to use Now_Plus than to add 1000 milliseconds. + + When it comes to Now_Plus and Milliseconds, both gives the same + functionality so its depends. If we want to get the current time or offset + by an amount of milliseconds, Milliseconds is better, but if we want the + current time plus an offset into the future in seconds Now_Plus is better. + +8) +The first line print the how long the program has lived, while the second line +sleep circa 2 seconds and the print how long the program has lived. + +9) + diff --git a/chap3.1/embedded.bin b/chap3.1/embedded.bin new file mode 100644 index 0000000000000000000000000000000000000000..1e6a4149c4c3e3d77d9e294226385243f432ddfb GIT binary patch literal 8875 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 QSU<l2G!<5wQ=-5C0RG$X$p8QV literal 0 HcmV?d00001 diff --git a/chap3.1/floppy.img b/chap3.1/floppy.img new file mode 100644 index 0000000000000000000000000000000000000000..8be6b346760c035f8cdc5bb8f039e6f5dda71bf8 GIT binary patch literal 1474560 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 z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c1*0J_8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqhK@yMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU=)mo zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kW!5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S`WG8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiQ~MnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0q!DtAKhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinC>RZa(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c 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 literal 0 HcmV?d00001 diff --git a/chap3.1/link.map b/chap3.1/link.map new file mode 100644 index 0000000..21cc179 --- /dev/null +++ b/chap3.1/link.map @@ -0,0 +1,188 @@ +Archive member included to satisfy reference by file (symbol) + +/courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + (start) +/courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_IDT) +/courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_CRT) +/courses/TDDI11/sw/lib/elf/libepc.a(display.o) + main.o (SetCursorPosition) +/courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + main.o (Milliseconds) +/courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8259) +/courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8253) +/courses/TDDI11/sw/lib/elf/libepc.a(cycles.o) + main.o (CPU_Clock_Cycles) +/courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Check_CPU) +/courses/TDDI11/sw/lib/elf/libepc.a(io.o) + /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) (msec) +/courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + /courses/TDDI11/sw/lib/elf/libepc.a(io.o) (Enqueue) +/courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + main.o (__udivdi3) + +Discarded input sections + + .eh_frame 0x0000000000000000 0x48 main.o + .eh_frame 0x0000000000000000 0x84 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +Memory Configuration + +Name Origin Length Attributes +conventional 0x0000000000000000 0x00000000000a0000 +reserved 0x00000000000a0000 0x0000000000060000 +extended 0x0000000000100000 0x00000000fff00000 +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD main.o +LOAD /courses/TDDI11/sw/lib/elf/libepc.a +LOAD /courses/TDDI11/sw/lib/elf/djgpp/libc.a +LOAD /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a + +.text 0x0000000000000000 0x1bbf + 0x0000000000000000 text_frst = . + *(.start) + .start 0x0000000000000000 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000000 start + *(.init) + *(.text) + .text 0x0000000000000008 0x390 main.o + 0x0000000000000008 main + .text 0x0000000000000398 0x50 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000398 Init_CPU + .text 0x00000000000003e8 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + 0x00000000000007f8 IRQ2INT + 0x000000000000080c _GetISR + 0x0000000000000850 SetISR + 0x0000000000000888 Init_IDT + .text 0x0000000000000988 0x110 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + 0x0000000000000988 Init_CRT + 0x00000000000009bc _LastMemoryAddress + .text 0x0000000000000a98 0x6e0 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + 0x0000000000000a98 SetCursorVisible + 0x0000000000000b1c _GetCursorRow + 0x0000000000000b30 _GetCursorCol + 0x0000000000000b44 SetCursorPosition + 0x0000000000000be8 ClearScreen + 0x0000000000000c50 _PutAttb + 0x0000000000000c9c _PutCharAt + 0x0000000000000cc8 _PutChar + 0x0000000000000d4c PutString + 0x0000000000000d84 PutUnsigned + 0x0000000000000dbc FormatUnsigned + 0x0000000000000e4c Unsigned2Ascii + 0x0000000000000ed0 _Cell + .text 0x0000000000001178 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + 0x0000000000001200 Milliseconds + 0x000000000000121c Now_Plus + .text 0x0000000000001258 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + 0x0000000000001258 Init8259 + .text 0x0000000000001338 0xb0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + 0x0000000000001338 Init8253 + .text 0x00000000000013e8 0x70 /courses/TDDI11/sw/lib/elf/libepc.a(cycles.o) + 0x00000000000013e8 CPU_Clock_Cycles + .text 0x0000000000001458 0x98 /courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + 0x0000000000001458 Check_CPU + .text 0x00000000000014f0 0x60 /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x00000000000014f0 TimerTickISR + 0x00000000000014fc KeyboardISR + 0x000000000000151c ISR_PIC1 + 0x0000000000001523 ISR_PIC2 + 0x000000000000152c ___main + 0x000000000000152d inportb + 0x0000000000001537 outportb + 0x0000000000001549 _exit + .text 0x0000000000001550 0x570 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + 0x0000000000001550 ScanCodeRdy + 0x0000000000001574 GetScanCode + 0x00000000000015a4 ScanCode2Ascii + 0x0000000000001764 SetsKybdState + 0x0000000000001954 Enqueue + .text 0x0000000000001ac0 0xff /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + 0x0000000000001ac0 __udivdi3 + 0x0000000000001bbe text_last = (. - 0x1) + +.data 0x0000000000001bc0 0x6eb + 0x0000000000001bc0 data_frst = . + *(.data) + .data 0x0000000000001bc0 0x0 main.o + .data 0x0000000000001bc0 0x20 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000001bde code_selector + .data 0x0000000000001be0 0x90 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .data 0x0000000000001c70 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .data 0x0000000000001c80 0x30 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .data 0x0000000000001cb0 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + .data 0x0000000000001cc0 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .data 0x0000000000001cc0 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .data 0x0000000000001cc0 0x4 /courses/TDDI11/sw/lib/elf/libepc.a(cycles.o) + .data 0x0000000000001cc4 0xc /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x0000000000001cc4 msec + 0x0000000000001cc8 old_tick_isr + 0x0000000000001ccc old_kybd_isr + .data 0x0000000000001cd0 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .data 0x0000000000002270 0x0 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + *(.rodata) + .rodata 0x0000000000002270 0x3b main.o + *(.rodata.str1.1) + *(.rodata.str1.32) + 0x00000000000022aa data_last = (. - 0x1) + +.bss 0x00000000000022ac 0x83c + 0x00000000000022ac bss_frst = . + *(.bss) + .bss 0x00000000000022ac 0x0 main.o + .bss 0x00000000000022ac 0x800 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .bss 0x0000000000002aac 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .bss 0x0000000000002aac 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .bss 0x0000000000002ab4 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + .bss 0x0000000000002ab4 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .bss 0x0000000000002ab4 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .bss 0x0000000000002ab4 0x34 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .bss 0x0000000000002ae8 0x0 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + *(COMMON) + 0x0000000000002ae7 bss_last = (. - 0x1) + +/DISCARD/ + *(.eh_frame) + 0x0000000000002ae8 stack_frst = (bss_last + 0x1) + 0x000000000000aae7 stack_last = (bss_last + 0x8000) + 0x000000000000aae8 heap_frst = (stack_last + 0x1) +OUTPUT(embedded.bin binary) + +.debug_info 0x0000000000000000 0xb66 + .debug_info 0x0000000000000000 0x137 main.o + .debug_info 0x0000000000000137 0xa2f /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +.debug_abbrev 0x0000000000000000 0x2a2 + .debug_abbrev 0x0000000000000000 0x9d main.o + .debug_abbrev 0x000000000000009d 0x205 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +.debug_aranges 0x0000000000000000 0x40 + .debug_aranges + 0x0000000000000000 0x20 main.o + .debug_aranges + 0x0000000000000020 0x20 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +.debug_line 0x0000000000000000 0x211 + .debug_line 0x0000000000000000 0xda main.o + .debug_line 0x00000000000000da 0x137 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +.debug_str 0x0000000000000000 0xb8b + .debug_str 0x0000000000000000 0xfb main.o + .debug_str 0x00000000000000fb 0xa90 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +.comment 0x0000000000000000 0x24 + .comment 0x0000000000000000 0x12 main.o + .comment 0x0000000000000012 0x12 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +.debug_loc 0x0000000000000000 0x691 + .debug_loc 0x0000000000000000 0x691 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) + +.debug_ranges 0x0000000000000000 0x28 + .debug_ranges 0x0000000000000000 0x28 /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a(_udivdi3.o) diff --git a/chap3.1/main.c b/chap3.1/main.c new file mode 100644 index 0000000..7bb1166 --- /dev/null +++ b/chap3.1/main.c @@ -0,0 +1,89 @@ +#include <libepc.h> + +int main(int argc, char *argv[]) +{ + //+++++ Section 1. Initialization +++++ + + ClearScreen(0x07); + SetCursorPosition(1, 1); + DWORD32 stopTime = 0; + QWORD64 initialCount = 0; + QWORD64 finalCount = 0; + QWORD64 x = 0; + DWORD32 xM = 0; + + //+++++ Section 2. +++++ + + stopTime = Now_Plus(1); + initialCount = CPU_Clock_Cycles(); + + while( Now_Plus(0) < stopTime ){} + + finalCount = CPU_Clock_Cycles(); + x = finalCount - initialCount; + xM = (DWORD32)(x / 1000000); + + PutString("x = "); + PutUnsigned(xM, 10, 8); + PutString(" x 10^6 \n"); + + //+++++ Section 3. +++++ + + stopTime = Milliseconds() + 1000; + initialCount = CPU_Clock_Cycles(); + + while( Milliseconds() < stopTime ){} + + finalCount = CPU_Clock_Cycles(); + x = finalCount - initialCount; + xM= (DWORD32)(x / 1000000); + + SetCursorPosition(2, 1); + PutString("x = "); + PutUnsigned(xM, 10, 8); + PutString(" x 10^6 \n"); + + //+++++ Section 4. +++++ + + stopTime = Milliseconds(); + SetCursorPosition(3, 1); + PutUnsigned(stopTime, 10, 8); + PutString("\n"); + stopTime = Milliseconds() + 2345; + while( Milliseconds() < stopTime ){} + SetCursorPosition(4, 1); + stopTime = Milliseconds(); + PutUnsigned(stopTime, 10, 8); + PutString("\n"); + + //+++++ OUR OWN TEST +++++ + stopTime = Now_Plus(0); + DWORD32 result = 1; + + for(DWORD32 i = 0; i < 100000000; ++i) { + result *= 3; + } + + SetCursorPosition(5, 1); + PutString("Time taken for operations: "); + PutUnsigned(((Now_Plus(0) - stopTime) / 100), 10, 8); + PutString("ns/op Result "); + PutUnsigned(result, 10, 8); + PutString("\n"); + + stopTime = Now_Plus(0); + result = 1; + + for(DWORD32 i = 0; i < 100000000; ++i) { + result += 3; + } + + SetCursorPosition(6, 1); + PutString("Time taken for operations: "); + PutUnsigned(((Now_Plus(0) - stopTime) / 100), 10, 8); + PutString("ns/op Result "); + PutUnsigned(result, 10, 8); + PutString("\n"); + + return 0; +} diff --git a/chap3.1/main.o b/chap3.1/main.o new file mode 100644 index 0000000000000000000000000000000000000000..ed639f510e0d7bcd1b95dac195379d32b7885c49 GIT binary patch literal 4196 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 L@;^upgkkCc^&ED( literal 0 HcmV?d00001 diff --git a/chap3.1/makeNrun.sh b/chap3.1/makeNrun.sh new file mode 100644 index 0000000..cdc1361 --- /dev/null +++ b/chap3.1/makeNrun.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +clear +echo "This script includes commands to make the project and run it" + +echo "clean up the directory with make clean" +make clean +echo "make the project with make." +make +echo "Guiding mtools mcopy to its configuration file" +export MTOOLSRC=mtools.conf +echo "Copying the binary to floppy image" +mcopy embedded.bin a: +echo "Starting Qemu with given binary in the floppy image" +qemu-system-i386 -drive format=raw,file=floppy.img,if=floppy + diff --git a/chap3.1/mtools.conf b/chap3.1/mtools.conf new file mode 100644 index 0000000..c387b85 --- /dev/null +++ b/chap3.1/mtools.conf @@ -0,0 +1,6 @@ +MTOOLS_NO_VFAT=1 +drive a: + file="floppy.img" + fat_bits=12 + cylinders=80 heads=2 sectors=18 + mformat_only diff --git a/chap3.2/a.out b/chap3.2/a.out new file mode 100644 index 0000000000000000000000000000000000000000..095543f12b34a1e344438c028ebd731d2fd90c0f GIT binary patch literal 12904 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 literal 0 HcmV?d00001 diff --git a/chap3.2/main.c b/chap3.2/main.c new file mode 100644 index 0000000..0dc63f4 --- /dev/null +++ b/chap3.2/main.c @@ -0,0 +1,71 @@ +#include <stdio.h> +#include <stdbool.h> +#include <math.h> +#include <X11/Xlib.h> + +// compile and run +// gcc main.c -lm -lX11 +// ./a.out +// To exit: +// ctrl+c + + +int main(int argc, char **argv) +{ + //+++++ section 1. Initialization +++++ + + bool blinkOn = false; + int horizontalPosition, verticalPosition; + int horizontalMotion, verticalMotion; + double combinedMotion = 0; + double motionMetric = 0; + static double motionThreshold = 350; + static double alpha = 0.80; + double beta = 1 - alpha; + struct timeval timeReadOut; + long double timerValueSeconds = 0; + static long double blinkHalfCycleSeconds = 2; + long double nextActionTime = 0; + + // initialize environment for listening to Mouse + Display *display; + XEvent xevent; + Window window; + if( (display = XOpenDisplay(NULL)) == NULL ) + return -1; + window = DefaultRootWindow(display); + XAllowEvents(display, AsyncBoth, CurrentTime); + XGrabPointer(display, window, 1, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); + + // initialize for time-based actions + gettimeofday(&timeReadOut, NULL); + timerValueSeconds = (long double)timeReadOut.tv_sec + (long double)timeReadOut.tv_usec/1000000.0; + printf("Current timer value is %Lf seconds\n", timerValueSeconds); + nextActionTime = timerValueSeconds + blinkHalfCycleSeconds; + + while(true) + { + //+++++ section 2. Update motion metric ++++++++++++++++++ + + if(XCheckMaskEvent(display, PointerMotionMask, &xevent)) + { + // calculate motion + horizontalMotion = xevent.xmotion.x_root - horizontalPosition; + verticalMotion = xevent.xmotion.y_root - verticalPosition; + // update position + horizontalPosition = xevent.xmotion.x_root; + verticalPosition = xevent.xmotion.y_root; + //printf("X = %d , Y = %d \n", horizontalPosition, verticalPosition); //for debug + //printf("dX = %d , dY = %d \n", horizontalMotion, verticalMotion); //for debug + combinedMotion = sqrt(pow((double)horizontalMotion,2.0) + pow((double)verticalMotion,2.0)); + printf("dXY = %f \n", combinedMotion); //for debug + motionMetric = alpha * combinedMotion + beta * motionMetric ; + printf("motionMetric = %f\n", motionMetric); //for debug + if (motionMetric > motionThreshold) + printf("\nLarge motion detected. Motion Metric = %f\n", motionMetric); + } + + + } + return 0; +} diff --git a/chap3.2/main.c~ b/chap3.2/main.c~ new file mode 100644 index 0000000..17a8552 --- /dev/null +++ b/chap3.2/main.c~ @@ -0,0 +1,71 @@ +#include <stdio.h> +#include <stdbool.h> +#include <math.h> +#include <X11/Xlib.h> + +// compile and run +// gcc main.c -lm -lX11 +// ./a.out +// To exit: +// ctrl+c + + +int main(int argc, char **argv) +{ + //+++++ section 1. Initialization +++++ + + bool blinkOn = false; + int horizontalPosition, verticalPosition; + int horizontalMotion, verticalMotion; + double combinedMotion = 0; + double motionMetric = 0; + static double motionThreshold = 90; + static double alpha = 0.99; + double beta = 1 - alpha; + struct timeval timeReadOut; + long double timerValueSeconds = 0; + static long double blinkHalfCycleSeconds = 2; + long double nextActionTime = 0; + + // initialize environment for listening to Mouse + Display *display; + XEvent xevent; + Window window; + if( (display = XOpenDisplay(NULL)) == NULL ) + return -1; + window = DefaultRootWindow(display); + XAllowEvents(display, AsyncBoth, CurrentTime); + XGrabPointer(display, window, 1, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); + + // initialize for time-based actions + gettimeofday(&timeReadOut, NULL); + timerValueSeconds = (long double)timeReadOut.tv_sec + (long double)timeReadOut.tv_usec/1000000.0; + printf("Current timer value is %Lf seconds\n", timerValueSeconds); + nextActionTime = timerValueSeconds + blinkHalfCycleSeconds; + + while(true) + { + //+++++ section 2. Update motion metric ++++++++++++++++++ + + if(XCheckMaskEvent(display, PointerMotionMask, &xevent)) + { + // calculate motion + horizontalMotion = xevent.xmotion.x_root - horizontalPosition; + verticalMotion = xevent.xmotion.y_root - verticalPosition; + // update position + horizontalPosition = xevent.xmotion.x_root; + verticalPosition = xevent.xmotion.y_root; + //printf("X = %d , Y = %d \n", horizontalPosition, verticalPosition); //for debug + //printf("dX = %d , dY = %d \n", horizontalMotion, verticalMotion); //for debug + combinedMotion = sqrt(pow((double)horizontalMotion,2.0) + pow((double)verticalMotion,2.0)); + //printf("dXY = %f \n", combinedMotion); //for debug + motionMetric = alpha * combinedMotion + beta * motionMetric ; + //printf("motionMetric = %f\n", motionMetric); //for debug + if (motionMetric > motionThreshold) + printf("\nLarge motion detected. Motion Metric = %f\n", motionMetric); + } + + + } + return 0; +} diff --git a/chap3.2/questions3_2.txt b/chap3.2/questions3_2.txt new file mode 100644 index 0000000..eea70f8 --- /dev/null +++ b/chap3.2/questions3_2.txt @@ -0,0 +1,31 @@ +1) +Yes, the motionMetric is dependent on the Euclidean distance formula for planes. + +The distance is the same no matter the direction/angle. X and Y movement weigh up to eachother +so "combinedMotion" will be the same. But "motionMetric" is dependent on its previous value, thus +if we have the same combinedMotion as the previuos motionMetric the new motionMetic will have +the same value. This is because aplha and beta. Example: motionMetric = combinedMotion = 10, alpa = 0.2 and beta 0.8. newMetric = 0.2 * 10 + 0.8 * 10 = 2 + 8 = 10. + +2) +Instead of Euclidean metric we could use Manhattan distance(d = |x1 - x2| + |y1 -y2|). To calculate the distance between two point we take the absolute distance +between x-axis movement and y-axis movment and add then together. + +3) +An advantage to Euclidean metric is that it will give the shortest distance +between two points which is good when there is no grids ("city block") that +restrict the movment between the two points. + +Disadvantage with Euclidean metric is that it requires a square root operation, which can be +expensive. + +4) +The higher alpha value make the motionMetric decrease faster to a "convergent" +value which lead to how the mouse movement will be have. High alpha(0.99) will +lead to fast move movment but sporadic movement beacuse motionMetric don't +converge to same values. + +Low alpha lead to slower motionMetric, thus make the mouse movement +slower. + +We would pick an alpha between 0.5 and 0.8 so we can see where the mouse is +moving to. diff --git a/chap3.2/questions3_2.txt~ b/chap3.2/questions3_2.txt~ new file mode 100644 index 0000000..e69de29 diff --git a/chap4/Makefile b/chap4/Makefile new file mode 100644 index 0000000..a34d040 --- /dev/null +++ b/chap4/Makefile @@ -0,0 +1,27 @@ +OBJ = main.o +#OBJ = main.o llmultiply.o +CFLAGS = -O0 +#CFLAGS = -O3 + +COURSE = /courses/TDDI11/sw +LDSCRIPT = $(COURSE)/lib/link.cmd +BOOTSECT = $(COURSE)/lib/bootload.bin +INCLUDES = -I "$(COURSE)/include" -I "$(COURSE)/include/djgpp" $(EXTRA_INCLUDES) +CC = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-gcc +CFLAGS += -Wall -g $(INCLUDES) +LD = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-ld +LDFLAGS = -T$(LDSCRIPT) -static -ustart -Map link.map +AS = nasm +ASFLAGS = -f elf32 + +embedded.bin: $(OBJ) + $(LD) $(OBJ) $(LIBS) $(LDFLAGS) + +%.o: %.c + $(CC) $(CFLAGS) -c $< + +%.o: %.asm + $(AS) $(ASFLAGS) $< + +clean: + \rm -f embedded.bin *~ *.o link.map diff --git a/chap4/embedded.bin b/chap4/embedded.bin new file mode 100644 index 0000000000000000000000000000000000000000..61b4be02a7dcde51d3194687a40719a234ea2e8f GIT binary patch literal 8731 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 literal 0 HcmV?d00001 diff --git a/chap4/floppy.img b/chap4/floppy.img new file mode 100644 index 0000000000000000000000000000000000000000..b5cae39f638f6ebc2a8e6be3234d630e3000eff4 GIT binary patch literal 1474560 zcmaDE#^CDf<m%$$>cYUp$jHF-fWd+L11EzJ0}}%RXwLJ!F5u^{;OFS;s-U2t;N}=& zXr!Q^z|6qFB+Q`5z{jA#z`^i=A7+%3r{C{Ch6nmC>|tQxlYha$5ZCxFo#CvIc8eFo z!3S)82Mqu3WMKNdgl$I)L%`{t6MZ-O4s_c&F?8#>G4#qYFul0Q@FI#KyxWeCp<7Q3 zBD9Yoes=>y-{BX93@`c^I)A8s_;1bT!%+I3ZD$I@S&m14Uff{#6}zK>!SHssm<L0* zngc`U!@e7RhYi0O{{Os$@dD#z%NIp&UV(hottZG}c)MXg0~14u?6-DqCW%u1UNb+2 z-u(<rJGmJ?FDv0_JgmUrTYBe9_kJm+!{Pkf^mrM1UH^T5%FO1%(0SbO_6t3Ro&(Hm z9t?d4;tzNJ_^xKhaPh^Q&f^i?dl{G-?d%v>7)rP=z9?os_@1Tl`G5Yy`<NLze|$5O zU@*LN;l+h(|BkdB={&fDk?E{(F}GhS;}^pNXN6zh`M-~ufmx25!QHp?;$g#+Pf}Je zJ@|F_#h3r3;u|hLOL_77e<|OF`_B?yJo;bCYIyR|zr$ZZ9wHNmuKMu*KeGb^YXSp% z0|Vy*2JQn4ybl=o85ji>7?m9uMH3js8yF=QFiIa_lzqS`&%mUp!1VwBe=@Bb)ixRe zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Awc&K7#;tidytP>I2r<@ zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Ul0;0i+dM3K9(NaZ>}P1~7nW zCI)FG1_mcX1_p-zV8GAt7)(P6h%jR+LoP!SLn=cG13$y#6fi@NA&DWAfq@~9K^MBX ztj^HM(@%kcp)wX?K8O}(m@Q9NuZ~(a8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Un*U1b(Hx6cu4$U<mDe8r=Bi z2m=E{w<||ytHb~Q|GQmzI$K@941vy83ot{Zv(*O7kmz*%(hXMD@Z^7|>x*u%%H{_Q zovv>n;@wk0dOI%|Ug|v9dAZZ~L1*lfZm=<69XGncCV_R_frxic1(}V|aiKHzO1JA1 z{`IaGIuCWbUg2Nw`k<GGsoV9!_tXcB7duaNx}N9^Jp&;j3U7cE-hnH;0atjSGxSKO zD~RlNeS>V`3z&&7ASUkU4BgY|3L+s2;U+>9-uRvhRk)!ubW5izi0pPf(H(jQ;qDck zv1__rPk_C-pxgBf*pExPT@Q4J9zm#@(HT3Z+w}lg)r4->BVbiix?Oj4hweeB>gbH^ z>2}=#R@Kn$x(BSPrQ3Bwcjy+ls@{tK|NnQ+tpUf(29Vm;0x)|ENO@}si0wO}J9bL9 zYeRQv3*$k-%iXOYJ>645dKga#-s)`40GTm02c#Cv?gq0FcBH^%I$IM!Y~Kalu}ivL zXLN_o0h{RB(H+_YX0?LU?gHf<h|v*XqhmmtT0!jYsUSAO=n%L}XKMh6Jr&~oFP#G2 zu3vfsSh~SBb~1r^9Nl0=olM=nE4p33G#}vUo(eL7@l>b4gvKMFG#nj!IJEO=^BW0J zVs`xkR>jiI(ENraiz7=Q;Ke*{28QM%Aj6RaJ0XG-P9E;{QDJF*^5K8spU}>yVZnjT zZ*-d9@MN*SIK>Ip*ZhVfiy@2Qg*b$J-1P~_uP^Nx85o-1@MQc^WMFu~3^A?S^~u2p ztgH*9z)}G(Qvd(|-+V*>q>M$0f#Jm+F0hHn$_{Wezu^gZVU1A90aCdMq7tN&8^m7( z;X`yb9}qy;!3fcbCIdD0$v?OQz{W-+8^gLnih-e<qdS5Hq8V&vcK|r(czR2(garo% z1-!WM8)Sq6$R)xcmq<X2Xnw=f>w2a607t-!dblOMu2%wH6u`L|U^|~f!VP2qn13C@ z|L^*wx%LSwf8X|h|Nrj*1!-^Um&oY2*xtlHhtnoZFg(zABQ2euQ8YoCfq`G)01qR- z(t)&BCs`O6I2bkv7(4+TBh&Yw??vB*Ue$<I3=A)Ju`)2cSjx-5@S=f_f#Jn!76yhF z^8fz-fBF0W|NmdC6^bj1OHy+cG7@u2Qd9I8ddooNVDlS}U(H9pbh~l{ys(A1tog{7 zj6WdFx)6TvHjwLH|Lc4cd)OtjEHfolA+@L|zldQ1IN5Q4)H{LfUJHo|u)5Tw(sTvS zypq(SqSAsAhR$yYwOJswjR>`V`FXm&iN)E8Nja%VTHx*jnLiDr#}}c;sVFruyC6R^ zuLMa4l6y{p)XO5&`<JB_rRC(8BfI$*NX<`3Y=PYD<R9wiq7amrm!7KNT9KTZnv$A= ztX__df#JnTgnG}svc#Os6b1i+<ouLWM0kSS>jzRh7opZKU%@xABtyYDKcFZ-IkmVr zzX&BvszB;<5$av?OF^OGmROoog6xJ>Aa$+?b?AmFfIM1Mnuo0C5=f6ALJ!Q{A;G~Y zZeU|)V0iKJFDSVSfWjj<H9a>quSCHwzeFLRD782>4>cb3K<alQsV_-P&Q^fwf;b&H z-s3>(I}z&LQ}a@b5_1#+it<ZRlS?x5^H9UE52QX4p*|onJyii>EK1tg2U2H<P=^sF zuHe*)qURY%&)+|AzdGh*rssiu>zt9AoQ)DLQXC8nFD@d~`X(l4WagzRKvW{qwHrv? zN`$&#PhS^>w4D6JlFYnxT}Wb0tw>HS0DBdoFAt=z5TOs0YjPBVQj1fI%2HFXr|)GT zJ+=rvp?QhL#hK}OxYXYQspmzg2ggfyC`aR=4-5<poflp+fMOi%CU7-!sF&p`DA(_j zQDR`|<q_!g{nPFG$M8~GcK}=Gg@X?Sx<mgMo=ofJ>J?$^4E@m^`h!?Ax<h%=KsDW; zwC+&8w9WuFkj1dLkvQ)92V~=M*B>C;8*6`nPG2fxeR&StR{N9IEm|kdz>wA%z|`&f z=a>Tv1DIm%Yp(slP$S=5`$N87vfK4X=b>JfsUQ<}HApisbh8L_x_)_`*?i<n7Q+i> zXsK|(+Vw}hEJ%#~#d~P(IAH1eqn`7)>z4;23=FR=K$09UF2N+>8u(xAgNea3JO^oD zKkoYF0|%&8`KLSd3*4LEK;HcC`lH$P564T5|NsB@mZ&lCGs-f^Fo1)70*DU@`w7qh z==|1L`zKtBfuW53wJ2B~<WUBO|E_;tKLzta!3NROY%3tcz`#)Id))O80|P??q`Ypf z{lieo^xC4^^$#a2NI~<FFAG6*zzb6ba5da{p!Gm0Pq*uz<`4fB!AcJ1{$YH545GhV z6r{NG!fQ4NA7Ni(Eyw@=oD5~WU<N-!Ig8<e*Y1tA9O0`N7|PjqFfuSOyfz0nM*eiV z{^)l7ag1SAx9gt<i&Z6@h6i5DfZY!k4h0K`@=rNnc&XzMED3?-A%1(|$;!Ym=U4NQ zA6Z<62htYGXfZGZywHbKOwC8WfW#EQVuBE{jsqR8|C?($7)sb0Qvct7&C=leUja=! zD2hPMk|RG14|KWy4?q}ljRPDqb3vYkq{(hk6;LceGYCvf14FF&jl_$&ETE|8SPat9 z?aH$lq^diV1C(Ew7%y}lI{1jC+m(m$LRzQmKZu|BK~_Wj6b-Su8RDpaNRD!Z%VhB( z)N8{<)4E;%r5$|10Sdw(kOD}6a6uFx`32HM>~Q@L_BO~p9Gw?<6w*3f|A0aW)X3Y% z1P*}C1D&ovj=O?STkGAT2Fgi|wO`J&GceS#zZM6_Pq*uj?$AGJodV6SKbZczetCTl z6lmab1#VCCksk{|fe^3|6eIyJ5}>BL{^<Pn-<PMkmgj#dB7OgG=nDPc0XFaT!wDeM zAZei6l>-!~M}Bm>3Iue!@&vq)fSPjvtO2AF)!v5M|GcGqFI1Tr7+$AC-QQ6ApR1JX zMIcBlxVMY}-EBue?b#y&oe(pdZ9(q#tK)g`fRTaWg)~T)Z1a&H|5-ueD4zO{sCmHd z<(L2sAC3kKhEk5#vXJ}(X=L&56A1e6%JISvQV6}i335E7-Qoc%Z46+3>~`e{=yg34 z@InHdSrwX(d;xQ3LNtQ3A^a?X7CtG=h*<1){bB7YQp5CG;6ErYa)5*EzbnV<XU#|c zAlvrB4s4SEDDF8rzjeEce7|Ao`lE*JwFszuLeu@A+m+)O0|PjDzh>?&0~cgq|BD1S z*9tJ!vmbXA0G+DXTq__@2jU2Ti*O!mSAimBnAN^KohJ-0eJ=&YD@VYKJy6db=yc_P zlpo!(Je@bdDmpLj){$Xg=n|3acKy>K@E@!K?gGXM-LWq~fdUCjju(QAP{$p70Ly!w z7nogndU+T+Pce%sAZ1`^IC6mV05qj)A*xDfo_FQx4(0goE6`jk@V}JlHAfdm2bY7> z>$f0F!Ty$LwgshfiF#Fd()!N|5`h|d9o&%+cwGid4}TUq$S^PjfUV79eBli9JXD0? zg&|zzMHPezQ7iF69Kr=f)gNeG*<Aa>zmDm(M7JxbmUNK;)sh0uu78;RyZ(6nsPh}L zJ3+o@C}DkR#t181`7^FCGcdfk21z)e7VK3Je-DHYDO8XA$bu?c4-p2rCNu-Aa4tdw zs-_zz@&%%z5W)u;^$(;GstlS`n~(g+SjE7=08#4?QH!L^7A68UO&P)mnf4b+nHWSE zT8RD+fEdRB5uMvm`!BRqy`lE+s#3+{tl&Us;AS|^3Mzm>-apO?Dmg*^c`ZKys(=Be zU<)$?14O}AW=ORSO*bOJ$6fz`>b!1O4r^DQVz$>3p#0Ju%K=HbJe>zSeK|lC_q}e{ zKd%{}2^E}XI3U%4V3xv*Xh@j`@{C}{0tN<#7oKntP|3jX!s{EPxeBf;gR&G~XrL(I zc%g}+AY&oO5Ei(aES4<A7hfTz9LN?Xh=Rum5ymXV7gvzD5Cw<eA{oCK7#Ok?Uu-~# zfSP9zWwRlIkm{yH4cfN^`!563fy{D#Q2|i`itCjilN?^8!9}uIvK(H7!?`dmu5gho zp)AK2pacu4xw9Cu9ABuzWnt<?5h7qKoL(@)MY343oL+#cwB{oM5NCqi#n8J)9aO)8 z&t<)^XNw2}!=E`34QC1h=FW*|_)_rgNI@w-hz(+}rM*n~@c)0>?syRf27?1zHuN3% zf7#%`mK`Aai{byYofp^{7}9nqurn}xUY)kDO@x6VZT}{A28J!{Yd8*+Ft2|7<8V-F zVQFSjYOzA1g0Y2}LVl4#Qff&_YLS9-K&T?fDJb|qYk&*`!++Hf83u;m2~Sc~7)u17 zB=B!L5b(m4g@K{*2nz!PL*jqc2vAwFLE)J~#Q6Xa^=v`J`NL`5Au23y__rN^u)17S zINt4i!OXz$=-=UA;Bf(HJiWNc!objMn*wS`@=pb)u+9sp<+=p83i==L!VaVqR8zJd zC}9UTC0;Wb9_T#qngx{Z5#<b|-fpP<|Dc4cq4xj75|-DTo!<-(yqw9%z|iITU!|et zK#3UGfX;&lA95I8O6xq;dEsRhBLhQ2?f-}}cEbZNb3xH(YoNuzz)+$BQF{o~pkmpX zC&R!1>X3+VbY6Jr#>l_`Emv(#z>4Ki6z3o-mV{W~R+idq>i||9)oiN+Vw4It+iHLr z9Iw?N=Ajr<hHT6wP|xWbihKdG{3fvc>$qlH3y_f|p)gB$V3shyR-AyMzXVDD>r!w# z0!6+ESw0jj4>Ob-W+>BZ85BKP$a>K1%RrW61)GN+e_*qke+2QjtN=yDkD&V8<{uXP zEh1o^MZJFW4=w(dXP~yj53PE^<{z^BEfS0j3@;~xqNI$W`G*;Q3n(wXY+__!==|3F z!<E0q9jw{4Ua0wp6@LpSNO=lKd5IcB^A9)v7G97@5Lmq}Xl#tXWh(;%1DIK_XA7z* z_*<GmA|PhHfbCoc1_u6?jSLJ7FJ%}R7;HfqyTt9K0Em5zfq|i3+V&_&N$(?&CeUCl zf6H=^>USVMC?fe=?t=LD7(k^wC<%Z{^p}_6Tu`2T2^wuZ&I(E?U|EoxCP4UL>7@(| z3=@vCf)XoO9@GPc^1<@05P4Ag1j)ay0OgnCtROx}{&fb34^1twE|DlG?Y#DDwzUDJ zA-E`r_u2xY9-M^XG9cb-xn^4x6!jq9YYvcl!vn8*AYC-<@jd4kq!<w9pAIPoLVtid z*QEwKT(lS%x<z9^jWFN;9Xw3`SwZY(TM#Ky%5@yf1$pE@E2tcq3(^L2)`i#X&~`W? zeZg#EfGG<71MajMb-Qxx0$awL0J2O(utVTKD~Q=_3nIaGff!)Bc%gRvfg6L;S8IO5 z(QNwzRIHY;zAgo~`@evyQ^ps+-$AR>fEO(9q0GggQWR7_9S{Mvpuc1>zPN%=rU+5i zeB=kn1jQHgeu1@h9OyXI@aV7MfsP9SS&A<vK}3(Uf@}rFGswriWw3e%<Y-*j*jPzP zP>_M4ygV%}G?aniX5t1`klL+{EH$V2_D3)XtXg&FUziEwe`6&<hFx#NdnCSVO`K)G zATZ0}Zjr*XGiUDJefRGF|BjBCGgqzJz5CAHqm$I;?cSZB)5~I5+J6YTnGH_;gR(%b z1la@Pg4i&c86?QSzyK2a0}=#dh%QEk|NsB}|NEbb;opCdJctx$NRx(Y0dJ&ZU|^Va zo&kJ<_N4O+91H=h3=B1_3=AM&Jz!;EU}0lmFkxe0NMK`Nn83!su!D_(;SC!Dg9tkV zg9|$YLkT+r!xDA|hBNF83<o$EKqKD_IvflPAsh@0Jsc1*kT|jUKRak}3E@I~ECWL$ zV-r&|a|=sHCubK|H?UfM1_n^o4rY@;NHd~BLncK~*Qmmf2?Q0HjhG#n8JHO=jhG?O zm_->>t5+GbfLO{bCafx;bWm-=3Sz0SnzE^~F)%RHn6iObs%&QLaqM#J47FzLAXXf^ zIfoi3wCc<`KrA&53r;OgP$_7^31Vq+T5@S{fkuifxj-xpE(2~&ZUzR1MgwjTOOsod zC!U9afuTv42gHi!vE|j~1r_kNydah~F9#n7Up*fK1BeD;PJRY{P;hYagIWBA0)Ya8 z0t^BmI#8fcpj<FqKwN-9uv{QqAY7naAXUg!h*gL|2t>OIr3w`Z2MG%aGYA(61qlTS z6$zDygoucUFo=NY5Rnp*O3_GBNl^w-5DmhmVxeN9Vhmy+8iX^&J;gc28N@*}2<J=q zOYloDNPuV%E|3h66p&<)1koTIEmbWgEychPEd^p#OT|jpO3O+!FvLoOShdo;GQ2We zG7Jn5noEX378NGSIm$80G01^v5H6MvmKT<1kO$EqoTA{Oz@osQ0HQ%SP0>w}O_4zn zM1yd;lDiVS5`z+m2H^~44`mKz24xTp!dWU_DqJcIDj*t!vsJxSxm6idK{N>GsQIYz zs4=L4Xb`qmw*t3et<^y+D|K}ZB@Iw~sB3^&N*W28b($c4f+mPnr^%p&3S+cuv}Lpz z7-F<RtQzeqohThC9R?i`4Z;<=5xNq(47wm1gp>80^_cY-^guKSm+6P;i|I4ygJ=*= zGH^0rGGH(O(IA{>=x4}h$Y2PfK{(gQ*NE4M!3acyu#T~fG01&7#vqoBv7U*Y35c&} z0%F;j=$qPu#w;21O+hSsQwB3ssAbN;AYjhGpk)qXF)%P#ph5*p5M*Egks!=qg$At| zLKxy0G8n8GK&%i38-`GZc!o>{8!#)B!ImM6A%P)_!4}L4W3XcgXGmnoX0QXZ!Wrxt zA{dewav1EvtOy1NhDe5FhFk^*Fe{S5ks*p9g&~i@5zLBWaAJsNNM*=pa00WU8Jrnn z7}6LD7@WbZ7zP)HScY_lLIxKwE0)0(4Z1O)LU(g_hH?f5b9V+1%bmf)!UGh379L=h z2ZN`jCqoMZgQX{!<*DnX>jjbr(ICv=ZQ{*P%)nsc4Q6>W_?Y^D<V}6REFT76Ghc=h z1_m=<Fw0llPumY9528Vs!QarIp_GBa&>zh5X9zF~0LdE#fLQ?yfyRLhWeg0)fnZi3 zLy$obNZud_%nD)%)(Zyl^@71HFdM`t8izwwhBH7|5m0^v1B}HGl3HByEA8b}LCE?K z$QUJPT?c4V9X#g?oi2Y5o6G)!G+llRB8YFgTpBhp44E#^fQ&~UN1HCMk!N6d5dtv{ zI_<0=fjM2?0#c@nsSG-=jWk`}0a6K_e+SJmcZ2w!A#Q<K0Gcj`+kr7%4wiu$i!@yh zHg*lNF{~OAsMF;jofy;Qm7sd!hyutZlR+-Ygcw28bUD~g3%G_1FdtM?H6IZmFkPND z0R%zodcwM6K{Ht2Qw2JiJ1=&-a(qt}VLZ`%iJ|ith|BXmRe<pWi0jP4cyUg*D-T@W znPV<UJeVggI`%MP{{4Xj^87n!PzH1U{l;<}^Y7>Wk~jZe!^FVwf`s|^Lm>4;&cD9` zsU>m#9W=1^f`s{ZFVN_rEOeCeP3&RNv^4tsdlg6x3G?ssK<bH{e?JFOOTzs7FOYg7 z=HInI>mo>;e-8rbA!7c$4Wy2Q`S*1o^(4%{-vg;9Vg8*Dv_67}`FA^zIuhsK(?EKN zoPVDMQcJ}A`!SF@GUngkf%K6$|E>mFQ$fP~dlX1LIrHyx<SCzjM=^uo{5wcBbWQ== z{QEx%(98nS^Y09jWX-=P2$4Ado(|Fgntv}~15LvIA!h!)K@u{MKLIo@0v?Z-0L{OH z0suV!eqEi&`S%Hu1m@pC3PAJkAR5Q~J4gz3{v9Mj()|1N<uspvpQDaB|Goe$M%4T} zL_4<mcZea_=HHiqVhLqTr(1Ldh8XhvJ4gp;{vD(WJVA+=1H?A}4sjH=`FDt;(C6PF z>ha9KL$nQ&`FBtt1S|vv$>5uRM|K<f{5wbv+x$C7d?AQ{d1`e29d(|DcJuFRB&jz4 zz5po$L+4SU^Y4(9O5XfCNH28$9h^e`vw}pRi66`S`vFN>&A%U!1l5wb=HEfSAMx|= z;6MP+zk>=?$oxB~<b=<^gB5`1-$4o>^Y0)9qx0{e*|Q@8pm~a6H~(%TMAZEIeL<q; z-`RwyF#mo*5;XsQMH2t~`wdW80-AWIWd8jLs3AEB=ifJghL_Ri-``2%n19~_R*X9T z{svhw^8EV&u;Qp@+ch8tX#RZ#n1Ox%{Ts3|plMssdV((3|DDh^0Uwa%5%cdmKt_V* z-yxRpG}}Tf!I*#lf}|hY{QD<ldD#3r#87USq3HAPuaNbi&A-1umcu?DI}+#LL9qjx zQ-sdHgSempUFiHfD7?Y4(D`=|A1n=>e+MO2usn4B9mEIAL+9T?=@TRmn|}xKLGrNq zcW`Qf%}I-bc%b=r@G2p=D2NA}e+MUFxD1E~ntxvcN^@{g5RdrzcTh2aIsbk{9W?)b z2h<3I&cB1$&9)#CJSPrffIRY_6=VQW^Y0*q@QHKe`FF5oybnN@LFV5<%w}5<3APKw z0Nce2GGZ=h;vVK%l)f5x{=EWp_9;>G@1Rl?RIfP*Q9l0;vK181BWeEq8ECmMC|<D6 zzh7WtVEDttz+k}4z>vVqz|g|XzyNAjJz!>F5MW_ouwY?e$YEh%n8L!q09se}g@u6u zH1q7k%D~{j#=y|P%D}LOm4V?3D+2=$8$=8wPAvY<4jNm5I*$M~I{!X8|2{hZ9tEC* z2hF*U&cBb&zYq2KcLgg21_dnz23{@(1qB5KTU!N&pw!~hoDu~Bl>wEc2ikrrd1KU= z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVB~qaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*U^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( z6pV(zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjDpb+7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fl)9T0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*AutL?Ltr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3P$Xb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2A{7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c1*0J_8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqhK@yMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU=)moz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kW!5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S`WG8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiQ~ zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0q!DtAKhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinC>RZa(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7zLvtFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;6Cw1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtqq)hQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mg(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!83@Fd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?3PwX<Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nM!{$ZjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz$h3Efzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Euoc zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmwWGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhl}jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1Jg3%Bd4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=CQ7{?;qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFbYOPU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V+JV2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQKHo4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVB~qaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*U^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(6pV(zXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjDpb+ z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfl)9T0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*AutL?Ltr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3P$Xb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2A{7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c1*0J_8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqhK@yMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU=)moz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk pz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2n^y7001rbp;!O_ literal 0 HcmV?d00001 diff --git a/chap4/link.map b/chap4/link.map new file mode 100644 index 0000000..f1d2d5c --- /dev/null +++ b/chap4/link.map @@ -0,0 +1,160 @@ +Archive member included to satisfy reference by file (symbol) + +/courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + (start) +/courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_IDT) +/courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_CRT) +/courses/TDDI11/sw/lib/elf/libepc.a(display.o) + main.o (SetCursorPosition) +/courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8259) +/courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8253) +/courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Check_CPU) +/courses/TDDI11/sw/lib/elf/libepc.a(io.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) (ISR_PIC1) +/courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + /courses/TDDI11/sw/lib/elf/libepc.a(io.o) (Enqueue) + +Discarded input sections + + .eh_frame 0x0000000000000000 0x9c main.o + +Memory Configuration + +Name Origin Length Attributes +conventional 0x0000000000000000 0x00000000000a0000 +reserved 0x00000000000a0000 0x0000000000060000 +extended 0x0000000000100000 0x00000000fff00000 +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD main.o +LOAD /courses/TDDI11/sw/lib/elf/libepc.a +LOAD /courses/TDDI11/sw/lib/elf/djgpp/libc.a +LOAD /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a + +.text 0x0000000000000000 0x1a84 + 0x0000000000000000 text_frst = . + *(.start) + .start 0x0000000000000000 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000000 start + *(.init) + *(.text) + .text 0x0000000000000008 0x4a1 main.o + 0x0000000000000008 llmultiply + 0x00000000000002d9 PutUnsignedLongLong + 0x0000000000000315 main + *fill* 0x00000000000004a9 0x3 + .text 0x00000000000004ac 0x50 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x00000000000004ac Init_CPU + .text 0x00000000000004fc 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + 0x000000000000090c IRQ2INT + 0x0000000000000920 _GetISR + 0x0000000000000964 SetISR + 0x000000000000099c Init_IDT + .text 0x0000000000000a9c 0x110 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + 0x0000000000000a9c Init_CRT + 0x0000000000000ad0 _LastMemoryAddress + .text 0x0000000000000bac 0x6e0 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + 0x0000000000000bac SetCursorVisible + 0x0000000000000c30 _GetCursorRow + 0x0000000000000c44 _GetCursorCol + 0x0000000000000c58 SetCursorPosition + 0x0000000000000cfc ClearScreen + 0x0000000000000d64 _PutAttb + 0x0000000000000db0 _PutCharAt + 0x0000000000000ddc _PutChar + 0x0000000000000e60 PutString + 0x0000000000000e98 PutUnsigned + 0x0000000000000ed0 FormatUnsigned + 0x0000000000000f60 Unsigned2Ascii + 0x0000000000000fe4 _Cell + .text 0x000000000000128c 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + 0x000000000000128c Init8259 + .text 0x000000000000136c 0xb0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + 0x000000000000136c Init8253 + .text 0x000000000000141c 0x98 /courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + 0x000000000000141c Check_CPU + .text 0x00000000000014b4 0x60 /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x00000000000014b4 TimerTickISR + 0x00000000000014c0 KeyboardISR + 0x00000000000014e0 ISR_PIC1 + 0x00000000000014e7 ISR_PIC2 + 0x00000000000014f0 ___main + 0x00000000000014f1 inportb + 0x00000000000014fb outportb + 0x000000000000150d _exit + .text 0x0000000000001514 0x570 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + 0x0000000000001514 ScanCodeRdy + 0x0000000000001538 GetScanCode + 0x0000000000001568 ScanCode2Ascii + 0x0000000000001728 SetsKybdState + 0x0000000000001918 Enqueue + 0x0000000000001a83 text_last = (. - 0x1) + +.data 0x0000000000001aa0 0x77b + 0x0000000000001aa0 data_frst = . + *(.data) + .data 0x0000000000001aa0 0xc0 main.o + 0x0000000000001aa0 cases + .data 0x0000000000001b60 0x20 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000001b7e code_selector + .data 0x0000000000001b80 0x90 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .data 0x0000000000001c10 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .data 0x0000000000001c20 0x30 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .data 0x0000000000001c50 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .data 0x0000000000001c50 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .data 0x0000000000001c50 0xc /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x0000000000001c50 msec + 0x0000000000001c54 old_tick_isr + 0x0000000000001c58 old_kybd_isr + .data 0x0000000000001c5c 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + *(.rodata) + .rodata 0x00000000000021fc 0x1f main.o + *(.rodata.str1.1) + *(.rodata.str1.32) + 0x000000000000221a data_last = (. - 0x1) + +.bss 0x000000000000221c 0x83c + 0x000000000000221c bss_frst = . + *(.bss) + .bss 0x000000000000221c 0x0 main.o + .bss 0x000000000000221c 0x800 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .bss 0x0000000000002a1c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .bss 0x0000000000002a1c 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .bss 0x0000000000002a24 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .bss 0x0000000000002a24 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .bss 0x0000000000002a24 0x34 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + *(COMMON) + 0x0000000000002a57 bss_last = (. - 0x1) + +/DISCARD/ + *(.eh_frame) + 0x0000000000002a58 stack_frst = (bss_last + 0x1) + 0x000000000000aa57 stack_last = (bss_last + 0x8000) + 0x000000000000aa58 heap_frst = (stack_last + 0x1) +OUTPUT(embedded.bin binary) + +.debug_info 0x0000000000000000 0x2ff + .debug_info 0x0000000000000000 0x2ff main.o + +.debug_abbrev 0x0000000000000000 0x109 + .debug_abbrev 0x0000000000000000 0x109 main.o + +.debug_aranges 0x0000000000000000 0x20 + .debug_aranges + 0x0000000000000000 0x20 main.o + +.debug_line 0x0000000000000000 0xe2 + .debug_line 0x0000000000000000 0xe2 main.o + +.debug_str 0x0000000000000000 0x184 + .debug_str 0x0000000000000000 0x184 main.o + +.comment 0x0000000000000000 0x12 + .comment 0x0000000000000000 0x12 main.o diff --git a/chap4/llmultiply.asm b/chap4/llmultiply.asm new file mode 100644 index 0000000..21abf29 --- /dev/null +++ b/chap4/llmultiply.asm @@ -0,0 +1,100 @@ +; +; Test cases. All numbers are in hex. +; +; 111122223333 * 555566667777 = 5B061D958BF0ECA7C0481B5 +; 3456FEDCAAAA1000 * EDBA00112233FF01 = 309A912AF7188C57E62072DD409A1000 +; FFFFEEEEDDDDCCCC * BBBBAAAA99998888 = BBBB9E2692C5DDDCC28F7531048D2C60 +; FFFFFFFFFFFFFFFF * FFFFFFFFFFFFFFFF = FFFFFFFFFFFFFFFE0000000000000001 +; 00000001FFFFFFFF * 00000001FFFFFFFF = 0000000000000003FFFFFFFC00000001 +; FFFEFFFFFFFFFFFF * FFFF0001FFFFFFFF = FFFE0002FFFDFFFE0001FFFE00000001 +; + +; void llmultiply(unsigned long long int l1, +; unsigned long long int l2, +; unsigned char *result); + +; a = AH * (2 << 32) + AL +; b = BH * (2 << 32) + BL +; +; a * b = (AH * BH * (2 << 64)) + +; (AH * BL + AL * BH) * (2 << 32) + +; AL * BL + +; For more infromation, see the lab manual! + + SECTION .data + + + + SECTION .text + ALIGN 16 + BITS 32 + + ;; To access parameter BH on the stack you do + ;; MOV EAX, [EBP + 20] + ;; Replace the zero below with the correct value to be able + ;; to write your assembly code a little bit more readable: + ;; MOV EAX, [EBP + BH_OFF] +AL_OFF EQU 8 ; Offset from EBP to low bits of a (AL) +AH_OFF EQU 12 ; Offset from EBP to high bits of a (AH) +BL_OFF EQU 16 ; Offset from EBP to low bits of b (BL) +BH_OFF EQU 20 ; Offset from EBP to high bits of b (BH) +RES_OFF EQU 24 ; Offset from EBP to result array pointer + ;; ^^^^^ Replace 0 with correct values above + + + GLOBAL llmultiply + +llmultiply: + PUSH EBP + MOV EBP, ESP + + ;; Put your implementation here + ; a * b = (AH * BH * (2 << 64)) + + ; (AH * BL + AL * BH) * (2 << 32) + + ; AL * BL + + PUSH EBX + PUSH ESI + + MOV EBX, [EBP + RES_OFF] ;array_ptr + + ;;AL * BL + MOV EAX, [EBP + AL_OFF] + MUL DWORD [EBP + BL_OFF] + MOV DWORD [EBX], EAX ;Write to array_ptr[0] + MOV ECX, EDX ;Move mul1_h (2 << 32) + + ;;(AH * BL + AL * BH) * (2 << 32) + MOV EAX, [EBP + AL_OFF] + MUL DWORD [EBP + BH_OFF] + ADD EAX, ECX + ADC EDX, 0 ;Will never cause overflow. EDX max value after MUL is FFFFFFFE. + MOV ESI, EAX ;Move mul2_l (2 << 32) + MOV ECX, EDX ;Move mul2_h (2 << 64) + + MOV EAX, [EBP + AH_OFF] + MUL DWORD [EBP + BL_OFF] + ADD EAX, ESI + ADC EDX, 0 + MOV DWORD [EBX + 4], EAX ;Write to array_ptr[1] + ADD ECX, EDX ;ECX (2 << 64), but can produce a carry. + PUSHF ;Save carry (2 << 128) + + ;;(AH * BH) * (2 << 64) + MOV EAX, [EBP + AH_OFF] + MUL DWORD [EBP + BH_OFF] + ADD EAX, ECX + ADC EDX, 0 + MOV DWORD [EBX + 8], EAX ;Write to array_ptr[2] + + POPF + ADC EDX, 0 + MOV DWORD [EBX + 12], EDX ;Write to array_ptr[3] + + POP ESI + POP EBX + ;; Put your implementation end + + POP EBP ; restore EBP reg + RET ; return diff --git a/chap4/main.c b/chap4/main.c new file mode 100644 index 0000000..f308fcd --- /dev/null +++ b/chap4/main.c @@ -0,0 +1,246 @@ +#include <libepc.h> + +/* +Assembly: +OBJ = main.o llmultiply.o +CFLAGS = -O0 + +1)Total CPU cycle: 11A78E9F4=4739099124 / 10m = 473.910 cycles per llmultiply +2)Total CPU cycle: 10F7FF450=4555011152 / 10m = 455.501 cycles per llmultiply + +C none-optimize: +OBJ = main.o +CFLAGS = -O0 + +1)Total CPU cycle: 34557442C=14048248876 / 10m = 1404.825 cycles per llmultiply +2)Total CPU cycle: 32896E668=13565879912 / 10m = 1356.588 cycles per llmultiply + +C optimize: +OBJ = main.o +CFLAGS = -O3 + +1)Total CPU cycle: 5111E135=1360126261 / 10m = 136.013 cycles per llmultiply +2)Total CPU cycle: 6C659BE8=1818598376 / 10m = 181.860 cycles per llmultiply + +CONCLUSION: +Which version is most effective? How big improvement does compiler optimization give? + +We found that the C optimize version is the most effective. For our test case we found the +optimize C version uses circa 3/5 less CPU cycles compaired to the assembler version. This +is because of compiler MAGIC. + +*/ + +/* +void llmultiply(unsigned long long int l1, + unsigned long long int l2, + unsigned char *result); +*/ + + + +void llmultiply(unsigned long long int l1, + unsigned long long int l2, + unsigned char *result) +{ + unsigned long int *res = (unsigned long int *)result; + unsigned long long int al = l1 & 0xFFFFFFFF; + unsigned long long int ah = l1 >> 32; + unsigned long long int bl = l2 & 0xFFFFFFFF; + unsigned long long int bh = l2 >> 32; + + //a * b = ah * bh * 2^64 + // + (ah * bl + al * bh) * 2^32 + // + al * bl + + unsigned long long int ah_bh = ah * bh; + unsigned long long int ah_bl = ah * bl; + unsigned long long int al_bh = al * bh; + unsigned long long int al_bl = al * bl; + + unsigned long long int ah_bh_h = ah_bh >> 32; //2^128 + unsigned long long int ah_bh_l = ah_bh & 0xFFFFFFFF; //2^64 + + unsigned long long int ah_bl_h = ah_bl >> 32; //2^64 + unsigned long long int ah_bl_l = ah_bl & 0xFFFFFFFF; //2^32 + + unsigned long long int al_bh_h = al_bh >> 32; //2^64 + unsigned long long int al_bh_l = al_bh & 0xFFFFFFFF; //2^32 + + unsigned long long int al_bl_h = al_bl >> 32; //2^32 + unsigned long long int al_bl_l = al_bl & 0xFFFFFFFF; //Array[0] + + + unsigned long long int sum_1 = ah_bl_l + al_bh_l + al_bl_h; + unsigned long int sum_1_h = sum_1 >> 32; //2^64 + unsigned long int sum_1_l = sum_1 & 0xFFFFFFFF; //2^32 Array[1] + + unsigned long long int sum_2 = ah_bh_l + ah_bl_h + al_bh_h + sum_1_h; + unsigned long int sum_2_h = sum_2 >> 32; //2^128 Array[3] + unsigned long int sum_2_l = sum_2 & 0xFFFFFFFF; //2^64 Array[2] + + res[0] = al_bl_l; + res[1] = sum_1_l; + res[2] = sum_2_l; + res[3] = ah_bh_h + sum_2_h; + } + + +struct test_case { + unsigned long long int a; + unsigned long long int b; + unsigned long long int rh; + unsigned long long int rl; +}; + +struct test_case cases[6] = { + + { 0x0000111122223333ULL, 0x0000555566667777ULL, + 0x0000000005B061D9ULL, 0x58BF0ECA7C0481B5ULL }, + + { 0x3456FEDCAAAA1000ULL, 0xEDBA00112233FF01ULL, + 0x309A912AF7188C57ULL, 0xE62072DD409A1000ULL }, + + { 0xFFFFEEEEDDDDCCCCULL, 0xBBBBAAAA99998888ULL, + 0xBBBB9E2692C5DDDCULL, 0xC28F7531048D2C60ULL }, + + { 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, + 0xFFFFFFFFFFFFFFFEULL, 0x0000000000000001ULL }, + + { 0x00000001FFFFFFFFULL, 0x00000001FFFFFFFFULL, + 0x0000000000000003ULL, 0xFFFFFFFC00000001ULL }, + + { 0xFFFEFFFFFFFFFFFFULL, 0xFFFF0001FFFFFFFFULL, + 0xFFFE0002FFFDFFFEULL, 0x0001FFFE00000001ULL } +}; + +void PutUnsignedLongLong(unsigned long long int* ulli) +{ + unsigned long int* uli = (unsigned long int*)ulli; + PutUnsigned(uli[1], 16, 8); + PutUnsigned(uli[0], 16, 8); +} + +int main(int argc, char *argv[]) +{ + unsigned char result[16]; + + ClearScreen(0x07); + SetCursorPosition(0, 0); + + //Original code + for (int j = 0; j < 6; ++j) + { + PutString("Test : "); + PutUnsignedLongLong(&cases[j].a); + PutString(" * "); + PutUnsignedLongLong(&cases[j].b); + PutString("\r\n"); + + PutString(" == "); + PutUnsignedLongLong(&cases[j].rh); + PutUnsignedLongLong(&cases[j].rl); + PutString("\r\n"); + + llmultiply(cases[j].a, cases[j].b, result); + + + PutString("Result "); + PutUnsignedLongLong(&result[8]); + PutUnsignedLongLong(&result[0]); + PutString("\r\n"); + + PutString("\r\n"); + } + + /* + //TEST case + unsigned long long int stop_cpu_cycle; + unsigned long long int diff; + unsigned long long int loop_diff; + + unsigned long long int start_cpu_cycle = (unsigned long long int)CPU_Clock_Cycles(); + + for(int i = 0; i < 10000000; ++i) + { + unsigned long long int a = *(unsigned long long int *)&result[0]; + unsigned long long int b = *(unsigned long long int *)&result[8]; + llmultiply(a, b, result); + } + + stop_cpu_cycle = (unsigned long long int)CPU_Clock_Cycles(); + loop_diff = stop_cpu_cycle - start_cpu_cycle; + + start_cpu_cycle = (unsigned long long int)CPU_Clock_Cycles(); + + for(int i = 0; i < 10000000; ++i) + { + unsigned long long int a = *(unsigned long long int *)&result[0]; + unsigned long long int b = *(unsigned long long int *)&result[8]; + llmultiply(a, b, result); + + unsigned long long int a1 = *(unsigned long long int *)&result[0]; + unsigned long long int b1 = *(unsigned long long int *)&result[8]; + llmultiply(a1, b1, result); + } + + stop_cpu_cycle = (unsigned long long int)CPU_Clock_Cycles(); + diff = stop_cpu_cycle - start_cpu_cycle - loop_diff; + + //Garbage + PutUnsignedLongLong(&result[8]); + PutUnsignedLongLong(&result[0]); + + PutString("Loop diff CPU cycle: "); + PutUnsignedLongLong(&(loop_diff)); + PutString("\r\n"); + + PutString("Total CPU cycle: "); + PutUnsignedLongLong(&(diff)); + PutString("\r\n"); + + */ + + return 0; +} + + +/* + //OLD assembler + ;; Put your implementation here + PUSH EBX + MOV EBX, [EBP + RES_OFF] + + MOV EAX, [EBP + AL_OFF] + MUL DWORD [EBP + BL_OFF] + MOV DWORD [EBX], EAX ;;Write to Array[0] + MOV ECX, EDX ;;EDX contain high from mul (2^32) + + MOV EAX, [EBP + AL_OFF] + MUL DWORD [EBP + BH_OFF] + MOV [EBX + 4], EAX ;;Save low from mul in Array[1] + MOV [EBX + 8], EDX ;;Save EDX contain high from mul (2^64) + + MOV EAX, [EBP + AH_OFF] + MUL DWORD [EBP + BL_OFF] + ADD EAX, ECX + ADC EDX, 0 + ADD EAX, [EBX + 4] + ADC EDX, 0 + PUSHF ;;Save carry (2^128) + MOV ECX, EDX ;;Save EDX contain high from mul (2^64) + MOV [EBX + 4], EAX ;;Write to Array[1] + + MOV EAX, [EBP + AH_OFF] + MUL DWORD [EBP + BH_OFF] + ADD EAX, [EBX + 8] + ADC EDX, 0 + ADD EAX, ECX + ADC EDX, 0 + POPF + ADC EDX, 0 + MOV [EBX + 8], EAX ;;Write to Array[2] + MOV [EBX + 12], EDX ;;Write to Array[3] + + POP EBX +*/ diff --git a/chap4/main.o b/chap4/main.o new file mode 100644 index 0000000000000000000000000000000000000000..5ab4068165790ba23b6f960e758ea1a321bb726f GIT binary patch literal 5400 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 N85m}RB%m0k4gi<+=g0s6 literal 0 HcmV?d00001 diff --git a/chap4/makeNrun.sh b/chap4/makeNrun.sh new file mode 100644 index 0000000..cdc1361 --- /dev/null +++ b/chap4/makeNrun.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +clear +echo "This script includes commands to make the project and run it" + +echo "clean up the directory with make clean" +make clean +echo "make the project with make." +make +echo "Guiding mtools mcopy to its configuration file" +export MTOOLSRC=mtools.conf +echo "Copying the binary to floppy image" +mcopy embedded.bin a: +echo "Starting Qemu with given binary in the floppy image" +qemu-system-i386 -drive format=raw,file=floppy.img,if=floppy + diff --git a/chap4/mtools.conf b/chap4/mtools.conf new file mode 100644 index 0000000..c387b85 --- /dev/null +++ b/chap4/mtools.conf @@ -0,0 +1,6 @@ +MTOOLS_NO_VFAT=1 +drive a: + file="floppy.img" + fat_bits=12 + cylinders=80 heads=2 sectors=18 + mformat_only diff --git a/chap5/Makefile b/chap5/Makefile new file mode 100644 index 0000000..f965b92 --- /dev/null +++ b/chap5/Makefile @@ -0,0 +1,22 @@ +OBJ = main.o serial.o inbound.o outbound.o +CFLAGS = -O0 + +COURSE = /courses/TDDI11/sw +LDSCRIPT = $(COURSE)/lib/link.cmd +BOOTSECT = $(COURSE)/lib/bootload.bin +INCLUDES = -I "$(COURSE)/include" -I "$(COURSE)/include/djgpp" $(EXTRA_INCLUDES) +CC = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-gcc +CFLAGS += -Wall -g $(INCLUDES) +LD = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-ld +LDFLAGS = -T$(LDSCRIPT) -static -ustart -Map link.map +AS = nasm +ASFLAGS = -f elf32 + +embedded.bin: $(OBJ) + $(LD) $(OBJ) $(LIBS) $(LDFLAGS) +%.o: %.c + $(CC) $(CFLAGS) -c $< +%.o: %.asm + $(AS) $(ASFLAGS) $< +clean: + \rm -f embedded.bin *~ *.o link.map diff --git a/chap5/embedded.bin b/chap5/embedded.bin new file mode 100644 index 0000000000000000000000000000000000000000..e7645d34fddabb749d83e0c4755261b2fd2b9542 GIT binary patch literal 12265 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 literal 0 HcmV?d00001 diff --git a/chap5/floppy.img b/chap5/floppy.img new file mode 100644 index 0000000000000000000000000000000000000000..a34c975553ff0a927d52c32feee7d6f7970af00f GIT binary patch literal 1474560 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 zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhl}jE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1Jg3%Bd z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C zQ7{?;qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFbYOPU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V+JV2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By 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 F003*+B4q#o literal 0 HcmV?d00001 diff --git a/chap5/floppy_copy.img b/chap5/floppy_copy.img new file mode 100644 index 0000000000000000000000000000000000000000..a34c975553ff0a927d52c32feee7d6f7970af00f GIT binary patch literal 1474560 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 zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhl}jE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1Jg3%Bd z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C zQ7{?;qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFbYOPU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V+JV2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By 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 F003*+B4q#o literal 0 HcmV?d00001 diff --git a/chap5/inbound.c b/chap5/inbound.c new file mode 100644 index 0000000..c42d935 --- /dev/null +++ b/chap5/inbound.c @@ -0,0 +1,21 @@ +#include <libepc.h> + +#include "serial.h" + +PRIVATE WINDOW *w ; + +void InitInBound(void) +{ + w = WindowCreate("Remote", 13, 24, 0, 79) ; +} + +void InBound(void) +{ + extern QUEUE *inbound_queue ; + char ascii ; + + if (QueueRemove(inbound_queue, &ascii)) + { + WindowPutChar(w, ascii) ; + } +} diff --git a/chap5/inbound.o b/chap5/inbound.o new file mode 100644 index 0000000000000000000000000000000000000000..b0c585d42c019881799956c616927fdcba259864 GIT binary patch literal 3112 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 literal 0 HcmV?d00001 diff --git a/chap5/link.map b/chap5/link.map new file mode 100644 index 0000000..4c4d8bd --- /dev/null +++ b/chap5/link.map @@ -0,0 +1,268 @@ +Archive member included to satisfy reference by file (symbol) + +/courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + (start) +/courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + main.o (IRQ2INT) +/courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_CRT) +/courses/TDDI11/sw/lib/elf/libepc.a(display.o) + main.o (SetCursorVisible) +/courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8259) +/courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8253) +/courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + main.o (QueueCreate) +/courses/TDDI11/sw/lib/elf/libepc.a(window.o) + inbound.o (WindowCreate) +/courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Check_CPU) +/courses/TDDI11/sw/lib/elf/libepc.a(io.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) (ISR_PIC1) +/courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + outbound.o (ScanCodeRdy) +/courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) (malloc) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + outbound.o (__dj_ctype_flags) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) (_memcpy) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + /courses/TDDI11/sw/lib/elf/libepc.a(window.o) (_strcpy) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + /courses/TDDI11/sw/lib/elf/libepc.a(window.o) (_strlen) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + main.o (disable) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + main.o (enable) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) (___dj_movedata) + +Allocating common symbols +Common symbol size file + +inbound_queue 0x4 main.o + +Discarded input sections + + .eh_frame 0x0000000000000000 0x5c main.o + .eh_frame 0x0000000000000000 0x58 inbound.o + .eh_frame 0x0000000000000000 0x58 outbound.o + +Memory Configuration + +Name Origin Length Attributes +conventional 0x0000000000000000 0x00000000000a0000 +reserved 0x00000000000a0000 0x0000000000060000 +extended 0x0000000000100000 0x00000000fff00000 +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD main.o +LOAD serial.o +LOAD inbound.o +LOAD outbound.o +LOAD /courses/TDDI11/sw/lib/elf/libepc.a +LOAD /courses/TDDI11/sw/lib/elf/djgpp/libc.a +LOAD /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a + +.text 0x0000000000000000 0x2728 + 0x0000000000000000 text_frst = . + *(.start) + .start 0x0000000000000000 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000000 start + *(.init) + *(.text) + .text 0x0000000000000008 0x11d main.o + 0x0000000000000008 main + 0x0000000000000062 InitSerial + *fill* 0x0000000000000125 0xb + .text 0x0000000000000130 0x46 serial.o + 0x0000000000000130 SerialPut + 0x0000000000000146 SerialISR + .text 0x0000000000000176 0x60 inbound.o + 0x0000000000000176 InitInBound + 0x000000000000019c InBound + .text 0x00000000000001d6 0xea outbound.o + 0x00000000000001d6 InitOutBound + 0x00000000000001fc OutBound + .text 0x00000000000002c0 0x50 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x00000000000002c0 Init_CPU + .text 0x0000000000000310 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + 0x0000000000000720 IRQ2INT + 0x0000000000000734 _GetISR + 0x0000000000000778 SetISR + 0x00000000000007b0 Init_IDT + .text 0x00000000000008b0 0x110 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + 0x00000000000008b0 Init_CRT + 0x00000000000008e4 _LastMemoryAddress + .text 0x00000000000009c0 0x6e0 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + 0x00000000000009c0 SetCursorVisible + 0x0000000000000a44 _GetCursorRow + 0x0000000000000a58 _GetCursorCol + 0x0000000000000a6c SetCursorPosition + 0x0000000000000b10 ClearScreen + 0x0000000000000b78 _PutAttb + 0x0000000000000bc4 _PutCharAt + 0x0000000000000bf0 _PutChar + 0x0000000000000c74 PutString + 0x0000000000000cac PutUnsigned + 0x0000000000000ce4 FormatUnsigned + 0x0000000000000d74 Unsigned2Ascii + 0x0000000000000df8 _Cell + .text 0x00000000000010a0 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + 0x00000000000010a0 Init8259 + .text 0x0000000000001180 0xb0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + 0x0000000000001180 Init8253 + .text 0x0000000000001230 0x180 /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + 0x0000000000001230 QueueCreate + 0x000000000000129c QueueRemove + 0x0000000000001320 QueueInsert + .text 0x00000000000013b0 0x600 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + 0x00000000000013b4 WindowCreate + 0x000000000000149c _WindowErase + 0x000000000000150c WindowSelect + 0x0000000000001530 WindowSetCursor + 0x0000000000001560 WindowPutChar + 0x0000000000001640 WindowPutString + .text 0x00000000000019b0 0x98 /courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + 0x00000000000019b0 Check_CPU + .text 0x0000000000001a48 0x60 /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x0000000000001a48 TimerTickISR + 0x0000000000001a54 KeyboardISR + 0x0000000000001a74 ISR_PIC1 + 0x0000000000001a7b ISR_PIC2 + 0x0000000000001a84 ___main + 0x0000000000001a85 inportb + 0x0000000000001a8f outportb + 0x0000000000001aa1 _exit + .text 0x0000000000001aa8 0x570 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + 0x0000000000001aa8 ScanCodeRdy + 0x0000000000001acc GetScanCode + 0x0000000000001afc ScanCode2Ascii + 0x0000000000001cbc SetsKybdState + 0x0000000000001eac Enqueue + .text 0x0000000000002018 0x660 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + 0x0000000000002018 malloc + 0x00000000000020cc free + .text 0x0000000000002678 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + .text 0x0000000000002678 0x1c /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + 0x0000000000002678 _memcpy + .text 0x0000000000002694 0x28 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + 0x0000000000002694 _strcpy + .text 0x00000000000026bc 0x24 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + 0x00000000000026bc _strlen + .text 0x00000000000026e0 0x10 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + 0x00000000000026e0 disable + .text 0x00000000000026f0 0x10 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + 0x00000000000026f0 enable + .text 0x0000000000002700 0x28 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + 0x0000000000002700 ___dj_movedata + 0x0000000000002727 text_last = (. - 0x1) + +.data 0x0000000000002728 0x8c1 + 0x0000000000002728 data_frst = . + *(.data) + .data 0x0000000000002728 0x0 main.o + .data 0x0000000000002728 0x1 serial.o + .data 0x0000000000002729 0x0 inbound.o + .data 0x0000000000002729 0x0 outbound.o + *fill* 0x0000000000002729 0x3 + .data 0x000000000000272c 0x20 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x000000000000274a code_selector + .data 0x000000000000274c 0x90 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .data 0x00000000000027dc 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .data 0x00000000000027ec 0x30 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .data 0x000000000000281c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .data 0x000000000000281c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .data 0x000000000000281c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + .data 0x000000000000281c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + .data 0x000000000000281c 0xc /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x000000000000281c msec + 0x0000000000002820 old_tick_isr + 0x0000000000002824 old_kybd_isr + .data 0x0000000000002828 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .data 0x0000000000002dc8 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + .data 0x0000000000002dd8 0x204 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + 0x0000000000002dd8 __dj_ctype_flags + .data 0x0000000000002fdc 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + .data 0x0000000000002fdc 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + .data 0x0000000000002fdc 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + .data 0x0000000000002fdc 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + .data 0x0000000000002fdc 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + .data 0x0000000000002fdc 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + *(.rodata) + .rodata 0x0000000000002fdc 0x7 inbound.o + .rodata 0x0000000000002fe3 0x6 outbound.o + *(.rodata.str1.1) + *(.rodata.str1.32) + 0x0000000000002fe8 data_last = (. - 0x1) + +.bss 0x0000000000002fec 0x848 + 0x0000000000002fec bss_frst = . + *(.bss) + .bss 0x0000000000002fec 0x0 main.o + .bss 0x0000000000002fec 0x4 inbound.o + .bss 0x0000000000002ff0 0x4 outbound.o + .bss 0x0000000000002ff4 0x800 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .bss 0x00000000000037f4 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .bss 0x00000000000037f4 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .bss 0x00000000000037fc 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .bss 0x00000000000037fc 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .bss 0x00000000000037fc 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + .bss 0x00000000000037fc 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + .bss 0x00000000000037fc 0x34 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + .bss 0x0000000000003830 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + *(COMMON) + COMMON 0x0000000000003830 0x4 main.o + 0x0000000000003830 inbound_queue + 0x0000000000003833 bss_last = (. - 0x1) + +/DISCARD/ + *(.eh_frame) + 0x0000000000003834 stack_frst = (bss_last + 0x1) + 0x000000000000b833 stack_last = (bss_last + 0x8000) + 0x000000000000b834 heap_frst = (stack_last + 0x1) +OUTPUT(embedded.bin binary) + +.debug_info 0x0000000000000000 0x4a9 + .debug_info 0x0000000000000000 0x165 main.o + .debug_info 0x0000000000000165 0x1b0 inbound.o + .debug_info 0x0000000000000315 0x194 outbound.o + +.debug_abbrev 0x0000000000000000 0x2ab + .debug_abbrev 0x0000000000000000 0xd6 main.o + .debug_abbrev 0x00000000000000d6 0xe7 inbound.o + .debug_abbrev 0x00000000000001bd 0xee outbound.o + +.debug_aranges 0x0000000000000000 0x60 + .debug_aranges + 0x0000000000000000 0x20 main.o + .debug_aranges + 0x0000000000000020 0x20 inbound.o + .debug_aranges + 0x0000000000000040 0x20 outbound.o + +.debug_line 0x0000000000000000 0x1d3 + .debug_line 0x0000000000000000 0xbb main.o + .debug_line 0x00000000000000bb 0x67 inbound.o + .debug_line 0x0000000000000122 0xb1 outbound.o + +.debug_str 0x0000000000000000 0x3d8 + .debug_str 0x0000000000000000 0x15c main.o + .debug_str 0x000000000000015c 0x13e inbound.o + .debug_str 0x000000000000029a 0x13e outbound.o + +.comment 0x0000000000000000 0x36 + .comment 0x0000000000000000 0x12 main.o + .comment 0x0000000000000012 0x12 inbound.o + .comment 0x0000000000000024 0x12 outbound.o diff --git a/chap5/main.c b/chap5/main.c new file mode 100644 index 0000000..715d38c --- /dev/null +++ b/chap5/main.c @@ -0,0 +1,63 @@ +#include <dos.h> +#include <libepc.h> + +#include "serial.h" + +/* Function prototypes */ +void InitOutBound(void) ; +void InitInBound(void) ; +void InitSerial(void) ; + +void OutBound(void) ; +void InBound(void) ; + +QUEUE *inbound_queue ; + +int main() +{ + inbound_queue = QueueCreate(sizeof(char), 20) ; + + ClearScreen(0x07) ; + SetCursorVisible(TRUE) ; + InitSerial() ; + + InitOutBound() ; + InitInBound() ; + + for (;;) + { + OutBound() ; + InBound() ; + } + + return 0 ; +} + +void InitSerial(void) +{ + /* Disable interrupts during initialization */ + disable() ; + + /* 9600 baud */ + outportb(SER_LCR, SER_LCR_DLAB) ; + outportb(SER_DLO, 12) ; + outportb(SER_DHI, 0) ; + + /* 8 data bits, even parity, 1 stop bit */ + outportb(SER_LCR, 0x1B) ; + + /* Enable only receiver data ready interrupts */ + outportb(SER_IER, 0x01) ; + + /* Request to send, data terminal ready, enable interrupts */ + outportb(SER_MCR, SER_MCR_RTS|SER_MCR_DTR|SER_MCR_OUT2) ; + + /* Store address of ISR in IDT */ + SetISR(IRQ2INT(SER_IRQ), SerialISR) ; + + /* Unmask the UART's IRQ line */ + outportb(0x21, inportb(0x21) & ~SER_MSK) ; + + /* Re-enable interrupts */ + enable() ; +} diff --git a/chap5/main.o b/chap5/main.o new file mode 100644 index 0000000000000000000000000000000000000000..f38eaba6373784882fc6cdb74fb99c2505c13882 GIT binary patch literal 3612 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 GsRIDM>NH0H literal 0 HcmV?d00001 diff --git a/chap5/makeNrun.sh b/chap5/makeNrun.sh new file mode 100644 index 0000000..c82ce37 --- /dev/null +++ b/chap5/makeNrun.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +clear +echo "This script includes commands to make the project and run it" + +echo "clean up the directory with make clean" +make clean +echo "make the project with make." +make +echo "Guiding mtools mcopy to its configuration file" +export MTOOLSRC=mtools.conf +echo "Copying the binary to floppy image" +mcopy embedded.bin a: +echo "Duplicating the floppy image" +cp floppy.img floppy_copy.img +echo "We assume port 50152 is free. Check below, if it is not free, select another port" +#netstat | grep ":50152" +echo "Proceeding with port 50152 on localhost=127.0.0.1" +echo "Starting Qemu with given binary in the floppy image, as server" +qemu-system-i386 -drive format=raw,file=floppy.img,if=floppy -serial tcp:127.0.0.1:50152,server,nowait & +echo "Starting another Qemu with given binary in the floppy image, as client. Wait a second for server to connect" +sleep 1 +qemu-system-i386 -drive format=raw,file=floppy_copy.img,if=floppy -serial tcp:127.0.0.1:50152 & diff --git a/chap5/mtools.conf b/chap5/mtools.conf new file mode 100644 index 0000000..c387b85 --- /dev/null +++ b/chap5/mtools.conf @@ -0,0 +1,6 @@ +MTOOLS_NO_VFAT=1 +drive a: + file="floppy.img" + fat_bits=12 + cylinders=80 heads=2 sectors=18 + mformat_only diff --git a/chap5/outbound.c b/chap5/outbound.c new file mode 100644 index 0000000..3ebb9e5 --- /dev/null +++ b/chap5/outbound.c @@ -0,0 +1,36 @@ +#include <ctype.h> +#include <libepc.h> + +#include "serial.h" + +PRIVATE WINDOW *w ; + +void InitOutBound(void) +{ + w = WindowCreate("Local", 0, 11, 0, 79) ; +} + +void OutBound(void) +{ + WindowSelect(w) ; + + if (ScanCodeRdy()) + { + BYTE8 code = GetScanCode() ; + if (!(code & 0x80) && !SetsKybdState(code)) + { + char ascii = ScanCode2Ascii(code) & 0xFF ; + if (isprint(ascii) | iscntrl(ascii)) + { + WindowPutChar(w, ascii) ; + + SerialPut(ascii) ; + if (ascii == '\r') + { + WindowPutChar(w, '\n') ; + SerialPut('\n') ; + } + } + } + } +} diff --git a/chap5/outbound.o b/chap5/outbound.o new file mode 100644 index 0000000000000000000000000000000000000000..72937c29ab9010e036a4690ff57239dc51ca088c GIT binary patch literal 3516 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 literal 0 HcmV?d00001 diff --git a/chap5/serial.asm b/chap5/serial.asm new file mode 100644 index 0000000..e4cc0c4 --- /dev/null +++ b/chap5/serial.asm @@ -0,0 +1,93 @@ + SECTION .data + EXTERN inbound_queue ; (defined in main.C) +data DB 0 ; put rcvd byte here + + SECTION .text + ALIGN 16 + BITS 32 + +BASE_PORT EQU 3F8h ; we have this in our lab + +LSR_PORT EQU BASE_PORT+5 +RBR_PORT EQU BASE_PORT +THR_PORT EQU BASE_PORT + +SER_LSR_THRE EQU 0x20 +SER_LSR_RBF EQU 0x01 +CHAR_ARG EQU 8 +; --------------------------------------------------------------------- +; void SerialPut(char ch) +; --------------------------------------------------------------------- +; This function uses programmed waiting loop I/O +; to output the ASCII character 'ch' to the UART. + + GLOBAL SerialPut + +SerialPut: + + PUSH EBP + MOV EBP, ESP + +while_loop_start: + ; (1) Wait for THRE = 1 + MOV DX, LSR_PORT + IN AL, DX + TEST AL, SER_LSR_THRE ;Check if output is free + JZ while_loop_start ;If THRE is not set +while_loop_end: + + ; (2) Output character to UART + MOV AL, [EBP + CHAR_ARG] + MOV DX, THR_PORT + OUT DX, AL + + POP EBP + ; (3) Return to caller + RET + +; --------------------------------------------------------------------- +; void interrupt SerialISR(void) +; --------------------------------------------------------------------- +; This is an Interrupt Service Routine (ISR) for +; serial receive interrupts. Characters received +; are placed in a queue by calling Enqueue(char). + + GLOBAL SerialISR + EXTERN QueueInsert ; (provided by LIBPC) + +SerialISR: + ; Enable (higher-priority) IRQs + STI + ; (1) Preserve all registers + PUSHAD + PUSHFD + + ; (2) Get character from UART + MOV DX, LSR_PORT + IN AL, DX + TEST AL, SER_LSR_RBF ;Check if an input has occured + JZ _Eoi ;If RBF is not set + MOV DX, RBR_PORT + IN AL, DX + ; (3) Put character into queue + MOV [data], AL + ; Param #2: address of data + PUSH DWORD data + ; Param #1: address of queue + PUSH DWORD [inbound_queue] + CALL QueueInsert + ADD ESP,8 + ;POP + ;POP + +_Eoi: + ; (4) Enable lower priority interrupts + ;(Send Non-Specific EOI to PIC) + MOV AL, 0x20 + OUT 0x20, AL + + ; (5) Restore all registers + POPFD + POPAD + ; (6) Return to interrupted code + IRET diff --git a/chap5/serial.h b/chap5/serial.h new file mode 100644 index 0000000..9c42d33 --- /dev/null +++ b/chap5/serial.h @@ -0,0 +1,28 @@ +#define SER_IRQ IRQ_COM1_COM3 /* Hardware IRQ for COM1 */ +#define SER_MSK 0x10 /* PIC mask bit for IRQ 4 */ +#define SER_BASE 0x3F8 /* Base port address for COM1 */ + +#define SER_THR SER_BASE /* Transmitter Holding Register */ +#define SER_RBR SER_BASE /* Receiver Buffer Register */ +#define SER_DLO SER_BASE /* Baud Rate Divisor Low */ +#define SER_DHI (SER_BASE+1) /* Baud Rate Divisor High */ +#define SER_IER (SER_BASE+1) /* Interrupt Enable Register */ +#define SER_IIR (SER_BASE+2) /* Interrupt Identification Reg */ +#define SER_LCR (SER_BASE+3) /* Line Control Register */ +#define SER_MCR (SER_BASE+4) /* Modem Control Register */ +#define SER_LSR (SER_BASE+5) /* Line Status Register */ +#define SER_MSR (SER_BASE+6) /* Modem Status Register */ +#define SER_SCR (SER_BASE+7) /* Scratch Register */ + +#define SER_LSR_THRE 0x20 /* Trans. Hold. Reg. Empty */ +#define SER_LSR_RBF 0x01 /* Receiver Buffer Full */ + +#define SER_LCR_DLAB 0x80 /* Divisor Latch Address Bit */ + +#define SER_MCR_DTR 0x01 /* Data Terminal Ready */ +#define SER_MCR_RTS 0x02 /* Request To Send */ +#define SER_MCR_OUT2 0x08 /* Interrupt Enable */ + +void SerialPut(char ch) ; +void SerialISR(void) ; + diff --git a/chap5/serial.o b/chap5/serial.o new file mode 100644 index 0000000000000000000000000000000000000000..6aebaf1972284a29eae83b2ec02ad2872f44f87b GIT binary patch literal 1024 zcmb<-^>JflWMqH=Mh0dE1doBi0V-hvrZpJY8JNK=QVEcmAPm!;z{r4N4-3>lb_R$z z8<bzb$iUzRWrHXI5W&E}z{|jZ;*tZ53=D=)IS>W13q*@EFfcHI7%<Glz+k}0z`)AD zz`)PIzyPurWTrftc?Qf3469*!pl$+j)fpHVI6(|3e!$GYpa3-oWDm$Z4yYV9Dzx)y z+OEIMZ&oOjeD8AQNZa*;`CaVc-wAUdqKqZ7AfY#lKzcJk#D7x|`Qp$2|NonhaBNU` zrZ6}0JV*$N^->Z`5*hSLQY%Ur^olczONvSolNj`hD{~<<lwXvZ15pFjhKquQ8%Umo z;p2Z04a2A@0~G#D3~De*FwMxI&A`C$0~W~)AHlBwi^R7>lXpks2QWaw6KovA$N#ZN zVb8$u@qZ=*0|O#_KmM;li8m&OUIqpR9*Aae%r9eLV6aExBjgwuK=CdGmxJ(&Q20y? za~K#H#GqmVpp;acT9lcXqnB8m%aECulwX>c5?@%FTAIob2qHc6ic^b97{GDj<QVK4 zAK)Jp!r&7e1Yra@K^Y+)P)4w8P&`OF#3RU+0mcb(a$|7za14rf402}(23r_VTEbAC zk(rYkpOc?o5MNx9ScD>wnwJ7q=@}fv5bv4~3Md8!1`Sa7F)=XcLTO_V&CkGK0SX-f G1_l5uxQjLb literal 0 HcmV?d00001 diff --git a/chap6/Makefile b/chap6/Makefile new file mode 100644 index 0000000..f825f1d --- /dev/null +++ b/chap6/Makefile @@ -0,0 +1,22 @@ +OBJ = main.o serial.o inbound.o outbound.o + +COURSE = /courses/TDDI11/sw +LDSCRIPT = $(COURSE)/lib/link.cmd +BOOTSECT = $(COURSE)/lib/bootload.bin +LIBS = $(COURSE)/lib/elf/mtc.a +INCLUDES = -I "$(COURSE)/include" -I "$(COURSE)/include/djgpp" $(EXTRA_INCLUDES) +CC = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-gcc +CFLAGS += -Wall -g $(INCLUDES) +LD = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-ld +LDFLAGS = -T$(LDSCRIPT) -static -ustart -Map link.map +AS = nasm +ASFLAGS = -f elf32 + +embedded.bin: $(OBJ) + $(LD) $(OBJ) $(LIBS) $(LDFLAGS) +%.o: %.c + $(CC) $(CFLAGS) -c $< +%.o: %.asm + $(AS) $(ASFLAGS) $< +clean: + \rm -f embedded.bin *~ *.o link.map diff --git a/chap6/embedded.bin b/chap6/embedded.bin new file mode 100644 index 0000000000000000000000000000000000000000..dc23e4b209436c32d0df17a29d91cb8e7bffd352 GIT binary patch literal 34560 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 Ykj&gv1}lc3)ZF}%R0f~?<is2X0HTA~C;$Ke literal 0 HcmV?d00001 diff --git a/chap6/floppy.img b/chap6/floppy.img new file mode 100644 index 0000000000000000000000000000000000000000..28b0c9b3278ab9053f1f25b6f11c38886daac1de GIT binary patch literal 1474560 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 zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V+JV2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQKHo z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVB~qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*U^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(6pV(zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By 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 literal 0 HcmV?d00001 diff --git a/chap6/floppy_copy.img b/chap6/floppy_copy.img new file mode 100644 index 0000000000000000000000000000000000000000..28b0c9b3278ab9053f1f25b6f11c38886daac1de GIT binary patch literal 1474560 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 zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V+JV2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQKHo z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVB~qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*U^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(6pV(zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By 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 literal 0 HcmV?d00001 diff --git a/chap6/inbound.c b/chap6/inbound.c new file mode 100644 index 0000000..438c79e --- /dev/null +++ b/chap6/inbound.c @@ -0,0 +1,24 @@ +#include <libepc.h> +#include <mtc.h> + +#include "serial.h" + +void InBound(void) +{ + extern QUEUE *inbound_queue ; + WINDOW *w ; + + w = WindowCreate("Remote", 11, 21, 0, 79) ; + + if (!w) + return ; + + for (;;) + { + char ascii ; + + while (!QueueRemove(inbound_queue, &ascii)) + MtCYield() ; + WindowPutChar(w, ascii) ; + } +} diff --git a/chap6/inbound.o b/chap6/inbound.o new file mode 100644 index 0000000000000000000000000000000000000000..66a3de63f640d20d162c55b29bb35f49f41c8b94 GIT binary patch literal 3784 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 literal 0 HcmV?d00001 diff --git a/chap6/link.map b/chap6/link.map new file mode 100644 index 0000000..e743ef0 --- /dev/null +++ b/chap6/link.map @@ -0,0 +1,430 @@ +Archive member included to satisfy reference by file (symbol) + +/courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) + main.o (mtc_split) +/courses/TDDI11/sw/lib/elf/mtc.a(schedule.o) + /courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) (_sch_setup) +/courses/TDDI11/sw/lib/elf/mtc.a(sema.o) + /courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) (_sema_setup) +/courses/TDDI11/sw/lib/elf/mtc.a(thread.o) + /courses/TDDI11/sw/lib/elf/mtc.a(schedule.o) (_thr_setup) +/courses/TDDI11/sw/lib/elf/mtc.a(abend.o) + /courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) (_mtc_abend) +/courses/TDDI11/sw/lib/elf/mtc.a(context.o) + /courses/TDDI11/sw/lib/elf/mtc.a(thread.o) (_ctxt_setup) +/courses/TDDI11/sw/lib/elf/mtc.a(ll.o) + /courses/TDDI11/sw/lib/elf/mtc.a(schedule.o) (_ll_setup) +/courses/TDDI11/sw/lib/elf/mtc.a(mlist.o) + /courses/TDDI11/sw/lib/elf/mtc.a(thread.o) (_ml_setup) +/courses/TDDI11/sw/lib/elf/mtc.a(msg.o) + /courses/TDDI11/sw/lib/elf/mtc.a(mlist.o) (_msg_setup) +/courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + (start) +/courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + main.o (IRQ2INT) +/courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_CRT) +/courses/TDDI11/sw/lib/elf/libepc.a(display.o) + main.o (SetCursorVisible) +/courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + main.o (Milliseconds) +/courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8259) +/courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8253) +/courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + /courses/TDDI11/sw/lib/elf/mtc.a(sema.o) (malloc) +/courses/TDDI11/sw/lib/elf/libepc.a(setjmp.o) + /courses/TDDI11/sw/lib/elf/mtc.a(context.o) (_setjmp) +/courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + main.o (QueueCreate) +/courses/TDDI11/sw/lib/elf/libepc.a(window.o) + main.o (WindowCreate) +/courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Check_CPU) +/courses/TDDI11/sw/lib/elf/libepc.a(io.o) + /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) (msec) +/courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + outbound.o (ScanCodeRdy) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + outbound.o (__dj_ctype_flags) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + /courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) (_memcpy) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + /courses/TDDI11/sw/lib/elf/libepc.a(window.o) (_strcpy) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + /courses/TDDI11/sw/lib/elf/libepc.a(window.o) (_strlen) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + main.o (disable) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + main.o (enable) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) (___dj_movedata) + +Allocating common symbols +Common symbol size file + +inbound_queue 0x4 main.o +___Starting_Point__ + 0x4 /courses/TDDI11/sw/lib/elf/mtc.a(context.o) + +Discarded input sections + + .eh_frame 0x0000000000000000 0xa0 main.o + .eh_frame 0x0000000000000000 0x38 inbound.o + .eh_frame 0x0000000000000000 0x38 outbound.o + +Memory Configuration + +Name Origin Length Attributes +conventional 0x0000000000000000 0x00000000000a0000 +reserved 0x00000000000a0000 0x0000000000060000 +extended 0x0000000000100000 0x00000000fff00000 +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD main.o +LOAD serial.o +LOAD inbound.o +LOAD outbound.o +LOAD /courses/TDDI11/sw/lib/elf/mtc.a +LOAD /courses/TDDI11/sw/lib/elf/libepc.a +LOAD /courses/TDDI11/sw/lib/elf/djgpp/libc.a +LOAD /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a + +.text 0x0000000000000000 0x7d90 + 0x0000000000000000 text_frst = . + *(.start) + .start 0x0000000000000000 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000000 start + *(.init) + *(.text) + .text 0x0000000000000008 0x2d0 main.o + 0x0000000000000008 main + 0x0000000000000033 _mtc_main + 0x00000000000001ba DisplayElapsedTime + *fill* 0x00000000000002d8 0x8 + .text 0x00000000000002e0 0x46 serial.o + 0x00000000000002e0 SerialPut + 0x00000000000002f6 SerialISR + .text 0x0000000000000326 0x61 inbound.o + 0x0000000000000326 InBound + .text 0x0000000000000387 0x121 outbound.o + 0x0000000000000387 OutBound + .text 0x00000000000004a8 0x10d0 /courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) + 0x00000000000004b0 mtc_split + 0x00000000000004f8 mtc_stop + 0x00000000000005e0 mtc_yield + 0x0000000000000630 _mtc_setpri + 0x0000000000000730 _mtc_getpri + 0x0000000000000784 _mtc_asend + 0x0000000000000824 _mtc_send + 0x0000000000000988 _mtc_receive + 0x0000000000000b14 _mtc_mcount + 0x0000000000000bb8 _mtc_msize + 0x0000000000000c9c _mtc_mpriority + 0x0000000000000d78 _mtc_mdata + 0x0000000000000e20 _mtc_mtraverse + 0x0000000000000ea8 _mtc_mignore + 0x0000000000000fe8 _mtc_semacreate + 0x0000000000001034 _mtc_semadel + 0x0000000000001080 _mtc_semaset + 0x00000000000010c4 _mtc_semareset + 0x0000000000001110 _mtc_semainvert + 0x0000000000001154 _mtc_semaget + 0x000000000000116c _mtc_semawait + 0x0000000000001250 _mtc_me + 0x0000000000001294 _mtc_setthreshold + 0x00000000000012e4 _mtc_getthreshold + 0x0000000000001334 _mtc_setcount + 0x0000000000001384 _mtc_getcount + 0x00000000000013d4 _mtc_setuptr + 0x0000000000001424 _mtc_getuptr + 0x0000000000001540 mtc_entry + .text 0x0000000000001578 0xe30 /courses/TDDI11/sw/lib/elf/mtc.a(schedule.o) + 0x0000000000001584 _sch_setup + 0x00000000000016dc _sch_takedown + 0x00000000000017c4 _sch_split + 0x0000000000001b54 _sch_stop + 0x0000000000001bd0 _sch_yield + 0x0000000000001cd8 _sch_whoami + 0x0000000000001d1c _sch_wait + 0x0000000000001e04 _sch_resume + 0x0000000000001e94 _sch_norun + 0x0000000000002058 _sch_setthreshold + 0x0000000000002140 _sch_getthreshold + 0x000000000000221c _sch_setcount + 0x000000000000231c _sch_getcount + .text 0x00000000000023a8 0x630 /courses/TDDI11/sw/lib/elf/mtc.a(sema.o) + 0x0000000000002498 _sema_setup + 0x00000000000025d0 _sema_takedown + 0x00000000000026b0 _sema_set + 0x0000000000002754 _sema_reset + 0x0000000000002800 _sema_invert + 0x00000000000028b4 _sema_get + 0x000000000000291c _sema_wait + .text 0x00000000000029d8 0x7a0 /courses/TDDI11/sw/lib/elf/mtc.a(thread.o) + 0x0000000000002a44 _thr_setup + 0x0000000000002bd4 _thr_takedown + 0x0000000000002cc0 _thr_save + 0x0000000000002d80 _thr_restore + 0x0000000000002e0c _thr_setpri + 0x0000000000002e70 _thr_getpri + 0x0000000000002ed4 _thr_mlist + 0x0000000000002f3c _thr_block + 0x0000000000002fac _thr_unblock + 0x000000000000301c _thr_isblocked + 0x000000000000308c _thr_setuptr + 0x00000000000030fc _thr_getuptr + .text 0x0000000000003178 0x420 /courses/TDDI11/sw/lib/elf/mtc.a(abend.o) + 0x0000000000003350 _mtc_abend + .text 0x0000000000003598 0x510 /courses/TDDI11/sw/lib/elf/mtc.a(context.o) + 0x00000000000035f8 _ctxt_setup + 0x0000000000003748 _ctxt_takedown + 0x00000000000037bc _ctxt_save + 0x000000000000395c _ctxt_restore + .text 0x0000000000003aa8 0xe40 /courses/TDDI11/sw/lib/elf/mtc.a(ll.o) + 0x0000000000003ae0 _ll_setup + 0x0000000000003bb4 _ll_takedown + 0x0000000000003c98 _ll_addleft + 0x0000000000003e10 _ll_addright + 0x0000000000003f8c _ll_delleft + 0x0000000000004100 _ll_delright + 0x0000000000004288 _ll_count + 0x0000000000004334 _ll_current + 0x00000000000043cc _ll_start + 0x000000000000443c _ll_end + 0x00000000000044b8 _ll_right + 0x0000000000004560 _ll_left + 0x0000000000004614 _ll_isstart + 0x00000000000046ec _ll_isend + 0x00000000000047d8 _ll_save + 0x0000000000004870 _ll_assign + .text 0x00000000000048e8 0xa60 /courses/TDDI11/sw/lib/elf/mtc.a(mlist.o) + 0x0000000000004928 _ml_setup + 0x0000000000004a0c _ml_takedown + 0x0000000000004b54 _ml_add + 0x0000000000004d60 _ml_flush + 0x0000000000004e60 _ml_dequeue + 0x0000000000004f58 _ml_count + 0x0000000000004fd0 _ml_traverse + 0x0000000000005144 _ml_sync + 0x00000000000051bc _ml_priority + 0x000000000000523c _ml_data + 0x00000000000052bc _ml_size + .text 0x0000000000005348 0x450 /courses/TDDI11/sw/lib/elf/mtc.a(msg.o) + 0x0000000000005398 _msg_setup + 0x00000000000054ac _msg_takedown + 0x0000000000005530 _msg_size + 0x00000000000055d0 _msg_sync + 0x0000000000005674 _msg_priority + 0x0000000000005700 _msg_data + .text 0x0000000000005798 0x50 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000005798 Init_CPU + .text 0x00000000000057e8 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + 0x0000000000005bf8 IRQ2INT + 0x0000000000005c0c _GetISR + 0x0000000000005c50 SetISR + 0x0000000000005c88 Init_IDT + .text 0x0000000000005d88 0x110 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + 0x0000000000005d88 Init_CRT + 0x0000000000005dbc _LastMemoryAddress + .text 0x0000000000005e98 0x6e0 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + 0x0000000000005e98 SetCursorVisible + 0x0000000000005f1c _GetCursorRow + 0x0000000000005f30 _GetCursorCol + 0x0000000000005f44 SetCursorPosition + 0x0000000000005fe8 ClearScreen + 0x0000000000006050 _PutAttb + 0x000000000000609c _PutCharAt + 0x00000000000060c8 _PutChar + 0x000000000000614c PutString + 0x0000000000006184 PutUnsigned + 0x00000000000061bc FormatUnsigned + 0x000000000000624c Unsigned2Ascii + 0x00000000000062d0 _Cell + .text 0x0000000000006578 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + 0x0000000000006600 Milliseconds + 0x000000000000661c Now_Plus + .text 0x0000000000006658 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + 0x0000000000006658 Init8259 + .text 0x0000000000006738 0xb0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + 0x0000000000006738 Init8253 + .text 0x00000000000067e8 0x660 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + 0x00000000000067e8 malloc + 0x000000000000689c free + .text 0x0000000000006e48 0xb0 /courses/TDDI11/sw/lib/elf/libepc.a(setjmp.o) + 0x0000000000006e48 _setjmp + 0x0000000000006e92 _longjmp + .text 0x0000000000006ef8 0x180 /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + 0x0000000000006ef8 QueueCreate + 0x0000000000006f64 QueueRemove + 0x0000000000006fe8 QueueInsert + .text 0x0000000000007078 0x600 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + 0x000000000000707c WindowCreate + 0x0000000000007164 _WindowErase + 0x00000000000071d4 WindowSelect + 0x00000000000071f8 WindowSetCursor + 0x0000000000007228 WindowPutChar + 0x0000000000007308 WindowPutString + .text 0x0000000000007678 0x98 /courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + 0x0000000000007678 Check_CPU + .text 0x0000000000007710 0x60 /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x0000000000007710 TimerTickISR + 0x000000000000771c KeyboardISR + 0x000000000000773c ISR_PIC1 + 0x0000000000007743 ISR_PIC2 + 0x000000000000774c ___main + 0x000000000000774d inportb + 0x0000000000007757 outportb + 0x0000000000007769 _exit + .text 0x0000000000007770 0x570 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + 0x0000000000007770 ScanCodeRdy + 0x0000000000007794 GetScanCode + 0x00000000000077c4 ScanCode2Ascii + 0x0000000000007984 SetsKybdState + 0x0000000000007b74 Enqueue + .text 0x0000000000007ce0 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + .text 0x0000000000007ce0 0x1c /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + 0x0000000000007ce0 _memcpy + .text 0x0000000000007cfc 0x28 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + 0x0000000000007cfc _strcpy + .text 0x0000000000007d24 0x24 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + 0x0000000000007d24 _strlen + .text 0x0000000000007d48 0x10 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + 0x0000000000007d48 disable + .text 0x0000000000007d58 0x10 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + 0x0000000000007d58 enable + .text 0x0000000000007d68 0x28 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + 0x0000000000007d68 ___dj_movedata + 0x0000000000007d8f text_last = (. - 0x1) + +.data 0x0000000000007d90 0x970 + 0x0000000000007d90 data_frst = . + *(.data) + .data 0x0000000000007d90 0x0 main.o + .data 0x0000000000007d90 0x1 serial.o + .data 0x0000000000007d91 0x0 inbound.o + .data 0x0000000000007d91 0x0 outbound.o + *fill* 0x0000000000007d91 0x3 + .data 0x0000000000007d94 0x10 /courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) + .data 0x0000000000007da4 0x10 /courses/TDDI11/sw/lib/elf/mtc.a(schedule.o) + .data 0x0000000000007db4 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(sema.o) + .data 0x0000000000007db4 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(thread.o) + .data 0x0000000000007db4 0x70 /courses/TDDI11/sw/lib/elf/mtc.a(abend.o) + 0x0000000000007db4 _MtCAbendFlag + .data 0x0000000000007e24 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(context.o) + .data 0x0000000000007e24 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(ll.o) + .data 0x0000000000007e24 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(mlist.o) + .data 0x0000000000007e24 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(msg.o) + .data 0x0000000000007e24 0x20 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000007e42 code_selector + .data 0x0000000000007e44 0x90 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .data 0x0000000000007ed4 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .data 0x0000000000007ee4 0x30 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .data 0x0000000000007f14 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + .data 0x0000000000007f24 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .data 0x0000000000007f24 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .data 0x0000000000007f24 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + .data 0x0000000000007f34 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + .data 0x0000000000007f34 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + .data 0x0000000000007f34 0xc /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x0000000000007f34 msec + 0x0000000000007f38 old_tick_isr + 0x0000000000007f3c old_kybd_isr + .data 0x0000000000007f40 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .data 0x00000000000084e0 0x204 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + 0x00000000000084e0 __dj_ctype_flags + .data 0x00000000000086e4 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + .data 0x00000000000086e4 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + .data 0x00000000000086e4 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + .data 0x00000000000086e4 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + .data 0x00000000000086e4 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + .data 0x00000000000086e4 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + *(.rodata) + .rodata 0x00000000000086e4 0xf main.o + .rodata 0x00000000000086f3 0x7 inbound.o + .rodata 0x00000000000086fa 0x6 outbound.o + *(.rodata.str1.1) + *(.rodata.str1.32) + 0x00000000000086ff data_last = (. - 0x1) + +.bss 0x0000000000008700 0x878 + 0x0000000000008700 bss_frst = . + *(.bss) + .bss 0x0000000000008700 0x0 main.o + .bss 0x0000000000008700 0x0 inbound.o + .bss 0x0000000000008700 0x0 outbound.o + .bss 0x0000000000008700 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(mtc.o) + .bss 0x0000000000008700 0x2c /courses/TDDI11/sw/lib/elf/mtc.a(schedule.o) + .bss 0x000000000000872c 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(sema.o) + .bss 0x000000000000872c 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(thread.o) + .bss 0x000000000000872c 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(abend.o) + .bss 0x000000000000872c 0x8 /courses/TDDI11/sw/lib/elf/mtc.a(context.o) + .bss 0x0000000000008734 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(ll.o) + .bss 0x0000000000008734 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(mlist.o) + .bss 0x0000000000008734 0x0 /courses/TDDI11/sw/lib/elf/mtc.a(msg.o) + .bss 0x0000000000008734 0x800 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .bss 0x0000000000008f34 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .bss 0x0000000000008f34 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .bss 0x0000000000008f3c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(timer.o) + .bss 0x0000000000008f3c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .bss 0x0000000000008f3c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .bss 0x0000000000008f3c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + .bss 0x0000000000008f3c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(queue.o) + .bss 0x0000000000008f3c 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + .bss 0x0000000000008f3c 0x34 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .bss 0x0000000000008f70 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + .bss 0x0000000000008f70 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + .bss 0x0000000000008f70 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + .bss 0x0000000000008f70 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + .bss 0x0000000000008f70 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + .bss 0x0000000000008f70 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + .bss 0x0000000000008f70 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + *(COMMON) + COMMON 0x0000000000008f70 0x4 main.o + 0x0000000000008f70 inbound_queue + COMMON 0x0000000000008f74 0x4 /courses/TDDI11/sw/lib/elf/mtc.a(context.o) + 0x0000000000008f74 ___Starting_Point__ + 0x0000000000008f77 bss_last = (. - 0x1) + +/DISCARD/ + *(.eh_frame) + 0x0000000000008f78 stack_frst = (bss_last + 0x1) + 0x0000000000010f77 stack_last = (bss_last + 0x8000) + 0x0000000000010f78 heap_frst = (stack_last + 0x1) +OUTPUT(embedded.bin binary) + +.debug_info 0x0000000000000000 0x9e5 + .debug_info 0x0000000000000000 0x495 main.o + .debug_info 0x0000000000000495 0x2c0 inbound.o + .debug_info 0x0000000000000755 0x290 outbound.o + +.debug_abbrev 0x0000000000000000 0x37a + .debug_abbrev 0x0000000000000000 0x188 main.o + .debug_abbrev 0x0000000000000188 0xfa inbound.o + .debug_abbrev 0x0000000000000282 0xf8 outbound.o + +.debug_aranges 0x0000000000000000 0x60 + .debug_aranges + 0x0000000000000000 0x20 main.o + .debug_aranges + 0x0000000000000020 0x20 inbound.o + .debug_aranges + 0x0000000000000040 0x20 outbound.o + +.debug_line 0x0000000000000000 0x307 + .debug_line 0x0000000000000000 0x14d main.o + .debug_line 0x000000000000014d 0xb6 inbound.o + .debug_line 0x0000000000000203 0x104 outbound.o + +.debug_str 0x0000000000000000 0x6f4 + .debug_str 0x0000000000000000 0x2e3 main.o + .debug_str 0x00000000000002e3 0x209 inbound.o + .debug_str 0x00000000000004ec 0x208 outbound.o + +.comment 0x0000000000000000 0x36 + .comment 0x0000000000000000 0x12 main.o + .comment 0x0000000000000012 0x12 inbound.o + .comment 0x0000000000000024 0x12 outbound.o diff --git a/chap6/main.c b/chap6/main.c new file mode 100644 index 0000000..938d322 --- /dev/null +++ b/chap6/main.c @@ -0,0 +1,92 @@ +#include <mtc.h> +#include <dos.h> +#include <libepc.h> +#include <ctype.h> + +#include "serial.h" + +/* Function prototypes for the threads */ +void OutBound(void) ; +void InBound(void) ; +void DisplayElapsedTime(void) ; + +PRIVATE void SerialInit(void) ; + +QUEUE *inbound_queue ; + +int main() +{ + inbound_queue = QueueCreate(sizeof(char), 20) ; + + ClearScreen(0x07) ; + SetCursorVisible(TRUE) ; + SerialInit() ; + + MtCCoroutine(OutBound()) ; + MtCCoroutine(InBound()) ; + + MtCCoroutine(DisplayElapsedTime()); + + return 0 ; +} + +PRIVATE void SerialInit(void) +{ + /* Disable interrupts during initialization */ + disable() ; + + /* 9600 baud */ + outportb(SER_LCR, SER_LCR_DLAB) ; + outportb(SER_DLO, 12) ; + outportb(SER_DHI, 0) ; + + /* 8 data bits, even parity, 1 stop bit */ + outportb(SER_LCR, 0x1B) ; + + /* Enable only receiver data ready interrupts */ + outportb(SER_IER, 0x01) ; + + /* Request to send, data terminal ready, enable interrupts */ + outportb(SER_MCR, SER_MCR_RTS|SER_MCR_DTR|SER_MCR_OUT2) ; + + /* Store address of ISR in IDT */ + SetISR(IRQ2INT(SER_IRQ), SerialISR) ; + + /* Unmask the UART's IRQ line */ + outportb(0x21, inportb(0x21) & ~SER_MSK) ; + + /* Re-enable interrupts */ + enable() ; +} + +void DisplayElapsedTime(void) +{ + WINDOW *w; + w = WindowCreate("Elapsed Time", 22, 24, 0, 79); + + for(;;) + { + DWORD32 ms_start = Milliseconds(); + DWORD32 ms_stop = ms_start + 1000; + + DWORD32 s_start = ms_start / 1000; + DWORD32 hh = s_start / 3600; + DWORD32 mm = (s_start / 60) % 60; + DWORD32 ss = s_start % 60; + + WindowSelect(w); + + PutUnsigned(hh, 10, 2); + PutString(":"); + PutUnsigned(mm, 10, 2); + PutString(":"); + PutUnsigned(ss, 10, 2); + + while(Milliseconds() < ms_stop) //Keep yielding until one second has passed. + { + MtCYield(); + } + + } + +} diff --git a/chap6/main.o b/chap6/main.o new file mode 100644 index 0000000000000000000000000000000000000000..96875f3d94a930047f0e0fef255754c9adff5c79 GIT binary patch literal 6552 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 J5>O1&0s!;m&h`KR literal 0 HcmV?d00001 diff --git a/chap6/makeNrun.sh b/chap6/makeNrun.sh new file mode 100644 index 0000000..fc778fb --- /dev/null +++ b/chap6/makeNrun.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +clear +echo "This script includes commands to make the project and run it" + +echo "clean up the directory with make clean" +make clean +echo "make the project with make." +make +echo "Guiding mtools mcopy to its configuration file" +export MTOOLSRC=mtools.conf +echo "Copying the binary to floppy image" +mcopy embedded.bin a: +echo "Duplicating the floppy image" +cp floppy.img floppy_copy.img +echo "We assume port 50152 is free. Check below, if it is not free, select another port" +netstat | grep ":50152" +echo "Proceeding with port 50152 on localhost=127.0.0.1" +echo "Starting Qemu with given binary in the floppy image, as server" +qemu-system-i386 -drive format=raw,file=floppy.img,if=floppy -serial tcp:127.0.0.1:50152,server,nowait & +echo "Starting another Qemu with given binary in the floppy image, as client. Wait a second for server to connect" +sleep 1 +qemu-system-i386 -drive format=raw,file=floppy_copy.img,if=floppy -serial tcp:127.0.0.1:50152 & + + diff --git a/chap6/mtools.conf b/chap6/mtools.conf new file mode 100644 index 0000000..c387b85 --- /dev/null +++ b/chap6/mtools.conf @@ -0,0 +1,6 @@ +MTOOLS_NO_VFAT=1 +drive a: + file="floppy.img" + fat_bits=12 + cylinders=80 heads=2 sectors=18 + mformat_only diff --git a/chap6/outbound.c b/chap6/outbound.c new file mode 100644 index 0000000..c6c121c --- /dev/null +++ b/chap6/outbound.c @@ -0,0 +1,49 @@ +#include <libepc.h> +#include <ctype.h> +#include <mtc.h> + +#include "serial.h" + +void OutBound(void) +{ + WINDOW *w ; + + w = WindowCreate("Local", 0, 10, 0, 79) ; + if (!w) + return ; + + for (;;) + { + BYTE8 code ; + char ascii ; + + MtCYield() ; + + WindowSelect(w) ; + + if (!ScanCodeRdy()) + continue ; + + code = GetScanCode() ; + + if (code & 0x80) + continue ; + + if (SetsKybdState(code)) + continue ; + + ascii = ScanCode2Ascii(code) & 0xFF ; + if (!isprint(ascii) && !iscntrl(ascii)) + continue ; + + WindowPutChar(w, ascii) ; + + SerialPut(ascii) ; + if (ascii == '\r') + { + WindowPutChar(w, '\n') ; + SerialPut('\n') ; + } + } +} + diff --git a/chap6/outbound.o b/chap6/outbound.o new file mode 100644 index 0000000000000000000000000000000000000000..592a129f105d823b6170c5c3897841abe95fc3bc GIT binary patch literal 4192 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 literal 0 HcmV?d00001 diff --git a/chap6/serial.asm b/chap6/serial.asm new file mode 100644 index 0000000..dd90a9d --- /dev/null +++ b/chap6/serial.asm @@ -0,0 +1,94 @@ + SECTION .data + EXTERN inbound_queue ; (defined in main.C) +data DB 0 ; put rcvd byte here + + SECTION .text + ALIGN 16 + BITS 32 + +BASE_PORT EQU 3F8h ; we have this in our lab + +LSR_PORT EQU BASE_PORT+5 +RBR_PORT EQU BASE_PORT +THR_PORT EQU BASE_PORT + +SER_LSR_THRE EQU 0x20 +SER_LSR_RBF EQU 0x01 +CHAR_ARG EQU 8 +; --------------------------------------------------------------------- +; void SerialPut(char ch) +; --------------------------------------------------------------------- +; This function uses programmed waiting loop I/O +; to output the ASCII character 'ch' to the UART. + + GLOBAL SerialPut + +SerialPut: + + PUSH EBP + MOV EBP, ESP + +while_loop_start: + ; (1) Wait for THRE = 1 + MOV DX, LSR_PORT + IN AL, DX + TEST AL, SER_LSR_THRE + JZ while_loop_start ;If THRE is not set +while_loop_end: + + ; (2) Output character to UART + MOV AL, [EBP + CHAR_ARG] + MOV DX, THR_PORT + OUT DX, AL + + POP EBP + ; (3) Return to caller + RET + +; --------------------------------------------------------------------- +; void interrupt SerialISR(void) +; --------------------------------------------------------------------- +; This is an Interrupt Service Routine (ISR) for +; serial receive interrupts. Characters received +; are placed in a queue by calling Enqueue(char). + + GLOBAL SerialISR + EXTERN QueueInsert ; (provided by LIBPC) + +SerialISR: + ; Enable (higher-priority) IRQs + STI + ; (1) Preserve all registers + PUSHAD + PUSHFD + + ; (2) Get character from UART + MOV DX, LSR_PORT + IN AL, DX + TEST AL, SER_LSR_RBF + JZ _Eoi ;If RBF is not set + MOV DX, RBR_PORT + IN AL, DX + ; (3) Put character into queue + MOV [data], AL + ; Param #2: address of data + PUSH DWORD data + ; Param #1: address of queue + PUSH DWORD [inbound_queue] + CALL QueueInsert + ADD ESP,8 + ;POP + ;POP + +_Eoi: + ; (4) Enable lower priority interrupts + ;(Send Non-Specific EOI to PIC) + MOV AL, 0x20 + OUT 0x20, AL + + ; (5) Restore all registers + POPFD + POPAD + ; (6) Return to interrupted code + IRET + diff --git a/chap6/serial.h b/chap6/serial.h new file mode 100644 index 0000000..9c42d33 --- /dev/null +++ b/chap6/serial.h @@ -0,0 +1,28 @@ +#define SER_IRQ IRQ_COM1_COM3 /* Hardware IRQ for COM1 */ +#define SER_MSK 0x10 /* PIC mask bit for IRQ 4 */ +#define SER_BASE 0x3F8 /* Base port address for COM1 */ + +#define SER_THR SER_BASE /* Transmitter Holding Register */ +#define SER_RBR SER_BASE /* Receiver Buffer Register */ +#define SER_DLO SER_BASE /* Baud Rate Divisor Low */ +#define SER_DHI (SER_BASE+1) /* Baud Rate Divisor High */ +#define SER_IER (SER_BASE+1) /* Interrupt Enable Register */ +#define SER_IIR (SER_BASE+2) /* Interrupt Identification Reg */ +#define SER_LCR (SER_BASE+3) /* Line Control Register */ +#define SER_MCR (SER_BASE+4) /* Modem Control Register */ +#define SER_LSR (SER_BASE+5) /* Line Status Register */ +#define SER_MSR (SER_BASE+6) /* Modem Status Register */ +#define SER_SCR (SER_BASE+7) /* Scratch Register */ + +#define SER_LSR_THRE 0x20 /* Trans. Hold. Reg. Empty */ +#define SER_LSR_RBF 0x01 /* Receiver Buffer Full */ + +#define SER_LCR_DLAB 0x80 /* Divisor Latch Address Bit */ + +#define SER_MCR_DTR 0x01 /* Data Terminal Ready */ +#define SER_MCR_RTS 0x02 /* Request To Send */ +#define SER_MCR_OUT2 0x08 /* Interrupt Enable */ + +void SerialPut(char ch) ; +void SerialISR(void) ; + diff --git a/chap6/serial.o b/chap6/serial.o new file mode 100644 index 0000000000000000000000000000000000000000..6aebaf1972284a29eae83b2ec02ad2872f44f87b GIT binary patch literal 1024 zcmb<-^>JflWMqH=Mh0dE1doBi0V-hvrZpJY8JNK=QVEcmAPm!;z{r4N4-3>lb_R$z z8<bzb$iUzRWrHXI5W&E}z{|jZ;*tZ53=D=)IS>W13q*@EFfcHI7%<Glz+k}0z`)AD zz`)PIzyPurWTrftc?Qf3469*!pl$+j)fpHVI6(|3e!$GYpa3-oWDm$Z4yYV9Dzx)y z+OEIMZ&oOjeD8AQNZa*;`CaVc-wAUdqKqZ7AfY#lKzcJk#D7x|`Qp$2|NonhaBNU` zrZ6}0JV*$N^->Z`5*hSLQY%Ur^olczONvSolNj`hD{~<<lwXvZ15pFjhKquQ8%Umo z;p2Z04a2A@0~G#D3~De*FwMxI&A`C$0~W~)AHlBwi^R7>lXpks2QWaw6KovA$N#ZN zVb8$u@qZ=*0|O#_KmM;li8m&OUIqpR9*Aae%r9eLV6aExBjgwuK=CdGmxJ(&Q20y? za~K#H#GqmVpp;acT9lcXqnB8m%aECulwX>c5?@%FTAIob2qHc6ic^b97{GDj<QVK4 zAK)Jp!r&7e1Yra@K^Y+)P)4w8P&`OF#3RU+0mcb(a$|7za14rf402}(23r_VTEbAC zk(rYkpOc?o5MNx9ScD>wnwJ7q=@}fv5bv4~3Md8!1`Sa7F)=XcLTO_V&CkGK0SX-f G1_l5uxQjLb literal 0 HcmV?d00001 diff --git a/chap7/Makefile b/chap7/Makefile new file mode 100644 index 0000000..0961a72 --- /dev/null +++ b/chap7/Makefile @@ -0,0 +1,22 @@ +OBJ = main.o serial.o inbound.o outbound.o elapsed.o packet.o isr.o + +COURSE = /courses/TDDI11/sw +LDSCRIPT = $(COURSE)/lib/link.cmd +BOOTSECT = $(COURSE)/lib/bootload.bin +LIBS = $(COURSE)/lib/elf/ucos_ii.a +INCLUDES = -I "$(COURSE)/include" -I "$(COURSE)/include/djgpp" $(EXTRA_INCLUDES) +CC = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-gcc +CFLAGS += -Wall -g $(INCLUDES) +LD = $(COURSE)/i386-elf-gcc-7.3.0/bin/i386-elf-ld +LDFLAGS = -T$(LDSCRIPT) -static -ustart -Map link.map +AS = nasm +ASFLAGS = -f elf32 + +embedded.bin: $(OBJ) + $(LD) $(OBJ) $(LIBS) $(LDFLAGS) +%.o: %.c + $(CC) $(CFLAGS) -c $< +%.o: %.asm + $(AS) $(ASFLAGS) $< +clean: + \rm -f embedded.bin *~ *.o link.map diff --git a/chap7/elapsed.c b/chap7/elapsed.c new file mode 100644 index 0000000..4f34fd9 --- /dev/null +++ b/chap7/elapsed.c @@ -0,0 +1,106 @@ +#include <os_cpu.h> +#include <os_cfg.h> +#include <ucos_ii.h> /* os_c??.h must be included before ! */ +#include <libepc.h> + +#include "elapsed.h" +#include "packet.h" + +PRIVATE char *AsciiTime(TIME *elapsed) ; +PRIVATE void UpdateTime(TIME *elapsed) ; + +PRIVATE OS_EVENT *time_queue = NULL ; + +PRIVATE void TimeCreateQ(void) +{ + static void *time_q[20] ; + + if (!time_queue) + { + time_queue = OSQCreate(time_q, ENTRIES(time_q)) ; + } +} + +void PostTime(BYTE8 *bfr) +{ + TimeCreateQ() ; + OSQPost(time_queue, bfr) ; +} + +void InboundTime(void) +{ + WINDOW *w ; + + w = (WINDOW *) WindowCreate("Remote", 11, 13, 56, 72) ; + if (!w) + return ; + TimeCreateQ() ; + + for (;;) + { + BYTE8 err ; + char *bfr ; + + bfr = OSQPend(time_queue, 0, &err) ; + WindowSetCursor(w, 0, 1) ; + WindowPutString(w, bfr) ; + free(bfr) ; + } +} + +void ElapsedLocal(void) +{ + WINDOW *w ; + + w = (WINDOW *) WindowCreate("Local", 11, 13, 10, 23) ; + if (!w) + return ; + + /* SerialInit have a guard inside to prevent multiple initializations */ + SerialInit(); + + for (;;) + { + static TIME elapsed = {0, 0, 0, 0} ; + char *bfr ; + + /* Update the display */ + WindowSetCursor(w, 0, 1) ; + bfr = AsciiTime(&elapsed) ; + SendPacket(2, bfr, 10) ; + WindowPutString(w, bfr) ; + + OSTimeDly(100) ; /* Sleep for about .1 second */ + + /* update elapsed hours, minutes, and seconds */ + UpdateTime(&elapsed) ; + } +} + +PRIVATE void UpdateTime(TIME *elapsed) +{ + int ticks = OSTimeGet() ; + + elapsed->tenths = ticks / 100 ; + elapsed->secs = elapsed->tenths / 10 ; + elapsed->tenths %= 10 ; + elapsed->mins = elapsed->secs / 60 ; + elapsed->secs %= 60 ; + elapsed->hours = elapsed->mins / 60 ; + elapsed->mins %= 60 ; +} + +PRIVATE char *AsciiTime(TIME *elapsed) +{ + static char _bfr[] = "XX:XX:XX.X" ; + char *bfr ; + + bfr = FormatUnsigned(_bfr, elapsed->hours, 10, 2, '0') ; + *bfr++ = ':' ; + bfr = FormatUnsigned(bfr, elapsed->mins, 10, 2, '0') ; + *bfr++ = ':' ; + bfr = FormatUnsigned(bfr, elapsed->secs, 10, 2, '0') ; + *bfr++ = '.' ; + FormatUnsigned(bfr, elapsed->tenths, 10, 1, '0') ; + return _bfr ; +} diff --git a/chap7/elapsed.h b/chap7/elapsed.h new file mode 100644 index 0000000..1579ded --- /dev/null +++ b/chap7/elapsed.h @@ -0,0 +1,11 @@ +typedef struct TIME +{ + unsigned hours ; + unsigned mins ; + unsigned secs ; + unsigned tenths ; +} TIME ; + +void PostTime(BYTE8 *bfr) ; +void InboundTime() ; +void ElapsedLocal() ; diff --git a/chap7/elapsed.o b/chap7/elapsed.o new file mode 100644 index 0000000000000000000000000000000000000000..79cc2c23778648afa413b745cb373e7fc73db740 GIT binary patch literal 8600 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 literal 0 HcmV?d00001 diff --git a/chap7/embedded.bin b/chap7/embedded.bin new file mode 100644 index 0000000000000000000000000000000000000000..eea7636d051dd47bab6ed54d93dd59236b0d0bd8 GIT binary patch literal 27450 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 literal 0 HcmV?d00001 diff --git a/chap7/floppy.img b/chap7/floppy.img new file mode 100644 index 0000000000000000000000000000000000000000..80beaabe55f9238f10a79f58eb65448967531d7e GIT binary patch literal 1474560 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 z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*AutL? zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3P$Xb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2A{7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c1*0J_8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqhK@yMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON 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 literal 0 HcmV?d00001 diff --git a/chap7/floppy_copy.img b/chap7/floppy_copy.img new file mode 100644 index 0000000000000000000000000000000000000000..80beaabe55f9238f10a79f58eb65448967531d7e GIT binary patch literal 1474560 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 z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*AutL? zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3P$Xb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2A{7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c1*0J_8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqhK@yMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON 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 literal 0 HcmV?d00001 diff --git a/chap7/inbound.c b/chap7/inbound.c new file mode 100644 index 0000000..8154466 --- /dev/null +++ b/chap7/inbound.c @@ -0,0 +1,42 @@ +#include <os_cpu.h> +#include <os_cfg.h> +#include <ucos_ii.h> /* os_c??.h must be included before ! */ +#include <libepc.h> + +#include "packet.h" + +PRIVATE OS_EVENT *display_queue = NULL ; + +PRIVATE void InboundCreateQ(void) +{ + if (!display_queue) + { + static void *display_q[20] ; + display_queue = OSQCreate(display_q, ENTRIES(display_q)) ; + } +} + +void PostText(BYTE8 *bfr) +{ + InboundCreateQ() ; + OSQPost(display_queue, bfr) ; +} + +void InboundText(void) +{ + WINDOW *remote ; + + remote = WindowCreate("Remote", 14, 24, 0, 79) ; + InboundCreateQ() ; + + for (;;) + { + char *bfr ; + BYTE8 err ; + + bfr = OSQPend(display_queue, 0, &err) ; + WindowPutChar(remote, *bfr) ; + free(bfr) ; + } +} + diff --git a/chap7/inbound.h b/chap7/inbound.h new file mode 100644 index 0000000..848795f --- /dev/null +++ b/chap7/inbound.h @@ -0,0 +1,3 @@ +void PostText(BYTE8 *bfr) ; +void InboundText() ; + diff --git a/chap7/inbound.o b/chap7/inbound.o new file mode 100644 index 0000000000000000000000000000000000000000..c659e4366c7f86876224c64fabc34e997a9bfcf6 GIT binary patch literal 6732 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 XAag)Wkom~!CWt}mdypIm!_)x)clQw- literal 0 HcmV?d00001 diff --git a/chap7/isr.asm b/chap7/isr.asm new file mode 100644 index 0000000..4dca05d --- /dev/null +++ b/chap7/isr.asm @@ -0,0 +1,64 @@ + SECTION .data + + EXTERN _OSIntNesting + EXTERN _OSTCBCur + EXTERN kybd_queue + EXTERN com1_queue + + SECTION .text + ALIGN 16 + BITS 32 + + GLOBAL OSKeyboardISR + GLOBAL OSSerialISR + + EXTERN _OSIntEnter + EXTERN _OSIntExit + EXTERN OSQPost + +; -------------------------------------------------------------------- +OSKeyboardISR: +; -------------------------------------------------------------------- + PUSHA ; Save interrupted task's context + CALL _OSIntEnter ; Notify uC/OS-II of ISR + CMP BYTE [_OSIntNesting], 1 ; if (OSIntNesting == 1) + JNE SHORT _KeyboardISR1 + MOV EAX, [_OSTCBCur] ; OSTCBCur->OSTCBStkPtr = ESP + MOV [EAX], ESP +_KeyboardISR1: + IN AL,60h ; get scan code + MOVZX EAX,AL + PUSH EAX + PUSH DWORD [kybd_queue] + CALL OSQPost + ADD ESP,8 + MOV AL,20H ; Send EOI to PIC + OUT 20H,AL + CALL _OSIntExit ; Notify uC/OS-II of end of ISR + POPA + IRET ; Return to interrupted task + +; -------------------------------------------------------------------- +OSSerialISR: +; -------------------------------------------------------------------- + PUSHA ; Save interrupted task's context + CALL _OSIntEnter ; Notify uC/OS-II of ISR + CMP BYTE [_OSIntNesting], 1 ; if (OSIntNesting == 1) + JNE SHORT _SerialISR1 + MOV EAX, [_OSTCBCur] ; OSTCBCur->OSTCBStkPtr = ESP + MOV [EAX], ESP +_SerialISR1: + MOV DX,3F8H + IN AL,DX ; get serial byte + MOVZX EAX,AL + PUSH EAX + PUSH DWORD [com1_queue] + CALL OSQPost + ADD ESP,8 + MOV AL,20H ; Send EOI to PIC + OUT 20H,AL + CALL _OSIntExit ; Notify uC/OS-II of end of ISR + POPA + IRET ; Return to interrupted task + + END diff --git a/chap7/isr.o b/chap7/isr.o new file mode 100644 index 0000000000000000000000000000000000000000..2e3898fc926dfb2f2023889abc805ec1bea6a4f7 GIT binary patch literal 1024 zcmb<-^>JflWMqH=Mh0dE1doBi0V-hvrZpJY8JNK=QVEcmAPm!;0OBAS!UAQpGcbVd zXM^%V>T;oM5G4R27#J9M85mGpa)FV7!4N73qF~00GcYhPfdrsf0K{QrU|?lnU;x<# zvKM5gJeqj|%nS^DP(2_DW}Z3&0|O^W0E!ndGcY7DFff430T~UVIiPYND&fVS|Ns9t z*n-%MrR)nqbf?0T1paLY0{)wVcwhz1M>sYpJW~L(6VGGUl(y>!^BcVSK*s5%B$gyH z=#`{alrZQOXB3wdl_VxH=oMGyLTD(zC^ZM72BZfMhWQ($goWYbe-I7Bs3`>$A507> z3=9lnFa-=u40Q|)4BklmE(Qh$M0_%#ge52*K=B1r4&p1qI1CI7AifS7-yDtajK=pv z<A<T}nHY)~7#P6O05+eAfg!WFNH4KCmm%Ii*fX!hFSWQNGcO&)3vqUGE-hlnu1rda zFDy+hO=U>V&ozWHA*x;TN>YnJYCZExTq`n582p0+1M-VOw0CM{Qhs7lif3>TLp&14 zkikDVIJGD<F$XLIXBslN`nf>UE)zEc11L=~vO~gvk%NIj4wO$g85op7YIqqK^g%Qa n0|O{LK<YsW4y4`{q>h7u0pxE+E(V5ZkUCxlhIA0k!@vLl2{nd$ literal 0 HcmV?d00001 diff --git a/chap7/link.map b/chap7/link.map new file mode 100644 index 0000000..98782d2 --- /dev/null +++ b/chap7/link.map @@ -0,0 +1,497 @@ +Archive member included to satisfy reference by file (symbol) + +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) + main.o (OSInit) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_flag.o) + /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) (_OS_FlagInit) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_mem.o) + /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) (_OS_MemInit) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_q.o) + serial.o (OSQCreate) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_sem.o) + packet.o (OSSemCreate) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_task.o) + main.o (OSTaskCreate) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_time.o) + serial.o (OSTimeDly) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_a.o) + /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) (_OSStartHighRdy) +/courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_c.o) + /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_task.o) (_OSTaskStkInit) +/courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + (start) +/courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + serial.o (IRQ2INT) +/courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init_CRT) +/courses/TDDI11/sw/lib/elf/libepc.a(display.o) + main.o (SetCursorVisible) +/courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8259) +/courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Init8253) +/courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + main.o (malloc) +/courses/TDDI11/sw/lib/elf/libepc.a(window.o) + inbound.o (WindowCreate) +/courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) (Check_CPU) +/courses/TDDI11/sw/lib/elf/libepc.a(io.o) + /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) (ISR_PIC1) +/courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + outbound.o (ScanCode2Ascii) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + outbound.o (__dj_ctype_flags) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_task.o) (_memcpy) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(memset.o) + /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_task.o) (_memset) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + /courses/TDDI11/sw/lib/elf/libepc.a(window.o) (_strcpy) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + /courses/TDDI11/sw/lib/elf/libepc.a(window.o) (_strlen) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + serial.o (disable) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + serial.o (enable) +/courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) (___dj_movedata) + +Allocating common symbols +Common symbol size file + +_OSTaskCtr 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTCBCur 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSCtxSwCtr 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTCBList 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTCBHighRdy 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSQTbl 0x78 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSRdyTbl 0x8 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTaskIdleStk 0x800 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSEventTbl 0xa0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTCBFreeList 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OldTickISR 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_c.o) +_OSRdyGrp 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSIntExitY 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSPrioCur 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSQFreeList 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +sendPacketSema 0x4 packet.o +_OSIdleCtr 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSRunning 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSMemTbl 0x64 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSPrioHighRdy 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTCBPrioTbl 0x100 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTickDOSCtr 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_c.o) +_OSLockNesting 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTime 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSFlagTbl 0x3c /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSTCBTbl 0xe00 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSIntNesting 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSEventFreeList 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSMemFreeList 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) +_OSFlagFreeList 0x4 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) + +Discarded input sections + + .eh_frame 0x0000000000000000 0x64 main.o + .eh_frame 0x0000000000000000 0x78 serial.o + .eh_frame 0x0000000000000000 0x74 inbound.o + .eh_frame 0x0000000000000000 0x54 outbound.o + .eh_frame 0x0000000000000000 0xd8 elapsed.o + .eh_frame 0x0000000000000000 0x74 packet.o + +Memory Configuration + +Name Origin Length Attributes +conventional 0x0000000000000000 0x00000000000a0000 +reserved 0x00000000000a0000 0x0000000000060000 +extended 0x0000000000100000 0x00000000fff00000 +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD main.o +LOAD serial.o +LOAD inbound.o +LOAD outbound.o +LOAD elapsed.o +LOAD packet.o +LOAD isr.o +LOAD /courses/TDDI11/sw/lib/elf/ucos_ii.a +LOAD /courses/TDDI11/sw/lib/elf/libepc.a +LOAD /courses/TDDI11/sw/lib/elf/djgpp/libc.a +LOAD /courses/TDDI11/sw/i386-elf-gcc-7.3.0/lib/gcc/i386-elf/7.3.0/libgcc.a + +.text 0x0000000000000000 0x6250 + 0x0000000000000000 text_frst = . + *(.start) + .start 0x0000000000000000 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000000000 start + *(.init) + *(.text) + .text 0x0000000000000008 0xe5 main.o + 0x0000000000000033 main + .text 0x00000000000000ed 0x17e serial.o + 0x00000000000000ed SerialGet + 0x000000000000010c SerialPut + 0x000000000000015b SerialInit + .text 0x000000000000026b 0xb2 inbound.o + 0x0000000000000294 PostText + 0x00000000000002b6 InboundText + .text 0x000000000000031d 0x191 outbound.o + 0x000000000000031d OutboundThread + .text 0x00000000000004ae 0x2ef elapsed.o + 0x00000000000004d7 PostTime + 0x00000000000004f9 InboundTime + 0x0000000000000575 ElapsedLocal + .text 0x000000000000079d 0x15a packet.o + 0x000000000000079d PacketInit + 0x00000000000007b8 ReceivePackets + 0x000000000000086a SendPacket + *fill* 0x00000000000008f7 0x9 + .text 0x0000000000000900 0x6d isr.o + 0x0000000000000900 OSKeyboardISR + 0x0000000000000935 OSSerialISR + *fill* 0x000000000000096d 0x3 + .text 0x0000000000000970 0xac0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) + 0x0000000000000970 _OSMapTbl + 0x0000000000000978 _OSUnMapTbl + 0x0000000000000a78 OSInit + 0x0000000000000c40 _OSIntEnter + 0x0000000000000c5c _OSIntExit + 0x0000000000000d04 _OSSchedLock + 0x0000000000000d28 _OSSchedUnlock + 0x0000000000000d6c OSStart + 0x0000000000000df4 _OSTimeTick + 0x0000000000000eb4 _OSVersion + 0x0000000000000ec4 _OS_Dummy + 0x0000000000000ecc _OS_EventTaskRdy + 0x0000000000001010 _OS_EventTaskWait + 0x00000000000010d4 _OS_EventTO + 0x0000000000001160 _OS_EventWaitListInit + 0x00000000000011c0 _OS_Sched + 0x0000000000001250 _OS_TaskIdle + 0x000000000000126c _OS_TCBInit + .text 0x0000000000001430 0xb60 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_flag.o) + 0x0000000000001430 _OSFlagAccept + 0x00000000000015e8 _OSFlagCreate + 0x0000000000001654 _OSFlagDel + 0x0000000000001788 _OSFlagPend + 0x0000000000001ad8 _OSFlagPost + 0x0000000000001cdc _OSFlagQuery + 0x0000000000001e24 _OS_FlagInit + 0x0000000000001f1c _OS_FlagUnlink + .text 0x0000000000001f90 0x320 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_mem.o) + 0x0000000000001f90 _OSMemCreate + 0x00000000000020ac _OSMemGet + 0x0000000000002104 _OSMemPut + 0x0000000000002164 _OSMemQuery + 0x00000000000021e8 _OS_MemInit + .text 0x00000000000022b0 0x8b0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_q.o) + 0x00000000000022b0 _OSQAccept + 0x000000000000232c OSQCreate + 0x000000000000243c _OSQDel + 0x0000000000002594 _OSQFlush + 0x00000000000025ec OSQPend + 0x0000000000002728 OSQPost + 0x00000000000027ec _OSQPostFront + 0x00000000000028b4 _OSQPostOpt + 0x00000000000029ec _OSQQuery + 0x0000000000002b04 _OS_QInit + .text 0x0000000000002b60 0x410 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_sem.o) + 0x0000000000002b60 _OSSemAccept + 0x0000000000002bac OSSemCreate + 0x0000000000002c1c _OSSemDel + 0x0000000000002d38 OSSemPend + 0x0000000000002e18 OSSemPost + 0x0000000000002e8c _OSSemQuery + .text 0x0000000000002f70 0xae0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_task.o) + 0x0000000000002f70 _OSTaskChangePrio + 0x000000000000322c OSTaskCreate + 0x0000000000003314 _OSTaskCreateExt + 0x0000000000003454 _OSTaskDel + 0x0000000000003684 _OSTaskDelReq + 0x0000000000003714 _OSTaskResume + 0x00000000000037dc _OSTaskStkChk + 0x00000000000038c4 _OSTaskSuspend + 0x00000000000039cc _OSTaskQuery + .text 0x0000000000003a50 0x2e0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_time.o) + 0x0000000000003a50 OSTimeDly + 0x0000000000003adc _OSTimeDlyHMSM + 0x0000000000003c30 _OSTimeDlyResume + 0x0000000000003cf4 OSTimeGet + 0x0000000000003d14 _OSTimeSet + .text 0x0000000000003d30 0x68 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_a.o) + 0x0000000000003d30 _OSStartHighRdy + 0x0000000000003d45 _OSCtxSw + 0x0000000000003d4d _OSIntCtxSw + 0x0000000000003d6a _OSTickISR + .text 0x0000000000003d98 0x190 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_c.o) + 0x0000000000003d98 _OSTaskStkInit + 0x0000000000003edc _OSInitHookBegin + 0x0000000000003ee4 _OSInitHookEnd + 0x0000000000003eec _OSTaskCreateHook + 0x0000000000003ef4 _OSTaskDelHook + 0x0000000000003efc _OSTaskSwHook + 0x0000000000003f04 _OSTaskStatHook + 0x0000000000003f0c _OSTCBInitHook + 0x0000000000003f14 _OSTimeTickHook + 0x0000000000003f1c _OSTaskIdleHook + .text 0x0000000000003f28 0x50 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x0000000000003f28 Init_CPU + .text 0x0000000000003f78 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + 0x0000000000004388 IRQ2INT + 0x000000000000439c _GetISR + 0x00000000000043e0 SetISR + 0x0000000000004418 Init_IDT + .text 0x0000000000004518 0x110 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + 0x0000000000004518 Init_CRT + 0x000000000000454c _LastMemoryAddress + .text 0x0000000000004628 0x6e0 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + 0x0000000000004628 SetCursorVisible + 0x00000000000046ac _GetCursorRow + 0x00000000000046c0 _GetCursorCol + 0x00000000000046d4 SetCursorPosition + 0x0000000000004778 ClearScreen + 0x00000000000047e0 _PutAttb + 0x000000000000482c _PutCharAt + 0x0000000000004858 _PutChar + 0x00000000000048dc PutString + 0x0000000000004914 PutUnsigned + 0x000000000000494c FormatUnsigned + 0x00000000000049dc Unsigned2Ascii + 0x0000000000004a60 _Cell + .text 0x0000000000004d08 0xe0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + 0x0000000000004d08 Init8259 + .text 0x0000000000004de8 0xb0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + 0x0000000000004de8 Init8253 + .text 0x0000000000004e98 0x660 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + 0x0000000000004e98 malloc + 0x0000000000004f4c free + .text 0x00000000000054f8 0x600 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + 0x00000000000054fc WindowCreate + 0x00000000000055e4 _WindowErase + 0x0000000000005654 WindowSelect + 0x0000000000005678 WindowSetCursor + 0x00000000000056a8 WindowPutChar + 0x0000000000005788 WindowPutString + .text 0x0000000000005af8 0x98 /courses/TDDI11/sw/lib/elf/libepc.a(checkcpu.o) + 0x0000000000005af8 Check_CPU + .text 0x0000000000005b90 0x60 /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x0000000000005b90 TimerTickISR + 0x0000000000005b9c KeyboardISR + 0x0000000000005bbc ISR_PIC1 + 0x0000000000005bc3 ISR_PIC2 + 0x0000000000005bcc ___main + 0x0000000000005bcd inportb + 0x0000000000005bd7 outportb + 0x0000000000005be9 _exit + .text 0x0000000000005bf0 0x570 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + 0x0000000000005bf0 ScanCodeRdy + 0x0000000000005c14 GetScanCode + 0x0000000000005c44 ScanCode2Ascii + 0x0000000000005e04 SetsKybdState + 0x0000000000005ff4 Enqueue + .text 0x0000000000006160 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + .text 0x0000000000006160 0x1c /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + 0x0000000000006160 _memcpy + .text 0x000000000000617c 0x40 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memset.o) + 0x000000000000617c _memset + .text 0x00000000000061bc 0x28 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + 0x00000000000061bc _strcpy + .text 0x00000000000061e4 0x24 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + 0x00000000000061e4 _strlen + .text 0x0000000000006208 0x10 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + 0x0000000000006208 disable + .text 0x0000000000006218 0x10 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + 0x0000000000006218 enable + .text 0x0000000000006228 0x28 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + 0x0000000000006228 ___dj_movedata + 0x000000000000624f text_last = (. - 0x1) + +.data 0x0000000000006250 0x8ea + 0x0000000000006250 data_frst = . + *(.data) + .data 0x0000000000006250 0x0 main.o + .data 0x0000000000006250 0x0 serial.o + .data 0x0000000000006250 0x0 inbound.o + .data 0x0000000000006250 0x1 outbound.o + *fill* 0x0000000000006251 0x3 + .data 0x0000000000006254 0xb elapsed.o + .data 0x000000000000625f 0x0 packet.o + *fill* 0x000000000000625f 0x1 + .data 0x0000000000006260 0x0 isr.o + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_flag.o) + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_mem.o) + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_q.o) + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_sem.o) + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_task.o) + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_time.o) + .data 0x0000000000006260 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_a.o) + .data 0x0000000000006260 0x10 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_c.o) + .data 0x0000000000006270 0x20 /courses/TDDI11/sw/lib/elf/libepc.a(init-cpu.o) + 0x000000000000628e code_selector + .data 0x0000000000006290 0x90 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .data 0x0000000000006320 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .data 0x0000000000006330 0x30 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .data 0x0000000000006360 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .data 0x0000000000006360 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .data 0x0000000000006360 0x10 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + .data 0x0000000000006370 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + .data 0x0000000000006370 0xc /courses/TDDI11/sw/lib/elf/libepc.a(io.o) + 0x0000000000006370 msec + 0x0000000000006374 old_tick_isr + 0x0000000000006378 old_kybd_isr + .data 0x000000000000637c 0x5a0 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .data 0x000000000000691c 0x204 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + 0x000000000000691c __dj_ctype_flags + .data 0x0000000000006b20 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + .data 0x0000000000006b20 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memset.o) + .data 0x0000000000006b20 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + .data 0x0000000000006b20 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + .data 0x0000000000006b20 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + .data 0x0000000000006b20 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + .data 0x0000000000006b20 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + *(.rodata) + .rodata 0x0000000000006b20 0x7 inbound.o + .rodata 0x0000000000006b27 0x6 outbound.o + .rodata 0x0000000000006b2d 0xd elapsed.o + *(.rodata.str1.1) + *(.rodata.str1.32) + 0x0000000000006b39 data_last = (. - 0x1) + +.bss 0x0000000000006b40 0x2354 + 0x0000000000006b40 bss_frst = . + *(.bss) + .bss 0x0000000000006b40 0x0 main.o + .bss 0x0000000000006b40 0x70 serial.o + 0x0000000000006b40 com1_queue + *fill* 0x0000000000006bb0 0x10 + .bss 0x0000000000006bc0 0x70 inbound.o + *fill* 0x0000000000006c30 0x10 + .bss 0x0000000000006c40 0x70 outbound.o + 0x0000000000006c40 kybd_queue + *fill* 0x0000000000006cb0 0x10 + .bss 0x0000000000006cc0 0x80 elapsed.o + .bss 0x0000000000006d40 0x0 packet.o + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_flag.o) + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_mem.o) + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_q.o) + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_sem.o) + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_task.o) + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_time.o) + .bss 0x0000000000006d40 0x0 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_c.o) + .bss 0x0000000000006d40 0x800 /courses/TDDI11/sw/lib/elf/libepc.a(init-idt.o) + .bss 0x0000000000007540 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init-crt.o) + .bss 0x0000000000007540 0x8 /courses/TDDI11/sw/lib/elf/libepc.a(display.o) + .bss 0x0000000000007548 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8259.o) + .bss 0x0000000000007548 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(init8253.o) + .bss 0x0000000000007548 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(heap.o) + .bss 0x0000000000007548 0x0 /courses/TDDI11/sw/lib/elf/libepc.a(window.o) + .bss 0x0000000000007548 0x34 /courses/TDDI11/sw/lib/elf/libepc.a(keyboard.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(ct_flags.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memcpy.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(memset.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strcpy.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(strlen.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(disable.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(enable.o) + .bss 0x000000000000757c 0x0 /courses/TDDI11/sw/lib/elf/djgpp/libc.a(djmd.o) + *(COMMON) + COMMON 0x000000000000757c 0x4 packet.o + 0x000000000000757c sendPacketSema + COMMON 0x0000000000007580 0x190c /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_core.o) + 0x0000000000007580 _OSTaskCtr + 0x0000000000007584 _OSTCBCur + 0x0000000000007588 _OSCtxSwCtr + 0x000000000000758c _OSTCBList + 0x0000000000007590 _OSTCBHighRdy + 0x0000000000007594 _OSQTbl + 0x000000000000760c _OSRdyTbl + 0x0000000000007614 _OSTaskIdleStk + 0x0000000000007e14 _OSEventTbl + 0x0000000000007eb4 _OSTCBFreeList + 0x0000000000007eb8 _OSRdyGrp + 0x0000000000007ebc _OSIntExitY + 0x0000000000007ec0 _OSPrioCur + 0x0000000000007ec4 _OSQFreeList + 0x0000000000007ec8 _OSIdleCtr + 0x0000000000007ecc _OSRunning + 0x0000000000007ed0 _OSMemTbl + 0x0000000000007f34 _OSPrioHighRdy + 0x0000000000007f38 _OSTCBPrioTbl + 0x0000000000008038 _OSLockNesting + 0x000000000000803c _OSTime + 0x0000000000008040 _OSFlagTbl + 0x000000000000807c _OSTCBTbl + 0x0000000000008e7c _OSIntNesting + 0x0000000000008e80 _OSEventFreeList + 0x0000000000008e84 _OSMemFreeList + 0x0000000000008e88 _OSFlagFreeList + COMMON 0x0000000000008e8c 0x8 /courses/TDDI11/sw/lib/elf/ucos_ii.a(os_cpu_c.o) + 0x0000000000008e8c _OldTickISR + 0x0000000000008e90 _OSTickDOSCtr + 0x0000000000008e93 bss_last = (. - 0x1) + +/DISCARD/ + *(.eh_frame) + 0x0000000000008e94 stack_frst = (bss_last + 0x1) + 0x0000000000010e93 stack_last = (bss_last + 0x8000) + 0x0000000000010e94 heap_frst = (stack_last + 0x1) +OUTPUT(embedded.bin binary) + +.debug_info 0x0000000000000000 0x2aec + .debug_info 0x0000000000000000 0x657 main.o + .debug_info 0x0000000000000657 0x6b8 serial.o + .debug_info 0x0000000000000d0f 0x72b inbound.o + .debug_info 0x000000000000143a 0x7a7 outbound.o + .debug_info 0x0000000000001be1 0x859 elapsed.o + .debug_info 0x000000000000243a 0x6b2 packet.o + +.debug_abbrev 0x0000000000000000 0x89e + .debug_abbrev 0x0000000000000000 0x12a main.o + .debug_abbrev 0x000000000000012a 0x15d serial.o + .debug_abbrev 0x0000000000000287 0x178 inbound.o + .debug_abbrev 0x00000000000003ff 0x173 outbound.o + .debug_abbrev 0x0000000000000572 0x1b9 elapsed.o + .debug_abbrev 0x000000000000072b 0x173 packet.o + +.debug_aranges 0x0000000000000000 0xc0 + .debug_aranges + 0x0000000000000000 0x20 main.o + .debug_aranges + 0x0000000000000020 0x20 serial.o + .debug_aranges + 0x0000000000000040 0x20 inbound.o + .debug_aranges + 0x0000000000000060 0x20 outbound.o + .debug_aranges + 0x0000000000000080 0x20 elapsed.o + .debug_aranges + 0x00000000000000a0 0x20 packet.o + +.debug_line 0x0000000000000000 0x564 + .debug_line 0x0000000000000000 0xc5 main.o + .debug_line 0x00000000000000c5 0xe2 serial.o + .debug_line 0x00000000000001a7 0xaa inbound.o + .debug_line 0x0000000000000251 0x127 outbound.o + .debug_line 0x0000000000000378 0x118 elapsed.o + .debug_line 0x0000000000000490 0xd4 packet.o + +.debug_str 0x0000000000000000 0x1e6e + .debug_str 0x0000000000000000 0x4da main.o + .debug_str 0x00000000000004da 0x502 serial.o + .debug_str 0x00000000000009dc 0x4f4 inbound.o + .debug_str 0x0000000000000ed0 0x576 outbound.o + .debug_str 0x0000000000001446 0x54d elapsed.o + .debug_str 0x0000000000001993 0x4db packet.o + +.comment 0x0000000000000000 0x6c + .comment 0x0000000000000000 0x12 main.o + .comment 0x0000000000000012 0x12 serial.o + .comment 0x0000000000000024 0x12 inbound.o + .comment 0x0000000000000036 0x12 outbound.o + .comment 0x0000000000000048 0x12 elapsed.o + .comment 0x000000000000005a 0x12 packet.o diff --git a/chap7/main.c b/chap7/main.c new file mode 100644 index 0000000..5e843c4 --- /dev/null +++ b/chap7/main.c @@ -0,0 +1,45 @@ +#include <os_cpu.h> +#include <os_cfg.h> +#include <ucos_ii.h> /* os_c??.h must be included before ! */ +#include <libepc.h> +#include <dos.h> + +#include "inbound.h" +#include "elapsed.h" +#include "packet.h" + +#define STACK_SIZE 1000 + +extern void OutboundThread() ; + +PRIVATE OS_STK *CreateStack(void) +{ + OS_STK *top = (OS_STK *) malloc(STACK_SIZE) + STACK_SIZE ; + + if (!top) + { + for (;;) + ; + } + return top ; +} + +int main() +{ + ClearScreen(0x07) ; + SetCursorVisible(TRUE) ; + + + OSInit() ; + + PacketInit(); //Init sema for sendPacket + + OSTaskCreate(ReceivePackets, NULL, CreateStack(), 0) ; + OSTaskCreate(InboundTime, NULL, CreateStack(), 1) ; + OSTaskCreate(InboundText, NULL, CreateStack(), 2) ; + OSTaskCreate(OutboundThread, NULL, CreateStack(), 3) ; + OSTaskCreate(ElapsedLocal, NULL, CreateStack(), 4) ; + OSStart() ; + + return 0 ; +} diff --git a/chap7/main.o b/chap7/main.o new file mode 100644 index 0000000000000000000000000000000000000000..fe35320b136ef763b396fa414a0555c19a15540f GIT binary patch literal 6396 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 D>C6#4 literal 0 HcmV?d00001 diff --git a/chap7/makeNrun.sh b/chap7/makeNrun.sh new file mode 100644 index 0000000..2ff6f5a --- /dev/null +++ b/chap7/makeNrun.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +clear +echo "This script includes commands to make the project and run it" + +echo "clean up the directory with make clean" +make clean +echo "make the project with make." +make +echo "Guiding mtools mcopy to its configuration file" +export MTOOLSRC=mtools.conf +echo "Copying the binary to floppy image" +mcopy embedded.bin a: +echo "Duplicating the floppy image" +cp floppy.img floppy_copy.img + +#echo "We assume port 50152 is free. Check below, if it is not free, select another port" +#netstat | grep ":50152" + +echo "Proceeding with port 50152 on localhost=127.0.0.1" +echo "Starting Qemu with given binary in the floppy image, as server" +qemu-system-i386 -drive format=raw,file=floppy.img,if=floppy -serial tcp:127.0.0.1:50152,server,nowait & +echo "Starting another Qemu with given binary in the floppy image, as client. Wait a second for server to connect" +sleep 1 +qemu-system-i386 -drive format=raw,file=floppy_copy.img,if=floppy -serial tcp:127.0.0.1:50152 & diff --git a/chap7/mtools.conf b/chap7/mtools.conf new file mode 100644 index 0000000..c387b85 --- /dev/null +++ b/chap7/mtools.conf @@ -0,0 +1,6 @@ +MTOOLS_NO_VFAT=1 +drive a: + file="floppy.img" + fat_bits=12 + cylinders=80 heads=2 sectors=18 + mformat_only diff --git a/chap7/outbound.c b/chap7/outbound.c new file mode 100644 index 0000000..ad26d09 --- /dev/null +++ b/chap7/outbound.c @@ -0,0 +1,80 @@ +#include <os_cpu.h> +#include <os_cfg.h> +#include <ucos_ii.h> /* os_c??.h must be included before ! */ +#include <libepc.h> +#include <ctype.h> +#include <dos.h> + +#include "packet.h" +#include "serial.h" + +OS_EVENT *kybd_queue = NULL ; +void OSKeyboardISR(void) ; + +PRIVATE void KeyboardInit(void) ; + +void OutboundThread(void) +{ + WINDOW *local ; + + /* INITIALIZATION: Paint the local window. Create a */ + /* mailbox object to receive keystroke codes from the */ + /* keyboard ISR. Initialize the keyboard hardware. */ + /* Point interrupt vector 33 at the keyboard ISR. */ + /* Unmask the IRQ line in the 8259 PIC. */ + + local = WindowCreate("Local", 0, 10, 0, 79) ; + KeyboardInit() ; + /* SerialInit have a guard inside to prevent multiple initializations */ + SerialInit() ; + + for (;;) + { + BYTE8 err, scan_code ; + char ascii ; + + /* Suspend this thread (let it "sleep") until a */ + /* keyboard interrupt posts something to our */ + /* mailbox. But first position the cursor */ + /* at the next character position as a prompt. */ + + WindowSelect(local) ; + scan_code = ((unsigned) OSQPend(kybd_queue, 0, &err)) & 0xFF ; + if (scan_code & 0x80) + continue ; /* Key up */ + + /* The keyboard ISR just woke us up. scan_code */ + /* is the keystroke that occurred. First check */ + /* to see if it simply changes state, like caps */ + /* lock, shift, ctrl, or alt. Then convert the */ + /* scancode to ascii using the current state. */ + + if (SetsKybdState(scan_code)) + continue ; + + ascii = ScanCode2Ascii(scan_code) & 0xFF ; + if (!isprint(ascii) && !iscntrl(ascii)) + continue ; + + /* Display the character in the local window. */ + + WindowPutChar(local, ascii) ; + + SendPacket(1, &ascii, 1) ; + if (ascii == '\r') + { + static char linefeed = '\n' ; + WindowPutChar(local, linefeed) ; + SendPacket(1, &linefeed, 1) ; + } + } +} + +PRIVATE void KeyboardInit(void) +{ + static void *q[20] ; + + kybd_queue = OSQCreate(q, ENTRIES(q)) ; + SetISR(IRQ2INT(IRQ_KYBD), OSKeyboardISR) ; + outportb(0x21, inportb(0x21) & ~0x02) ; +} diff --git a/chap7/outbound.o b/chap7/outbound.o new file mode 100644 index 0000000000000000000000000000000000000000..2fe0e0b3de6bd98a2a59eee4ef19a5ca5f845912 GIT binary patch literal 7724 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 literal 0 HcmV?d00001 diff --git a/chap7/packet.c b/chap7/packet.c new file mode 100644 index 0000000..6019f24 --- /dev/null +++ b/chap7/packet.c @@ -0,0 +1,79 @@ +#include <os_cpu.h> +#include <os_cfg.h> +#include <ucos_ii.h> /* os_c??.h must be included before ! */ +#include <libepc.h> + +#include "inbound.h" +#include "elapsed.h" +#include "serial.h" + +OS_EVENT *sendPacketSema; + +void PacketInit(void) +{ + sendPacketSema = OSSemCreate(1); +} + +void ReceivePackets(void) +{ + SerialInit() ; + + for (;;) + { + int type, byte, bytes ; + BYTE8 *bfr ; + + if (SerialGet() != 0xFF) + continue ; + + switch (type = SerialGet()) + { + default: + continue ; + case 1: + case 2: + break ; + } + + bytes = SerialGet(); + bfr = (BYTE8 *) malloc(bytes) ; + if (!bfr) + { + for (;;) + ; + } + + for (byte = 0; byte < bytes; byte++) + { + bfr[byte] = SerialGet() ; + } + switch (type) + { + case 1: + PostText(bfr) ; + break ; + case 2: + PostTime(bfr) ; + break ; + } + } +} + + +void SendPacket(int type, BYTE8 *bfr, int bytes) +{ + + OSSemPend(sendPacketSema, 0, NULL); + + SerialPut(0xFF); + SerialPut((char)type); + SerialPut((char)bytes); + + for(int i = 0; i < bytes; ++i) + { + SerialPut((char)*(bfr + i)); + } + + OSSemPost(sendPacketSema); + +} diff --git a/chap7/packet.h b/chap7/packet.h new file mode 100644 index 0000000..636ff7b --- /dev/null +++ b/chap7/packet.h @@ -0,0 +1,6 @@ + + +void PacketInit(void); + +void ReceivePackets() ; +void SendPacket(int type, BYTE8 *bfr, int bytes) ; diff --git a/chap7/packet.o b/chap7/packet.o new file mode 100644 index 0000000000000000000000000000000000000000..9f6ce849e1534f084b774b78e803d6d484fb5746 GIT binary patch literal 6748 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 IKp3VD06d3ocmMzZ literal 0 HcmV?d00001 diff --git a/chap7/serial.c b/chap7/serial.c new file mode 100644 index 0000000..146a876 --- /dev/null +++ b/chap7/serial.c @@ -0,0 +1,67 @@ +#include <os_cpu.h> +#include <os_cfg.h> +#include <ucos_ii.h> /* os_c??.h must be included before ! */ +#include <libepc.h> +#include <dos.h> +#include <pc.h> + +#include "serial.h" + +void OSSerialISR(void) ; + +OS_EVENT *com1_queue = NULL ; + +BYTE8 SerialGet(void) +{ + char err ; + return ((unsigned) OSQPend(com1_queue, 0, &err)) & 0xFF ; +} + +void SerialPut(char ch) +{ + /* This function uses programmed waiting loop I/O */ + /* to output the ASCII character 'ch' to the UART. */ + + while ((inportb(SER_LSR) & SER_LSR_THRE) == 0) + { + OSTimeDly(1) ; + } + + outportb(SER_THR, ch) ; +} + +void SerialInit(void) +{ + static void *com1_q[20] ; + + if (com1_queue) + return ; + + com1_queue = OSQCreate(com1_q, ENTRIES(com1_q)) ; + + disable() ; + + outportb(SER_IER, 0x00) ; + + /* Setup for 38400 baud */ + outportb(SER_LCR, SER_LCR_DLAB) ; + outportb(SER_DLO, 3) ; + outportb(SER_DHI, 0) ; + + /* 8 data bits, no parity, 1 stop bit */ + outportb(SER_LCR, 0x03) ; + + /* Set FIFO to trigger at 14 */ + outportb(SER_FCR, 0xC7) ; + + /* Request to send, data terminal ready, enable interrupts */ + outportb(SER_MCR, SER_MCR_RTS|SER_MCR_DTR|SER_MCR_OUT2) ; + + /* Enable only receiver data ready interrupts */ + outportb(SER_IER, 0x01) ; + + SetISR(IRQ2INT(IRQ_COM1_COM3), OSSerialISR) ; + outportb(0x21, inportb(0x21) & ~SER_MSK) ; + + enable() ; +} diff --git a/chap7/serial.h b/chap7/serial.h new file mode 100644 index 0000000..f678b0e --- /dev/null +++ b/chap7/serial.h @@ -0,0 +1,30 @@ +#define BASE_PORT 0x3F8 + +#define SER_MSK 0x10 /* PIC mask bit for IRQ 4 */ +#define SER_BASE 0x3F8 /* Base port address for COM1 */ + +#define SER_THR SER_BASE /* Transmitter Holding Register */ +#define SER_RBR SER_BASE /* Receiver Buffer Register */ +#define SER_DLO SER_BASE /* Baud Rate Divisor Low */ +#define SER_DHI (SER_BASE+1) /* Baud Rate Divisor High */ +#define SER_IER (SER_BASE+1) /* Interrupt Enable Register */ +#define SER_IIR (SER_BASE+2) /* Interrupt Identification Reg */ +#define SER_FCR (SER_BASE+2) /* FIFO Control Register */ +#define SER_LCR (SER_BASE+3) /* Line Control Register */ +#define SER_MCR (SER_BASE+4) /* Modem Control Register */ +#define SER_LSR (SER_BASE+5) /* Line Status Register */ +#define SER_MSR (SER_BASE+6) /* Modem Status Register */ +#define SER_SCR (SER_BASE+7) /* Scratch Register */ + +#define SER_LSR_THRE 0x20 /* Trans. Hold. Reg. Empty */ +#define SER_LSR_RBF 0x01 /* Receiver Buffer Full */ + +#define SER_LCR_DLAB 0x80 /* Divisor Latch Address Bit */ + +#define SER_MCR_DTR 0x01 /* Data Terminal Ready */ +#define SER_MCR_RTS 0x02 /* Request To Send */ +#define SER_MCR_OUT2 0x08 /* Interrupt Enable */ + +void SerialInit(void) ; +BYTE8 SerialGet(void) ; +void SerialPut(char) ; diff --git a/chap7/serial.o b/chap7/serial.o new file mode 100644 index 0000000000000000000000000000000000000000..cfc547b6d9f54ae7f683cf04d3d554d54f04128c GIT binary patch literal 6928 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 literal 0 HcmV?d00001 -- GitLab