// Video drawing header for morse code tutor // Authors: Jeff Fung + Yen-Khai Lee // NetID: wf23 + yl245 #define begin { #define end } #define width 126 //NOTE that v1 to v8 and i must be in registers! #pragma regalloc- //I allocate the registers myself register char v1 @4; register char v2 @5; register char v3 @6; register char v4 @7; register char v5 @8; register char v6 @9; register char v7 @10; register char v8 @11; register int i @12; #pragma regalloc+ //variables to keep track of animation unsigned char laser_count =0; unsigned char laser_glow_turn =0; char screen[1600], t, ts[10]; flash char pos[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //define some character bitmaps //5x7 characters flash char bitmap[38][7]={ //0 0b01110000, 0b10001000, 0b10011000, 0b10101000, 0b11001000, 0b10001000, 0b01110000, //1 0b00100000, 0b01100000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, 0b01110000, //2 0b01110000, 0b10001000, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b11111000, //3 0b11111000, 0b00010000, 0b00100000, 0b00010000, 0b00001000, 0b10001000, 0b01110000, //4 0b00010000, 0b00110000, 0b01010000, 0b10010000, 0b11111000, 0b00010000, 0b00010000, //5 0b11111000, 0b10000000, 0b11110000, 0b00001000, 0b00001000, 0b10001000, 0b01110000, //6 0b01000000, 0b10000000, 0b10000000, 0b11110000, 0b10001000, 0b10001000, 0b01110000, //7 0b11111000, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b10000000, 0b10000000, //8 0b01110000, 0b10001000, 0b10001000, 0b01110000, 0b10001000, 0b10001000, 0b01110000, //9 0b01110000, 0b10001000, 0b10001000, 0b01111000, 0b00001000, 0b00001000, 0b00010000, //A 0b01110000, 0b10001000, 0b10001000, 0b10001000, 0b11111000, 0b10001000, 0b10001000, //B 0b11110000, 0b10001000, 0b10001000, 0b11110000, 0b10001000, 0b10001000, 0b11110000, //C 0b01110000, 0b10001000, 0b10000000, 0b10000000, 0b10000000, 0b10001000, 0b01110000, //D 0b11110000, 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b11110000, //E 0b11111000, 0b10000000, 0b10000000, 0b11111000, 0b10000000, 0b10000000, 0b11111000, //F 0b11111000, 0b10000000, 0b10000000, 0b11111000, 0b10000000, 0b10000000, 0b10000000, //G 0b01110000, 0b10001000, 0b10000000, 0b10011000, 0b10001000, 0b10001000, 0b01110000, //H 0b10001000, 0b10001000, 0b10001000, 0b11111000, 0b10001000, 0b10001000, 0b10001000, //I 0b01110000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, 0b01110000, //J 0b00111000, 0b00010000, 0b00010000, 0b00010000, 0b00010000, 0b10010000, 0b01100000, //K 0b10001000, 0b10010000, 0b10100000, 0b11000000, 0b10100000, 0b10010000, 0b10001000, //L 0b10000000, 0b10000000, 0b10000000, 0b10000000, 0b10000000, 0b10000000, 0b11111000, //M 0b10001000, 0b11011000, 0b10101000, 0b10101000, 0b10001000, 0b10001000, 0b10001000, //N 0b10001000, 0b10001000, 0b11001000, 0b10101000, 0b10011000, 0b10001000, 0b10001000, //O 0b01110000, 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b01110000, //P 0b11110000, 0b10001000, 0b10001000, 0b11110000, 0b10000000, 0b10000000, 0b10000000, //Q 0b01110000, 0b10001000, 0b10001000, 0b10001000, 0b10101000, 0b10010000, 0b01101000, //R 0b11110000, 0b10001000, 0b10001000, 0b11110000, 0b10100000, 0b10010000, 0b10001000, //S 0b00111000, 0b01000000, 0b10000000, 0b11111000, 0b00001000, 0b00010000, 0b11100000, //T 0b11111000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, 0b00100000, //U 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b01110000, //V 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b01010000, 0b00100000, //W 0b10001000, 0b10001000, 0b10001000, 0b10101000, 0b10101000, 0b10101000, 0b01010000, //X 0b10001000, 0b10001000, 0b01010000, 0b00100000, 0b01010000, 0b10001000, 0b10001000, //Y 0b10001000, 0b10001000, 0b10001000, 0b01010000, 0b00100000, 0b00100000, 0b00100000, //Z 0b11111000, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b10000000, 0b11111000, //figure1 0b01110000, 0b00100000, 0b01110000, 0b10101000, 0b00100000, 0b01010000, 0b10001000, //figure2 0b01110000, 0b10101000, 0b01110000, 0b00100000, 0b00100000, 0b01010000, 0b10001000}; //================================ //3x5 font numbers, then letters //packed two per definition for fast //copy to the screen at x-position divisible by 4 flash char smallbitmap[39][5]={ //0 0b11101110, 0b10101010, 0b10101010, 0b10101010, 0b11101110, //1 0b01000100, 0b11001100, 0b01000100, 0b01000100, 0b11101110, //2 0b11101110, 0b00100010, 0b11101110, 0b10001000, 0b11101110, //3 0b11101110, 0b00100010, 0b11101110, 0b00100010, 0b11101110, //4 0b10101010, 0b10101010, 0b11101110, 0b00100010, 0b00100010, //5 0b11101110, 0b10001000, 0b11101110, 0b00100010, 0b11101110, //6 0b11001100, 0b10001000, 0b11101110, 0b10101010, 0b11101110, //7 0b11101110, 0b00100010, 0b01000100, 0b10001000, 0b10001000, //8 0b11101110, 0b10101010, 0b11101110, 0b10101010, 0b11101110, //9 0b11101110, 0b10101010, 0b11101110, 0b00100010, 0b01100110, //: is now . 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, //= 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, //blank 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, //A 0b11101110, 0b10101010, 0b11101110, 0b10101010, 0b10101010, //B 0b11001100, 0b10101010, 0b11101110, 0b10101010, 0b11001100, //C 0b11101110, 0b10001000, 0b10001000, 0b10001000, 0b11101110, //D 0b11001100, 0b10101010, 0b10101010, 0b10101010, 0b11001100, //E 0b11101110, 0b10001000, 0b11101110, 0b10001000, 0b11101110, //F 0b11101110, 0b10001000, 0b11101110, 0b10001000, 0b10001000, //G 0b11101110, 0b10001000, 0b10001000, 0b10101010, 0b11101110, //H 0b10101010, 0b10101010, 0b11101110, 0b10101010, 0b10101010, //I 0b11101110, 0b01000100, 0b01000100, 0b01000100, 0b11101110, //J 0b00100010, 0b00100010, 0b00100010, 0b10101010, 0b11101110, //K 0b10001000, 0b10101010, 0b11001100, 0b11001100, 0b10101010, //L 0b10001000, 0b10001000, 0b10001000, 0b10001000, 0b11101110, //M 0b10101010, 0b11101110, 0b11101110, 0b10101010, 0b10101010, //N 0b00000000, 0b11001100, 0b10101010, 0b10101010, 0b10101010, //O 0b01000100, 0b10101010, 0b10101010, 0b10101010, 0b01000100, //P 0b11101110, 0b10101010, 0b11101110, 0b10001000, 0b10001000, //Q 0b01000100, 0b10101010, 0b10101010, 0b11101110, 0b01100110, //R 0b11101110, 0b10101010, 0b11001100, 0b11101110, 0b10101010, //S 0b01100110, 0b10001000, 0b01000100, 0b00100010, 0b11001100, //T 0b11101110, 0b01000100, 0b01000100, 0b01000100, 0b01000100, //U 0b10101010, 0b10101010, 0b10101010, 0b10101010, 0b11101110, //V 0b10101010, 0b10101010, 0b10101010, 0b10101010, 0b01000100, //W 0b10101010, 0b10101010, 0b11101110, 0b11101110, 0b10101010, //X 0b00000000, 0b10101010, 0b01000100, 0b01000100, 0b10101010, //Y 0b10101010, 0b10101010, 0b01000100, 0b01000100, 0b01000100, //Z 0b11101110, 0b00100010, 0b01000100, 0b10001000, 0b11101110 }; flash char glowBitmap[2][7]={ //* 0b00100000, 0b00100000, 0b00100000, 0b11111000, 0b00100000, 0b00100000, 0b00100000, //* 2 0b10001000, 0b10001000, 0b01010000, 0b01110000, 0b01010000, 0b10001000, 0b10001000 }; flash char diodeBitmap[2][7]={ // back body 0b11100000, 0b00011111, 0b00000000, 0b11111111, 0b00000000, 0b00011111, 0b11100000, // front body 0b00011000, 0b10111100, 0b01110100, 0b11110100, 0b01110100, 0b10111100, 0b00011000 }; flash char handBitmap[2][14]={ //hand 0b00000000, 0b00000000, 0b00000001, 0b00010001, 0b11001100, 0b01100111, 0b00011011, 0b01100111, 0b00111111, 0b00000011, 0b00011111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b10000000, 0b11100000, 0b01110000, 0b10111110, 0b11111110, 0b11011110, 0b11100110, 0b11011010, 0b11111110, 0b00000000, 0b00000000, 0b00000000 }; flash char ditBitmap[1][7]={ //* 0b00000000, 0b00000000, 0b00100000, 0b00100000, 0b00100000, 0b00000000, 0b00000000 }; flash char dahBitmap[1][7]={ //- 0b00000000, 0b00000000, 0b01110000, 0b01110000, 0b01110000, 0b00000000, 0b00000000 }; flash char cityBitmap1[2][28]={ //first block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000011, 0b00111100, 0b11000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b01111110, 0b01000010, 0b01111110, 0b01000010, 0b01111110, 0b01000010, // second block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000011, 0b00111110, 0b11100000, 0b00000000, 0b00000000, 0b00011000, 0b00111100, 0b01100110, 0b00111100, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00111100, 0b01100110, 0b01111110, 0b01100110 }; flash char cityBitmap2[2][28] = { // third block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b00011110, 0b11100000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b01100000, 0b01100000, 0b11110001, 0b01100011, 0b01100110, 0b01101111, 0b01111100, 0b01110000, 0b01110000, 0b01100000, 0b01100000, 0b01100001, 0b01100011, 0b01100011, 0b01100011, // fourth block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00111111, 0b11000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00001100, 0b00001100, 0b10011110, 0b11001100, 0b01101100, 0b11111100, 0b00111100, 0b00001100, 0b00001100, 0b00001100, 0b00001100, 0b10001100, 0b11001100, 0b11001100, 0b11001100 }; flash char cityBitmap3[2][28] = { // fifth block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00001111, 0b01111000, 0b11000000, 0b00000000, 0b00000000, 0b00000000, 0b00000011, 0b00000011, 0b00000010, 0b00000111, 0b00000111, 0b00000100, 0b00001111, 0b00001111, 0b00001001, 0b00011111, 0b00011111, 0b00010011, 0b00111111, 0b00111111, 0b00100110, 0b01111111, 0b01111111, 0b11001100, // sixth block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00111111, 0b11100000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11100000, 0b11111110, 0b01100110, 0b11111110, 0b11111100, 0b11001100, 0b11111100, 0b11111000, 0b10011000, 0b11111000, 0b11110000, 0b00110000, 0b11110000, 0b11110000, 0b01100000, 0b11100000, 0b11100000, 0b11000000 }; flash char cityBitmap4[2][28] = { // sixth block 0b00000000, 0b00000000, 0b00000000, 0b01111111, 0b10000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b00000010, 0b00000111, 0b00001001, 0b00010001, 0b00111111, 0b01000100, 0b10000100, // seventh block 0b00000000, 0b00000000, 0b11111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b00000011, 0b00000100, 0b00001111, 0b00011001, 0b00101001, 0b01111111, 0b11000100, 0b01000100, 0b11111111, 0b00010001, 0b00010001, 0b11111111, 0b01000100, 0b01000100 }; flash char cityBitmap5[2][28] = { // eighth block 0b00000000, 0b00000000, 0b00000000, 0b11111110, 0b00000001, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b10000000, 0b01000000, 0b00100000, 0b11110000, 0b01001000, 0b01000100, 0b11111110, 0b00100011, 0b00100010, 0b11111111, 0b00010001, 0b00010001, 0b11111111, 0b00100010, 0b00100010, // ninth block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111100, 0b00000011, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b10000000, 0b01000000, 0b11100000, 0b10010000, 0b10001000, 0b11111100, 0b00100010, 0b00100001 }; flash char cityBitmap6[2][28] = { // tenth block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11110000, 0b00001111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000001, 0b00000001, 0b00000001, 0b00000010, 0b00000100, 0b00001100, 0b10011000, 0b01111111, 0b00011101, 0b00011101, 0b00011101, 0b00011101, 0b00011101, // eleventh block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11100000, 0b00111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b10000000, 0b10000000, 0b10000000, 0b01000000, 0b00100000, 0b00110000, 0b00011001, 0b11111110, 0b11011100, 0b11011100, 0b11011100, 0b11011100, 0b11011100 }; flash char cityBitmap7[2][28] = { //12th 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11110000, 0b00011111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00010001, 0b00111001, 0b00010011, 0b00011110, 0b01110010, 0b11100000, 0b11100010, 0b11111110, 0b11111111, // 13th 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11110000, 0b00011111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b10001000, 0b10011100, 0b11001000, 0b01111000, 0b00001110, 0b00000111, 0b01100111, 0b11111111, 0b11111111 }; flash char cityBitmap10[3][28] = { // 14th 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111111, 0b11001100, 0b11111111, 0b11001100, 0b11111111, 0b11001100, 0b11111111, // 15th block 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111111, 0b10010011, 0b11111111, 0b10010011, 0b11111111, 0b10010011, 0b11111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111111, 0b11001011, 0b11111111, 0b11001001, 0b11111111, 0b11001001, 0b11111111 }; flash char cityBitmap8[3][7] = { //16th 0b11111111, 0b11001100, 0b11111111, 0b11001100, 0b11111111, 0b11001100, 0b11111111, 0b11111111, 0b10010011, 0b11111111, 0b10010011, 0b11111111, 0b10010011, 0b11111111, 0b11111111, 0b11001011, 0b11111111, 0b11001001, 0b11111111, 0b11001001, 0b11111111 }; flash char cityBitmap9[3][7] = { //16th 0b00000000, 0b00000000, 0b00000000, 0b11111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11111111, 0b00000000 }; flash char explosion[1][7] = { 0b00111001, 0b00111000, 0b01111110, 0b11111111, 0b01111110, 0b00111000, 0b00111000 }; flash char clearblock[1][7] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 }; //================================== //plot one point //at x,y with color 1=white 0=black 2=invert #pragma warn- void video_pt(char x, char y, char c) begin #asm ; i=(x>>3) + ((int)y<<4) ; the byte with the pixel in it push r16 ldd r30,y+2 ;get x lsr r30 lsr r30 lsr r30 ;divide x by 8 ldd r12,y+1 ;get y lsl r12 ;mult y by 16 clr r13 lsl r12 rol r13 lsl r12 rol r13 lsl r12 rol r13 add r12, r30 ;add in x/8 ;v2 = screen[i]; r5 ;v3 = pos[x & 7]; r6 ;v4 = c r7 ldi r30,low(_screen) ldi r31,high(_screen) add r30, r12 adc r31, r13 ld r5,Z ;get screen byte ldd r26,y+2 ;get x ldi r27,0 andi r26,0x07 ;form x & 7 ldi r30,low(_pos*2) ldi r31,high(_pos*2) add r30,r26 adc r31,r27 lpm r6,Z ld r16,y ;get c ;if (v4==1) screen[i] = v2 | v3 ; ;if (v4==0) screen[i] = v2 & ~v3; ;if (v4==2) screen[i] = v2 ^ v3 ; cpi r16,1 brne tst0 or r5,r6 tst0: cpi r16,0 brne tst2 com r6 and r5,r6 tst2: cpi r16,2 brne writescrn eor r5,r6 writescrn: ldi r30,low(_screen) ldi r31,high(_screen) add r30, r12 adc r31, r13 st Z, r5 ;write the byte back to the screen pop r16 #endasm end #pragma warn+ //================================== // put a big character on the screen // c is index into bitmap void video_putchar(char x, char y, char c) begin v7 = x; for (v6=0;v6<7;v6++) begin v1 = bitmap[c][v6]; v8 = y+v6; video_pt(v7, v8, (v1 & 0x80)==0x80); video_pt(v7+1, v8, (v1 & 0x40)==0x40); video_pt(v7+2, v8, (v1 & 0x20)==0x20); video_pt(v7+3, v8, (v1 & 0x10)==0x10); video_pt(v7+4, v8, (v1 & 0x08)==0x08); end end // ================================= // put byte graphics on screen void video_putg(char x, char y, unsigned char graphics_laser) begin v7 = x; for (v6=0;v6<7;v6++) begin if (graphics_laser == 0) { v1 = glowBitmap[0][v6]; } else { v1 = glowBitmap[1][v6]; } v8 = y+v6; video_pt(v7, v8, (v1 & 0x80)==0x80); video_pt(v7+1, v8, (v1 & 0x40)==0x40); video_pt(v7+2, v8, (v1 & 0x20)==0x20); video_pt(v7+3, v8, (v1 & 0x10)==0x10); video_pt(v7+4, v8, (v1 & 0x08)==0x08); end end // ================================= // put n-byte graphics on screen, horizontal void video_putg2(char x, char y, char size_x, char size_y, int mode) begin v7 = x; while (size_x != 0) { for (v6=0;v6<7*size_y;v6++) { if (mode == 1) { v1 = diodeBitmap[size_x-1][v6]; } else if (mode == 2) { v1 = handBitmap[size_x-1][v6]; } else if (mode == 0) { v1 = 0; } else if (mode == 3) { v1 = ditBitmap[size_x-1][v6]; } else if (mode == 4) { v1 = dahBitmap[size_x-1][v6]; } else if (mode == 5) { v1 = cityBitmap1[size_x-1][v6]; } else if (mode == 6) { v1 = cityBitmap2[size_x-1][v6]; } else if (mode == 7) { v1 = cityBitmap3[size_x-1][v6]; } else if (mode == 8) { v1 = cityBitmap4[size_x-1][v6]; } else if (mode == 9) { v1 = cityBitmap5[size_x-1][v6]; } else if (mode == 10) { v1 = cityBitmap6[size_x-1][v6]; } else if (mode == 11) { v1 = cityBitmap7[size_x-1][v6]; } else if (mode == 12) { v1 = cityBitmap8[size_x-1][v6]; } else if (mode == 13) { v1 = cityBitmap9[size_x-1][v6]; } else if (mode == 14) { v1 = explosion[size_x-1][v6]; } else if (mode == 15) { v1 = clearblock[size_x-1][v6]; } v8 = y+v6; video_pt(v7, v8, (v1 & 0x80)==0x80); video_pt(v7+1, v8, (v1 & 0x40)==0x40); video_pt(v7+2, v8, (v1 & 0x20)==0x20); video_pt(v7+3, v8, (v1 & 0x10)==0x10); video_pt(v7+4, v8, (v1 & 0x08)==0x08); video_pt(v7+5, v8, (v1 & 0x04)==0x04); video_pt(v7+6, v8, (v1 & 0x02)==0x02); video_pt(v7+7, v8, (v1 & 0x01)==0x01); } size_x--; v7=v7-7; // move v7 to the left } end //================================== // put a string of big characters on the screen void video_puts(char x, char y, char *str) begin char i ; for (i=0; str[i]!=0; i++) begin if (str[i]>=0x30 && str[i]<=0x3a) video_putchar(x,y,str[i]-0x30); else video_putchar(x,y,str[i]-0x40+9); x = x+6; end end //================================== // put a small character on the screen // x-cood must be on divisible by 4 // c is index into bitmap void video_smallchar(char x, char y, char c) begin char mask; i=((int)x>>3) + ((int)y<<4) ; if (x == (x & 0xf8)) mask = 0x0f; //f8 else mask = 0xf0; screen[i] = (screen[i] & mask) | (smallbitmap[c][0] & ~mask); screen[i+16] = (screen[i+16] & mask) | (smallbitmap[c][1] & ~mask); screen[i+32] = (screen[i+32] & mask) | (smallbitmap[c][2] & ~mask); screen[i+48] = (screen[i+48] & mask) | (smallbitmap[c][3] & ~mask); screen[i+64] = (screen[i+64] & mask) | (smallbitmap[c][4] & ~mask); end //================================== // put a string of small characters on the screen // x-cood must be on divisible by 4 void video_putsmalls(char x, char y, char *str) begin char i ; for (i=0; str[i]!=0; i++) begin if (str[i]>=0x30 && str[i]<=0x3a) video_smallchar(x,y,str[i]-0x30); else video_smallchar(x,y,str[i]-0x40+12); x = x+4; end end //================================== //plot a line //at x1,y1 to x2,y2 with color 1=white 0=black 2=invert //NOTE: this function requires signed chars //Code is from David Rodgers, //"Procedural Elements of Computer Graphics",1985 void video_line(char x1, char y1, char x2, char y2, char c) begin int e; signed char dx,dy,j, temp; signed char s1,s2, xchange; signed char x,y; x = x1; y = y1; dx = cabs(x2-x1); dy = cabs(y2-y1); s1 = csign(x2-x1); s2 = csign(y2-y1); xchange = 0; if (dy>dx) begin temp = dx; dx = dy; dy = temp; xchange = 1; end e = ((int)dy<<1) - dx; for (j=0; j<=dx; j++) begin video_pt(x,y,c) ; if (e>=0) begin if (xchange==1) x = x + s1; else y = y + s2; e = e - ((int)dx<<1); end if (xchange==1) y = y + s2; else x = x + s1; e = e + ((int)dy<<1); end end // draws horizontal bar with specified y as top aligned position void video_hbar(char x1, char y1, char x2, char y2, char c, char thick) begin int e; signed char dx,dy,j, temp; signed char s1,s2, xchange; signed char x,y; while (thick != 0) { x = x1; y = y1; dx = cabs(x2-x1); dy = cabs(y2-y1); s1 = csign(x2-x1); s2 = csign(y2-y1); xchange = 0; if (dy>dx) begin temp = dx; dx = dy; dy = temp; xchange = 1; end e = ((int)dy<<1) - dx; for (j=0; j<=dx; j++) begin video_pt(x,y,c) ; if (e>=0) begin if (xchange==1) x = x + s1; else y = y + s2; e = e - ((int)dx<<1); end if (xchange==1) y = y + s2; else x = x + s1; e = e + ((int)dy<<1); end thick--; y1++; y2++; } end //================================== //return the value of one point //at x,y with color 1=white 0=black 2=invert char video_set(char x, char y) begin //The following construction //detects exactly one bit at the x,y location i=((int)x>>3) + ((int)y<<4) ; return ( screen[i] & 1<<(7-(x & 0x7))); end //================================== // clear screen, leaving borders void clear(void) begin int j; for (j = 16; j < 1584; j++) { if (j%16 != 0 && (j+1)%16 != 0) { screen[j] = 0; } } end //================================== // clear screen, leaving borders and bar void clearWOBar(void) begin int j; for (j = 16; j < 1264; j++) { if (j%16 != 0 && (j+1)%16 != 0) { screen[j] = 0; } else { if (j%16 == 0) { screen[j] = 0b10000000; } else { screen[j] = 0b00000001; } } } end void clearWOBar1(void) begin int j; for (j = 16; j < 640; j++) { if (j%16 != 0 && (j+1)%16 != 0) { screen[j] = 0; } } end void clearWOBar2(void) begin int j; for (j = 640; j < 1264; j++) { if (j%16 != 0 && (j+1)%16 != 0) { screen[j] = 0; } } end //================================== void drawMenu(void) begin char buffer[25]; video_line(0,0,7,0,1); // draw characters sprintf(buffer, "WAVE:FINGER:FOR:TUTORIAL\0"); video_putsmalls(12,72,buffer); sprintf(buffer, "1:SKETCH\0"); video_putsmalls(40,28,buffer); sprintf(buffer, "2:GAME\0"); video_putsmalls(40,40,buffer); end //================================== void drawDisplayBar(void) begin char buffer[12]; // timer bars + char video_line(54,80,126,80,1); video_line(62,80,62,99,1); sprintf(buffer, "CHAR"); video_putsmalls(68,84,buffer); sprintf(buffer, "DAH"); video_putsmalls(68,91,buffer); // current letter video_line(1,80,62,80,1); sprintf(buffer, "LETTER"); video_putsmalls(32,83,buffer); sprintf(buffer, ":::::::"); video_putsmalls(32,91,buffer); // current morse video_line(28,80,28,99,1); sprintf(buffer, "MORSE"); video_putsmalls(4,83,buffer); end //================================== void drawTitleScreen(void) begin //title screen animation video_putg(112,80,laser_glow_turn); video_putg2(20, 80, 2, 1, 1); video_line(20,83,112,83,1); laser_count++; if (laser_count == 30) { laser_glow_turn = ~laser_glow_turn; laser_count = 0; video_putg2(56,80, 2, 1, 2); } end //=================================== void drawGameT1(void) begin char buffer[20]; sprintf(buffer, "HUMANITY:IN:PERIL\0"); video_putsmalls(24,16,buffer); video_line(0,0,48,0,1); end void drawGameT2(void) begin char buffer[20]; sprintf(buffer, "SAVE:US:MORSE:DEFENDER\0"); video_putsmalls(16,40,buffer); video_line(0,0,48,0,1); end void drawCity1(void) begin video_putg2(8,52, 2, 4, 5); end void drawCity2(void) begin video_putg2(22,52, 2, 4, 6); end void drawCity3(void) begin video_putg2(36,52, 2, 4, 7); end void drawCity4(void) begin video_putg2(50,52, 2, 4, 8); end void drawCity5(void) begin video_putg2(64,52, 2, 4, 9); end void drawCity6(void) begin video_putg2(78,52, 2, 4, 10); end void drawCity7(void) begin video_putg2(92,52,2,4,11); end void drawCity8(void) begin video_putg2(114,74,3,1,12); video_putg2(114,60,3,1,13); end void drawExplosion(char x, char y) begin video_putg2(x, y,1,1,14); end void drawClearBlock(char x, char y) begin video_putg2(x, y,1,1,15); end //======================= //=================================== void drawTutT1(char *buffer) begin sprintf(buffer, "TUTORIAL:MODE"); video_putsmalls(24,16,buffer); video_line(0,0,48,0,1); end void drawTutT2(char *buffer) begin sprintf(buffer, "WHEN:A:CHARACTER:APPEARS"); video_putsmalls(12,16,buffer); sprintf(buffer, "SIGNAL:LASER:TO:INDICATE"); video_putsmalls(12,32,buffer); sprintf(buffer, "DIT:OR:DAH"); video_putsmalls(12,48,buffer); video_line(0,0,48,0,1); end void drawTutT3(char *buffer) begin sprintf(buffer, "ONE:FINGER:INDICATES:DIT"); video_putsmalls(12,16,buffer); sprintf(buffer, "TRY:IT"); video_putsmalls(12,32,buffer); sprintf(buffer, "I:WILL:WAIT:FOR:YOU"); video_putsmalls(12,48,buffer); video_line(0,0,48,0,1); end void drawTutT4(char *buffer) begin sprintf(buffer, "HAND:WITH:OPEN:FINGERS"); video_putsmalls(12,16,buffer); sprintf(buffer, "INDICATE:A:DAH"); video_putsmalls(12,32,buffer); sprintf(buffer, "TRY:IT"); video_putsmalls(12,48,buffer); video_line(0,0,48,0,1); end void drawTutT5(char *buffer) begin sprintf(buffer, "GOOD"); video_putsmalls(12,16,buffer); sprintf(buffer, "NOW:TRY:THE:COMBO"); video_putsmalls(12,32,buffer); sprintf(buffer, "DAH:DAH:DAH:DAH:DAH"); video_putsmalls(12,48,buffer); video_line(0,0,48,0,1); end void drawTutT6(char *buffer) begin sprintf(buffer, "GREAT"); video_putsmalls(12,16,buffer); sprintf(buffer, "NOW:TRY:THE:COMBO"); video_putsmalls(12,32,buffer); sprintf(buffer, "DAH:DIT:DIT:DAH"); video_putsmalls(12,48,buffer); video_line(0,0,48,0,1); end void drawTutT7(char *buffer) begin sprintf(buffer, "AWESOME"); video_putsmalls(12,16,buffer); sprintf(buffer, "NOW:TRY:THE:COMBO"); video_putsmalls(12,32,buffer); sprintf(buffer, "DIT:DIT:DIT:DAH:DAH"); video_putsmalls(12,48,buffer); video_line(0,0,48,0,1); end void drawTutT8(char *buffer) begin sprintf(buffer, "NOW:IT:IS:TIME:TO"); video_putsmalls(12,16,buffer); sprintf(buffer, "LEARN:TO:SPELL:THE"); video_putsmalls(12,32,buffer); sprintf(buffer, "ALPHABET:AND:NUMBERS"); video_putsmalls(12,48,buffer); sprintf(buffer, "IN:MORSE:CODE"); video_putsmalls(12,64,buffer); video_line(0,0,48,0,1); end void drawTutT100(char *buffer) begin sprintf(buffer, "CONGRATULATIONS"); video_putsmalls(12,16,buffer); sprintf(buffer, "TO:RETURN:TO:THE:MENU"); video_putsmalls(12,32,buffer); sprintf(buffer, "SIGNAL"); video_putsmalls(12,48,buffer); sprintf(buffer, "DAH:DAH:DAH:DAH:DAH:DAH"); video_putsmalls(12,64,buffer); video_line(0,0,48,0,1); end void drawTutScreens(int screen) begin char buffer[28]; switch(screen) { case 1: { drawTutT1(buffer); break; } case 2: { drawTutT2(buffer); break; } case 3: { drawTutT3(buffer); break; } case 4: { drawTutT4(buffer); break; } case 5: { drawTutT5(buffer); break; } case 6: { drawTutT6(buffer); break; } case 7: { drawTutT7(buffer); break; } case 8: { drawTutT8(buffer); break; } case 100: {drawTutT100(buffer); break; } } end void drawTutLetters(int index) begin char buffer[20]; char letter[2]; switch (index) { case 0: //A { sprintf(buffer, "A"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DAH"); video_putsmalls(12,32,buffer); break; } case 1: //B { sprintf(buffer, "B"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 2: //C { sprintf(buffer, "C"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT:DAH:DIT"); video_putsmalls(12,32,buffer); break; } case 3: //D { sprintf(buffer, "D"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 4: //E { sprintf(buffer, "E"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT"); video_putsmalls(12,32,buffer); break; } case 5: //F { sprintf(buffer, "F"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DAH:DIT"); video_putsmalls(12,32,buffer); break; } case 6: //G { sprintf(buffer, "G"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DIT"); video_putsmalls(12,32,buffer); break; } case 7: //H { sprintf(buffer, "H"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 8: //I { sprintf(buffer, "I"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 9: //J { sprintf(buffer, "J"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DAH:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 10: //K { sprintf(buffer, "K"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT:DAH"); video_putsmalls(12,32,buffer); break; } case 11: //L { sprintf(buffer, "L"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DAH:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 12: //M { sprintf(buffer, "M"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 13: //N { sprintf(buffer, "N"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT"); video_putsmalls(12,32,buffer); break; } case 14: //O { sprintf(buffer, "O"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 15: //P { sprintf(buffer, "P"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DAH:DAH:DIT"); video_putsmalls(12,32,buffer); break; } case 16: //Q { sprintf(buffer, "Q"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DIT:DAH"); video_putsmalls(12,32,buffer); break; } case 17: //R { sprintf(buffer, "R"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DAH:DIT"); video_putsmalls(12,32,buffer); break; } case 18: //S { sprintf(buffer, "S"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 19: //T { sprintf(buffer, "T"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH"); video_putsmalls(12,32,buffer); break; } case 20: //U { sprintf(buffer, "U"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DAH"); video_putsmalls(12,32,buffer); break; } case 21: //V { sprintf(buffer, "V"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DIT:DAH"); video_putsmalls(12,32,buffer); break; } case 22: //W { sprintf(buffer, "W"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 23: //X { sprintf(buffer, "X"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT:DIT:DAH"); video_putsmalls(12,32,buffer); break; } case 24: //Y { sprintf(buffer, "Y"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 25: //Z { sprintf(buffer, "Z"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 26: //0 { sprintf(buffer, "0"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DAH:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 27: //1 { sprintf(buffer, "1"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DAH:DAH:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 28: //2 { sprintf(buffer, "2"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DAH:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 29: //3 { sprintf(buffer, "3"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DIT:DAH:DAH"); video_putsmalls(12,32,buffer); break; } case 30: //4 { sprintf(buffer, "4"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DIT:DIT:DAH"); video_putsmalls(12,32,buffer); break; } case 31: //5 { sprintf(buffer, "5"); video_putsmalls(12,16,buffer); sprintf(buffer, "DIT:DIT:DIT:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 32: //6 { sprintf(buffer, "6"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DIT:DIT:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 33: //7 { sprintf(buffer, "7"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DIT:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 34: //8 { sprintf(buffer, "8"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DAH:DIT:DIT"); video_putsmalls(12,32,buffer); break; } case 35: //9 { sprintf(buffer, "9"); video_putsmalls(12,16,buffer); sprintf(buffer, "DAH:DAH:DAH:DAH:DIT"); video_putsmalls(12,32,buffer); break; } } end