--- /dev/null
+/****************************************************
+ * William Crenshaw
+ * 10/27/2014
+ * GList.cc
+ *
+ * Generic list program
+ ****************************************************/
+
+#include <iostream>
+using namespace std;
+
+const int MAX_SIZE = 35;
+
+template <class T>
+class List
+{
+ private:
+ // list node definition
+ struct Node
+ {
+ T data;
+ Node *link;
+ };
+
+ Node *head; // the head of the list
+ Node *tail; // the tail of the list
+ Node *curr; // the current position in the list
+ int num_items; // the number of items in the list
+
+ public:
+ // constructor
+ // remember that an empty list has a "size" of -1 and its "position" is at -1
+ List()
+ {
+ head = NULL;
+ tail = NULL;
+ curr = NULL;
+ num_items = 0;
+ }
+
+ // copy constructor
+ // clones the list l and sets the last element as the current
+ List(const List& l)
+ {
+ *this = l;
+ }
+
+ // copy constructor
+ // clones the list l and sets the last element as the current
+ void operator=(const List& l)
+ {
+ head = NULL;
+ tail = NULL;
+ curr = NULL;
+ num_items = 0;
+
+ Node *n = l.head;
+
+ while(n != NULL)
+ {
+ InsertAfter(n->data);
+ n = n->link;
+ }
+ }
+
+ // navigates to the beginning of the list
+ void First()
+ {
+ curr = head;
+ }
+
+ // navigates to the end of the list
+ // the end of the list is at the last valid item in the list
+ void Last()
+ {
+ curr = tail;
+ }
+
+ // navigates to the specified element (0-index)
+ // this should not be possible for an empty list
+ // this should not be possible for invalid positions
+ void SetPos(int pos)
+ {
+ if(!IsEmpty() && pos >= 0 && pos < GetSize())
+ {
+ curr = head;
+ while(pos > 0)
+ {
+ curr = curr->link;
+ pos--;
+ }
+ }
+ }
+
+ // navigates to the previous element
+ // this should not be possible for an empty list
+ // there should be no wrap-around
+ void Prev()
+ {
+ if(curr != head)
+ {
+ Node *n = head;
+
+ while(n->link != curr)
+ n = n->link;
+
+ curr = n;
+ }
+ }
+
+ // navigates to the next element
+ // this should not be possible for an empty list
+ // there should be no wrap-around
+ void Next()
+ {
+ if(!IsEmpty() && curr != tail)
+ curr = curr->link;
+ }
+
+ // returns the location of the current element (or -1)
+ int GetPos()
+ {
+ if(IsEmpty())
+ return -1;
+
+ int pos = 0;
+ Node *n = head;
+
+ while(n != curr)
+ {
+ n = n->link;
+ pos++;
+ }
+
+ return pos;
+ }
+
+ // returns the value of the current element (or -1)
+ T GetValue()
+ {
+ if(!IsEmpty())
+ return curr->data;
+
+ return -1;
+ }
+
+ // returns the size of the list
+ // size does not imply capacity
+ int GetSize()
+ {
+ return num_items;
+ }
+
+ // inserts an item before the current element
+ // the new element becomes the current
+ // this should not be possible for a full list
+ void InsertBefore(T data)
+ {
+ if(!IsFull())
+ {
+ if(IsEmpty())
+ InsertAfter(data);
+ else
+ {
+ Node* n = new Node;
+ n->data = data;
+ n->link = NULL;
+
+ if(curr == head)
+ {
+ n->link = head;
+ head = n;
+ curr = n;
+ num_items++;
+ }
+ else
+ {
+ Prev();
+ InsertAfter(data);
+ }
+ }
+ }
+ }
+
+ // inserts an item after the current element
+ // the new element becomes the current
+ // this should not be possible for a full list
+ void InsertAfter(T data)
+ {
+ if(!IsFull())
+ {
+ Node* n = new Node;
+ n->data = data;
+ n->link = NULL;
+
+ if(IsEmpty())
+ {
+ head = n;
+ tail = n;
+ }
+ else
+ {
+ if(curr == tail)
+ {
+ curr->link = n;
+ tail = n;
+ }
+ else
+ {
+ n->link = curr->link;
+ curr->link = n;
+ }
+ }
+
+ curr = n;
+ num_items++;
+ }
+ }
+
+ // removes the current element (collapsing the list)
+ // this should not be possible for an empty list
+ void Remove()
+ {
+ if(!IsEmpty())
+ {
+ if(num_items == 1)
+ {
+ head = NULL;
+ tail = NULL;
+ curr = NULL;
+ }
+ else
+ {
+ if(curr == head)
+ {
+ head = head->link;
+ curr = head;
+ }
+ else if(curr == tail)
+ {
+ Prev();
+ tail = curr;
+ tail->link = NULL;
+ }
+ else
+ {
+ Prev();
+ curr->link = curr->link->link;
+ Next();
+ }
+ }
+
+ num_items--;
+ }
+ }
+
+ // replaces the value of the current element with the specified value
+ // this should not be possible for an empty list
+ void Replace(int data)
+ {
+ if(!IsEmpty())
+ curr->data = data;
+ }
+
+ // returns if the list is empty
+ bool IsEmpty()
+ {
+ return (num_items == 0);
+ }
+
+ // returns if the list is full
+ bool IsFull()
+ {
+ return (num_items == MAX_SIZE);
+ }
+
+ // returns the concatenation of two lists
+ // l should not be modified
+ // l should be concatenated to the end of *this
+ // the returned list should not exceed MAX_SIZE elements
+ // the last element of the new list is the current
+ List operator+(const List& l) const
+ {
+ List newList = *this;
+
+ Node *n = l.head;
+
+ while(n != NULL)
+ {
+ newList.InsertAfter(n->data);
+ n = n->link;
+ }
+
+ return newList;
+ }
+
+ // returns if two lists are equal (by value)
+ bool operator==(const List& l) const
+ {
+ if(num_items != l.num_items)
+ return false;
+
+ Node *n = head;
+ Node *p = l.head;
+
+ while(n != NULL)
+ {
+ if(n->data != p->data)
+ return false;
+
+ n = n->link;
+ p = p->link;
+ }
+
+ return true;
+ }
+
+ // returns if two lists are not equal (by value)
+ bool operator!=(const List& l) const
+ {
+ return !(*this == l);
+ }
+
+ // returns a string representation of the entire list (e.g., 1 2 3 4 5)
+ // the string "NULL" should be returned for an empty list
+ friend ostream& operator<<(ostream& out, const List &l)
+ {
+ if(l.num_items == 0)
+ out << "NULL";
+ else
+ {
+ Node* n = l.head;
+
+ while(n != NULL)
+ {
+ out << n->data;// << " ";
+ n = n->link;
+ }
+ }
+
+ return out;
+ }
+};
+++ /dev/null
-\e[0mSeg:0 Size:9973 Owner:0x0\r
-\e[41;31m+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\e[0m\e[42;32m0000\r
-\e[0m\e[0mSeg:27ba Size:36 Owner:0x0\r
-\e[41;31m+\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:27de Size:256 Owner:0x1984\r
-\e[44;34m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:28de Size:256 Owner:0x1776\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:29de Size:256 Owner:0x1778\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:2ade Size:256 Owner:0x177a\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:2bde Size:256 Owner:0x177c\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:2cde Size:256 Owner:0x177e\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:2dde Size:256 Owner:0x1780\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:2ede Size:256 Owner:0x1782\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:2fde Size:256 Owner:0x1784\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:30de Size:256 Owner:0x1786\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:31de Size:256 Owner:0x1788\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:32de Size:256 Owner:0x178a\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:33de Size:256 Owner:0x178c\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:34de Size:256 Owner:0x178e\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:35de Size:256 Owner:0x1790\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:36de Size:256 Owner:0x1792\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:37de Size:256 Owner:0x1794\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:38de Size:256 Owner:0x1796\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:39de Size:256 Owner:0x1798\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:3ade Size:256 Owner:0x179a\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:3bde Size:256 Owner:0x179c\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:3cde Size:256 Owner:0x179e\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:3dde Size:256 Owner:0x17a0\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:3ede Size:256 Owner:0x17a2\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:3fde Size:256 Owner:0x17a4\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:40de Size:256 Owner:0x17a6\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:41de Size:256 Owner:0x17a8\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:42de Size:256 Owner:0x17aa\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:43de Size:256 Owner:0x17ac\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:44de Size:256 Owner:0x17ae\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:45de Size:256 Owner:0x17b0\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:46de Size:256 Owner:0x17b2\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:47de Size:256 Owner:0x17b4\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:48de Size:256 Owner:0x17b6\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:49de Size:256 Owner:0x17b8\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:4ade Size:256 Owner:0x17ba\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:4bde Size:256 Owner:0x17bc\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:4cde Size:256 Owner:0x17be\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:4dde Size:256 Owner:0x17c0\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:4ede Size:256 Owner:0x17c2\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:4fde Size:256 Owner:0x17c4\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:50de Size:256 Owner:0x17c6\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:51de Size:256 Owner:0x17c8\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:52de Size:256 Owner:0x17ca\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:53de Size:256 Owner:0x17cc\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:54de Size:256 Owner:0x17ce\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:55de Size:256 Owner:0x17d0\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:56de Size:256 Owner:0x17d2\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:57de Size:256 Owner:0x17d4\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:58de Size:256 Owner:0x17d6\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:59de Size:256 Owner:0x17d8\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:5ade Size:256 Owner:0x17da\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:5bde Size:256 Owner:0x17dc\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:5cde Size:256 Owner:0x17de\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:5dde Size:256 Owner:0x17e0\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:5ede Size:256 Owner:0x17e2\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:5fde Size:256 Owner:0x17e4\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:60de Size:256 Owner:0x17e6\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:61de Size:256 Owner:0x17e8\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:62de Size:256 Owner:0x17ea\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:63de Size:256 Owner:0x17ec\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:64de Size:256 Owner:0x17ee\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:65de Size:256 Owner:0x17f0\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:66de Size:256 Owner:0x17f2\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:67de Size:256 Owner:0x17f4\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:68de Size:256 Owner:0x17f6\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:69de Size:256 Owner:0x17f8\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:6ade Size:256 Owner:0x17fa\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:6bde Size:256 Owner:0x17fc\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:6cde Size:256 Owner:0x17fe\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:6dde Size:256 Owner:0x1800\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:6ede Size:256 Owner:0x1802\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:6fde Size:256 Owner:0x1804\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:70de Size:256 Owner:0x1806\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:71de Size:256 Owner:0x1808\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:72de Size:256 Owner:0x180a\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:73de Size:256 Owner:0x180c\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:74de Size:256 Owner:0x180e\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:75de Size:256 Owner:0x1810\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:76de Size:256 Owner:0x1812\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:77de Size:256 Owner:0x1814\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:78de Size:256 Owner:0x1816\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:79de Size:256 Owner:0x1818\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:7ade Size:256 Owner:0x181a\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:7bde Size:256 Owner:0x181c\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:7cde Size:256 Owner:0x181e\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:7dde Size:256 Owner:0x1820\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:7ede Size:256 Owner:0x1822\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:7fde Size:256 Owner:0x1824\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:80de Size:256 Owner:0x1826\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:81de Size:256 Owner:0x1828\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:82de Size:256 Owner:0x182a\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:83de Size:256 Owner:0x182c\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:84de Size:256 Owner:0x182e\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:85de Size:256 Owner:0x1830\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:86de Size:256 Owner:0x1832\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:87de Size:256 Owner:0x1834\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:88de Size:256 Owner:0x1836\r
-\e[45;35m+++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:89de Size:256 Owner:0x1838\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:8ade Size:256 Owner:0x183a\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:8bde Size:256 Owner:0x183c\r
-\e[45;35m++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:8cde Size:401 Owner:0xef0c\r
-\e[44;34m++++++\e[0m\e[42;32m\r
-\e[0m\e[0mSeg:b7de Size:18465 Owner:0x0\r
-\e[41;31m++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\e[0m
\ No newline at end of file
+++ /dev/null
-\r
- == default ==\r
-\r
- FREE block at 27dc0016 of size 68\r
- USED block at 27dc005a of size 50\r
- USED block at 27dc008c of size 50\r
- USED block at 27dc00be of size 50\r
- USED block at 27dc00f0 of size 50\r
- USED block at 27dc0122 of size 50\r
- USED block at 27dc0154 of size 50\r
- USED block at 27dc0186 of size 50\r
- USED block at 27dc01b8 of size 50\r
- USED block at 27dc01ea of size 50\r
- USED block at 27dc021c of size 50\r
- USED block at 27dc024e of size 50\r
- USED block at 27dc0280 of size 50\r
- FREE block at 27dc02b2 of size 14\r
- USED block at 27dc02c0 of size 20\r
- USED block at 27dc02d4 of size 136\r
- FREE block at 27dc035c of size 7328\r
-OK - end of heap\r
-\r
- == near ==\r
-\r
- USED block at 17dbefa6 of size 12\r
- USED block at 17dbefb2 of size 330\r
- USED block at 17dbf0fc of size 52\r
- USED block at 17dbf130 of size 20\r
- USED block at 17dbf144 of size 20\r
- USED block at 17dbf158 of size 20\r
- USED block at 17dbf16c of size 20\r
- USED block at 17dbf180 of size 20\r
- USED block at 17dbf194 of size 3688\r
-OK - end of heap\r
-\r
- == far ==\r
-\r
- USED block at 27dc0016 of size 68\r
- USED block at 27dc005a of size 50\r
- USED block at 27dc008c of size 50\r
- USED block at 27dc00be of size 50\r
- USED block at 27dc00f0 of size 50\r
- USED block at 27dc0122 of size 50\r
- USED block at 27dc0154 of size 50\r
- USED block at 27dc0186 of size 50\r
- USED block at 27dc01b8 of size 50\r
- USED block at 27dc01ea of size 50\r
- USED block at 27dc021c of size 50\r
- USED block at 27dc024e of size 50\r
- USED block at 27dc0280 of size 50\r
- USED block at 27dc02b2 of size 14\r
- USED block at 27dc02c0 of size 20\r
- USED block at 27dc02d4 of size 136\r
- USED block at 27dc035c of size 7328\r
-OK - end of heap\r
-\r
-Memory Type Total Used Free\r
----------------- -------- -------- --------\r
-Default 8166 756 7410\r
-Near 4182 494 3688\r
-Far 8166 756 7410\r
----------------- -------- -------- --------\r
-coreleft = 3686\r
-farcoreleft = 35502\r
-GetFreeSize = 31836\r
-GetNearFreeSize = 3688\r
-GetFarFreeSize = 31836\r
-memavl = 3686\r
-stackavail = 31557\r
boolean anim=1,noanim=0,zerostoppause=1;\r
\r
bakapee1=malloc(64);\r
- bakapee2=malloc(1024);\r
+ bakapee2=malloc(64);\r
\r
if (argc < 2) {\r
//fprintf(stderr,"drawvrl <VRL file> <palette file>\n palette file optional\n");\r
void animate_spri(entity_t *enti, video_t *video)\r
{\r
#define INC_PER_FRAME if(enti->q&1) enti->persist_aniframe++; if(enti->persist_aniframe>4) enti->persist_aniframe = 1;\r
- const unsigned int offscreen_ofs = video->page[0].pagesize+video->page[1].pagesize;//(vga_state.vga_stride * vga_state.vga_height);\r
- const unsigned int pattern_ofs = 0x10000UL - (uint16_t)video->page[2].data;//(vga_state.vga_stride * vga_state.vga_height);\r
+ const unsigned int offscreen_ofs = video->page[0].pagesize+video->page[1].pagesize;//(vga_state.vga_stride * vga_state.vga_height);\r
+ const unsigned int pattern_ofs = 0x10000UL - (uint16_t)video->page[2].data;//(vga_state.vga_stride * vga_state.vga_height);\r
+ unsigned int copy_ofs = offscreen_ofs;\r
+ unsigned int display_ofs = 0x0000;\r
unsigned int i,o,o2; int j;\r
int x,y,rx,ry,w,h;\r
\r
- VGA_RAM_PTR omemptr;\r
+ VGA_RAM_PTR omemptr = (VGA_RAM_PTR)video->page[0].data;// save original mem ptr\r
+ x=enti->spri->x;\r
+ y=enti->spri->y;\r
\r
// Depending on delay, update indices\r
//#define FRAME1 modexDrawSpriteRegion(pip[(pip->video->p)].page, x, y, 48, player[pn].enti.dire, 24, 32, PLAYERBMPDATAPTR);\r
//#define FRAME2 modexDrawSpriteRegion(pip[(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32, PLAYERBMPDATAPTR); stand\r
//#define FRAME3 modexDrawSpriteRegion(pip[(pip->video->p)].page, x, y, 0, player[pn].enti.dire, 24, 32, PLAYERBMPDATAPTR);\r
//#define FRAME4 modexDrawSpriteRegion(pip[(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32, PLAYERBMPDATAPTR); stand\r
+\r
+ /* copy active display (0) to offscreen buffer (0x4000) */\r
+ vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = vga_state.vga_stride;\r
+ vga_setup_wm1_block_copy();\r
+ vga_wm1_mem_block_copy(copy_ofs, display_ofs, vga_state.vga_stride * vga_state.vga_height);\r
+ vga_restore_rm0wm0();\r
+\r
switch(enti->spri->delay)\r
{\r
// Delay = 0 means that sprite should loop. Nothing to change here\r
// Events go here\r
\r
\r
- omemptr = (VGA_RAM_PTR)video->page[0].data;// save original mem ptr\r
- x=enti->spri->x;\r
- y=enti->spri->y;\r
\r
// Draw sprite\r
j = get_vrl_by_id(enti->spri->spritesheet, enti->spri->curr_spri_id, enti->spri->sprite_vrl_cont);\r
sword tilemidposscreeny; /* middle tile y position */ /* needed for scroll system to work accordingly */\r
sword tileplayerposscreenx; /* player position on screen */ /* needed for scroll and map system to work accordingly */\r
sword tileplayerposscreeny; /* player position on screen */ /* needed for scroll and map system to work accordingly */\r
-} ti_t;\r
+} tileinfo_t;\r
\r
typedef struct {\r
nibble/*word*/ id; /* the Identification number of the page~ For layering~ */\r
byte far* data; /* the data for the page */\r
+ tileinfo_t ti;\r
word dx; /* col we are viewing on virtual screen (on page[0]) */ /* off screen buffer on the left size */\r
word dy; /* row we are viewing on virtual screen (on page[0]) */ /* off screen buffer on the top size */\r
word sw; /* screen width */ /* resolution */\r
word sh; /* screen heigth */ /* resolution */\r
- word tw; /* screen width in tiles */\r
- word th; /* screen height in tiles */\r
word width; /* virtual width of the page */\r
word height; /* virtual height of the page */\r
- word tilesw; /* virtual screen width in tiles */\r
- word tilesh; /* virtual screen height in tiles */\r
- sword tilemidposscreenx; /* middle tile x position */ /* needed for scroll system to work accordingly */\r
- sword tilemidposscreeny; /* middle tile y position */ /* needed for scroll system to work accordingly */\r
- sword tileplayerposscreenx; /* player position on screen */ /* needed for scroll and map system to work accordingly */\r
- sword tileplayerposscreeny; /* player position on screen */ /* needed for scroll and map system to work accordingly */\r
word stridew; /* width/4 */ /* VGA */\r
word pagesize; /* page size */\r
word pi; /* increment page by this much to preserve location */\r
sword delta; // How much should we shift the page for smooth scrolling\r
} page_t;\r
\r
-//new structs\r
+//newer structs\r
typedef struct\r
{\r
int x; //entity exact position on the viewable map\r
byte grneeded[NUMCHUNKS];\r
} video_t;\r
\r
+//from scroll16\r
+//==========================================================================\r
+typedef struct\r
+{\r
+ map_t *map;\r
+ page_t *page;\r
+ int tx,ty; //appears to be the top left tile position on the viewable screen map\r
+ word dxThresh,dyThresh; //Threshold for physical tile switch\r
+ video_t *video; //pointer to game variables of the video\r
+ nibble __near *p; // pointer to video's render page num\r
+ nibble __near *sp; // pointer to video's show page num\r
+ int dx, dy; // draw row and col var\r
+//newer vars!\r
+ int delta, d;\r
+} map_view_t;\r
+/* Map is presumed to:\r
+ * 1. Have all the required layers and tilesets within itself\r
+ * 2. Have a 'fence' around accessible blocks to simplify boundary logic\r
+ * 3. Have a persistent map and tile size among the layers\r
+ * Map view is presumed to:\r
+ * 1. Calculate, store and update a panning info, which includes, but not limited to:\r
+ * combined layer information, actual map representation (reflecting real state of the game),\r
+ * pixel shift for smooth tile scrolling.\r
+ * 2. Provide ways to draw a visible part of map. For simplicity with smooth scrolling,\r
+ * additional row/column is always drawn at the each side of the map. This implies that 'fence'\r
+ * should have a sprite too. Map is drawn left-to-right, top-to-bottom.\r
+ */\r
+\r
+//==========================================================================\r
+\r
//from 16_mm\r
//==========================================================================\r
\r
break;\r
}\r
\r
-// gv->video.page[0].tw = gv->video.page[0].sw/TILEWH;\r
-// gv->video.page[0].th = gv->video.page[0].sh/TILEWH;\r
+// gv->video.page[0].ti.tw = gv->video.page[0].sw/TILEWH;\r
+// gv->video.page[0].ti.th = gv->video.page[0].sh/TILEWH;\r
\r
//TODO MAKE FLEXIBLE~\r
-// gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw;\r
-// gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1;\r
+// gv->video.page[0].ti.tilemidposscreenx = gv->video.page[0].ti.tilesw;\r
+// gv->video.page[0].ti.tilemidposscreeny = (gv->video.page[0].ti.tilesh/2)+1;\r
}\r
\r
void\r
page.sh = p->sh;\r
page.width = p->sw+TILEWHD;\r
page.height = p->sh+TILEWHD;\r
- page.tw = page.sw/TILEWH;\r
- page.th = page.sh/TILEWH;\r
- page.tilesw=page.width/TILEWH;\r
- page.tilesh=page.height/TILEWH;\r
- page.tilemidposscreenx = page.tw/2;\r
- page.tilemidposscreeny = (page.th/2)+1;\r
+ page.ti.tw = page.sw/TILEWH;\r
+ page.ti.th = page.sh/TILEWH;\r
+ page.ti.tilesw=page.width/TILEWH;\r
+ page.ti.tilesh=page.height/TILEWH;\r
+ page.ti.tilemidposscreenx = page.ti.tw/2;\r
+ page.ti.tilemidposscreeny = (page.ti.th/2)+1;\r
page.stridew=page.width/4;\r
page.pagesize = (word)(page.stridew)*page.height;\r
page.pi=page.width*4;\r
result.sh = p->sh;\r
result.width = p->width;\r
result.height = p->height;\r
- result.tw = p->tw;\r
- result.th = p->th;\r
- result.tilesw = p->tilesw;\r
- result.tilesh = p->tilesh;\r
+ result.ti.tw = p->ti.tw;\r
+ result.ti.th = p->ti.th;\r
+ result.ti.tilesw = p->ti.tilesw;\r
+ result.ti.tilesh = p->ti.tilesh;\r
result.stridew=p->stridew;\r
result.pagesize = p->pagesize;\r
result.pi=result.width*4;\r
result.sh = y;\r
result.width = x;\r
result.height = y;\r
- result.tw = result.sw/TILEWH;\r
- result.th = result.sh/TILEWH;\r
- result.tilesw=result.width/TILEWH;\r
- result.tilesh=result.height/TILEWH;\r
+ result.ti.tw = result.sw/TILEWH;\r
+ result.ti.th = result.sh/TILEWH;\r
+ result.ti.tilesw=result.width/TILEWH;\r
+ result.ti.tilesh=result.height/TILEWH;\r
result.id = p->id+1;\r
result.stridew=result.width/4;//p->sw/4;\r
result.pagesize = (word)(result.stridew)*result.height;\r
/* set map mask to all 4 planes */\r
outpw(SC_INDEX, 0xff02);\r
//_fmemset(VGA, color, 16000);\r
- _fmemset(Where, color, page->width*(page->height)/4);\r
+ _fmemset(Where, color, page->stridew*page->height);\r
}\r
\r
//\r
// printf("========================================\n");\r
printf("VL_PrintmodexmemInfo:\n");\r
// printf("========================================\n");\r
- printf(" Virtual Screen: %dx", v->page[0].width); printf("%d ", v->page[0].height); printf("Tile: %dx", v->page[0].tilesw); printf("%d", v->page[0].tilesh); printf("=((Virtual Screen)/16)\n");\r
- printf(" Screen: %dx", v->page[0].sw); printf("%d ", v->page[0].sh); printf("Tile: %dx", v->page[0].tw); printf("%d", v->page[0].th); printf("=((Screen)/16)\n");\r
+ printf(" Virtual Screen: %dx", v->page[0].width); printf("%d ", v->page[0].height); printf("Tile: %dx", v->page[0].ti.tilesw); printf("%d", v->page[0].ti.tilesh); printf("=((Virtual Screen)/16)\n");\r
+ printf(" Screen: %dx", v->page[0].sw); printf("%d ", v->page[0].sh); printf("Tile: %dx", v->page[0].ti.tw); printf("%d", v->page[0].ti.th); printf("=((Screen)/16)\n");\r
\r
printf(" Free Video Memory: %u\n", v->vmem_remain);\r
printf(" page");\r
colortest(page, pee);\r
break;\r
case 6:\r
- pee->coor = rand()%256;\r
- modexcls(page, pee->coor, VGA);\r
+// pee->coor = rand()%256;\r
+// modexcls(page, pee->coor, VGA);\r
+ colorz(page, pee);\r
+ modexprint(page, page->sw/2, page->sh/2, 1, 47, 0, "bakapi");\r
break;\r
case 7:\r
if(pee->coor <= pee->hgq)\r
-Subproject commit 82810640576d089bbc4b382b3318a41679ff2817
+Subproject commit e6fba71d59fad9b5e5bce6115f38dfb61c299a32
break;\r
//right movement\r
case 3:\r
- if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
+ if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->ti.tw < pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&\r
!(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY)) //collision detection!\r
{\r
player[pn].walktype=2;\r
break;\r
//left movement\r
case 1:\r
- if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
+ if(pip[0].tx > 0 && pip[0].tx+pip[0].page->ti.tw <= pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&\r
!(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY)) //collision detection!\r
{\r
player[pn].walktype=2;\r
break;\r
//down movement\r
case 4:\r
- if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
+ if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->ti.th < pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&\r
!(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY)) //collision detection!\r
{\r
player[pn].walktype=2;\r
break;\r
//up movement\r
case 0:\r
- if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
+ if(pip[0].ty > 0 && pip[0].ty+pip[0].page->ti.th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&\r
!(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY)) //collision detection!\r
{\r
player[pn].walktype=2;\r
{\r
//right movement\r
case 3:\r
- if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].page->tilesw)\r
+ if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->ti.tw < pip[0].page->ti.tilesw)\r
{\r
if(player[pn].enti.q<=player[pn].enti.spt)\r
{\r
\r
//left movement\r
case 1:\r
- if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].page->tilesw)\r
+ if(pip[0].tx > 0 && pip[0].tx+pip[0].page->ti.tw <= pip[0].page->ti.tilesw)\r
{\r
if(player[pn].enti.q<=player[pn].enti.spt)\r
{\r
\r
//down movement\r
case 4:\r
- if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].page->tilesh)\r
+ if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->ti.th < pip[0].page->ti.tilesh)\r
{\r
if(player[pn].enti.q<=player[pn].enti.spt)\r
{\r
\r
//up movement\r
case 0:\r
- if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].page->tilesh)\r
+ if(pip[0].ty > 0 && pip[0].ty+pip[0].page->ti.th <= pip[0].page->ti.tilesh)\r
{\r
if(player[pn].enti.q<=player[pn].enti.spt)\r
{\r
if(player[plid].enti.q==4)\r
#endif\r
if(id==0)\r
- mapDrawCol(&mv[0], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, DRAWCOLNUM);\r
+ mapDrawCol(&mv[0], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);\r
// else\r
// if(!pageflipflop && !pageploop)\r
-// modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));\r
+// modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->ti.th+2));\r
mv[0].video->r=1;\r
}\r
\r
mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);\r
// else\r
// if(!pageflipflop && !pageploop)\r
-// modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));\r
+// modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->ti.th+2));\r
mv[0].video->r=1;\r
}\r
\r
mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWCOLNUM);\r
// else\r
// if(!pageflipflop && !pageploop)\r
-// modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);\r
+// modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->ti.tw+2), mv[id].map->tiles->tileHeight);\r
mv[0].video->r=1;\r
}\r
\r
if(player[plid].enti.q==4)\r
#endif\r
if(id==0)\r
- mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, DRAWCOLNUM);\r
+ mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWCOLNUM);\r
// else\r
// if(!pageflipflop && !pageploop)\r
-// modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);\r
+// modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->ti.tw+2), mv[id].map->tiles->tileHeight);\r
mv[0].video->r=1;\r
}\r
\r
//default player position on the viewable map\r
void playerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn)\r
{\r
- player[pn].enti.tx = x + pip[0].tx + pip[0].page->tilemidposscreenx;\r
- player[pn].enti.ty = y + pip[0].ty + pip[0].page->tilemidposscreeny;\r
+ player[pn].enti.tx = x + pip[0].tx + pip[0].page->ti.tilemidposscreenx;\r
+ player[pn].enti.ty = y + pip[0].ty + pip[0].page->ti.tilemidposscreeny;\r
}\r
//===========================================================================\r
\r
\r
void player_walk(player_t *player, map_view_t *map_v){\r
int dx=16, dy=16;\r
- if(ZC_walk2(&(player->enti), map_v) && boundary_check(map_v->tx, map_v->ty, dx, dy, map_v->map->width - 2*map_v->page->tilesw, map_v->map->height - 2*map_v->page->tilesh))\r
+ if(ZC_walk2(&(player->enti), map_v) && boundary_check(map_v->tx, map_v->ty, dx, dy, map_v->map->width - 2*map_v->page->ti.tilesw, map_v->map->height - 2*map_v->page->ti.tilesh))\r
{\r
mapScroll(map_v, player);\r
// (Un)load stuff?\r
//#define DRAWCOLNUM player[plid].enti.q\r
//#define DRAWROLNUM player[plid].enti.q\r
\r
-typedef struct {\r
- map_t *map;\r
- page_t *page;\r
- int tx; //appears to be the top left tile position on the viewable screen map\r
- int ty; //appears to be the top left tile position on the viewable screen map\r
- word dxThresh; //Threshold for physical tile switch\r
- word dyThresh; //Threshold for physical tile switch\r
- video_t *video; //pointer to game variables of the video\r
- nibble __near *p; // pointer to video's render page num\r
- nibble __near *sp; // pointer to video's show page num\r
- int dx, dy; // draw row and col var\r
-//newer vars!\r
- int delta, d;\r
-} map_view_t;\r
-/* Map is presumed to:\r
- * 1. Have all the required layers and tilesets within itself\r
- * 2. Have a 'fence' around accessible blocks to simplify boundary logic\r
- * 3. Have a persistent map and tile size among the layers\r
- * Map view is presumed to:\r
- * 1. Calculate, store and update a panning info, which includes, but not limited to:\r
- * combined layer information, actual map representation (reflecting real state of the game),\r
- * pixel shift for smooth tile scrolling.\r
- * 2. Provide ways to draw a visible part of map. For simplicity with smooth scrolling,\r
- * additional row/column is always drawn at the each side of the map. This implies that 'fence'\r
- * should have a sprite too. Map is drawn left-to-right, top-to-bottom.\r
- */\r
-\r
//for null map!\r
#define MAPW 40\r
#define MAPH 30\r