Davex/src/xtn/2/cal.asm
2018-09-16 21:01:16 -04:00

436 lines
6.5 KiB
NASM

;*********************************************
;
; External command for Davex
;
; cal -- print month or year calendars
;
; cal <year> <month>
;
;*********************************************
;
; Converted to MPW IIgs 20-Sep-92 DAL
;
;*********************************************
.segment "CODE_A000"
OrgAdr = $A000 ;change as necessary (end below $B000)
.org OrgAdr ; Makes the listing more readable, though it doesn't really org the code - the linker does that.
.include "Common/2/Globals2.asm"
.include "Common/2/Apple.Globals2.asm"
.include "Common/2/Mli.globals2.asm"
.include "Common/Macros.asm"
MyVersion = $10
MinVersion = $11
January = 0
February = 1
December = 11
Sunday = 1
Monday = 2
Saturday = 7
;*********************************************
rts
.byte $ee,$ee
.byte MyVersion,MinVersion
.byte %00000000 ;hardware req
.addr descr
.addr OrgAdr
.addr start
.byte 0,0,0,0
; parameters here
.byte 0,t_int2
.byte 0,t_int1
.byte 0,0
descr: pstr "print month or year calendars"
;*********************************************
; dum xczpage ;32 locations
year = xczpage ; .res 2
month = year+2 ; .res 1
mn_day1 = month+1 ; .res 1
mn_size = mn_day1+1 ; .res 1
leap_flag = mn_size+1 ; .res 1
total = leap_flag+1 ; .res 2
last_yr = total+2 ; .res 2
ytemp = last_yr+2 ; .res 1
n1 = ytemp+1 ; .res 2
n2 = n1+2 ; .res 2
pos = n2+2 ; .res 1
m7 = pos+1 ; .res 2
myTemp = m7+2 ; .res 1
start: stx year+1
sty year
txa
bne not00xx
cpy #100
bcs not00xx
;;; clc
pha
tya
adc #<1900
sta year
pla
adc #>1900
sta year+1
not00xx:
lda #1
jsr xgetparm_n
cpy #0
beq bad_mn
cpy #12+1
bcc good_mn
bad_mn: jsr xmess
.byte cr
cstr_cr "*** month must be 1..12"
jmp xerr
good_mn:
dey
sty month
;
; check options here later
;
jsr crout
jsr Pr1Month
rts
;*********************************************
;
; Print small calendar for (year,month)
;
Pr1Month:
lda #20
jsr PrDateCenter
jsr xmess
cstr "Su Mo Tu We Th Fr Sa"
jsr CalcMonth ; year,month --> mn_day1,mn_size
clc
lda mn_day1
adc mn_size
sta limit
dec limit
lda #0
sta pos
Pr1Day: jsr _mod7
cmp #0
bne no_row
jsr crout
no_row: lda pos
clc
adc #1
sec
sbc mn_day1
bcc blank_day
adc #0 ;adds 1
sta xnum
lda #0
sta xnum+1
sta xnum+2
ldy #1
jsr xprdec_pady
jmp next_pos
blank_day:
jsr xmess
cstr " "
next_pos:
lda #$a0
jsr cout
inc pos
lda pos
cmp limit
bcc Pr1Day
PrMdone:
jmp crout
;*********************************************
;*********************************************
month_offset: .res 12
month_size: .byte 31,28,31,30,31,30,31,31,30,31,30,31
;*********************************************
;
; Calculate mn_size and mn_day1 from year,month
;
CalcMonth:
jsr CalcLeap
ldy month
jsr GetMonthYsize
sta mn_size
;
; build month-offset table:
; mo := 0;
; for m := 0 to 11 do begin
; month_offset[m] := mo mod 7;
; mo := mo + month_size[m];
; end;
;
lda #0
tax
moff1: sta month_offset,x
clc
adc month_size,x
jsr _mod7
inx
cpx #12
bcc moff1
jsr DayInWeek ;of day 1 in <year,month>
sta mn_day1
rts
_mod7: cmp #7
bcc _mod7x
sbc #7
bcs _mod7
_mod7x: rts
mod7ay: sta m7+1
sty m7
m7_1: lda m7+1
bne m7_2
lda m7
cmp #7
bcs m7_2
lda m7+1
ldy m7
rts
m7_2: sec
lda m7
sbc #7
sta m7
lda m7+1
sbc #0
sta m7+1
jmp m7_1
;*********************************************
CalcLeap:
lda year+1
ldy year
sta n1+1
sty n1
lda #>100
ldy #100
jsr _mod
php
lda year+1
ldy year
sta n1+1
sty n1
lda #>400
ldy #<400
plp
beq _Mod100is0
lda #>4
ldy #4
_Mod100is0:
jsr _mod
sec
beq IsLeap
clc
IsLeap: ror leap_flag
rts
;*********************************************
;
; calc AY = n1 mod AY
;
_mod: sta n2+1
sty n2
_mod1: lda n1+1
cmp n2+1
bne _mod1x
lda n1
cmp n2
_mod1x: bcc _mod_dun
;sec
lda n1
sbc n2
sta n1
lda n1+1
sbc n2+1
sta n1+1
bcs _mod1 ;always
_mod_dun:
lda n1
ora n1+1
php
lda n1+1
ldy n1
plp
rts
;*********************************************
DayInWeek:
ldx year+1
lda year
sec
sbc #1
bcs noDEC
dex
noDEC: sta last_yr
stx last_yr+1
; total := last_yr + (last_yr div 4)
sta total
stx total+1
stx ytemp
lsr ytemp
ror a
lsr ytemp
ror a
clc
adc total
sta total
lda ytemp
adc total+1
sta total+1
; total := total - (last_yr div 100)
ldx #0
div100: lda last_yr+1
bne div100s
lda last_yr
cmp #100
bcc div100dun
div100s:
sec
lda last_yr
sbc #100
sta last_yr
lda last_yr+1
sbc #>100
sta last_yr+1
inx
bcs div100
div100dun:
stx myTemp
sec
lda total
sbc myTemp
sta total
lda total+1
sbc #0
sta total+1
; total += last_yr div 400 [ = (last_yr div 100) div 4) ]
txa
lsr a
lsr a
clc
adc total
sta total
lda total+1
adc #0
sta total+1
; add day in year
jsr DayInYear ; --> AY
pha
tya
clc
adc total
tay
pla
adc total+1
jsr mod7ay
tya ;7-Feb-90 DAL
clc
adc #1
rts
;*********************************************
;
; Calc day (1..366) of first day of <month,year>
;
DayInYear:
lda #0
sta n1+1
sta n1
inc n1
tay ;for y=0 to month-1
diy1: cpy month
bcs diy_done
jsr GetMonthYsize
clc
adc n1
sta n1
bcc diy2
inc n1+1
diy2: iny
bne diy1
diy_done:
lda n1+1
ldy n1
rts
;*********************************************
GetMonthYsize:
lda month_size,y
cpy #February
bne not_feb29
bit leap_flag
bpl not_feb29
adc #0 ;sec from not taking BNE!
not_feb29:
rts
;*********************************************
PrDateCenter:
sec
sbc #5
ldy month
clc
adc mNameOff,y
sec
sbc mNameOff+1,y
lsr a
tax
lda #' '+$80
PrDateBl:
jsr cout
dex
bne PrDateBl
lda mNameOff+1,y
sta limit
lda mNameOff,y
tax
PrMonth:
lda mN,x
jsr cout
inx
cpx limit
bne PrMonth
lda #' '+$80
jsr cout
lda year+1
ldy year
jsr xprdec_2
jmp crout
limit: .res 1
mNameOff:
.byte mName1-mN,mName2-mN,mName3-mN,mName4-mN
.byte mName5-mN,mName6-mN,mName7-mN,mName8-mN
.byte mName9-mN,mName10-mN,mName11-mN,mName12-mN
.byte mName13-mN
mN:
mName1:
asc_hi "January"
mName2:
asc_hi "February"
mName3:
asc_hi "March"
mName4:
asc_hi "April"
mName5:
asc_hi "May"
mName6:
asc_hi "June"
mName7:
asc_hi "July"
mName8:
asc_hi "August"
mName9:
asc_hi "September"
mName10:
asc_hi "October"
mName11:
asc_hi "November"
mName12:
asc_hi "December"
mName13:
;*********************************************