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. ; ; , ; 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"