Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstring>
- #include <cassert>
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <set>
- #include <map>
- #include <stack>
- #include <list>
- #include <queue>
- #include <deque>
- #include <cctype>
- #include <string>
- #include <vector>
- #include <sstream>
- #include <iterator>
- #include <numeric>
- #include <cmath>
- using namespace std;
- typedef vector <int > VI;
- typedef vector < VI > VVI;
- typedef long long LL;
- typedef vector < LL > VLL;
- typedef vector < double > VD;
- typedef vector < string > VS;
- typedef pair<int,int> PII;
- typedef vector <PII> VPII;
- typedef istringstream ISS;
- #define ALL(x) x.begin(),x.end()
- #define REP(i,n) for (int i=0; i<(n); ++i)
- #define FOR(var,pocz,koniec) for (int var=(pocz); var<=(koniec); ++var)
- #define FORD(var,pocz,koniec) for (int var=(pocz); var>=(koniec); --var)
- #define FOREACH(it, X) for(__typeof((X).begin()) it = (X).begin(); it != (X).end(); ++it)
- #define PB push_back
- #define PF push_front
- #define MP(a,b) make_pair(a,b)
- #define ST first
- #define ND second
- #define SIZE(x) (int)x.size()
- const int N= 100;
- int tab_offset = 10;
- int row_offset = 100;
- VS data;
- VS code;
- int ile = 16;
- char txt[1000];
- void init(int n) {
- code.PB("MOVB 1, dot");
- code.PB("MOVB 2, cross");
- code.PB("MOVB 5, b10");
- data.PB("dot:");
- data.PB("db 46");
- data.PB("cross:");
- data.PB("db 88");
- data.PB("b10:");
- data.PB("db 10");
- REP(mask, ile) {
- REP(i,4) {
- sprintf(txt, "MOVB %d, %d", tab_offset + mask * 4 + i, 1+(!!((1<<i) & mask)));
- code.PB(txt);
- }
- }
- int i = 0;
- while (i < n) {
- sprintf(txt, "MOV %d, %d", row_offset + i, tab_offset + 0 * 4);
- code.PB(txt);
- i += 4;
- }
- }
- void add_row(VI v, VI previous) {
- int n = SIZE(v);
- int orign = n;
- int i = 0;
- while (n % 4) {
- v.PB(0); previous.PB(0);
- n++;
- }
- while (i < n) {
- int diff = 0;
- REP(j, 4) if (v[i + j] != previous[i + j]) diff = 1;
- if (diff) {
- int mask = 0;
- REP(j, 4) if (v[i + j]) mask += 1<<j;
- sprintf(txt, "MOV %d, %d", row_offset + i, tab_offset + mask * 4);
- code.PB(txt);
- }
- i += 4;
- }
- static int nr = 0;
- ++nr;
- sprintf(txt, "MOV 200, ret_label%d_pointer", nr);
- code.PB(txt);
- sprintf(txt, "JMP out_function");
- code.PB(txt);
- sprintf(txt, "ret_label%d:", nr);
- code.PB(txt);
- sprintf(txt, "ret_label%d_pointer:", nr);
- data.PB(txt);
- sprintf(txt, "dw ret_label%d", nr);
- data.PB(txt);
- }
- int main(){
- int n = -1;
- char txt[N];
- VI previous;
- int first = 1;
- while (scanf("%s", txt) == 1) {
- int k = strlen(txt);
- if (n == -1) {
- n = k;
- previous = VI(n,0);
- }
- assert(k == n);
- VI v2;
- REP(i,n) v2.PB(txt[i] == 'X');
- if (first) {
- init(n);
- first = 0;
- }
- add_row(v2, previous);
- previous = v2;
- }
- code.PB("JMP 0");
- int i = 0;
- code.PB("out_function:");
- while (i < n) {
- if (i + 4 <= n) {
- sprintf(txt, "OUT %d", row_offset + i);
- i += 4;
- code.PB(txt);
- } else {
- sprintf(txt, "OUTB %d", row_offset + i);
- i++;
- code.PB(txt);
- }
- }
- code.PB("OUTB 5");
- code.PB("JMP *200");
- for (auto s : code) printf("%s\n", s.c_str());
- for (auto s : data) printf("%s\n", s.c_str());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement