PrintShopCompanion-Apple-II/PSC Source Disk 3 - Calenda.../S_UCAL4.txt

820 lines
14 KiB
Plaintext

;
; S:UCAL4
;
; Calendar user interface menus
;
;
; SELDATE : given MNDATE as default,
; draws miniature calendar
; and allows user to select
; new date. Returns new date
; in X and in MNDATE.
;
; SELWDATE: given MNWDATE as default,
; draws miniature weekly
; calendar and allows user
; to select which piece to
; edit. Returns # in X and
; in MNWDATE. 7=DONE
;
;-----------
;
; Select day of month
;
; Miniature calendar width, height
;
HBW = 3
HBW2 = HBW*7
HBH = 18
;
; Location of miniature calendar
;
HBM = 4
HBM2 = HBM*7
HBY = 61
;---
HBZ EPZ $80
;
HCALX EPZ HBZ
HCALY EPZ HBZ+1
HCLSTFLG EPZ HBZ+2
HCDAYOWK EPZ HBZ+3
HCMNLAST EPZ HBZ+4
HCGKFLAG EPZ HBZ+5
HCDVX EPZ HBZ+6
HCDVY EPZ HBZ+7
HCDWIDTH EPZ HBZ+8
HCMNLST7 EPZ HBZ+9
HWPIECE EPZ HBZ+10
HWSTRING EPZ HBZ+11
HWDONE EPZ HBZ+12
;-----------
;
; See above explanation
;
SELDATE JSR CLS1
LDY #1
JSR CALCDAY
LDX MNLAST
LDA CLTYPE
BNE >0
;-----------
;
; Monthly date selection,
; with DONE box.
;
INX
STX HCMNLAST
LDY #24
JSR SLDHELP1
JSR HCALEN
JMP HGETDATE
;-----------
;
; Weekly date selection
;
^0 STX HCMNLAST
JSR PRINT
BYT PRCNTR
.DA #PRLOC,140,#19
BYT 'SELECT THE FIRST DAY FOR',CR
BYT 'YOUR WEEKLY '
.DA #PRSTR,TXTCAL,#CR
BRK
JSR HCALEN
JSR SLDHELP
JSR PRINT
BYT PRCNTR
BYT 'WHEN DONE',CR,0
JMP HGETDATE
;-----------
;
; Show help information
;
HBHELPX = 32
;
SLDHELP1 STY >0+3
JSR PRINT
BYT PRCNTR
^0 .DA #PRLOC,140,#00
BYT 'HIGHLIGHT SPECIAL OCCASIONS',CR,0
JSR SLDHELP
JSR PRINT
BYT PRCNTR
BYT 'TO ENTER',CR
BYT 'TEXT',CR,0
RTS
;
SLDHELP LDX #HBHELPX-3
LDY #HBY-12
LDA #0
JSR SHOWAROW
JSR PRINT
BYT PRCNTR
.DA #PRLOC,HBHELPX*7,#HBY+36
BYT 'MOVE',CR
BYT 'CURSOR',CR
BYT 'TO SELECT',CR
BYT 'DATE',CR,CR
BYT 'PRESS',CR
.DA #PRSTR,TXTRET,#CR
BRK
RTS
;-----------
;
; Draw miniature calendar
;
HCALEN JSR PRINT
BYT PRSPC,9
BYT PRCNTR
.DA #PRLOC,HBM2+73,#HBY-18
.DA #PRSTR,MONTHTXT,', '
.DA #PRSTR,YEARTEXT,#CR
;
.DA #PRHTAB,HBM2+HBW2/2
BYT 'S',NOCR
BYT PRRTAB2,HBW2,'M',NOCR
BYT PRRTAB2,HBW2,'T',NOCR
BYT PRRTAB2,HBW2,'W',NOCR
BYT PRRTAB2,HBW2,'T',NOCR
BYT PRRTAB2,HBW2,'F',NOCR
BYT PRRTAB2,HBW2,'S',NOCR
BRK
;
; Draw all the dates
;
LDY #1
^0 STY DATE
JSR HCDATE
LDY DATE
INY
CPY HCMNLAST
BLT <0
BEQ <0
RTS
;---
HCDATE JSR HCXYCALC
STA HCALX
STY HCALY
LDA HCWX2,X
STA >0+1
STY >0+3
JSR PRINT
^0 .DA #PRLOC,0,#0,#0
;
; Draw the frame
;
LDA HCALX
JSR HCDVLIN
LDA HCALX
CLC
ADC HCDWIDTH
JSR HCDVLIN
;
LDA #14
SEC
SBC MNFDAY
CMP DATE
BLT >1
LDA HCALY
JSR HCDHLIN
^1 LDA HCALY
CLC
ADC #HBH
JSR HCDHLIN
;
; "DONE" box?
;
LDY DATE
CPY MNLAST
BLT >1
BEQ >1
;
LDA HCALY
JSR HCDHLIN
JSR PRINT
BYT PRSPC,5,CR
BYT PRRTAB2,5
BYT 'DONE',CR,0
RTS
;
; Check to see if any data
; if so, put * under date.
;
^1 LDA MNLAST
EOR HCMNLAST
BEQ >2
;
; BUT only for monthly !!!
;
LDA #'*'
LDX DBUFPNTH-1,Y
BNE >3
^2 LDA #NOCR
^3 STA >4+2
;
; Print number
;
JSR MAKEDTXT
JSR PRINT
BYT PRSPC,2,CR,PRSPC,8
BYT PRRTAB2,4
.DA #PRSTR,DATETEXT,#CR
^4 BYT PRRTAB,3,'?',NOCR
BRK
RTS
;---
;
; Draw horizontal line
;
HCDHLIN LDX HCALX
LDY HCDWIDTH
STX >0+1
STA >0+2
STA >1+2
STY >0+3
TXA
CLC
ADC HCDWIDTH
STA >1+1
JSR PRINT
^0 BYT RTOSWITE,00,00,HBW,1
BYT RTOSANY
^1 BYT $03,00,00,1,1,0
RTS
;---
;
; Draw vertical line
;
HCDVLIN LDY HCALY
INY
STY >0+2
STA >0+1
JSR PRINT
BYT RTOSANY
^0 BYT $03,00,01,1,HBH,0
RTS
;---
;
; Calculate screen address in X,Y
; given DATE
;
; returns A:X byte offset
; Y:Y byte offset
; X:lookup table index, 0-6
; (used for X-bit offset)
; HCWIDTH:width of box
;
HCXYCALC LDA DATE
CMP MNLAST
BEQ >0
BLT >0
;
; "DONE" box if DATE > MNLAST
;
LDA #HBW*2
STA HCDWIDTH
LDA #HBM+2+HBW*2
LDY #158
LDX #7
RTS
;
^0 LDY #HBW
STY HCDWIDTH
CLC
ADC MNFDAY
SBC #0
LDX #$FF
^1 INX
SEC
SBC #7
BCS <1
ADC #7
LDY HCWY,X
TAX
LDA HCWX,X
RTS
;---
;
; X-byte location
;
HCWX BYT HBM,HBM+HBW,HBM+HBW*2
BYT HBM+HBW*3,HBM+HBW*4
BYT HBM+HBW*5,HBM+HBW*6
;
; X-bit location
;
HCWX2 BYT HBM2,HBM2+HBW2,HBM2+HBW2*2
BYT HBM2+HBW2*3,HBM2+HBW2*4
BYT HBM2+HBW2*5,HBM2+HBW2*6
BYT HBM2+14+HBW2*2
;
; Y-byte location
;
HCWY BYT HBY,HBY+HBH,HBY+HBH*2
BYT HBY+HBH*3,HBY+HBH*4
BYT HBY+HBH*5
;-----------
;
; Move cursor around to select date
;
HGETDATE LDX MNDATE
BNE *+3
INX
CPX HCMNLAST
BLT *+4
LDX HCMNLAST
STX DATE
LDA HCMNLAST
CLC
ADC #7
STA HCMNLST7
HGETDAT2 ASL HCGKFLAG
JSR HGETDVRD
STX HCDVX
STY HCDVY
;
^0 INC HCGKFLAG
JSR HCCURSOR
JSR FLSHINIT
;
^1 JSR HGETDVRD
BCS >2
ASL
BMI >2
BCS >3
JSR HGETDEVC
;
^2 JSR POLEKEY
BMI >4
DEC FLASHLO
BNE <1
DEC FLASHHI
BPL <1
BMI <0
;
^3 LDA #CR
;
; Key pressed
;
^4 JSR HCCURSOF
LDX DATE
JSR PARSE
.DA #CR,HCGDCR
.DA #ESC,HCGDESC
.DA #'I',HCGDUP
.DA #$0B,HCGDUP
.DA #'M',HCGDDOWN
.DA #$0A,HCGDDOWN
.DA #'J',HCGDLEFT
.DA #$08,HCGDLEFT
.DA #'K',HCGDRITE
.DA #$15,HCGDRITE
BRK
JMP HGETDAT2
;---
;
; Handle input device
;
HGETDEVC CPX HCDVX
BNE >0
CPY HCDVY
BNE >0
RTS
;
; Device moved
;
^0 JSR HGETDVST
JSR HCCURSOF
;
; Compute date given X,Y coordinates
;
LDA HCDVX
LDY HCDVY
^1 CLC
ADC #7
DEY
BPL <1
SBC #6
SBC MNFDAY
LDY #0
TAX
^2 PLA
PLA
TXA
JMP HGETDVAD
;---
;
; Do device clamping
;
HGETDVST BIT RTS
CPX #7
BLT >0
LDX #6
CLV
^0 CPY #8
BLT >1
LDY #7
CLV
^1 STX HCDVX
STY HCDVY
BVS >2
TXA
ASL
ASL
ASL
TAX
TYA
ASL
ASL
TAY
JSR DEVICEST
^2 RTS
;---
;
; Get scaled values from input device
;
HGETDVRD LDY #0
JSR DEVICERD
PHP
PHA
TXA
LSR
LSR
LSR
TAX
TYA
LSR
LSR
TAY
PLA
PLP
RTS
;---
HCCURSOF LSR HCGKFLAG
PHA
BCC >8
PLA
;
; Plot cursor
;
HCCURSOR PHA
JSR HCXYCALC
TAX
STX >0+2
INX
STX >1+1
;
INY
STY >0+3
STY >1+2
;
LDX HCDWIDTH
DEX
STX >1+3
JSR PRINT
^0 BYT RTOSANY,$FC,00,01,1,HBH-1
^1 BYT RTOSINV,01,01,HBW-1,HBH-1,0
^8 PLA
RTS
;---
HCGDCR CLC
HEX 24
HCGDESC SEC
PHP
CPX HCMNLAST
BLT >0
LDX HCMNLAST
^0 STX MNDATE
PLP
RTS
;
HCGDUP LDY #0
HEX 2C
HCGDDOWN LDY #1
HEX 2C
HCGDLEFT LDY #2
HEX 2C
HCGDRITE LDY #3
;
DEX
TXA
CLC
ADC HCGDTBL0,Y
HGETDVAD:
BPL >0
SEC
SBC HCGDTBL0,Y
;
^0 TAX
INX
CPX HCMNLST7
BLT >1
DEX
TXA
SBC #7
BCS <0
;
; If no DONE box, then clamp.
;
^1 LDA HCMNLAST
CMP MNLAST
BNE >2
CPX HCMNLAST
BLT >2
TAX
;
^2 STX DATE
JMP HGETDAT2
;
HCGDTBL0 BYT 0-7,7,0-1,1
;-----------
;
; Select which piece of weekly
; calendar to edit.
;
HWX = 5
HWX2 = HWX*7
HWY = 37
HWX2L = 140
HWW = 6
HWH = 18
HWX2LMAX = 91
;
SELWDATE JSR CLS1
LDA MNDATE
STA DATE
JSR MAKEDTXT
LDY #19
JSR SLDHELP1
JSR PRINT
BYT PRCSPACE,1
BYT PRCNTR
.DA #PRLOC,140,#19+8
BYT 'FOR THE WEEK OF '
.DA #PRSTR,MONTHTXT,' '
.DA #PRSTR,DATETEXT,', '
.DA #PRSTR,YEARTEXT,#CR
;
; Draw border
;
BYT RTOSANY,$60,HWX-1,HWY,1,1+8*HWH
BYT RTOSANY,$03,HWX+6,HWY,1,1+8*HWH
BYT RTOSANY,$60,HWX+19,HWY,1,1+7*HWH
BRK
;
; Fill in the blanks
;
JSR SWDOWEEK
LDX MNWDATE
;
; Select new MNWDATE
;
NEWPIECE STX HWPIECE
ASL HCGKFLAG
JSR HGETDVRD
STX HCDVX
STY HCDVY
;
^0 INC HCGKFLAG
JSR WKCURSOR
JSR FLSHINIT
;
^1 JSR HGETDVRD
BCS >2
ASL
BMI >2
BCS >3
JSR WKDEVICE
BNE NEWPIECE
;
^2 JSR POLEKEY
BMI >4
DEC FLASHLO
BNE <1
DEC FLASHHI
BPL <1
BMI <0
;
^3 LDA #CR
;
^4 JSR WKCURSOF
LDX HWPIECE
JSR PARSE
.DA #CR,WKGDCR
.DA #ESC,WKGDESC
.DA #'I',WKGDUP
.DA #$0B,WKGDUP
.DA #$08,WKGDUP
.DA #'M',WKGDDOWN
.DA #$0A,WKGDDOWN
.DA #$15,WKGDDOWN
BRK
JMP NEWPIECE
;
WKGDCR CLC
HEX 24
WKGDESC SEC
STX MNWDATE
RTS
;
WKGDUP DEX
BPL >0
LDX #6
;
WKGDDOWN INX
CPX #8
BLT >0
LDX #0
^0 JMP NEWPIECE
;---
;
; Handle input device
;
WKDEVICE CPX HCDVX
BNE >0
CPY HCDVY
BNE >0
RTS
;
^0 JSR HGETDVST
JSR WKCURSOF
LDX HCDVY
LDA #1
RTS
;---
;
; Turn off cursor
;
WKCURSOF LSR HCGKFLAG
PHA
BCC >1
PLA
;
; Toggle cursor
;
WKCURSOR PHA
JSR SWDYCALC
INY
STY >0+2
JSR PRINT
^0 BYT RTOSINV,HWX,01,HWW,HWH-1,0
^1 PLA
RTS
;---
;
; Draw mini-cal
;
SWDOWEEK LDA #0
LDX MNDATE
LDY MNFDAY
;
^0 STA HWPIECE
STX DATE
STY HCDAYOWK
JSR SWDDODAY
LDX DATE
INX
CPX MNLAST
BEQ >1
BLT >1
LDX #1
^1 LDY HCDAYOWK
INY
CPY #7
BLT >2
LDY #0
^2 LDA HWPIECE
CLC
ADC #1
CMP #8
BLT <0
RTS
;-----------
;
; Draw day of week, given
;
; given:HWPIECE : 0-7
; DATE : 1-31
; HCDAYOWK: 0-6
;
SWDDODAY LDY HCDAYOWK
JSR MAKEWTXT
LDA #0
STA WEEKTEXT+3
JSR MAKEDTXT
;
LDA HWPIECE
CMP #7
ROR HWDONE
;
; Draw top line
;
JSR SWDYCALC
STY >0+2
STY >1+3
INY
STY GRAPHY
JSR LINES
BYT "H",HWX-1
^0 BYT WITE,5,HWY,HWX2L
BYT WITE,5,HWY+8*HWH,44
BYT 1
;
;
; Next draw text
;
JSR PRINT
^1 .DA #PRLOC,HWX2+21,#00
BRK
;
BIT HWDONE
BPL >2
;---
;
; DONE box
;
JSR PRINT
BYT PRCNTR
BYT PRSPC,5,CR
BYT 'DONE',CR,0
RTS
;---
;
; Day of week box
;
^2 JSR PRINT
BYT PRCNTR
BYT PRSPC,2,CR,PRSPC,8
.DA #PRSTR,WEEKTEXT,#CR
.DA #PRSTR,DATETEXT,#CR
BRK
;---
;
; Now do this really clever thing here
; with the data in the buffer, sort
; of a graph indicating how much data
; has been typed in!!!!
;
LDA HWPIECE
ASL
ASL
STA HWSTRING
;
LDA #4
SWDGLOOP PHA
;
; Get length of string
;
LDY HWSTRING
INC HWSTRING
JSR GETTEXT
TYA
ASL
CMP #HWX2LMAX
BLT *+4
LDA #HWX2LMAX
STA GRAPHY+1
;
; Now draw the line
;
LDA #3
^0 PHA
INC GRAPHY
LDA TEXTBUFF
BEQ >1
;
JSR LINES
BYT "H",HWX-1
BYT WITE,52,00,11
GRAPHY = *-2
BYT 1
;
^1 PLA
SEC
SBC #1
BNE <0
INC GRAPHY
PLA
SBC #1
BNE SWDGLOOP
RTS
;-----------
;
; Given HWPIECE, compute Y-offset
; and self modify code.
;
SWDYCALC LDX HWPIECE
LDY >0+0,X
RTS
;
^0 BYT HWY,HWY+HWH,HWY+2*HWH
BYT HWY+3*HWH,HWY+4*HWH
BYT HWY+5*HWH,HWY+6*HWH
BYT HWY+7*HWH
;-----------
;
;
;
ICL "S:UCAL5"