Added stuff

This commit is contained in:
Bill Chatfield 2015-08-24 02:40:05 -04:00
parent 4cc7d11da5
commit 6648236fb6
14 changed files with 855 additions and 54 deletions

View File

@ -1,7 +1,20 @@
#include <stdio.h> /* printf, scanf */
#include <stdbool.h> /* bool */
#include <string.h> /* strerror */
#include <time.h> /* time_t, time, localtime */
#include <ctype.h> /* toupper */
#include <errno.h> /* 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) {
@ -12,6 +25,49 @@ static char *meridiem_text(meridiem_t m)
}
}
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];

View File

@ -15,6 +15,7 @@ typedef struct {
} 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);

View File

@ -13,17 +13,18 @@ endif
PGM=alarmclk
OBJS=alarmclk.o 12hourclk.o clkfreq.o
PGM2=cpufreq
OBJS2=clkfreq.o
PGM2=calibrate
OBJS2=calibrate.o
CC=cl65
AS=ca65
LD=ld65
CFLAGS=-t $(CC65_TARGET) -O
ASFLAGS=-t $(CC65_TARGET)
LDFLAGS=-t $(CC65_TARGET)
DISK_VOL=ALARMCLK
DISK_VOL=alarmclk
DISK=$(DISK_VOL).dsk
AC=java -jar lib/AppleCommander-1.3.5.14.jar
@ -36,12 +37,14 @@ all: $(DISK)
$(DISK): $(PGM) $(PGM2)
$(AC) -d $(DISK) $<
$(AC) -cc65 $(DISK) $< BIN < $<
$(AC) -d $(DISK) $(PGM2)
$(AC) -cc65 $(DISK) $(PGM2) BIN < $(PGM2)
$(PGM): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^
$(PGM2): clkfreq.s
$(AS) $(ASFLAGS) -o $@ $^
$(PGM2): $(OBJS2)
$(CC) $(LDFLAGS) -o $@ $^
# Compile and assemble rules use the defuault rules after CC and CFLAGS
# are set.

View File

@ -5,8 +5,8 @@
#include <conio.h> /* clrscr, kbhit */
#include "12hourclk.h"
extern void clkfreq();
extern uint8_t ticks[4];
extern void ClockFreq();
extern uint8_t Ticks[4];
#define CLOCK_FREQUENCY 1023000L
#define CYCLES_PER_NOOP 2
@ -23,17 +23,18 @@ static twleve_hour_clock_t alarm_time;
void main(void)
{
clkfreq();
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);
Ticks[0] & 0x70,
Ticks[0] & 0x07,
Ticks[1] & 0x70,
Ticks[1] & 0x07,
Ticks[2] & 0x70,
Ticks[2] & 0x07,
Ticks[3] & 0x70,
Ticks[3] & 0x07);
clrscr();
read_inputs();
clrscr();
@ -46,8 +47,10 @@ void main(void)
void read_inputs()
{
puts("Current Time");
read_interactively(&curr_time);
if (! load_system_time(&curr_time)) {
puts("Current Time");
read_interactively(&curr_time);
}
puts("Alarm Time");
read_interactively(&alarm_time);
}

BIN
alarmclk.dsk Normal file

Binary file not shown.

515
alarmclk.s Normal file
View File

@ -0,0 +1,515 @@
;
; 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

9
calcClkfreq.c Normal file
View File

@ -0,0 +1,9 @@
/* This file is only here to make clkfreq.s load successfully. */
#include "clkfreq.h"
void main()
{
clkfreq();
}

93
calibrate.s Normal file
View File

@ -0,0 +1,93 @@
.forceimport __STARTUP__
.export _main
.segment "RODATA"
; All numbers are going to be this size and type.
Unsigned_Integer_Size = 4
; Standard character output routine
COUT = $fded
.segment "BSS"
Sleep_Loop_Count: .res Unsigned_Integer_Size,0 ; Byte values initialized to 0
; *************************************
;
; Macros
;
; *************************************
; Number++
.macro Increment Number
.local Next_Byte
.local Done
ldx #0 ; X := 0
Next_Byte:
inc Number,X ; Increment the value at Count+X address
bne Done ; Incrementing Count did not cause it to roll over to 0.
inx ; Increment X to the next byte
cpx #Unsigned_Integer_Size ; Compare X with 4.
bmi Next_Byte ; If X < Count_Size continue with next byte.
Done:
.endmacro
; Minuend = Minuend - Subtrahend
.macro Subtract Minuend, Subtrahend
.local Next_Byte
ldx #0
clc
Next_Byte:
lda Addr1,X
sbc Addr2,X
inx
cpx #Unsigned_Integer_Size
bmi Next_Byte
.endmacro
; *************************************
;
; Main
;
; *************************************
.segment "CODE"
.proc _main: near
.segment "CODE"
Sleep_Loop:
; Do nothing 10 times.
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
Increment Sleep_Loop_Count
lda #1
cmp Sleep_Loop_Count+3
bmi Sleep_Loop
; Output result
ldx #0
Next_Byte:
lda Sleep_Loop_Count,X
jsr COUT
inx
cpx #Unsigned_Integer_Size
bmi Next_Byte
rts ; from _main
.endproc

BIN
clkfreq Normal file

Binary file not shown.

10
clkfreq.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef CLKFREQ_H
#define CLKFREQ_H
#include <stdint.h> /* uint8_t */
extern void clkfreq(void);
extern uint8_t ticks[4];
#endif

115
clkfreq.s
View File

@ -1,3 +1,18 @@
.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
@ -6,9 +21,12 @@ vcNMI = $FFFA
Refresh = 450 ; NMI rate in Hz
.export _clkfreq
.export _ticks
_clkfreq:
.segment "CODE"
.proc _ClockFreq: near
.segment "CODE"
ldx #<NMI ; installing the NMI vector
ldy #>NMI
stx vcNMI
@ -19,10 +37,10 @@ _clkfreq:
Again:
lda #0
sta Flag
sta _ticks ; initializing counter
sta _ticks+1
sta _ticks+2
sta _ticks+3
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
@ -45,40 +63,40 @@ L2: bit Flag ; waiting for true zeropoint
Main: ; main counting cycle
;number of ticks per command sum of ticks
; v v
lda _ticks ;4
lda _Ticks ;4
clc ;2 6
sed ;2 8
adc #$53 ;2 10
sta _ticks ;4 14
lda _ticks+1 ;4 18
sta _Ticks ;4 14
lda _Ticks+1 ;4 18
adc #0 ;2 20
sta _ticks+1 ;4 24
lda _ticks+2 ;4 28
sta _Ticks+1 ;4 24
lda _Ticks+2 ;4 28
adc #0 ;2 30
sta _ticks+2 ;4 34
lda _ticks+3 ;4 38
sta _Ticks+2 ;4 34
lda _Ticks+3 ;4 38
adc #0 ;2 40
sta _ticks+3 ;4 44
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
lda _Ticks ;4 10
clc ;2 12
sed ;2 14
adc #$95 ;2 16
sta _ticks ;4 20
lda _ticks+1 ;4 24
sta _Ticks ;4 20
lda _Ticks+1 ;4 24
adc #0 ;2 26
sta _ticks+1 ;4 30
lda _ticks+2 ;4 34
sta _Ticks+1 ;4 30
lda _Ticks+2 ;4 34
adc #0 ;2 36
sta _ticks+2 ;4 40
lda _ticks+3 ;4 44
sta _Ticks+2 ;4 40
lda _Ticks+3 ;4 44
adc #0 ;2 46
sta _ticks+3 ;4 50
sta _Ticks+3 ;4 50
cld ;2 52
lda Timer ;4 56
cmp #<Refresh ;2 58
@ -92,14 +110,16 @@ Main: ; main counting cycle
sta rgConfig
sta InUse
; Output
ldx #0 ; send first string to the host
L3: lda Mes1,x
beq L4
jsr Send
jsr PutChar
inx
jmp L3
L4: lda _ticks+3
L4: lda _Ticks+3
pha
lsr
lsr
@ -111,21 +131,24 @@ L5: pla
and #15
jsr PrintDigit
lda #'.' ; decimal point
jsr Send
lda _ticks+2
jsr PutChar
lda _Ticks+2
jsr PrintTwoDigits
lda _ticks+1
lda _Ticks+1
jsr PrintTwoDigits
lda _ticks
lda _Ticks
jsr PrintTwoDigits
ldx #0 ; send second string to the host
L6: lda Mes2,x
beq L7
jsr Send
jsr PutChar
inx
jmp L6
L7: jmp Again ; repeat process
L7:
rts
.endproc
PrintTwoDigits:
pha
@ -141,15 +164,26 @@ PrintTwoDigits:
PrintDigit:
ora #$30
jsr Send
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 "
@ -159,11 +193,19 @@ Mes2:
.byte " MHz"
.byte 0
_ticks: .res 4,0
Timer: .res 2,0
InUse: .byte 0
Flag: .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
@ -173,3 +215,4 @@ L8: lda #$80 ;2 20
sta Flag ;4 24
pla ;4 28
rti ;6 34

37
printf.s Normal file
View File

@ -0,0 +1,37 @@
;
; 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

6
putc.c Normal file
View File

@ -0,0 +1,6 @@
#include <stdio.h>
void main(void)
{
putc('A', stdout);
}

25
putc.s Normal file
View File

@ -0,0 +1,25 @@
.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