mirror of
https://github.com/david-schmidt/Davex.git
synced 2024-06-17 16:29:31 +00:00
436 lines
6.5 KiB
NASM
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:
|
|
;*********************************************
|