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

1190 lines
19 KiB
Plaintext

TTL "S:PCAL"
; S:PCAL1
NOG
ORG = $F00
;-----------
;
; APPLE!
;
; 6/17/86 mod for color
;
;
; CALENDAR DRAW/PRINT
;
;-----------
DCZ EPZ $70
;
DCDAYOWK EPZ DCZ
DCTMP0 EPZ DCZ+1
;
WKPIECE EPZ DCZ+2
;
; COLOR stuff:
;
COLOR EPZ DCZ+3
YMAX EPZ DCZ+4
YCLIP EPZ DCZ+5
YSIZE EPZ DCZ+6
;
COLOR0 EPZ DCZ+7
COLOR1 EPZ DCZ+8
COLOR2 EPZ DCZ+9
COLOR3 EPZ DCZ+10
;
LORESL EPZ DCZ+11
LORESH EPZ DCZ+12
;
STRTDATE EPZ DCZ+13
;
; COLOR:color to use when drawing
; YMAX :maximum Y-coordinate when drawing
; 128 for B/W, 32 for color
; YCLIP:Y-value to subract when drawing
; into buffer. Set to 0,32,64,96
; when drawing top line.
; YSIZE:size of buffer to draw to during
; MAGIPRIN routine.
;
;-----------
;
; Monthly calendar date info
; CDM=margin at left edge
; CDW=width of each day
; CDH=height
;
CDM = 5
CDW = 135
CDH = 90
;
; Weekly calendar position info
;
WDRWX1 = 4
WDRWY1 = 9
WDRWX2 = 250
WDRWY2 = 9
;
;-----------
ORG ORG
OBJ $800
;-----------
JMP DOCALEN
JMP EDITDRAW
JMP EDITYOFF
JMP STRCROP
;-----------
;
; Save $4000.4FFF
;
DOCALEN TSX
STX STACK
JSR SWAPD000
;---
;
; Set color variables
;
LDA #128
LDX COLORPR
BEQ >0
LDA #32
^0 STA YMAX
;
LDA BLACKTBL,X
STA COLORTBL
;
; Move color bytes over from COBUFF
;
LDX #3
^1 LDA COLORPR
BEQ >2
LDA DCOLOR0,X
LDY COLORFLG
INY
BEQ >2
LDA #0
^2 STA COLOR0,X
DEX
BPL <1
;---
;
; First skip down 28
;
DOCALENL JSR INSUFONT
LDA #28
JSR SPACE
;---
;
; Now draw graphics and month/year
; and print it.
;
LDX #DOTOP
LDY /DOTOP
LDA #128
JSR MAGIPRIN
;---
;
; Now do actual calendar part
;
JSR DOCENTER
;---
;
; Credit line at bottom
;
JSR DOCREDIT
;---
;
; Decrement COPYCONT
;
LDA COPYCONT
BEQ ABORT
DEC COPYCONT
BNE DOCALENL
;-----------
;
; Go here to abort printout
; and when done!
;
ABORT LDX #00
STACK = *-1
TXS
JSR STSCREEN
;
; Make sure that kerning
; is off.
;
LDA #0
STA SPARM+11
STA COPYCONT
;
; Swap program with print buffer
;
SWAPD000 BIT $C08B
BIT $C08B
LDX #0
LDY #0
STY TMP0
LDA #$40
STY TMP2
STA TMP3
;
^0 LDA SWAPBUFR,X
BEQ >2
STA TMP1
^1 LDA (TMP0),Y
PHA
LDA (TMP2),Y
STA (TMP0),Y
PLA
STA (TMP2),Y
INY
BNE <1
INC TMP3
INX
BNE <0
;
^2 BIT $C083
BIT $C083
RTS
;
SWAPBUFR HEX D0D1D2D3D4D5D6D7
HEX D8D9DADBDCDDDEDF
HEX 9899
BRK
;-----------
;
; Blank spaces!
;
SPACE TAX
BEQ >2
^0 PHA
LDX #12
CMP #12
BGE >1
TAX
^1 STX TMP0
LDY #1
JSR CRLF
PLA
SEC
SBC TMP0
BNE <0
^2 JMP CLRPBUFF
;-----------
;
; Self adjusting draw routine
; for drawing areas larger than
; the maximum 32 lines for color.
;
; Given X,Y = address of routine,
; A = buffer size
;
; The routine will repeatedly call
; the draw routine and print as much
; as possible each pass. In B/W mode
; the whole buffer will be done in
; a single pass. In color mode, it
; can take up to 4 passes for 128
; byte tall buffers.
;
MAGIPRIN STX >1+1
STY >1+2
STA YSIZE
LDA #0
^0 STA YCLIP
JSR CLRPBUFF
^1 JSR $FFFF
;
; Print MIN (YSIZE-YCLIP,YMAX) lines
;
LDA YSIZE
SEC
SBC YCLIP
CMP YMAX
BLT >2
LDA YMAX
^2 JSR PRINBUFF
;
LDA YCLIP
CLC
ADC YMAX
CMP YSIZE
BLT <0
;
LDA #0
STA YCLIP
RTS
;-----------
;
; Draw center of calendar
;
DOCENTER LDA CLTYPE
BEQ DOMONTH
JMP DOWEEKLY
;-----------
;
; Monthly calendar
;
; First space down
;
DOMONTH CLC
LDA MNLAST
ADC MNFDAY
LDY #0-4
;
^0 INY
SEC
SBC #7
BEQ >1
BCS <0
;
^1 LDA SPCTABLE,Y
PHA
CLC
ADC #16
JSR SPACE
;
; Now draw days of the week
;
JSR DRAWDAYS
LDA #24
JSR PRINBUFF
;
; Now do actual calendar
;
JSR DOAMONTH
;
; Space down last amount
;
PLA
JMP SPACE
;
SPCTABLE BYT 90,45,0
;-----------
;
; Draw days of the week
;
DRAWDAYS LDA COLOR2
STA COLOR
JSR PRINT
.DA #PRLOC,CDM+CDW/2,#0
BYT PRCNTR,PRBIG,'SUN',NOCR
BYT PRRTAB2,CDW,'MON',NOCR
BYT PRRTAB2,CDW,'TUE',NOCR
BYT PRRTAB2,CDW,'WED',NOCR
BYT PRRTAB2,CDW,'THU',NOCR
BYT PRRTAB2,CDW,'FRI',NOCR
BYT PRRTAB2,CDW,'SAT',NOCR
BRK
RTS
;-----------
;
; Do credit line
;
DOCREDIT LDA COLOR3
STA COLOR
LDA #25
JSR SPACE
LDY #33
JSR GETTEXT
JSR PRINT
BYT PRCNTR,PRBIG
.DA #PRLOC,480,#0
.DA #PRSTR,TEXTBUFF,#CR,#0
LDA #30
JMP PRINBUFF
;-----------
;
; 0:left
; 1:right
; 2:left & right
; 3:row of 6 (or 3 for double size)
; 4:tiled
; 5-9:same as above, but double size
;
; Draw graphic(s) into buffer
;
DRAWGRS LDA GRSEL
EOR #NOGR
BEQ >9
;
LDA GROPTION
LDX #0
CMP #5
BCC >0
;
SBC #5
INX
;
^0 LDY O2TBL1,X
STY O2
LDY O2TBL2,X
STY O3+3
LDY O2TBL3,X
STY >2+0
TAX
;
; X-option
;
^1 LDA O1TBL,X
STA O1
;
; X-position
;
LDY O3TBLL,X
LDA O3TBLH,X
STY O3+1
STA O3+2
;
; Character spacing
;
LDA O4TBL,X
STA O4+1
;
; # of graphics to plot
;
LDA O5TBL,X
CLC
^2 NOP
ADC #0
TAY
;
; Build string
;
LDA #0
^3 STA TEXTBUFF,Y
LDA #'@'
DEY
BPL <3
;
STX >4+1
;
JSR PRINT
O1 BYT PRLEFT
O2 BYT PRSMAL
O3 .DA #PRLOC,0,#0
O4 BYT PRCSPACE,0
.DA #PRSTR,TEXTBUFF,#CR,#0
;
; If L+R then go back and do the
; right side.
;
^4 LDX #00
DEX
CPX #1
BEQ <1
^9 RTS
;
O1TBL BYT PRLEFT,PRRITE,PRLEFT,PRCNTR,PRCNTR
;
O2TBL1 BYT PRSMAL,PRBIG
O2TBL2 BYT 26,0
O2TBL3 BYT $EA,$4A
;
O3TBLL BYT 0,958,0,480,480
O3TBLH HBY 0,958,0,480,480
;
O4TBL BYT 0,0,0,86,0
;
O5TBL BYT 1,1,1,6,10
;-----------
;
; Do MONTHLY calendar
;
DOAMONTH LDA #1
STA STRTDATE
;
^0 LDX #DOAWEEK
LDY /DOAWEEK
;
LDA STRTDATE
CLC
ADC #6
CMP MNLAST
LDA #CDH
ADC #0
;
PHA
JSR MAGIPRIN
LDA DATE
STA STRTDATE
PLA
EOR #CDH
BEQ <0
RTS
;-----------
;
; Do a week
;
DOAWEEK LDA STRTDATE
STA DATE
;
LDA MNFDAY
LDY DATE
DEY
BEQ >0
LDA #0
^0 STA DCDAYOWK
;
^1 LDX DCDAYOWK
LDY DWXL,X
LDA DWXH,X
;
JSR DWDATE
INC DATE
;
INC DCDAYOWK
LDA DCDAYOWK
EOR #7
BNE <1
RTS
;---
DWXL BYT CDM,CDM+CDW,CDM+CDW*2
BYT CDM+CDW*3,CDM+CDW*4
BYT CDM+CDW*5,CDM+CDW*6
DWXH HBY CDM,CDM+CDW,CDM+CDW*2
HBY CDM+CDW*3,CDM+CDW*4
HBY CDM+CDW*5,CDM+CDW*6
;---
;
; Print rectangle and date with
; info, if any.
;
; Set X,Y offsets
;
DWDATE STY XOFFLO
STA XOFFHI
LDY #0
STY YOFF
;
; Always draw top line
;
JSR DWHLINE
;
; Valid date?
;
LDY DATE
CPY MNLAST
BLT >0
BEQ >0
RTS
;
; Draw the data inside the box
;
^0 DEY
JSR GETEDIT
LDY #$FF
JSR EDITDRAW
;
; Now put frame around date
;
; left edge
;
LDX #0
JSR DWVLINE
INX
JSR DWVLINE
;
; right edge
;
LDX #CDW
JSR DWVLINE
INX
JSR DWVLINE
;
; bottom line
;
LDY #CDH
JSR DWHLINE
;
; Update lores screen
;
^0 JMP UPLRK
;---
;
; Given Y, do X=0-(CDW+1)
;
DWHLINE LDX #0
^0 JSR DWPLOT
INX
CPX #CDW+2
BLT <0
RTS
;---
;
; Given X, do Y=0-(CDH)
;
DWVLINE LDY #0
^0 JSR DWPLOT
INY
CPY #CDH
BLT <0
RTS
;---
;
; Plot point with XOFFSET adjust
; for monthly calendar
;
DWPLOT STX DWPLOTSX
STY DWPLOTSY
;
; Compute X,Y
;
TXA
CLC
ADC XOFFLO
TAX
LDA XOFFHI
ADC #0
TAY
LDA DWPLOTSY
JSR PLOTDOT
LDX #00
DWPLOTSX = *-1
LDY #00
DWPLOTSY = *-1
RTS
;-----------
;
; Plot point into buffer
;
; Enter with X,Y:Xcoor
; A :Ycoor
;
PLOTDOT STA YCUR
SEC
SBC YCLIP
CMP YMAX
BGE DOTPLOTX
;
STX PLXSAVE
STY PLYSAVE
;
; Compute address into yellow plane
;
LSR
PHA
LDA #0
ROR
STA TMP0
PLA
ADC /CLBUFFER
STA TMP1
;
; Compute bit position
; X=Xcoor mod 8
;
STX TMP3
TXA
AND #7
TAX
LDA PBITS8,X
STA TMP2
;
; Compute byte offset
; Y=Xcoor/8
;
TYA
LSR
ROR TMP3
LSR
LDA TMP3
ROR
LSR
STA TMP3
;
; Set color
;
LDY COLOR2
^0 LDA COLORTBL,Y
STA COLORTMP
BPL >1
;
; Rainbow!
;
LDA YCUR
AND #$0F
TAX
LDY RBTBL,X
BPL <0
;
^1 LDY TMP3
;
; Set bits!
;
^2 LSR COLORTMP
BCC >3
LDA TMP2
ORA (TMP0),Y
STA (TMP0),Y
;
; Point to next plane
;
^3 LDA TMP1
CLC
ADC #$10
STA TMP1
CMP /CLBUFFER+$4000
BGE >4
LDA COLORPR
BNE <2
;
^4 LDX #00
PLXSAVE = *-1
LDY #00
PLYSAVE = *-1
;
DOTPLOTX RTS
;-----------
;
; Draw top of calendar
;
DOTOP LDA COLOR1
STA COLOR
JSR DRAWGRS
LDA COLOR0
STA COLOR
;;;;;;;; JMP DRAWMY
;-----------
;
; Draw month and year
;
DRAWMY LDA FONTSEL
CMP #NOFONT
BEQ >9
JSR INSCFONT
;
LDX #0
LDY #31
JSR >0
LDX #1
LDY #32
JSR >0
JMP INSUFONT
;
^0 LDA #1
STA DRAWKERN
;
LDA DRAWMYT1,X
STA DRAWSIZE
;
LDA DRAWMYT2,X
STA DRAWMYM2
;
LDA DRAWMYT3,X
STA DRAWYOFF
;
JSR GETTEXT
;---
;
; Scan through the string to find the
; tallest letter in the string.
;
LDY #0
STY TMP2
;
^0 LDA TEXTBUFF+1,Y
BEQ >2
TAX
LDA CFONTH-$20,X
DRAWMYM2 ASL
CMP TMP2
BLT >1
STA TMP2
^1 INY
BNE <0
;---
;
; Subtract 1/2 height of height
;
^2 LSR TMP2
LDA DRAWYOFF
SEC
SBC TMP2
STA DRAWYOFF
;
; Now set options
;
LDA TEXTBUFF
ASL
TAX
LDA DSNORMAL,X
STA TMP2
LDA DSNORMAL+1,X
STA DRAWEOR
;-----------
;
; Using tables, draw the string.
;
^0 LDX TMP2
INC TMP2
;
LDA DSOTBL0,X
BPL >1
;
; DONE!
;
^9 RTS
;---
;
^1 EOR #00
DRAWEOR = *-1
STA DRAWOPT
;
LDA #480
CLC
ADC DSXTBL0,X
STA DRAWX
;
LDA #00
DRAWYOFF = *-1
CLC
ADC DSYTBL0,X
STA DRAWY
;---
;
; Draw text into buffer
;
JSR PRINT
BYT PRCSPACE,3
DRAWOPT BYT PRINVR
DRAWSIZE BYT PRBIG
BYT PRKERN,1
DRAWKERN = *-1
BYT PRCNTR
.DA #PRLOC,480,#00
DRAWX = *-3
DRAWY = *-1
BYT PRSTR
ADR TEXTBUFF+1
BYT CR
BYT PRKERN,0
BRK
;
SEC
ROR DRAWKERN
JMP <0
;---
;
; 0=month, 1=year
;
DRAWMYT1 BYT PRBIG,PRSMAL
DRAWMYT2 ASL
NOP
DRAWMYT3 BYT 40,100
;---
;
; Pointers to parameters for String
; Draw subroutine.
;
; <pointer>,<eortbl>
;
DSNORMAL BYT 0,0
DSOUTLIN BYT 0,PRNORM^PRINVR
DS3D BYT 16,0
;---
;
; Option tables
;
DSOTBL0 DFS 14,PRINVR
BYT PRNORM
HEX FF
;
DSOTBL1 BYT PRINVR,PRNORM
BYT PRINVR,PRNORM
BYT PRINVR,PRNORM
BYT PRINVR,PRNORM
HEX FF
;---
;
; X offsets for
;
DSXTBL0 BYT 0,1,2,3,4
BYT 0,1,3,4,0
BYT 1,2,3,4,2
HEX FF
DSXTBL1 BYT 0,1,2,3,4,5,6,7
;
; Y offsets
;
DSYTBL0 BYT 0,0,0,0,0
BYT 1,1,1,1,2
BYT 2,2,2,2,1
HEX FF
DSYTBL1 BYT 0,1,2,3,4,5,6,7
;-----------
;
; Do weekly calendar
;
; Space down 13
;
DOWEEKLY LDA #13
JSR SPACE
;
LDA #0
LDX MNDATE
LDY MNFDAY
;
^0 STA WKPIECE
STX DATE
STY DCDAYOWK
;
LDX #DOWEEK2
LDY /DOWEEK2
LDA WKPIECE
CMP #6
LDA #81
ADC #0
JSR MAGIPRIN
;
LDX DATE
INX
CPX MNLAST
BEQ >1
BLT >1
LDX #1
^1 LDY DCDAYOWK
INY
CPY #7
BLT >2
LDY #0
^2 LDA WKPIECE
CLC
ADC #1
CMP #7
BLT <0
CLC
RTS
;---
;
; Enter with Y=0-6 for day of week
; A=0-6 section. DATE=date!
;
DOWEEK2 LDA WKPIECE
ASL
ASL
PHA
LDY DCDAYOWK
JSR MAKEWTXT
;
; Draw lines
;
LDX #959
LDY /959
^0 LDA #0
JSR PLOTDOT
LDA #81
JSR PLOTDOT
DEX
BNE <0
DEY
BPL <0
;
; Draw day of week and date and
; position the cursor for the rest
; of the data.
;
JSR MAKEDTXT
;
LDA COLOR2
STA COLOR
;
JSR PRINT
BYT PRBIG,PRSPC,25
.DA #PRLOC,WDRWX1,#WDRWY1
.DA #PRSTR,WEEKTEXT,#CR
BYT PRRTAB2,50
BYT PRCNTR
.DA #PRSTR,DATETEXT,#CR
.DA #PRLOC,WDRWX2,#WDRWY2
BRK
;
; Now draw the 4 strings
;
LDA COLOR3
STA COLOR
;
PLA
TAY
JSR >0
^0 JSR >1
;
; Draw string
;
^1 STY >2+1
JSR GETTEXT
JSR PRINT
BYT PRBIG
BYT PRSPC,16
.DA #PRSTR,TEXTBUFF,#CR,#0
;
^2 LDY #00
INY
RTS
;-----------
;
; Draw the date and all the data
; typed in for this date.
; Given EDITBUFF.
;
EDITDRAL LDY XOFFLO
LDA XOFFHI
STY >0+1
STA >0+2
LDY YOFF
STY >0+3
;
JSR MAKEDTXT
;
; # is printed with LINE color
;
LDA COLOR2
STA COLOR
;
JSR PRINT
^0 .DA #PRLOC,0,#0
BYT PRKERN,0
BYT PRRTAB2,10
BYT PRSPC,6,CR
BYT PRBIG
.DA #PRSTR,DATETEXT,#CR,#0
;
; Now draw the strings until the
; end is reached.
;
LDA COLOR3
STA COLOR
;
LDY #0
^1 TYA
PHA
JSR EDITDRAW
PLA
TAY
INY
BCC <1
RTS
;-----------
;
; Print a line of the EDITBUFF given
; in Y (0-7). SEC=if off bottom.
;
EDITDRAW CPY #$FF
BEQ EDITDRAL
;
JSR EDITYOFF
BCS >9
;
; Set size parameter
;
LDA EDITBUFF,X
LSR SPARM+8
LSR
ROL SPARM+8
;
; Now set Xoption parameters
;
AND #3
TAY
LDA EDITXTYP,Y
STA SPARM+1
;
; Set coordinates
;
LDA EDITXLO,Y
CLC
ADC XOFFLO
STA SPARM+2
LDA EDITXHI,Y
ADC XOFFHI
STA SPARM+3
;
LDA TMP0
ADC YOFF
ADC #DTCYMARG
STA SPARM+4
;
; Strip off extra characters
;
LDX #DTCXMAX
LDY /DTCXMAX
LDA /UFONT
JSR STRCROP
;
; Now print the string
;
JSR STROUT
CLC
^9 RTS
;---
;
; Left, Center, Right
;
EDITXTYP BYT 0,2,1
EDITXLO BYT DTCXMARG
BYT DTCXMARG+DTCXMAX/2
BYT DTCXMARG+DTCXMAX
EDITXHI HBY DTCXMARG
HBY DTCXMARG+DTCXMAX/2
HBY DTCXMARG+DTCXMAX
;-----------
;
; Calculate the following based
; on line # in Y.
;
; RETURNS:
;
;TMP0:Y offset
;TMP1:size (8 or 16)
;TMP2.3:address of string
;
; X:offset into EDITBUFF
; Y:unchanged
; SEC:forget it, no room
;
; CLC:ok
;
EDITYOFF LDX #0
STX TMP0
^0 LDA EDITBUFF,X
LSR
LDA #8
BCC >1
ASL
^1 STA TMP1
TXA
CMP EDITOFF,Y
BEQ >2
LDA TMP0
ADC TMP1
STA TMP0
TXA
ADC #32
TAX
BNE <0
;
^2 CLC
LDA TMP0
ADC TMP1
CMP #65
BCC >9
;
; Try small letter
;
LDA TMP1
CMP #8
BEQ >9
LSR
STA TMP1
ADC TMP0
CMP #65
BCS >9
LSR EDITBUFF,X
ASL EDITBUFF,X
;
; set TMP2.3
;
^9 INX
STX TMP2
LDA /EDITBUFF
STA TMP3
DEX
RTS
;
EDITOFF HEX 0020406080A0C0E0
;-----------
;
; Chop letters off string until
; it fits on line, given:
; A:Font address
; X:lo byte maxwidth
; Y:hi byte maxwidth
; TMP2.3:string address
;
STRCROP STX STRCROP0
STY STRCROP1
JSR FINSTALL
;
LDA SPARM+1
PHA
;
; Set STROUT to return width value
;
LDA #3
STA SPARM+1
;
; Point to string
;
LDY TMP2
LDA TMP3
STY SPARM+9
STA SPARM+10
;
; Strip off letters until string
; fits on line.
;
^0 JSR STROUT
CMP /00
STRCROP1 = *-1
BNE >1
CPY #00
STRCROP0 = *-1
^1 BLT >3
;
; Strip off a character
;
LDY #$FF
^2 INY
LDA (TMP2),Y
BNE <2
DEY
STA (TMP2),Y
BPL <0
;
^3 PLA
STA SPARM+1
RTS
;-----------
;
;
;
ICL "S:PCAL2"