PrintShopCompanion-Apple-II/PSC Source Disk 1 - System .../S_SUBPAK2.txt

1061 lines
19 KiB
Plaintext

;
; S:SUBPAK2
;
COUT ORA #$80
JMP $FDED
;-----------
TXTINIT BYT 'INITIALIZE',0
;
TXTPRET BYT 'PRESS '
TXTRET BYT '<RETURN>',0
TXTCA BYT 'CHOOSE A ',0
;
TXTINDRV BYT 'IN '
TXTDRIVE BYT 'DRIVE ',0
;
TXTDD BYT 'DATA'
TXTSD BYT ' '
TXTD BYT 'DISK',0
;
PSTEXT BYT 'PRINT SHOP',0
CTEXT BYT 'COMPANION',0
DTEXT BYT 'DATA',0
TXTPAK BYT 'PRESS ANY KEY',0
;-----------
;
; Clear screen and display
; the standard white border
;
WITEBORD JSR CLSCREEN
JSR PRINT
BYT RTOSWITE,0,0,1,192
BYT RTOSWITE,39,0,1,192
BYT RTOSWITE,1,0,38,16
BYT RTOSWITE,1,183,38,9
BRK
JMP PCHEKSUM
;-----------
;
; Check for keypress BPL=no key
; BMI=key in A
;
POLEBTN LDY #0
JSR DEVICERD
BCS POLEKEY
ASL
BMI POLEKEY
BCC POLEKEY
LDA #$8D
BNE >0
;
POLEKEY LDA $C000
BMI >0
LDA #0
RTS
;
^0 PHP
BIT $C010
CMP #$FF
BEQ >1
CMP #$E0
BLT >1
AND #$DF
^1 AND #$7F
PLP
^2 RTS
;
; Get a key
;
GETKEY BIT $C010
^0 JSR POLEBTN
BPL <0
RTS
;-----------
;
; JSR PICDRAW
; BYT <xstart>,<ystart>,<width>,<height>
; HEX <compressed data>
;
; TMP0=Start X
; TMP1=Start Y
; TMP2=width
; TMP3=height
; TMP4=Repeat counter
;
PICDRAW JSR GETINIT
PICDRAW2 LDX #0
STX TMP4
^0 JSR GETBYTE
STA TMP0,X
INX
CPX #4
BLT <0
;
LDX TMP1
^1 LDA TMP0
CLC
ADC YBASELO,X
STA HIRES
LDA YBASEHI,X
STA HIRES+1
LDY #0
;
^2 JSR PICBYTE
STA (HIRES),Y
INY
CPY TMP2
BLT <2
INX
DEC TMP3
BNE <1
RTS
;
PICBYTE LDA TMP4
BEQ >0
;
PICREPT LDA #00
DEC TMP4
BPL >1
;
^0 JSR GETBYTE
BMI >2
;
^1 RTS
;
^2 PHA
ASL
ASL
LDA #$00
BCC >3
LDA #$7F
^3 STA PICREPT+1
PLA
AND #%00111111
STA TMP4
BPL PICBYTE
;-----------
;
; "PRESS ANY KEY TO CONTINUE..."
;
ANYKEY LDY #173
HEX 2C
ANYKEY2 LDY #185
STY >0+3
JSR PRINT
^0 .DA #PRLOC,140,#00
BYT PRCNTR
.DA #PRSTR,TXTPAK,' TO '
BYT 'CONTINUE...',NOCR,0
;
JSR GETKEY
SEC
RTS
;-----------
;
; "<ESC> TO GO BACK"
;
ESCBACK JSR PRINT
.DA #PRLOC,140,#184
BYT PRCNTR,PRINVR
BYT '<ESC> TO GO BACK',CR,0
SEC
RTS
;-----------
;
; JSR SETTYPE
; BYT '<typetext>',0
; BYT '<header text>',0
; BYT '<fileprefix>',0
; BYT <filelength for CATALOG>
; ADR <startaddress>
; ADR <length>
;
; Get type text "GRAPHIC"
;
SETTYPE JSR GETINIT
LDY #0
^0 JSR GETBYTE
STA TYPETEXT,Y
BEQ >0
INY
BNE <0
;
; Get header text "GRAPHIC EDITOR+"
;
^0 LDY #0
^1 JSR GETBYTE
STA HEADTEXT,Y
BEQ >0
INY
BNE <1
;
; Get file prefix "BORD."
;
^0 LDY #0
^1 JSR GETBYTE
STA FLPREFIX,Y
BEQ >0
INY
BNE <1
;
; Get CAT length, loadadr, length
;
^0 LDY #0
^1 JSR GETBYTE
STA TYPELEN,Y
INY
CPY #5
BLT <1
RTS
;
TYPETEXT DFS 10,0
HEADTEXT DFS 16,0
;-----------
;
; 0=Save file
; 1=Load file
;
SAVEGET HEX 00
;
FLPREFIX DFS 6,0
;
; The following routines assume
; that SETTYPE was done.
;
; Get a file, if SEC then get from
; COMPANION disk which is drive one.
; Else, use the DATADRIV parameter.
;
GETFILE STA GETCSIDE
LDA DATADRIV
PHA
LDY #DTEXT
LDX /DTEXT
BCS >0
;
LDY #CTEXT
LDX /CTEXT
LDA #1
;
^0 STA DATADRIV
STY GET1MOD+1
STX GET1MOD+2
LDA #1
JSR DOFILE
PLA
STA DATADRIV
RTS
;-----------
;
; Save file
;
SAVEFILE LDA #0
SEC
ROR INITFLAG
SEC
;
DOFILE STA SAVEGET
ROR MASTMOD
;
LDA DATADRIV
STA $AA68
ORA #'0'
CMP #'1'
BNE *+4
LDA #' '
STA TXTDRIVE+6
;
JSR WITEBORD
JSR ESCBACK
JMP DISKLOP2
;
DISKLOOP JSR CLS1
DISKLOP2 JSR PRINT
BYT PRINVR,PRRITE
.DA #PRLOC,149,#4
.DA #PRSTR,HEADTEXT
BYT ':',CR,0
;
LDA SAVEGET
BEQ >0
;
JSR PRINT
BYT PRBIG,PRINVR
.DA #PRLOC,160,#1
BYT 'GET',CR
BYT PRSMAL,PRNORM
BYT PRCNTR
.DA #PRLOC,140,#52
.DA #PRSTR,TXTCA
.DA #PRSTR,TYPETEXT
BYT ':',CR
.DA #PRLOC,15,#92,#PRLEFT
BYT 'PLACE '
GET1MOD .DA #PRSTR,$FFFF
.DA #PRSTR,TXTSD
BYT ' ',NOCR,0
JMP >1
;
^0 JSR PRINT
BYT PRBIG,PRINVR
.DA #PRLOC,160,#1
BYT 'SAVE',CR
BRK
JSR INIT?
BCC *+3
RTS
;
JSR CLS1
JSR PRINT
.DA #PRLOC,140,#48
BYT PRCNTR
BYT 'TO SAVE '
.DA #PRSTR,TYPETEXT
BYT ' YOU ARE',CR
BYT 'WORKING ON:',CR
BYT PRLEFT
.DA #PRLOC,15,#92
BYT 'PLACE '
.DA #PRSTR,TXTINIT
BYT 'D '
.DA #PRSTR,TXTDD,#CR
BRK
;
^1 JSR PRINT
.DA #PRSTR,TXTINDRV,#CR
.DA #PRLOC,15,#116
BYT 'TYPE IN NAME OF '
.DA #PRSTR,TYPETEXT
BYT ' OR ',CR
.DA #PRSTR,TXTPRET
BYT ' FOR '
.DA #PRSTR,TYPETEXT
BYT ' LIST',CR,CR,'>',NOCR,0
;
JSR INPUTNAM
BCS DISKQUIT
;
LDA #00
MASTMOD = *-1
BMI >0
;
; Getting from Companion disk
; so make sure it is in drive.
;
CLC
LDA #00
GETCSIDE = *-1
JSR WAITCD
BCC >1
BCS >5
;
; Getting/Saving to other disk
; so make sure that Companion
; or Print Shop disk is not in
; drive.
;
^0 JSR REMOMAST
BCS DISKQUIT
;
^1 JSR NOPROT
LDA FILENAME
BEQ CATALOG
;
LDA SAVEGET
BEQ >0
;
JSR BLOADTY
JMP >3
;
^0 JSR SAVESUPP
BNE >4
JSR VERIFYTY
BEQ >1
CMP #6
BEQ >2
BNE >4
^1 LDA #99
JSR ERROR
CMP #CR
BNE >5
JSR CLS1
JSR DELETETY
BNE >4
^2 JSR BSAVETY
;
^3 CLC
BEQ DISKQUIT
^4 JSR ERROR
^5 JMP DISKLOOP
;
DISKQUIT BCC >0
LDA SAVEGET
BNE >0
SEC
ROR INITFLAG
JMP DISKLOOP
^0 RTS
;
DISKERR LDA #8
JSR ERROR
JMP DISKLOOP
;
; CATALOG disk
;
CATALOG JSR CLS2
JSR PRINT
.DA #PRLOC,140,#20,#PRCNTR
BYT 'LIST OF '
.DA #PRSTR,TYPETEXT
BYT 'S ON THIS'
.DA #PRSTR,TXTSD
BYT ':',CR,0
LDA #$FF
STA CATPAGE
STA CATCOUNT
JSR CATINIT
BCS DISKERR
;
^0 INC CATCOUNT
JSR CATFILE
BCS DISKERR
BNE CATDONE
STA CATFLMOD
STY CATFLMOD+1
INC CATPAGE
LDA CATPAGE
EOR #15
BNE >1
STA CATPAGE
JSR ANYKEY
CMP #ESC
BEQ CATDONE2
JSR CLS2
;
^1 LDA #00
CATPAGE = *-1
ASL
ASL
ASL
ADC #36
STA CATYMOD
JSR PRINT
.DA #PRLOC,64
CATYMOD HEX FF
.DA #PRSTR
CATFLMOD ADR $FFFF
BYT CR,0
JMP <0
;
CATDONE LDA #00
BNE >0
JSR PRINT
.DA #PRLOC,140,#64,#PRCNTR
BYT 'NONE',CR,0
;
^0 JSR ANYKEY
CATDONE2 JMP DISKLOOP
;
CATCOUNT = CATDONE+1
;
; Input file name
;
INPUTNAM LDA #0
STA FILENAME
JSR INPUT
ADR FILENAME
BYT MAXFLEN
ADR 27
BYT 140
RTS
;
; Filename that user enters
;
FILENAME DFS MAXFLEN+1,0
;-----------
;
; DOS commands:
; 0=VERIFY
; 2=BLOAD
; 4=BSAVE
; 6=DELETE
;
DOSCOMM LDA DOSCOMM2,X
STA TMPLO
LDA DOSCOMM2+1,X
STA TMPHI
LDY #0
^0 LDA (TMPLO),Y
BEQ >1
JSR COUT
INY
BNE <0
^1 RTS
;
DOSCOMM2 ADR >0
ADR >1
ADR >2
ADR >3
;
^0 BYT 13,4,'VERIFY',0
^1 BYT 13,4,'BLOAD',0
^2 BYT 13,4,'BSAVE',0
^3 BYT 13,4,'DEL',0
;-----------
;
; JSR BLOAD
; BYT 'FILENAME',0
;
VERIFY LDX #0
HEX 2C
BLOAD LDX #2
HEX 2C
BSAVE LDX #4
HEX 2C
DELETE LDX #6
;
STX TMPLO
JSR GETINIT
LDA #1
CHK4MOD = *-1
JSR CHK4DISK
BCS >2
LDX TMPLO
JSR DOSCOMM
;
^1 JSR GETBYTE
BEQ DOSCR
JSR COUT
JMP <1
;
^2 JSR GETBYTE
BNE <2
LDA #8
RTS
;
; DOS stuff for TYPE file
;
VERIFYTY LDX #0
HEX 2C
BLOADTY LDX #2
HEX 2C
BSAVETY LDX #4
HEX 2C
DELETETY LDX #6
STX TMP0
JSR DOSCOMM
;
; Print the filename with prefix
;
PRINFILE LDY #0
^0 LDA FLPREFIX,Y
BEQ >1
JSR COUT
INY
BNE <0
;
^1 LDY #0
^2 LDA FILENAME,Y
BEQ >3
JSR COUT
INY
BNE <2
;
; Print params:
;
^3 LDA TMP0
BEQ >0
CMP #6
BEQ >0
;
LDA #'A'
LDX FLSTART
LDY FLSTART+1
JSR >1
LDA TMP0
CMP #2
BEQ >0
;
LDA #'L'
LDX FLLENGTH
LDY FLLENGTH+1
JSR >1
^0 JMP DOSCR
;
^1 PHA
LDA #','
JSR COUT
PLA
JSR COUT
LDA #'$'
JSR COUT
JMP $F940
;
DOSCR LDX #$4C
LDY #DOSERROR
LDA /DOSERROR
STX $A6D8
STY $A6D9
STA $A6DA
TSX
STX DOSERROR+1
JSR CROUT
LDA #0
RTS
;
; ERROR! fix stack pointer,
; close file, reset I/O hooks
;
DOSERROR LDX #00
TXS
JSR $A316
JSR $3EA
LDA $AA5C
RTS
;
; Error handling subroutine
;
ERROR STA >2+1
JSR CLS1
JSR MUSIC
JSR PRINT
.DA #PRLOC,140,#64,#0
LDX #$FD
^1 INX
INX
INX
LDA ERRORADR,X
BEQ >3
^2 CMP #00
BNE <1
;
^3 LDA ERRORADR+1,X
STA TMPLO
LDA ERRORADR+2,X
STA TMPHI
JMP (TMPLO)
;
ERRORADR .DA #4,ERROR4
.DA #6,ERROR6
.DA #9,ERROR9
.DA #10,ERROR10
.DA #99,ERROR99
.DA #0,ERROR8
;
NOPROT LDA #0
HEX 2C
PROT LDA #2
STA $B00D
RTS
;
ERROR4 JSR PRINT
BYT PRCNTR
.DA #PRSTR,TXTD
BYT ' IS WRITE PROTECTED',CR,0
JMP ANYKEY
;
ERROR6 JSR PRINT
.DA #PRLOC,140,#48
BYT PRCNTR
BYT 'CANNOT FIND',CR,CR
.DA #PRSTR,FILENAME,#CR,#CR
BYT 'ON THIS'
.DA #PRSTR,TXTSD,#CR,#0
JMP ANYKEY
;
ERROR8 JSR PRINT
BYT PRCNTR
.DA #PRSTR,TXTD
BYT ' ERROR OCCURRED',CR,0
JMP ANYKEY
;
ERROR9 JSR PRINT
BYT PRCNTR
.DA #PRSTR,TXTD
BYT ' IS FULL',CR,0
JMP ANYKEY
;
ERROR10 JSR PRINT
BYT PRCNTR
BYT 'FILE IS LOCKED',CR,0
JMP ANYKEY
;
ERROR99 JSR PRINT
BYT PRCNTR
.DA #PRLOC,140,#56
BYT 'WARNING:',CR,CR,CR
BYT 'THE OLD CONTENTS OF',CR,CR
.DA #PRSTR,FILENAME,#CR,#CR
BYT 'WILL BE LOST WHEN',CR
BYT 'THIS FILE IS SAVED',CR
BYT PRVTAB,167
.DA #PRSTR,TXTPRET
BYT ' TO SAVE',CR
BYT 'OR',CR,0
JMP GETKEY
;-----------
;
; Read CATALOG routine
;
; JSR CATINIT to initialize
;
; JSR CATFILE to get a filename
;
; SEC=disk error
;
; CLC=no disk error:
; BNE=no more files
; BEQ=file found:
; A=lo byte\
; Y=hi byte--address of text
;
CATINIT LDA DATADRIV
JSR CHK4DISK
BCS CATEND2
LDA #0
STA TMP2
LDY #17
JMP READSECT
;
CATEND LDX #$FF
CLC
CATEND2 RTS
;
CATFILE LDA TMPLO
CLC
ADC #$23
STA TMPLO
BCC >0
INC TMPHI
^0 DEC TMP2
BPL >1
;
LDY SECTBUFF+1
LDA SECTBUFF+2
BEQ CATEND
JSR READSECT
BCS CATEND2
LDY #SECTBUFF-24
LDA /SECTBUFF-24
STY TMPLO
STA TMPHI
LDA #7
STA TMP2
BNE CATFILE
;
; Check filename
;
; Deleted? end of cat?
;
^1 LDY #0
LDA (TMPLO),Y
BMI CATFILE
BEQ CATEND
;
; Binary file?
;
LDY #2
LDA (TMPLO),Y
AND #$7F
CMP #4
BNE CATFILE
;
; Correct length?
;
LDA TYPELEN
BEQ >2
LDY #$21
LDA (TMPLO),Y
;
; Accept 33 or 34 for hires pictures
;
CMP #33
BNE *+4
LDA #34
CMP TYPELEN
BNE CATFILE
;
^2 LDY #2
LDX #$FF
^3 INX
INY
LDA FLPREFIX,X
BEQ >4
ORA #$80
CMP (TMPLO),Y
BEQ <3
BNE CATFILE
;
^4 STY CATFILE2+1
;
LDY #$20
^5 LDA (TMPLO),Y
EOR #$A0
BNE >6
STA (TMPLO),Y
DEY
BPL <5
;
^6 LDA (TMPLO),Y
AND #$7F
STA (TMPLO),Y
DEY
BNE <6
;
LDA TMPLO
LDY TMPHI
CLC
CATFILE2 ADC #8
BCC >7
INY
^7 CLC
LDX #0
RTS
;-----------
IOB = $B7E8
;
; Read a sector
; A=sector, Y=track
; X=command
;
READSECT LDX #1
STA IOB+5
LDA DATADRIV
STA IOB+2
READSCT2 STY IOB+4
LDA #0
STA IOB+3
LDY #SECTBUFF
LDA /SECTBUFF
STY IOB+8
STA IOB+9
STX IOB+12
JSR $3E3
JMP $3D9
;-----------
;
; Position head over track 17
; and check for a disk.
;
CHK4DISK STA $AA68
STA IOB+2
;
LDY $BD00
CPY #$4C
CLC
BEQ >3
CMP #1
BEQ >0
;
; If drive 2, then if first time,
; read data. If error, then recal
; and try again.
;
LDX IOB+1
JSR $BE8E
LDA $4F8,Y
BPL >0
LDA #18*2
STA $4F8,Y
JSR >0
BCC >3
JSR $BE8E
LDA #$A0
STA $4F8,Y
;
^0 LDY #17
LDX #0
JSR READSCT2
LDX IOB+1
LDA $C089,X
LDA #32
STA TMP0
;
^1 JSR $B944
BCC >2
DEC TMP0
BNE <1
^2 LDA $C088,X
^3 RTS
;-----------
;
; Wait for user to insert the
; Print Shop, Companion,
; or data disk.
;
WAITTBL1 BYT PSTEXT
BYT CTEXT
WAITTBL2 HBY PSTEXT
HBY CTEXT
WAITTBL3 BYT 1,3
;---
;
; Wait for PS disk
;
WAITPSD LDX #0
TXA
HEX 2C
;---
;
; Wait for Comp disk, side given
; in A: 0=either side
; 1=side A
; 2=side B
;
WAITCD LDX #1
;
WAITDISK STA WAITSIDE
TAY
BEQ >0
ORA #'@'
STA TXTSIDE+6
LDY #' '
^0 STY TXTSIDE
;
LDA WAITTBL1,X
STA WAITANY1+1
LDA WAITTBL2,X
STA WAITANY1+2
LDA WAITTBL3,X
STA >2+1
;
JSR PROT
BCS >4
;
^1 LDA #1
JSR READVTOC
BCS >3
^2 CMP #00
BNE >3
;
; Is a specific side requested?
;
LDA #00
WAITSIDE = *-1
BEQ WAITNOPE
CMP SECTBUFF+$FE
BNE >3
WAITNOPE CLC
RTS
;
^3 JSR MUSIC
^4 JSR CLS3
LDY #' '
LDA DATADRIV
LSR
BEQ *+4
LDY #'1'
STY >5+9
JSR PRINT
BYT PRCNTR
.DA #PRLOC,140,#80
BYT 'PLEASE PLACE'
.DA #PRSTR,TXTSIDE
BYT CR
BYT 'THE "'
WAITANY1 .DA #PRSTR,$FFFF
BYT '"'
.DA #PRSTR,TXTSD,#CR
^5 BYT 'IN DRIVE 1',CR,0
JSR ANYKEY
PHA
JSR CLS3
PLA
CMP #ESC
BNE <1
^9 RTS
;
TXTSIDE BYT ' SIDE A OF',0
;-----------
;
; Enter with A=drive parm
;
; Read in VTOC sector
; Return with A=ID byte for that
; disk. 1:Print Shop side 1
; 3:Companion disk
;
; SEC:error
;
READVTOC JSR CHK4DISK
BCS >0
LDX #1
LDY #17
LDA #0
STA IOB+5
JSR READSCT2
^0 LDA SECTBUFF+$FF
RTS
;-----------
;
; Display message if printer
; SETUP was never run.
;
CHKPRINT STA >1+0
LDA $95F7
BEQ >0
CLC
RTS
;
^0 JSR MUSIC
JSR PRINT
BYT PRCNTR,PRCSPACE,1
BYT '"SETUP" WAS NEVER RUN '
^1 BYT '- '
.DA #PRSTR,TXTPAK,#CR
BRK
JSR GETKEY
SEC
RTS
;-----------
;
; Check to see if the SUPP file
; is on the disk.
;
SAVESUPP LDA MENULAST
EOR #CALENDAR
BEQ >9
LDA DATADRIV
STA CHK4MOD
JSR VERIFY
BYT '[CD]',0
BEQ >9
JSR SWAP6300
JSR BSAVE
BYT '[CD],A$6300,L$800',0
PHA
JSR SWAP6300
PLA
^9 PHA
LDA #1
STA CHK4MOD
PLA
RTS
;
SWAP6300 LDX #8
LDY #0
LDA #$63
STY TMP0
STA TMP1
LDA #$10
STY TMP2
STA TMP3
^0 LDA (TMP0),Y
PHA
LDA (TMP2),Y
STA (TMP0),Y
PLA
STA (TMP2),Y
INY
BNE <0
INC TMP1
INC TMP3
DEX
BNE <0
RTS
;-----------
;
;
;
ICL "S:SUBPAK3"