├── .gitignore ├── README.md ├── doc ├── Report.pdf └── Slides.pdf ├── programs ├── Makefile ├── assemble_arm ├── assemble_x86 ├── chess.s └── pieces │ ├── Makefile │ ├── ascii │ ├── bishop_as.txt │ ├── game_over_as.txt │ ├── king_as.txt │ ├── knight_as.txt │ ├── pawn_as.txt │ ├── queen_as.txt │ └── rook_as.txt │ ├── images │ ├── bishop_hi.png │ ├── game_over.png │ ├── king_hi.png │ ├── knight_hi.png │ ├── pawn_hi.png │ ├── queen_hi.png │ └── rook_hi.png │ └── out │ └── about.txt └── src ├── Makefile ├── chess_core_draft.c └── dcd_gen.c /.gitignore: -------------------------------------------------------------------------------- 1 | #This the the canonical lab .gitignore file 2 | 3 | #ignore temp files 4 | *~ 5 | 6 | #ignore junk files from latex output 7 | *.out 8 | *.log 9 | *.aux 10 | *.dvi 11 | *.ps 12 | 13 | #ignore junk files from compiling C code 14 | *.o 15 | dcd_gen 16 | 17 | #ignore junk files from Eclipse projects 18 | .cproject 19 | .project 20 | .settings 21 | 22 | #ignore junk files from compiling Haskell code 23 | *.hi 24 | 25 | #ignore junk files from compiling Java code 26 | *.class 27 | 28 | #ignore other junk files 29 | *.backup 30 | *.kate-swp 31 | *.swp 32 | *.snm 33 | *.vrb 34 | *.nav 35 | *.toc 36 | 37 | #ignore kernel file 38 | kernel.img 39 | 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | assembly_chess 2 | ============== 3 | 4 | An assembler for assembling a fully working bare metal assembly chess game 5 | for the Raspberry Pi. 6 | 7 | Created by Xu Ji, Bora Mollamustafaoglu, Gun Pinyo (Imperial College London) 8 | {xj1112, bm1212, gp1712}@imperial.ac.uk 9 | 10 | 11 | The assembler, dcd_gen program and chess game were created as part of 12 | our first year C project. Feel free to check out our report, which was submitted 13 | as part of the assessment, and the slides used in the formal presentation, both 14 | included in this repo. A brief demo of the game can be found here: 15 | www.youtube.com/watch?v=-03bouPsfEQ 16 | 17 | The programs directory contains the assembly programs and assembler binary, and 18 | the src directory contains dcd_gen. 19 | 20 | To set up the chess game on your own Pi, you will need to first go into the 21 | programs directory and "make chess", which will use the assembler to assemble the 22 | chess game. The binary file kernel.img, which is created in the programs 23 | directory during the make, can then be loaded onto your SD card and inserted 24 | into the Pi. 25 | 26 | Your SD card should have been formatted and freshly installed with Raspbian OS. 27 | You should then overwrite it by replacing kernel.img inside the boot partition 28 | with the kernel.img you just created. 29 | 30 | In addition to a Pi and an SD card you will also need a screen which can be 31 | connected to the Pi using a HDMI cable, and six momentary push buttons wired up 32 | to the GPIO pins of the Pi in the following fashion: 33 | 34 | GPIO18 = left 35 | GPIO4 = down 36 | GPIO23 = up 37 | GPIO17 = right 38 | GPIO22 = select 39 | GPIO27 = reset (restarts the game) 40 | 41 | For this setup we also used a breadboard, 6 10K Ohm resistors, 6 1K Ohm resistors 42 | and several male-female and male-male jumper wires. 43 | 44 | Ideally you will have either an x86 or Pi to assemble the chess game on. If you 45 | take a look at the Makefile inside the programs directory, you can see that we 46 | only detect x86 and ARM architectures. We'd like to make our assembler source 47 | code public to get rid of these compatibility issues, but that would be unfair 48 | on next year's first years if they get the same assignment. So for now only the 49 | ARM and Intel binary for the assembler is on here. 50 | 51 | -------------------------------------------------------------------------------- /doc/Report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xu-ji/assembly_chess/6b12a93961c9c2a6111c62108a0e277f85757d96/doc/Report.pdf -------------------------------------------------------------------------------- /doc/Slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xu-ji/assembly_chess/6b12a93961c9c2a6111c62108a0e277f85757d96/doc/Slides.pdf -------------------------------------------------------------------------------- /programs/Makefile: -------------------------------------------------------------------------------- 1 | .SUFFIXES: 2 | ARCH := $(shell uname -m | sed -e s/.*86.*/x86/ -e s/arm.*/arm/ -e s/sa110/arm/) 3 | ifeq ($(ARCH), arm) 4 | AS = ./assemble_arm 5 | else 6 | AS = ./assemble_x86 7 | endif 8 | KERNEL = kernel.img 9 | 10 | %.o: %.s 11 | $(AS) $< $@ 12 | cp $@ $(KERNEL) 13 | 14 | chess: chess.o 15 | 16 | clean: 17 | rm -f $(wildcard *.o) 18 | rm -f kernel.img 19 | 20 | .PHONY: clean 21 | -------------------------------------------------------------------------------- /programs/assemble_arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xu-ji/assembly_chess/6b12a93961c9c2a6111c62108a0e277f85757d96/programs/assemble_arm -------------------------------------------------------------------------------- /programs/assemble_x86: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xu-ji/assembly_chess/6b12a93961c9c2a6111c62108a0e277f85757d96/programs/assemble_x86 -------------------------------------------------------------------------------- /programs/pieces/Makefile: -------------------------------------------------------------------------------- 1 | DCD=../../src/dcd_gen 2 | 3 | PIECES=king queen bishop knight rook pawn game_over 4 | all: 5 | $(foreach var,$(PIECES),$(DCD) ascii/$(var)_as.txt out/$(var).out;) 6 | 7 | clean: 8 | rm out/*.out 9 | 10 | .PHONY: all clean 11 | -------------------------------------------------------------------------------- /programs/pieces/ascii/bishop_as.txt: -------------------------------------------------------------------------------- 1 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 2 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 3 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 4 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 5 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 6 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 7 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 8 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 9 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 10 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 11 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 12 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 13 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 14 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWWW WWWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 15 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 16 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 17 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 18 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 19 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 20 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 21 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 22 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 23 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 24 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 25 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 26 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 27 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 28 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 29 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 30 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 31 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 32 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 33 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 34 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 35 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW||||||||||||||WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 36 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 37 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW-~~~~~~~~-~~~~WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 38 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWWW WWWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 39 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW~~~~~~~~~~-~~~~~~WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 40 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 41 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQWW~~~~~~~~~~~~-~~~~~~~WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 42 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 43 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 44 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 45 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQWWWW_________________WWWWQQQQQQQQQQQQQQQQQQQQQQQQQQQ 46 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 47 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 48 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 49 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 50 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 51 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 52 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 53 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 54 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 55 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 56 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 57 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 58 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 59 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 60 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 61 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 62 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQWWW__________________WWWQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 63 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 64 | QQQQQQQQQQQQQQQQQQQQQQQQQQWWW______________________WWWQQQQQQQQQQQQQQQQQQQQQQQQQQ 65 | QQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQ 66 | QQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQ 67 | QQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQ 68 | QQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQ 69 | QQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQ 70 | QQQQQQQQQQQQQQQQQQQQQQQQQWW WWQQQQQQQQQQQQQQQQQQQQQQQQQ 71 | QQQQQQQQQQQQQQQQQQQQQQQQW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-WWQQQQQQQQQQQQQQQQQQQQQQQ 72 | QQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQ 73 | QQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQ 74 | QQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQ 75 | QQQQQQQQQQQQQQQQQQQQQQQQW_______________________________WQQQQQQQQQQQQQQQQQQQQQQQ 76 | QQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQQQQQQQQQQQQQQQQQQQQQ 77 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 78 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 79 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 80 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 81 | -------------------------------------------------------------------------------- /programs/pieces/ascii/king_as.txt: -------------------------------------------------------------------------------- 1 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 2 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 3 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 4 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 5 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 6 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 7 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 8 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 9 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 10 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 11 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 12 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWWAWW WWWWWWWWWWQQQQQQQQQQQQQQQQQQQQQQQQQQQ 13 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 14 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 15 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 16 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 17 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 18 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWWWWW WWWWWWWWWWQQQQQQQQQQQQQQQQQQQQQQQQQQQ 19 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 20 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 21 | QQQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWWWWWWW WWWWWWWWWWWWQQQQQQQQQQQQQQQQQQQQQQQQQ 22 | QQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQ 23 | QQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQ 24 | QQQQQQQQQQQQQQQQQQQQQQQQQQQW jQQQQQQQQQQQQQQQQQQQQQQQQQQ 25 | QQQQQQQQQQQQQQQQQQQQQQQQQQQW mQQQQQQQQQQQQQQQQQQQQQQQQQQ 26 | QQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQ 27 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 28 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW mQQQQQQQQQQQQQQQQQQQQQQQQQQQ 29 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQ 30 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQWW jQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 31 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQW mQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 32 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQW WQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 33 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ; jQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 34 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ[-------------~----^4QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 35 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQc jQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 36 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ( 4QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 37 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ?(___________________)YQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 38 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQf mQQQQQQQQQQQQQQQQQQQQQQQQQQQ 39 | QQQQQQQQQQQQQQQQQQQQQQQQQQ@"~------~-~--~-~-------~-"?QQQQQQQQQQQQQQQQQQQQQQQQQQ 40 | QQQQQQQQQQQQQQQQQQQQQQQQQQk .QQQQQQQQQQQQQQQQQQQQQQQQQQ 41 | QQQQQQQQQQQQQQQQQQQQQQQQQQk .QQQQQQQQQQQQQQQQQQQQQQQQQQ 42 | QQQQQQQQQQQQQQQQQQQQQQQQQQm =QQQQQQQQQQQQQQQQQQQQQQQQQQ 43 | QQQQQQQQQQQQQQQQQQQQQQQQQQWmQQk-~-------------~-~ 3QQQQQQQQQQQQQQQQQQQQQQ 72 | QQQQQQQQQQQQQQQQQQQQQQQ( jQQQQQQQQQQQQQQQQQQQQQQ 73 | QQQQQQQQQQQQQQQQQQQQQQQ( jQQQQQQQQQQQQQQQQQQQQQQ 74 | QQQQQQQQQQQQQQQQQQQQQQQnsssssaassaaaaaaaaaaaaaaaaAAAAaaaamQQQQQQQQQQQQQQQQQQQQQQ 75 | QQQQQQQQQQQQQQQQQQQQQQQQWWWWWWmWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQQQQQQQQQQQQQQQQQQQQ 76 | QQQQQQQQQQQQQQQQQQQQQQQQQWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQQQQQQQQQQQQQQQQQQQQQ 77 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 78 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 79 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 80 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 81 | -------------------------------------------------------------------------------- /programs/pieces/ascii/knight_as.txt: -------------------------------------------------------------------------------- 1 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 2 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 3 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 4 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 5 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 6 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 7 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 8 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ@""4QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 9 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ' )WQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 10 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ[ )$QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 11 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQP )>?WWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 12 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ@` )( ?QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 13 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQW' -' "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 14 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQf "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 15 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQE "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 16 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ@` "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 17 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ' "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 18 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQf )QQQQQQQQQQQQQQQQQQQQQQQQQQQQ 19 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQP )QQQQQQQQQQQQQQQQQQQQQQQQQQQ 20 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ@` +QQQQQQQQQQQQQQQQQQQQQQQQQQ 21 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ' +QQQQQQQQQQQQQQQQQQQQQQQQQ 22 | QQQQQQQQQQQQQQQQQQQQQQQQQQQQ[ )QQQQQQQQQQQQQQQQQQQQQQQQ 23 | QQQQQQQQQQQQQQQQQQQQQQQQQQQP "QQQQQQQQQQQQQQQQQQQQQQQ 24 | QQQQQQQQQQQQQQQQQQQQQQQQQQ@` dQQQQQQQQQQQQQQQQQQQQQQ 25 | QQQQQQQQQQQQQQQQQQQQQQQQQQ' 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | typedef uint8_t bool_t; 8 | typedef uint8_t byte_t; 9 | typedef int8_t signed_byte_t; 10 | 11 | #define FALSE 0 12 | #define TRUE 1 13 | 14 | #define BOARD_SIZE (8*8) 15 | #define BOARD_ROW 8 16 | #define BOARD_COL 8 17 | 18 | #define PIECE_S 0 // piece space 19 | #define PIECE_P 1 // piece pawn 20 | #define PIECE_H 2 // piece knight(horse) 21 | #define PIECE_B 3 // piece bishop 22 | #define PIECE_R 4 // piece rook 23 | #define PIECE_Q 5 // piece queen 24 | #define PIECE_K 6 // piece king 25 | 26 | #define BYTE_UNDEFINED 0xFF 27 | 28 | bool_t cur_player; // 0 = white player // 1 = black player 29 | bool_t has_selected; // has current player select a piece. 30 | bool_t is_clicked; // is user click on this iteration 31 | 32 | byte_t en_passant_flag; // capture col of the pawn that move 2 block last turn 33 | byte_t castle_flag; // remember that have each rook and king ever moved before 34 | // bit 0 = white_rook_left, 4 = white_king, 1 = white_rook_right 35 | // bit 2 = black_rook_left, 5 = black_king, 3 = black_rook_right 36 | 37 | byte_t selected_pos; // if has_selected then it is position of selected piece 38 | byte_t current_pos; // position of current click 39 | 40 | byte_t* cells_type; // must be one of PIECE_? 41 | bool_t* are_marked; // is this cell legal to move by selected piece 42 | bool_t* cells_side; // 0 = fst player side // 1 = snd player side 43 | // if cells_type[i] = PIECE_S then cells_side[i] is meaningless 44 | 45 | void display(); 46 | void manage_input(); 47 | byte_t promote_pawn(); 48 | void game_over(); 49 | void initialise(); 50 | bool_t is_game_over(bool_t player_id); 51 | void process(); 52 | bool_t is_in_check(bool_t player_id, byte_t src_pos, byte_t des_pos); 53 | bool_t legal_move(byte_t src_pos, byte_t des_pos, bool_t update); 54 | bool_t is_own_piece(byte_t target_pos); 55 | bool_t is_path_clear(byte_t src_pos, byte_t des_pos 56 | , bool_t enable_horizontal_vertical, bool_t enable_digonal); 57 | void actual_move(byte_t src_pos, byte_t des_pos); 58 | byte_t to_pos(byte_t row, byte_t col); 59 | byte_t absolute(signed_byte_t number); 60 | 61 | int main() { 62 | while(1) { 63 | initialise(); 64 | while(!is_game_over(cur_player)) { 65 | display(); 66 | manage_input(); 67 | if(is_clicked) 68 | process(); 69 | } 70 | display(); 71 | game_over(); 72 | } 73 | } 74 | 75 | //--------------------------------- I/O part ---------------------------------// 76 | void display() { 77 | const byte_t CELL_ROW = 6; 78 | const byte_t CELL_COL = 14; 79 | 80 | char img[7][5][10] = {{" " 81 | ," " 82 | ," " 83 | ," " 84 | ," "} 85 | 86 | ,{" " 87 | ," " 88 | ," " 89 | ," @@@@@ " 90 | ," @@@@@ "} 91 | 92 | ,{" @@@@@ " 93 | ," @@ @@ " 94 | ," @@ @@ " 95 | ," @@ " 96 | ," @@@@@@@ "} 97 | 98 | ,{" @ " 99 | ," @@ @@ " 100 | ," @@@ " 101 | ," @ " 102 | ," @@@@@@@ "} 103 | 104 | ,{"@@ @@@ @@" 105 | ,"@@@@@@@@@" 106 | ," @@@ " 107 | ," @@@ " 108 | ," @@@@@@@ "} 109 | 110 | ,{"@@ @@@ @@" 111 | ,"@@ @@@ @@" 112 | ,"@@ @@@ @@" 113 | ," @@@@@@@ " 114 | ," @@@@@@@ "} 115 | 116 | ,{"@ @ @" 117 | ,"@ @@@@@ @" 118 | ,"@ @ @" 119 | ," @@@@@@@ " 120 | ," @@@@@@@ "}}; 121 | 122 | signed_byte_t cur_row = current_pos / BOARD_COL; 123 | signed_byte_t cur_col = current_pos % BOARD_COL; 124 | signed_byte_t iter_row; 125 | signed_byte_t iter_col; 126 | byte_t iter_pos; 127 | printf("cur_player == %s\n",cur_player ? "TRUE" : "FALSE"); 128 | printf("has_selected == %s\n",has_selected ? "TRUE" : "FALSE"); 129 | printf("is_clicked == %s\n",is_clicked ? "TRUE" : "FALSE"); 130 | printf("selected_pos == (%d,%d);\n" 131 | ,selected_pos/BOARD_COL,selected_pos%BOARD_COL); 132 | printf("current_pos == (%d,%d);\n" 133 | ,current_pos/BOARD_COL,current_pos%BOARD_COL); 134 | printf("en_paasant_flag == %d;\n",en_passant_flag); 135 | printf("castle_flag == %d;\n",castle_flag); 136 | for(int i=BOARD_ROW*CELL_ROW+1-1;i>=0;i--,putchar('\n')) 137 | for(int j=0;j 1) // another column 350 | return FALSE; 351 | else if((!(src_row < des_row) && !cells_side[src_pos]) // non-forward 352 | || (!(src_row > des_row) && cells_side[src_pos])) 353 | return FALSE; 354 | else if(src_col == des_col) { // move 355 | if(absolute(src_row - des_row) == 1) { // normal move 356 | if(cells_type[des_pos] != PIECE_S) 357 | return FALSE; 358 | } else if(absolute(src_row - des_row) == 2) { // fast started move 359 | if(cells_type[des_pos] != PIECE_S 360 | || cells_type[(src_pos+des_pos)/2] != PIECE_S 361 | || src_row != (!cells_side[src_pos] ? 1 : 6)) 362 | return FALSE; 363 | if(update) 364 | en_passant_flag = src_col + BOARD_COL; 365 | } else 366 | return FALSE; 367 | } else { // capture 368 | if(absolute(src_row - des_row) != 1) 369 | return FALSE; 370 | else if(cells_type[des_pos] == PIECE_S) { 371 | if(des_col == en_passant_flag 372 | && des_row == (!cells_side[src_pos] ? 5 : 2)) { 373 | if(update) 374 | cells_type[to_pos(src_row,des_col)] = PIECE_S; 375 | } 376 | else 377 | return FALSE; 378 | } 379 | } 380 | if(update && des_row == (!cells_side[src_pos] ? 7 : 0)) 381 | cells_type[src_pos] = promote_pawn(); 382 | break; 383 | case PIECE_H: 384 | if(!(absolute(src_col - des_col) == 1 && absolute(src_row - des_row) == 2) 385 | && !(absolute(src_col - des_col) == 2 && absolute(src_row - des_row) == 1)) 386 | return FALSE; 387 | break; 388 | case PIECE_B: 389 | if(!is_path_clear(src_pos,des_pos,FALSE,TRUE)) 390 | return FALSE; 391 | break; 392 | case PIECE_R: 393 | if(!is_path_clear(src_pos,des_pos,TRUE,FALSE)) 394 | return FALSE; 395 | if(update) { 396 | if(src_pos == to_pos(0,0)) 397 | castle_flag |= 1<<0; 398 | if(src_pos == to_pos(0,7)) 399 | castle_flag |= 1<<1; 400 | if(src_pos == to_pos(7,0)) 401 | castle_flag |= 1<<2; 402 | if(src_pos == to_pos(7,7)) 403 | castle_flag |= 1<<3; 404 | } 405 | break; 406 | case PIECE_Q: 407 | if(!is_path_clear(src_pos,des_pos,TRUE,TRUE)) 408 | return FALSE; 409 | break; 410 | case PIECE_K: 411 | if(absolute(src_col - des_col) <= 1 && absolute(src_row - des_row) <= 1) { 412 | if(update) 413 | castle_flag |= 1<<(4+cur_player); 414 | break; 415 | } 416 | // castle 417 | if(src_col != 4 || src_row != (!cur_player ? 0 : 7)) 418 | return FALSE; 419 | if(castle_flag>>(4+cur_player)&1) 420 | return FALSE; 421 | if(src_row != des_row) 422 | return FALSE; 423 | if(absolute(src_col - des_col) != 2) 424 | return FALSE; 425 | byte_t direction_col = (des_col - src_col)/absolute(src_col - des_col); 426 | if(castle_flag >> (cur_player*2 + (direction_col == 1)) & 1) 427 | return FALSE; 428 | if(!is_path_clear(src_pos,cur_player*7*8+(direction_col==1)*7,TRUE,FALSE)) 429 | return FALSE; 430 | if(is_in_check(cur_player,src_pos,src_pos)) 431 | return FALSE; 432 | if(is_in_check(cur_player,src_pos,src_pos+direction_col)) 433 | return FALSE; 434 | if(is_in_check(cur_player,src_pos,src_pos+2*direction_col)) 435 | return FALSE; 436 | if(update) { 437 | actual_move(cur_player*7*8+(direction_col==1)*7,src_pos+direction_col); 438 | castle_flag |= 1<<(4+cur_player); 439 | } 440 | break; 441 | } 442 | if(update) { 443 | actual_move(src_pos,des_pos); 444 | if(en_passant_flag != BYTE_UNDEFINED && en_passant_flag >= BOARD_COL) 445 | en_passant_flag -= BOARD_COL; 446 | else 447 | en_passant_flag = BYTE_UNDEFINED; 448 | if(des_pos == to_pos(0,0)) 449 | castle_flag |= 1<<0; 450 | if(des_pos == to_pos(0,7)) 451 | castle_flag |= 1<<1; 452 | if(des_pos == to_pos(7,0)) 453 | castle_flag |= 1<<2; 454 | if(des_pos == to_pos(7,7)) 455 | castle_flag |= 1<<3; 456 | } 457 | return TRUE; 458 | } 459 | 460 | bool_t is_own_piece(byte_t target_pos) { 461 | return cells_type[target_pos] != PIECE_S 462 | && cells_side[target_pos] == cur_player; 463 | } 464 | 465 | // for moving horizontal, vertical or diagonal ,if it is not return FALSE 466 | // is the way clear 467 | bool_t is_path_clear(byte_t src_pos, byte_t des_pos 468 | , bool_t enable_horizontal_vertical, bool_t enable_digonal) { 469 | assert(0 <= src_pos && src_pos < BOARD_SIZE); 470 | assert(0 <= des_pos && des_pos < BOARD_SIZE); 471 | signed_byte_t src_row = src_pos / BOARD_COL; 472 | signed_byte_t src_col = src_pos % BOARD_COL; 473 | signed_byte_t des_row = des_pos / BOARD_COL; 474 | signed_byte_t des_col = des_pos % BOARD_COL; 475 | signed_byte_t diff_row = absolute(src_row - des_row); 476 | signed_byte_t diff_col = absolute(src_col - des_col); 477 | if(diff_row != 0 && diff_col != 0 && diff_row != diff_col) 478 | return FALSE; 479 | else if(src_pos == des_pos) 480 | return TRUE; 481 | signed_byte_t distance = diff_row >= diff_col ? diff_row : diff_col; 482 | signed_byte_t direction_row = !diff_row ? 0 : (des_row - src_row)/distance; 483 | signed_byte_t direction_col = !diff_col ? 0 : (des_col - src_col)/distance; 484 | signed_byte_t tmp_pos; 485 | 486 | if((direction_row != 0) & (direction_col != 0)) { // diagonal 487 | if(!enable_digonal) 488 | return FALSE; 489 | } 490 | if((direction_row != 0) ^ (direction_col != 0)) { // horizontal_vertical 491 | if(!enable_horizontal_vertical) 492 | return FALSE; 493 | } 494 | 495 | for(signed_byte_t iter = 1; iter < distance; iter++) { 496 | tmp_pos = to_pos(src_row + direction_row*iter,src_col + direction_col*iter); 497 | if(cells_type[tmp_pos] != PIECE_S) 498 | return FALSE; 499 | } 500 | return TRUE; 501 | } 502 | 503 | void actual_move(byte_t src_pos, byte_t des_pos) { 504 | assert(0 <= src_pos && src_pos < BOARD_SIZE); 505 | assert(0 <= des_pos && des_pos < BOARD_SIZE); 506 | if(src_pos == des_pos) 507 | return; 508 | cells_type[des_pos] = cells_type[src_pos]; 509 | cells_side[des_pos] = cells_side[src_pos]; 510 | cells_type[src_pos] = PIECE_S; 511 | } 512 | 513 | byte_t to_pos(byte_t row, byte_t col) { 514 | return row*BOARD_COL + col; 515 | } 516 | 517 | byte_t absolute(signed_byte_t number) { 518 | return ((number >= 0)*2-1)*number; 519 | } 520 | -------------------------------------------------------------------------------- /src/dcd_gen.c: -------------------------------------------------------------------------------- 1 | /* Xu Ji, Bora Mollamustafaoglu, Gun Pinyo (Imperial College London) 2 | * {xj1112, bm1212, gp1712}@imperial.ac.uk 3 | * 4 | * Created as part of our first year C project 5 | * 6 | */ 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #define MAX_LINE_LENGTH 4096 // in bytes 14 | #define MAX_NUM_SEQUENCES 40000 15 | #define BGRND 'Q' 16 | 17 | enum type { 18 | BACKGROUND = 0, 19 | PIECE, 20 | OUTLINE 21 | }; 22 | 23 | static void fill_seqs(FILE *in); 24 | static void print_seqs(FILE *out); 25 | static enum type get_type(char c); 26 | 27 | 28 | static size_t num_seqs; 29 | static unsigned long int *sequences; 30 | static char *buf; 31 | 32 | 33 | int main(int argc, char **argv) { 34 | if (argc != 3) { 35 | fprintf(stderr, "Usage: "); 36 | exit(EXIT_FAILURE); 37 | } 38 | 39 | // handle input 40 | FILE *f_in = fopen(argv[1], "r"); 41 | 42 | if (f_in == NULL) { 43 | fprintf(stderr, "Error opening input file"); 44 | exit(EXIT_FAILURE); 45 | } 46 | 47 | sequences = malloc(MAX_NUM_SEQUENCES); 48 | if (sequences == NULL) { 49 | fprintf(stderr, "Error: insufficient memory"); 50 | exit(EXIT_FAILURE); 51 | } 52 | 53 | buf = malloc(MAX_LINE_LENGTH + 1); 54 | if (buf == NULL) { 55 | fprintf(stderr, "Error: insufficient memory"); 56 | exit(EXIT_FAILURE); 57 | } 58 | *(buf + MAX_LINE_LENGTH) = '\0'; 59 | 60 | fill_seqs(f_in); 61 | fclose(f_in); 62 | free(buf); 63 | 64 | 65 | // handle output 66 | FILE *f_out = fopen(argv[2], "w"); 67 | if (f_out == NULL) { 68 | fprintf(stderr, "Error opening output file"); 69 | exit(EXIT_FAILURE); 70 | } 71 | 72 | 73 | print_seqs(f_out); 74 | fclose(f_out); 75 | free(sequences); 76 | 77 | return EXIT_SUCCESS; 78 | } 79 | 80 | /* 81 | * Takes an input file, which should contain ASCII art. This ASCII art is 82 | * split and interpreted to be either background (BGRND), which is given 83 | * a 0, piece (whitespace), which is given a 1, or outline (anything else), 84 | * which is given a 2. 85 | * Each character is converted into a DCD 0 or DCD 1 or DCD 2 command 86 | * accordingly, in order to generate the ARM7TDMI assembly code. 87 | */ 88 | 89 | /*Takes an input file, which should contain ASCII art. 90 | * The output will be many lines of DCD X, encoded in a special format: 91 | * The very first DCD tells us the number of remaining words 92 | * (array length - 1). 93 | * Each DCD after that denotes a sequence, and is split into two parts: 94 | * The bottom two bits tell us which element type we're encoding, 95 | * which can be background (BGRND), which is given a 0, piece 96 | * (whitespace), which is given a 1, or outline (anything else), 97 | * which is given a 2. (3 is illegal) 98 | * The remaining 30 bits tell us how many of that element are in that 99 | * sequence. 100 | * 101 | */ 102 | static void fill_seqs(FILE *in) { 103 | enum type cur_type; // the character in the sequence we're currently in 104 | enum type tmp_type; 105 | int start = 1; 106 | int seq_length = 0; // length of current sequence 107 | 108 | num_seqs = 0; 109 | while (1) { 110 | // read a new line in 111 | buf = fgets(buf, MAX_LINE_LENGTH, in); 112 | if (buf == NULL) { 113 | // done - write the final sequence and quit 114 | long unsigned int res = (seq_length << 2) | cur_type; 115 | sequences[num_seqs++] = res; 116 | break; 117 | } 118 | // buffer now holds one line 119 | char *eol = strchr(buf, '\n'); 120 | if (eol == NULL) { 121 | eol = strchr(buf, EOF); 122 | if (eol == NULL) { 123 | fprintf(stderr, "Error: unable to find end of line"); 124 | exit(EXIT_FAILURE); 125 | } 126 | } 127 | *eol = '\0'; 128 | 129 | 130 | // now we can process the line char by char 131 | char *c = buf; 132 | while (*c != '\0') { 133 | if (start) { 134 | cur_type = get_type(*c); // init cur_type 135 | start = 0; 136 | continue; 137 | } 138 | if ((tmp_type = get_type(*c)) != cur_type) { 139 | 140 | long unsigned int res = (seq_length << 2) | cur_type; 141 | sequences[num_seqs++] = res; 142 | cur_type = tmp_type; 143 | // reset sequence length 144 | seq_length = 0; 145 | 146 | } else { 147 | seq_length++; 148 | c++; 149 | } 150 | } 151 | 152 | 153 | } 154 | } 155 | 156 | static void print_seqs(FILE *out) { 157 | fprintf(out, " DCD %u\n", (unsigned int)num_seqs); 158 | for (size_t i = 0 ; i < num_seqs ; i++) { 159 | fprintf(out, " DCD %lu\n",(unsigned long) sequences[i]); 160 | } 161 | } 162 | 163 | static enum type get_type(char c) { 164 | if (c == BGRND) 165 | return BACKGROUND; 166 | else if (isspace(c)) 167 | return PIECE; 168 | else 169 | return OUTLINE; 170 | } 171 | 172 | --------------------------------------------------------------------------------