From f93e0224d4984648ba36b4f5b12fcf643efcdc89 Mon Sep 17 00:00:00 2001 From: Aidan Jennings Date: Sat, 23 Jan 2021 20:19:13 -0600 Subject: [PATCH 1/6] tried to get stdio to work, went back to rebuilding the parser --- .../term_01_input_char_iterm_msg_getc.asm | 6 +- .../term_01_output_char_oterm_msg_cls.asm | 49 +++++++ .../term_01_output_char_oterm_msg_printc.asm | 93 +++++++++++- .../term_01_output_char_oterm_msg_scroll.asm | 50 ++++--- src/zdk projects/stdio/test.c | 134 +----------------- src/zdk projects/stdio/uart.c | 108 ++++++++++++++ src/zdk projects/stdio/uart.h | 34 +++++ src/zdk projects/stdio/zproject.lst | 1 + src/zdk projects/uart/blackjack.c | 14 +- src/zdk projects/uart/heap.asm | 33 +++++ src/zdk projects/uart/main.c | 25 ++-- src/zdk projects/uart/monitor.c | 118 +++++++++++++++ src/zdk projects/uart/monitor.h | 30 ++++ src/zdk projects/uart/tom80.c | 100 +++++-------- src/zdk projects/uart/tom80.h | 10 +- src/zdk projects/uart/uart.h | 1 - src/zdk projects/uart/uart.lst | 4 +- 17 files changed, 568 insertions(+), 242 deletions(-) create mode 100644 src/zdk projects/stdio/uart.c create mode 100644 src/zdk projects/stdio/uart.h create mode 100644 src/zdk projects/uart/heap.asm create mode 100644 src/zdk projects/uart/monitor.c create mode 100644 src/zdk projects/uart/monitor.h diff --git a/src/zdk projects/stdio/terminal/term_01_input_char/term_01_input_char_iterm_msg_getc.asm b/src/zdk projects/stdio/terminal/term_01_input_char/term_01_input_char_iterm_msg_getc.asm index c690b6f..7b4d14c 100644 --- a/src/zdk projects/stdio/terminal/term_01_input_char/term_01_input_char_iterm_msg_getc.asm +++ b/src/zdk projects/stdio/terminal/term_01_input_char/term_01_input_char_iterm_msg_getc.asm @@ -32,7 +32,9 @@ term_01_input_char_iterm_msg_getc: JP NZ, GETCH_LOOP IN A, (0) - + or a + RET + ; After character is retrieved do any necessary ; character set translation including ascii codes ; 10 and 13 as shown below @@ -59,4 +61,4 @@ key_cr: key_lf: ld a,CHAR_LF - ret + ret \ No newline at end of file diff --git a/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_cls.asm b/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_cls.asm index cfb73d2..6ef8681 100644 --- a/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_cls.asm +++ b/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_cls.asm @@ -23,3 +23,52 @@ term_01_output_char_oterm_msg_cls: ; hl+3 = & window.height ;error implement term_01_output_char_oterm_msg_cls + + ;Clear DLAB + IN A, (3) + AND 0x7F + OUT (3), A + + ;Escape Character + PRINTCH_LOOP_1: + ;Read transmit register status in line status register + IN A, (5) + AND 0x60 + CP 0x60 + JP NZ, PRINTCH_LOOP_1 + + LD A, '\033' + OUT (0), A + + ;Bracket + PRINTCH_LOOP_2: + ;Read transmit register status in line status register + IN A, (5) + AND 0x60 + CP 0x60 + JP NZ, PRINTCH_LOOP_2 + + LD A, '[' + OUT (0), A + + ;Clear + PRINTCH_LOOP_3: + ;Read transmit register status in line status register + IN A, (5) + AND 0x60 + CP 0x60 + JP NZ, PRINTCH_LOOP_3 + + LD A, '2' + OUT (0), A + + ;Terminate + PRINTCH_LOOP_4: + ;Read transmit register status in line status register + IN A, (5) + AND 0x60 + CP 0x60 + JP NZ, PRINTCH_LOOP_4 + + LD A, 'J' + OUT (0), A \ No newline at end of file diff --git a/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_printc.asm b/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_printc.asm index 4a11a06..22fd24f 100644 --- a/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_printc.asm +++ b/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_printc.asm @@ -15,17 +15,98 @@ term_01_output_char_oterm_msg_printc: ; ; Print the char to screen at given character coordinate. - IN A, (3) +;error implement term_01_output_char_oterm_msg_printc + + + LD A, '\033' + CALL PUTCHAR + + LD A, '[' + CALL PUTCHAR + + ;Put the Y value + LD A, H + CALL DIV10 + LD A, D + CP 0x30 + JP Z, PUT_Y_E + CALL PUTCHAR + PUT_Y_E: + LD A, E + CALL PUTCHAR + + ;Put the Semicolon + LD A, ';' + CALL PUTCHAR + + ;Put the X value + LD A, L + CALL DIV10 + LD A, D + CP 0x30 + JP Z, PUT_X_E + CALL PUTCHAR + PUT_X_E: + LD A, E + CALL PUTCHAR + + LD A, 'H' + CALL PUTCHAR + + LD A, C + CALL PUTCHAR + ret + + +;Expects A to be value, returns 10s in D, 1s in E +DIV10: + PUSH AF + LD D, 0 + LD E, 0 + ;Check if 0 + CP 0 + JP Z, DIV10_END + + DIV10_LOOP: + SUB A, 10 + JP C, DIV10_END + INC D + JP DIV10_LOOP + + DIV10_END: + ADD A, 10 + LD E, A + + ;Convert D and E to Char + LD A, D + ADD A, 0x31 + LD D, A + + LD A, E + ADD A, 0x31 + LD E, A + + POP AF + RET + +;Expects A to be the char +PUTCHAR: + + PUSH AF + ;Clear DLAB + IN A, (3) AND 0x7F OUT (3), A - - PRINTCH_LOOP: + + ;Print Escape Char + PRINTCH_LOOP: ;Read transmit register status in line status register - IN A, (3) + IN A, (5) AND 0x60 CP 0x60 JP NZ, PRINTCH_LOOP - ;Write Char to UART - LD A, C + POP AF OUT (0), A + + RET diff --git a/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_scroll.asm b/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_scroll.asm index 0a71936..2041b38 100644 --- a/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_scroll.asm +++ b/src/zdk projects/stdio/terminal/term_01_output_char/term_01_output_char_oterm_msg_scroll.asm @@ -23,28 +23,44 @@ term_01_output_char_oterm_msg_scroll: ; hl+2 = & window.y ; hl+3 = & window.height - IN A, (3) - AND 0x7F - OUT (3), A +;error implement term_01_output_char_oterm_msg_scroll - PRINTCH_LOOP_1: - ;Read transmit register status in line status register - IN A, (3) - AND 0x60 - CP 0x60 - JP NZ, PRINTCH_LOOP_1 +;Esc[ValueA - ;Write Char to UART - LD A, '\n' - OUT (0), A +;Gets called no matter what character is given + + LD A, '\033' + CALL PUTCHAR + + LD A, '[' + CALL PUTCHAR - PRINTCH_LOOP_2: + LD A, '1' + CALL PUTCHAR + + LD A, 'S' + CALL PUTCHAR + + RET + +;Expects A to be the char +PUTCHAR: + + PUSH AF + ;Clear DLAB + IN A, (3) + AND 0x7F + OUT (3), A + + ;Print Escape Char + PRINTCH_LOOP: ;Read transmit register status in line status register - IN A, (3) + IN A, (5) AND 0x60 CP 0x60 - JP NZ, PRINTCH_LOOP_2 + JP NZ, PRINTCH_LOOP - ;Write Char to UART - LD A, '\n' + POP AF OUT (0), A + + RET \ No newline at end of file diff --git a/src/zdk projects/stdio/test.c b/src/zdk projects/stdio/test.c index 96f8275..7f99a24 100644 --- a/src/zdk projects/stdio/test.c +++ b/src/zdk projects/stdio/test.c @@ -2,140 +2,20 @@ #pragma scanf = "%s" // prune to required converters #include - - -#define UART_DHR 0 //UART Data R/W register -#define UART_IER 1 //Interrupt Enable Register -#define UART_IFR 2 //Interrupt ID Reg (READ), FIFO Control Reg (WRITE) -#define UART_LCR 3 //Line Control Register -#define UART_MCR 4 //Modem Control -#define UART_LSR 5 //Line Status Register -#define UART_MSR 6 //Modem Status (Unused) -#define UART_SCR 7 //Arbitrary data can be stored here - -#define BAUD_DIV_HIGH 0 -#define BAUD_DIV_LOW 8 +#include "uart.h" unsigned char buf[64]; - -void UART_CLEAR_LSR(){ - __asm - PUSH AF - IN A, (UART_LSR) - POP AF - RET - __endasm -} - -void UART_SET_BAUD(){ - __asm - PUSH AF - LD A, BAUD_DIV_LOW - OUT (UART_DHR), A - LD A, BAUD_DIV_HIGH - OUT (UART_IER), A - POP AF - RET - __endasm -} - -void UART_DISABLE_FIFO(){ - __asm - PUSH AF - LD A, 0x6 - OUT (UART_IFR), A - POP AF - RET - __endasm -} - -void UART_SET_LINE_CONTROL(){ - __asm - PUSH AF - LD A, 0x3 //8 Bit word, 1 stop, no parity - OUT (UART_LCR), A - POP AF - RET - __endasm -} - -void UART_CLEAR_DLAB(){ - __asm - push AF - IN A, (UART_LCR) - AND 0x7F - OUT (UART_LCR), A - POP AF - RET - __endasm -} - -void UART_SET_DLAB(){ +void main(void){ - __asm - PUSH AF - IN A, (UART_LCR) - OR 0x80 - OUT (UART_LCR), A - POP AF - RET - __endasm -} - -void UART_TOGGLE_OUT1(){ - __asm - PUSH AF - IN A, (UART_MCR) - XOR 0x4 - OUT (UART_MCR), A - POP AF - RET - __endasm -} - -void UART_TOGGLE_OUT2(){ - __asm - PUSH AF - IN A, (UART_MCR) - XOR 0x8 - OUT (UART_MCR), A - POP AF - RET - __endasm -} - -void HALT(){ - __asm - HALT - __endasm -} - -void UART_INIT(){ - - UART_CLEAR_DLAB(); - UART_DISABLE_FIFO(); - UART_SET_LINE_CONTROL(); - UART_TOGGLE_OUT1(); - UART_TOGGLE_OUT2(); - UART_CLEAR_LSR(); - UART_SET_DLAB(); - UART_SET_BAUD(); - UART_CLEAR_DLAB(); - -} - -void main(void) -{ UART_INIT(); - while (1) - { - printf("Message: "); - + while (1){ + //printf("Hello World!\r\n"); + //fflush(stdin); //scanf("%63s", buf); - - //printf("\"%s\"\n\n", buf); + + printf(getc(stdin)); } } diff --git a/src/zdk projects/stdio/uart.c b/src/zdk projects/stdio/uart.c new file mode 100644 index 0000000..923c93e --- /dev/null +++ b/src/zdk projects/stdio/uart.c @@ -0,0 +1,108 @@ +#include "uart.h" + +//I know that there are premade library functions +//for I/O but they don't seem to work and there is +//no documentation to help me troubleshoot + +//plus, these are faster + +void UART_CLEAR_LSR(){ + __asm + PUSH AF + IN A, (UART_LSR) + POP AF + RET + __endasm +} + +void UART_SET_BAUD(){ + __asm + PUSH AF + LD A, BAUD_DIV_LOW + OUT (UART_DHR), A + LD A, BAUD_DIV_HIGH + OUT (UART_IER), A + POP AF + RET + __endasm +} + +void UART_DISABLE_FIFO(){ + __asm + PUSH AF + LD A, 0x6 + OUT (UART_IFR), A + POP AF + RET + __endasm +} + +void UART_SET_LINE_CONTROL(){ + __asm + PUSH AF + LD A, 0x3 //8 Bit word, 1 stop, no parity + OUT (UART_LCR), A + POP AF + RET + __endasm +} + +void UART_CLEAR_DLAB(){ + __asm + push AF + IN A, (UART_LCR) + AND 0x7F + OUT (UART_LCR), A + POP AF + RET + __endasm +} + +void UART_SET_DLAB(){ + + __asm + PUSH AF + IN A, (UART_LCR) + OR 0x80 + OUT (UART_LCR), A + POP AF + RET + __endasm +} + +void UART_TOGGLE_OUT1(){ + __asm + PUSH AF + IN A, (UART_MCR) + XOR 0x4 + OUT (UART_MCR), A + POP AF + RET + __endasm +} + +void UART_TOGGLE_OUT2(){ + __asm + PUSH AF + IN A, (UART_MCR) + XOR 0x8 + OUT (UART_MCR), A + POP AF + RET + __endasm +} + +void UART_INIT(){ + + UART_CLEAR_DLAB(); + UART_DISABLE_FIFO(); + UART_SET_LINE_CONTROL(); + UART_TOGGLE_OUT1(); + UART_TOGGLE_OUT2(); + UART_CLEAR_LSR(); + UART_SET_DLAB(); + UART_SET_BAUD(); + UART_CLEAR_DLAB(); + +} + diff --git a/src/zdk projects/stdio/uart.h b/src/zdk projects/stdio/uart.h new file mode 100644 index 0000000..7d259c6 --- /dev/null +++ b/src/zdk projects/stdio/uart.h @@ -0,0 +1,34 @@ +#ifndef UART_H_ +#define UART_H_ + +#include +#include +//#include + +#define UART_DHR 0 //UART Data R/W register +#define UART_IER 1 //Interrupt Enable Register +#define UART_IFR 2 //Interrupt ID Reg (READ), FIFO Control Reg (WRITE) +#define UART_LCR 3 //Line Control Register +#define UART_MCR 4 //Modem Control +#define UART_LSR 5 //Line Status Register +#define UART_MSR 6 //Modem Status (Unused) +#define UART_SCR 7 //Arbitrary data can be stored here + +#define BAUD_DIV_HIGH 0 +#define BAUD_DIV_LOW 8 + +/////////////////////////////////////// +//UART Functions +/////////////////////////////////////// + +void UART_INIT(); +void UART_CLEAR_DLAB(); +void UART_SET_DLAB(); +void UART_SET_LINE_CONTROL(); +void UART_DISABLE_FIFO(); +void UART_SET_BAUD(); +void UART_CLEAR_LSR(); +void UART_TOGGLE_OUT1(); +void UART_TOGGLE_OUT2(); + +#endif // UART_H_ \ No newline at end of file diff --git a/src/zdk projects/stdio/zproject.lst b/src/zdk projects/stdio/zproject.lst index 3403fa7..06432e5 100644 --- a/src/zdk projects/stdio/zproject.lst +++ b/src/zdk projects/stdio/zproject.lst @@ -1,3 +1,4 @@ test.c @terminal/term_01_input_char.lst @terminal/term_01_output_char.lst +uart.c \ No newline at end of file diff --git a/src/zdk projects/uart/blackjack.c b/src/zdk projects/uart/blackjack.c index 34c197b..05ad423 100644 --- a/src/zdk projects/uart/blackjack.c +++ b/src/zdk projects/uart/blackjack.c @@ -1,6 +1,5 @@ #include "blackjack.h" - void blackJack(){ //just do things on the stack for now @@ -14,7 +13,6 @@ void blackJack(){ mainTable.players[0] = &dealer; mainTable.players[1] = &p1; - PRINTSTR("\r\nWELCOME TO BLACKJACK!\r\n"); blackJackInit(&mainTable); @@ -39,7 +37,7 @@ void blackJackInit(Table *t){ const Card Queen = {"Q", 10, 0, 0 }; const Card King = {"K", 10, 0, 0 }; - int types[13]; + Card types[13]; types[0] = Ace; types[1] = Two; @@ -63,14 +61,14 @@ void blackJackInit(Table *t){ t->players[i]->wins = 0; t->players[i]->losses = 0; t->players[i]->busted = 0; - memcpy(t->players[i]->cards[0], Ace, sizeof(Card)); + memcpy(&t->players[i]->cards[0], &Ace, sizeof(Card)); } t->players[0]->isDealer = 1; for(int j = 0; j < 52; j++){ - memcpy(t->deck->cards[j], types[j%13], sizeof(Card)); + memcpy(&t->deck->cards[j], &types[j%13], sizeof(Card)); } } @@ -78,7 +76,7 @@ void playGame(Table *t){ for(int i = 0; i < 52; i++){ PRINTSTR(t->deck->cards[i].id); - PRINTCH(' '); + PRINTSTR(" "); } PRINTSTR("\r\n"); @@ -147,7 +145,7 @@ void dealCard(Deck *deck, Player *p){ random = rand() % 52; } - memcpy(p->cards[p->numCards], deck->cards[random], sizeof(Card)); + memcpy(&p->cards[p->numCards], &deck->cards[random], sizeof(Card)); deck->cards[random].delt = 1; p->numCards++; @@ -167,7 +165,7 @@ void printPlayerStats(Table *t){ PRINTSTR("You have : \r\n"); for(int j = 0; j < t->players[1]->numCards; j++){ - PRINTCH(t->players[1]->cards[j].id); + PRINTSTR(t->players[1]->cards[j].id); PRINTSTR(","); } PRINTSTR("\r\n"); diff --git a/src/zdk projects/uart/heap.asm b/src/zdk projects/uart/heap.asm new file mode 100644 index 0000000..cf4a1cb --- /dev/null +++ b/src/zdk projects/uart/heap.asm @@ -0,0 +1,33 @@ +defc heap_loc = 0x8000 ;; the heap's location in memory +defc heap_sz = 4096 ;; the heap's size in bytes + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SECTION HEAP +org heap_loc + +__malloc_block: defs heap_sz + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SECTION data_user +PUBLIC __malloc_heap + +__malloc_heap: defw __malloc_block + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SECTION code_crt_init + +; initialize the heap in the crt + + ld hl,__malloc_block + ld bc,heap_sz + + EXTERN asm_heap_init + call asm_heap_init + +; note no "ret" here as this section falls +; into the code calling main() + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; \ No newline at end of file diff --git a/src/zdk projects/uart/main.c b/src/zdk projects/uart/main.c index 3ae7452..ae8f474 100644 --- a/src/zdk projects/uart/main.c +++ b/src/zdk projects/uart/main.c @@ -1,30 +1,29 @@ #include "uart.h" #include "tom80.h" -#include "blackjack.h" +#include "monitor.h" +#include -char buffer[256]; +#pragma output CLIB_MALLOC_HEAP_SIZE = 0 void main(){ - UART_INIT(); - GETCH(); + UART_INIT(); + getc(); cls(); setColor(WHITE, BLACK); - PRINTSTR("ASH v0.3C\n\r(C) 2020 by Aidan Jennings\n\r"); - PRINTSTR("ZILOG Z80 32k EEPROM, 32k SRAM\n\rTEXTONLY\n\r"); - PRINTSTR("\nBOOT PROCESS COMPLETE!\n\r"); + print("ASH v0.3C\n\r(C) 2020 by Aidan Jennings\n\r"); + print("ZILOG Z80 32k EEPROM, 32k SRAM\n\rTEXTONLY\n\r"); + print("\nBOOT PROCESS COMPLETE!\n\n\r"); - setColor(BLACK, WHITE); - putstr("test test 123\r", 11, 11); - setColor(WHITE, BLACK); + unsigned char buffer[128]; +// buffer = malloc(128*sizeof(char)); while(1){ - //monitor(&buffer); + monitor(&buffer); //simpleLoop(); - blackJack(); + //putc(getc()); } - HALT(); } \ No newline at end of file diff --git a/src/zdk projects/uart/monitor.c b/src/zdk projects/uart/monitor.c new file mode 100644 index 0000000..ed23250 --- /dev/null +++ b/src/zdk projects/uart/monitor.c @@ -0,0 +1,118 @@ +#include "monitor.h" + +char tokenizeBuffer(char * buf, char * tokenBuff){ + + char c; + int offset = 0; + uint16_t litValue = 0; + + for(int i = 0; buf[i] != '\0'; i++){ + + c = buf[i]; + + //Special Case, handle literals + //TODO: Make this its own function and incorporate into the switch statement + if(isLiteral(c) == 1){ + + //convert first literal + if(isHex(c)){ + litValue = ((uint16_t)c) - 0x37; + }else{ + litValue = ((uint16_t)c) - 0x30; + } + + tokenBuff[offset] = WORD; + offset++; + + while(isLiteral(c) == 1){ + c = buf[i+1]; + i++; + + if(isHex(c)){ + litValue = (litValue<<4) | (0xF & (((uint16_t)c) - 0x37)); + }else{ + litValue = (litValue<<4) | (0xF & (((uint16_t)c) - 0x30)); + } + } + tokenBuff[offset] = (char)((litValue&0xFF00)>>8); + offset++; + tokenBuff[offset] = (char)(litValue&0xFF); + offset++; + + }else{ + + switch(c){ + case INST_READ: + tokenBuff[offset] = READ; + offset++; + break; + + case INST_WRITE: + tokenBuff[offset] = WRITE; + offset++; + break; + + case INST_EXECUTE: + tokenBuff[offset] = WRITE; + offset++; + break; + + case INST_HELP: + tokenBuff[offset] = HELP; + offset++; + break; + + case 0x20: + //space bar + break; + + default: + //return the offending character + return c; + break; + } + + } + } + + return 0; + +} + +void evaluateStmt(char * buf){ + + unsigned char tokenBuff[128]; + + print("\n\r"); + print(buf); + print("\n\r"); + + char tokenRet = tokenizeBuffer(buf, &tokenBuff); + + if(tokenRet != 0){ + print("\n\rError, Unrecognized character : "); + putc(tokenRet); + print("\n\r"); + } + +} + +int isLiteral(char c){ + return isHex(c) | isNumerical(c); +} + +//TODO: convert to macro? +int isHex(char c){ + return (((int)c >= 0x41) & ((int)c <= 0x46)); +} + +int isNumerical(char c){ + return (((int)c >= 0x30) & ((int)c <= 0x39)); +} + +void monitor(char * buf){ + + getStr(buf); + evaluateStmt(buf); + +} \ No newline at end of file diff --git a/src/zdk projects/uart/monitor.h b/src/zdk projects/uart/monitor.h new file mode 100644 index 0000000..89e5a37 --- /dev/null +++ b/src/zdk projects/uart/monitor.h @@ -0,0 +1,30 @@ +#ifndef MONITOR_H_ +#define MONITOR_H_ + +#include "uart.h" +#include "tom80.h" +#include + +enum parser_token{ + EOF, + READ, + WRITE, + EXECUTE, + WORD, + NIBBLE, + HELP +} parser_token; + +#define INST_READ ':' +#define INST_WRITE '<' +#define INST_EXECUTE '@' +#define INST_HELP '?' + +char tokenizeBuffer(char * buf, char * tokenBuff); +void evaluateStmt(char * buf); +int isLiteral(char c); +int isHex(char c); +int isNumerical(char c); +void monitor(char * buf); + +#endif \ No newline at end of file diff --git a/src/zdk projects/uart/tom80.c b/src/zdk projects/uart/tom80.c index a9ba334..b94d869 100644 --- a/src/zdk projects/uart/tom80.c +++ b/src/zdk projects/uart/tom80.c @@ -1,13 +1,11 @@ #include "tom80.h" void cls(){ - PRINTSTR("\033[2J"); + print("\033[2J"); } -void PRINTCH(char c){ +void putc(char c){ __asm - //PUSH AF - //PUSH HL //Clear DLAB IN A, (UART_LCR) @@ -26,13 +24,14 @@ void PRINTCH(char c){ ADD HL, SP LD A, (HL) OUT (UART_DHR), A - //POP HL - //POP AF + + CALL _UART_TOGGLE_OUT1 + RET __endasm } -unsigned char GETCH(){ +unsigned char getc(){ __asm PUSH AF @@ -58,10 +57,10 @@ unsigned char GETCH(){ __endasm } -void PRINTSTR(const char * s){ +void print(const char * s){ for(int i = 0; s[i] != '\0'; i++){ - PRINTCH(s[i]); + putc(s[i]); } } @@ -73,39 +72,19 @@ void getStr(char * buf){ int run = 1; while(c != '\r'){ - c = GETCH(); - PRINTCH(c); + c = getc(); + putc(c); buf[size] = c; size++; } buf[size] = '\0'; - PRINTCH('\n'); - UART_TOGGLE_OUT1(); + print('\n'); } -void evaluateStmt(char * buf){ - - PRINTCH('\r'); - - for(int i = 0; buf[i] != '\r'; i++){ - PRINTCH(buf[i]); - } - - PRINTCH('\n'); - PRINTCH('\r'); -} - -void monitor(char * buf){ - - getStr(buf); - evaluateStmt(buf); - -} - -void putc(char c, int x, int y){ +void plotc(char c, int x, int y){ char tx[8]; char ty[8]; @@ -113,39 +92,38 @@ void putc(char c, int x, int y){ itoa(x, &tx, 10); itoa(y, &ty, 10); - PRINTSTR("\033["); - PRINTSTR(ty); - PRINTSTR(";"); - PRINTSTR(tx); - PRINTSTR("H"); - PRINTCH(c); + print("\033["); + print(ty); + print(";"); + print(tx); + print("H"); + putc(c); } -void putstr(char * s, int x, int y){ +void plotStr(char * s, int x, int y){ for(int i = 0; s[i] != '\0'; i++){ - putc(s[i], x+i, y); + plotc(s[i], x+i, y); } } void setColor(ANSII_COLOR fg, ANSII_COLOR bg){ - //Reset everything - PRINTSTR("\033["); - PRINTSTR("0"); - PRINTSTR("m"); + print("\033["); + print("0"); + print("m"); //Print New Color - PRINTSTR("\033["); - PRINTSTR("3"); - PRINTCH(fg); - PRINTSTR(";"); - PRINTSTR("4"); - PRINTCH(bg); - PRINTSTR("m"); + print("\033["); + print("3"); + putc(fg); + print(";"); + print("4"); + putc(bg); + print("m"); } @@ -169,7 +147,7 @@ void simpleLoop(){ switch(getArrow()){ case 0: - putstr("NONE", 3, 1); + plotc("NONE", 3, 1); break; case 1: y--; @@ -184,24 +162,24 @@ void simpleLoop(){ x--; break; default: - putstr("ERROR", 2, 1); + plotc("ERROR", 2, 1); break; } - putstr(" ", (ox%32), (oy%16)); - putstr("A", (x%32), (y%16)); - putstr(" ", 1, 1); + plotc(" ", (ox%32), (oy%16)); + plotc("A", (x%32), (y%16)); + plotc(" ", 1, 1); } } -uint8_t getArrow(){ +char getArrow(){ - if(GETCH() == '\033'){ + if(getc() == '\033'){ //Ignore the '[' - GETCH(); + getc(); - switch(GETCH()) { + switch(getc()) { case 'A': return 1; break; diff --git a/src/zdk projects/uart/tom80.h b/src/zdk projects/uart/tom80.h index 9ff2c35..89799af 100644 --- a/src/zdk projects/uart/tom80.h +++ b/src/zdk projects/uart/tom80.h @@ -22,12 +22,12 @@ typedef enum { void cls(); void setColor(ANSII_COLOR fg, ANSII_COLOR bg); -void PRINTCH(char c); -unsigned char GETCH(); -void PRINTSTR(const char * s); +void putc(char c); +unsigned char getc(); +void print(const char * s); void getStr(char * buf); -void putc(char c, int x, int y); -void putstr(char * s, int x, int y); +void plotc(char c, int x, int y); +void plotStr(char * s, int x, int y); void monitor(char * buf); void HALT(); void evaluateStmt(char * buf); diff --git a/src/zdk projects/uart/uart.h b/src/zdk projects/uart/uart.h index 7d259c6..f97db19 100644 --- a/src/zdk projects/uart/uart.h +++ b/src/zdk projects/uart/uart.h @@ -3,7 +3,6 @@ #include #include -//#include #define UART_DHR 0 //UART Data R/W register #define UART_IER 1 //Interrupt Enable Register diff --git a/src/zdk projects/uart/uart.lst b/src/zdk projects/uart/uart.lst index e0c106e..4176511 100644 --- a/src/zdk projects/uart/uart.lst +++ b/src/zdk projects/uart/uart.lst @@ -1,4 +1,4 @@ -main.c uart.c tom80.c -blackjack.c \ No newline at end of file +monitor.c +main.c \ No newline at end of file From ea4e3144ab325bb033c54ca522762ac6787f9700 Mon Sep 17 00:00:00 2001 From: Aidan Jennings Date: Fri, 5 Feb 2021 09:36:21 -0600 Subject: [PATCH 2/6] just missing a few bits of functionality --- src/zdk projects/uart/monitor.c | 94 ++++++++++++++++++++++++++++++--- src/zdk projects/uart/monitor.h | 4 ++ src/zdk projects/uart/tom80.c | 1 + 3 files changed, 92 insertions(+), 7 deletions(-) diff --git a/src/zdk projects/uart/monitor.c b/src/zdk projects/uart/monitor.c index ed23250..3194097 100644 --- a/src/zdk projects/uart/monitor.c +++ b/src/zdk projects/uart/monitor.c @@ -24,9 +24,9 @@ char tokenizeBuffer(char * buf, char * tokenBuff){ tokenBuff[offset] = WORD; offset++; - while(isLiteral(c) == 1){ - c = buf[i+1]; + while(isLiteral(buf[i+1]) == 1){ i++; + c = buf[i]; if(isHex(c)){ litValue = (litValue<<4) | (0xF & (((uint16_t)c) - 0x37)); @@ -53,7 +53,7 @@ char tokenizeBuffer(char * buf, char * tokenBuff){ break; case INST_EXECUTE: - tokenBuff[offset] = WRITE; + tokenBuff[offset] = EXECUTE; offset++; break; @@ -66,6 +66,12 @@ char tokenizeBuffer(char * buf, char * tokenBuff){ //space bar break; + case '\r': + case '\n': + tokenBuff[offset] = EOF; + return 0; + break; + default: //return the offending character return c; @@ -79,22 +85,95 @@ char tokenizeBuffer(char * buf, char * tokenBuff){ } -void evaluateStmt(char * buf){ +int executeBuffer(char * buf) { + + //TODO, make a proper look ahead table + int offset = 0; + uint16_t lit1, lit2; + uint8_t instruction; + + switch(buf[offset]){ + case HELP: + monitor_help(); + return 0; + break; + + case EXECUTE: + monitor_execute(buf[offset+2]); + return 0; + break; + + case WORD: + monitor_word(buf); + return 0; + break; + + default: + return 0; + break; + } + + return 0; +} + +void evaluateStmt(char * buf) { unsigned char tokenBuff[128]; - print("\n\r"); - print(buf); + //print("\n\r"); + //print(buf); print("\n\r"); char tokenRet = tokenizeBuffer(buf, &tokenBuff); - if(tokenRet != 0){ + if (tokenRet != 0) { print("\n\rError, Unrecognized character : "); putc(tokenRet); print("\n\r"); + return; } + if (executeBuffer(&tokenBuff) != 0) { + print("\n\rError, Invalid syntax\n\r"); + } + +} + +void monitor_help(){ + print("\n\rINSTRUCTIONS : "); + print("\n\r1FFF : 10 - READ 16 BYTES STARTING AT LOCATION 0x1FFF"); + print("\n\r1FFF < 10 - WRITE 0x10 TO LOCAITON 0x1FFF"); + print("\n\r@1FFF - BEGIN EXECUTION AT LOCATION 0x1FFF"); + print("\n\r? - DISPLAY HELP MESSAGE"); + print("\n\n\r"); +} + +void monitor_execute(int addr){ + print("\n\rExecute code goes here\n\r"); +} + +void monitor_word(char * buf){ + + uint16_t lit1; + uint8_t lit2; + uint8_t instruction; + + //lazy, non LL(1) way of doing things + lit1 = buf[1]; + lit1 = lit1<<8; + lit1 = lit1 | buf[2]; + + instruction = buf[3]; + + lit2 = buf[6]; + + if (instruction == READ) { + print("\n\rREAD!\n\r"); + } else if (instruction == WRITE) { + print("\n\rWRITE!\n\r"); + } else { + print("\n\rinvalid instruction\n\r"); + } } int isLiteral(char c){ @@ -112,6 +191,7 @@ int isNumerical(char c){ void monitor(char * buf){ + print("[Tom80]:~$ "); getStr(buf); evaluateStmt(buf); diff --git a/src/zdk projects/uart/monitor.h b/src/zdk projects/uart/monitor.h index 89e5a37..83c911d 100644 --- a/src/zdk projects/uart/monitor.h +++ b/src/zdk projects/uart/monitor.h @@ -21,7 +21,11 @@ enum parser_token{ #define INST_HELP '?' char tokenizeBuffer(char * buf, char * tokenBuff); +int executeBuffer(char * tokenBuff); void evaluateStmt(char * buf); +void monitor_help(); +void monitor_execute(int addr); +void monitor_word(char * buf); int isLiteral(char c); int isHex(char c); int isNumerical(char c); diff --git a/src/zdk projects/uart/tom80.c b/src/zdk projects/uart/tom80.c index b94d869..6d6eec9 100644 --- a/src/zdk projects/uart/tom80.c +++ b/src/zdk projects/uart/tom80.c @@ -73,6 +73,7 @@ void getStr(char * buf){ while(c != '\r'){ c = getc(); + //TODO: switch statement for special chars putc(c); buf[size] = c; size++; From d0c7377d7c494e886f792a76fa391086b8fdc9d8 Mon Sep 17 00:00:00 2001 From: Aidan Jennings Date: Fri, 5 Feb 2021 22:17:47 -0600 Subject: [PATCH 3/6] updated c parser --- README.md | 6 +-- src/zdk projects/uart/main.c | 5 +-- src/zdk projects/uart/monitor.c | 75 +++++++++++++++++++++++++-------- src/zdk projects/uart/monitor.h | 3 +- src/zdk projects/uart/tom80.c | 10 ++--- 5 files changed, 69 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 817e5d9..d5b4df3 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ Also Includes: -28 Pin ZIF Socket -USB Interface - -Simple Memory Monitor (ASH.asm) - -a whopping 5 commands, including read, write, execute, AND MORE! - -not currently finished + -Simple Memory Monitor + -a whopping 4 commands, including read, write, execute, AND MORE! + -available in ASM (smaller) and C (easier to understand) versions Other (Older) files: diff --git a/src/zdk projects/uart/main.c b/src/zdk projects/uart/main.c index ae8f474..bea1ce0 100644 --- a/src/zdk projects/uart/main.c +++ b/src/zdk projects/uart/main.c @@ -14,16 +14,13 @@ void main(){ setColor(WHITE, BLACK); print("ASH v0.3C\n\r(C) 2020 by Aidan Jennings\n\r"); - print("ZILOG Z80 32k EEPROM, 32k SRAM\n\rTEXTONLY\n\r"); + print("ZILOG Z80 32k EEPROM, 32k SRAM\n\rTEXT ONLY\n\r"); print("\nBOOT PROCESS COMPLETE!\n\n\r"); unsigned char buffer[128]; -// buffer = malloc(128*sizeof(char)); while(1){ monitor(&buffer); - //simpleLoop(); - //putc(getc()); } } \ No newline at end of file diff --git a/src/zdk projects/uart/monitor.c b/src/zdk projects/uart/monitor.c index 3194097..c6d4930 100644 --- a/src/zdk projects/uart/monitor.c +++ b/src/zdk projects/uart/monitor.c @@ -4,39 +4,41 @@ char tokenizeBuffer(char * buf, char * tokenBuff){ char c; int offset = 0; - uint16_t litValue = 0; + uint16_t litValue; for(int i = 0; buf[i] != '\0'; i++){ c = buf[i]; //Special Case, handle literals - //TODO: Make this its own function and incorporate into the switch statement if(isLiteral(c) == 1){ + tokenBuff[offset] = WORD; + offset++; + + litValue = 0; + //convert first literal if(isHex(c)){ - litValue = ((uint16_t)c) - 0x37; + litValue = 0xF & (((uint8_t)c) - 0x37); }else{ - litValue = ((uint16_t)c) - 0x30; + litValue = 0xF & (((uint8_t)c) - 0x30); } - tokenBuff[offset] = WORD; - offset++; - while(isLiteral(buf[i+1]) == 1){ i++; c = buf[i]; if(isHex(c)){ - litValue = (litValue<<4) | (0xF & (((uint16_t)c) - 0x37)); + litValue = ((litValue & 0xFFF) << 4) | (0xF & (((uint8_t)c) - 0x37)); }else{ - litValue = (litValue<<4) | (0xF & (((uint16_t)c) - 0x30)); + litValue = ((litValue & 0xFFF) << 4) | (0xF & (((uint8_t)c) - 0x30)); } } - tokenBuff[offset] = (char)((litValue&0xFF00)>>8); + + tokenBuff[offset] = (uint8_t)((litValue >> 8) & 0xFF); offset++; - tokenBuff[offset] = (char)(litValue&0xFF); + tokenBuff[offset] = (uint8_t)(litValue & 0xFF); offset++; }else{ @@ -120,8 +122,6 @@ void evaluateStmt(char * buf) { unsigned char tokenBuff[128]; - //print("\n\r"); - //print(buf); print("\n\r"); char tokenRet = tokenizeBuffer(buf, &tokenBuff); @@ -154,9 +154,9 @@ void monitor_execute(int addr){ void monitor_word(char * buf){ - uint16_t lit1; - uint8_t lit2; - uint8_t instruction; + uint16_t lit1 = 0; + uint8_t lit2 = 0; + uint8_t instruction = 0; //lazy, non LL(1) way of doing things lit1 = buf[1]; @@ -168,7 +168,7 @@ void monitor_word(char * buf){ lit2 = buf[6]; if (instruction == READ) { - print("\n\rREAD!\n\r"); + readDump(lit1, lit2); } else if (instruction == WRITE) { print("\n\rWRITE!\n\r"); } else { @@ -176,6 +176,38 @@ void monitor_word(char * buf){ } } +void readDump(uint8_t * loc, int count){ + + char addr[5]; + char data[3]; + + for(int i = 0; i < count; i++){ + + //Print address + if(i%16 == 0){ + itoa((int)(loc + i), addr, 16); + print("\n\r"); + print(addr); + print(": "); + } + + //Leading 0 + if((uint8_t)*(loc + i) < 16){ + print("0"); + } + + itoa((uint8_t)*(loc + i), data, 16); + print(data); + print(" "); + + } + print("\n\r"); +} + +void writeByte(void * loc, uint8_t data){ + *loc = data; +} + int isLiteral(char c){ return isHex(c) | isNumerical(c); } @@ -189,10 +221,19 @@ int isNumerical(char c){ return (((int)c >= 0x30) & ((int)c <= 0x39)); } +void uppercase(char * buf){ + + for(int i = 0; buf[i] != '\0'; i++){ + buf[i] = toupper(buf[i]); + } + +} + void monitor(char * buf){ print("[Tom80]:~$ "); getStr(buf); + //uppercase(buf); evaluateStmt(buf); } \ No newline at end of file diff --git a/src/zdk projects/uart/monitor.h b/src/zdk projects/uart/monitor.h index 83c911d..60e07e8 100644 --- a/src/zdk projects/uart/monitor.h +++ b/src/zdk projects/uart/monitor.h @@ -4,6 +4,7 @@ #include "uart.h" #include "tom80.h" #include +#include enum parser_token{ EOF, @@ -30,5 +31,5 @@ int isLiteral(char c); int isHex(char c); int isNumerical(char c); void monitor(char * buf); - +void readDump(uint8_t * loc, int count); #endif \ No newline at end of file diff --git a/src/zdk projects/uart/tom80.c b/src/zdk projects/uart/tom80.c index 6d6eec9..9852782 100644 --- a/src/zdk projects/uart/tom80.c +++ b/src/zdk projects/uart/tom80.c @@ -148,7 +148,7 @@ void simpleLoop(){ switch(getArrow()){ case 0: - plotc("NONE", 3, 1); + plotc('-', 3, 1); break; case 1: y--; @@ -163,12 +163,12 @@ void simpleLoop(){ x--; break; default: - plotc("ERROR", 2, 1); + plotc('X', 2, 1); break; } - plotc(" ", (ox%32), (oy%16)); - plotc("A", (x%32), (y%16)); - plotc(" ", 1, 1); + plotc(' ', (ox%32), (oy%16)); + plotc('A', (x%32), (y%16)); + plotc(' ', 1, 1); } } From 7f1c82791f9b05d2a54a5bfeba9ea71794265c4f Mon Sep 17 00:00:00 2001 From: Aidan Jennings Date: Mon, 8 Feb 2021 11:16:02 -0600 Subject: [PATCH 4/6] I got bored and wrote the mandlebrot seq, Ill port it to z80 later --- src/zdk projects/uart/New folder/mand.c | 68 ++++++++++++++++++++++ src/zdk projects/uart/New folder/mand.exe | Bin 0 -> 59614 bytes src/zdk projects/uart/New folder/mand.h | 33 +++++++++++ 3 files changed, 101 insertions(+) create mode 100644 src/zdk projects/uart/New folder/mand.c create mode 100644 src/zdk projects/uart/New folder/mand.exe create mode 100644 src/zdk projects/uart/New folder/mand.h diff --git a/src/zdk projects/uart/New folder/mand.c b/src/zdk projects/uart/New folder/mand.c new file mode 100644 index 0000000..dce8487 --- /dev/null +++ b/src/zdk projects/uart/New folder/mand.c @@ -0,0 +1,68 @@ +#include "mand.h" + +int main(){ + //printf("hello world!\n"); + mandlebrot(); + return 0; +} + +void mandlebrot(){ + + /* + for each pixel (Px, Py) on the screen do + x0 := scaled x coordinate of pixel (scaled to lie in the Mandelbrot X scale (-2.5, 1)) + y0 := scaled y coordinate of pixel (scaled to lie in the Mandelbrot Y scale (-1, 1)) + x := 0.0 + y := 0.0 + iteration := 0 + max_iteration := 1000 + while (x*x + y*y ≤ 2*2 AND iteration < max_iteration) do + xtemp := x*x - y*y + x0 + y := 2*x*y + y0 + x := xtemp + iteration := iteration + 1 + + color := palette[iteration] + plot(Px, Py, color) + */ + + //y_MAX - (i*y_STEP) pixel coord -> function location + //x_MIN + (j*x_STEP) pixel coord -> function location + + + + for(int i = 0; i < HEIGHT; i++){ + //printf("y is %d, y_step is %d, y_range is %d\n", y_MAX - (i*y_STEP), y_STEP, y_RANGE); + for(int j = 0; j < WIDTH; j++){ + //printf("\tx is %d, x_step is %d, x_range is %d\n", x_MIN + (j*x_STEP), x_STEP, x_RANGE); + printf("%c", step(j, i)); + + } + printf("\n"); + } +} + +char step(int px, int py){ + + double x0 = (x_MIN + (px*x_STEP)); + double y0 = (y_MAX - (py*y_STEP)); + double x = 0; + double y = 0; + double iteration = 0; + double xtemp = 0; + + while(((x*x) + (y*y) <= UNKNOWN_CONSTANT) & (iteration < ITERATION_MAXIMUM)){ + xtemp = (x*x) - (y*y) + x0; + y = 2*x*y + y0; + x = xtemp; + iteration++; + } + return iteration > (ITERATION_MAXIMUM/50) ? '0' : ' ';/*iteration > (ITERATION_MAXIMUM/50) ? '█' : + iteration > (ITERATION_MAXIMUM/100) ? '#' : + iteration > (ITERATION_MAXIMUM/150) ? '%' : + iteration > (ITERATION_MAXIMUM/200) ? '&' : + iteration > (ITERATION_MAXIMUM/250) ? '^' : + iteration > (ITERATION_MAXIMUM/300) ? '"' : + iteration > (ITERATION_MAXIMUM/350) ? '*' : '.'; + //iteration > (ITERATION_MAXIMUM/400) ? '.' : ' ';*/ +} \ No newline at end of file diff --git a/src/zdk projects/uart/New folder/mand.exe b/src/zdk projects/uart/New folder/mand.exe new file mode 100644 index 0000000000000000000000000000000000000000..9da2dfa3f9a5b315dd9acbdcdae013e065ec48f6 GIT binary patch literal 59614 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

$RzZI1SJM^WQ{%xes%nxkEz zXnQ2w?(c64$7yF1wSs=x(Y(e;I2>nR$!iKHdb*>bR9LB%eLb%!l0=nvh9bRT_T9W` ziLl8$$yDyN;z3FU;nihqGt;yREg28D(ayFeq=Eix0dJ2)V$pDacZ%JFRA)FvyX>Jv zXOcA_-3=XwqkCB+#bd2n2lT_(El5S$V$r=kAATIt$#6;w#p7CPUp&lMtAO+-Q7^HN z&Db4G3$^vMN207Bv7Th7#@VtDFs)6*K89GVhu-kQ*pHajA!2WFa5hj_4;yf3*d5-( zR^@0?>Tl#|y-^N3m>X)1B~t8TxiDowp#5Ay_wn40c%nO+>R|spw<8e-^;5YWeK2~& zew$0%^Mw7U+@5exTO2LP@(@FX@KTYycyFq$E0ka>^XSSzD8ksfyksg72}iNMqgb@9 zC(fGk_9_-MB+&f#7dmhBH`Mxr8`hVi;fPfc`22r$_9XYVB~nTflIG3h|5gn=@AhV` z`o$7{^ex%**<}L$RT*X_@+RMwq|oFu7IwA zr`y@LHqzY+&|0{W9o?O4yEkmvw6<+uC*0=JMz*#q))QXa2`@c`+cwrxQ4Z;gCH5q{ zVsV13jkUhJy*shCf6FFqQ#sw?AP8?*FG(|8)b;opJ?l%?Z)T1GdUPR=6+y&&2jx_( zTQ~C+U(cGJRBtrAtuq|OW#Bd>Ly5MoZQ!>CcT=qCRKL3Qo;7tFa8fAa9j(3Hk#^K` zji{z)O-D4gCYcJg?O8*2HDIBI1<<0|lp_kSFKv5+G}1?n<(S7E+T47!S5E$Xxc{BF z`vrf!QF3u{cL!W${5%!Q z%fl@|p%j~kRZLG@)3lyet*tkKdu;kyPWRt)8H!=W^YcH5_(sGEjv~TPAh|E8;WnH| zcM>}JhgHZDFxW(br}C9YGXNHAbMulUY7Iadr;7se;@xR9(sNs3IX9?|B+{X zj{no+SqcHGukHly!^t^GBowqy2ai!f1&(+2poLh@4~dZi_9^Jkh`NG`#Z}H(v#_yb zJQ7OL+L-0MTAoW1AAu+fq}F0d+=qkC?w~9MM2F?jf=p;n=-n{!oTWB+ca-3la`-$f z1Y09}(9kS*Bk_WGxbvu&ZsWpQFt(>V%<}H^QbsI}je<_*yqc>IDOzAV*YO5Gikic@ zNu>Z_&bLv@nNKf4%zYIi&(qpN`y$<)T`+`B(Qxg_RBLxA$>w#@190;+x7PJ_(VsR}L>125%*n-QRcjB^P zG^VLMq%bhiBAYo}iEv!QJ#8J`{n|Q>?gwKzW>~p^<(gqz1T4=LiGh(U<>V1{EWnU}eGVyWlI2%B zC|82_8t@Ns_!3no%E0zZ=RUTm;JICRQfMiS4F%u23mRZcNf`y-COzaWjmEI&)EQ+3 z-ywbHv)pCCHs}B~$;u19@iC&&D{kx4Xdq(+|3(DZQjr+@ED-WoKJlU`A8>M6E|t3o zQv_|U#S-WP$yAb+I12uK1b4nI#eH_H;QK3FYW2+mnD8pB@S?a zC^GpRFz(|3S>_dj99o)8hGm&^ROUer5M_QtR3G91S>{!OJVI2cSSp5^!(Py#3Vuh0 zA6pt(r?rLJy27%x|3J`VOC#$o(DMX+dMWjoFgBL7R=#yr@J9lV!ZfIfLeX%nH_3Yy z;e?Z{;7^o)qNo+#5DJk|uma{F;HjbxZWIoldakGg6j(tHPmL9IpgmbZE>FDx%vR9K z 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 +#include +#include + +//#define int int16_t + +#define WIDTH 150 +#define HEIGHT 50 +#define x_MAX (double)1 +#define x_MIN (double)-2.5 +#define y_MAX (double)1 +#define y_MIN (double)-1 + +#define x_RANGE (double)(x_MAX-x_MIN) +#define y_RANGE (double)(y_MAX-y_MIN) + +#define x_STEP (double)(x_RANGE/WIDTH) +#define y_STEP (double)(y_RANGE/HEIGHT) + +#define ITERATION_MAXIMUM 1000 +#define UNKNOWN_CONSTANT 4 + +#define CHAR_ON '*' +#define CHAR_OFF ' ' + +int main(); +void mandlebrot(); +char step(int px, int py); + +#endif // MAND_H_ \ No newline at end of file From 2137e1b859bcab6a9937d4875acaffc549849802 Mon Sep 17 00:00:00 2001 From: Aidan Jennings Date: Mon, 8 Feb 2021 16:03:36 -0600 Subject: [PATCH 5/6] it kinda looks like it again now --- README.md | 2 +- src/zdk projects/uart/New folder/mand.c | 29 ++++++++------------- src/zdk projects/uart/New folder/mand.exe | Bin 59614 -> 59614 bytes src/zdk projects/uart/New folder/mand.h | 30 ++++++++++++++-------- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index d5b4df3..346c804 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Z80-Computer +# Tom80 (Tomato) Files relating to a Z80 based computer I am building diff --git a/src/zdk projects/uart/New folder/mand.c b/src/zdk projects/uart/New folder/mand.c index dce8487..a89f254 100644 --- a/src/zdk projects/uart/New folder/mand.c +++ b/src/zdk projects/uart/New folder/mand.c @@ -26,8 +26,6 @@ void mandlebrot(){ plot(Px, Py, color) */ - //y_MAX - (i*y_STEP) pixel coord -> function location - //x_MIN + (j*x_STEP) pixel coord -> function location @@ -44,25 +42,18 @@ void mandlebrot(){ char step(int px, int py){ - double x0 = (x_MIN + (px*x_STEP)); - double y0 = (y_MAX - (py*y_STEP)); - double x = 0; - double y = 0; - double iteration = 0; - double xtemp = 0; + int x0 = (x_SCALE_MIN + (px*x_STEP)); + int y0 = (y_SCALE_MAX - (py*y_STEP)); + int x = 0; + int y = 0; + int iteration = 0; + int xtemp = 0; - while(((x*x) + (y*y) <= UNKNOWN_CONSTANT) & (iteration < ITERATION_MAXIMUM)){ - xtemp = (x*x) - (y*y) + x0; - y = 2*x*y + y0; + while((((x*x)/(SCALE*SCALE)) + ((y*y)/(SCALE*SCALE)) <= UNKNOWN_CONSTANT) & (iteration < ITERATION_MAXIMUM)){ + xtemp = ((x*x)/(SCALE)) - ((y*y)/(SCALE)) + x0; + y = ((2*x*y)/(SCALE)) + y0; x = xtemp; iteration++; } - return iteration > (ITERATION_MAXIMUM/50) ? '0' : ' ';/*iteration > (ITERATION_MAXIMUM/50) ? '█' : - iteration > (ITERATION_MAXIMUM/100) ? '#' : - iteration > (ITERATION_MAXIMUM/150) ? '%' : - iteration > (ITERATION_MAXIMUM/200) ? '&' : - iteration > (ITERATION_MAXIMUM/250) ? '^' : - iteration > (ITERATION_MAXIMUM/300) ? '"' : - iteration > (ITERATION_MAXIMUM/350) ? '*' : '.'; - //iteration > (ITERATION_MAXIMUM/400) ? '.' : ' ';*/ + return iteration > (ITERATION_MAXIMUM/50) ? CHAR_ON : CHAR_OFF; } \ No newline at end of file diff --git a/src/zdk projects/uart/New folder/mand.exe b/src/zdk projects/uart/New folder/mand.exe index 9da2dfa3f9a5b315dd9acbdcdae013e065ec48f6..11de838e4f695901ab5ec252f9d5b80008aed17d 100644 GIT binary patch delta 6986 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

9aR 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 GQU3x&n Date: Mon, 8 Feb 2021 18:48:38 -0600 Subject: [PATCH 6/6] after much fine tuning... --- src/zdk projects/uart/New folder/mand.c | 32 ++-------------------- src/zdk projects/uart/New folder/mand.exe | Bin 59614 -> 59614 bytes src/zdk projects/uart/New folder/mand.h | 17 ++++++------ 3 files changed, 12 insertions(+), 37 deletions(-) diff --git a/src/zdk projects/uart/New folder/mand.c b/src/zdk projects/uart/New folder/mand.c index a89f254..d6b58fc 100644 --- a/src/zdk projects/uart/New folder/mand.c +++ b/src/zdk projects/uart/New folder/mand.c @@ -1,40 +1,14 @@ #include "mand.h" int main(){ - //printf("hello world!\n"); mandlebrot(); return 0; } void mandlebrot(){ - - /* - for each pixel (Px, Py) on the screen do - x0 := scaled x coordinate of pixel (scaled to lie in the Mandelbrot X scale (-2.5, 1)) - y0 := scaled y coordinate of pixel (scaled to lie in the Mandelbrot Y scale (-1, 1)) - x := 0.0 - y := 0.0 - iteration := 0 - max_iteration := 1000 - while (x*x + y*y ≤ 2*2 AND iteration < max_iteration) do - xtemp := x*x - y*y + x0 - y := 2*x*y + y0 - x := xtemp - iteration := iteration + 1 - - color := palette[iteration] - plot(Px, Py, color) - */ - - - - for(int i = 0; i < HEIGHT; i++){ - //printf("y is %d, y_step is %d, y_range is %d\n", y_MAX - (i*y_STEP), y_STEP, y_RANGE); for(int j = 0; j < WIDTH; j++){ - //printf("\tx is %d, x_step is %d, x_range is %d\n", x_MIN + (j*x_STEP), x_STEP, x_RANGE); printf("%c", step(j, i)); - } printf("\n"); } @@ -49,11 +23,11 @@ char step(int px, int py){ int iteration = 0; int xtemp = 0; - while((((x*x)/(SCALE*SCALE)) + ((y*y)/(SCALE*SCALE)) <= UNKNOWN_CONSTANT) & (iteration < ITERATION_MAXIMUM)){ - xtemp = ((x*x)/(SCALE)) - ((y*y)/(SCALE)) + x0; + while((((x*x)) + ((y*y)) <= UNKNOWN_CONSTANT) & (iteration < ITERATION_MAXIMUM)){ + xtemp = ((x*x)/(SCALE)) - ((y*y)/(SCALE)) + (x0); y = ((2*x*y)/(SCALE)) + y0; x = xtemp; iteration++; } - return iteration > (ITERATION_MAXIMUM/50) ? CHAR_ON : CHAR_OFF; + return iteration == (ITERATION_MAXIMUM) ? CHAR_ON : CHAR_OFF; } \ No newline at end of file diff --git a/src/zdk projects/uart/New folder/mand.exe b/src/zdk projects/uart/New folder/mand.exe index 11de838e4f695901ab5ec252f9d5b80008aed17d..b9ea01056e0b03be7a607d6a8d0fce924fecb228 100644 GIT binary patch delta 2274 zcmZ8iZBSI#89wiY3n(A=Mg$=;u(AdkW0izp80*K0FQXo|jv2P_ux*q=e{5OWLo23Bsrp$Nbi#X|>Qju4)b-pKpQ~5M zy~3xuw%ZcoTk)$Xju)%N^d4_hU!EJ0QLd2JslC&^(CY>`mYyp$H+oo(WN( z3)3#C^0`kNL+%r>Lse0E!svjZT~;}=T$+Tj*V>T-`fiMtot4sa(owHO(O_sIT?$i2 zTyjzuwo0Sn8vst^wTT7EZE~mG!Z)}*(L<%ICjEc{yfSG=$q}qg)uDOzCZ|Sq4ilnFXRIK)gAU)RO54pYrLND#+HBd z;?P8BQEV*|TZ>>VGP~uB-|(IZ|T0EZ=}XosbhB*yz6(hdDdM`Ppw*8 zD#Tr_Dj-Rvjeib2--7TyB4*Y6+FJCV8dWcZ;j37#u}m>e3W4#S5TCp$GmRx4@m>G+`5H~jUdzF^>fO5mG3-^h~#zF^t@nXeYU-&^61~ie)1IJJT%DFp z#b#65c7>e$slHNMTM~PBlpU$KGluDY>>X;Yd1$_NxYnLBZ%aaMsiEHo1py zt^%1iMO+}urbsc!>M2qHvUQ4NgS1bP6p+&oh#&Xfad(BLyBs#+ru1dBm3z|g4OgqpDS2HpL1H_pQxPQDSQqefZK)j^m}vDcaErCMQZYR zy$ih+V)Oeh)3IO$WhY;WM*ltKh*ILOl|o~O5N=3g}Au)p;RAz)i4o#xNmzExZ**S(U@ zX}kTX^XP6?kCxoo?=*)GpsWfT zPIdyeNyziN-d8NUsR@ombY9_#=6qgxa4XX8J-7wcNR`2U9FO!8W_xRL_ZCG@lBt`A zyK6~t*_aCs`IWjDybgFQra17s*HLo}FFU+R!G)n7Ctp0`N3PV9!%I&knoWOrRi|o` zdQR#%2kM#47yIVp7{2KH1gU=5??mooRn4@f2_X*~M~~lFvJevrZ?m37zJIjFkZ*IK z1h@7KMx8$nl&3pzQ6FwNlPa%Q*+2=LHVhm`fb79?Wg?C@3_eT8_|RY{;uM~DqU}Gz zXz}**9t!ejz=TM(GYD`!I`jc;5tPU#>zcUcOuccPB4<;JR@1I4Za_>P#Pp_@VxrEcyOLN6Vop Nzk<>1yz-OB{|i9vA`}1s delta 2303 zcmZuye^3~DR*Z6YYY&hM4tKH*XhP%?r6EpgkI06bL?UX5lIloJ+A^^brb>{* zNiB1Gw0sViirv7PK zC)M)3OckB=x?~>SG*p5Gmy1i`Gu$R_fPEMi>){1_X4dy8t!=ZcUQu_`7HrHXpK&K+ zVFrxv&U%Sf$n!FqqU&YGCgz02pS{WME{mh2O~tp9_`k$Re1oRw<0K|$zat!G0%OeQ ziLu5!GIem3s`R_U%5k!js;c_9%TI=OUgh`?xQV&if;$!v{Y#3Lo#xU3?&u6h$w)M2 z;X>oMlTTu?mm6K`5aIdwN_xTE0N<&%@Hg0=?g1ByvtNKqxN7!}lHb$XOpW5n2gx5E zB#jS}9PP{54#68%5ITWBowzT9x78KR1+;zUH6vNNGR?VLtop}PZkfUk+RNA=2v16 zQI#n9g5X2)``-M@O|FXjm8hyDe9AQ3kA1>_r7jga;q z5mQDcDv2zgAx>`{W&bry5=7MNN5YK4iM6cv~`cxfVuVwO3$BV)hA;< z{wa4oxHZdyj~;>5IQUpE{2J>D*1$R(C|CzcG!_09*5k*8&(K%lR$(LbYOgOkBHF8~ zyPed;)a9&qGG?c*!3cefQkNzzDF^GFv1IZDjR6{A8niFj7PN9=IOn z4(+-_N=GPdH*TNL*zpF&_^Ff>o5J685e}pzMF;*aMD)%I_H+z3=VAH59hCK%gIk4QO5(zR5KHY$AhjoebGx?+ z_SrmycDTC^geo0l!J&Y#I|auH_NNs4-+PyePT>`YUl*uq=#%mMkpLwNeGBmWC(||e z`}-tl(4enZqQamr7taqCQC(Am|Dt&R{Ig7*hG0!*&Xym;tv8FN1zOG~7jT z3eU>a`IqP(!TPfvxQ72G+=KJZog>TTa}|`g?ffy)gwAiJz)yxR)8Q3Ix+rA#$T?E} z=z@om_{W7BaA-?E`72l)JkNV+uctRnLhEP^wPO2d3AyVX^^ohrv13%hg)!L@Bk_Ix W*E#&XOO92Lrs5*qwXTb+AN?Oj12r1} diff --git a/src/zdk projects/uart/New folder/mand.h b/src/zdk projects/uart/New folder/mand.h index 2e7bee1..cb57306 100644 --- a/src/zdk projects/uart/New folder/mand.h +++ b/src/zdk projects/uart/New folder/mand.h @@ -5,31 +5,32 @@ #include #include -//#define int int16_t +#define int int16_t -#define WIDTH 75 -#define HEIGHT 20 +#define WIDTH 100 +#define HEIGHT 28 -#define SCALE 100 +#define SCALE 10000 #define x_MAX 1 #define x_MIN -2.5 #define y_MAX 1 #define y_MIN -1 +#define ITERATION_MAXIMUM 100 + #define x_SCALE_MAX (x_MAX * SCALE) #define x_SCALE_MIN (x_MIN * SCALE) #define y_SCALE_MAX (y_MAX * SCALE) #define y_SCALE_MIN (y_MIN * SCALE) -#define x_RANGE (float)(x_SCALE_MAX-x_SCALE_MIN) -#define y_RANGE (float)(y_SCALE_MAX-y_SCALE_MIN) +#define x_RANGE (x_SCALE_MAX-x_SCALE_MIN) +#define y_RANGE (y_SCALE_MAX-y_SCALE_MIN) #define x_STEP (x_RANGE/WIDTH) #define y_STEP (y_RANGE/HEIGHT) -#define ITERATION_MAXIMUM 1000 -#define UNKNOWN_CONSTANT 4 +#define UNKNOWN_CONSTANT (4 * SCALE * SCALE) #define CHAR_ON '.' #define CHAR_OFF ' '