mirror of
https://github.com/antoinevignau/source.git
synced 2025-01-04 04:31:04 +00:00
1 line
144 KiB
NASM
Executable File
1 line
144 KiB
NASM
Executable File
* high level
|
|
|
|
|
|
* NOTE: All vector entries (PrOpenPage, etc...) get their data bank passed in A.
|
|
* This means that they can phd, tcd correctly. Be careful what you do
|
|
* at the beginning of one of these routines! ÑÑMSL
|
|
|
|
|
|
; DynamicExits
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; Dynamic Exits
|
|
;
|
|
;
|
|
; Each dynamic exit takes 2 RTS and moves them some number of bytes up the
|
|
; stack.
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;-----------------------------------------------------------------------------
|
|
|
|
DynamicExits PROC EXPORT
|
|
EXPORT exit20
|
|
exit20
|
|
tax
|
|
lda 5,s
|
|
sta 25,s
|
|
lda 3,s
|
|
sta 23,s
|
|
lda 1,s
|
|
sta 21,s
|
|
tsc
|
|
clc
|
|
adc #20
|
|
tcs
|
|
txa
|
|
brl exit0
|
|
|
|
EXPORT Exit16
|
|
Exit16
|
|
tax
|
|
lda 5,s
|
|
sta 21,s
|
|
lda 3,s
|
|
sta 19,s
|
|
lda 1,s
|
|
sta 17,s
|
|
tsc
|
|
clc
|
|
adc #16
|
|
tcs
|
|
txa
|
|
brl Exit0
|
|
|
|
EXPORT Exit14
|
|
Exit14
|
|
tax
|
|
lda 5,s
|
|
sta 19,s
|
|
lda 3,s
|
|
sta 17,s
|
|
lda 1,s
|
|
sta 15,s
|
|
tsc
|
|
clc
|
|
adc #14
|
|
tcs
|
|
txa
|
|
brl Exit0
|
|
|
|
EXPORT Exit12
|
|
Exit12
|
|
tax
|
|
lda 5,s
|
|
sta 17,s
|
|
lda 3,s
|
|
sta 15,s
|
|
lda 1,s
|
|
sta 13,s
|
|
tsc
|
|
clc
|
|
adc #12
|
|
tcs
|
|
txa
|
|
bra Exit0
|
|
|
|
|
|
|
|
EXPORT Exit10
|
|
Exit10
|
|
tax
|
|
lda 5,s
|
|
sta 15,s
|
|
lda 3,s
|
|
sta 13,s
|
|
lda 1,s
|
|
sta 11,s
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
txa
|
|
brl exit0
|
|
|
|
|
|
EXPORT Exit8
|
|
Exit8
|
|
tax
|
|
lda 5,s
|
|
sta 13,s
|
|
lda 3,s
|
|
sta 11,s
|
|
lda 1,s
|
|
sta 9,s
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
txa
|
|
brl Exit0
|
|
|
|
|
|
|
|
EXPORT Exit6
|
|
Exit6
|
|
tax
|
|
lda 5,s
|
|
sta 11,s
|
|
lda 3,s
|
|
sta 9,s
|
|
lda 1,s
|
|
sta 7,s
|
|
pla
|
|
pla
|
|
pla
|
|
txa
|
|
brl Exit0
|
|
|
|
|
|
EXPORT Exit4
|
|
Exit4
|
|
tax
|
|
lda 5,s
|
|
sta 9,s
|
|
lda 3,s
|
|
sta 7,s
|
|
lda 1,s
|
|
sta 5,s
|
|
pla
|
|
pla
|
|
txa
|
|
brl Exit0
|
|
|
|
|
|
EXPORT Exit2
|
|
Exit2
|
|
tax
|
|
lda 5,s
|
|
sta 7,s
|
|
lda 3,s
|
|
sta 5,s
|
|
lda 1,s
|
|
sta 3,s
|
|
pla
|
|
txa
|
|
|
|
|
|
|
|
EXPORT Exit0
|
|
Exit0
|
|
cmp #1
|
|
rtl
|
|
|
|
|
|
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; PortOffset
|
|
;
|
|
; This is the offset to fields in the grafport.
|
|
;
|
|
DSECT 0
|
|
o_PortSCB WORD
|
|
o_ImageRef LONG
|
|
o_Width WORD
|
|
o_BoundsRect BLOCK 8
|
|
|
|
o_PortRect BLOCK 8
|
|
o_ClipRgn LONG
|
|
o_VisRgn LONG
|
|
|
|
o_BkPat BLOCK 32
|
|
|
|
o_PnLoc BLOCK 4
|
|
o_PnSize BLOCK 4
|
|
o_PnMode WORD
|
|
o_PnPat BLOCK 32
|
|
o_PnMask BLOCK 8
|
|
o_PnVis WORD
|
|
|
|
EXPORT o_FontID
|
|
EXPORT o_ChExtra
|
|
|
|
o_Font LONG
|
|
o_FontID LONG
|
|
o_FontFlags WORD
|
|
o_TxSize WORD
|
|
o_TxFace WORD
|
|
o_TxMode WORD
|
|
o_SpExtra LONG
|
|
o_ChExtra LONG
|
|
o_FGColor WORD
|
|
o_BGColor WORD
|
|
|
|
o_PicSave LONG
|
|
o_RgnSave LONG
|
|
o_PolySave LONG
|
|
o_GrafProcs LONG
|
|
|
|
o_ArcRot WORD
|
|
|
|
o_UserField LONG
|
|
o_SysField LONG
|
|
|
|
PortSize DSectSize
|
|
|
|
|
|
; ZP Equates
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; Global and Zero Page Equates
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
|
|
Temp1 equ 0 Temp values to dereference easily
|
|
Temp2 equ temp1+4 4
|
|
hPicList equ temp2+4 a
|
|
pPicList equ hPicList+4 e
|
|
Ourport equ pPicList+4 12
|
|
hOurport equ OurPort+2 14
|
|
hNewPic equ hOurport+4 18
|
|
ourStatus equ hNewPic+4 1c
|
|
hStatus equ ourStatus+2 1e
|
|
hport equ hStatus+4 22
|
|
UserId equ hPort+4 26
|
|
hscreenport equ userId+2 28
|
|
pscreenport equ hscreenport+4 2c
|
|
hprbuf equ pscreenport+4 30
|
|
pprbuf equ hprbuf+4 34
|
|
bandheight equ pprbuf+4 38
|
|
OldGraphProcs equ bandheight+2 3A
|
|
|
|
PZ_PrStatus equ $C0
|
|
PZ_pPrPort equ PZ_PrStatus+4
|
|
PZ_hPrint equ PZ_pPrPort+4
|
|
|
|
TPrintsize equ 140
|
|
StatRecSize equ 28
|
|
|
|
oPrintDefault equ 0*5
|
|
oPrValidate equ 1*5
|
|
oPrStlDialog equ 2*5
|
|
oPrJobDialog equ 3*5
|
|
oPrDrvrVer equ 4*5
|
|
oPrOpenDoc equ 5*5
|
|
oPrCloseDoc equ 6*5
|
|
oPrOpenPage equ 7*5
|
|
oPrClosePage equ 8*5
|
|
oPrPicfile equ 9*5
|
|
oPrControl equ 10*5
|
|
oPrError equ 11*5
|
|
oPrSetError equ 12*5
|
|
oPrChanged equ 13*5
|
|
oPrPixelMap equ 14*5
|
|
|
|
* Error Codes
|
|
|
|
noErr equ 0
|
|
iIOAbort equ -27
|
|
iMemFullErr equ -108
|
|
iPrAbort equ 128
|
|
|
|
|
|
|
|
|
|
; PrtRecord.equ
|
|
|
|
|
|
*****************************
|
|
* *
|
|
* PrtRecordEqu *
|
|
* *
|
|
* Current Rev: Nov. 1987 *
|
|
* *
|
|
*****************************
|
|
|
|
Top equ 0
|
|
Left equ 2
|
|
Bottom equ 4
|
|
Right equ 6
|
|
|
|
|
|
* offset for the TPrint record length = 140 bytes
|
|
|
|
iPrVersion equ 0 Integer Printing manager version number
|
|
prInfo equ 2 subrecord Printer Info Subrecord
|
|
rPaper equ 16 Rect
|
|
prStl equ 24 SubRecord
|
|
prInfoPT equ 42 SubRecord
|
|
prXInfo equ 56 SubRecord
|
|
prJob equ 80 SubRecord
|
|
printx equ 100 Array[1..19] of integer (38 bytes)
|
|
|
|
* prInfo subrecord length = 14 bytes
|
|
|
|
idev equ 0 Integer
|
|
iVRes equ 2 Integer
|
|
iHRes equ 4 Integer
|
|
rPage equ 6 Rect
|
|
|
|
* iDev values
|
|
|
|
bDevCitoh equ 1 image writer
|
|
bDevLaser equ 3 Laser writer
|
|
|
|
* TPrJob subrecord length = 20 bytes
|
|
|
|
iFstPage equ 0 Integer
|
|
iLstPage equ 2 Integer
|
|
iCopies equ 4 Integer
|
|
bjDocLoop equ 6 Signed byte
|
|
fFromUsr equ 7 signed byte
|
|
pIdleProc equ 8 Long address
|
|
pFileName equ 12 Long address
|
|
iFileVol equ 16 Integer ??? Unit number ???
|
|
bFileVers equ 18 signed byte
|
|
bJobX equ 19 signed byte internal
|
|
|
|
* bjDocLoop values
|
|
|
|
bDraftLoop equ 0
|
|
bSpoolLoop equ 128
|
|
|
|
* TPrStl subrecord info length = 18 bytes
|
|
|
|
wDev equ 0 Integer
|
|
iPageV equ 2 nombres de points par page
|
|
iPageH equ 4
|
|
bPort equ 6 Refnum
|
|
feed equ 8
|
|
PaperType equ 10
|
|
CRwidth equ 12
|
|
|
|
* valeur du feed
|
|
feedcut equ 0
|
|
feedfanFold equ 1
|
|
|
|
* values linked to wDev
|
|
f0 equ 1 hires
|
|
f1 equ 2 portrait
|
|
f2 equ 4 double vertical density
|
|
f3 equ 8 2x zoom
|
|
f4 equ 16 scroll
|
|
f5 equ 32 color/bw
|
|
f6 equ 64 Gap
|
|
f7 equ 128 Darker
|
|
|
|
* TprXInfo subrecord info length = 24 bytes
|
|
|
|
iRowBytes equ 0 Integer
|
|
iBandV equ 2 Integer
|
|
iBandH equ 4 Integer
|
|
iDevBytes equ 6 Integer
|
|
ibands equ 8 Integer
|
|
|
|
bPatScale equ 10 byte
|
|
bULThick equ 11 byte
|
|
bULOffset equ 12 byte
|
|
bULShadow equ 13 byte
|
|
scan equ 14 tscan
|
|
bXInfoX equ 16 reserved
|
|
SCBList equ 18 pointer to a list of modes.
|
|
|
|
scanTB equ 0
|
|
scanBT equ 1
|
|
scanLR equ 2
|
|
scanRL equ 3
|
|
|
|
* TPrStatus record length = 28 bytes
|
|
|
|
iTotPages equ 0
|
|
iCurpage equ 2
|
|
iTotCopies equ 4
|
|
iCurCopy equ 6
|
|
iTotBands equ 8
|
|
iCurBand equ 10
|
|
fPgDirty equ 12
|
|
fImaging equ 14
|
|
ShPrint equ 16
|
|
pPrPort equ 20
|
|
hPic equ 24
|
|
|
|
|
|
|
|
; PrtRecord.Dflt ;Default print record
|
|
|
|
*****************************
|
|
* *
|
|
* PrtRecordDflt *
|
|
* *
|
|
* Current Rev: Nov 1987 *
|
|
* *
|
|
*****************************
|
|
|
|
|
|
PrtRecordDflt PROC EXPORT
|
|
|
|
Export hPrint_test
|
|
hPrint_test DC.L pPrint_test
|
|
Export pPrint_test
|
|
pPrint_test DC.L Print_test
|
|
|
|
EXPORT PRINT_TEST
|
|
Print_test
|
|
|
|
* offset for the TPrint record length = 140 bytes
|
|
|
|
DC.B $02,$02 *iPrVersion equ 0
|
|
|
|
*prInfo equ 2 subrecord Printer Info Subrecord
|
|
* prInfo subrecord length = 14 bytes
|
|
DC.W 1 *idev equ 0
|
|
DC.W 72 *iVRes equ 2
|
|
DC.W 80 *iHRes equ 4
|
|
DC.W 0,0,396,640 *rPage $$$$$ equ 6
|
|
DC.W -36,-20,752,660 *rPaper equ 16
|
|
|
|
|
|
* *prStl equ 24 SubRecord
|
|
|
|
|
|
* TPrStl subrecord info length = 18 bytes
|
|
;
|
|
; wDev is set initially to be normal quality, portrait, normal vertical
|
|
; density, no reduction, B/W, and with gap.
|
|
;
|
|
DC.W f1+f2+f3+f6 wDev equ 0
|
|
DC.W 1320 iPageV equ 2
|
|
DC.W 1020 iPageH equ 4
|
|
DC.W 0 bPort equ 6
|
|
DC.W 1 feed equ 8
|
|
DC.W 0 PaperType equ 10
|
|
DC.W 960 CRwidth equ 12
|
|
DC.W 0 reserved
|
|
DC.W 0
|
|
|
|
*prInfoPT equ 42 SubRecord
|
|
DC.W 0 *idev equ 0
|
|
DC.W 72 *iVRes equ 2
|
|
DC.W 80 *iHRes equ 4
|
|
DC.W 0,0,396,640 *rPage equ 6
|
|
|
|
|
|
*prXInfo equ 56 SubRecord
|
|
|
|
DC.W 80 iRowBytes equ 0
|
|
DC.W 32 iBandV equ 2
|
|
DC.W 640 iBandH equ 4
|
|
DC.W 10240 iDevBytes equ 6
|
|
DC.W 12 ibands equ 8
|
|
DC.B 0 bPatScale equ 10
|
|
DC.B 1 bULThick equ 11
|
|
DC.B 1 bULOffset equ 12
|
|
DC.B 1 bULShadow equ 13
|
|
DC.B 0 scan equ 14
|
|
DC.B 0 bXInfoX equ 16
|
|
DCB.B 8,0 reserved
|
|
|
|
|
|
*prJob equ 80 SubRecord
|
|
* TPrJob subrecord length = 20 bytes
|
|
|
|
DC.W 1 iFstPage equ 0
|
|
DC.W 9999 iLstPage equ 2
|
|
DC.W 1 iCopies equ 4
|
|
DC.B $80 bjDocLoop equ 6
|
|
DC.B 1 fFromUsr equ 7
|
|
DC.L 0 pIdleProc equ 8
|
|
DC.L 0 pFileName equ 12
|
|
DC.W 0 iFileVol equ 16
|
|
DC.B 0 bFileVers equ 18
|
|
DC.B 0 bJobX equ 19
|
|
|
|
|
|
|
|
*printx equ 100 Array[1..19] of integer (38 bytes)
|
|
|
|
DC.W 0 plus two reserved bytes
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
DC.W 0
|
|
|
|
*TPrintsize equ 140
|
|
|
|
Export Gap
|
|
Gap DC.W 0
|
|
DC.W 60
|
|
|
|
Export Vres
|
|
Vres DC.W 36
|
|
DC.W 72
|
|
|
|
Export Hres
|
|
Hres DC.W 40
|
|
DC.W 80
|
|
|
|
Export PaperVsize
|
|
PaperVsize DC.W 1320
|
|
DC.W 1680
|
|
DC.W 1400
|
|
DC.W 1440
|
|
|
|
Export PaperHsize
|
|
PaperHsize DC.W 1020
|
|
DC.W 1020
|
|
DC.W 990
|
|
DC.W 990
|
|
|
|
Export CarriageWidth
|
|
CarriageWidth DC.W 960
|
|
DC.W 960
|
|
DC.W 960
|
|
DC.W 960
|
|
|
|
* US Letter/640 portrait gap: 36 80 0 0 378 640 -9 -20 387 660
|
|
* US Letter/640 landscape gap: 40 72 0 0 320 756 -10 -18 330 774
|
|
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
; Maindata
|
|
|
|
*****************************
|
|
* *
|
|
* MainData *
|
|
* *
|
|
* Current Rev: Nov. 1987 *
|
|
* *
|
|
*****************************
|
|
MainData PROC EXPORT
|
|
|
|
Export EndTime,DrawTime,PortTime,TmpTime,StartTime
|
|
StartTime DS.B 4
|
|
EndTime DS.B 4
|
|
DrawTime DS.B 4
|
|
PortTime DS.B 4
|
|
TmpTime DS.B 4
|
|
|
|
|
|
|
|
|
|
|
|
Export ZeroPage
|
|
ZeroPage DS.B 2
|
|
Export iPrErr
|
|
iPrErr DS.B 2
|
|
Export iPageNum
|
|
iPageNum DS.B 2
|
|
Export PicListCount
|
|
PicListCount DS.B 2 ; count of pages used in piclist
|
|
Export iDocPage
|
|
iDocPage DS.B 2
|
|
Export Method
|
|
Method DS.B 2
|
|
Export hPrint
|
|
hprint DS.B 140 TPrintsize
|
|
Export rBand
|
|
rBand DS.B 8 rect
|
|
Export LinesLeftOnPage
|
|
LinesLeftOnPage DS.B 2 ; # of lines left to be printed
|
|
Export LinesPerPage
|
|
LinesPerPage DS.B 2 ; total # of lines on each page
|
|
Export resolution
|
|
resolution DS.B 2
|
|
Export MainUserID
|
|
MainUserID DS.B 2
|
|
Export BandPort
|
|
BandPort DS.B portsize
|
|
Export ScreenPort
|
|
ScreenPort DS.B portsize
|
|
Export OurStatusRecord
|
|
OurStatusRecord DS.B StatRecSize
|
|
;
|
|
; flag to indicated if status or progress messages can be displayed, set to
|
|
; false by PrPixelMap since it doesn't put up a window
|
|
;
|
|
EXPORT NoShowMessage
|
|
NoShowMessage DS.B 2
|
|
|
|
EXPORT PStatus
|
|
PStatus DS.B 2 ; printer status: 0 = OK
|
|
|
|
EXPORT CursorAd
|
|
CursorAd DS.B 4
|
|
|
|
Export BandLoc
|
|
BandLoc DS.B 20
|
|
|
|
Export RectSize1
|
|
RectSize1 DC.W 0,0,$10,$10
|
|
Export RectSize2
|
|
RectSize2 DC.W 0,0,$20,$20
|
|
|
|
Export SizingRect
|
|
SizingRect DS.B 8
|
|
|
|
Export hugeRect
|
|
hugeRect DC.W 0,0,16382,16382
|
|
* you'd better not to be outside this hugeRect !!!
|
|
|
|
Export PPParms
|
|
PPParms DC.L BandPort
|
|
DC.L ScreenPort
|
|
DC.L BandLoc+8
|
|
DC.L destpoint
|
|
DC.W 0 ; PenCopy
|
|
DC.W 0 ; maskhandle
|
|
DC.W 0
|
|
|
|
Export destpoint
|
|
destpoint DC.W 0,0,32,320 home
|
|
|
|
|
|
Export Pt1
|
|
Pt1 DC.W 20,25
|
|
Export Pt2
|
|
Pt2 DC.W 110,60
|
|
Export Pt3
|
|
Pt3 DC.W 5,210
|
|
|
|
if LQ=1 goto .notimagewriter
|
|
EXPORT Printer_name
|
|
Printer_name str '='
|
|
str 'ImageWriter'
|
|
str '*'
|
|
goto .notlq
|
|
|
|
.notimagewriter
|
|
|
|
EXPORT Printer_name
|
|
Printer_name str '='
|
|
str 'LQ'
|
|
str '*'
|
|
.notlq
|
|
|
|
Export TESTRECT
|
|
TESTRECT DC.W 15,20,100,200
|
|
|
|
Export white
|
|
white DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
DC.W $ffff
|
|
|
|
|
|
Export gris
|
|
gris DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
DC.W $8888
|
|
|
|
Export DeadLoc2
|
|
DeadLoc2 DS.B 32
|
|
|
|
Export LLD_PaperRect
|
|
LLD_PaperRect DS.B 8
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; ErrorCalls.ASM ;_PrError, _PrSetError
|
|
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
;
|
|
; NAME: PrError
|
|
;
|
|
; PURPOSE: High level printer routine "_PrError" which returns last error
|
|
; that has occured (iPrErr).
|
|
;
|
|
; PASSED: (None)
|
|
;
|
|
; RETURNED: LastError WORD, last error that occured.
|
|
;
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
|
|
PrError PROC EXPORT
|
|
|
|
DefineStack
|
|
* iPrErr
|
|
* parameters
|
|
* error value
|
|
|
|
Error_DPage word 0
|
|
Error_BReg byte 0
|
|
Error_rtl1 block 3
|
|
Error_rtl2 block 3
|
|
Error_Value word 0
|
|
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
lda iPrErr ;get the error value
|
|
sta Error_Value,s ;return it on the stack
|
|
lda #0
|
|
plb
|
|
pld
|
|
jmp exit0
|
|
|
|
EJECT
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
;
|
|
; NAME: PrSetError
|
|
;
|
|
; PURPOSE: High level printer routine "_PrSetError" which sets the error
|
|
; value (iPrErr).
|
|
;
|
|
; PASSED: ErrorNumber WORD, error number to be saved.
|
|
;
|
|
; RETURNED: (NONE)
|
|
;
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
|
|
EXPORT PrSetError
|
|
PrSetError
|
|
* parameters
|
|
* error value
|
|
|
|
DefineStack
|
|
SetError_DPage word 0
|
|
SetError_BReg byte 0
|
|
SetError_rtl1 block 3
|
|
SetError_rtl2 block 3
|
|
SetError_value word 0
|
|
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
lda SetError_value,s ;get the passed error value
|
|
sta iPrErr ;save it at iPrErr
|
|
|
|
cmp #$0080
|
|
bne NoCancel
|
|
|
|
lda DraftFlag
|
|
beq NoCancel
|
|
|
|
pea 0
|
|
pea 0
|
|
_SetGrafProcs
|
|
|
|
stz DraftFlag
|
|
|
|
NoCancel lda #0
|
|
plb
|
|
pld
|
|
jmp exit2
|
|
|
|
|
|
|
|
|
|
ENDP
|
|
|
|
|
|
EJECT
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
;
|
|
; NAME: PrChanged
|
|
;
|
|
; PURPOSE: This routine calls the port driver with the name and type
|
|
; of this printer (IMAGEWRITER).
|
|
;
|
|
; PASSED: <None>
|
|
;
|
|
; RETURNED: (NONE)
|
|
;
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
PrChanged PROC EXPORT
|
|
|
|
phd
|
|
phb
|
|
phk
|
|
plb
|
|
tcd
|
|
PushPtr Printer_Name
|
|
_PrDevPrChanged
|
|
plb
|
|
pld
|
|
jmp exit0
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
; DraftProcs
|
|
|
|
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
;** **
|
|
;** **
|
|
;** I M M E D I A T E M O D E P R O C S. **
|
|
;** **
|
|
;** **
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
|
|
Draftprocs PROC EXPORT
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; Standard Pixel Procedure (Prints Pixel Maps)
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
EXPORT Pixel
|
|
Pixel
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; QuickDraw II's zeropage equates
|
|
;
|
|
|
|
QdPort equ $24
|
|
SrcPixelMapRef equ $CE ; ptr to src pixel map
|
|
SrcWidth equ $D2 ; width of src pixel map
|
|
SrcBounds equ $D4 ; bounds rect of src pixel map
|
|
SrcRect equ $DC
|
|
DestRect equ $1C
|
|
|
|
DrawVerb equ $38
|
|
TextPtr equ $da
|
|
textLength equ $d8
|
|
chartodraw equ $d6
|
|
|
|
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
lda iPrErr
|
|
beq Continue
|
|
exitnow brl ExitPixel
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; Gets information about the source pixel map from QD's zero page.
|
|
;
|
|
|
|
Continue ;
|
|
|
|
lda [QdPort] ; SCB
|
|
sta pixelLoc
|
|
lda srcPixelMapRef ; pointer to the pixel map
|
|
sta pixelLoc+2
|
|
lda srcPixelMapRef+2
|
|
sta pixelLoc+4
|
|
|
|
lda SrcWidth ; width of pixel map
|
|
sta pixelLoc+6
|
|
|
|
ldx #6 ; bounds rect
|
|
moveBounds lda srcBounds,x
|
|
sta PixelLoc+8,x
|
|
dex
|
|
dex
|
|
bpl moveBounds
|
|
|
|
PushWord #0 ; Result
|
|
PushWord #0 ; bank address of zero page
|
|
tdc ; transfer direct page into acc
|
|
clc
|
|
adc #srcBounds ; get actual address of srcBounds
|
|
pha
|
|
PushWord #0 ; bank address of zero page
|
|
tdc ; transfer direct page into acc
|
|
clc
|
|
adc #srcRect ; get actual address of srcRect
|
|
pha
|
|
PushLong #PixelRect ; intersected rect goes here
|
|
_SectRect
|
|
pla
|
|
beq ExitPixel ; if false, no intersection
|
|
|
|
;---------------------------------------------------------------
|
|
;
|
|
; Look at the source rect. If its upper/left corner is 0,0
|
|
; then no adjustment is necessary. If it is not 0,0, we must
|
|
; adjust the pointer to the pixel map so that it points to
|
|
; the first pixel in the source rect.
|
|
;
|
|
; Note that this scheme does not work with source rects that
|
|
; do not have the first pixel to draw as the first pixel in
|
|
; a byte.
|
|
;
|
|
lda PixelRect
|
|
sec
|
|
sbc PixelLoc+8
|
|
beq NoAdjustmentY
|
|
|
|
pha ; space for result
|
|
pha
|
|
pha ; Top of src rect
|
|
PushWord PixelLoc+6 ; width
|
|
_Multiply
|
|
pla
|
|
clc
|
|
adc PixelLoc+2
|
|
sta PixelLoc+2
|
|
pla
|
|
adc PixelLoc+4
|
|
sta PixelLoc+4
|
|
|
|
NoAdjustmentY ;
|
|
lda PixelRect+2
|
|
sec
|
|
sbc PixelLoc+10
|
|
beq NoAdjustmentX
|
|
|
|
lsr a
|
|
bit PixelLoc-1
|
|
bpl ModeWas320
|
|
lsr a
|
|
ModeWas320 clc
|
|
adc PixelLoc+2
|
|
sta PixelLoc+2
|
|
bcc NoCarryHere
|
|
inc PixelLoc+4
|
|
NoCarryHere ;
|
|
NoAdjustmentX ;
|
|
|
|
lda PixelRect
|
|
sta PixelLoc+8
|
|
lda PixelRect+2
|
|
sta PixelLoc+10
|
|
lda PixelRect+4
|
|
sta PixelLoc+12
|
|
lda PixelRect+6
|
|
sta PixelLoc+14
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Call LLDBitMap using the adjusted (if necessary) values in
|
|
; PixelLoc and PixelRect.
|
|
;
|
|
|
|
pushptr PixelLoc ; source Loc info
|
|
pushptr PixelRect ; source rect
|
|
pushword MainUserID
|
|
lda hprint+prstl+wdev
|
|
and #f7
|
|
jsl LLDBitmap
|
|
|
|
lda #0
|
|
ExitPixel clc
|
|
plb
|
|
rtl
|
|
|
|
PixelLoc DS.B 16 ; changed from 8 to 16 by Suki 6/1/87
|
|
PixelRect DS.B 8
|
|
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; _StdText Procedure (Prints Standard Text)
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
|
|
EXPORT DraftText
|
|
DraftText
|
|
|
|
phb ;save data bank reg. on stack
|
|
phk ;get program bank reg.
|
|
plb ;use as data bank reg.
|
|
|
|
PushPtr PenPos
|
|
_GetPen ;current pen pos. -> PenPos
|
|
|
|
* here we move the printer head to penpos
|
|
asl PenPos
|
|
|
|
lda hPrint+prStl+wdev
|
|
and #f2 ; condensed?
|
|
beq By2Only ; yes, skip the next multiply
|
|
asl PenPos
|
|
* I think PenPos is in 144 th/inch vertically.
|
|
|
|
By2Only PushLong PenPos
|
|
pushword MainUserID
|
|
jsl LLDSetPenPos
|
|
|
|
PushWord #0 ;space for textwidth
|
|
; ;(for call to _TextWidth)
|
|
|
|
lda DrawVerb ;get the DrawVerb
|
|
beq DoCar ;if DrawVerb=0 then DoCar
|
|
|
|
cmp #1
|
|
beq dotext2 ;if DrawVerb=1 then DoText2
|
|
|
|
;
|
|
;We get here if it's a "C" string (DrawVerb=2)
|
|
;
|
|
DoCstring ; ; Cstrings are handled differently
|
|
sep #$20 ; since the string is terminated
|
|
longa off ; by a 0 and no length is kept
|
|
|
|
;Search down through string looking for terminator to calculate length
|
|
ldy #0
|
|
KeepLooking lda [TextPtr],y
|
|
beq TheEnd
|
|
iny
|
|
bra KeepLooking
|
|
TheEnd rep #$20
|
|
longa on
|
|
lda TextPtr+2
|
|
pha ;push the pointer to string
|
|
lda Textptr
|
|
pha
|
|
phy ;push the length of string
|
|
bra common
|
|
|
|
;
|
|
;We get here if it's just one character (DrawVerb=0)
|
|
;
|
|
DoCar ;
|
|
pushword #0
|
|
tdc
|
|
clc
|
|
adc #chartodraw ;calculate addr. of char.
|
|
pha ;push addr. of character
|
|
Pushword #1 ;push length of one char.
|
|
bra common
|
|
|
|
;
|
|
;We get here if it's a string of text (DrawVerb=1)
|
|
;
|
|
DoText2 ;
|
|
lda TextPtr+2
|
|
pha ;push pointer to the string
|
|
lda Textptr
|
|
pha
|
|
lda textLength
|
|
pha ;push the strings length
|
|
|
|
common lda 5,s ; Dup the last 3 words on the
|
|
pha ; stack to be used with TextWidth
|
|
lda 5,s
|
|
pha
|
|
lda 5,s
|
|
pha
|
|
* here we send the text on the printer
|
|
pushword MainUserID
|
|
|
|
;-----------------------------------------------------------------------
|
|
;
|
|
; The stack should look like this at this point:
|
|
; ...
|
|
; 00 (result space) --
|
|
; TextPtr | parameters for TextWidth
|
|
; length --
|
|
; TextPtr --
|
|
; length | parameters for PrText
|
|
; UserID --
|
|
; sp ->
|
|
|
|
jsl LLDText ;print the text
|
|
|
|
_TextWidth ;get the texts width (DH)
|
|
|
|
Pushword #0 ;set (DV)=0
|
|
_move ;move current pen location
|
|
|
|
ExitText lda #0 ;return with no errors
|
|
clc
|
|
plb ;restore data bank
|
|
rtl
|
|
|
|
PenPos DS.B 4
|
|
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
;
|
|
; Metrics ;_PrDefault, _PrValidate, _PrStlDialog
|
|
; ;_PrJobDialog
|
|
|
|
metrics PROC EXPORT
|
|
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
;
|
|
; NAME: PrDefault
|
|
;
|
|
; PURPOSE: High level printer routine "_PrDefault" which fills the fields
|
|
; of the specified print record with default values for this
|
|
; particular printer.
|
|
;
|
|
; PASSED: PrintRecordHandle LONG, Handle to print record.
|
|
;
|
|
; RETURNED: (None)
|
|
;
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
EXPORT PrDefault
|
|
PrDefault
|
|
EXPORT PrintDefault ;alias for PrDefault
|
|
PrintDefault
|
|
* parameters
|
|
* hprint
|
|
DefineStack
|
|
Default_DPage word 0
|
|
Default_BReg byte 0
|
|
Default_rtl1 block 3
|
|
Default_rtl2 block 3
|
|
Default_hprint long 0
|
|
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
sta ZeroPage
|
|
|
|
;See if user passed a valid handle
|
|
lda Default_hPrint,s
|
|
ora Default_hPrint+2,s
|
|
bne notNIL
|
|
;
|
|
;We arrive here if an invalid handle, we must flag as an error
|
|
;
|
|
lda #NoPrintRecord
|
|
bra Exit
|
|
|
|
notNil ;
|
|
* read the handle
|
|
;
|
|
;Copy the default print record "Print_test" to internal hprint buffer
|
|
;
|
|
;
|
|
; Transfer the print record to the internal print record,
|
|
; this is necessary because CiXmetrics expects the print
|
|
; record in hprint
|
|
;
|
|
pushptr Print_test
|
|
pushptr hprint
|
|
pushlong #TPrintsize
|
|
_blockmove
|
|
|
|
jsr CiXmetrics ;set metrics from defaults
|
|
|
|
;
|
|
;Dereference the "PrintRecordHandle" that was passed to Temp1
|
|
;
|
|
lda Default_hPrint,s
|
|
sta temp1
|
|
lda Default_hPrint+2,s
|
|
sta Temp1+2
|
|
|
|
pushlong #hprint ; moves good values into
|
|
pushlong Temp1 ; application's print record
|
|
pushlong #TPrintSize
|
|
_PtrToHand
|
|
bcs Exit ; memory manager error
|
|
|
|
lda #$0000
|
|
exit plb
|
|
pld
|
|
jmp exit4
|
|
|
|
EJECT
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
;
|
|
; NAME: PrValidate
|
|
;
|
|
; PURPOSE: High level printer routine "_PrValidate" which checks the
|
|
; specified print record for compatibility with the printer.
|
|
; If the print record is valid, it returns FALSE, and if it
|
|
; is invalid, it returns TRUE and adjusts the print record
|
|
; values to the defaults.
|
|
;
|
|
; PASSED: PrintRecordHandle LONG, Handle to the print record.
|
|
;
|
|
; RETURNED: ChangeFlag WORD, Boolean.
|
|
;
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
|
|
|
|
EXPORT PrValidate
|
|
PrValidate
|
|
* parameters
|
|
* results
|
|
* hPrint
|
|
|
|
DefineStack
|
|
Validate_DPage word 0 ;Saved D-Page
|
|
Validate_BReg byte 0 ;Saved B-Reg.
|
|
Validate_rtl1 block 3
|
|
Validate_rtl2 block 3
|
|
Validate_hPrint long 0 ;Passed print record handle
|
|
Validate_Result word 0 ;returned changeflag
|
|
|
|
phd ;save the d page reg.
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
lda #False ; assume no change to print
|
|
sta Validate_Result,s ; record at start
|
|
|
|
lda Validate_hPrint,s ; get the handle off the stack
|
|
sta temp1 ; and put into a temp location
|
|
lda Validate_hPrint+2,s
|
|
sta Temp1+2
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Transfer the print record to the internal print record,
|
|
; this is necessary because CiXmetrics expects the print
|
|
; record in hprint
|
|
;
|
|
PushLong Temp1
|
|
PushLong #hprint
|
|
PushLong #TPrintSize
|
|
_HandToPtr
|
|
bcs ErrorExit ; memory manager error
|
|
|
|
;-----------------------------------------------------------------
|
|
;
|
|
; Test if correct printer type ( 1 = imagewriter 3 = Laserwriter )
|
|
; and correct version number
|
|
;
|
|
lda hprint+prInfo+idev
|
|
cmp #1 ; this is ImageWriter driver
|
|
bne WrongType
|
|
lda hprint+iPrVersion ; check if correct version
|
|
xba ; swap since hi-lo bytes are
|
|
cmp #VersionNb ; swapped during lda
|
|
beq GoodType
|
|
|
|
WrongType pushptr Print_test ; move default values in
|
|
pushptr hprint
|
|
pushlong #TPrintSize
|
|
_blockmove
|
|
|
|
lda #True ; set result to reflect a
|
|
sta Validate_Result,s ; change in print record
|
|
|
|
GoodType ;
|
|
jsr CiXmetrics
|
|
|
|
pushlong #hprint
|
|
pushlong Temp1
|
|
pushlong #TPrintSize
|
|
_PtrToHand
|
|
bcs ErrorExit ; memory manager error
|
|
|
|
lda #0
|
|
ErrorExit plb
|
|
pld
|
|
jmp exit4
|
|
|
|
EJECT
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
;
|
|
; NAME: PrStlDialog
|
|
;
|
|
; PURPOSE: High level printer routine "_PrStlDialog", which performs a
|
|
; style dialog with the user. The initial settings are taken
|
|
; from the print record. If the user confirms the dialog, the
|
|
; results are saved in the print record and "_PrValidate" is
|
|
; called and the routine returns TRUE. If not, the print record
|
|
; is left unchanged and returns FALSE.
|
|
;
|
|
; PASSED: PrintRecordHandle LONG, Handle to the print record.
|
|
;
|
|
; RETURNED: ConfirmFlag WORD, Boolean.
|
|
;
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
|
|
* buttonstate for Style
|
|
* +0 US Letter Default
|
|
* +2*1 US Legal
|
|
* +2*2 Computer Paper
|
|
* +2*3 A4 Letter
|
|
* +2*4 International Fanfold
|
|
* +2*5 Condensed Vsizing
|
|
* +2*6 50% reduction
|
|
* +2*7 No Gaps Between Pages
|
|
* +2*8 Portrait
|
|
* +2*9 Landscape
|
|
* +2*10 Normal Vsizing
|
|
|
|
EXPORT PrStlDialog
|
|
PrStlDialog
|
|
* parameters
|
|
* results
|
|
* hPrint
|
|
|
|
DefineStack
|
|
StlDialog_DPage word 0
|
|
StlDialog_BReg byte 0
|
|
StlDialog_rtl1 block 3
|
|
StlDialog_rtl2 block 3
|
|
StlDialog_hPrint long 0 ;PrintRecordHandle
|
|
StlDialog_result word 0 ;ConfirmFlag results
|
|
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
sta ZeroPage
|
|
|
|
;Copy the passed "PrintRecordHandle" to PZ_hprint and lock it
|
|
lda StlDialog_hPrint,s
|
|
sta PZ_hprint
|
|
lda StlDialog_hPrint+2,s
|
|
sta PZ_hprint+2
|
|
pushlong PZ_hprint
|
|
_hlock
|
|
_error
|
|
;
|
|
; call PrValidate to check if printer type is same
|
|
;
|
|
PushWord #0
|
|
PushLong PZ_hprint
|
|
_PrValidate ;validate the print record
|
|
plx
|
|
bcc MoveOn
|
|
brl ErrorExit1 ; memory manager error
|
|
;
|
|
MoveOn lda [PZ_hprint]
|
|
tax
|
|
ldy #2
|
|
lda [PZ_hprint],y
|
|
sta PZ_hprint+2 ;dereferences
|
|
stx PZ_hprint
|
|
;
|
|
;Copy the passed print record data to the internal print record "hprint".
|
|
;
|
|
ldy #TPrintsize-2 pair
|
|
slooph lda [PZ_hprint],y
|
|
sta hprint,y
|
|
dey
|
|
dey
|
|
bpl slooph
|
|
;
|
|
;Clear all the button states
|
|
;
|
|
lda #$0000
|
|
ldx #26
|
|
clrbtn sta buttonstate,x
|
|
dex
|
|
dex
|
|
bpl clrbtn
|
|
|
|
;
|
|
;Validate paper type and sets the appropriate button state
|
|
;
|
|
lda hprint+prStl+PaperType
|
|
cmp #4
|
|
blt valid
|
|
;We get here if the paper type is invalid (default to zero)
|
|
stz hprint+prStl+PaperType
|
|
lda #0
|
|
Valid
|
|
; what if the prtrecord
|
|
asl a ; never did go through
|
|
tax ; prdefault
|
|
;This sets the appropriate button state
|
|
lda #$ffff
|
|
sta buttonstate,x ; et voila pour le papier
|
|
|
|
;
|
|
;This initilizes the portrait/landscape buttonstate
|
|
;
|
|
lda hprint+prstl+wdev
|
|
and #f1 ;check for portrait mode
|
|
beq do9
|
|
dec buttonstate+2*8 ;set portrait
|
|
bra over9
|
|
do9 dec buttonstate+2*9 ;set landscape
|
|
over9 ;
|
|
|
|
;
|
|
;This initilizes the 50% reduction buttonstate
|
|
;
|
|
lda hprint+prstl+wdev
|
|
and #f3 ;check for 50% reduction
|
|
bne over6
|
|
dec buttonstate+2*6 ;set 50% reduction
|
|
over6 ;
|
|
|
|
;
|
|
;This initilizes the no GAP buttonstate
|
|
;
|
|
lda hprint+prstl+wdev
|
|
and #f6 ;check for no GAP
|
|
bne over7
|
|
dec buttonstate+2*7 ;set for no GAP
|
|
over7 ;
|
|
lda hprint+prstl+wdev
|
|
and #f2 2Vsize
|
|
beq do5
|
|
dec buttonstate+2*10
|
|
bra over5
|
|
do5 dec buttonstate+2*5
|
|
over5 ;
|
|
|
|
;------------------------------------------------------------------------------
|
|
;Now call "StyleDialog" to do the actual dialog work
|
|
;------------------------------------------------------------------------------
|
|
jsr styledialog
|
|
|
|
sta StlDialog_result,s ;save results on stack
|
|
bne okStyle ;branch if confirmed dialog
|
|
brl outStyle ;branch if canceled dialog
|
|
;
|
|
;We get here if the user confirmed and we can update the print record
|
|
;
|
|
okStyle ;
|
|
* +0 US Letter Default
|
|
* +2*1 US Legal
|
|
* +2*2 International Fanfold
|
|
* +2*3 A4 Letter
|
|
* +2*4 Computer Paper
|
|
;
|
|
;Now figure out which paper size was selected
|
|
;
|
|
ldx #0
|
|
lda buttonstate+2*0 ;see if US Letter
|
|
bmi NewPaperSize
|
|
inx
|
|
lda buttonstate+2*1 ;see if US legal
|
|
bmi NewPaperSize
|
|
inx
|
|
lda buttonstate+2*2 ;see if Internationl Fanfold
|
|
bmi NewPaperSize
|
|
inx
|
|
NewPaperSize stx hprint+prStl+PaperType ;now set paper type
|
|
;
|
|
;Now see about vertical sizing
|
|
;
|
|
lda #f2 2Vsize
|
|
tsb hprint+prstl+wdev
|
|
bit buttonstate+2*5
|
|
bpl no2
|
|
trb hprint+prstl+wdev
|
|
no2 ;
|
|
|
|
;
|
|
;Now see if GAP or NO GAP was selected
|
|
;
|
|
lda #f6 Gap
|
|
tsb hprint+prstl+wdev
|
|
bit buttonstate+2*7
|
|
bpl no6
|
|
trb hprint+prstl+wdev
|
|
no6 ;
|
|
|
|
;
|
|
;Now see if 50% reduction was selected
|
|
;
|
|
lda #f3 2x zoom
|
|
tsb hprint+prstl+wdev
|
|
bit buttonstate+2*6
|
|
bpl no3
|
|
trb hprint+prstl+wdev
|
|
no3 ;
|
|
|
|
;
|
|
;Now see which of portrait/landscape was selected
|
|
;
|
|
lda #f1 portrait
|
|
tsb hprint+prstl+wdev
|
|
bit buttonstate+2*9
|
|
bpl no1
|
|
trb hprint+prstl+wdev
|
|
no1 ;
|
|
|
|
Jsr CiXmetrics ;go calculate the metrics
|
|
|
|
;
|
|
;Now copy the internal print record to the users
|
|
;
|
|
ldy #TPrintsize-2 pair
|
|
slooph2 lda hprint,y
|
|
sta [PZ_hprint],y
|
|
dey
|
|
dey
|
|
bpl slooph2
|
|
|
|
;
|
|
;We get here when we are done or the user canceled the dialog
|
|
;
|
|
OutStyle lda #0
|
|
ErrorExit1 plb
|
|
pld
|
|
jmp exit4
|
|
|
|
EJECT
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
;
|
|
; NAME: PrJobDialog
|
|
;
|
|
; PURPOSE: High level printer routine "_PrStlDialog", which performs a
|
|
; job dialog with the user. The initial settings are taken
|
|
; from the print record. If the user confirms the dialog, the
|
|
; results are saved in the print record and "_PrValidate" is
|
|
; called and the routine returns TRUE. If not, the print record
|
|
; is left unchanged and returns FALSE.
|
|
;
|
|
; PASSED: PrintRecordHandle LONG, Handle to the print record.
|
|
;
|
|
; RETURNED: ConfirmFlag WORD, Boolean.
|
|
;
|
|
;*****************************************************************************
|
|
;*****************************************************************************
|
|
|
|
* buttonstate for JobDialog
|
|
* +0 best
|
|
* +2*1 faster
|
|
* +2*2 Draft
|
|
* +2*3 all pages
|
|
* +2*4 from pages
|
|
* +2*5 paper auto
|
|
* +2*6 paper hand
|
|
* +2*7 value for From
|
|
* +2*8 Value for To
|
|
* +2*9 value for Copies
|
|
* +2*10 color/bw
|
|
* +2*11 darker
|
|
|
|
EXPORT PrJobDialog
|
|
PrJobDialog
|
|
* prarmeters
|
|
* results
|
|
* hPrint
|
|
|
|
DefineStack
|
|
JobDialog_DPage word 0
|
|
JobDialog_BReg byte 0
|
|
JobDialog_rtl1 block 3
|
|
JobDialog_rtl2 block 3
|
|
JobDialog_hPrint long 0 ;passed PrintRecordHandle
|
|
JobDialog_result word 0 ;returned ConfirmFlag
|
|
|
|
;First save registers and setup environment
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
sta ZeroPage
|
|
|
|
;
|
|
;Make a copy of the passed print record handle at "PZ_hprint" and lock it
|
|
;
|
|
lda JobDialog_hPrint,s
|
|
sta PZ_hprint
|
|
lda JobDialog_hPrint+2,s
|
|
sta PZ_hprint+2
|
|
pushlong PZ_hprint
|
|
_hlock ;lock the handle
|
|
_error
|
|
;
|
|
; call PrValidate to check if printer type is same
|
|
;
|
|
PushWord #0
|
|
PushLong PZ_hprint
|
|
_PrValidate
|
|
plx
|
|
bcc OnWard
|
|
brl ErrorExit2 ;memory manager error
|
|
;
|
|
;Dereferences the handle at "PZ_hprint"
|
|
;
|
|
Onward lda [PZ_hprint]
|
|
tax
|
|
ldy #2
|
|
lda [PZ_hprint],y
|
|
sta PZ_hprint+2 dereference
|
|
stx PZ_hprint
|
|
;
|
|
;This copies the passed print record data to the internal print record "hprint"
|
|
;
|
|
ldy #TPrintsize-2 pair
|
|
looph lda [PZ_hprint],y
|
|
sta hprint,y
|
|
dey
|
|
dey
|
|
bpl looph
|
|
;
|
|
;This initializes all the buttonstates to zero
|
|
;
|
|
lda #$0000
|
|
ldx #28
|
|
clrbtn2 sta buttonstate,x
|
|
dex
|
|
dex
|
|
bpl clrbtn2
|
|
;
|
|
;This sets the correct buttonstate for print quality; BEST, FASTER, DRAFT
|
|
;
|
|
lda #$80
|
|
and hprint+prJob+bjDocLoop
|
|
bne BetOrFast
|
|
dec buttonstate+2*2 ;set DRAFT
|
|
bra jover1
|
|
;We get here if it could be BEST or FASTER
|
|
BetOrFast ;
|
|
lda hprint+prstl+wdev
|
|
and #f0
|
|
beq jover0
|
|
dec buttonstate+2*0 ;set BEST
|
|
bra jover1
|
|
jover0 dec buttonstate+2*1 ;set FAST
|
|
jover1 ;
|
|
;
|
|
;This sets the correct buttonstate for paper feed; AUTOMATIC, HAND FEED
|
|
;
|
|
lda hprint+prStl+feed
|
|
cmp #feedfanfold
|
|
beq doauto
|
|
dec buttonstate+2*6 ;set HAND FEED
|
|
bra doHand
|
|
doauto dec buttonstate+2*5 ;set AUTOMATIC
|
|
doHand ;
|
|
;
|
|
;This sets the COLOR/BW buttonstate
|
|
;
|
|
lda hprint+prstl+wdev
|
|
and #f5
|
|
beq jover10
|
|
dec buttonstate+2*10 ;set COLOR
|
|
jover10 ;
|
|
;This sets the Darker buttonstate
|
|
;
|
|
lda hprint+prstl+wdev
|
|
and #f7
|
|
beq jover11
|
|
dec buttonstate+2*11 ;set Darker
|
|
jover11 ;
|
|
|
|
;
|
|
;This always initilizes the page range to ALL
|
|
;
|
|
dec buttonstate+2*3 always all
|
|
;
|
|
;This sets FROM=1, COPIES=1 and TO=999
|
|
;
|
|
lda #1
|
|
sta buttonstate+2*7 ;init. FROM to 1
|
|
sta buttonstate+2*9 ;init. COPIES to 1
|
|
lda #999
|
|
sta buttonstate+2*8 ;init TO to 999
|
|
|
|
;------------------------------------------------------------------------------
|
|
;Now call "JobDialog" to do the actual dialog work
|
|
;------------------------------------------------------------------------------
|
|
jsr jobdialog
|
|
sta JobDialog_result,s ;save results
|
|
bne okJob ;branch if OK
|
|
brl outJoB ;branch if CANCEL
|
|
okJob ;
|
|
|
|
* we need to update the quality values:
|
|
*
|
|
* prstl.wdev f0
|
|
* prXinfo.idevbytes will be calculated by CiXmetrics
|
|
*
|
|
|
|
;
|
|
;This sets up the COLOR/BW bit appropriately
|
|
;
|
|
lda #f5
|
|
trb hprint+prstl+wdev ;clear the COLOR/BW bit
|
|
bit buttonstate+2*10
|
|
bpl no4
|
|
tsb hprint+prstl+wdev ;set to COLOR
|
|
no4 ;
|
|
;
|
|
;This sets up the Darker bit appropriately
|
|
;
|
|
lda #f7
|
|
trb hprint+prstl+wdev ;clear the Darker bit
|
|
bit buttonstate+2*11
|
|
bpl no7
|
|
tsb hprint+prstl+wdev ;set to Darker
|
|
no7;
|
|
|
|
|
|
;
|
|
;This sets up the BEST bit appropriately
|
|
;
|
|
lda #f0
|
|
trb hprint+prstl+wdev ;clear the BEST bit
|
|
bit buttonstate+2*0
|
|
bpl no0
|
|
tsb hprint+prstl+wdev ;set the BEST bit
|
|
no0 ;
|
|
|
|
;
|
|
;This sets up the DRAFT bit appropriately
|
|
;
|
|
lda #$80
|
|
tsb hprint+prJob+bjDocLoop ;clears the DRAFT bit
|
|
bit buttonstate+2*2
|
|
bpl notdraft
|
|
trb hprint+prJob+bjDocLoop ;sets the DRAFT bit
|
|
notdraft ;
|
|
|
|
* then the paper range
|
|
* PrJob.ifstpage, iLst page, iCopies
|
|
* if all then first := 1 ; last := 9999 ; icopies := 1
|
|
* else user value
|
|
;
|
|
;This copies FROM, TO, and COPIES
|
|
;
|
|
lda Buttonstate+2*7
|
|
sta hprint+prjob+ifstpage
|
|
lda Buttonstate+2*8
|
|
sta hprint+prjob+ilstpage
|
|
lda Buttonstate+2*9
|
|
sta hprint+prjob+iCopies
|
|
|
|
* then the paperfeeding
|
|
* prStl.feed := feedfanfold (A) or feedcut
|
|
;
|
|
;This sets paper feed
|
|
;
|
|
lda #feedfanfold
|
|
sta hprint+prStl+Feed ;assume AUTOMATIC
|
|
lda buttonstate+2*5 ;get buttonstate from dialog
|
|
bmi no5_2 ;branch if assumption was correct
|
|
lda #feedcut ;else its HAND FEED
|
|
sta hprint+prStl+Feed
|
|
no5_2 ;
|
|
|
|
jsr CiXmetrics ;go calculate the metrics
|
|
|
|
;
|
|
;Now copy the internal print record to the users data area
|
|
;
|
|
ldy #TPrintsize-2 pair
|
|
looph2 lda hprint,y
|
|
sta [PZ_hprint],y
|
|
dey
|
|
dey
|
|
bpl looph2
|
|
|
|
;
|
|
;We get here when we are done or the user canceled the dialog
|
|
;
|
|
OutJob lda #0
|
|
ErrorExit2 plb
|
|
pld
|
|
Jmp exit4
|
|
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: CiXmetrics
|
|
;
|
|
; PURPOSE: Calculates metrics of page
|
|
;
|
|
; PASSED: (None)
|
|
;
|
|
; RETURNED: (None)
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
EXPORT CiXmetrics
|
|
CiXmetrics
|
|
;
|
|
;NOTE: print resolution is calculated in 120 dots per inch.
|
|
;
|
|
* first find out the resolution
|
|
|
|
stz resolution ;init. to zero (assume 320)
|
|
pha
|
|
_GetMasterSCB
|
|
pla
|
|
sta DeadLoc2
|
|
and #$80
|
|
beq r320
|
|
inc resolution ;we get here if its 640
|
|
r320 ;
|
|
|
|
* Landscape (f1) { 0=landscape ; 1=Portrait }
|
|
* PaperType (0,1,2,3) { 0= Us Letter; 1= US Legal; 2= A4 Letter; 3= int'l fold}
|
|
* CarriageWidth (0,1,2,3) same
|
|
* Resolution (0,1) { 0=320 ; 1=640 }
|
|
* Gap (0,1)
|
|
* if 50% (f3) then all resolution are twice as big
|
|
|
|
* newVmargin: Landscape(Gap,f6:(PaperHsize,PaperType - CarriageWidth,paperType))
|
|
* mul Landscape(Vres:Hres) div 240
|
|
|
|
* newHmargin: Landscape((PaperHsize,PaperType - CarriageWidth,paperType):Gap,f6)
|
|
* mul Landscape(Hres:Vres),resolution div 240
|
|
|
|
* NewPaperVsize: Landscape(PaperVsize:CarriageWidth),PaperType
|
|
* Mul Landscape(Vres:Hres) div 120 - 2*newVmargin
|
|
*
|
|
* NewPaperHsize: Landscape(CarriageWidth:PaperVsize),PaperType
|
|
* Mul Landscape(Hres:Vres),resolution div 120
|
|
|
|
* rPage := 0,0,NewPaperVsize,NewPaperHsize
|
|
|
|
* rPaper := -newVmargin,-newHmargin,NewPaperVsize+newVmargin,
|
|
* NewPaperHsize+newHmargin
|
|
|
|
* go for it
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
;Calculates TOP, LEFT, BOTTOM, RIGHT for papers rectangle "rPaper"
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
* newVmargin: Landscape(Gap,f6:(PaperHsize,PaperType - CarriageWidth,paperType))
|
|
* mul Landscape(Vres:Hres) div 240
|
|
|
|
lda resolution
|
|
asl a ;times two
|
|
tax ;use as index
|
|
lda Hres,X ;get horz. resolution
|
|
sta hprint+prInfo+iHRes ;init horz. pixel resolution
|
|
;???????????????????????????lda Vres,X (because its the same value)
|
|
lda Vres
|
|
sta hprint+prInfo+iVres ;init. vertical pixel resolution
|
|
|
|
stz TableIndex ;init index
|
|
;
|
|
;First see which mode (portrait or landscape)
|
|
;
|
|
lda #f1 ;see if landscape
|
|
and hprint+prstl+wDev
|
|
bne Portt ;branch if portrait
|
|
|
|
;We get here if landscape (set index to landscape table entries)
|
|
lda #IntLandVals-IntPortVals ;set index to landscape values
|
|
sta TableIndex
|
|
|
|
;-----------------------------------------------------------------------
|
|
;This wasn't being done at all. *BugFix* ÑMSL 10/15/88
|
|
;
|
|
;Now fix the resolutions, swapping and halving or doubling each as needed.
|
|
;
|
|
lda hprint+prInfo+iHRes ; horz. pixel resolution
|
|
lsr a
|
|
tay
|
|
lda hprint+prInfo+iVres ; vertical pixel resolution
|
|
asl a
|
|
sta hprint+prInfo+iHRes
|
|
sty hprint+prInfo+iVres
|
|
|
|
;Now take paper type and multiply by 10 because each entry is 10 bytes long
|
|
Portt ;
|
|
lda hprint+prStl+PaperType ;get paper size type
|
|
asl a ;first mult. by 8 (10 byte table)
|
|
asl a
|
|
asl a
|
|
clc
|
|
adc hprint+prStl+PaperType ;times 9
|
|
adc hprint+prStl+PaperType ;times 10
|
|
adc TableIndex ;add in initial table index
|
|
tax ;we now have the correct index
|
|
|
|
;
|
|
;Now move the initial paper values from the table
|
|
;
|
|
ldy #0 ;init loop counter
|
|
MvIntVals ;
|
|
|
|
lda IntPortVals,X ;get initial values from table
|
|
sta Hprint+rPaper+Top,Y ;set "rPaper" values
|
|
inx
|
|
inx
|
|
iny
|
|
iny
|
|
cpy #8
|
|
bne MvIntVals
|
|
|
|
lda IntPortVals,X ;get initial assocaiated GAP value
|
|
sta TableIndex ;save the GAP value at TableIndex
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;Now see if 320 or 640 mode (because table were designed for 640 mode)
|
|
lda resolution
|
|
bne Rez640 ;branch if 640 (no modification needed)
|
|
;With 320 mode, we need to modify
|
|
clc ; do a signed divide by 2 because left may be
|
|
lda HPrint+rPaper+Left ; negative in portrait mode.
|
|
bpl @1
|
|
sec
|
|
@1 ror HPrint+rPaper+Left
|
|
|
|
lsr Hprint+rPaper+Right ; (right never negative so can do unsigned div)
|
|
Rez640 ;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;Now see if GAP
|
|
lda #f6
|
|
and hprint+prstl+wDev
|
|
beq noGap1
|
|
;
|
|
;We Get here if GAP
|
|
;
|
|
lda TableIndex ;get the GAP value
|
|
bmi LandGAP ;if negative, its landscape GAP
|
|
|
|
;We get here if portrait GAP
|
|
eor #$ffff ;first we must make negative
|
|
ina
|
|
|
|
sta Hprint+rPaper+Top ;set "rPaper" TOP to GAP
|
|
clc
|
|
adc Hprint+rPaper+Bottom
|
|
sta Hprint+rPaper+Bottom ;set "rPaper" BOTTOM with GAP
|
|
bra noGap1
|
|
|
|
;We get here if landscape GAP
|
|
LandGAP ;
|
|
sta Hprint+rPaper+Left ;set "rPaper" LEFT to GAP
|
|
clc
|
|
adc Hprint+rPaper+Right
|
|
sta Hprint+rPaper+Right ;Adjusted "rPaper" Right with GAP
|
|
|
|
noGap1 ;
|
|
|
|
;
|
|
;Now see if 50% reduction (twice the resolution) was selected
|
|
;
|
|
lda #f3
|
|
and hprint+prStl+wDev
|
|
bne notHalf1 ;branch if no 50% reduction selected
|
|
|
|
;We get here if 50% reduction (multiply TOP, LEFT, BOTTOM, RIGHT by two)
|
|
ldx #0
|
|
HalfResLoop ;
|
|
asl Hprint+rPaper+Top,X ;multiply by two
|
|
inx ;go to next value
|
|
inx
|
|
cpx #8
|
|
bne HalfResLoop
|
|
|
|
asl hprint+prInfo+iHRes ;multiply horz. pixel resolution by 2
|
|
asl hprint+prInfo+iVRes ;multiply vertical pixel resolution by 2
|
|
|
|
notHalf1 ;
|
|
|
|
;
|
|
;Now see if condensed vertical resolution was selected
|
|
;
|
|
lda #f2
|
|
and hprint+prstl+wDev
|
|
bne NormVSize ;branch if normal vertical size
|
|
|
|
;We get here when condensed vertical size was selected
|
|
asl Hprint+rPaper+Bottom
|
|
asl Hprint+rPaper+Top
|
|
|
|
asl hprint+prInfo+iVRes ;update rPage vRes
|
|
|
|
NormVSize ;
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
;Calculate the page rectangle "rPage"
|
|
;
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; update hprint+prInfo+rPage for now, prInfoPT will be updated later
|
|
;
|
|
|
|
stz hprint+prInfo+rPage+Top ;init TOP to zero
|
|
stz hprint+prInfo+rPage+Left ;init LEFT to zero
|
|
lda hprint+rPaper+Bottom
|
|
clc
|
|
adc hprint+rPaper+Top
|
|
sta hprint+prInfo+rPage+Bottom ;set BOTTOM
|
|
lda hprint+rPaper+Right
|
|
clc
|
|
adc hprint+rPaper+Left
|
|
sta hprint+prInfo+rPage+Right ;set RIGHT
|
|
|
|
|
|
;
|
|
;Now copy the new calculated PrInfo subrecord to PrInfoPT subrecord
|
|
;
|
|
* Update the PrInfoPT record also
|
|
ldy #12
|
|
UpdatePT lda hprint+PrInfo,y
|
|
sta hprint+PrInfoPT,y
|
|
dey
|
|
dey
|
|
bpl UpdatePT
|
|
|
|
;
|
|
;Now determine physical papers resolution
|
|
;
|
|
lda hprint+prStl+PaperType
|
|
asl a
|
|
tax
|
|
lda PaperVsize,x
|
|
sta hprint+PrStl+iPageV ;set pages vertical res.
|
|
lda PaperHsize,x
|
|
sta hPrint+PrStl+iPageH ;set pages horz. resolution
|
|
lda CarriageWidth,x
|
|
sta hPrint+PrStl+CRwidth ;set carriage width resolution
|
|
|
|
rts
|
|
|
|
TableIndex DS.B 2 ;temporary
|
|
|
|
;NOTE: The Initial and Normal horz. resolution is 80 dots per inch.
|
|
; The Initial and Normal vertical resolution is 36 dots per inch.
|
|
; The carriage is only 8 inches wide (therefore there are 1/4" margins.)
|
|
;
|
|
;NOTE: All values are relative to the carriages 0,0 value.
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Initial Portrait rPaper values
|
|
;------------------------------------------------------------------------------
|
|
IntPortVals ;
|
|
;
|
|
;US normal 8.5" x 11"
|
|
;
|
|
DC.W 0 ;Top
|
|
DC.W -20 ;Left (-1/4" offset from carriage zero)
|
|
DC.W 396 ;Bottom (11" times 36 dpi)
|
|
DC.W 660 ;Right (8" x 80 + 1/4" * 80)
|
|
DC.W 9 ;GAP top and bottom (1/4" x 36)
|
|
;
|
|
;US Legal 8.5" x 14"
|
|
;
|
|
DC.W 0 ;Top
|
|
DC.W -20 ;Left (-1/4" offset from carriage zero)
|
|
DC.W 504 ;Bottom (14" times 36 dpi)
|
|
DC.W 660 ;Right (8" x 80 + 1/4" * 80)
|
|
DC.W 9 ;GAP top and bottom (1/4" x 36)
|
|
;
|
|
;A4 Letter 8.25" (210mm) x 11 2/3" (297mm) NOTE: 25.4mm/inch
|
|
;
|
|
DC.W 0 ;Top
|
|
DC.W -10 ;Left (-1/8" offset from carriage zero)
|
|
DC.W 420 ;Bottom (11.6667" times 36 dpi)
|
|
DC.W 650 ;Right (8.25 x 80)
|
|
DC.W 9 ;GAP top and bottom (1/4" x 36)
|
|
;
|
|
;International FanFold 8.25 (210mm) x 12"
|
|
;
|
|
DC.W 0 ;Top
|
|
DC.W -10 ;Left (-1/8" offset from carriage zero)
|
|
DC.W 432 ;Bottom (12" times 36)
|
|
DC.W 650 ;Right (8.25 x 80)
|
|
DC.W 9 ;GAP top and bottom (1/4" x 36dpi)
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Initial Landscape rPage values
|
|
;------------------------------------------------------------------------------
|
|
|
|
;NOTE: Normal and Initial vertical (in actuality horz. carriage) is 40 dpi.
|
|
; Normal and Initial Horz. (in actuality vertical) is 72 dpi.
|
|
; GAP must be negative for landscape (simplified programming).
|
|
|
|
IntLandVals ;
|
|
;
|
|
;US normal 8.5" x 11"
|
|
;
|
|
DC.W -10 ;Top (1/4" x 40 offset from carriage 0)
|
|
DC.W 0 ;Left
|
|
DC.W 330 ;Bottom (8" x 40 + 1/4 * 40)
|
|
DC.W 792 ;Right (11" x 72)
|
|
DC.W -18 ;GAP (1/4" x 72) (neg. flags landscape)
|
|
;
|
|
;US LEGAL 8.5" x 14"
|
|
;
|
|
DC.W -10 ;Top (1/4" x 40 offset from carriage 0)
|
|
DC.W 0 ;Left
|
|
DC.W 330 ;Bottom (8" x 40 + 1/4 * 40)
|
|
DC.W 1008 ;Right (14" x 72)
|
|
DC.W -18 ;GAP (1/4" x 72) (neg. flags landscape)
|
|
;
|
|
;A4 Letter 8.25 x 11 2/3"
|
|
;
|
|
DC.W -5 ;Top (1/8" x 40 offset from carriage 0)
|
|
DC.W 0 ;Left
|
|
DC.W 325 ;Bottom (8 * 40 + 1/8 *40)
|
|
DC.W 840 ;Right (11.* 72 + 2/3 * 72)
|
|
DC.W -18 ;GAP (1/4" x 72) (neg. flags landscape)
|
|
;
|
|
;International FanFold 8.25 (210mm) x 12"
|
|
;
|
|
DC.W -5 ;Top (1/8" x 40 offset from carriage 0)
|
|
DC.W 0 ;Left
|
|
DC.W 325 ;Bottom (8 * 40 +1/8 * 40)
|
|
DC.W 864 ;Right (12 * 72)
|
|
DC.W -18 ;GAP (1/4" x 72) (neg. flags landscape)
|
|
|
|
ENDP
|
|
|
|
|
|
; DocPage.Calls ;_PrOpenDoc, _PrCloseDoc, _PrOpenPage
|
|
; ;_PrClosePage
|
|
|
|
*****************************
|
|
* *
|
|
* DocPage.calls *
|
|
* *
|
|
* Current Rev: Nov. 1987 *
|
|
* *
|
|
*****************************
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: PrDrvrVer
|
|
;
|
|
; PURPOSE: Returns version # of currently installed driver
|
|
;
|
|
; PASSED: WORD Space for result
|
|
;
|
|
; RETURNED: WORD Driver Version
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
PrDrvrVer PROC EXPORT
|
|
|
|
|
|
DefineStack
|
|
DVerOrigD Word 0
|
|
DVerOrigB Byte 0
|
|
DVer_Rtl1 Block 3
|
|
DVer_Rtl2 Block 3
|
|
Version Word 0
|
|
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
lda #VersionNb
|
|
sta Version,s
|
|
|
|
lda #0
|
|
plb
|
|
pld
|
|
jmp exit0
|
|
|
|
ENDP
|
|
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
;
|
|
; NAME: PrOpenDoc
|
|
;
|
|
; PURPOSE: High level printer routine "_PrOpenDoc" which opens the document
|
|
;
|
|
; PASSED: (Space for Result) POINTER
|
|
; PrintRecordHandle HANDLE, to print record
|
|
; PrinterPortPtr POINTER, to GrafPort, (zero indicates
|
|
; to allocate new GrafPort).
|
|
;
|
|
; RETURNED: PrintrPortPtrRet POINTER, pointer to Grafport if
|
|
; PrinterPortPtr was zero.
|
|
;
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
Export PrOpenDoc
|
|
PrOpenDoc PROC
|
|
|
|
DefineStack
|
|
OrigD word 0
|
|
OrigB byte 0
|
|
rtl1 block 3
|
|
rtl2 block 3
|
|
UsersPortPtr long 0
|
|
UsersPrintRecH long 0
|
|
ResultPtr long 0
|
|
|
|
|
|
pha ; save value of d
|
|
;
|
|
;First see if the port is ON
|
|
;
|
|
pha
|
|
_DevIsItSafe ;see if port is working
|
|
pla
|
|
bne Yes ;branch if safe
|
|
;
|
|
;We get here when the port is not on and we can't proceed
|
|
;
|
|
lda #PortNotOn ;get error no.
|
|
sta >iPrErr ;save it
|
|
plx
|
|
jmp Exit8
|
|
;
|
|
;We arrive here when the port is ON
|
|
;
|
|
Yes ;
|
|
pla
|
|
;------------------------------------------------------------
|
|
;
|
|
; save the registers and set direct page and data bank
|
|
;
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get the current cursor record's address and turn on the watch cursor.
|
|
;
|
|
|
|
PushLong #0 ; space for the address
|
|
_GetCursorAdr
|
|
pla
|
|
sta CursorAd
|
|
pla
|
|
sta CursorAd+2
|
|
|
|
_WaitCursor
|
|
|
|
|
|
stz DraftFlag
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Don't Verify the print record! *Hack* ÑMSL 10/15/88
|
|
;
|
|
|
|
; pha ; space for result
|
|
; lda UsersPrintRecH+4,s
|
|
; pha
|
|
; lda UsersPrintRecH+4,s
|
|
; pha
|
|
; _PrValidate
|
|
; pla ; dont care about the result
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Clear the error code. Move the user id. Copy the users
|
|
; print record to our print record.
|
|
;
|
|
|
|
stz iPrErr ; zero error
|
|
stz PStatus ; and printer status
|
|
|
|
lda UserId ; move user id
|
|
sta MainUserID
|
|
|
|
lda UsersPrintRecH+2,s ; copy the print record
|
|
pha ; using HandToPtr
|
|
lda UsersPrintRecH+2,s
|
|
pha
|
|
PushLong #hprint
|
|
PushLong #Tprintsize
|
|
_HandToPtr
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Lets look at the print method and set the variable
|
|
; "METHOD". Method will be zero for draft printing and
|
|
; $8000 for spool printing.
|
|
;
|
|
lda hprint+prJob+bjDocLoop
|
|
and #$80
|
|
xba
|
|
sta method ;set the method
|
|
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Put up the dialog that says preparing data (or draft
|
|
; printing.
|
|
;
|
|
stz NoShowMessage ; enable message display
|
|
|
|
jsr OpenInfoPrepare
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Now we decide whether to use our own port or the user's
|
|
; port.
|
|
|
|
|
|
lda #false ; start by assuming it
|
|
sta ourport ; is the user's port.
|
|
|
|
lda UsersPortPtr,s ; if port ptr is non zero
|
|
ora UsersPortPtr+2,s ; we use theirs
|
|
bne Portexist
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Damn, the user wants us to do all his work for him/her.
|
|
; We get a handle for a port.
|
|
;
|
|
lda #PortSize ; size of handle
|
|
ldx #%1000000000011000 ; attributes
|
|
jsr OurGetHandle ;get a handle of port size
|
|
bcc @1
|
|
sta iPrErr
|
|
jsr CloseInfo
|
|
brl errorExitDoc
|
|
|
|
@1 sta temp1 ;save handle at tem1
|
|
stx temp1+2
|
|
|
|
lda [Temp1]
|
|
sta UsersPortPtr,s ;dereference handle at UsersPortPtr
|
|
ldy #2
|
|
lda [Temp1],y
|
|
sta UsersPortPtr+2,s
|
|
|
|
lda #true ;set OURPORT true (remember)
|
|
sta ourport
|
|
|
|
PortExist ;
|
|
;------------------------------------------------------------
|
|
;
|
|
; Put copies of the port pointer everywhere.
|
|
;
|
|
lda UsersPortPtr,s ;get port pointer
|
|
sta ResultPtr,s ;save to be passed back
|
|
sta hOurPort
|
|
sta PZ_pPrPort
|
|
lda UsersPortPtr+2,s
|
|
sta ResultPtr+2,s
|
|
sta hOurPort+2
|
|
sta PZ_pPrPort+2
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Open the grafport.
|
|
;
|
|
pei PZ_pPrPort+2
|
|
pei PZ_pPrPort
|
|
_OpenPort ;open the grafport
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Initialize these page number varibles.
|
|
;
|
|
|
|
stz iPageNum ; init page num
|
|
stz iDocPage ; init. document pages
|
|
stz PicListCount ; page count of hPicList
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Look at the printing method. If it is deferred, get a handle
|
|
; to enough memory to contain list of pictures for the number
|
|
; of pages asked by the application to be printed.
|
|
;
|
|
|
|
lda method
|
|
bpl draftOpenDoc ;branch if immediate mode (draft)
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; DEFERRED Mode Code
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;-------------------------------------------------------------
|
|
;
|
|
; We'll begin with a piclist for 20 pages. In PrOpenPage, we'll
|
|
; check if this is enough, if not, we get more in 20 page increments
|
|
;
|
|
lda #20*4 ; start with 20 pages worth
|
|
ldx #%0000000000000000 ; nothing special
|
|
jsr OurGetHandle ;get a handle
|
|
bcc @1
|
|
sta iPrErr ; clean up the port we
|
|
jsr CloseInfo ; allocated.
|
|
|
|
pei PZ_pPrPort+2
|
|
pei PZ_pPrPort
|
|
_ClosePort ;close the graf port
|
|
|
|
lda #0 ;zero out what we give back.
|
|
sta UsersPortPtr,s
|
|
sta UsersPortPtr+2,s
|
|
|
|
lda ourPort ;see if ours
|
|
cmp #true
|
|
bne @2 ;branch if not ours
|
|
|
|
pha ; first find the handle to
|
|
pha ; memory that port is in.
|
|
pei PZ_pPrPort+2
|
|
pei PZ_pPrPort
|
|
_FindHandle ; find the handle to pointer
|
|
_DisposeHandle ; then dispose it.
|
|
@2 bra errorExitDoc
|
|
|
|
@1 sta hPicList ;save it at hPicList
|
|
stx hPicList+2
|
|
|
|
|
|
;
|
|
;We get here with no errors and its time to exit PrOpenDoc
|
|
;
|
|
lda #0
|
|
exitOpenDoc
|
|
sta iPrErr ; Added by Suki 5/25/88
|
|
errorExitDoc plb
|
|
pld
|
|
jmp Exit8
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; IMMEDIATE Mode Code
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
draftOpenDoc ;
|
|
jsr startLLD ; start up the LLD
|
|
|
|
bra ExitOpenDoc
|
|
|
|
ENDP
|
|
EJECT
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
;
|
|
; NAME: PrCloseDoc
|
|
;
|
|
; PURPOSE: High level printer routine "_PrCloseDoc" which closes the doc.
|
|
;
|
|
; PASSED: PrinterGrafPortPtr POINTER, to printer graf port.
|
|
;
|
|
; RETURNED: (NONE)
|
|
;
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
PrCloseDoc PROC EXPORT
|
|
|
|
DEFINESTACK
|
|
OrigD word 0
|
|
OrigB byte 0
|
|
rtl1 block 3
|
|
rtl2 block 3
|
|
PortPtr long 0
|
|
|
|
pha
|
|
lda >iPrErr ;see if any errors
|
|
beq Continue ;branch if no erros
|
|
|
|
cmp #PortNotOn ;see if port-not-on error
|
|
bne Continue ;branch if not
|
|
plx
|
|
jmp Exit4
|
|
;
|
|
;Save registers and setup environment
|
|
;
|
|
Continue ;
|
|
pla
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Close the port.
|
|
;
|
|
|
|
lda PortPtr+2,s
|
|
pha
|
|
lda PortPtr+2,s
|
|
pha
|
|
_ClosePort ;close the graf port
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; If the port is our's (created in PrOpenDoc), we must get rid of the memory we
|
|
; allocated for it.
|
|
;
|
|
lda ourPort ;see if ours
|
|
cmp #true
|
|
bne userport ;branch if not ours
|
|
|
|
pha ; first find the handle to
|
|
pha ; memory that port is in.
|
|
lda PortPtr+4+2,s
|
|
pha
|
|
lda PortPtr+4+2,s
|
|
pha
|
|
_FindHandle ; find the handle to pointer
|
|
_DisposeHandle ; then dispose it.
|
|
|
|
userport ;
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; If we are doing immediate (draf)t printing, we need to shut down.
|
|
;
|
|
lda method
|
|
bpl CloseDocDraft ;branch if immediate mode
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; DEFERRED Mode
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; We're done.
|
|
;
|
|
NoErrorExit ;
|
|
lda #0
|
|
pha
|
|
jsr CloseInfo ; get rid of info dialog box
|
|
pla ;restore registers
|
|
plb
|
|
pld
|
|
jmp Exit4
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; IMMEDIATE Mode
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
CloseDocDraft ;
|
|
|
|
pushword UserID
|
|
jsl LLDShutDown
|
|
|
|
PushLong CursorAd
|
|
_Setcursor
|
|
|
|
bra NoErrorExit
|
|
|
|
ENDP
|
|
EJECT
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
;
|
|
; NAME: PrOpenPage
|
|
;
|
|
; PURPOSE: High level printer routine "_PrOpenPage" which opens the page
|
|
;
|
|
; PASSED: GrafPortPtr POINTER, to grafport
|
|
; PageFramePtr POINTER, to scaling parameter (zero if
|
|
; none.)
|
|
;
|
|
; RETURNED: (NONE)
|
|
;
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
PrOpenPage PROC EXPORT
|
|
|
|
DefineStack
|
|
OrigD word 0
|
|
OrigB byte 0
|
|
rtl1 block 3
|
|
rtl2 block 3
|
|
PageFramePtr long 0
|
|
PortPtr long 0
|
|
|
|
pha
|
|
lda >iPrErr ;see if any errors
|
|
beq SallRight ;branch if none
|
|
plx
|
|
jmp Exit8
|
|
|
|
SallRight ;
|
|
pla ;save registers and setup environment
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; First we set the port to the port that is passed.
|
|
;
|
|
|
|
lda PortPtr+2,s
|
|
pha
|
|
lda PortPtr+2,s
|
|
pha
|
|
_Initport
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Zero the bounds rect. This prevents any drawing: even
|
|
; if user makes the pen visible.
|
|
;
|
|
lda #0
|
|
ldy #o_BoundsRect
|
|
ZeroLoop sta [PZ_pPrPort],y
|
|
iny
|
|
iny
|
|
cpy #o_BoundsRect+8
|
|
bcc ZeroLoop
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Now we bump the page counter and look at the method. If it
|
|
; is draft printing then do something, else we open a picture.
|
|
;
|
|
|
|
inc iDocPage ;increment the document page
|
|
|
|
lda method ;get the printing method
|
|
bmi spoolPage ;branch if deferred
|
|
brl OpenPageDraft ;branch if immediate
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; DEFERRED Mode
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
spoolPage stz hNewPic ; start by zeroing handle to
|
|
stz hNewPic+2 ; picture.
|
|
|
|
lda iDocPage ; look at page number.
|
|
cmp hprint+prjob+ifstpage ; are we in range?
|
|
blt exitnow ; no, get out now
|
|
dea
|
|
cmp hprint+prjob+ilstpage ; yes-start a picture
|
|
blt continue
|
|
;
|
|
;We get here when we are out of page range
|
|
;
|
|
exitnow brl NoErrorExit
|
|
|
|
continue ;
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Lets look at the page frame pointer that was passed. If it is NIL,
|
|
; we replace it with a pointer to rPage.
|
|
;
|
|
lda PageFramePtr,s ;get passed pointer
|
|
ora PageFramePtr+2,s
|
|
bne UserHasFramePtr ;branch if NIl
|
|
|
|
lda #hprint+prInfoPT+rpage
|
|
sta PageFramePtr,s
|
|
lda #^hprint+prInfoPT+rpage
|
|
sta PageFramePtr+2,s
|
|
|
|
UserHasFramePtr ;
|
|
|
|
pha
|
|
pha
|
|
lda PageFramePtr+4+2,s ;get PageFramePointer from stack
|
|
pha
|
|
lda PageFramePtr+4+2,s
|
|
pha
|
|
_openpicture ;open a picture
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; We leave result of open picture on stack until we deref
|
|
; the pic list below.
|
|
;
|
|
;
|
|
; Bump the picture list counter to reflect current page
|
|
;
|
|
|
|
inc PicListCount
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; PicListCount is used to test if hPicList is large to enough
|
|
; to hold the number of pages in the document. It counts from
|
|
; 1 to 20, since we increase memory 20 pages at a time. This
|
|
; variable is initialised in PrOpenDoc.
|
|
;
|
|
|
|
lda PicListCount
|
|
cmp #21 ; run out of allocated memory?
|
|
blt EnoughMem ; not yet
|
|
|
|
pha ; space for size
|
|
pha
|
|
PushLong hPicList
|
|
_GetHandleSize ; get current block size
|
|
|
|
pla ; current size
|
|
clc
|
|
adc #20*4 ; increase it by another 20 pages
|
|
pha ; new size
|
|
PushLong hPicList
|
|
_SetHandleSize ; set new block size
|
|
; MEMERR!
|
|
|
|
EnoughMem lda [hPicList] ; deref the pic list
|
|
sta pPicList
|
|
ldy #2
|
|
lda [hPicList],y
|
|
sta pPicList+2
|
|
|
|
lda iPagenum ; use iPageNum as index into
|
|
asl a ; pic list
|
|
asl a
|
|
tay
|
|
pla ; now put picture handle into
|
|
sta [pPicList],y ; pic list
|
|
sta hNewPic ; and in hNewPic
|
|
iny
|
|
iny
|
|
pla ; (high word too)
|
|
sta [pPicList],y
|
|
sta hNewPic+2
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set the cliprgn and visrgn to the sizing Framing rect
|
|
;
|
|
lda PageFramePtr+2,s
|
|
pha
|
|
lda PageFramePtr+2,s
|
|
pha
|
|
_cliprect
|
|
|
|
pushlong #0 ; and the vis rect!
|
|
_getcliphandle
|
|
_setvisrgn
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Lets set the port rect to this frameing rect too.
|
|
;
|
|
lda PageFramePtr+2,s
|
|
pha
|
|
lda PageFramePtr+2,s
|
|
pha
|
|
_SetPortRect
|
|
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Bump the page number
|
|
;
|
|
inc ipagenum
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; We are done.
|
|
;
|
|
|
|
NoErrorExit ;
|
|
lda #0
|
|
plb
|
|
pld
|
|
jmp Exit8
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; IMMEDIATE Mode
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
OpenPageDraft ;
|
|
;-----------------------------------------------------------
|
|
;
|
|
; If this is a page that will be printed, then we install
|
|
; printing procs.
|
|
;
|
|
lda iDocPage ; look at page number.
|
|
cmp hprint+prjob+ifstpage ; are we in range?
|
|
blt NoErrorExit ; no, get out now
|
|
dea
|
|
cmp hprint+prjob+ilstpage ; yes-start a picture
|
|
bge NoErrorExit
|
|
|
|
lda #1 ; so we know to zap the graphprocs
|
|
sta DraftFlag ; on a draft-mode cancel.
|
|
|
|
PushLong #ProcsTable ; put std procs in table
|
|
_SetStdProcs
|
|
|
|
lda #<Drafttext-1 ; Put our text proc in table
|
|
sta ProcsTable
|
|
lda #^Drafttext-1
|
|
sta ProcsTable+2
|
|
lda #<Pixel-1 ; Put our pixel proc in table
|
|
sta ProcsTable+$20
|
|
lda #^Pixel-1
|
|
sta ProcsTable+$22
|
|
|
|
PushLong #ProcsTable ; put pointer to our table in
|
|
_SetGrafProcs ; the graf port
|
|
|
|
bra NoErrorExit
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Here's where we keep the proc table.
|
|
;
|
|
EXPORT ProcsTable, DraftFlag
|
|
ProcsTable DS.B 16*4
|
|
|
|
DraftFlag DS.W 1
|
|
|
|
ENDP
|
|
EJECT
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
;
|
|
; NAME: PrClosePage
|
|
;
|
|
; PURPOSE: High level printer routine "_PrClosePage" which closes the page
|
|
;
|
|
; PASSED: PrinterGrafPortPtr POINTER, to GrafPort to be used
|
|
;
|
|
; RETURNED: (NONE)
|
|
;
|
|
;******************************************************************************
|
|
;******************************************************************************
|
|
PrClosePage PROC EXPORT
|
|
|
|
DefineStack
|
|
OrigD word 0
|
|
OrigB byte 0
|
|
rtl1 block 3
|
|
rtl2 block 3
|
|
PortPtr long 0
|
|
|
|
pha
|
|
lda >iPrErr ;see if any errors
|
|
beq Continue ;branch if none
|
|
|
|
cmp #PortNotOn ;see if port-not-on error
|
|
bne Continue ;branch if none
|
|
plx
|
|
jmp Exit4
|
|
|
|
Continue ; ;save registers and setup environment
|
|
pla
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Look at method and go to correct routine.
|
|
;
|
|
|
|
lda method ;look at method
|
|
bpl ClosePageDraft ;branch if immediate mode
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; DEFERRED Mode
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
lda hNewPic ; if there is no picture then
|
|
ora hNewPic+2 ; we are done.
|
|
beq NoErrorExit ;branch if no picture
|
|
|
|
lda PortPtr+2,s
|
|
pha
|
|
lda PortPtr+2,s
|
|
pha
|
|
_SetPort ;set the graf port
|
|
|
|
; Check for Picture error. If one has happened, don't close the picture, because this
|
|
; can blast the clip rgn under System 5.0.
|
|
tool _GetPicSave,out=(ax:l)
|
|
cpx #$FFFF
|
|
bne @closeit
|
|
|
|
tool _SetPicSave,in=(#0:l)
|
|
bra @picErr
|
|
|
|
@closeIt _ClosePicture ;close the picture
|
|
bcc NoErrorExit
|
|
|
|
@picErr lda #$0201
|
|
sta >iPrErr
|
|
bra errorExit
|
|
|
|
NoErrorExit lda #0
|
|
errorExit plb
|
|
pld
|
|
jmp Exit4
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; IMMEDIATE Mode
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
ClosePageDraft ;
|
|
;------------------------------------------------------------
|
|
;
|
|
; For draft printing we make LLD new page call. (unless
|
|
; we've reached the end of the pages to print.
|
|
;
|
|
|
|
lda iDocPage
|
|
cmp hprint+prjob+ifstpage
|
|
blt exitclosenow
|
|
dea
|
|
cmp hprint+prjob+ilstpage
|
|
bge exitclosenow
|
|
|
|
jsl newpage
|
|
|
|
exitclosenow bra NoErrorExit
|
|
|
|
ENDP
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: OurGetHandle
|
|
*
|
|
* PURPOSE: Gets a handle to memory.
|
|
*
|
|
* PASSED: (A-reg.) size passed in a-reg.
|
|
* (X-reg.) attributes passed in x-register.
|
|
*
|
|
* RETURNED: A Handle is returned in A & X registers unless there is a
|
|
* memory manager error (carry set) in which case the error
|
|
; number returns in the A-reg.
|
|
*
|
|
;------------------------------------------------------------------------------
|
|
OurGetHandle PROC EXPORT
|
|
|
|
pha
|
|
pha
|
|
pea 0
|
|
pha amount requested.
|
|
PushWord UserID your ID
|
|
phx attributes
|
|
pea 0
|
|
pea 0
|
|
_NewHandle result on the stack
|
|
bcs AnError
|
|
|
|
pla
|
|
plx
|
|
rts
|
|
|
|
;We get here if an error occured trying to get a handle
|
|
AnError plx
|
|
plx
|
|
rts
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; CalcBandSize
|
|
;
|
|
; This code was ripped out of CiXMetrics to be called seperately. ÑMSL
|
|
;
|
|
CalcBandSize PROC EXPORT
|
|
|
|
* now calculate iBandV ,iBandH ,iRowBytes and iDevBytes
|
|
|
|
* iBandV= landscape(32,hprint+prInfo+rPage+Bottom'*2 if best or 50%')
|
|
* iBandH= landscape(hprint+prInfo+rPage+Right'*2 if best or 50%',32)
|
|
* iRowBytes= iBandH div (2:4),resolution
|
|
* iDevBytes = iBandV * iRowBytes
|
|
|
|
|
|
;
|
|
;This calculates the print bands vertical resolution
|
|
;
|
|
* iBandV= landscape(32,hprint+prInfo+rPage+Bottom'*2 if best or 50%')
|
|
lda #f1
|
|
and hprint+prstl+wDev
|
|
bne Port5 ;branch if portrait
|
|
|
|
lda hprint+prInfo+rPage+Bottom ;get bottom
|
|
pha
|
|
|
|
lda #f3 ;see if 50%
|
|
and hprint+prstl+wDev
|
|
bne testbest ;branch if not 50%
|
|
pla
|
|
asl a
|
|
bra Land5
|
|
|
|
testbest ;
|
|
lda #f0 ;see if BEST
|
|
and hprint+prstl+wDev
|
|
beq notbest ;branch if not BEST
|
|
pla
|
|
asl a
|
|
bra Land5
|
|
|
|
notbest ;
|
|
pla
|
|
bra Land5
|
|
|
|
Port5 lda bandheight
|
|
Land5 ;
|
|
sta Hprint+PrXinfo+iBandV ;set the print bands vert. res.
|
|
|
|
;
|
|
;This calculates the print bands horizontal resolution
|
|
;
|
|
* iBandH= landscape(hprint+prInfo+rPage+Right'*2 if best or 50%',32)
|
|
lda #f1
|
|
and hprint+prstl+wDev
|
|
beq Land6 ;branch if landscape
|
|
|
|
lda hprint+prInfo+rPage+Right ;get right
|
|
pha
|
|
|
|
lda #f3 ;see if 50%
|
|
and hprint+prstl+wDev
|
|
bne testbest2 ;branch if not best
|
|
pla
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
asl a
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
bra Port6
|
|
|
|
testbest2 ;
|
|
lda #f0 ;see if BEST
|
|
and hprint+prstl+wDev
|
|
beq notbest2 ;branch if not BEST
|
|
pla
|
|
asl a
|
|
bra Port6
|
|
|
|
notbest2 ;
|
|
pla
|
|
bra Port6
|
|
|
|
Land6 lda bandheight
|
|
Port6 ;
|
|
sta Hprint+PrXinfo+iBandH ;set the print bands Horz. res.
|
|
|
|
;
|
|
;This calculates the print bands bytes/row
|
|
;
|
|
* iRowBytes= iBandH div (2:4),resolution
|
|
lda Hprint+PrXinfo+iBandH
|
|
lsr a
|
|
ldx resolution
|
|
beq done
|
|
lsr a
|
|
done sta Hprint+PrXinfo+iRowBytes ;set the bytes/row
|
|
|
|
;
|
|
;This calculates the total number of bytes (bytes per row times number of bands)
|
|
;
|
|
* iDevBytes = iBandV * iRowBytes
|
|
PushLong #0
|
|
lda Hprint+PrXinfo+iBandV
|
|
pha
|
|
lda Hprint+PrXinfo+iRowBytes
|
|
pha
|
|
_Multiply
|
|
pla
|
|
sta Hprint+PrXinfo+iDevBytes ;set the total no. of bytes
|
|
pla
|
|
beq DidCBandSize ; if'n its more than a bank,
|
|
lsr bandheight ; 1/2 it & keep trying...
|
|
brl CalcBandSize
|
|
|
|
DidCBandSize rts
|
|
ENDP
|
|
|
|
|
|
; JobDialog
|
|
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: JobDialog
|
|
;
|
|
; PURPOSE: Does most of the work for "_PrJobDialog"
|
|
;
|
|
; PASSED: (None)
|
|
;
|
|
; RETURNED: (None)
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
|
|
* buttonstate for JobDialog
|
|
* +0 best
|
|
* +2*1 faster
|
|
* +2*2 Draft
|
|
* +2*3 all pages
|
|
* +2*4 from pages
|
|
* +2*5 paper auto
|
|
* +2*6 paper hand
|
|
* +2*7 value for From
|
|
* +2*8 Value for To
|
|
* +2*9 value for Copies
|
|
* +2*10 color/bw
|
|
* +2*11 darker
|
|
|
|
JobDialog PROC EXPORT
|
|
;
|
|
;Get the pointer to the current grafport
|
|
;
|
|
PushLong #0
|
|
_getport
|
|
|
|
;
|
|
;Get the master SCB
|
|
;
|
|
pha
|
|
_GetMasterSCB ;get the SCB
|
|
pla
|
|
sta DeadLoc ;save it
|
|
;
|
|
;Calculate the dialog boxes width
|
|
;
|
|
lda StyleRect+6
|
|
sec
|
|
sbc StyleRect+2
|
|
sta Stylewidth
|
|
;
|
|
;This calculates the dialog boxes LEFT and RIGHT (depending on 320 or 640 mode)
|
|
lda deadloc ;get saved SCB
|
|
and #$80 ;look at mode ($0=320, $80=640)
|
|
beq loc320
|
|
lda #640 ;get 640
|
|
bne loc640
|
|
loc320 ;
|
|
lda #320 ;get 320
|
|
loc640 ;
|
|
sec
|
|
sbc StyleWidth
|
|
lsr a
|
|
sta StyleRect+2 ;adjust job dialogs LEFT
|
|
sta JobDTemplate+2 ;DAN H. adjust template
|
|
clc
|
|
adc StyleWidth
|
|
sta StyleRect+6 ;adjust job dialogs RIGHT
|
|
sta JobDTemplate+6 ;DAN H. adjust template
|
|
|
|
;
|
|
;This inits. the button item states
|
|
;
|
|
ldy #2*6 ;init. buttonstate index
|
|
ldx #6*24 ;init. JDRB template index
|
|
IBitemState ;
|
|
stz JDRB0,x ;init. state to off
|
|
lda buttonstate,y ;get button state
|
|
bpl IsOff1
|
|
lda #1
|
|
sta JDRB0,x ;set state to on
|
|
IsOff1 ;
|
|
txa ;get y-index
|
|
sec
|
|
sbc #24 ;move to next item template
|
|
tax
|
|
dey
|
|
dey
|
|
bpl IBitemState
|
|
|
|
;Do COLOR check box differently
|
|
stz JDRB10 ;init. to off
|
|
lda buttonstate+2*10 ;get buttonstate for color
|
|
bpl over10 ;branch if off
|
|
lda #$ffff ;set to selected
|
|
sta JDRB10
|
|
over10 ;
|
|
stz JDRB11 ;init. to off
|
|
lda buttonstate+2*11 ;get buttonstate for color
|
|
bpl over11 ;branch if off
|
|
lda #$ffff ;set to selected
|
|
sta JDRB11
|
|
over11 ;
|
|
;
|
|
;This starts the modal dialog
|
|
;
|
|
PushLong #0
|
|
Pushptr JobDTemplate ;The dialogs template
|
|
_GetNewModalDialog ;creates a new modal dialog
|
|
|
|
pla
|
|
sta pScreenport ;save the dialogs handle
|
|
pla
|
|
sta pScreenport+2
|
|
;
|
|
;Set the dialog as the current port and set the origin to zero
|
|
;
|
|
pushlong pscreenport
|
|
_Setport
|
|
pushlong #0
|
|
_setOrigin
|
|
;
|
|
; draw the upper line
|
|
;
|
|
pushlong l1
|
|
_moveto
|
|
pushlong l2
|
|
_lineto
|
|
;
|
|
* let's draw the inactive strings (printers name/ports name)
|
|
;
|
|
|
|
PushLong namepos ;move to where to put printer name
|
|
_moveto
|
|
PushLong #0
|
|
_PmGetPrinterName ;get the printer types name
|
|
_DrawString ;draw it
|
|
PushPtr SlashStr
|
|
_DrawString ;draw a "/"
|
|
PushLong #0
|
|
_PmGetPortName ;get the ports name
|
|
_DrawString ;draw it
|
|
|
|
;------------------------------------------------------------------------------
|
|
;This draws the inactive strings using tables
|
|
;------------------------------------------------------------------------------
|
|
lda JIstrnum ;get number of strings to draw
|
|
dea
|
|
asl a
|
|
asl a
|
|
tax ;use as an index
|
|
|
|
strloop phx ;save index
|
|
lda JIposlist+2,x ;get position to draw at
|
|
pha
|
|
lda JIposlist,x
|
|
pha
|
|
_moveto ;move to the position
|
|
plx
|
|
phx
|
|
lda JIstrlist+2,x ;get address of text to draw
|
|
pha
|
|
lda JIstrlist,x
|
|
pha
|
|
_drawstring ;draw the text
|
|
plx
|
|
dex
|
|
dex
|
|
dex
|
|
dex
|
|
bpl strloop ;loop for all strings in table
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; This is the modal dialog loop
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
loopModal ;
|
|
PushWord #0
|
|
PushLong #JobFilter+$80000000 ;use filter proc. and standard
|
|
_modalDialog
|
|
pla
|
|
beq loopModal ;loop until a response from user
|
|
|
|
cmp #15 ;see if valid item selected
|
|
bge loopModal ;branch if invalid
|
|
;
|
|
;Convert item selected and vector to appropriate routine to handle it
|
|
;
|
|
asl a ;convert itme to index
|
|
tax
|
|
jmp (Action-2,x) ;vector to routine to handle item
|
|
|
|
Action ;
|
|
|
|
DC.W S_OkEvent ;1
|
|
DC.W S_Cancelevent ;2 (Cancel button)
|
|
DC.W S_Qual ;3
|
|
DC.W S_Qual ;4
|
|
DC.W S_Qual ;5
|
|
DC.W S_Page ;6 (ALL radio button)
|
|
DC.W S_Page ;7 (FROM radio button)
|
|
DC.W S_Copie ;8
|
|
DC.W S_Copie ;9
|
|
DC.W S_Copies ;10
|
|
DC.W S_To ;11 (TO line edit box)
|
|
DC.W S_From ;12 (FROM line edit box)
|
|
DC.W S_Color ;13 (Color check box)
|
|
DC.W S_Darker ;14 (Darker check box)
|
|
;
|
|
;We vector here on OK button
|
|
;
|
|
S_okEvent ;
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #13
|
|
_GetDItemValue
|
|
pla
|
|
sta buttonstate+2*10
|
|
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #14
|
|
_GetDItemValue
|
|
pla
|
|
sta buttonstate+2*11
|
|
|
|
PushLong pscreenport
|
|
PushWord #10
|
|
PushPtr CopieFinalValue
|
|
_GetIText
|
|
pushword #0
|
|
pushptr CopieFinalValue+1
|
|
lda CopieFinalValue
|
|
and #$07
|
|
pha
|
|
pushword #0
|
|
_Dec2int
|
|
pla
|
|
sta Buttonstate+2*9
|
|
|
|
lda buttonstate+2*3 ; check if all is on, if so, do not
|
|
bmi nopageupdate ; update 'from' & 'to' in buttonstate
|
|
PushLong pscreenport
|
|
PushWord #12
|
|
PushPtr FromFinalValue
|
|
_GetIText
|
|
lda FromFinalValue
|
|
and #7
|
|
beq nofrom
|
|
|
|
pushword #0
|
|
pushptr FromFinalValue+1
|
|
lda FromFinalValue
|
|
and #$07
|
|
pha
|
|
pushword #0
|
|
_Dec2int
|
|
pla
|
|
sta Buttonstate+2*7
|
|
nofrom ;
|
|
PushLong pscreenport
|
|
PushWord #11
|
|
PushPtr ToFinalValue
|
|
_GetIText
|
|
lda ToFinalValue
|
|
and #$07
|
|
beq nopageupdate
|
|
|
|
pushword #0
|
|
pushptr ToFinalValue+1
|
|
lda ToFinalValue
|
|
and #$07
|
|
pha
|
|
pushword #0
|
|
_Dec2int
|
|
pla
|
|
sta Buttonstate+2*8
|
|
nopageupdate ;
|
|
lda #$ffff
|
|
sta IfCancelled
|
|
brl fin
|
|
|
|
;
|
|
;We vector here on CANCEL button
|
|
;
|
|
S_CancelEvent ;
|
|
lda #0
|
|
sta IfCancelled ;set if cancelled
|
|
brl fin
|
|
|
|
;
|
|
;We vector here on a print quality radio button selection
|
|
;
|
|
S_Qual ;
|
|
sec
|
|
sbc #6
|
|
tax
|
|
lda buttonState,x Give me the item
|
|
bmi PaperDone
|
|
phx
|
|
|
|
* clear the current one
|
|
ldx #0
|
|
searchmore lda buttonState,x
|
|
bmi clearit
|
|
inx
|
|
inx
|
|
cpx #3*2
|
|
bne searchmore
|
|
bra PaperDone
|
|
clearit lda #0
|
|
sta buttonState,x
|
|
txa
|
|
lsr a
|
|
clc
|
|
adc #3
|
|
tax
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
phx
|
|
_SetDItemValue
|
|
* Mark the new one
|
|
|
|
plx
|
|
phx
|
|
lda #$FFFF
|
|
sta buttonstate,x
|
|
pla
|
|
lsr a
|
|
clc
|
|
adc #3
|
|
tax
|
|
pushword #1
|
|
Pushlong pScreenPort
|
|
phx
|
|
_SetDItemValue
|
|
|
|
PaperDone brl LoopModal
|
|
|
|
;
|
|
;We vector here on page button
|
|
;
|
|
S_Page ;
|
|
tay
|
|
sec
|
|
sbc #6
|
|
tax
|
|
lda buttonState,x Give me the item
|
|
bmi PaperDone
|
|
cpx #2*3 * button n 4
|
|
beq doall
|
|
|
|
S_Page2 ;
|
|
cpy #16 ;value has been doubled by now
|
|
bge ToBox ;"To or From" clicked, dont select text
|
|
|
|
Pushlong pScreenPort
|
|
PushWord #12 ;id of From edit item box
|
|
PushWord #0 ;start
|
|
PushWord #4 ;stop
|
|
_SelectIText ;select the FROM edit item box
|
|
|
|
* do from to.
|
|
ToBox pushword #1
|
|
Pushlong pScreenPort
|
|
Pushword #7
|
|
_SetDItemValue ;ON with FROM radio button
|
|
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #6
|
|
_SetDItemValue ;OFF with ALL radio button
|
|
|
|
lda #0
|
|
ldx #2*3
|
|
sta buttonstate,x
|
|
inx
|
|
inx
|
|
dea
|
|
sta buttonstate,x
|
|
brl LoopModal
|
|
doAll ;
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #7
|
|
_SetDItemValue
|
|
pushword #1
|
|
Pushlong pScreenPort
|
|
Pushword #6
|
|
_SetDItemValue
|
|
lda #$ffff
|
|
ldx #2*3
|
|
sta buttonstate,x
|
|
inx
|
|
inx
|
|
ina
|
|
sta buttonstate,x
|
|
CopieDone brl LoopModal
|
|
|
|
;
|
|
;We vector here on a paper feed radio button (AUTOMATIC, HAND FEED)
|
|
S_Copie ;
|
|
sec
|
|
sbc #6
|
|
tax
|
|
lda buttonState,x Give me the item
|
|
bmi CopieDone
|
|
cpx #2*5 * button n 6
|
|
beq doAuto
|
|
|
|
;We get here when its a HAND FEED
|
|
pushword #1
|
|
Pushlong pScreenPort
|
|
Pushword #9
|
|
_SetDItemValue
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #8
|
|
_SetDItemValue
|
|
lda #0
|
|
ldx #2*5
|
|
sta buttonstate,x
|
|
inx
|
|
inx
|
|
dea
|
|
sta buttonstate,x
|
|
brl LoopModal
|
|
|
|
;We arrive here when its an AUTOMATIC
|
|
doAuto ;
|
|
pushword #1
|
|
Pushlong pScreenPort
|
|
Pushword #8
|
|
_SetDItemValue
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #9
|
|
_SetDItemValue
|
|
lda #$ffff
|
|
ldx #2*5
|
|
sta buttonstate,x
|
|
inx
|
|
inx
|
|
ina
|
|
sta buttonstate,x
|
|
brl LoopModal
|
|
|
|
;
|
|
;We vector here on COLOR check box selection
|
|
;
|
|
S_Color ;
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #13
|
|
_GetDItemValue
|
|
pla
|
|
eor #$ffff
|
|
pha
|
|
Pushlong pScreenPort
|
|
Pushword #13
|
|
_SetDItemValue
|
|
Brl LoopModal
|
|
|
|
S_Darker ;
|
|
pushword #0
|
|
Pushlong pScreenPort
|
|
Pushword #14
|
|
_GetDItemValue
|
|
pla
|
|
eor #$ffff
|
|
pha
|
|
Pushlong pScreenPort
|
|
Pushword #14
|
|
_SetDItemValue
|
|
Brl LoopModal
|
|
|
|
;
|
|
;We vector here on a COPIES edit item
|
|
;
|
|
S_Copies ;
|
|
brl LoopModal
|
|
|
|
;
|
|
;We vector here on a FROM or TWO edit item selection
|
|
;
|
|
S_To ;
|
|
S_From ;
|
|
tay
|
|
lda #14
|
|
brl S_Page2
|
|
|
|
;
|
|
;We go here when the user is done and has selected either OK or CANCEL
|
|
;
|
|
IMPORT DraftModeQuality
|
|
fin
|
|
PushWord #0
|
|
PushWord #0
|
|
PushPtr EventRecord
|
|
_getNextEvent
|
|
pla
|
|
lda evtmods
|
|
and #$0900
|
|
sta DraftModeQuality
|
|
|
|
pushlong pscreenport
|
|
_CloseDialog
|
|
_setport
|
|
lda IfCancelled
|
|
rts
|
|
ENDP
|
|
|
|
|
|
; JobFilter
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: JobFilter
|
|
;
|
|
; PURPOSE: _PrJobDialog's filter procedure.
|
|
;
|
|
; PASSED: Result WORD, (space for result)
|
|
; TheDialog LONG, pointer to the dialog's grafport
|
|
; Event LONG, pointer to the event
|
|
; ItemHit LONG, pointer to the item hit
|
|
;
|
|
; RETURNED: IgnoreFlag WORD, boolean, TRUE if event is to be
|
|
; ignored, FALSE if calling routine
|
|
; should handle event.
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
Export Jobfilter
|
|
Jobfilter PROC
|
|
inButtDwn equ 1
|
|
KeyDown equ 3
|
|
AutoKey equ 5
|
|
ItemHit equ 7
|
|
Event equ ItemHit+4
|
|
TheDialog equ Event+4
|
|
Result equ TheDialog+4
|
|
TabKey equ 9
|
|
ReturnKey equ 13
|
|
deleteKey equ 127
|
|
|
|
phd
|
|
phb
|
|
phk
|
|
plb
|
|
tsc
|
|
tcd
|
|
|
|
lda #0
|
|
sta result ;init. result to true
|
|
;
|
|
;Copy the event record
|
|
;
|
|
ldy #14
|
|
copyEvent lda [Event],y
|
|
sta EventRecord,y
|
|
dey
|
|
dey
|
|
bpl CopyEvent
|
|
|
|
lda ZeroPage
|
|
tcd ;get zero page
|
|
|
|
lda EvtWhat ;see what type of event
|
|
cmp #KeyDown ;do KeyDown events
|
|
beq dokey
|
|
cmp #AutoKey ;do AutoKey events
|
|
beq dokey
|
|
brl notDown ;all other events pass thru.
|
|
;
|
|
;We get here when we have either a KeyDown or AutoKey events
|
|
;
|
|
Dokey ;
|
|
lda evtmsg
|
|
cmp #TabKey ;do tab key
|
|
beq KeyAllowed
|
|
cmp #returnKey ;do return key
|
|
beq KeyAllowed
|
|
cmp #DeleteKey ;do delete key
|
|
beq KeyAllowed
|
|
cmp #$30
|
|
blt notallowed
|
|
cmp #$3a
|
|
bge notallowed
|
|
bra KeyAllowed
|
|
;
|
|
;We get here when we get an event that we don't want
|
|
;
|
|
notallowed ;
|
|
lda #-1
|
|
sta result,s ;set results for false
|
|
|
|
KeyAllowed ;
|
|
notDown ;
|
|
plb
|
|
pld
|
|
lda 0,s
|
|
sta 12,s
|
|
lda 2,s
|
|
sta 14,s
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
rtl
|
|
ENDP
|
|
|
|
|
|
; StyleDialog
|
|
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: StyleDialog
|
|
;
|
|
; PURPOSE: Does most of the work for "_PrStlDialog"
|
|
;
|
|
; PASSED: (None)
|
|
;
|
|
; RETURNED: (A-reg.)=0 OK, =$ffff CANCEL
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
|
|
* buttonstate for Style
|
|
* +0 US Letter
|
|
* +2*1 US Legal
|
|
* +2*2 A4 Letter
|
|
* +2*3 International Fanfold
|
|
* +2*4 Reserved for Computer Paper
|
|
* +2*5 Reserved for Tall Adjusted
|
|
* +2*6 Reserved for 50% reduction
|
|
* +2*7 No Gaps Between Pages
|
|
* +2*8 Portrait
|
|
* +2*9 Landscape
|
|
|
|
Export StyleDialog
|
|
StyleDialog PROC
|
|
;
|
|
;Get the pointer to the current grafport
|
|
;
|
|
pushlong #0
|
|
_getport ;get the current port
|
|
|
|
;
|
|
;Get the master SCB
|
|
;
|
|
pha
|
|
_GetMasterSCB ;get the SCB
|
|
pla
|
|
sta DeadLoc ;save SCB
|
|
|
|
;
|
|
;Calculate the dialogs boxs width
|
|
;
|
|
lda StyleRect+6
|
|
sec
|
|
sbc StyleRect+2
|
|
sta Stylewidth ;save width of dialog box
|
|
|
|
;
|
|
;This calculates the dialog boxes LEFT and RIGHT (depending on 320 or 640 mode)
|
|
;
|
|
lda deadloc ;get saved SCB
|
|
and #$80 ;look at mode (0=320, 1=640)
|
|
sta landsc_p
|
|
sta portrait_p
|
|
beq loc320 ;branch if 320 mode
|
|
lda #640 ;get 640
|
|
bne loc640
|
|
loc320 ;
|
|
lda #320 ;get 320
|
|
loc640 ;
|
|
sec
|
|
sbc StyleWidth
|
|
lsr a
|
|
sta StyleRect+2 ;adjust style dialogs LEFT
|
|
clc
|
|
adc StyleWidth
|
|
sta StyleRect+6 ;adjust style dialogs RIGHT
|
|
|
|
;
|
|
;This sets the appropriate pixel width for the portrait/landscape image
|
|
;
|
|
* update the bitmap for 320/640
|
|
lda deadloc ;get save SCB
|
|
and #$80 ;look at mode bit
|
|
beq w320 ;branch if 320
|
|
lda pixel640 ;get the pixel width for 640
|
|
bne ww
|
|
w320 lda pixel320 ;get the pixel width for 320
|
|
ww sta pixelwidth ;set the pixel width
|
|
sta portrait_p+14 ;set the portriat
|
|
sta landsc_p+14 ;set the landscape
|
|
sta portrait_r+6 ;set the portriat rectangle
|
|
sta landsc_r+6 ;set the landscape rectangle
|
|
clc
|
|
adc dstbitr1+2
|
|
sta dstbitr1+6
|
|
|
|
;
|
|
;Adjust the left and right of the destination rectangle?
|
|
;
|
|
lda pixelwidth
|
|
clc
|
|
adc #4
|
|
adc dstbitf1+2
|
|
sta dstbitf1+6
|
|
|
|
;
|
|
;????????????
|
|
;
|
|
lda pixelwidth
|
|
clc
|
|
adc dstbitr2+2
|
|
sta dstbitr2+6
|
|
lda pixelwidth
|
|
clc
|
|
adc #4
|
|
adc dstbitf2+2
|
|
sta dstbitf2+6
|
|
|
|
|
|
;
|
|
;This starts the modal dialog
|
|
;
|
|
PushLong #0
|
|
Pushptr StyleRect ;stylerect defines the dialog box
|
|
Pushword #1
|
|
PushLong #0
|
|
_NewModalDialog ;get a new modal dialog
|
|
pla
|
|
sta pScreenport ;save the dialog boxes handle
|
|
pla
|
|
sta pScreenport+2
|
|
;
|
|
;Set the dialog as the current port and set the origin to 0
|
|
;
|
|
pushlong pScreenport
|
|
_Setport ;set the current port to the dialog
|
|
pushlong #0
|
|
_setOrigin ;set the origin to zero
|
|
;
|
|
* draw the upper line
|
|
;
|
|
pushlong l1
|
|
_moveto
|
|
pushlong l2
|
|
_lineto
|
|
;
|
|
*let's draw the inactive strings (printers name/ports name)
|
|
;
|
|
|
|
PushLong namepos ;move to where to put printer name
|
|
_moveto
|
|
PushLong #0
|
|
_PmGetPrinterName ;get the printer types name
|
|
_DrawString ;draw it
|
|
PushPtr SlashStr
|
|
_DrawString ;draw a "/" char.
|
|
PushLong #0
|
|
_PmGetPortName ;get the ports name
|
|
_DrawString ;draw it
|
|
|
|
;------------------------------------------------------------------------------
|
|
;This draws the inactive strings using tables
|
|
;------------------------------------------------------------------------------
|
|
lda Istrnum ;get number of strings to draw
|
|
dea
|
|
asl a
|
|
asl a
|
|
tax ;use as an index
|
|
|
|
strloop phx ;save index
|
|
lda Iposlist+2,x ;get position to draw at
|
|
pha
|
|
lda Iposlist,x
|
|
pha
|
|
_moveto ;move to position
|
|
plx
|
|
phx
|
|
lda Istrlist+2,x ;get address of text to draw
|
|
pha
|
|
lda Istrlist,x
|
|
pha
|
|
_drawstring ;draw the text
|
|
plx
|
|
dex ;adjust index to next string
|
|
dex
|
|
dex
|
|
dex
|
|
bpl strloop ;loop for all strings in table
|
|
|
|
;
|
|
* create the OK Item
|
|
;
|
|
PushLong pScreenPort
|
|
Pushword #1 ;OK button (default for CR)
|
|
Pushptr OKrect
|
|
Pushword #ButtonItem
|
|
Pushptr okstr
|
|
PushWord #0
|
|
PushWord #0
|
|
PushLong #0
|
|
_newDItem
|
|
|
|
;
|
|
;Create the CANCEL button
|
|
;
|
|
PushLong pScreenPort
|
|
Pushword #2 cancel
|
|
Pushptr cancelrect
|
|
Pushword #ButtonItem
|
|
Pushptr cancelstr
|
|
PushWord #0
|
|
PushWord #0
|
|
PushLong #0
|
|
_newDItem
|
|
|
|
;
|
|
;* create the radio items
|
|
;
|
|
lda #0
|
|
Radioloop pha
|
|
asl a
|
|
asl a
|
|
tax ;X-reg. points to correct item in list
|
|
|
|
PushLong pScreenport ;dialogs port
|
|
|
|
lda 5,s ;get the current item count off stack
|
|
clc
|
|
adc #3 ;start at 3 (1 is ok, 2 is cancel)
|
|
pha ;push the Id
|
|
lda ArectList+2,x ;push the items bounds rectangle
|
|
pha
|
|
lda ArectList,x
|
|
pha
|
|
cpx #7*4 ;special case out type of item
|
|
blt rad
|
|
pushword #CheckItem ;we get here for a check item
|
|
bra com
|
|
rad ;
|
|
pushword #radioItem ;we get here for a radio item
|
|
com ;
|
|
lda AstrList+2,x ;push the items descriptor
|
|
pha
|
|
lda AstrList,x
|
|
pha
|
|
PushWord #0 ;Items value
|
|
|
|
cpx #5*4 ; If done with paper radio button
|
|
blt Family0 ; then change family # to 1 for
|
|
PushWord #1 ; VSize radio buttons
|
|
bra Next
|
|
|
|
Family0 PushWord #0 ;Items flag
|
|
Next PushLong #0 ;Items color
|
|
_newDItem ;Create the new item
|
|
pla ;get the saved counter
|
|
cmp #3
|
|
bne nojump ;do first four items
|
|
|
|
inc a ;skip 50% reduction
|
|
nojump ;
|
|
inc a ;goto NO GAPS
|
|
cmp AStrNum
|
|
bne Radioloop
|
|
;
|
|
;* draw the bitmaps for portrait/landscape
|
|
;
|
|
pushlong #0
|
|
_getport
|
|
pla
|
|
sta PP_portrait+4
|
|
sta PP_Landsc+4
|
|
pla
|
|
sta PP_portrait+6
|
|
sta PP_Landsc+6
|
|
|
|
Pushptr PP_portrait
|
|
_paintPixels ;paint portrait
|
|
Pushptr PP_Landsc
|
|
_paintPixels ;paint landscape
|
|
|
|
pushptr dstbitf1
|
|
_framerect ;frame portrait
|
|
pushptr dstbitf2
|
|
_framerect ;frame landscape
|
|
|
|
;
|
|
;Now determine invert the current selected mode for portriat/landscape
|
|
;
|
|
lda buttonstate+2*8 ;get portraits button state
|
|
bpl startLands ;branch if not selected
|
|
;
|
|
;we get here if portriat
|
|
;
|
|
Pushptr dstbitf1
|
|
_invertRect ;invert the portrait image
|
|
pushptr dstbitf1
|
|
_framerect ;frame the portrait image
|
|
bra startport
|
|
;
|
|
;We get here if landscape
|
|
;
|
|
startLands ;
|
|
Pushptr dstbitf2
|
|
_invertRect ;invert the landscape image
|
|
pushptr dstbitf2
|
|
_framerect ;frame the landscape image
|
|
|
|
;
|
|
;This gets the pointers to the control items
|
|
;
|
|
startPort ;
|
|
lda #1
|
|
GetptrLoop pha
|
|
tay
|
|
pushlong #0
|
|
pushlong pScreenPort
|
|
Phy
|
|
_GetControlDItem
|
|
lda 5,s
|
|
asl a
|
|
asl a
|
|
tax
|
|
pla
|
|
sta ptrList,x ;save the pointer in list
|
|
pla
|
|
sta ptrList+2,x
|
|
pla
|
|
ina
|
|
cmp #11+1
|
|
bne GetptrLoop
|
|
;
|
|
;This activates the radio buttons
|
|
;
|
|
lda #3
|
|
looop pha
|
|
asl a
|
|
tax
|
|
lda buttonstate-6,x
|
|
bpl forgetthisone
|
|
pla
|
|
pha
|
|
asl a
|
|
asl a
|
|
tax
|
|
ldy #1
|
|
jsr SetButtonValue
|
|
forgetthisone pla
|
|
ina
|
|
cmp #8
|
|
bne looop ; items 8 - 11 are not as normal
|
|
|
|
lda buttonstate+2*10 ; Normal Vsize
|
|
bpl Onto9 ; Not selected
|
|
ldx #8*4 ; item #8 is the oddest
|
|
ldy #1 ; ON
|
|
jsr SetButtonValue
|
|
|
|
Onto9 lda #9 ; Items 9 - 11
|
|
loop1 pha ; offset to buttonstate are
|
|
asl a ; different than that of 3 - 7
|
|
tax
|
|
lda buttonstate-8,x
|
|
bpl SkipIt
|
|
pla
|
|
pha
|
|
asl a
|
|
asl a
|
|
tax
|
|
ldy #1
|
|
jsr SetbuttonValue
|
|
SkipIt pla
|
|
ina
|
|
cmp #12
|
|
bne loop1
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
;This is the modal dialog loop
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
loopModal ;
|
|
PushWord #0
|
|
PushLong #StyleFilter+$80000000 ;handles portrait/lands. images
|
|
_modalDialog
|
|
pla
|
|
beq loopModal ;loop until a response
|
|
|
|
cmp #12 ;see if valid item
|
|
bge loopModal ;branch if not
|
|
;
|
|
;Now vector to correct routine to handle the item
|
|
;
|
|
asl a ;convert item number to index
|
|
tax
|
|
jmp (Action-2,x) ;vector to routine to handle item
|
|
|
|
Action ;
|
|
|
|
DC.W S_OkEvent 1
|
|
DC.W S_Cancelevent 2
|
|
DC.W S_Paper 3 - US Letter
|
|
DC.W S_Paper 4 - US Legal
|
|
DC.W S_Paper 5 - A4 Letter
|
|
DC.W S_Paper 6 - International fanfold
|
|
DC.W S_Paper 7 - Reserved for computer paper
|
|
DC.W S_Vsize 8 - Normal VSize
|
|
DC.W S_Vsize 9 - Condensed VSize
|
|
DC.W S_Spe 10 - 50%
|
|
DC.W S_Spe 11 - No Gap
|
|
|
|
|
|
;
|
|
;We vector here on OK button
|
|
;
|
|
S_okEvent ;
|
|
lda #$ffff
|
|
sta IfCancelled ;clear if cancled flag
|
|
brl fin
|
|
;
|
|
;We vector here on CANCEL button
|
|
;
|
|
S_CancelEvent ;
|
|
lda #0
|
|
sta IfCancelled ;set if cancled flag
|
|
brl fin
|
|
|
|
;
|
|
;We vector here on a paper radio button selection
|
|
;
|
|
S_paper ;
|
|
sec
|
|
sbc #6
|
|
tax
|
|
lda buttonState,x Give me the item
|
|
bmi PaperDone
|
|
phx
|
|
|
|
* clear the current one
|
|
ldx #0
|
|
searchmore lda buttonState,x
|
|
bmi clearit
|
|
inx
|
|
inx
|
|
cpx #5*2
|
|
bne searchmore
|
|
bra PaperDone
|
|
clearit lda #0
|
|
sta buttonState,x
|
|
txa
|
|
lsr a
|
|
clc
|
|
adc #3
|
|
asl a
|
|
asl a
|
|
tax
|
|
ldy #0
|
|
jsr SetButtonValue
|
|
|
|
* Mark the new one
|
|
|
|
plx
|
|
phx
|
|
lda #$FFFF
|
|
sta buttonstate,x
|
|
pla
|
|
lsr a
|
|
clc
|
|
adc #3
|
|
asl a
|
|
asl a
|
|
tax
|
|
ldy #1
|
|
jsr SetButtonValue
|
|
|
|
PaperDone brl LoopModal
|
|
|
|
;
|
|
; We vector here on a special size selection
|
|
;
|
|
S_VSize cmp #16 ; is it 2 x 8?
|
|
beq SetNormal ; yes, user picked normal
|
|
|
|
lda #0 ; user picked condensed - 9
|
|
sta buttonstate+2*10 ; normal off
|
|
dec a
|
|
sta buttonstate+2*5 ; condensed on
|
|
ldx #9*4 ; offset for condensed
|
|
ldy #1 ; ctrl value in y, we want ON now
|
|
jsr SetButtonValue
|
|
|
|
ldx #8*4 ; offset for normal
|
|
ldy #0 ; now we want OFF
|
|
jsr SetButtonValue
|
|
|
|
brl LoopModal
|
|
|
|
SetNormal ;
|
|
lda #0 ; user picked normal - 8
|
|
sta buttonstate+2*5 ; condensed on
|
|
dec a
|
|
sta buttonstate+2*10 ; normal off
|
|
ldx #9*4 ; offset for condensed
|
|
ldy #0 ; ctrl value in y, we want OFF now
|
|
jsr SetButtonValue
|
|
|
|
ldx #8*4 ; offset for normal
|
|
ldy #1 ; now we want ON
|
|
jsr SetButtonValue
|
|
|
|
brl LoopModal
|
|
|
|
S_Spe ;
|
|
pha
|
|
sec
|
|
sbc #8
|
|
tax
|
|
lda buttonState,x Give me the item
|
|
eor #$ffff
|
|
sta buttonstate,x
|
|
pla
|
|
asl a
|
|
tax
|
|
phx
|
|
pushword #0
|
|
lda PtrList+2,x
|
|
pha
|
|
lda PtrList,x
|
|
pha
|
|
_GetCtlValue
|
|
pla
|
|
plx
|
|
and #1
|
|
eor #1
|
|
tay
|
|
jsr SetbuttonValue
|
|
brl LoopModal
|
|
;
|
|
;We go here when the user has selected OK or CANCEL
|
|
;
|
|
fin pushlong pscreenport
|
|
_CloseDialog ;close the dialog box
|
|
_setport ;set back to the previous port
|
|
lda IfCancelled ;get the OK/CANCEL flag
|
|
rts
|
|
|
|
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: SetButtonValue
|
|
;
|
|
; PURPOSE: Sets the control value to the value passed in Y-reg.
|
|
;
|
|
; PASSED: (Y-reg.) 0 = clear, 1= set
|
|
; (X-reg.) offset to the table of handles
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
EXPORT SetButtonValue
|
|
SetButtonValue
|
|
|
|
phy
|
|
lda PtrList+2,x ; get handle to control
|
|
pha
|
|
lda PtrList,x
|
|
pha
|
|
_SetCtlValue ; set it
|
|
|
|
rts
|
|
|
|
ENDP
|
|
|
|
|
|
; StyleFilter
|
|
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: StyleFilter
|
|
;
|
|
; PURPOSE: Filter procedure for "StyleDialog" to detect when a button down
|
|
; event has occured on one of the portrait/landscape picture
|
|
; bitmaps.
|
|
;
|
|
; PASSED: Result WORD, (space for result)
|
|
; TheDialog LONG, pointer to the dialog's grafport
|
|
; Event LONG, pointer to the event
|
|
; ItemHit LONG, pointer to the item hit
|
|
;
|
|
; RETURNED: IgnoreFlag WORD, boolean, TRUE if event is to be
|
|
; ignored, FALSE if calling routine
|
|
; should handle event.
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
|
|
Stylefilter PROC EXPORT
|
|
inButtDwn equ 1
|
|
ItemHit equ 7
|
|
Event equ ItemHit+4
|
|
TheDialog equ Event+4
|
|
Result equ TheDialog+4
|
|
|
|
;Save registers and setup environment
|
|
phd
|
|
phb
|
|
phk
|
|
plb
|
|
tsc
|
|
tcd
|
|
|
|
lda #0
|
|
sta result ;init result to true
|
|
|
|
;Copy Event record
|
|
ldy #14
|
|
copyEvent lda [Event],y
|
|
sta EventRecord,y
|
|
dey
|
|
dey
|
|
bpl CopyEvent
|
|
|
|
lda ZeroPage
|
|
tcd
|
|
|
|
;Now see what kind of event it was
|
|
lda EvtWhat ;get kind of event
|
|
cmp #inButtDwn ;see if it was a button down
|
|
beq down
|
|
brl notDown ;exit if not
|
|
;
|
|
;We get here when we have a button down event
|
|
;
|
|
Down ;
|
|
|
|
;Now see if it was in one of the bitmap images
|
|
PushLong pScreenPort
|
|
_setPort
|
|
PushWord #0
|
|
PushWord #0
|
|
_setOrigin
|
|
pushptr EvtWhere
|
|
_globaltolocal
|
|
pha
|
|
pushptr EvtWhere
|
|
Pushptr dstbitf1
|
|
_ptInrect ;see if it is in the portrait bitmap
|
|
pla
|
|
beq NotIn1 ;branch if not
|
|
;
|
|
;We get here if it was a button down event in the portrait bitmap image
|
|
;
|
|
ldx #2*8
|
|
lda buttonstate,x ;get the current state
|
|
bpl invertthem ;branch if changed
|
|
brl notdown ;branch if no change
|
|
;
|
|
;We now test for in the landscape bitmap image
|
|
;
|
|
NotIn1 ;
|
|
pha ;for result
|
|
pushptr EvtWhere
|
|
Pushptr dstbitf2
|
|
_ptInrect
|
|
pla ;get result
|
|
beq NotDown ;branch if not in landscape bitmap
|
|
;
|
|
;We get here if it was a button down event in the landscape bitmap image
|
|
;
|
|
ldx #2*9
|
|
lda buttonstate,x ;look at the current state
|
|
bpl invertthem ;branch if changed
|
|
brl notdown ;branch if no change
|
|
;
|
|
;We get here when we need to change the portrait/landscape images
|
|
;
|
|
invertThem ;
|
|
ldx #2*8
|
|
lda buttonstate,x ;get the current portrait state
|
|
eor #$ffff
|
|
sta buttonstate,x ;invert it
|
|
inx
|
|
inx
|
|
lda buttonstate,x ;get the current landscape state
|
|
eor #$ffff
|
|
sta buttonstate,x ;invert it
|
|
|
|
Pushptr dstbitf1
|
|
_invertRect ;invert portrait image
|
|
pushptr dstbitf1
|
|
_framerect ;frame portrait image
|
|
Pushptr dstbitf2
|
|
_invertRect ;invert landscape image
|
|
pushptr dstbitf2
|
|
_framerect ;frame landscape image
|
|
;
|
|
;We get here when we are done or it wasn't a button down event
|
|
;
|
|
notDown ;
|
|
plb
|
|
pld
|
|
lda 0,s
|
|
sta 12,s
|
|
lda 2,s
|
|
sta 14,s
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
pla
|
|
rtl
|
|
ENDP
|
|
|
|
EJECT
|
|
; InfoDialogs
|
|
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; INFORMATION DIALOG ROUTINES
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
;------------------------------------------------------------------------------
|
|
|
|
|
|
InfoDialogs PROC EXPORT
|
|
;StatText equ 15
|
|
;ButtonItem equ 10
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: OpenInfoPrepare
|
|
;
|
|
; PURPOSE: Brings up window which indicates what is about to happen.
|
|
; IMMEDIATE MODE: "Printing in Draft mode ..."
|
|
; DEFERRED MODE: "Preparing Data ..."
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
EXPORT OpenInfoPrepare
|
|
OpenInfoPrepare
|
|
PushLong #0
|
|
_getport ;get current port and save it
|
|
|
|
pha
|
|
_GetMasterSCB ; check mode from SCB
|
|
pla
|
|
and #$80 ;see which mode
|
|
beq loc320 ;branch if 320 mode
|
|
;
|
|
;We get here if its 640 mode
|
|
;
|
|
lda infowidth640
|
|
sta StyleWidth ;set the style width for 640
|
|
lda #640 ;get 640
|
|
bne loc640 ;branch
|
|
;
|
|
;We get here if its 320 mode
|
|
;
|
|
loc320 ;
|
|
lda infowidth320
|
|
sta StyleWidth ;set the style width for 320
|
|
lda #320 ;get 320
|
|
;
|
|
;Remember: (A-reg. is 320 or 640 depending on mode)
|
|
;
|
|
loc640 ;
|
|
sec
|
|
sbc StyleWidth
|
|
lsr a
|
|
sta InfoRect+2 ;set left
|
|
clc
|
|
adc StyleWidth
|
|
sta InfoRect+6 ;set right
|
|
|
|
PushLong #0
|
|
PushPtr InfoWindow
|
|
_NewWindow ;bring up a new window
|
|
|
|
pla
|
|
sta infoDPort ;save it
|
|
pla
|
|
sta infoDPort+2
|
|
|
|
pushlong infoDPort
|
|
_setPort ;set it as current port
|
|
|
|
Pushlong InfoStrPos ;move to strings starting position
|
|
_moveto
|
|
|
|
lda method ;get method (immediate, deferred)
|
|
bpl draftStr ;branch if immediate
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Deferred Mode
|
|
;------------------------------------------------------------------------------
|
|
pushptr InfoStrPrep ;get string "Preparing Data ..."
|
|
bra DrawIt
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Immediate Mode
|
|
;------------------------------------------------------------------------------
|
|
draftStr ;
|
|
pushptr InfoStrDraft ;get string "Printing in Draft mode ..."
|
|
|
|
DrawIt _drawString ;draw the string in the window
|
|
|
|
_setPort ;restore the old port
|
|
|
|
rts
|
|
|
|
Eject
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: CloseInfo
|
|
;
|
|
; PURPOSE: Closes the info window.
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
EXPORT CloseInfo
|
|
CloseInfo
|
|
PushLong infoDPort
|
|
_closeWindow
|
|
rts
|
|
ENDP
|
|
|
|
|
|
Eject
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: OpenInfoPrinting
|
|
;
|
|
; PURPOSE: Prepares and draws the opening info window
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
OpenInfoPrinting PROC Export
|
|
|
|
;StatText equ 15
|
|
;ButtonItem equ 10
|
|
|
|
ByteOffset equ 5 ; since bitOffset is 40
|
|
ColorRibbon equ $0080
|
|
SheetFeeder equ $0040
|
|
PaperOut equ $0020
|
|
CoverOpen equ $0010
|
|
OffLine equ $0008
|
|
ShtFdrEmpty equ $0044
|
|
PaperJam equ $0004
|
|
PrinterFault equ $0002
|
|
HeadMoving equ $0001
|
|
PrinterBusy equ $8000
|
|
|
|
|
|
pha
|
|
_GetMasterSCB ; check mode
|
|
pla
|
|
and #$80
|
|
beq loc320 ;branch if 320 mode
|
|
|
|
;We arrive here if its 640 mode
|
|
lda infowidth640
|
|
sta StyleWidth ;set the width
|
|
lda #640
|
|
bra loc640
|
|
|
|
;We arrive here if its 320 mode
|
|
loc320 ;
|
|
lda infowidth320
|
|
sta StyleWidth ;set the width
|
|
lda #320
|
|
|
|
loc640 ;
|
|
sec
|
|
sbc StyleWidth
|
|
lsr a
|
|
sta InfoRect+2 ;set left
|
|
clc
|
|
adc StyleWidth
|
|
sta InfoRect+6 ;set right
|
|
|
|
PushLong #0
|
|
PushPtr InfoWindow
|
|
_NewWindow ;bring up the window
|
|
pla
|
|
sta infoDPort
|
|
pla
|
|
sta infoDPort+2
|
|
|
|
lda #PrintProcess ; go draw the string
|
|
ldx #^PrintProcess
|
|
jsr ShowString
|
|
|
|
jsr GetStatus
|
|
|
|
rts
|
|
EJECT
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: GetStatus
|
|
;
|
|
; PURPOSE: Checks for new status and displays the approapriate status message.
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
; status buffer structure:
|
|
; bytes 0-3 : system stuff
|
|
; byte 4 : length byte of string
|
|
; byte 5 : status bits
|
|
; 0: color $0080
|
|
; 1: sheetfeeder $0040
|
|
; 2: out of paper $0020
|
|
; 3: cover open $0010
|
|
; 4: printer off line $0008
|
|
; 5: paper jam $0004
|
|
; 6: printer fault $0002
|
|
; 7: print head is moving $0001
|
|
; byte 6 : more status bits
|
|
; 0: printer is busy $8000
|
|
;
|
|
; Special note: ShtFdrEmpty equ $0044
|
|
; If a sheetfeeder is installed, it send back "paper jam" when it is out of paper
|
|
; not the usual "out of paper" error.
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
EXPORT GetStatus
|
|
GetStatus
|
|
lda NoShowMessage ; do we need to do a status?
|
|
beq @1
|
|
brl ExitShowStatus ; non zero says no
|
|
|
|
@1 Jsr StatusPrinter ;see if its time to status device
|
|
bcc doit
|
|
rts
|
|
|
|
doit
|
|
ldx #byteOffset ; pick up the status bytes
|
|
lda InfoStrBuffer,x
|
|
tay ; save for further use
|
|
and #PaperOut ; mask out other bits
|
|
beq PaperNotOut
|
|
PaperOutMsg dec PStatus
|
|
lda #PaperOutStr ; set up for the appropriate
|
|
ldx #^PaperOutStr ; string
|
|
bra ShowString ; go and display it
|
|
|
|
PaperNotOut
|
|
tya
|
|
and #CoverOpen
|
|
beq CoverNotOpen
|
|
dec PStatus
|
|
lda #CoverOpenStr
|
|
ldx #^CoverOpenStr
|
|
bra ShowString
|
|
|
|
CoverNotOpen
|
|
tya
|
|
and #PaperJam
|
|
beq PaperNotJam
|
|
tya
|
|
and #ShtFdrEmpty
|
|
cmp #PaperJam
|
|
bne PaperOutMsg
|
|
dec PStatus
|
|
lda #PaperJamStr
|
|
ldx #^PaperJamStr
|
|
bra ShowString
|
|
|
|
PaperNotJam
|
|
tya
|
|
and #OffLine
|
|
beq NoProblem
|
|
dec PStatus
|
|
lda #OffLineStr
|
|
ldx #^OffLineStr
|
|
bra ShowString
|
|
|
|
NoProblem stz PStatus
|
|
lda #PrintProcess
|
|
ldx #^PrintProcess
|
|
|
|
EXPORT ShowString
|
|
ShowString
|
|
|
|
sta StringAddr ; store address in local variable
|
|
stx StringAddr+2
|
|
|
|
PushLong #0
|
|
_getport ;get current port
|
|
PushLong infoDPort
|
|
_setPort ;set to info. dialog port
|
|
|
|
PushPtr EraseInfoRect
|
|
_eraseRect ;erase whats already there
|
|
Pushlong InfoStrPos
|
|
_moveto ;move to where to draw text
|
|
PushLong StringAddr
|
|
_drawString ;draw the text from InfoStrBuffer
|
|
|
|
Pushlong CancelStrPos ;Message telling user how to cancel.
|
|
_moveto ;
|
|
PushLong #CancelStrPrint ; ÑMSL 1/13/89
|
|
_drawString
|
|
|
|
_setPort ;restore the port
|
|
|
|
ExitShowStatus rts
|
|
|
|
StringAddr DS.B 4
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: StatusPrinter
|
|
;
|
|
; PURPOSE: Gets the status from the device
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: (Carry Flag) CLEAR= device was statused, SET=device not statused?
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
EXPORT StatusPrinter
|
|
StatusPrinter
|
|
; PushLong #0
|
|
; _TickCount ;get the system tick count
|
|
; plx
|
|
; pla
|
|
; cmp newdate+2
|
|
; beq testlower
|
|
; blt ExitStatus
|
|
;testLower txa
|
|
; cmp NewDate
|
|
; blt ExitStatus
|
|
|
|
; PushLong #0
|
|
; _TickCount
|
|
; pla
|
|
; clc
|
|
; adc #60*5
|
|
; sta NewDate
|
|
; pla
|
|
; adc #0
|
|
; sta NewDate+2
|
|
|
|
;
|
|
;We get here when its time to restatus the device
|
|
;
|
|
|
|
ldx #4
|
|
lda #0 ; zero out the length and byte 5
|
|
sta InfoStrBuffer,x
|
|
|
|
LoopStatus PushPtr InfoStrBuffer
|
|
_PrDevStatus ;get the status of the device
|
|
|
|
ldx #5
|
|
lda InfoStrBuffer,x ; the printer tends to randomly
|
|
and #$00FF ; return $FF
|
|
cmp #$00FF
|
|
beq LoopStatus
|
|
|
|
clc ;clear carry
|
|
Rts
|
|
|
|
ExitStatus
|
|
sec ;set carry
|
|
Rts
|
|
|
|
NewDate DS.B 4
|
|
|
|
ENDP
|
|
|
|
; PrPicFile
|
|
|
|
*****************************
|
|
* *
|
|
* PrPicFile *
|
|
* *
|
|
* Current Rev: Nov. 1987 *
|
|
* *
|
|
*****************************
|
|
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: PrPicFile
|
|
*
|
|
* PURPOSE: To print a picture file
|
|
*
|
|
* PASSED: Users Print Record LONG Handle to print record
|
|
* PortPtr LONG Pointer to graf port
|
|
* PRStatus LONG Pointer to status record
|
|
*
|
|
* RETURNED: NONE
|
|
*
|
|
* NOTE:PortPtr cannot be same one returned by OpenDOC if we
|
|
* allocated it ourselves.
|
|
*
|
|
* PortPtr can be zero.
|
|
*
|
|
******************************************************************
|
|
PrPicFile PROC EXPORT
|
|
|
|
DefineStack
|
|
OrigD word 0
|
|
OrigB byte 0
|
|
rtl1 block 3
|
|
rtl2 block 3
|
|
UsersStatusPtr long 0
|
|
UsersPortPtr long 0
|
|
UsersPrintRecH long 0
|
|
|
|
* we need to get memory for everything.
|
|
*
|
|
* If the application gave us pPrPort, we will use it,
|
|
* otherwise we will use our.
|
|
|
|
; brk 42 **PROFILE
|
|
; pha
|
|
; tool _GetTick,out=(>StartTime:l)
|
|
; pla
|
|
|
|
pha
|
|
lda >iPrErr ;see if any errors
|
|
beq Continue ;branch if no errors
|
|
cmp #PortNotOn ;see if port was not on
|
|
bne Continue
|
|
plx
|
|
jmp Exit12
|
|
|
|
Continue ;
|
|
pla
|
|
phd
|
|
tcd
|
|
phb ;save bank reg
|
|
phk
|
|
plb ;use our bank
|
|
|
|
|
|
;--------------------------------------------------------------
|
|
;
|
|
; Look at the error code again. If it is zero we go and print.
|
|
; if it is none zero, we do not allocate anything for printing
|
|
; and we dispose of things already allocated.
|
|
;
|
|
lda iPrErr
|
|
beq GoAheadAndMakeMyDay
|
|
|
|
jmp PortDone
|
|
|
|
GoAheadAndMakeMyDay ;
|
|
|
|
lda method
|
|
bmi spoolPrt
|
|
|
|
brl NoErrorExit ; in draft printing we do nothing.
|
|
|
|
spoolprt ;
|
|
jsr OpenInfoPrinting ; put up dialog
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Bring inputs to zero page.
|
|
;
|
|
lda UsersStatusPtr,s
|
|
sta PZ_PrStatus
|
|
lda UsersStatusPtr+2,s
|
|
sta PZ_PrStatus+2
|
|
|
|
lda UsersPrintRecH,s
|
|
sta PZ_hPrint
|
|
lda UsersPrintRecH+2,s
|
|
sta PZ_hPrint+2
|
|
|
|
lda UsersPortPtr,s
|
|
sta PZ_pPrPort
|
|
lda UsersPortPtr+2,s
|
|
sta PZ_pPrPort+2
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Look at port pointer. If it is nil, get our own.
|
|
;
|
|
|
|
lda #false
|
|
sta ourport
|
|
|
|
lda PZ_pPrPort
|
|
ora PZ_pPrPort+2
|
|
bne userPort
|
|
lda #true
|
|
sta ourport
|
|
|
|
lda #PortSize
|
|
ldx #%1000000000011000 ; locked and dont cross bank
|
|
jsr OurGetHandle
|
|
bcc @1
|
|
sta iPrErr
|
|
brl NoPort
|
|
|
|
|
|
@1 sta PZ_pPrPort
|
|
stx PZ_pPrPort+2
|
|
|
|
lda [PZ_pPrPort]
|
|
tax
|
|
ldy #2
|
|
lda [PZ_pPrPort],y
|
|
sta PZ_pPrPort+2
|
|
stx PZ_pPrPort
|
|
|
|
userPort ;
|
|
pei PZ_pPrPort+2
|
|
pei PZ_pPrPort
|
|
_OpenPort
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Now look at status record pointer
|
|
;
|
|
|
|
lda #false
|
|
sta ourStatus
|
|
|
|
lda PZ_PrStatus
|
|
ora PZ_PrStatus+2
|
|
bne userStatus
|
|
|
|
lda #OurStatusRecord
|
|
sta PZ_PrStatus
|
|
lda #^OurStatusRecord
|
|
sta PZ_PrStatus+2
|
|
|
|
lda #true
|
|
sta ourStatus
|
|
|
|
UserStatus ;
|
|
;------------------------------------------------------------
|
|
;
|
|
; Initialize the status record
|
|
;
|
|
ldy #StatRecSize-2 ; first zero it
|
|
lda #0
|
|
ZeroLoop sta [PZ_PrStatus],y
|
|
dey
|
|
dey
|
|
bpl ZeroLoop
|
|
|
|
lda PZ_PrStatus ; put pointer to port in status rec
|
|
ldy #pPrPort
|
|
sta [PZ_PrStatus],y
|
|
iny
|
|
iny
|
|
lda PZ_PrStatus+2
|
|
sta [PZ_PrStatus],y
|
|
|
|
lda PZ_hPrint ; put handle to print record
|
|
ldy #shPrint ; into status record.
|
|
sta [PZ_PrStatus],y
|
|
iny
|
|
iny
|
|
lda PZ_hPrint+2
|
|
sta [PZ_PrStatus],y
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Transfer the print record to the internal print record.
|
|
;
|
|
PushLong PZ_HPrint
|
|
PushLong #HPrint
|
|
PushLong #TPrintSize
|
|
_HandToPtr
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get memory for the print buffer. Mangled for speed. ÑMSL
|
|
;
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; First, get a 64K buffer to be safe with quickdraw. ÑMSL
|
|
;
|
|
; Test for the pathological case. If we can't get 64K for quickdraw and
|
|
; 40K for ourselves (104K contiguous) chances are good that we'll crash during
|
|
; printing.
|
|
;
|
|
; So, after we find our 104K, we give it back, then reserve the 64K for QD.
|
|
; Finally, we start trying to find our buffer, starting at 60K.
|
|
; This absotively, posilutely insures that we will have at least a 20K buffer if
|
|
; we try to print, and we should be able to just squeeze by in the worst case...
|
|
;
|
|
; Admittedly, it is possible.
|
|
;
|
|
; OK, OK... or *not* contiguous!
|
|
|
|
bra DoBufCalc
|
|
|
|
; pha
|
|
; pha
|
|
; pea 1
|
|
; pea $A000
|
|
; PushWord UserID your ID
|
|
; pea $C000
|
|
; pea 0
|
|
; pea 0
|
|
; _NewHandle result on the stack!!!
|
|
; bcc DoBufCalc
|
|
; sta iPrErr
|
|
|
|
; pushlong #LowMemMsg
|
|
; jsl ShowErr
|
|
|
|
; pla Clean up stack.
|
|
; pla
|
|
; brl DoClosePort
|
|
|
|
NoBandMem _DisposeHandle Clean up stack.
|
|
bra NoMemMsg
|
|
|
|
NoBandNoDispose pla
|
|
pla
|
|
|
|
NoMemMsg lda #$0201
|
|
sta iPrErr
|
|
pushlong #LowMemMsg
|
|
jsl ShowErr
|
|
|
|
brl DoClosePort
|
|
|
|
|
|
|
|
DoBufCalc
|
|
; _DisposeHandle ; it was there, ... yea...
|
|
|
|
pha ; Lock down 64K saved for QD.
|
|
pha
|
|
pea 1
|
|
pea 0
|
|
PushWord UserID your ID
|
|
pea $C000
|
|
pea 0
|
|
pea 0
|
|
_NewHandle result on the stack!!!
|
|
bcs NoBandNoDispose
|
|
|
|
lda #$C0 ; try for a 60K buffer (max) first.
|
|
sta bandheight
|
|
jsr CalcBandSize
|
|
lda hprint+prXInfo+iDevBytes
|
|
ldx #%1000000000011000 ; locked and dont cross bank
|
|
jsr OurGetHandle
|
|
bcc GotBandBuf
|
|
|
|
lda #$100 ; Now try 128=40K, 64=20K, 32=10K
|
|
sta bandheight
|
|
PrBufCalcLoop lsr bandheight
|
|
lda bandheight
|
|
cmp #$20
|
|
blt NoBandMem ; if it gets less than height of 32 (10K buffer), give up.
|
|
; things are *probably* hopeless...
|
|
jsr CalcBandSize
|
|
lda hprint+prXInfo+iDevBytes
|
|
ldx #%1000000000011000 ; locked and dont cross bank
|
|
jsr OurGetHandle
|
|
bcs PrBufCalcLoop
|
|
|
|
GotBandBuf sta hprbuf
|
|
stx hprbuf+2
|
|
|
|
lda [hprbuf]
|
|
sta pPrBuf
|
|
ldy #2
|
|
lda [hprbuf],y
|
|
sta pPrBuf+2
|
|
|
|
_DisposeHandle Clean up stack (old 64K buf for QD). ÑMSL
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; lit la valeur dans le buffer de la picture.
|
|
; (initialize the page number field of status record?)
|
|
; [Read the picture buffer value]
|
|
|
|
lda ipagenum
|
|
ldy #itotpages
|
|
sta [PZ_PrStatus],y
|
|
|
|
jsr PrPrintit parameters are shared in zero page
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; maintenant libere les buffers si ce sont les notres
|
|
; Or (now free the buffers that we own.)
|
|
; [if they are ours]
|
|
|
|
pushlong hprbuf
|
|
_disposehandle
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Close the port.
|
|
;
|
|
|
|
DoClosePort pushLong PZ_pPrPort
|
|
_closePort
|
|
|
|
lda ourport
|
|
cmp #true
|
|
bne portdone
|
|
|
|
pha
|
|
pha
|
|
PushLong PZ_pPrPort
|
|
_FindHandle
|
|
_disposehandle
|
|
|
|
NoPort jsr CloseInfo ; get rid of window dialog
|
|
|
|
Portdone ;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Kill each of the pictures in the piclist, using ifstpage
|
|
; ilstpage as start and end points.
|
|
;
|
|
lda [hPicList] ; first deref the pic list
|
|
sta pPiclist
|
|
ldy #2
|
|
lda [hPicList],y
|
|
sta pPicList+2
|
|
|
|
ldx #0 ; start at 0
|
|
KillNextPic cpx iPageNum ; check against total pages
|
|
bcs KillPicList ; no more if >= pagenum
|
|
txa
|
|
asl a ; mult by 4
|
|
asl a
|
|
tay ; use as index into table
|
|
lda [pPicList],y
|
|
sta hnewPic
|
|
iny
|
|
iny
|
|
lda [pPicList],y
|
|
sta hNewPic+2
|
|
|
|
phx ; save counter
|
|
|
|
PushLong hNewPic ; Dispose of this picture
|
|
_KillPicture
|
|
|
|
plx ; get X back
|
|
inx ; bump count
|
|
|
|
bra KillNextPic
|
|
|
|
;------------------------------------------------------------------
|
|
;
|
|
; Now we can get rid of the picList itself
|
|
;
|
|
|
|
KillPicList PushLong hPicList
|
|
_DisposeHandle
|
|
|
|
PushLong CursorAd
|
|
_SetCursor
|
|
|
|
NoErrorExit ;
|
|
; tool _GetTick,out=(>EndTime:l) **PROFILE
|
|
; sublong >EndTime,>StartTime,>EndTime
|
|
; brk 42
|
|
|
|
lda iPrErr this will be the normal exit
|
|
plb
|
|
pld
|
|
jmp exit12
|
|
|
|
|
|
|
|
ENDP
|
|
EJECT
|
|
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: PrPixelMap
|
|
*
|
|
* PURPOSE: Prints out the pixel map
|
|
*
|
|
* PASSED: SrcLocPtr LONG, ptr to source LocInfo
|
|
* SrcRectPtr LONG, ptr to source rect
|
|
* ColorFlag WORD, 0 = B/W, else Color
|
|
*
|
|
* RETUNED: NONE
|
|
*
|
|
;------------------------------------------------------------------------------
|
|
PrPixelMap PROC EXPORT
|
|
|
|
|
|
DefineStack
|
|
OrigD word 0
|
|
OrigB byte 0
|
|
rtl1 block 3
|
|
rtl2 block 3
|
|
ColorFlag word 0
|
|
SrcRectPtr long 0
|
|
SrcLocPtr long 0
|
|
|
|
|
|
pha ; save value of d
|
|
|
|
pha
|
|
_DevIsItSafe
|
|
pla
|
|
bne Yes
|
|
lda #PortNotOn
|
|
sta >iPrErr
|
|
plx
|
|
jmp Exit8
|
|
Yes ;
|
|
pla
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; save the registers and set direct page and data bank
|
|
;
|
|
phd
|
|
tcd
|
|
phb
|
|
phk
|
|
plb
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get the current port's pointer and leave it on the stack
|
|
; for restoring just before returning.
|
|
;
|
|
pha
|
|
pha
|
|
_GetPort
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get the current cursor record's address and turn on the watch cursor.
|
|
;
|
|
|
|
PushLong #0 ; space for the address
|
|
_GetCursorAdr
|
|
pla
|
|
sta CursorAd
|
|
pla
|
|
sta CursorAd+2
|
|
|
|
_WaitCursor
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Clear the error code and disallow status display
|
|
;
|
|
|
|
stz iPrErr ; zero error
|
|
|
|
lda #True
|
|
sta NoShowMessage
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get new handle for print record. This is necessary because
|
|
; StartLLD uses the values in the print record to set up
|
|
; parameter such as page rectangle, color and quality for
|
|
; the printer.
|
|
;
|
|
|
|
lda #TPrintSize ; size of handle
|
|
ldx #%1000000000011000 ; attributes
|
|
jsr OurGetHandle
|
|
bcc @1
|
|
sta iPrErr
|
|
brl NoPrintRec
|
|
|
|
@1 sta PrintRecord
|
|
stx PrintRecord+2
|
|
|
|
PushLong PrintRecord
|
|
_PrDefault
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Check if the application asked for color. If so, set bit
|
|
; 5 of wdev in prStl of the print record.
|
|
;
|
|
|
|
lda ColorFlag+4,s
|
|
beq BlackWhite
|
|
lda hprint+prStl+wDev
|
|
ora #f5
|
|
sta hprint+prStl+wDev
|
|
|
|
BlackWhite ;
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get a handle for a grafport.
|
|
;
|
|
lda #PortSize ; size of handle
|
|
ldx #%1000000000011000 ; attributes
|
|
jsr OurGetHandle
|
|
bcc @1
|
|
sta iPrErr
|
|
brl NoPort
|
|
|
|
@1 sta temp1
|
|
stx temp1+2
|
|
lda [Temp1]
|
|
sta PZ_pPrPort
|
|
ldy #2
|
|
lda [Temp1],y
|
|
sta PZ_pPrPort+2
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Open the grafport.
|
|
;
|
|
pei PZ_pPrPort+2
|
|
pei PZ_pPrPort
|
|
_OpenPort
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Start up the low level driver
|
|
;
|
|
|
|
jsr startLLD
|
|
bcc Continue ; error checking added
|
|
|
|
sta iPrErr ; by Suki 5/25/88
|
|
brl ErrorExit
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get source bitmap information off the stack into local area
|
|
;
|
|
|
|
Continue
|
|
lda SrcLocPtr+4,s
|
|
sta temp1 ; temp1 has Ptr to SrcLoc
|
|
lda SrcLocPtr+2+4,s
|
|
sta temp1+2
|
|
|
|
ldy #14
|
|
MoveLoc lda [temp1],y
|
|
sta LocalLoc,y
|
|
dey
|
|
dey
|
|
bpl MoveLoc
|
|
|
|
lda temp1
|
|
clc
|
|
adc #8
|
|
sta LocalBoundsPtr ; this ptr used for intersection call
|
|
lda temp1+2
|
|
adc #0
|
|
sta LocalBoundsPtr+2
|
|
|
|
lda SrcRectPtr+4,s
|
|
sta temp2 ; temp2 is ptr to source rect
|
|
lda SrcRectPtr+2+4,s
|
|
sta temp2+2
|
|
|
|
PushWord #0 ; Result
|
|
PushLong LocalBoundsPtr
|
|
PushLong temp2
|
|
PushLong #LocalRect ; intesected rect goes here
|
|
_SectRect
|
|
pla
|
|
beq NoIntersection ; if false, no intersection
|
|
|
|
;---------------------------------------------------------------
|
|
;
|
|
; Look at the source rect. If its upper/left corner is 0,0
|
|
; then no adjustment is necessary. If it is not 0,0, we must
|
|
; adjust the pointer to the pixel map so that it points to
|
|
; the first pixel in the source rect.
|
|
;
|
|
; Note that this scheme does not work with source rects that
|
|
; do not have the first pixel to draw as the first pixel in
|
|
; a byte.
|
|
;
|
|
lda LocalRect
|
|
sec
|
|
sbc LocalLoc+8
|
|
beq NoAdjustmentY
|
|
|
|
pha ; space for result
|
|
pha
|
|
pha ; Top of src rect
|
|
PushWord LocalLoc+6 ; width
|
|
_Multiply
|
|
pla
|
|
clc
|
|
adc LocalLoc+2
|
|
sta LocalLoc+2
|
|
pla
|
|
adc LocalLoc+4
|
|
sta LocalLoc+4
|
|
|
|
NoAdjustmentY ;
|
|
lda LocalRect+2
|
|
sec
|
|
sbc LocalLoc+10
|
|
beq NoAdjustmentX
|
|
|
|
lsr a
|
|
bit LocalLoc-1
|
|
bpl ModeWas320
|
|
lsr a
|
|
ModeWas320 clc
|
|
adc LocalLoc+2
|
|
sta LocalLoc+2
|
|
bcc NoCarryHere
|
|
inc LocalLoc+4
|
|
NoCarryHere ;
|
|
NoAdjustmentX ;
|
|
|
|
lda LocalRect
|
|
sta LocalLoc+8
|
|
lda LocalRect+2
|
|
sta LocalLoc+10
|
|
lda LocalRect+4
|
|
sta LocalLoc+12
|
|
lda LocalRect+6
|
|
sta LocalLoc+14
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Call LLDBitMap using the adjusted (if necessary) values in
|
|
; LocalLoc and LocalRect.
|
|
;
|
|
|
|
PushLong #LocalLoc
|
|
PushLong #LocalRect
|
|
PushWord UserID
|
|
lda hprint+prstl+wdev
|
|
and #f7
|
|
jsl LLDBitMap
|
|
|
|
jsl NewPage ; spit out paper when we're done
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Close the grafport.
|
|
;
|
|
|
|
NoIntersection ;
|
|
;------------------------------------------------------------
|
|
;
|
|
; We need to shut down low level driver.
|
|
;
|
|
pushword UserID
|
|
jsl LLDShutDown
|
|
|
|
|
|
ErrorExit
|
|
pei PZ_pPrPort+2
|
|
pei PZ_pPrPort
|
|
_ClosePort
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get rid of the memory we allocated for grafport and print
|
|
; record.
|
|
;
|
|
pha ; first find the handle to
|
|
pha ; memory that port is in.
|
|
pei PZ_pPrPort+2
|
|
pei PZ_pPrPort
|
|
_FindHandle
|
|
_DisposeHandle ; then dispose it.
|
|
NoPort
|
|
PushLong PrintRecord
|
|
_DisposeHandle
|
|
NoPrintRec
|
|
;------------------------------------------------------------
|
|
;
|
|
; Turn off the watch cursor.
|
|
|
|
PushLong CursorAd
|
|
_SetCursor
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Restore the user's last current port, the pointer to it was
|
|
; left on the stack at the beginning of this routine.
|
|
;
|
|
_SetPort
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; We are done.
|
|
;
|
|
|
|
lda iPrErr
|
|
plb
|
|
pld
|
|
jmp Exit10
|
|
|
|
|
|
PrintRecord DS.B 4
|
|
LocalBoundsPtr DS.B 4
|
|
LocalLoc DS.B 16
|
|
LocalRect DS.B 8
|
|
|
|
ENDP
|
|
EJECT
|
|
|
|
; PrPrintIt
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: PrPrintIt
|
|
*
|
|
* PURPOSE: Prints one document (an internal routine called by PrPicFile.)
|
|
* (All parameters are passed via zero page and in memory.)
|
|
*
|
|
* PASSED: NONE
|
|
*
|
|
* RETURNED: NONE
|
|
*
|
|
;------------------------------------------------------------------------------
|
|
PrPrintit PROC EXPORT
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; We look at the idle proc in the print record.
|
|
; If it is NIL then we put a pointer to our IDLE proc
|
|
; in its place.
|
|
;
|
|
|
|
lda hPrint+PrJob+pIdleProc
|
|
ora hPrint+PrJob+pIdleProc+2
|
|
bne useridle
|
|
lda #<PrAbortCheck
|
|
sta hPrint+PrJob+pIdleProc
|
|
lda #^PrAbortCheck
|
|
sta hPrint+PrJob+pIdleProc+2
|
|
useridle ;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Start up the low level driver.
|
|
;
|
|
jsr startLLD
|
|
bcc Continue ; error checking added
|
|
|
|
sta iPrErr ; by Suki 5/25/88
|
|
brl Exit
|
|
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Gather and show status of printer
|
|
;
|
|
|
|
Continue jsr GetStatus
|
|
|
|
jsl CallIdleProc ; does not come back if quits
|
|
|
|
;-------------------------------------------------------------------
|
|
;
|
|
; Set up the initial conditions for the mode
|
|
;
|
|
|
|
stz BandModeNum
|
|
lda deadloc2
|
|
and #$80
|
|
sta newSCB
|
|
sta oldSCB
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set the imaging flag to false in the status record.
|
|
;
|
|
lda #false
|
|
ldy #fImaging
|
|
sta [PZ_PrStatus],y
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Put total copies into the status record.
|
|
;
|
|
lda hPrint+PrJob+iCopies
|
|
ldy #iTotCopies
|
|
sta [PZ_PrStatus],y
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Calculate the number of bands it will take to print
|
|
; one page. This number is calculated by taking the
|
|
; number of vertical lines on the page, adding the band
|
|
; height, subtracting one and dividing this total
|
|
; by the band height.
|
|
;
|
|
; NumBands = (NumLines + BandHeight - 1 ) div BandHeight
|
|
;
|
|
; The number of lines depends on whether or not we are
|
|
; in portrait or landscape mode. In portrait mode, the
|
|
; number of lines is the bottom of rpage. In landscape
|
|
; mode, the number of lines is the right of rpage.
|
|
;
|
|
; For some reason, the mode also plays a role in here.
|
|
; In best mode the height is twice that of the rectangle
|
|
; shown above.
|
|
;
|
|
;----------------------------------------------------------
|
|
;
|
|
; User choose landscape.
|
|
;
|
|
; ---------------------------------------------
|
|
; | | | | | | | | |
|
|
; | | | | | | | | |
|
|
; | | | | | | | | |
|
|
; | | | | | | | | |
|
|
; | | | | | | | | |
|
|
; | | | | | | | | |
|
|
; | | | | | | | | |
|
|
; | | | | | | | | |
|
|
; ---------------------------------------------
|
|
; Bands ... Partial Band
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; User selected portrait.
|
|
;
|
|
; ---------------------------------
|
|
; | |
|
|
; | | Band
|
|
; | |
|
|
; ---------------------------------
|
|
; | |
|
|
; | | Band
|
|
; | |
|
|
; ---------------------------------
|
|
; | |
|
|
; | | Band
|
|
; | |
|
|
; ---------------------------------
|
|
; | |
|
|
; | | Band
|
|
; | |
|
|
; ---------------------------------
|
|
; | | Partial Band
|
|
; ---------------------------------
|
|
;
|
|
;
|
|
|
|
pha ; Space udivide for result
|
|
pha
|
|
|
|
lda hprint+prStl+wDev ; look at portrait vs landscape mode
|
|
and #f1
|
|
bne use_v ; its portrait mode
|
|
|
|
lda hprint+prInfo+rpage+right ; **HACK** ÑMSL 10/15/88
|
|
pha ; get it out of the normal page rect!
|
|
|
|
|
|
lda hprint+PrXInfo+ibandH
|
|
bra GotBandSize
|
|
use_v lda hprint+prInfo+rpage+bottom ; **HACK** ÑMSL 10/15/88
|
|
pha ; get it out of the normal page rect!
|
|
|
|
lda hprint+PrXInfo+ibandV
|
|
GotBandSize pha
|
|
|
|
|
|
lda hprint+prStl+wDev ; test if 50% first
|
|
and #f3 ;
|
|
beq normal
|
|
lda hprint+prStl+wDev ; now look at best vs faster mode
|
|
and #f0 ;
|
|
beq normal
|
|
lda 3,s ; for best mode we double size
|
|
asl a
|
|
sta 3,s
|
|
normal ;
|
|
lda 3,s
|
|
sta LinesPerPage ; store total # per page
|
|
clc
|
|
adc 1,s
|
|
dec a
|
|
sta 3,s
|
|
_Udivide
|
|
pla
|
|
plx
|
|
|
|
sta hPrint+PrXinfo+iBands ; and store result in print rec
|
|
ldy #itotbands ; and in the status record.
|
|
sta [PZ_PrStatus],y
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; on joue un peu aussi a mettre au point les qualites d'impression
|
|
; en triturant wDev avec f0 f1 f2 f3 f4 ...
|
|
;
|
|
; mise a jour de CiDev a faire
|
|
;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set the curcopy field in the status record to one.
|
|
;
|
|
|
|
lda #1
|
|
ldy #icurcopy
|
|
sta [PZ_PrStatus],y
|
|
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Start the outer loop for copies.
|
|
;
|
|
newCopy ;
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set the value of current page in the status record.
|
|
; ( demarre une nouvelle page )
|
|
;
|
|
lda #1
|
|
ldy #icurpage
|
|
sta [PZ_PrStatus],y
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Start the new page loop
|
|
;
|
|
XnewPage
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Gather and show status of printer
|
|
;
|
|
|
|
jsr GetStatus
|
|
|
|
jsl CallIdleProc
|
|
|
|
ldy #iCurPage
|
|
lda [PZ_PrStatus],y
|
|
jsr CalcPageBandNum
|
|
lda PageBandnum
|
|
sta BandModeNum
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Get the handle to the picture associated with the current
|
|
; page.
|
|
;
|
|
lda [hPicList] ; first deref the pic list
|
|
sta pPiclist
|
|
ldy #2
|
|
lda [hPicList],y
|
|
sta pPicList+2
|
|
|
|
ldy #iCurpage ; now get the current page number
|
|
lda [PZ_PrStatus],y
|
|
dec a ; dec by one and mult by 4
|
|
asl a
|
|
asl a
|
|
tay ; use as index into table
|
|
lda [pPicList],y
|
|
sta hnewPic
|
|
iny
|
|
iny
|
|
lda [pPicList],y
|
|
sta hNewPic+2
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set the dirty flag in the status record to false.
|
|
;
|
|
lda #false
|
|
ldy #fPgDirty
|
|
sta [PZ_PrStatus],y
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Check the paper feed type, if user chose manual feed,
|
|
; put up the alert to insert the next sheet of paper
|
|
;
|
|
lda hprint+PrStl+Feed
|
|
cmp #feedcut
|
|
bne NoAsk ; automatic feed
|
|
|
|
jsr InsertPaperAlert ; put up alert for manual feed
|
|
cpx #2 ; item hit is returned in X reg
|
|
bne ReDraw ; 2 is ID of Cancel
|
|
brl EndOfPrinting
|
|
|
|
ReDraw lda #PrintProcess
|
|
ldx #^PrintProcess
|
|
jsr ShowString ; redraws "Printing in Progress..."
|
|
|
|
NoASK ;
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Call the idle proc again.
|
|
;
|
|
jsl CallIdleProc
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Calculate the first band rect. The top and left of this
|
|
; band is top and left of rPage, bottom is top plus iBandH,
|
|
; and right is left plus iBandV. iBandH and iBandV is pre-
|
|
; calculated in CiXmetrics based on portrait or landscape.
|
|
;
|
|
* Top
|
|
lda hPrint+PrInfoPT+rPage+Top
|
|
sta rBand+Top
|
|
|
|
* Bottom
|
|
clc
|
|
adc hPrint+PrXInfo+iBandV
|
|
sta rBand+Bottom
|
|
|
|
* left
|
|
lda hPrint+PrInfoPT+rPage+Left
|
|
sta rBand+Left
|
|
|
|
* right
|
|
clc
|
|
adc hPrint+PrXInfo+iBandH
|
|
sta rBand+Right
|
|
|
|
lda hprint+PrStl+Wdev ; test is we are in 50% landscape
|
|
and #f3
|
|
bne nocorrection
|
|
lda hprint+PrStl+Wdev
|
|
and #f1
|
|
bne nocorrection
|
|
lsr rBand+top ;should be 0 however
|
|
lsr rBand+Bottom ;to be consistent with CiMetrics
|
|
nocorrection ;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Now we really setup the band loop and get to it.
|
|
;
|
|
; Set current band to one in status record.
|
|
;
|
|
lda #1
|
|
ldy #iCurBand
|
|
sta [PZ_PrStatus],y
|
|
|
|
lda LinesPerPage
|
|
sta LinesLeftOnPage ; initialize # of line to be printed
|
|
sta Page_remain
|
|
jsr CalcModeRemain
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; New Band Loop
|
|
;
|
|
newMode ;
|
|
newBand ;
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; This seems to be the only place inside the printing loop
|
|
; that we call idle proc. Why do we bother with the
|
|
; dirty flag and imaging flag if there is no way idle proc
|
|
; can see them?
|
|
;
|
|
|
|
|
|
jsl CallIdleProc
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set imaging and dirty page flags in status record.
|
|
;
|
|
lda #True
|
|
ldy #fImaging
|
|
sta [PZ_PrStatus],y
|
|
ldy #fPgDirty
|
|
sta [PZ_PrStatus],y
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Open the band port.
|
|
;
|
|
PushLong #BandPort
|
|
_OpenPort
|
|
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Start adjusting the fields in the loc info.
|
|
;
|
|
|
|
lda deadLoc2
|
|
and #$80
|
|
sta BandLoc
|
|
lda pPrBuf
|
|
sta BandLoc+2
|
|
lda pPrBuf+2
|
|
sta BandLoc+4
|
|
lda hPrint+PrXInfo+iRowBytes
|
|
sta BandLoc+6
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Look at the number of lines left on the page.
|
|
; If it is less than the size of a band, we must
|
|
; reduce the size of the band rect.
|
|
;
|
|
; We use the variable LinesLeftOnPage to tell us how
|
|
; many lines are left on the page. It was intialized
|
|
; above when we calculated the number of bands.
|
|
;
|
|
; So even if we do not adjust the band rect, we
|
|
; update LinesLeftOnPage for next time through the
|
|
; loop.
|
|
;
|
|
lda hPrint+prStl+wDev
|
|
and #f1
|
|
bne trans0 ; Portrait
|
|
|
|
; landscape
|
|
lda LinesLeftOnPage ; look at num lines remaining
|
|
cmp hprint+prXinfo+ibandH ; compare to band height
|
|
bge sub_1 ; its bigger so no adjustment
|
|
lda LinesLeftOnPage ; Use LinesLeftOnPage to adjust
|
|
clc ; the right of the band rect
|
|
adc rBand+left
|
|
sta rBand+right
|
|
Sub_1 lda LinesLeftOnPage ; now we adjust LinesLeftOnPage
|
|
sec ; by subtracting the number of
|
|
sbc hprint+prXInfo+ibandH ; lines we will print for
|
|
sta LinesLeftOnPage ; this band.
|
|
bra trans
|
|
|
|
; Portrait
|
|
trans0 lda LinesLeftOnPage ; look at num lines remaining
|
|
cmp hprint+prXinfo+ibandV ; compare to band width
|
|
blt sub_2 ; its bigger so no adjustment
|
|
lda hprint+prXinfo+ibandV ; compare to band width
|
|
Sub_2 clc ; the bottom of the band rect.
|
|
adc rBand+top
|
|
sta rBand+bottom
|
|
lda LinesLeftOnPage ; now we adjust LinesLeftOnPage
|
|
sec ; by subtracting the number
|
|
sbc hprint+prXInfo+ibandV ; of lines we will print
|
|
sta LinesLeftOnPage ; for this band.
|
|
trans ;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Prepare the sizing rect based on the mode: best or faster
|
|
;
|
|
MoveRect hPrint+PrInfoPT+rPage,SizingRect
|
|
lda hprint+prStl+wdev ; check if 50% is on first
|
|
and #f3 ; cuz we don't care about the
|
|
beq NormalSize ; resolution at this point
|
|
lda hprint+prStl+wdev ; if not, then we look at
|
|
and #f0 ; whether Better Text or Color
|
|
beq NormalSize
|
|
asl SizingRect+4
|
|
asl SizingRect+6
|
|
NormalSize ;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Copy the band rect to the bounds rect of the LocInfo.
|
|
;
|
|
|
|
ldx #6
|
|
tbandrect lda rband,x
|
|
sta BandLoc+8,x
|
|
dex
|
|
dex
|
|
bpl tbandrect
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set various and interesting fields in the band
|
|
; graf port.
|
|
;
|
|
PushPtr BandLoc ; Set the loc info
|
|
_SetportLoc
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set the PortRect to the band rect too.
|
|
;
|
|
|
|
PushLong #rBand
|
|
_setportrect
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Set the cliprgn and visrgn to the sizing rect.
|
|
;
|
|
PushLong #SizingRect ; set clip rgn to
|
|
_cliprect
|
|
|
|
pushlong #0 ; and the vis rect!
|
|
_getcliphandle
|
|
_setvisrgn
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Fill the band rect with white.
|
|
;
|
|
PushLong #rBand ; fill the band with white.
|
|
PushLong #White
|
|
_FillRect
|
|
;----------------------------------------------------------
|
|
;
|
|
; Draw the picture
|
|
;
|
|
|
|
; tool _GetTick,out=(>TmpTime:l) **PROFILE
|
|
|
|
PushLong hNewPic
|
|
PushLong #SizingRect
|
|
_drawpicture
|
|
|
|
; tool _GetTick,out=(>EndTime:l) **PROFILE
|
|
; sublong >EndTime,>TmpTime,>TmpTime
|
|
; addlong >TmpTime,>DrawTime,>DrawTime
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Gather and show status of printer
|
|
;
|
|
|
|
jsr GetStatus
|
|
|
|
jsl CallIdleProc
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Print it.
|
|
;
|
|
pushptr bandport
|
|
PushLong #rBand
|
|
pushword UserID
|
|
lda hprint+prstl+wdev
|
|
and #f7
|
|
jsl LLDBitmap
|
|
|
|
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Gather and show status of printer
|
|
;
|
|
|
|
; jsr GetStatus
|
|
|
|
; jsl CallIdleProc
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Close the band port.
|
|
;
|
|
|
|
PushPtr BandPort
|
|
_ClosePort
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Clear the imaging flag.
|
|
;
|
|
|
|
lda #false
|
|
ldy #fImaging
|
|
sta [PZ_PrStatus],y
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Calculate the next band position. Different for
|
|
; portrait vs landscape.
|
|
;
|
|
lda hPrint+prStl+wDev
|
|
and #f1
|
|
bne addv
|
|
|
|
; Landscape
|
|
lda rBand+left
|
|
clc
|
|
adc hPrint+PrXInfo+iBandH
|
|
sta rBand+left
|
|
|
|
lda rBand+right
|
|
clc
|
|
adc hPrint+PrXInfo+iBandH
|
|
sta rBand+right
|
|
|
|
bra Added
|
|
|
|
; Portrait
|
|
addV ;
|
|
lda rBand+Bottom
|
|
sta rBand+Top
|
|
added ;
|
|
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; See if we are done.
|
|
;
|
|
|
|
|
|
ldy #iCurband ; bump cur band and put back
|
|
lda [PZ_PrStatus],y
|
|
inc a
|
|
sta [PZ_PrStatus],y
|
|
|
|
; dec a ; dec by one
|
|
; ldy #iTotBands ; and compare to total bands
|
|
; cmp [PZ_PrStatus],y
|
|
; bcs noMoreBands ; greater or equal and we are done.
|
|
|
|
lda linesleftonpage
|
|
beq nomoreBands
|
|
bmi nomoreBands
|
|
brl NewBand ; else new band
|
|
|
|
nomoreBands ;
|
|
jsr detectnewmode
|
|
bcc alldone
|
|
brl newmode
|
|
alldone ;
|
|
;----------------------------------------------------------
|
|
;
|
|
; Check if printing with gap or no gap, don't send form feed
|
|
; if no gap is chosen
|
|
|
|
lda hPrint+prStl+wDev
|
|
and #f6
|
|
beq NoFormFeed ; 0 is no gap
|
|
|
|
jsl newpage
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Bump page count
|
|
;
|
|
|
|
NoFormFeed ldy #iCurPage ; bump curpage
|
|
lda [PZ_PrStatus],y
|
|
inc a
|
|
sta [PZ_PrStatus],y ; and put back
|
|
|
|
dec a
|
|
ldy #iTotPages ; look at total pages
|
|
cmp [PZ_PrStatus],y ; compare to curpage
|
|
bcs NoMorePages
|
|
brl XnewPage
|
|
NoMorePages ;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; Bump copy count.
|
|
;
|
|
ldy #iCurCopy
|
|
lda [PZ_PrStatus],y
|
|
inc a
|
|
sta [PZ_PrStatus],y
|
|
|
|
dec a
|
|
ldy #iTotCopies
|
|
cmp [PZ_PrStatus],y
|
|
bcs NoMoreCopies
|
|
|
|
brl newCopy
|
|
nomoreCopies ;
|
|
|
|
;----------------------------------------------------------
|
|
;
|
|
; This is where we go if idle proc gets tells us to quit.
|
|
;
|
|
EXPORT EndOfPrinting
|
|
EndOfPrinting
|
|
|
|
pushword UserID
|
|
jsl LLDShutDown
|
|
|
|
Exit rts
|
|
|
|
Export hNewPalette
|
|
hNewPalette DC.L paletteData
|
|
paletteData DS.B $20
|
|
|
|
Page_Remain DS.B 2
|
|
BandModeNum DS.B 2
|
|
nextbottom DS.B 2
|
|
newSCB DS.B 2
|
|
oldSCB DS.B 2
|
|
PageBandNum DS.B 2
|
|
|
|
EXPORT CurLLDMode
|
|
CurLLDMode
|
|
DS.B 2
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: CalcModeRemain
|
|
;
|
|
; PURPOSE: Calculate the mode that remains
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
*= set up a new band remain for the current mode.
|
|
* update also the page remain by the difference.
|
|
|
|
EXPORT CalcModeRemain
|
|
CalcModeRemain
|
|
lda newscb ;get the new scan control byte
|
|
eor #$0f
|
|
sta oldScb ;update as the old one
|
|
jsr detectnewmode ;see if its a new mode
|
|
rts
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: DetectNewMode
|
|
;
|
|
; PURPOSE: Detects if a mode change occurs and sets things up appropriately
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: (Carry) CLEAR, no change or done
|
|
; SET, change
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
detectnewmode ;
|
|
; si BandModeNum= num de la list
|
|
; ou pas de list
|
|
; ou landscape
|
|
; alors clc
|
|
; sinon setup the new values and return sec.
|
|
|
|
lda hprint+prStl+wDev
|
|
and #f1
|
|
beq EscapeDone
|
|
; ok it is portrait
|
|
lda Page_remain
|
|
beq EscapeDone
|
|
; test if there is a SCBList
|
|
lda hPrint+PrXInfo+SCBList
|
|
sta Temp1
|
|
lda hPrint+PrXInfo+SCBList+2
|
|
sta Temp1+2
|
|
ora Temp1
|
|
beq EscapeDone
|
|
lda BandModeNum
|
|
cmp [Temp1]
|
|
blt goodenough
|
|
EscapeDone clc
|
|
rts
|
|
EscapeDone1 pla
|
|
clc
|
|
rts
|
|
|
|
goodenough ;
|
|
pha
|
|
pha
|
|
pha
|
|
lda #$24 ;each entry is $24
|
|
pha
|
|
_multiply
|
|
ply
|
|
pla
|
|
iny ;pass over the length
|
|
iny
|
|
lda [Temp1],y
|
|
sta nextbottom
|
|
iny
|
|
iny
|
|
lda [Temp1],y
|
|
phy
|
|
tax
|
|
xba
|
|
and #$ff
|
|
ldy #icurpage
|
|
cmp [PZ_PrStatus],y
|
|
bne EscapeDone1
|
|
txa
|
|
and #$ff
|
|
sta newSCB
|
|
; read palette.
|
|
ply
|
|
iny
|
|
iny
|
|
|
|
ldx #0
|
|
looppall lda [Temp1],y
|
|
sta palettedata,x
|
|
iny
|
|
iny
|
|
inx
|
|
inx
|
|
cpx #$20
|
|
bne looppall
|
|
|
|
; compare with old scb and update width and lld mode
|
|
lda newscb
|
|
eor oldSCB
|
|
and #$80
|
|
beq setPalette
|
|
; we changed mode (320-640)
|
|
; update LLD
|
|
lda CurLLDMode
|
|
ora #1 ;set 640
|
|
ldx NewSCB
|
|
cpx #$80
|
|
bge ok640
|
|
and #$fffe
|
|
ok640 pha
|
|
pushword UserID
|
|
jsl LldSetQuality ;set the mode
|
|
; update the Width.
|
|
lda NewScb
|
|
cmp #$80
|
|
bge do640
|
|
; now 320
|
|
lsr hPrint+PrXInfo+iBandH
|
|
bra setpalette
|
|
do640 asl hPrint+PrXInfo+iBandH
|
|
setpalette ;
|
|
Pushlong hNewPalette
|
|
Pushword #0
|
|
Pushword UserId
|
|
jsl lldsetcolor
|
|
|
|
; ok now calculate the new BandRemain.
|
|
inc BandModeNum
|
|
; test if double sized, so double new bottom.
|
|
lda hprint+prStl+wDev
|
|
and #f0
|
|
beq easy1
|
|
asl nextbottom
|
|
easy1 ;
|
|
lda nextbottom
|
|
sec
|
|
sbc rband+top
|
|
beq goAgain
|
|
bge more1
|
|
goAgain brl detectnewmode
|
|
more1 cmp Page_Remain
|
|
blt more2
|
|
lda Page_Remain
|
|
more2 sta linesleftonpage
|
|
lda Page_Remain
|
|
sec
|
|
sbc linesleftonpage
|
|
sta Page_Remain
|
|
; update old SCB
|
|
lda newSCB
|
|
sta oldSCB
|
|
sec
|
|
rts
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: CalcPageBandNum
|
|
;
|
|
; PURPOSE: Calculates the number of page bands
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
CalcPageBandNum ;
|
|
pha
|
|
stz PageBandNum ;default is failed
|
|
lda hPrint+PrXInfo+SCBList
|
|
sta Temp1
|
|
lda hPrint+PrXInfo+SCBList+2
|
|
sta Temp1+2
|
|
ora Temp1
|
|
beq Loose
|
|
; on va parcourir la list et s'arreter sur la premiere valeur
|
|
; correspondant a cette page.
|
|
lda [temp1]
|
|
bne win
|
|
loose pla
|
|
rts
|
|
|
|
win ;
|
|
tax
|
|
lda Temp1
|
|
clc
|
|
adc #2
|
|
sta Temp1
|
|
bcc noInc2
|
|
inc Temp1+2
|
|
noInc2 ;
|
|
txa
|
|
loop ;
|
|
pha
|
|
ldy #2
|
|
lda [temp1],y
|
|
xba
|
|
and #$ff
|
|
cmp 3,s
|
|
blt more
|
|
beq found
|
|
pla
|
|
pla
|
|
rts ;page num too big
|
|
|
|
found pla
|
|
pla
|
|
rts
|
|
more ;
|
|
lda Temp1
|
|
clc
|
|
adc #$24
|
|
sta Temp1
|
|
bcc noInc
|
|
inc Temp1+2
|
|
noInc inc PageBandNum
|
|
pla
|
|
dea
|
|
bne loop
|
|
pla
|
|
rts
|
|
|
|
ENDP
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: StartLLD
|
|
*
|
|
* PURPOSE: Shared routine to startup the low level routines.
|
|
*
|
|
* PASSED: NONE
|
|
*
|
|
* RETURNED: NONE
|
|
*
|
|
;------------------------------------------------------------------------------
|
|
startLLD PROC EXPORT
|
|
|
|
;
|
|
;First calculate zero page area for low level routines.
|
|
;
|
|
|
|
tdc ;give lld our zero page
|
|
clc
|
|
adc #$100 ;add $100 for next zero page
|
|
;NOTE: low level zero page is $100 above current zero page
|
|
pha
|
|
pushword UserID
|
|
jsl LLDStartup ;startup low level routines
|
|
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Added error checking code. Suki Lee May 25, 1988
|
|
;
|
|
|
|
bcc @1
|
|
brl ErrorExit
|
|
|
|
@1 jsr GetStatus ; what state is printer in?
|
|
|
|
* set paper rect for the LLD
|
|
stz LLD_PaperRect ;zero it
|
|
stz LLD_PaperRect+2
|
|
|
|
PushLong #0
|
|
PushLong #0
|
|
lda hPrint+PrStl+iPageV
|
|
pha
|
|
lda #6
|
|
pha
|
|
_multiply
|
|
pla
|
|
plx
|
|
pha
|
|
lda #5
|
|
pha
|
|
_Udivide
|
|
pla
|
|
sta LLD_PaperRect+4
|
|
pla
|
|
|
|
PushLong #0
|
|
PushLong #0
|
|
lda hPrint+PrStl+CRwidth
|
|
pha
|
|
lda #4
|
|
pha
|
|
_multiply
|
|
pla
|
|
plx
|
|
pha
|
|
lda #3
|
|
pha
|
|
_Udivide
|
|
pla
|
|
sta LLD_PaperRect+6 ;equals CRwidth*4/3
|
|
pla
|
|
;
|
|
;Set the low level Page Rectangle
|
|
;
|
|
pushptr LLD_PaperRect
|
|
pushword UserID
|
|
jsl LLDSetPageRect
|
|
|
|
* set quality for the printer
|
|
|
|
pushword #%1000000000000001 high color
|
|
lda hprint+prStl+wdev ;see if 2x zoom
|
|
and #f3
|
|
beq hires ;branch if 2x
|
|
|
|
lda hprint+prStl+wdev ;see if high resolution
|
|
and #f0
|
|
beq size2 ;branch if not high resolution
|
|
hires pla
|
|
pushword #%1000000000000011 high res
|
|
|
|
size2 ;
|
|
lda hPrint+prStl+wDev ;see if portrait
|
|
and #f1
|
|
bne portrait2 ;branch if portrait
|
|
pla
|
|
ora #$4000 landscape
|
|
pha
|
|
portrait2 ;
|
|
;------------------------------------------------------------------------
|
|
;
|
|
; Check if Condensed vertically
|
|
;
|
|
lda hprint+prstl+wdev
|
|
and #f2
|
|
bne Vsizing ; yes
|
|
pla
|
|
ora #$2000
|
|
pha
|
|
|
|
Vsizing ;
|
|
lda deadloc2
|
|
and #$80
|
|
bne lld640
|
|
pla
|
|
and #$fffe mode320 for lld
|
|
pha
|
|
|
|
lld640 ;
|
|
;-----------------------------------------------------------
|
|
;
|
|
; Check the printer info string for presence of color ribbon. The format of
|
|
; this string for the ImageWriter II is: IW10CF
|
|
; where IW = ImageWriter II
|
|
; 10 = carriage width
|
|
; C = if color ribbon installed
|
|
; F = if sheet feeder installed
|
|
;
|
|
; string format for the ImageWriter LQ is: LQ1CFEnP
|
|
; where LQ = ImageWriter LQ
|
|
; 1 = 15" carriage width
|
|
; C = if color ribbon installed
|
|
; F = if sheet feeder installed, no envelope
|
|
; E = if sheet feeder w/envelope installed
|
|
; n = # of sheet feeders
|
|
; P = if in pull tractor mode
|
|
;
|
|
; The string is terminated by a carriage return
|
|
; Note: An ImageWriter I will not respond to the query.
|
|
;
|
|
|
|
ldx #8
|
|
LoopZero lda #0 ; makes sure the string is clean
|
|
sta PtrType,x
|
|
dex
|
|
dex
|
|
bpl loopZero
|
|
|
|
PushPtr PtrType
|
|
jsl CheckPrinter ; go get its type
|
|
|
|
lda PtrType ; no reponse --> IW I
|
|
beq BW
|
|
ldx #4 ; assume Imagewriter II for now
|
|
cmp #$514C ; see if it's an LQ
|
|
bne LWII
|
|
ldx #3 ; it's an LQ
|
|
LWII lda PtrType,x
|
|
and #$00FF
|
|
cmp #$0043 ; letter C?
|
|
bne BW
|
|
|
|
lda hPrint+prStl+wDev ;see if color/bw
|
|
and #f5
|
|
bne Color ;branch if color
|
|
BW pla
|
|
and #$7fff ;is b/w
|
|
pha
|
|
|
|
Color ;
|
|
lda 1,s ;get mode
|
|
sta curLLDMode ;save for CurLLDMode
|
|
pushword UserID
|
|
jsl LldSetMode ;set low level mode
|
|
|
|
Pushlong hpalette
|
|
Pushword #0
|
|
Pushword UserId
|
|
jsl lldsetcolor ;set the color
|
|
|
|
lda #0
|
|
|
|
ErrorExit rts
|
|
|
|
|
|
Export hpalette
|
|
hpalette DC.L $e19e00
|
|
|
|
Export PtrType
|
|
PtrType DS.B 10
|
|
|
|
ENDP
|
|
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: PrAbortCheck
|
|
*
|
|
* PURPOSE: This is the routine that is the default idel proc. if the user
|
|
* doesn't specifiy one in the print record.
|
|
*
|
|
* PASSED: NONE
|
|
*
|
|
* RETURNED: NONE
|
|
*
|
|
;------------------------------------------------------------------------------
|
|
PrAbortCheck PROC EXPORT should be in scc68k
|
|
|
|
more ;
|
|
PushWord #0
|
|
PushWord #$0408 KeyDown
|
|
PushPtr EventRecord
|
|
_getNextEvent
|
|
pla
|
|
beq bye
|
|
lda evtmsg
|
|
cmp #$2E
|
|
bne more
|
|
lda evtmods
|
|
and #$0100
|
|
beq more
|
|
|
|
lda #iPrAbort
|
|
sta iPrErr
|
|
bye rtl
|
|
|
|
ENDP
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: CallIdleProc
|
|
*
|
|
* PURPOSE:
|
|
* This routine calls the idle proc given in the print record.
|
|
* Upon return, it checks iPrErr. If it is not zero we do not
|
|
* return to calling routine.
|
|
*
|
|
* PASSED: NONE
|
|
*
|
|
* RETURNED: NONE
|
|
*
|
|
;------------------------------------------------------------------------------
|
|
CallIdleProc PROC EXPORT
|
|
|
|
jsl CallIt ;actually call the idle proc routine
|
|
lda iPrErr
|
|
beq Done
|
|
|
|
;--------------------------------------------------------------
|
|
;
|
|
; If user wanted to quit we should eject current page if something
|
|
; has been printed on it already.
|
|
;
|
|
ldy #fPgDirty
|
|
lda [PZ_PrStatus],y
|
|
beq dontEject ; if not dirty, don't eject
|
|
|
|
jsl NewPage
|
|
|
|
dontEject phb ; 3 bytes on stack this makes 4
|
|
plx ; now pull off 4
|
|
plx
|
|
brl EndOfPrinting
|
|
|
|
Done rtl
|
|
EJECT
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; NAME: CallIt
|
|
;
|
|
; PURPOSE: This routine sets up the stack so that it will rtl to the
|
|
; idle proc (which was specified in the print record, or the
|
|
; default one).
|
|
;
|
|
; PASSED: NONE
|
|
;
|
|
; RETURNED: NONE
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
EXPORT Callit
|
|
CallIt ;
|
|
lda hPrint+PrJob+pIdleProc+1 ;get the idel proc. addr.
|
|
pha ;push onto the stack
|
|
phb
|
|
lda hPrint+PrJob+pIdleProc
|
|
dec a
|
|
sta 1,s ;push the rest of the addr.
|
|
rtl ;rtl to the idle proc. routine
|
|
|
|
ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
*
|
|
* NAME: InsertPaperAlert
|
|
*
|
|
* PURPOSE: Alert Box for manual feed; to let user know the next sheet of
|
|
* paper should be inserted.
|
|
*
|
|
* PASSED: NONE
|
|
*
|
|
* RETURNED: NONE
|
|
*
|
|
;------------------------------------------------------------------------------
|
|
InsertPaperAlert PROC EXPORT
|
|
|
|
PushLong CursorAd
|
|
_SetCursor ; restore cursor back to arrow
|
|
|
|
pha ; make room for result
|
|
_GetMasterSCB
|
|
pla
|
|
pha ; make room for result of alert call
|
|
and #$80 ; check mode
|
|
beq mode320 ; 320 mode
|
|
|
|
pushlong #alerttemp640 ; use 640 mode template
|
|
bra GoOn
|
|
|
|
mode320 pushlong #alerttemp320 ; use 320 mode template
|
|
|
|
GoOn pushlong #$0000
|
|
_Alert
|
|
|
|
;------------------------------------------------------------
|
|
;
|
|
; Get the current cursor record's address and turn on the watch cursor.
|
|
;
|
|
|
|
PushLong #0 ; space for the address
|
|
_GetCursorAdr
|
|
pla
|
|
sta CursorAd
|
|
pla
|
|
sta CursorAd+2
|
|
|
|
_WaitCursor ; set to watch again
|
|
|
|
plx ; get the item hit off stack
|
|
|
|
rts
|
|
|
|
|
|
ENDP
|
|
|
|
|
|
;--------------------------------------------------------------
|
|
;
|
|
; ShowErr(msg)
|
|
;
|
|
|
|
ShowErr PROC EXPORT
|
|
input msgptr:l
|
|
begin +b
|
|
|
|
_SysBeep
|
|
_SysBeep
|
|
|
|
PushLong #0
|
|
_getport ;get current port
|
|
PushLong infoDPort
|
|
_setPort ;set to info. dialog port
|
|
|
|
PushPtr EraseInfoRect
|
|
_eraseRect ;erase whats already there
|
|
Pushlong InfoStrPos
|
|
_moveto ;move to where to draw text
|
|
PushLong msgptr
|
|
_drawString ;draw the text from InfoStrBuffer
|
|
|
|
_setPort ;restore the port
|
|
|
|
; Wait for a while to let the user see it.
|
|
lda #$1FFF
|
|
loop1 ldx #$00FF
|
|
loop2 dex
|
|
bne loop2
|
|
dea
|
|
bne loop1
|
|
|
|
return
|
|
ENDP |