-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdate.cmd.s
More file actions
133 lines (104 loc) · 2.81 KB
/
date.cmd.s
File metadata and controls
133 lines (104 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
;;; ============================================================
;;;
;;; DATE - Print the current date/time
;;;
;;; Usage: DATE
;;;
;;; NOTE: Only supports 2 digit years
;;;
;;; ============================================================
.include "apple2.inc"
.include "more_apple2.inc"
.include "prodos.inc"
;;; ============================================================
.org $4000
start:
jsr CROUT
;;; 49041 ($BF91) 49040 ($BF90)
;;; 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
;;; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
;;; DATE: | year | month | day |
;;; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
;;;
;;; 49043 ($BF93) 49042 ($BF92)
;;; 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
;;; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
;;; TIME: |0 0 0| hour | |0 0| minute |
;;; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
lda #GET_TIME
jsr GOSYSTEM
lda DATELO
ora DATEHI
beq not_set
;; Date
lda DATELO+1 ; month
ror a
pha
lda DATELO
pha
rol a
rol a
rol a
rol a
and #%00001111
jsr PrintNumber
lda #'/'|$80 ; /
jsr COUT
pla ; day
and #%00011111
jsr PrintNumber
lda #'/'|$80 ; /
jsr COUT
pla ; year
jsr PrintNumber
lda #' '|$80 ;
jsr COUT
jsr COUT
;; Time
lda TIMELO+1 ; hour
and #%00011111
jsr PrintNumber
lda #':'|$80 ; ':'
jsr COUT
lda TIMELO ; minute
and #%00111111
jsr PrintNumber
finish: jsr CROUT
clc
rts
not_set:
ldx #0
: lda msg,x
beq finish
ora #$80
jsr COUT
inx
bne :- ; always
msg: .byte "<NO DATE>", 0
;;; ============================================================
;;; Print a 2-digit number, with leading zeros
.proc PrintNumber
;; Reduce to 2 digits
: cmp #100
bcc :+
sec
sbc #100
bne :-
;; Leading zero?
: ldx #0
cmp #10 ; >= 10?
bcc tens
;; Divide by 10, dividend(+'0') in X remainder in A
: sbc #10
inx
cmp #10
bcs :-
tens: pha
txa
ora #'0'|$80 ; convert to digit
jsr COUT
units: pla
ora #'0'|$80 ; convert to digit
jsr COUT
rts
.endproc