From 9a2b9e747cbfb991bc039433de73c12e9e08bda9 Mon Sep 17 00:00:00 2001 From: Bill Chatfield Date: Fri, 9 Oct 2015 11:26:41 -0400 Subject: [PATCH] Too many to remember. --- .map | 871 ++++++++++++++++++++++++++++++++ .noslotclock.c.swp | Bin 0 -> 12288 bytes .swp | Bin 0 -> 12288 bytes .trace.c.swp | Bin 0 -> 12288 bytes 12hourclk.c | 160 ------ 12hourclk.h | 25 - alarmclk.dsk => ALARM.CLOCK.dsk | Bin 143360 -> 143360 bytes ALARMCLK.dsk | Bin 143360 -> 0 bytes Makefile | 20 +- alarmclk.c => alarm.clock.c | 75 +-- alarmclk.s | 515 ------------------- ascii.h | 17 + calcClkfreq.c | 9 - clkfreq | Bin 1283 -> 0 bytes clkfreq.h | 10 - clkfreq.s | 218 -------- noslotclock.c | 87 ++++ noslotclock.h | 10 + old/old-time.c | 176 +++++++ old/old-time.h | 27 + old/old_funcs.c | 92 ++++ printf.s | 37 -- prodos.c | 50 ++ prodos.h | 32 ++ putc.c | 6 - putc.s | 25 - symbols.h | 6 + time.c | 154 ++++++ time.h | 14 + trace.c | 59 +++ trace.h | 38 ++ 31 files changed, 1688 insertions(+), 1045 deletions(-) create mode 100644 .map create mode 100644 .noslotclock.c.swp create mode 100644 .swp create mode 100644 .trace.c.swp delete mode 100644 12hourclk.c delete mode 100644 12hourclk.h rename alarmclk.dsk => ALARM.CLOCK.dsk (84%) delete mode 100644 ALARMCLK.dsk rename alarmclk.c => alarm.clock.c (83%) delete mode 100644 alarmclk.s create mode 100644 ascii.h delete mode 100644 calcClkfreq.c delete mode 100644 clkfreq delete mode 100644 clkfreq.h delete mode 100644 clkfreq.s create mode 100644 noslotclock.c create mode 100644 noslotclock.h create mode 100644 old/old-time.c create mode 100644 old/old-time.h create mode 100644 old/old_funcs.c delete mode 100644 printf.s create mode 100644 prodos.c create mode 100644 prodos.h delete mode 100644 putc.c delete mode 100644 putc.s create mode 100644 symbols.h create mode 100644 time.c create mode 100644 time.h create mode 100644 trace.c create mode 100644 trace.h diff --git a/.map b/.map new file mode 100644 index 0000000..809d24a --- /dev/null +++ b/.map @@ -0,0 +1,871 @@ +Modules list: +------------- +alarmclock.o: + CODE Offs=000000 Size=0001B9 Align=00001 Fill=0000 + RODATA Offs=000000 Size=000038 Align=00001 Fill=0000 + BSS Offs=000000 Size=00000A Align=00001 Fill=0000 +thclock.o: + CODE Offs=0001B9 Size=0002F1 Align=00001 Fill=0000 + RODATA Offs=000038 Size=000041 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(_file.o): + DATA Offs=000000 Size=00001E Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(_hextab.o): + RODATA Offs=000079 Size=000010 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(_longminstr.o): + RODATA Offs=000089 Size=00000C Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(_oserror.o): + BSS Offs=00000A Size=000001 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(_printf.o): + CODE Offs=0004AA Size=0003A5 Align=00001 Fill=0000 + BSS Offs=00000B Size=00002B Align=00001 Fill=0000 + DATA Offs=00001E Size=000003 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(_scanf.o): + CODE Offs=00084F Size=000770 Align=00001 Fill=0000 + RODATA Offs=000095 Size=000008 Align=00001 Fill=0000 + BSS Offs=000036 Size=000042 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(_seterrno.o): + CODE Offs=000FBF Size=000009 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(addeqsp.o): + CODE Offs=000FC8 Size=000011 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(addysp.o): + CODE Offs=000FD9 Size=00000E Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(along.o): + CODE Offs=000FE7 Size=000012 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(axlong.o): + CODE Offs=000FF9 Size=000012 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(callmain.o): + CODE Offs=00100B Size=000017 Align=00001 Fill=0000 + BSS Offs=000078 Size=000004 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(cgetc.o): + CODE Offs=001022 Size=000012 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(clrscr.o): +/home/bill/opt/cc65/lib/apple2enh.lib(compl.o): + CODE Offs=001034 Size=000009 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(condes.o): + CODE Offs=00103D Size=00000C Align=00001 Fill=0000 + DATA Offs=000021 Size=000025 Align=00001 Fill=0000 + INIT Offs=000000 Size=00000C Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(cout.o): + LOWCODE Offs=000000 Size=00000A Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(crt0.o): + CODE Offs=001049 Size=000012 Align=00001 Fill=0000 + RODATA Offs=00009D Size=000007 Align=00001 Fill=0000 + BSS Offs=00007C Size=000003 Align=00001 Fill=0000 + DATA Offs=000046 Size=000003 Align=00001 Fill=0000 + STARTUP Offs=000000 Size=00006A Align=00001 Fill=0000 + INIT Offs=00000C Size=00004E Align=00001 Fill=0000 + ZPSAVE Offs=000000 Size=00001A Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(ctype.o): + RODATA Offs=0000A4 Size=000100 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(decaxy.o): + CODE Offs=00105B Size=000009 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(decsp1.o): + CODE Offs=001064 Size=000009 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(decsp3.o): + CODE Offs=00106D Size=00000D Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(decsp4.o): + CODE Offs=00107A Size=00000D Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(decsp6.o): + CODE Offs=001087 Size=00000D Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(dosdetect.o): + BSS Offs=00007F Size=000001 Align=00001 Fill=0000 + INIT Offs=00005A Size=000014 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(errno.o): + CODE Offs=001094 Size=000018 Align=00001 Fill=0000 + BSS Offs=000080 Size=000002 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(exehdr.o): + EXEHDR Offs=000000 Size=000004 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(fgetc.o): + CODE Offs=0010AC Size=000084 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(filedes.o): + CODE Offs=001130 Size=000016 Align=00001 Fill=0000 + DATA Offs=000049 Size=000020 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(fmisc.o): + CODE Offs=001146 Size=000044 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(fwrite.o): + CODE Offs=00118A Size=00007B Align=00001 Fill=0000 + BSS Offs=000082 Size=000002 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(home.o): + LOWCODE Offs=00000A Size=00000A Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(icmp.o): + CODE Offs=001205 Size=00002E Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(incsp1.o): + CODE Offs=001233 Size=000007 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(incsp2.o): + CODE Offs=00123A Size=000015 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(incsp3.o): + CODE Offs=00124F Size=000005 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(incsp4.o): + CODE Offs=001254 Size=000005 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(incsp5.o): + CODE Offs=001259 Size=000005 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(incsp6.o): + CODE Offs=00125E Size=000005 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(incsp8.o): + CODE Offs=001263 Size=000005 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(isdigit.o): + CODE Offs=001268 Size=00000F Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(isspace.o): + CODE Offs=001277 Size=00000F Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(isxdigit.o): + CODE Offs=001286 Size=00000F Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(jmpvec.o): + DATA Offs=000069 Size=000003 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(kbhit.o): + CODE Offs=001295 Size=000009 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(ladd.o): + CODE Offs=00129E Size=000024 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(ldaxi.o): + CODE Offs=0012C2 Size=00000D Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(ldaxsp.o): + CODE Offs=0012CF Size=000009 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(leaaxsp.o): + CODE Offs=0012D8 Size=00000C Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(lmul.o): + CODE Offs=0012E4 Size=00005C Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(lneg.o): + CODE Offs=001340 Size=00001E Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(longjmp.o): + CODE Offs=00135E Size=000030 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(lpush.o): + CODE Offs=00138E Size=000021 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(ltoa.o): + CODE Offs=0013AF Size=0000AF Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(makebool.o): + CODE Offs=00145E Size=000031 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(mli.o): + BSS Offs=000084 Size=000012 Align=00001 Fill=0000 + DATA Offs=00006C Size=000016 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(mul.o): + CODE Offs=00148F Size=000045 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(mul8.o): + CODE Offs=0014D4 Size=00003A Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(mulax10.o): + CODE Offs=00150E Size=000019 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(oserror.o): + CODE Offs=001527 Size=000016 Align=00001 Fill=0000 + RODATA Offs=0001A4 Size=000030 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(popsreg.o): + CODE Offs=00153D Size=00000F Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(printf.o): + CODE Offs=00154C Size=000033 Align=00001 Fill=0000 + BSS Offs=000096 Size=000001 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(push1.o): + CODE Offs=00157F Size=000005 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(pusha.o): + CODE Offs=001584 Size=000016 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(pushax.o): + CODE Offs=00159A Size=00001A Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(pushwsp.o): + CODE Offs=0015B4 Size=00001C Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(puts.o): + CODE Offs=0015D0 Size=000065 Align=00001 Fill=0000 + DATA Offs=000082 Size=000001 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(rdkey.o): + LOWCODE Offs=000014 Size=00000A Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(read.o): + CODE Offs=001635 Size=00005A Align=00001 Fill=0000 + INIT Offs=00006E Size=000005 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(regswap2.o): + CODE Offs=00168F Size=000016 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(return0.o): + CODE Offs=0016A5 Size=000004 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(rwcommon.o): + CODE Offs=0016A9 Size=000041 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(scanf.o): + CODE Offs=0016EA Size=000033 Align=00001 Fill=0000 + BSS Offs=000097 Size=000001 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(setjmp.o): + CODE Offs=00171D Size=000026 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(staspidx.o): + CODE Offs=001743 Size=000016 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(staxsp.o): + CODE Offs=001759 Size=00000B Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(strlen.o): + CODE Offs=001764 Size=000016 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(strlower.o): + CODE Offs=00177A Size=000028 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(sub.o): + CODE Offs=0017A2 Size=000014 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(tolower.o): + CODE Offs=0017B6 Size=000010 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(toupper.o): + CODE Offs=0017C6 Size=000010 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(udiv.o): + CODE Offs=0017D6 Size=00004F Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(umod.o): + CODE Offs=001825 Size=000011 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(ungetc.o): + CODE Offs=001836 Size=00002E Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(vfprintf.o): + CODE Offs=001864 Size=000060 Align=00001 Fill=0000 + DATA Offs=000083 Size=000008 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(vfscanf.o): + CODE Offs=0018C4 Size=000033 Align=00001 Fill=0000 + DATA Offs=00008B Size=000006 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(write.o): + CODE Offs=0018F7 Size=00006A Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(zerobss.o): + INIT Offs=000073 Size=000023 Align=00001 Fill=0000 +/home/bill/opt/cc65/lib/apple2enh.lib(zeropage.o): + ZEROPAGE Offs=000000 Size=00001A Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +EXEHDR 000000 000003 000004 00001 +ZEROPAGE 000080 000099 00001A 00001 +STARTUP 000803 00086C 00006A 00001 +LOWCODE 00086D 00088A 00001E 00001 +CODE 00088B 0021EB 001961 00001 +RODATA 0021EC 0023BF 0001D4 00001 +DATA 0023C0 002450 000091 00001 +ZPSAVE 002451 00246A 00001A 00001 +BSS 00246B 002502 000098 00001 +INIT 002503 00259C 00009A 00001 + + +Exports list by name: +--------------------- +COUT 00086D RLA HOME 000877 RLA +RDKEY 000881 RLA __BSS_RUN__ 00246B RLA +__BSS_SIZE__ 000098 REA __CONSTRUCTOR_COUNT__ 000002 REA +__CONSTRUCTOR_TABLE__ 002599 RLA __DESTRUCTOR_COUNT__ 000000 REA +__DESTRUCTOR_TABLE__ 0023C0 RLA __EXEHDR__ 000001 REA +__HIMEM__ 009600 REA __INIT_RUN__ 002503 RLA +__INIT_SIZE__ 00009A REA __LCADDR__ 00D400 REA +__LCSIZE__ 000C00 REA __LC_LAST__ 00D400 RLA +__LC_START__ 00D400 RLA __LOADADDR__ 000803 REA +__LOADSIZE__ 001CE8 REA __MOVE_LAST__ 00009A RLA +__MOVE_START__ 000000 RLA __STACKSIZE__ 000800 REA +__STARTUP_RUN__ 000803 RLA __STARTUP__ 000001 REA +__ZPSAVE_RUN__ 002451 RLA __ctype 002290 RLA +__directerrno 00191F RLA __dos_type 0024EA RLA +__errno 0024EB RLA __hextab 002265 RLA +__longminstr 002275 RLA __mappederrno 001927 RLA +__oserror 002475 RLA __osmaperrno 001DB2 RLA +__printf 000E28 RLA __scanf 0010DA RLA +__seterrno 00184A RLA __setjmp 001FA8 RLA +_add_one_second 000AF4 RLA _cgetc 0018AD RLA +_clrscr 000877 RLA _ferror 0019F4 RLA +_fgetc 001937 RLA _fwrite 001A15 RLA +_isdigit 001AF3 RLA _isspace 001B02 RLA +_isxdigit 001B11 RLA _kbhit 001B20 RLA +_longjmp 001BE9 RLA _ltoa 001C56 RLA +_main 000A1C RLA _print_time 000CB4 RLA +_printf 001DD7 RLA _puts 001E5B RLA +_read 001EC0 RLA _read_interactively 000A44 RLA +_reprint_time 000D04 RLA _scanf 001F75 RLA +_stdin 0023D8 RLA _stdout 0023DA RLA +_strlen 001FEF RLA _strlower 002005 RLA +_tolower 002041 RLA _toupper 002051 RLA +_ultoa 001CAD RLA _ungetc 0020C1 RLA +_vfprintf 002126 RLA _vfscanf 00214F RLA +_write 002182 RLA addeqysp 001855 RLA +addysp 001865 RLA addysp1 001864 RLA +aulong 001872 RLA axlong 00188B RLA +axulong 001884 RLA booleq 001CEF RLA +callmain 001896 RLA callmli 00242C RLA +complax 0018BF RLA decaxy 0018E6 RLA +decsp1 0018EF RLA decsp3 0018F8 RLA +decsp4 001905 RLA decsp6 001912 RLA +donelib 0018C8 RLA fdtab 002409 RLA +getfd 0019BB RLA incsp1 001ABE RLA +incsp2 001ACC RLA incsp3 001ADA RLA +incsp4 001ADF RLA incsp5 001AE4 RLA +incsp6 001AE9 RLA incsp8 001AEE RLA +initdostype 00255D LAI initlib 002503 RLA +initprompt 002571 LAI jmpvec 002429 RLA +ldax0sp 001B5A RLA ldaxi 001B4D RLA +ldaxidx 001B4F RLA ldaxysp 001B5C RLA +leaa0sp 001B63 RLA mliparam 0024EF RLA +mul8x16 001D61 RLA mul8x16a 001D6C RLA +mulax10 001D99 RLA negeax 001BCB RLA +popax 001AC5 RLA popsreg 001DC8 RLA +ptr1 000088 RLZ ptr2 00008A RLZ +ptr3 00008C RLZ ptr4 00008E RLZ +push1 001E0A RLA pusha 001E13 RLA +pusha0 001E27 RLA pushax 001E29 RLA +pusheax 001C22 RLA pushwysp 001E41 RLA +regbank 000094 RLZ regsave 000084 RLZ +regswap2 001F1A RLA return0 001F30 RLA +rwcommon 001F45 RLA rwepilog 001F68 RLA +rwprolog 001F34 RLA sp 000080 RLZ +sreg 000082 RLZ staspidx 001FCE RLA +stax0sp 001FE4 RLA staxysp 001FE6 RLA +tmp1 000090 RLZ tmp2 000091 RLZ +tmp3 000092 RLZ tmp4 000093 RLZ +tosaddeax 001B2F RLA tosicmp0 001A90 RLA +tosmuleax 001B75 RLA tossuba0 00202D RLA +tosudiva0 002061 RLA tosudivax 002063 RLA +tosumoda0 0020B0 RLA tosumulax 001D1A RLA +udiv16 002072 RLA zerobss 002576 RLA + + + +Exports list by value: +---------------------- +__DESTRUCTOR_COUNT__ 000000 REA __MOVE_START__ 000000 RLA +__EXEHDR__ 000001 REA __STARTUP__ 000001 REA +__CONSTRUCTOR_COUNT__ 000002 REA sp 000080 RLZ +sreg 000082 RLZ regsave 000084 RLZ +ptr1 000088 RLZ ptr2 00008A RLZ +ptr3 00008C RLZ ptr4 00008E RLZ +tmp1 000090 RLZ tmp2 000091 RLZ +tmp3 000092 RLZ tmp4 000093 RLZ +regbank 000094 RLZ __BSS_SIZE__ 000098 REA +__INIT_SIZE__ 00009A REA __MOVE_LAST__ 00009A RLA +__STACKSIZE__ 000800 REA __LOADADDR__ 000803 REA +__STARTUP_RUN__ 000803 RLA COUT 00086D RLA +HOME 000877 RLA _clrscr 000877 RLA +RDKEY 000881 RLA _main 000A1C RLA +_read_interactively 000A44 RLA _add_one_second 000AF4 RLA +__LCSIZE__ 000C00 REA _print_time 000CB4 RLA +_reprint_time 000D04 RLA __printf 000E28 RLA +__scanf 0010DA RLA __seterrno 00184A RLA +addeqysp 001855 RLA addysp1 001864 RLA +addysp 001865 RLA aulong 001872 RLA +axulong 001884 RLA axlong 00188B RLA +callmain 001896 RLA _cgetc 0018AD RLA +complax 0018BF RLA donelib 0018C8 RLA +decaxy 0018E6 RLA decsp1 0018EF RLA +decsp3 0018F8 RLA decsp4 001905 RLA +decsp6 001912 RLA __directerrno 00191F RLA +__mappederrno 001927 RLA _fgetc 001937 RLA +getfd 0019BB RLA _ferror 0019F4 RLA +_fwrite 001A15 RLA tosicmp0 001A90 RLA +incsp1 001ABE RLA popax 001AC5 RLA +incsp2 001ACC RLA incsp3 001ADA RLA +incsp4 001ADF RLA incsp5 001AE4 RLA +incsp6 001AE9 RLA incsp8 001AEE RLA +_isdigit 001AF3 RLA _isspace 001B02 RLA +_isxdigit 001B11 RLA _kbhit 001B20 RLA +tosaddeax 001B2F RLA ldaxi 001B4D RLA +ldaxidx 001B4F RLA ldax0sp 001B5A RLA +ldaxysp 001B5C RLA leaa0sp 001B63 RLA +tosmuleax 001B75 RLA negeax 001BCB RLA +_longjmp 001BE9 RLA pusheax 001C22 RLA +_ltoa 001C56 RLA _ultoa 001CAD RLA +__LOADSIZE__ 001CE8 REA booleq 001CEF RLA +tosumulax 001D1A RLA mul8x16 001D61 RLA +mul8x16a 001D6C RLA mulax10 001D99 RLA +__osmaperrno 001DB2 RLA popsreg 001DC8 RLA +_printf 001DD7 RLA push1 001E0A RLA +pusha 001E13 RLA pusha0 001E27 RLA +pushax 001E29 RLA pushwysp 001E41 RLA +_puts 001E5B RLA _read 001EC0 RLA +regswap2 001F1A RLA return0 001F30 RLA +rwprolog 001F34 RLA rwcommon 001F45 RLA +rwepilog 001F68 RLA _scanf 001F75 RLA +__setjmp 001FA8 RLA staspidx 001FCE RLA +stax0sp 001FE4 RLA staxysp 001FE6 RLA +_strlen 001FEF RLA _strlower 002005 RLA +tossuba0 00202D RLA _tolower 002041 RLA +_toupper 002051 RLA tosudiva0 002061 RLA +tosudivax 002063 RLA udiv16 002072 RLA +tosumoda0 0020B0 RLA _ungetc 0020C1 RLA +_vfprintf 002126 RLA _vfscanf 00214F RLA +_write 002182 RLA __hextab 002265 RLA +__longminstr 002275 RLA __ctype 002290 RLA +__DESTRUCTOR_TABLE__ 0023C0 RLA _stdin 0023D8 RLA +_stdout 0023DA RLA fdtab 002409 RLA +jmpvec 002429 RLA callmli 00242C RLA +__ZPSAVE_RUN__ 002451 RLA __BSS_RUN__ 00246B RLA +__oserror 002475 RLA __dos_type 0024EA RLA +__errno 0024EB RLA mliparam 0024EF RLA +__INIT_RUN__ 002503 RLA initlib 002503 RLA +initdostype 00255D LAI initprompt 002571 LAI +zerobss 002576 RLA __CONSTRUCTOR_TABLE__ 002599 RLA +__HIMEM__ 009600 REA __LCADDR__ 00D400 REA +__LC_LAST__ 00D400 RLA __LC_START__ 00D400 RLA + + + +Imports list: +------------- +COUT (cout.o): + read.o apple2/read.s(10) + write.o apple2/write.s(9) +HOME (home.o): + clrscr.o apple2/clrscr.s(8) +RDKEY (rdkey.o): + read.o apple2/read.s(10) +__BSS_RUN__ ([linker generated]): + zerobss.o common/zerobss.s(8) +__BSS_SIZE__ ([linker generated]): + zerobss.o common/zerobss.s(8) +__CONSTRUCTOR_COUNT__ ([linker generated]): + condes.o runtime/condes.s(18) +__CONSTRUCTOR_TABLE__ ([linker generated]): + condes.o runtime/condes.s(18) +__DESTRUCTOR_COUNT__ ([linker generated]): + condes.o runtime/condes.s(19) +__DESTRUCTOR_TABLE__ ([linker generated]): + condes.o runtime/condes.s(19) +__EXEHDR__ (exehdr.o): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(7) +__HIMEM__ ([linker generated]): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(19) +__INIT_RUN__ ([linker generated]): + crt0.o apple2/crt0.s(13) +__INIT_SIZE__ ([linker generated]): + crt0.o apple2/crt0.s(13) +__LCADDR__ ([linker generated]): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(21) +__LCSIZE__ ([linker generated]): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(21) +__LC_LAST__ ([linker generated]): + crt0.o apple2/crt0.s(12) +__LC_START__ ([linker generated]): + crt0.o apple2/crt0.s(12) +__LOADADDR__ ([linker generated]): + exehdr.o apple2/exehdr.s(9) +__LOADSIZE__ ([linker generated]): + exehdr.o apple2/exehdr.s(9) +__MOVE_LAST__ ([linker generated]): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(14) +__MOVE_START__ ([linker generated]): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(14) +__STACKSIZE__ ([linker generated]): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(19) +__STARTUP_RUN__ ([linker generated]): + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(13) + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(12) +__STARTUP__ (crt0.o): + alarmclock.o alarmclock.s(13) +__ZPSAVE_RUN__ ([linker generated]): + crt0.o apple2/crt0.s(14) + [linker generated] /home/bill/opt/cc65/cfg/apple2enh.cfg(13) +__ctype (ctype.o): + tolower.o common/tolower.s(8) + strlower.o common/strlower.s(13) + isxdigit.o /home/bill/opt/cc65/cc65/asminc/ctype.inc(9) + isspace.o /home/bill/opt/cc65/cc65/asminc/ctype.inc(9) + isdigit.o /home/bill/opt/cc65/cc65/asminc/ctype.inc(9) + toupper.o common/toupper.s(8) +__directerrno (errno.o): + read.o /home/bill/opt/cc65/cc65/asminc/errno.inc(10) + write.o /home/bill/opt/cc65/cc65/asminc/errno.inc(10) +__dos_type (dosdetect.o): + mli.o apple2/mli.s(7) +__errno (errno.o): + _seterrno.o /home/bill/opt/cc65/cc65/asminc/errno.inc(7) +__hextab (_hextab.o): + ltoa.o common/ltoa.s(10) +__longminstr (_longminstr.o): + ltoa.o common/ltoa.s(10) +__mappederrno (errno.o): + rwcommon.o /home/bill/opt/cc65/cc65/asminc/errno.inc(10) + write.o /home/bill/opt/cc65/cc65/asminc/errno.inc(10) +__oserror (_oserror.o): + rwcommon.o /home/bill/opt/cc65/cc65/asminc/errno.inc(7) + read.o /home/bill/opt/cc65/cc65/asminc/errno.inc(7) + errno.o /home/bill/opt/cc65/cc65/asminc/errno.inc(7) +__osmaperrno (oserror.o): + errno.o /home/bill/opt/cc65/cc65/asminc/errno.inc(8) +__printf (_printf.o): + vfprintf.o common/vfprintf.s(10) +__scanf (_scanf.o): + vfscanf.o common/_scanf.inc(17) +__seterrno (_seterrno.o): + ungetc.o /home/bill/opt/cc65/cc65/asminc/errno.inc(9) + fwrite.o /home/bill/opt/cc65/cc65/asminc/errno.inc(9) + fmisc.o /home/bill/opt/cc65/cc65/asminc/errno.inc(9) + errno.o /home/bill/opt/cc65/cc65/asminc/errno.inc(9) + _scanf.o ../libwrk/apple2enh/_scanf.s(16) +__setjmp (setjmp.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(14) +_add_one_second (thclock.o): + alarmclock.o alarmclock.s(21) +_cgetc (cgetc.o): + alarmclock.o alarmclock.s(19) +_clrscr (clrscr.o): + alarmclock.o alarmclock.s(17) +_ferror (fmisc.o): + vfscanf.o common/vfscanf.s(9) +_fgetc (fgetc.o): + vfscanf.o common/vfscanf.s(9) +_fwrite (fwrite.o): + vfprintf.o common/vfprintf.s(10) +_isdigit (isdigit.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(17) +_isspace (isspace.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(18) +_isxdigit (isxdigit.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(19) +_kbhit (kbhit.o): + alarmclock.o alarmclock.s(18) +_longjmp (longjmp.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(15) +_ltoa (ltoa.o): + _printf.o common/_printf.s(12) +_main (alarmclock.o): + callmain.o runtime/callmain.s(11) +_print_time (thclock.o): + alarmclock.o alarmclock.s(22) +_printf (printf.o): + thclock.o thclock.s(13) + alarmclock.o alarmclock.s(14) +_puts (puts.o): + alarmclock.o alarmclock.s(15) +_read (read.o): + fgetc.o ../libwrk/apple2enh/fgetc.s(14) +_read_interactively (thclock.o): + alarmclock.o alarmclock.s(20) +_reprint_time (thclock.o): + alarmclock.o alarmclock.s(23) +_scanf (scanf.o): + thclock.o thclock.s(14) +_stdin (_file.o): + scanf.o common/scanf.s(10) +_stdout (_file.o): + puts.o ../libwrk/apple2enh/puts.s(13) + printf.o common/printf.s(8) +_strlen (strlen.o): + _printf.o common/_printf.s(13) + puts.o ../libwrk/apple2enh/puts.s(15) +_strlower (strlower.o): + _printf.o common/_printf.s(13) +_tolower (tolower.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(20) +_toupper (toupper.o): + thclock.o thclock.s(15) + alarmclock.o alarmclock.s(16) +_ultoa (ltoa.o): + _printf.o common/_printf.s(12) +_ungetc (ungetc.o): + vfscanf.o common/vfscanf.s(9) +_vfprintf (vfprintf.o): + printf.o common/printf.s(8) +_vfscanf (vfscanf.o): + scanf.o common/scanf.s(10) +_write (write.o): + fwrite.o common/fwrite.s(10) + puts.o ../libwrk/apple2enh/puts.s(16) +addeqysp (addeqsp.o): + alarmclock.o alarmclock.s(432) +addysp (addysp.o): + incsp8.o runtime/incsp8.s(8) + incsp6.o runtime/incsp6.s(8) + incsp3.o runtime/incsp3.s(8) + fwrite.o common/fwrite.s(11) + scanf.o common/scanf.s(10) + printf.o common/printf.s(8) + incsp5.o runtime/incsp5.s(8) + incsp4.o runtime/incsp4.s(8) + thclock.o thclock.s(459) +addysp1 (addysp.o): + sub.o runtime/sub.s(8) + lmul.o runtime/lmul.s(8) + ladd.o runtime/ladd.s(8) +aulong (along.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +axlong (axlong.o): + _printf.o common/_printf.s(11) +axulong (axlong.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _printf.o common/_printf.s(11) +booleq (makebool.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +callmain (callmain.o): + crt0.o apple2/crt0.s(11) +callmli (mli.o): + rwcommon.o apple2/mli.inc(131) + write.o apple2/mli.inc(131) +complax (compl.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +decaxy (decaxy.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +decsp1 (decsp1.o): + fgetc.o ../libwrk/apple2enh/fgetc.s(94) + alarmclock.o alarmclock.s(432) +decsp3 (decsp3.o): + thclock.o thclock.s(459) +decsp4 (decsp4.o): + lpush.o runtime/lpush.s(11) + alarmclock.o alarmclock.s(432) +decsp6 (decsp6.o): + _printf.o common/_printf.s(11) + thclock.o thclock.s(459) +donelib (condes.o): + crt0.o apple2/crt0.s(10) +fdtab (filedes.o): + read.o apple2/filedes.inc(13) + write.o apple2/filedes.inc(13) +getfd (filedes.o): + rwcommon.o apple2/filedes.inc(14) +incsp1 (incsp1.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + alarmclock.o alarmclock.s(432) +incsp2 (incsp2.o): + popsreg.o runtime/popsreg.s(8) + staspidx.o runtime/staspidx.s(8) + puts.o ../libwrk/apple2enh/puts.s(78) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + thclock.o thclock.s(459) +incsp3 (incsp3.o): + fgetc.o ../libwrk/apple2enh/fgetc.s(94) +incsp4 (incsp4.o): + alarmclock.o alarmclock.s(432) +incsp5 (incsp5.o): + thclock.o thclock.s(459) +incsp6 (incsp6.o): + fwrite.o common/fwrite.s(11) + vfprintf.o common/vfprintf.s(9) +incsp8 (incsp8.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +initlib (condes.o): + crt0.o apple2/crt0.s(10) +jmpvec (jmpvec.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +ldax0sp (ldaxsp.o): + thclock.o thclock.s(459) + thclock.o thclock.s(459) + thclock.o thclock.s(459) +ldaxi (ldaxi.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +ldaxidx (ldaxi.o): + thclock.o thclock.s(459) + thclock.o thclock.s(459) +ldaxysp (ldaxsp.o): + fwrite.o common/fwrite.s(11) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + puts.o ../libwrk/apple2enh/puts.s(78) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + alarmclock.o alarmclock.s(432) +leaa0sp (leaaxsp.o): + fgetc.o ../libwrk/apple2enh/fgetc.s(94) + thclock.o thclock.s(459) +mliparam (mli.o): + rwcommon.o apple2/mli.inc(130) + write.o apple2/mli.inc(130) +mul8x16 (mul8.o): + mul.o runtime/mul.s(8) +mul8x16a (mul8.o): + mul.o runtime/mul.s(8) +mulax10 (mulax10.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +negeax (lneg.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +popax (incsp2.o): + ungetc.o common/ungetc.s(10) + rwcommon.o apple2/rwcommon.s(6) + ltoa.o common/ltoa.s(9) + longjmp.o common/longjmp.s(8) + _printf.o common/_printf.s(11) +popsreg (popsreg.o): + mul8.o runtime/mul8.s(9) + mul.o runtime/mul.s(9) + umod.o runtime/umod.s(8) + udiv.o runtime/udiv.s(8) +ptr1 (zeropage.o): + ungetc.o common/ungetc.s(11) + strlower.o common/strlower.s(14) + setjmp.o common/setjmp.s(8) + rwcommon.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + read.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + mulax10.o runtime/mulax10.s(9) + ltoa.o common/ltoa.s(11) + longjmp.o common/longjmp.s(9) + lmul.o runtime/lmul.s(9) + fwrite.o common/fwrite.s(14) + fmisc.o common/fmisc.s(9) + _scanf.o ../libwrk/apple2enh/_scanf.s(11) + _printf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + zerobss.o common/zerobss.s(9) + write.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + vfprintf.o common/vfprintf.s(11) + umod.o runtime/umod.s(9) + udiv.o runtime/udiv.s(9) + strlen.o common/strlen.s(8) + staspidx.o runtime/staspidx.s(9) + scanf.o common/scanf.s(11) + puts.o ../libwrk/apple2enh/puts.s(11) + printf.o common/printf.s(9) + ldaxi.o runtime/ldaxi.s(8) + thclock.o thclock.s(11) +ptr2 (zeropage.o): + strlower.o common/strlower.s(14) + rwcommon.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + read.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + ltoa.o common/ltoa.s(11) + longjmp.o common/longjmp.s(9) + _printf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + write.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) +ptr3 (zeropage.o): + read.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) + ltoa.o common/ltoa.s(11) + lmul.o runtime/lmul.s(9) + vfscanf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(12) +ptr4 (zeropage.o): + mul8.o runtime/mul8.s(10) + mul.o runtime/mul.s(10) + lmul.o runtime/lmul.s(9) + umod.o runtime/umod.s(9) + udiv.o runtime/udiv.s(9) +push1 (push1.o): + _printf.o common/_printf.s(11) + vfprintf.o common/vfprintf.s(9) +pusha (pusha.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + thclock.o thclock.s(459) +pusha0 (pushax.o): + push1.o runtime/push1.s(8) + fgetc.o ../libwrk/apple2enh/fgetc.s(94) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + puts.o ../libwrk/apple2enh/puts.s(78) + thclock.o thclock.s(459) +pushax (pushax.o): + fwrite.o common/fwrite.s(11) + fgetc.o ../libwrk/apple2enh/fgetc.s(94) + callmain.o runtime/callmain.s(11) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _printf.o common/_printf.s(11) + scanf.o common/scanf.s(10) + puts.o ../libwrk/apple2enh/puts.s(78) + printf.o common/printf.s(8) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + thclock.o thclock.s(459) + alarmclock.o alarmclock.s(432) +pusheax (lpush.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) + _printf.o common/_printf.s(11) +pushwysp (pushwsp.o): + fwrite.o common/fwrite.s(11) + vfprintf.o common/vfprintf.s(9) + puts.o ../libwrk/apple2enh/puts.s(78) + thclock.o thclock.s(459) + thclock.o thclock.s(459) +regbank (zeropage.o): + regswap2.o runtime/regswap2.s(8) + fgetc.o ../libwrk/apple2enh/fgetc.s(10) + _scanf.o ../libwrk/apple2enh/_scanf.s(10) + _printf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(14) +regsave (zeropage.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(10) +regswap2 (regswap2.o): + fgetc.o ../libwrk/apple2enh/fgetc.s(94) +return0 (return0.o): + fmisc.o common/fmisc.s(8) +rwcommon (rwcommon.o): + read.o apple2/read.s(9) + write.o apple2/write.s(8) +rwepilog (rwcommon.o): + write.o apple2/write.s(8) +rwprolog (rwcommon.o): + read.o apple2/read.s(9) + write.o apple2/write.s(8) +sp (zeropage.o): + sub.o runtime/sub.s(9) + setjmp.o common/setjmp.s(8) + regswap2.o runtime/regswap2.s(8) + popsreg.o runtime/popsreg.s(9) + lpush.o runtime/lpush.s(12) + longjmp.o common/longjmp.s(9) + lmul.o runtime/lmul.s(9) + ladd.o runtime/ladd.s(9) + icmp.o runtime/icmp.s(9) + fgetc.o ../libwrk/apple2enh/fgetc.s(10) + _scanf.o ../libwrk/apple2enh/_scanf.s(10) + _printf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(11) + vfscanf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(11) + vfprintf.o common/vfprintf.s(11) + staxsp.o runtime/staxsp.s(8) + staspidx.o runtime/staspidx.s(9) + scanf.o common/scanf.s(11) + pushwsp.o runtime/pushwsp.s(8) + pushax.o runtime/pushax.s(8) + pusha.o runtime/pusha.s(8) + printf.o common/printf.s(9) + leaaxsp.o runtime/leaaxsp.s(8) + ldaxsp.o runtime/ldaxsp.s(8) + incsp2.o runtime/incsp2.s(8) + incsp1.o runtime/incsp1.s(8) + decsp6.o runtime/decsp6.s(8) + decsp4.o runtime/decsp4.s(8) + decsp3.o runtime/decsp3.s(8) + decsp1.o runtime/decsp1.s(8) + crt0.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(11) + addysp.o runtime/addysp.s(8) + addeqsp.o runtime/addeqsp.s(8) + thclock.o thclock.s(10) + alarmclock.o alarmclock.s(10) +sreg (zeropage.o): + popsreg.o runtime/popsreg.s(9) + mul8.o runtime/mul8.s(10) + mul.o runtime/mul.s(10) + ltoa.o common/ltoa.s(11) + lpush.o runtime/lpush.s(12) + lneg.o runtime/lneg.s(11) + lmul.o runtime/lmul.s(9) + ladd.o runtime/ladd.s(9) + icmp.o runtime/icmp.s(9) + axlong.o runtime/axlong.s(8) + along.o runtime/along.s(8) + _scanf.o ../libwrk/apple2enh/_scanf.s(10) + _printf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(11) + udiv.o runtime/udiv.s(9) +staspidx (staspidx.o): + thclock.o thclock.s(459) +stax0sp (staxsp.o): + thclock.o thclock.s(459) + alarmclock.o alarmclock.s(432) +staxysp (staxsp.o): + thclock.o thclock.s(459) + alarmclock.o alarmclock.s(432) +tmp1 (zeropage.o): + ungetc.o common/ungetc.s(11) + mul.o runtime/mul.s(10) + ltoa.o common/ltoa.s(11) + ladd.o runtime/ladd.s(9) + decaxy.o runtime/decaxy.s(8) + _printf.o /home/bill/opt/cc65/cc65/asminc/zeropage.inc(13) + staspidx.o runtime/staspidx.s(9) +tmp2 (zeropage.o): + lmul.o runtime/lmul.s(9) +tmp3 (zeropage.o): + lmul.o runtime/lmul.s(9) +tmp4 (zeropage.o): + lmul.o runtime/lmul.s(9) +tosaddeax (ladd.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +tosicmp0 (icmp.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +tosmuleax (lmul.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +tossuba0 (sub.o): + _scanf.o ../libwrk/apple2enh/_scanf.s(1058) +tosudiva0 (udiv.o): + thclock.o thclock.s(459) +tosudivax (udiv.o): + fwrite.o common/fwrite.s(12) +tosumoda0 (umod.o): + thclock.o thclock.s(459) +tosumulax (mul.o): + fwrite.o common/fwrite.s(12) +udiv16 (udiv.o): + umod.o runtime/umod.s(8) +zerobss (zerobss.o): + crt0.o apple2/crt0.s(9) + diff --git a/.noslotclock.c.swp b/.noslotclock.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..12c69f823c9621857a28066959e8cabc98e24702 GIT binary patch literal 12288 zcmeI2&2Jk;7{;fdQoc%2%ehS5QaK^9*GWr1XoK=$p+K4<+u=i1S*>@+_0ruPYi2fS z2n8V_1SdGaKfs9=inws=1#v=ffeZ8ifqtg$_6#AyYdExq2Ux$N&HPfB*luhmcRe8=wW6;3PN< z_JO_N>qiLbfycpqup9ion~<--``|pNft}#S!-QM|AA^s;bKo(s5B&WQA>V`Vz*X=m zcpJO|ra=u@U;^v{_kuqkB;+Re23!H}0SDONRq#Am1Qw`*J>cgD2>A(o2|fUepaKqo z{otSb3Hc5D3Vs1Mz%_6MybIm|GvE+72yX5o z2H$PovDX;8NKc=p$LKTEq9^HSUm+-Sgbtc$*7ePkv}P5?4S9q#GYM`~mrl}JK1jGl z5{WP`>hgFvlD^4zhJJnwKg#z><_^clP1;u-r!C<`vcm)oxZ^R8t~x=?B=sZ3sY9i5 zBF_;XoyS)ZyNar?LdUBl@mVm(vy~q*yCZmLWBTQ>LEr|{5vl4j>c&E_2+u-FwKQp6 z=95kQu8+>^U;3p3hAiY_JsDtw3ZeZ|cjfdZTCz@*{feHs`@``W+{bnEwVznsY{$ z$3_-lI2YUTJaNuCuiv`mm8GTpqSRkrY?VuesrQ{3)W)VFEabfDSzTa`^4&D^LN}7k zDl3=y?Mo^fFG+QCR{eY(8J0`0NkN}jLsemI?3EW5W?OZ;xiV+ZE-W;%6)$AJb-2M4 zR=MwC58V7VlKv#OQ|NXKxV;sbps#Rwgcr+2rPA?{r9;)1(~dD}U9zUFBZIi zp{RbbnUs`wXx#H0h21)C3mz*S1zUJNV6)X&Tz(e2aC2p;WiQp2vy_mywoz}I0gEo+ z{6sW;xHxUT%250=4pgGOWkCIcQC*%>$E_?wY|9t2=O<`A@+5UsqBv1Y$JWQ)K|gYX z*kiP$gyXVGx0Gw@3GQ)OY|H;>9pa(-ls*M3-I;7&m{aadgBSgQPT`(g&PAn6&yo4W|#8 literal 0 HcmV?d00001 diff --git a/.swp b/.swp new file mode 100644 index 0000000000000000000000000000000000000000..f8a8fea3687a26bf47270c8daaec271d7869cf13 GIT binary patch literal 12288 zcmeI%I|{-;5P;!{*a(867g)8?M&biJgN0>mB_RO=3ke!*EIf!O@jy1>9ds9y#v-L5 z_z!G`VHalh>y`xWcD+%n=~7H|?dKEMwnz|bUDRdSo;zwk&62e27<&jHP^m!6Tg+#! z9bq&asD96@bQ+o?fB*srAby(1^iIt))BdzW&i&d@Bf#npJqLZy&B$)kr6-u0R#|0009ILKmY**5cn$r XWkSw!O5#xI#1D7-NT<l33w)d+>w)IMAZ!_7R*;B;n~xoIon1HXh1 z+`7}1;701kFQ9azTi4c=;>ySWrs*SNsZHsoa4!6q%)R%VIrF=hK*+5R-54DgXG$jt zt&ixn{5JFEVT0ZuBC7jApu7Lq^t?2Xv5Mj?r{32S%U6;pu15>yG_lJvkjZS(4kG(@ z@${*o;j&7k?Uw8<)9@f0U<2J6XezIGwwF!}A0N`8`P@-)q<^N{EIgkLumLu}2G{@_ zU;}J`4X}YdY(T|5^Z@nmYrjLWeeKCy+qZmS18jf|umLu}2G{@_U;}J`4X^<=zy|i9 z0qGEx4-)+W`v3pc-~Y>piN1o*;1hTU7Qrj<5=F&euKzdq1(v`gPyx#a zh+Y70Y=8~00XDz}*Z><~18iWA7|1)6cU;d8T`@g5a=B_vP1h!jg4obJ9HC8JLlrVJ zC#%!erCM#w@XR^_GNU`rgC~1&vP;=^DUG&)qWn;Gk&y0DD{fU^h3?W^ffdU{ z&bGsqxFEbJc0=Rp=vdXdHZopCBALT*M;(c)EFEmv4Vj3+Ov;UUyQ;IZzAkHW@w(Z1 zwxualE>=luOR_bYVny0|;_WzEFS4`1ZYAkF*^1UIZNB{T z|15v1WTFg&;e+yRp*M>dR27`!ZGSJUZ6A?q?c5xO{Ll`Xj@#}jH8%F0PnF|GrN%}2 E3uozxTmS$7 literal 0 HcmV?d00001 diff --git a/12hourclk.c b/12hourclk.c deleted file mode 100644 index 0419e62..0000000 --- a/12hourclk.c +++ /dev/null @@ -1,160 +0,0 @@ -#include /* printf, scanf */ -#include /* bool */ -#include /* strerror */ -#include /* time_t, time, localtime */ -#include /* toupper */ -#include /* errno */ - -#include "12hourclk.h" - -#define TIME_ERR_RESULT ((time_t) -1) -#define LOCALTIME_ERR_RESULT NULL -#define ERR_MSG_SIZE 128 - -static void set_err_msg(char *prefix, int errno); - -static char G_err_msg[ERR_MSG_SIZE]; - -static char *meridiem_text(meridiem_t m) -{ - if (m == ANTE_MERIDIEM) { - return "am"; - } - else { - return "pm"; - } -} - -bool set_clock(twleve_hour_clock_t *clock, struct tm *t) -{ - clock->seconds = t->tm_sec; - clock->minutes = t->tm_min; - if (t->tm_hour == 0) { - clock->hours = 12; - clock->meridiem = ANTE_MERIDIEM; - } - else if (t->tm_hour < 12) { - clock->meridiem = ANTE_MERIDIEM; - } - else if (t->tm_hour == 12) { - clock->meridiem = POST_MERIDIEM; - } - else { - clock->hours = t->tm_hour - 12; - clock->meridiem = POST_MERIDIEM; - } - return true; -} - - -void set_err_msg(char *what_failed, int err_code) -{ - snprintf(G_err_msg, ERR_MSG_SIZE, "%s: %s", what_failed, strerror(err_code)); -} - -bool load_system_time(twleve_hour_clock_t *clock) -{ - time_t now; - bool is_successful = false; /* It will not be successful until it is. */ - struct tm *curr_time; - - if (time(&now) != TIME_ERR_RESULT) - if ((curr_time = localtime(&now)) != LOCALTIME_ERR_RESULT) - is_successful = set_clock(clock, curr_time); - else - set_err_msg("Localtime function failed", errno); - else - set_err_msg("Time function failed", errno); - return is_successful; -} - -void read_interactively(twleve_hour_clock_t *clock) -{ - char meridiem_input[3]; - - printf("Hour:"); - scanf("%2ui", &(clock->hours)); - printf("Minute:"); - scanf("%2ui", &(clock->minutes)); - printf("AM or PM:"); - scanf("%2s", meridiem_input); - clock->seconds = 0; - if (toupper(meridiem_input[0]) == 'A') { - clock->meridiem = ANTE_MERIDIEM; - } - else { - clock->meridiem = POST_MERIDIEM; - } -} - -void add_one_second(twleve_hour_clock_t *clock) -{ - if (clock->seconds < 59) { - ++(clock->seconds); - } - else { - clock->seconds = 0; - if (clock->minutes < 59) { - ++(clock->minutes); - } - else { - clock->minutes = 0; - if (clock->hours < 11) { - ++(clock->hours); - } - else if (clock->hours == 11) { - ++(clock->hours); - if (clock->meridiem == ANTE_MERIDIEM) { - clock->meridiem = POST_MERIDIEM; - } - else { - clock->meridiem = ANTE_MERIDIEM; - } - } - else { - clock->hours = 1; - } - } - } -} - -void add_seconds(twleve_hour_clock_t *clock, uint8_t seconds) -{ - uint16_t sum; - uint16_t minutes_carry; - uint16_t hours_carry; - - sum = ((uint16_t) clock->seconds) + ((uint16_t) seconds); - if (sum >= 60) { - minutes_carry = sum / 60; - clock->seconds = sum % 60; - - sum = ((uint16_t) clock->minutes) + minutes_carry; - if (sum >= 60) { - hours_carry = sum / 60; - clock->minutes = sum % 60; - - sum = ((uint16_t) clock->hours) + hours_carry; - if (sum >= 12) { - } - } - else { - clock->minutes = sum; - } - } - else { - clock->seconds = sum; - } -} - -void print_time(twleve_hour_clock_t *clock) -{ - printf("%2u:%02u:%02u %2s", clock->hours, clock->minutes, clock->seconds, meridiem_text(clock->meridiem)); -} - -void reprint_time(twleve_hour_clock_t *clock) -{ - printf("\b\b\b\b\b\b\b\b\b\b\b"); - print_time(clock); -} - diff --git a/12hourclk.h b/12hourclk.h deleted file mode 100644 index ae35e32..0000000 --- a/12hourclk.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef TWELVE_HOUR_CLOCK_H -#define TWELVE_HOUR_CLOCK_H - -#include /* uint8_t */ - -typedef enum { - ANTE_MERIDIEM, POST_MERIDIEM -} meridiem_t; - -typedef struct { - uint8_t hours; - uint8_t minutes; - uint8_t seconds; - meridiem_t meridiem; -} twleve_hour_clock_t; - -extern void read_interactively(twleve_hour_clock_t *clock); -extern bool load_system_time(twleve_hour_clock_t *clock); -extern void add_one_second(twleve_hour_clock_t *clock); -extern void add_seconds(twleve_hour_clock_t *clock, uint8_t seconds); -extern void print_time(twleve_hour_clock_t *clock); -extern void reprint_time(twleve_hour_clock_t *clock); - -#endif - diff --git a/alarmclk.dsk b/ALARM.CLOCK.dsk similarity index 84% rename from alarmclk.dsk rename to ALARM.CLOCK.dsk index de3662d13d9be3893cc1686bedb76a5487b88a2d..c20606bed383054a2ff5d3781a75882ba16f18af 100644 GIT binary patch delta 15438 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 C^RpQ$F(y?WUy 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 z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la u5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpMBvLw;Qs?OybMDC diff --git a/Makefile b/Makefile index a5f92d8..08abd15 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,8 @@ ifndef CC65_TARGET CC65_TARGET:=apple2enh endif -PGM=alarmclk -OBJS=alarmclk.o 12hourclk.o clkfreq.o +PGM=alarm.clock +OBJS=alarm.clock.o time.o noslotclock.o prodos.o trace.o PGM2=calibrate OBJS2=calibrate.o @@ -20,11 +20,11 @@ CC=cl65 AS=ca65 LD=ld65 -CFLAGS=-t $(CC65_TARGET) -O +CFLAGS=-t $(CC65_TARGET) -O -DTRACE ASFLAGS=-t $(CC65_TARGET) LDFLAGS=-t $(CC65_TARGET) -DISK_VOL=alarmclk +DISK_VOL=ALARM.CLOCK DISK=$(DISK_VOL).dsk AC=java -jar lib/AppleCommander-1.3.5.14.jar @@ -32,19 +32,17 @@ MKDISK=$(AC) -pro140 $(DISK) $(DISK_VOL) ######################################## -all: $(DISK) - -$(DISK): $(PGM) $(PGM2) - $(AC) -d $(DISK) $< - $(AC) -cc65 $(DISK) $< BIN < $< - $(AC) -d $(DISK) $(PGM2) - $(AC) -cc65 $(DISK) $(PGM2) BIN < $(PGM2) +all: $(PGM) $(PGM2) $(PGM): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ + $(AC) -d $(DISK) $@ + $(AC) -cc65 $(DISK) $@ BIN < $@ $(PGM2): $(OBJS2) $(CC) $(LDFLAGS) -o $@ $^ + $(AC) -d $(DISK) $@ + $(AC) -cc65 $(DISK) $@ BIN < $@ # Compile and assemble rules use the defuault rules after CC and CFLAGS # are set. diff --git a/alarmclk.c b/alarm.clock.c similarity index 83% rename from alarmclk.c rename to alarm.clock.c index cea6020..bd636a8 100644 --- a/alarmclk.c +++ b/alarm.clock.c @@ -3,67 +3,64 @@ #include /* true */ #include /* toupper */ #include /* clrscr, kbhit */ +#include /* time_t, struct tm */ -#include "12hourclk.h" -extern void ClockFreq(); -extern uint8_t Ticks[4]; +#include "noslotclock.h" +#include "time.h" +#include "trace.h" #define CLOCK_FREQUENCY 1023000L #define CYCLES_PER_NOOP 2 #define NOOPS_PER_SEC 511500 #define CTRL_C '\x03' #define ESC '\x1B' +#define FMTD_TIME_SIZE 16 void read_inputs(void); -void elapse_one_second(void); +void sleep_one_second(void); +void do_nothing_for_one_second(void); void run_clock(void); -static twleve_hour_clock_t curr_time; -static twleve_hour_clock_t alarm_time; +static struct tm G_Current_Time; +static struct tm G_Alarm_Time; void main(void) { - ClockFreq(); - printf("%c%c.%c%c%c%c%c%c MHz\n", - Ticks[0] & 0x70, - Ticks[0] & 0x07, - Ticks[1] & 0x70, - Ticks[1] & 0x07, - Ticks[2] & 0x70, - Ticks[2] & 0x07, - Ticks[3] & 0x70, - Ticks[3] & 0x07); + TRACE_ENTER("main"); + load_driver(); clrscr(); read_inputs(); clrscr(); printf("\nAlarm Time: "); - print_time(&alarm_time); + print_12_hour_time(&G_Alarm_Time); + printf("\nCurrent Time: "); run_clock(); + + TRACE_EXIT("main"); } void read_inputs() { - if (! load_system_time(&curr_time)) { - puts("Current Time"); - read_interactively(&curr_time); - } + TRACE_ENTER("read_inputs"); + read_time(&G_Current_Time); puts("Alarm Time"); - read_interactively(&alarm_time); + read_time_interactively(&G_Alarm_Time); + TRACE_EXIT("read_inputs"); } void run_clock() { char c; - print_time(&curr_time); + TRACE_ENTER("run_clock"); + print_12_hour_time(&G_Current_Time); while (true) { - elapse_one_second(); - add_one_second(&curr_time); - reprint_time(&curr_time); + sleep_one_second(); + reprint_12_hour_time(&G_Current_Time); if (kbhit()) { c = cgetc(); if (c == ESC || toupper(c) == 'Q' || c == CTRL_C) { @@ -72,16 +69,35 @@ void run_clock() } } } + TRACE_EXIT("run_clock"); } -void elapse_one_second() +/** + * Waits for one second. Modifies the global G_Current_Time. + */ +void sleep_one_second() { - int i; + time_t old_time; + + TRACE_ENTER("sleep_one_second"); + old_time = mktime(read_time(&G_Current_Time)); + + while (mktime(read_time(&G_Current_Time)) <= old_time) { + do_nothing_for_one_second(); + } + TRACE_EXIT("sleep_one_second"); +} + +void do_nothing_for_one_second() +{ + int i = 0; int max_loops; + TRACE_ENTER("do_nothing_for_one_second"); max_loops = NOOPS_PER_SEC / 250; - for (i = 0; i < max_loops; ++i) { + for ( ; i < max_loops; ++i) { + asm("nop"); asm("nop"); asm("nop"); @@ -333,5 +349,6 @@ void elapse_one_second() asm("nop"); asm("nop"); } + TRACE_EXIT("do_nothing_for_one_second"); } diff --git a/alarmclk.s b/alarmclk.s deleted file mode 100644 index 992ca52..0000000 --- a/alarmclk.s +++ /dev/null @@ -1,515 +0,0 @@ -; -; File generated by cc65 v 2.15 - Git 6f24c07 -; - .fopt compiler,"cc65 v 2.15 - Git 6f24c07" - .setcpu "65C02" - .smart on - .autoimport on - .case on - .debuginfo off - .importzp sp, sreg, regsave, regbank - .importzp tmp1, tmp2, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4 - .macpack longbranch - .forceimport __STARTUP__ - .import _printf - .import _puts - .import _toupper - .import _clrscr - .import _kbhit - .import _cgetc - .import _read_interactively - .import _load_system_time - .import _add_one_second - .import _print_time - .import _reprint_time - .import _ClockFreq - .import _Ticks - .export _read_inputs - .export _elapse_one_second - .export _run_clock - .export _main - -.segment "RODATA" - -L0009: - .byte $25,$63,$25,$63,$2E,$25,$63,$25,$63,$25,$63,$25,$63,$25,$63,$25 - .byte $63,$20,$4D,$48,$7A,$0A,$00 -L001F: - .byte $0A,$41,$6C,$61,$72,$6D,$20,$54,$69,$6D,$65,$3A,$20,$20,$20,$00 -L0024: - .byte $0A,$43,$75,$72,$72,$65,$6E,$74,$20,$54,$69,$6D,$65,$3A,$20,$00 -L002C: - .byte $43,$75,$72,$72,$65,$6E,$74,$20,$54,$69,$6D,$65,$00 -L0031: - .byte $41,$6C,$61,$72,$6D,$20,$54,$69,$6D,$65,$00 -L004B := L0009+22 - -.segment "BSS" - -_curr_time: - .res 5,$00 -_alarm_time: - .res 5,$00 - -; --------------------------------------------------------------- -; void __near__ read_inputs (void) -; --------------------------------------------------------------- - -.segment "CODE" - -.proc _read_inputs: near - -.segment "CODE" - - lda #<(_curr_time) - ldx #>(_curr_time) - jsr _load_system_time - jsr bnega - jeq L0028 - lda #<(L002C) - ldx #>(L002C) - jsr _puts - lda #<(_curr_time) - ldx #>(_curr_time) - jsr _read_interactively -L0028: lda #<(L0031) - ldx #>(L0031) - jsr _puts - lda #<(_alarm_time) - ldx #>(_alarm_time) - jsr _read_interactively - rts - -.endproc - -; --------------------------------------------------------------- -; void __near__ elapse_one_second (void) -; --------------------------------------------------------------- - -.segment "CODE" - -.proc _elapse_one_second: near - -.segment "CODE" - - jsr decsp4 - ldx #$07 - lda #$FE - ldy #$00 - jsr staxysp - ldx #$00 - lda #$00 - ldy #$02 - jsr staxysp -L0050: ldy #$03 - jsr ldaxysp - jsr pushax - ldy #$03 - jsr ldaxysp - jsr tosltax - jne L0053 - jmp L0051 -L0053: nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - ldy #$02 - ldx #$00 - lda #$01 - jsr addeqysp - jmp L0050 -L0051: jsr incsp4 - rts - -.endproc - -; --------------------------------------------------------------- -; void __near__ run_clock (void) -; --------------------------------------------------------------- - -.segment "CODE" - -.proc _run_clock: near - -.segment "CODE" - - jsr decsp1 - lda #<(_curr_time) - ldx #>(_curr_time) - jsr _print_time - jmp L003A -L0038: jsr _elapse_one_second - lda #<(_curr_time) - ldx #>(_curr_time) - jsr _add_one_second - lda #<(_curr_time) - ldx #>(_curr_time) - jsr _reprint_time - jsr _kbhit - tax - jeq L003A - jsr _cgetc - ldy #$00 - sta (sp),y - ldy #$00 - ldx #$00 - lda (sp),y - cmp #$1B - jsr booleq - jne L0046 - ldy #$00 - ldx #$00 - lda (sp),y - ldx #$00 - jsr _toupper - cpx #$00 - bne L0048 - cmp #$51 -L0048: jsr booleq - jne L0046 - ldy #$00 - ldx #$00 - lda (sp),y - cmp #$03 - jsr booleq - jne L0046 - ldx #$00 - lda #$00 - jeq L0049 -L0046: ldx #$00 - lda #$01 -L0049: jeq L003A - lda #<(L004B) - ldx #>(L004B) - jsr _puts - jmp L0039 -L003A: jmp L0038 -L0039: jsr incsp1 - rts - -.endproc - -; --------------------------------------------------------------- -; void __near__ main (void) -; --------------------------------------------------------------- - -.segment "CODE" - -.proc _main: near - -.segment "CODE" - - ldy #$00 - jsr _ClockFreq - lda #<(L0009) - ldx #>(L0009) - jsr pushax - ldx #$00 - lda _Ticks - ldx #$00 - and #$70 - jsr pushax - ldx #$00 - lda _Ticks - ldx #$00 - and #$07 - jsr pushax - ldx #$00 - lda _Ticks+1 - ldx #$00 - and #$70 - jsr pushax - ldx #$00 - lda _Ticks+1 - ldx #$00 - and #$07 - jsr pushax - ldx #$00 - lda _Ticks+2 - ldx #$00 - and #$70 - jsr pushax - ldx #$00 - lda _Ticks+2 - ldx #$00 - and #$07 - jsr pushax - ldx #$00 - lda _Ticks+3 - ldx #$00 - and #$70 - jsr pushax - ldx #$00 - lda _Ticks+3 - ldx #$00 - and #$07 - jsr pushax - ldy #$12 - jsr _printf - jsr _clrscr - jsr _read_inputs - jsr _clrscr - lda #<(L001F) - ldx #>(L001F) - jsr pushax - ldy #$02 - jsr _printf - lda #<(_alarm_time) - ldx #>(_alarm_time) - jsr _print_time - lda #<(L0024) - ldx #>(L0024) - jsr pushax - ldy #$02 - jsr _printf - jsr _run_clock - rts - -.endproc - diff --git a/ascii.h b/ascii.h new file mode 100644 index 0000000..99ce9ca --- /dev/null +++ b/ascii.h @@ -0,0 +1,17 @@ +#ifndef ASCII_CODES_H +#define ASCII_CODES_H + +#define NULLCHAR '\x00' +#define STARTHDR '\x01' +#define STARTTXT '\x02' +#define ENDTXT '\x03' +#define ENDTRANS '\x04' +#define ENQUIRY '\x05' +#define ACK '\x06' +#define BELL '\x07' +#define ESCAPE '\x1b' +#define BACKSPC '\x08' +#define DELETE '\x7f' + +#endif + diff --git a/calcClkfreq.c b/calcClkfreq.c deleted file mode 100644 index b637092..0000000 --- a/calcClkfreq.c +++ /dev/null @@ -1,9 +0,0 @@ -/* This file is only here to make clkfreq.s load successfully. */ - -#include "clkfreq.h" - -void main() -{ - clkfreq(); -} - diff --git a/clkfreq b/clkfreq deleted file mode 100644 index 36ea60707a225e023169f8f7b50f00cc35d8cee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1283 zcmaJ>UuYaf7@z$U?{;S{y?|m$5$B7y(R|Mg$teF#v~XdO1L0WauH;UJ`_aoDXFBnY!hixgRZl8TG0oGo$vc* z=J)%)nQv!4B^szsFxr-06d#xEm^s$}aZO+9zs!OCgE`V)z@y*uUK{;u>4<>Vm+&ld zPVp#S)!IH>#6N0|ykMd6O=UU0?d)CXMFqMX-w`p4Cs7Dk|GkYa5@+1jtlxs6-GFzp z+mHjc3E3KCw;)@GtP1%bYy@1&KHSf2F%IG}VZ3i%!}A z>DpzWizKQW&{L{D?{$ia6~*%|l;X zUiP+mlLN@YmrzI!9FQo{j$dSxPRrNQwv@}$R3=Z!+(=@E7DiHex-?e^&4MtAnHw0y z@9Sn}AS;y7q_YAlWhS!h60$C%Qf^|96_IrX6~!4}M#E~w@N|(GcN9&HA!0~6Ue%{x znVf$LwaWgPT>Jje>hvG53W#5KWWkv}#=ol@Pm8?S-x@pmM6NVwjUqON8gl+V8_Z-X zx+n9PM)8}`B~M<-E_-X&2IH$782ccP7TI)sLvKsX5Oz`IEd zPoaWO<$C|Gr*O<(L)Hj#^GLiIPzEE2aH)gXvbd9nomhA$oxO8(ycdb;fbWlqsd6N#L@dOg}#P~*YL0SAX rJf@b!FV$=eN+erNF^zaboL6A=3o+KBxq diff --git a/clkfreq.h b/clkfreq.h deleted file mode 100644 index 70c3545..0000000 --- a/clkfreq.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef CLKFREQ_H -#define CLKFREQ_H - -#include /* uint8_t */ - -extern void clkfreq(void); -extern uint8_t ticks[4]; - -#endif - diff --git a/clkfreq.s b/clkfreq.s deleted file mode 100644 index a41a8ae..0000000 --- a/clkfreq.s +++ /dev/null @@ -1,218 +0,0 @@ - .setcpu "65C02" - .smart on - .autoimport on - .case on - .debuginfo off - .importzp sp, sreg, regsave, regbank - .importzp tmp1, tmp2, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4 - .macpack longbranch - .forceimport __STARTUP__ - .import _fputc - .import _stdout - - .export _Ticks - .export _ClockFreq - -rgConfig = $6000 ; write: D6=1 - NMI is off, D6=0 - NMI is on -rgStatus = $6000 ; read: D6=0 - UART is busy -rgTxD = $5000 ; write: data to send via UART - -vcNMI = $FFFA - -Refresh = 450 ; NMI rate in Hz - -.segment "CODE" - -.proc _ClockFreq: near - -.segment "CODE" - - ldx #NMI - stx vcNMI - sty vcNMI+1 - lda #$40 ; on start NMI is off - sta InUse - -Again: - lda #0 - sta Flag - sta _Ticks ; initializing counter - sta _Ticks+1 - sta _Ticks+2 - sta _Ticks+3 - lda #$FE ; initializing NMI counter (zeropoint minus 2 ticks) - sta Timer - lda #$FF - sta Timer+1 - lda InUse ; turn on NMI - and #$BF - sta rgConfig - sta InUse - -L1: bit Flag ; waiting for zeropoint minus 1 tick - bpl L1 - lda #0 - sta Flag - -L2: bit Flag ; waiting for true zeropoint - bpl L2 - lda #0 - sta Flag - -Main: ; main counting cycle -;number of ticks per command sum of ticks -; v v - lda _Ticks ;4 - clc ;2 6 - sed ;2 8 - adc #$53 ;2 10 - sta _Ticks ;4 14 - lda _Ticks+1 ;4 18 - adc #0 ;2 20 - sta _Ticks+1 ;4 24 - lda _Ticks+2 ;4 28 - adc #0 ;2 30 - sta _Ticks+2 ;4 34 - lda _Ticks+3 ;4 38 - adc #0 ;2 40 - sta _Ticks+3 ;4 44 - cld ;2 46 - bit Flag ;4 50 - bpl Main ;3 53 - - lda #0 ;2 - sta Flag ;4 6 - lda _Ticks ;4 10 - clc ;2 12 - sed ;2 14 - adc #$95 ;2 16 - sta _Ticks ;4 20 - lda _Ticks+1 ;4 24 - adc #0 ;2 26 - sta _Ticks+1 ;4 30 - lda _Ticks+2 ;4 34 - adc #0 ;2 36 - sta _Ticks+2 ;4 40 - lda _Ticks+3 ;4 44 - adc #0 ;2 46 - sta _Ticks+3 ;4 50 - cld ;2 52 - lda Timer ;4 56 - cmp #Refresh ; 2 - bne Main ; 3 - - lda InUse ; turn off NMI - ora #$40 - sta rgConfig - sta InUse - -; Output - - ldx #0 ; send first string to the host -L3: lda Mes1,x - beq L4 - jsr PutChar - inx - jmp L3 - -L4: lda _Ticks+3 - pha - lsr - lsr - lsr - lsr - beq L5 ; delete non-significant zero (clock < 10MHz) - jsr PrintDigit -L5: pla - and #15 - jsr PrintDigit - lda #'.' ; decimal point - jsr PutChar - lda _Ticks+2 - jsr PrintTwoDigits - lda _Ticks+1 - jsr PrintTwoDigits - lda _Ticks - jsr PrintTwoDigits - - ldx #0 ; send second string to the host -L6: lda Mes2,x - beq L7 - jsr PutChar - inx - jmp L6 -L7: - rts - -.endproc - -PrintTwoDigits: - pha - lsr - lsr - lsr - lsr - jsr PrintDigit - pla - and #15 - jsr PrintDigit - rts - -PrintDigit: - ora #$30 - jsr PutChar - rts - -PutChar: -; The character should be in the Accumulator - ldx #$00 - jsr pushax - lda _stdout - ldx _stdout+1 - jsr _fputc - rts - -Send: - bit rgStatus - bvc Send - sta rgTxD - rts - -.segment "RODATA" - -Mes1: - .byte 13 - .byte "Current clock frequency is " - .byte 0 - -Mes2: - .byte " MHz" - .byte 0 - -.segment "DATA" - -_Ticks: .res 4,0 ; uint8_t _Ticks[4] -Timer: .res 2,0 ; uint16_t Timer -InUse: .byte 0 ; uint8_t InUse -Flag: .byte 0 ; uint8_t Flag - -.segment "CODE" - -; Called when an non-maskable interrupt occurs. -; 1. Increments Timer -; 2. Sets the high bit in Flag to 1 -; -NMI: ;6 - pha ;3 9 - inc Timer ;6 15 - bne L8 ;3 18 - inc Timer+1 ; 5 -L8: lda #$80 ;2 20 - sta Flag ;4 24 - pla ;4 28 - rti ;6 34 - diff --git a/noslotclock.c b/noslotclock.c new file mode 100644 index 0000000..e14f9f4 --- /dev/null +++ b/noslotclock.c @@ -0,0 +1,87 @@ +#include /* fprintf, stderr */ +#include /* bool, true, false */ +#include /* uint8_t */ +#include /* struct tm */ + +#include "noslotclock.h" +#include "prodos.h" +#include "trace.h" + +#define NSC_STRING_RESULT_ADDR 0x0280 /* String result, Ends at 0x0291 */ +#define NSC_STRING_RESULT_LEN 12 /* The length of the above result */ +#define NSC_UPDATE_SUB_ADDR 0x030B /* Start address of update subroutine */ + +typedef struct { + uint8_t year; /* 0..99 */ + uint8_t month; /* 1..12 */ + uint8_t day_of_month; /* 1..31 */ + uint8_t day_of_week; /* 1..7 */ + uint8_t hour; /* 0..23 */ + uint8_t min; /* 0..59 */ + uint8_t sec; /* 0..59 */ + uint8_t hundredths_of_sec; /* 0..99 */ +} no_slot_clock_time_t; + +static const no_slot_clock_time_t *nsc = (no_slot_clock_time_t *) 0x0303; +static const char *nsc_absent_addr = (char *) 0x0304; + +static bool is_nsc_absent(void); +static void read_time_from_nsc(void); + +static void read_time_from_nsc() +{ + TRACE_ENTER("read_time_from_nsc"); + asm("jsr %w", NSC_UPDATE_SUB_ADDR); + TRACE_EXIT("read_time_from_nsc"); +} + +/** + * load_driver must be called first. + */ +static bool is_nsc_absent() +{ + TRACE_ENTER("is_nsc_absent"); + read_time_from_nsc(); + TRACE_EXIT("is_nsc_absent"); + return nsc_absent_addr[0] == NULL; +} + +bool load_driver() +{ + bool status = false; + + TRACE_ENTER("load_driver"); + if (run_basic_system_command("BLOAD READ.TIME")) { + + /* Check for a missing NSC. */ + if (! is_nsc_absent()) { + fprintf(stderr, "The No-Slot Clock hardware is missing"); + status = true; + } + } + TRACE_RET_BOOL("load_driver", status); + return status; +} + +/** + * The setup function must be called first. + */ +struct tm *read_time(struct tm *t) +{ + /* Reload the current time from the No-Slot Clock into memory. */ + read_time_from_nsc(); + + /* Transfer loaded values into a standard C struct tm. */ + t->tm_sec = nsc->sec; + t->tm_min = nsc->min; + t->tm_hour = nsc->hour; + t->tm_mday = nsc->day_of_month; + t->tm_mon = nsc->month - 1; + t->tm_year = nsc->year + 100; + t->tm_wday = nsc->day_of_week == 7 ? 0 : nsc->day_of_week; + t->tm_yday = 0; + t->tm_isdst = 0; + return t; +} + + diff --git a/noslotclock.h b/noslotclock.h new file mode 100644 index 0000000..e1b97d2 --- /dev/null +++ b/noslotclock.h @@ -0,0 +1,10 @@ +#ifndef NOSLOTCLOCK_H +#define NOSLOTCLOCK_H + +#include + +extern bool load_driver(void); +extern struct tm *read_time(struct tm *t); + +#endif + diff --git a/old/old-time.c b/old/old-time.c new file mode 100644 index 0000000..e4f4e6c --- /dev/null +++ b/old/old-time.c @@ -0,0 +1,176 @@ +#include /* printf, scanf */ +#include /* bool */ +#include /* strerror */ +#include /* time_t, time, localtime */ +#include /* toupper */ +#include /* errno */ +#include /* atoi */ + +#include "time.h" + +#define TIME_ERR_RESULT ((time_t) -1) +#define LOCALTIME_ERR_RESULT NULL +#define ERR_MSG_SIZE 128 + +static const char *AM="AM"; +static const char *PM="PM"; + +static char *to_upper_case(char *s); +static void set_err_msg(char *prefix, int errno); +static void copy_struct_tm(struct tm *dest, struct tm *src); +static const char *convert_24_hour_to_meridiem(uint8_t hours); +static uint8_t convert_12_hour_to_24_hour(uint8_t twelve_hour, char *meridiem); +static void convert_24_hour_to_12_hour(uint8_t twenty_four_hour, uint8_t *twelve_hour, char const **meridiem); + +static char G_err_msg[ERR_MSG_SIZE]; + +void copy_struct_tm(struct tm *dest, struct tm *src) +{ + dest->tm_sec = src->tm_sec; + dest->tm_min = src->tm_sec; + dest->tm_hour = src->tm_hour; + dest->tm_mday = src->tm_mday; + dest->tm_mon = src->tm_mon; + dest->tm_year = src->tm_year; + dest->tm_wday = src->tm_wday; + dest->tm_yday = src->tm_wday; + dest->tm_isdst = src->tm_isdst; +} + +static const char *convert_24_hour_to_meridiem(uint8_t hours) +{ + if (hours < 12) { + return AM; + } + else { + return PM; + } +} + +static uint8_t convert_12_hour_to_24_hour(uint8_t twelve_hour, char *meridiem) +{ + uint8_t twenty_four_hour; + + /* Default */ + twenty_four_hour = twelve_hour; + + /* Special cases */ + if (strcmp(meridiem, AM) == 0) { + if (twelve_hour == 12) { + twenty_four_hour = 0; + } + } + else if (twelve_hour < 12) { + twenty_four_hour = twelve_hour + 12; + } + return twenty_four_hour; +} + +void convert_24_hour_to_12_hour(uint8_t twenty_four_hour, uint8_t *twelve_hour, char const **meridiem) +{ + if (twenty_four_hour == 0) { + *twelve_hour = 12; + } + else if (twenty_four_hour < 12) { + *meridiem = AM; + } + else if (twenty_four_hour == 12) { + *meridiem = PM; + } + else { + *twelve_hour = twenty_four_hour - 12; + *meridiem = PM; + } +} + +void set_err_msg(char *what_failed, int err_code) +{ + snprintf(G_err_msg, ERR_MSG_SIZE, "%s: %s", what_failed, strerror(err_code)); +} + +bool load_system_time(struct tm *t) +{ + time_t now; + struct tm *now_breakdown; + bool success = false; + + if (time(&now) != TIME_ERR_RESULT) { + if ((now_breakdown = localtime(&now)) != LOCALTIME_ERR_RESULT) { + copy_struct_tm(t, now_breakdown); + success = true; + } + else { + perror("Localtime failed"); + } + } + else { + perror("Time function failed"); + } + return success; +} + +char *to_upper_case(char *s) +{ + size_t i; + + for (i = 0; s[i] != '\0'; ++i) { + s[i] = toupper(s[i]); + } + return s; +} + +void read_time_interactively(struct tm *t) +{ + char line[4]; + int8_t hour; + int8_t min; + + printf("Hour:"); + hour = atoi(fgets(line, sizeof(line), stdin)); + printf("Minute:"); + min = atoi(fgets(line, sizeof(line), stdin)); + printf("AM or PM:"); + fgets(line, sizeof(line), stdin); + + t->tm_hour = convert_12_hour_to_24_hour(hour, line); + t->tm_min = min; + t->tm_sec = 0; +} + +void add_one_second(struct tm *t) +{ + if (t->tm_sec < 59) { + ++(t->tm_sec); + } + else { + t->tm_sec = 0; + if (t->tm_min < 59) { + ++(t->tm_min); + } + else { + t->tm_min = 0; + if (t->tm_hour < 23) { + ++(t->tm_hour); + } + else { + t->tm_hour = 0; + } + } + } +} + +void print_12_hour_time(struct tm *t) +{ + uint8_t hour; + const char *meridiem; + + convert_24_hour_to_12_hour(t->tm_hour, &hour, &meridiem); + printf("%2hu:%02d:%02d %2s", hour, t->tm_min, t->tm_sec, meridiem); +} + +void reprint_12_hour_time(struct tm *t) +{ + printf("\b\b\b\b\b\b\b\b\b\b\b"); + print_12_hour_time(t); +} + diff --git a/old/old-time.h b/old/old-time.h new file mode 100644 index 0000000..c23f1f4 --- /dev/null +++ b/old/old-time.h @@ -0,0 +1,27 @@ +#ifndef TWELVE_HOUR_CLOCK_H +#define TWELVE_HOUR_CLOCK_H + +#include /* uint8_t */ + +typedef enum meridiem { + ANTE_MERIDIEM, POST_MERIDIEM +} meridiem; + +typedef struct { + /* Bit fields */ + unsigned int seconds : 5; /* Stores 0..31, need 0..59 */ + unsigned int minutes : 6; /* Stores 0..63, need 0..59 */ + unsigned int hours : 6; /* Stores 0..31, need 0..23 */ + unsigned int day : 5; /* Stores 0..31, need 1..31 */ + unsigned int month : 4; /* Stores 0..16, need 1..12 */ + unsigned int year : 7; /* Stores 0..127, need 0..99 */ +} unused_clock; + +extern void read_time_interactively(struct tm *t); +extern bool load_system_time(struct tm *t); +extern void add_one_second(struct tm *t); +extern void print_12_hour_time(struct tm *t); +extern void reprint_12_hour_time(struct tm *t); + +#endif + diff --git a/old/old_funcs.c b/old/old_funcs.c new file mode 100644 index 0000000..714ecec --- /dev/null +++ b/old/old_funcs.c @@ -0,0 +1,92 @@ + +void add_one_second(clock *clock) +{ + if (clock->seconds < 59) { + ++(clock->seconds); + } + else { + clock->seconds = 0; + if (clock->minutes < 59) { + ++(clock->minutes); + } + else { + clock->minutes = 0; + if (clock->hours < 11) { + ++(clock->hours); + } + else if (clock->hours == 11) { + ++(clock->hours); + if (clock->meridiem == ANTE_MERIDIEM) { + clock->meridiem = POST_MERIDIEM; + } + else { + clock->meridiem = ANTE_MERIDIEM; + } + } + else { + clock->hours = 1; + } + } + } +} + + +/** + * Doesn't work for all cases, but is not needed right now. + */ +void add_seconds(clock *clock, uint8_t seconds) +{ + uint16_t sum; + uint16_t minutes_carry; + uint16_t hours_carry; + + sum = ((uint16_t) clock->seconds) + ((uint16_t) seconds); + if (sum >= 60) { + minutes_carry = sum / 60; + clock->seconds = sum % 60; + + sum = ((uint16_t) clock->minutes) + minutes_carry; + if (sum >= 60) { + hours_carry = sum / 60; + clock->minutes = sum % 60; + + sum = ((uint16_t) clock->hours) + hours_carry; + if (sum >= 12) { + } + } + else { + clock->minutes = sum; + } + } + else { + clock->seconds = sum; + } +} + +void old_print(clock *clock) +{ + printf("%2u:%02u:%02u %2s", clock->hours, clock->minutes, clock->seconds, convert_24_hour_to_meridiem(clock->hours)); +} + +void add_one_second(struct tm *t) +{ + if (t->tm_sec < 59) { + ++(t->tm_sec); + } + else { + t->tm_sec = 0; + if (t->tm_min < 59) { + ++(t->tm_min); + } + else { + t->tm_min = 0; + if (t->tm_hour < 23) { + ++(t->tm_hour); + } + else { + t->tm_hour = 0; + } + } + } +} + diff --git a/printf.s b/printf.s deleted file mode 100644 index 0f3526c..0000000 --- a/printf.s +++ /dev/null @@ -1,37 +0,0 @@ -; -; File generated by cc65 v 2.15 - Git 6f24c07 -; - .fopt compiler,"cc65 v 2.15 - Git 6f24c07" - .setcpu "65C02" - .smart on - .autoimport on - .case on - .debuginfo off - .importzp sp, sreg, regsave, regbank - .importzp tmp1, tmp2, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4 - .macpack longbranch - .forceimport __STARTUP__ - .import _stdout - .import _fputc - .export _main - -; --------------------------------------------------------------- -; void __near__ main (void) -; --------------------------------------------------------------- - -.segment "CODE" - -.proc _main: near - -.segment "CODE" - - ldx #$00 - lda #$41 - jsr pushax - lda _stdout - ldx _stdout+1 - jsr _fputc - rts - -.endproc - diff --git a/prodos.c b/prodos.c new file mode 100644 index 0000000..9f39237 --- /dev/null +++ b/prodos.c @@ -0,0 +1,50 @@ +#include /* size_t */ + +#include "prodos.h" +#include "symbols.h" +#include "trace.h" + +/* +char *turn_on_high_bits(char *s) +{ + size_t i = 0; + + for ( ; s[i] != '\0'; ++i) { + s[i] |= '\x80'; + } + return s; +} +*/ + +bool run_basic_system_command(const char *command) +{ + size_t i = 0; + bool finished_successfully = false; + + TRACE_ENTER_STR("run_basic_system_command", (char *) command); + for ( ; command[i] != '\0'; ++i) { + /* Set the high bit and copy into the input buffer. */ + INPBUF[i] = command[i] | '\x80'; + } + /* Append carriage return with high bit set. */ + INPBUF[i] = '\x8d'; + TRACE_MSG("About to JSR DOSCMD"); + asm("JSR %w", DOSCMD); /* %w is for a "word" value. */ + asm("BIT %w", KBDSTRB); /* Clear strobe. */ + + /* If the command failed, the carry flag is set and register A has the + error code. */ + asm("BCS %g", doscmd_error_handler); + finished_successfully = true; + goto finished; + + doscmd_error_handler: + TRACE_MSG("About to JSR PRERR"); + asm("JSR %w", PRERR); /* Prints the error. */ + asm("CLC"); /* Required or bad stuff happens. */ + + finished: + TRACE_RET_BOOL("run_basic_system_command", finished_successfully); + return finished_successfully; +} + diff --git a/prodos.h b/prodos.h new file mode 100644 index 0000000..45ced67 --- /dev/null +++ b/prodos.h @@ -0,0 +1,32 @@ +#ifndef PRODOS_H +#define PRODOS_H + +#include /* bool */ + +/* C99 specifies that char can be either signed or unsigned. In cc65 it is + unsigned. This can be tested by checking if CHAR_MIN is either negative + or zero. + + With cc65 an 8-bit byte is represented by a char. The 6502 is byte- + addressable, so a memory address is represented by a char pointer + (char *) which is a 16-bit value. */ + +#define INPBUF ((char *) 0x0200) +#define DOSCMD 0xBE03 +/* #define PRERR 0xBE0C */ +#define PRERR 0xFF2D +#define COUT 0xFDED + +#define KBD ((char *) 0xC000) +#define KBDSTRB 0xC010 +#define VECTOUT ((char **) 0xbe30) +#define VECTIN ((char **) 0xbe32) + +#define KBDSTRB_ON() (*KBDSTRB & '\x80') +#define SET_KBDSTRB() *KBDSTRB |= '\x80' +#define CLR_KBDSTRB() + +extern bool run_basic_system_command(const char *command); + +#endif + diff --git a/putc.c b/putc.c deleted file mode 100644 index 29fbf23..0000000 --- a/putc.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -void main(void) -{ - putc('A', stdout); -} diff --git a/putc.s b/putc.s deleted file mode 100644 index 54eae22..0000000 --- a/putc.s +++ /dev/null @@ -1,25 +0,0 @@ - .file "putc.c" - .text - .globl main - .type main, @function -main: -.LFB0: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - movq %rsp, %rbp - .cfi_def_cfa_register 6 - movq stdout(%rip), %rax - movq %rax, %rsi - movl $65, %edi - call _IO_putc - nop - popq %rbp - .cfi_def_cfa 7, 8 - ret - .cfi_endproc -.LFE0: - .size main, .-main - .ident "GCC: (GNU) 5.1.1 20150618 (Red Hat 5.1.1-4)" - .section .note.GNU-stack,"",@progbits diff --git a/symbols.h b/symbols.h new file mode 100644 index 0000000..a08eedb --- /dev/null +++ b/symbols.h @@ -0,0 +1,6 @@ +#ifndef APPLE2_ADDRESSES_H +#define APPLE2_ADDRESSES_H + + +#endif + diff --git a/time.c b/time.c new file mode 100644 index 0000000..d7091ec --- /dev/null +++ b/time.c @@ -0,0 +1,154 @@ +#include /* printf, scanf */ +#include /* bool */ +#include /* strerror */ +#include /* time_t, time, localtime */ +#include /* toupper */ +#include /* errno */ +#include /* atoi */ + +#include "time.h" + +#define TIME_ERR_RESULT ((time_t) -1) +#define LOCALTIME_ERR_RESULT NULL +#define ERR_MSG_SIZE 128 + +static const char *AM="AM"; +static const char *PM="PM"; + +static char *to_upper_case(char *s); +static void set_err_msg(char *prefix, int errno); +static void copy_struct_tm(struct tm *dest, struct tm *src); +static const char *convert_24_hour_to_meridiem(uint8_t hours); +static uint8_t convert_12_hour_to_24_hour(uint8_t twelve_hour, char *meridiem); +static void convert_24_hour_to_12_hour(uint8_t twenty_four_hour, uint8_t *twelve_hour, char const **meridiem); + +static char G_err_msg[ERR_MSG_SIZE]; + +void copy_struct_tm(struct tm *dest, struct tm *src) +{ + dest->tm_sec = src->tm_sec; + dest->tm_min = src->tm_sec; + dest->tm_hour = src->tm_hour; + dest->tm_mday = src->tm_mday; + dest->tm_mon = src->tm_mon; + dest->tm_year = src->tm_year; + dest->tm_wday = src->tm_wday; + dest->tm_yday = src->tm_wday; + dest->tm_isdst = src->tm_isdst; +} + +static const char *convert_24_hour_to_meridiem(uint8_t hours) +{ + if (hours < 12) { + return AM; + } + else { + return PM; + } +} + +static uint8_t convert_12_hour_to_24_hour(uint8_t twelve_hour, char *meridiem) +{ + uint8_t twenty_four_hour; + + /* Default */ + twenty_four_hour = twelve_hour; + + /* Special cases */ + if (strcmp(meridiem, AM) == 0) { + if (twelve_hour == 12) { + twenty_four_hour = 0; + } + } + else if (twelve_hour < 12) { + twenty_four_hour = twelve_hour + 12; + } + return twenty_four_hour; +} + +void convert_24_hour_to_12_hour(uint8_t twenty_four_hour, uint8_t *twelve_hour, char const **meridiem) +{ + if (twenty_four_hour == 0) { + *twelve_hour = 12; + } + else if (twenty_four_hour < 12) { + *meridiem = AM; + } + else if (twenty_four_hour == 12) { + *meridiem = PM; + } + else { + *twelve_hour = twenty_four_hour - 12; + *meridiem = PM; + } +} + +void set_err_msg(char *what_failed, int err_code) +{ + snprintf(G_err_msg, ERR_MSG_SIZE, "%s: %s", what_failed, strerror(err_code)); +} + +bool load_system_time(struct tm *t) +{ + time_t now; + struct tm *now_breakdown; + bool success = false; + + if (time(&now) != TIME_ERR_RESULT) { + if ((now_breakdown = localtime(&now)) != LOCALTIME_ERR_RESULT) { + copy_struct_tm(t, now_breakdown); + success = true; + } + else { + perror("Localtime failed"); + } + } + else { + perror("Time function failed"); + } + return success; +} + +char *to_upper_case(char *s) +{ + size_t i; + + for (i = 0; s[i] != '\0'; ++i) { + s[i] = toupper(s[i]); + } + return s; +} + +void read_time_interactively(struct tm *t) +{ + char line[4]; + int8_t hour; + int8_t min; + + printf("Hour:"); + hour = atoi(fgets(line, sizeof(line), stdin)); + printf("Minute:"); + min = atoi(fgets(line, sizeof(line), stdin)); + printf("AM or PM:"); + fgets(line, sizeof(line), stdin); + + t->tm_hour = convert_12_hour_to_24_hour(hour, line); + t->tm_min = min; + t->tm_sec = 0; +} + +void print_12_hour_time(struct tm *t) +{ + uint8_t hour; + const char *meridiem; + + convert_24_hour_to_12_hour(t->tm_hour, &hour, &meridiem); + printf("%2hu:%02d:%02d %2s", hour, t->tm_min, t->tm_sec, meridiem); +} + +void reprint_12_hour_time(struct tm *t) +{ + printf("\b\b\b\b\b\b\b\b\b\b\b"); + print_12_hour_time(t); +} + diff --git a/time.h b/time.h new file mode 100644 index 0000000..fec08bf --- /dev/null +++ b/time.h @@ -0,0 +1,14 @@ +#ifndef TWELVE_HOUR_CLOCK_H +#define TWELVE_HOUR_CLOCK_H + +#include /* uint8_t */ +#include /* time_t */ + +extern void read_time_interactively(struct tm *t); +extern bool load_system_time(struct tm *t); +extern void add_one_second(struct tm *t); +extern void print_12_hour_time(struct tm *t); +extern void reprint_12_hour_time(struct tm *t); + +#endif + diff --git a/trace.c b/trace.c new file mode 100644 index 0000000..22ad0e0 --- /dev/null +++ b/trace.c @@ -0,0 +1,59 @@ +#include + +#include "trace.h" + +static void open(void); +static void close(void); +static FILE *t; +static char mode[2] = {'w', '\0'}; + +static void open() +{ + t = fopen(TRACE_FILE_NAME, mode); + if (t == NULL) { + perror(TRACE_FILE_NAME); + } + mode[0] = 'a'; +} + +static void close() +{ + if (fclose(t) == EOF) { + perror(TRACE_FILE_NAME); + } +} + +void trace_enter(char *func_name) +{ + open(); + fprintf(t, "Entering %s\n", func_name); + close(); +} + +void trace_enter_str(char *func_name, char *str_param) +{ + open(); + fprintf(t, "Entering %s(%s)\n", func_name, str_param); + close(); +} + +void trace_exit(char *func_name) +{ + open(); + fprintf(t, "Exiting %s\n", func_name); + close(); +} + +void trace_ret_bool(char *func_name, bool bool_param) +{ + open(); + fprintf(t, "Exiting %s with %d\n", func_name, bool_param); + close(); +} + +void trace_msg(const char *message) +{ + open(); + fprintf(t, "%s\n", message); + close(); +} diff --git a/trace.h b/trace.h new file mode 100644 index 0000000..c234a24 --- /dev/null +++ b/trace.h @@ -0,0 +1,38 @@ +#ifndef TRACE_H +#define TRACE_H + +#ifdef TRACE + +#include /* bool */ + +#define TRACE_FILE_NAME "trace" + +extern void trace_enter(char *func_name); +extern void trace_enter_str(char *func_name, char *str_param); +extern void trace_exit(char *func_name); +extern void trace_ret_bool(char *func_name, bool bool_param); +extern void trace_msg(const char *msg); + +#define TRACE_ENTER(f) trace_enter(f) +#define TRACE_ENTER_STR(f, s) trace_enter_str(f, s) +#define TRACE_EXIT(f) trace_exit(f) +#define TRACE_RET_BOOL(f, b) trace_ret_bool(f, b) +#define TRACE_MSG(m) trace_msg(m) + +#else + +#define TRACE_ENTER(f) +#define TRACE_ENTER_STR(f, s) +#define TRACE_EXIT(f); +#define TRACE_RET_BOOL(f, b) +#define TRACE_MSG(m) + +#define trace_enter(f) +#define trace_enter_str(f, s) +#define trace_exit(f); +#define trace_ret_bool(f, b) +#define trace_msg(m) + +#endif + +#endif