From ae4f61cf2835ab9d256069f6209587d631d4be3f Mon Sep 17 00:00:00 2001 From: nino-porcino Date: Mon, 28 Mar 2022 19:26:46 +0200 Subject: [PATCH] add viaclock demo --- demos/viatimer/m.bat | 3 +- demos/viatimer/out/viaclock#060280 | Bin 0 -> 1707 bytes demos/viatimer/viaclock.c | 99 +++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 demos/viatimer/out/viaclock#060280 create mode 100644 demos/viatimer/viaclock.c diff --git a/demos/viatimer/m.bat b/demos/viatimer/m.bat index 98d7c16..1e70586 100644 --- a/demos/viatimer/m.bat +++ b/demos/viatimer/m.bat @@ -1,2 +1,3 @@ -@call ..\..\tools\build viatimer +rem @call ..\..\tools\build viatimer +@call ..\..\tools\build viaclock diff --git a/demos/viatimer/out/viaclock#060280 b/demos/viatimer/out/viaclock#060280 new file mode 100644 index 0000000000000000000000000000000000000000..0840cab6200850f055628b6862a98ba8be3b07f7 GIT binary patch literal 1707 zcmZuvU1(fI6h3=*cXsdX-fe!i$xx+^V2efrw=I@MF5ASC(%{zCCeez5Lu0Olh7u6k zJS=zn;0T6B`Xue!QhG~A5UNk=Q(jscX>p|wg7^>%UCfjFuCRXRZc+uE-MMqlcmBR} zW-J*p8RM8yBTdDOm_6!|qt_lfpa1Aw`N`>w+VJjZd!HpU+L4fDdkC`ZR3KN{0&=A@ zVl!sXE4h}X8`Po+bvtX17}sWvr`EIf)IZ|#Q&Ih#RTH_yH6!-Qf5D3NO zrzh2sR}URhle6lD$sh>W;hhuEW~Wb1sp%OtJ*!?kacb_&j8ZSD|FNB%esgYiY6dp- zVcxE8%Yx$OL(bsOrZ95%rgW4IL(ypWHqdN`w>f`*EH~rP?4|4Now%M6i8p2nLL4Z_#9a`^ zO}vGI@q~N8L!exMcj7IQ@e;SX6&Ux9bI-ev>`7kz(bM+w_+Wd3y23Wc2ii!lRh+lK zqCzgEsXoi=*WaCb-lt^vZlzmGDrPttF}}Kz|70jBnn3`mG5}?_eGh^8{(B))PRbj_ ztEGQ|+6HoA=vG;MpJ!<>m2Q>oYumuUQ`7EL>Xhqy^8WUs64@$hWctbZG_k^@;|s{>i-c1+EKg8W%Df8PYzCp|n&b#4ID0kOeEI`Ag07 z^Yil*U5sM{BA!>6)`LS|56h{}amXKXKNun}u9N!r4@t;%zIh4xq7c+0wlf8a)3IWH zxRxLYsWcQcf^&aS$h=CJj||h4G!QhK!2l1c*W)jRq88PNG|#ueI%vUP0A?JFV%E#D z#&w7o7LC3?E?iQT`zL`2Awu9w+y|p6PEivRKpfJ8FX!X_Q@w!!^z#YUQ5bmo@Q|13 z^8Ilb^WZS9kN#^%Smy!s@mgsG_l$QH<2}h<51;k*Am9x#U55`pc#!Vv52C}^e*+aJ B*2(|? literal 0 HcmV?d00001 diff --git a/demos/viatimer/viaclock.c b/demos/viatimer/viaclock.c new file mode 100644 index 0000000..8902474 --- /dev/null +++ b/demos/viatimer/viaclock.c @@ -0,0 +1,99 @@ +#define APPLE1_USE_WOZ_MONITOR 1 + +#define INPUT_LINE_PROMPT_CHAR '?' + +#include + +#include +#include +#include +#include +#include +#include + +#include "..\..\lib\c64font.h" + +const word ONE_TICK = 16666; // timer constant for 1/60 second + +void enable_timer_interrupt() { + + // install the interrupt handler + install_interrupt((word) &time_interrupt_handler); + + *VIA_IER = 0b11000000; // enable T1 interrupts + *VIA_ACR = 0b01000000; // T1 continous, PB7 disabled + *VIA_T1CL = BYTE0(ONE_TICK); // programs the counter to 1/60 + *VIA_T1CH = BYTE1(ONE_TICK); // and starts counting +} + +void disable_timer_interrupt() { + *VIA_IER = 0b01000000; // disable T1 interrupts + *VIA_ACR = 0; // stop T1 (makes it one-shot) +} + +byte last_min = 0xFF; + +void print_digit_scanline(byte c, byte y) { + word index = ((word) c-32) * 8 + (word) y; + byte *ptr = FONT + index; + + byte mask = 128; + for(byte t=0;t<8;t++) { + if(*ptr & mask) woz_putc('@'); + else woz_putc(' '); + mask = mask >> 1; + } +} + +void print_clock() { + byte c1,c2,c3,c4; + + if(last_min != _minutes) { + last_min = _minutes; + + c1 = divr8u(_hours, 10, 0); c2 = rem8u; + c3 = divr8u(_minutes, 10, 0); c4 = rem8u; + + woz_puts("\r\r\r\r\r\r\r\r"); + for(byte t=0;t<8;t++) { + print_digit_scanline(c1+'0',t); + print_digit_scanline(c2+'0',t); + print_digit_scanline( ':',t); + print_digit_scanline(c3+'0',t); + print_digit_scanline(c4+'0',t); + } + woz_puts("\r\r\r\r\r\r\r\r"); + } +} + +void bye() { + disable_timer_interrupt(); + woz_puts("BYE!\r"); + woz_mon(); +} + +byte *const KEYBUF = (byte *) 0x0200; // use the same keyboard buffer as in WOZ monitor + +void main() { + enable_timer_interrupt(); + + woz_puts("\r\r*** APPLE1 CLOCK ***\r\r"); + + woz_puts("\r\rREQUIRES A VIA 6522 AT $A000\r\r"); + + woz_puts("\rWHAT TIME IS IT (HOURS ) "); apple1_input_line_prompt(KEYBUF, 2); + _hours = (byte) atoi(KEYBUF); + woz_puts("\rWHAT TIME IS IT (MINUTES) "); apple1_input_line_prompt(KEYBUF, 2); + _minutes = (byte) atoi(KEYBUF); + + woz_putc('\r'); + + while(1) { + byte k = apple1_readkey(); + if(k=='X') break; + print_clock(); + } + + bye(); +} +