ENTRY DerefColor ENTRY HookProc ENTRY LLDExit4 ENTRY LLDExit2 ENTRY LLDExit10 ENTRY LLDExit8 ENTRY ScreenShoot ENTRY LLDExit6 ENTRY FormFeed ENTRY LLDExit0 ENTRY ResetPrinter ENTRY SendRC ; ENTRY PrintCheck ENTRY MovePen ENTRY SetColor ENTRY SetColorT ENTRY GetColorT ENTRY Pattern ENTRY SpeDens ENTRY VSizing ENTRY DrvrBitMap ENTRY ContLine ENTRY DrvrRect ENTRY LandStock ENTRY HightLand ENTRY FlagT ENTRY FlagB ENTRY CurrentLine ENTRY ContLine ENTRY VSizing ENTRY CurrentDef ENTRY FlagBlack ENTRY SendBuff ENTRY SendRCLF ENTRY LittleSkip ENTRY WasImage ENTRY WasImage1 ENTRY WasImage2 ENTRY MakeLine ENTRY MakeBlankLine ENTRY FinalPat ENTRY BitMapShoot ENTRY SendSingleCar ENTRY SendBPrep ENTRY WriteStr ENTRY StrCmp ENTRY HeightLine01 ENTRY EndTime,DrawTime,PortTime,TmpTime,StartTime include 'm16.msl' ; LLD.MAIN0 ;------------------------------------------------------------------------------ ; ; Low Level Tables and Equates ; ;------------------------------------------------------------------------------ HandleReal EQU $F4 PointerReal EQU $F8 LLDSystem PROC EXPORT EXPORT MyPID MyPID DC.W 0 42 EXPORT MyWAP MyWAP DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 DC.B 0 ENDP ; LLD.MAIN1 ; ; Main LLD. ; * Zero page equates (While in Low Level Driver) (Allocated at users +$100) HandleDrvr EQU $00 MemoryDrvr EQU $04 Quality EQU $06 HandleColor EQU $08 HandleScreen EQU $0C PtrBitMap EQU $10 PtrColor EQU $14 HandleIO EQU $18 PtrBlack EQU $20 PtrRed EQU $24 PtrBlue EQU $28 PtrYellow EQU $2C PtrLocal EQU $30 PenPosH EQU $34 PenPosV EQU $36 NewPenPosH EQU $38 NewPenPosV EQU $3A Lock EQU $3E PageRectPtr EQU $40 PageRect EQU $44 PtrInfo EQU $4C Stock EQU $50 Stock2 EQU $52 PtrID EQU $54 ;Recharge gequ $58 Go EQU $5C Status EQU $66 ;FlagRecharge gequ $74 BackColor EQU $76 PtrRect EQU $96 ;BackFlag gequ $9A MyStack EQU $9C RealStack EQU $9E SaveStack EQU $A0 JobPrint EQU $A2 StockWStr EQU $A4 StockWTxt EQU $A8 PageRectL EQU $AA Stack EQU $AE SaveStack2 EQU $F0 MyId EQU $F2 Owner EQU $F4 HandleID EQU $F8 Error EQU $F6 DarkerMode EQU $FA ; ; MyWap equates ; NbUser EQU $0E PID EQU $1E PenPosVW EQU $18 IDBack EQU $1a GraphP EQU $1c IDWap EQU $16 Killer EQU $24 PMID EQU $0012 EJECT Export Cidrvr Cidrvr PROC ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; ; NAME: LLDStartUp ; ; PURPOSE: Starts up the low level routines ; ; PASSED: WORD Zero Page ; WORD User ID ; ; RETURNED: (A-reg.) =0, No Errors ; =$1308: error in establishing connection ; with the printer (Suki 5/25/88) ; =$1321, LLDStartup already made ; =Memory Mgr. Errors returned unchanged ; NOTE: 'Error' retains error value ; ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ;----------------------------------------------- EXPORT LLDStartUp LLDStartUp jsl xLLDStartUp rtl ;----------------------------------------------- EXPORT xLLDStartUp xLLDStartUp ; * Stack: 1: Rtls * 7: ID * 9: ZeroPage phb ;save users bank phk ;get this programs bank plb ;set bank to programs bank ;----------------------------------------------------------- ; ; commented out the following branch since it is not taken in ; normal conditions, and if taken, the stack is not cleaned up ; properly. Suki Lee 6/24/88 ; ;Now see if this is initial time ; lda MyWap+$16 ;get ID ; bne JustStartUp ;branch if not first time * * Here zero page is needed * PushWord #0 _MMStartUP ;make sure memory manager is started pla sta MyPID sta MyWap+$16 ;save ID in MyWap ok1 ; phd ;save D-reg. ; Stack: 1: Direct zero page ; 3: Plb ; 4: Rtls ; 10: ID ; 12: ZeroPage lda 12,s ;get passed direct page tcd ;use passed direct page ; ;This initlizes the zero page values ; ok6 ; ldx #3 lda #0 ldy #$18 LoopInitWap sta MyWap,y ;init. MyWap table iny iny dex bne LoopInitWap pld ;Put user zero-page plb ;Put user data bank register ; ;Just startup (no initialization stuff) ; JustStartUp ; phd lda 11,s ;One allowed zero-page ! tcd sta MyWap ;Save zero page addess * Stack: 1: ZeroPage application * 3: Rtls * 9: ID * 11: ZeroPage * Now the startup begins * Clear this new zero-page ldx #$F6 lda #0 loop sta <0,x dex dex bpl loop lda MyWap+IDWap ;get Waps ID sta MyID ;put in zero page * Stack: 1: ZeroPage application * 3: Rtls * 9: ID * 11: ZeroPage ; * Allocate memory for IOBuffer ; PushLong #0 PushLong #$2800 PushWord itsAppleTalk ;¥¥ New code from Suki, 10/9/89 ÑÑMSL stz ReadingDone stz ReadingLength PushWord #0 ; space for actual length Pushptr MyCompletion PushWord #10 ; the response to self ID is no more than 10 bytes Pushptr ReadBuffer _PrDevAsyncRead pla ; this value is invalid at this ; point in time since this is an ; async read call ;¥¥ @didAppleTalk jsr ResetPrinter lda #0 ;indicate no errors on return Exit plb pld brl LLdExit4 AppleTalk STR 'APPLETALK' EXPORT itsAppleTalk itsAppleTalk DS.W 1 ;------------------------------------------------------------------------------ * Error on StartUp, We simulate a ShutDown to finish ;----------------------------------------------------------------------------- * Stack: 1: HandleIO * 5: ZeroPage application * 7: Rtls * 13: ID * 15: ZeroPage ErrorOpen ; ply ply sta ReadError txa sta >ReadingLength ; actual length read lda #True sta >ReadingDone rtl EXPORT ReadError ReadError DS.B 2 EXPORT ReadingDone ReadingDone DS.B 2 EXPORT ReadingLength ReadingLength DS.B 2 EXPORT ReadBuffer ReadBuffer DS.B 10 ;¥¥ Export ComptCol ComptCol DC.W 0 ;Counter used in init. of color tables Export InitColor InitColor DC.W $0000 ;Initial color palette values DC.W $0F00 DC.W $00F0 DC.W $000F DC.W $0088 DC.W $0808 DC.W $0066 DC.W $0555 DC.W $0AAA DC.W $0F80 DC.W $08F8 DC.W $0F88 DC.W $0FF0 DC.W $0F0F DC.W $00FF DC.W $0FFF EJECT ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; ; NAME: LLDShutDown ; ; PURPOSE: Shuts down the low level stuff ; ; PASSED: WORD User ID ; ; RETURNED: (A-reg.) =zero, No errors ; =$1108, Locked User ; ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ;----------------------------------------------- EXPORT LLDShutDown LLDShutDown jsl xLLDShutDown rtl ;----------------------------------------------- EXPORT xLLDShutDown xLLDShutDown phd ;Take user's ZeroPage lda MyWap ;get saved LLD zero page addr. tcd ;use it Bit Lock ;Check if locked User bmi ShutLock lda 9,s ;User ID jsr ShutDown ;ShutDown the user ; ;We arrive here when we need to kill a low level call ; * Stack: 1: ZeroPage application * 3: Rtls * 9: ID KillLLD ; * Now return to MicroLLD _PrDevClose stz MyWap+$16 ;flag for next entry (done for now) pld lda #0 brl LLDexit2 * Error for ShutDown ShutLock ; lda #$1108 Error: Locked User SErrID ; pld brl LLdExit2 Error: Unknown user ;------------------------------------------------------------------------------ ; ; NAME: ShutDown ; ; PURPOSE: Subroutine which aids in shutting down low level routines ; ; PASSED: (A-reg.) User ID ; ; RETURNED: NONE ; ;------------------------------------------------------------------------------ * Real Shutdown. Entry: A ID * D User zeroPage ShutDown ; sta ; PushLong #WrapIt ;force linefeed when lines wrap (draft) jsr WriteStr lda DraftModeQuality beq @didmode bit #$0800 beq @ckCorr PushLong #NLQMode jsr WriteStr bra @didmode @ckCorr bit #$0100 beq @didmode PushLong #CorrMode jsr WriteStr @didmode * Stack: 1: Direct Page Application * 3: rtls * 9: ID user * 11: Quality lda 11,s ;get quality sta B/W vs Color * 4000 => landscape vs portrait * 2000 => vertical sizing * 0002 => Hires vs Highcolor * 0001 => 640 vs 320 * From quality we set up other variables: * spedens: 0 if portrait or 320 * 4000 if landscape 640 lores * 8000 if landscape 640 hires (144dpi) * vsizing 8000 if portrait and vsizing * currentDef: 4 if highcolor and spedens=0 * 8 other BitMapDrvr PROC EXPORT ;------------------------------------------------------------------------------ ; ; NAME: BitMapShoot ; ; PURPOSE: Performs the actual printing of a bitmap image ; ; PASSED: NONE ; ; RETURNED: NONE ; ;------------------------------------------------------------------------------ EXPORT BitMapShoot BitMapShoot jsr Pattern ;setup the initial print patterns phb ;Activate local Data Bank Register phk plb stz SpeDens ;init. variables stz Vsizing lda TmpTime:l) **PROFILE Loop ; ldx #$00F0 ; assume a full buffer for now lda s_Length ; get current strings length bne @1 brl done ; branch if nothing left in the buffer @1 cmp #$00F0 ; see if more than $f0 characters bge FullBuff ldx s_Length ; if not, send all that's left FullBuff stx WriteLength PushPtr CompleteWrite PushLong s_buffer ;strings pointer addr. Pushword WriteLength _PrDevWrite bcc AllsWell LoopWait jsr GetStatus lda PStatus bne LoopWait AllsWell lda s_Length ; adjust buffer length by the amount sec ; we just sent sbc WriteLength sta s_Length lda s_buffer ; increment buffer pointer accordingly clc adc WriteLength sta s_buffer bcs @1 brl Loop @1 inc s_buffer+2 ;if to next bank, inc. bank brl Loop Done ; tool _GetTick,out=(>EndTime:l) **PROFILE ; sublong >EndTime,>TmpTime,>TmpTime ; addlong >TmpTime,>PortTime,>PortTime lda #0 ; all's cool ErrorExit cmp #1 rts ;-------------------------------------------------------------- ; ; Completion routine for PAPWrite which does nothing since we won't ; return from port driver till the write is done. ; CompleteWrite rtl Export s_Length s_Length DS.B 2 ;temporary for strings length Export s_Buffer s_Buffer DS.B 4 ;temporary pointer to strings text WriteError DS.B 2 WriteLength DS.B 2 ENDP ; LLD.Color ***************************** * * * CiDrvr: Printer Driver IW * * Color Drvr * * * * Current Rev: Nov. 1987 * * * ***************************** ;------------------------------------------------------------------------------ ; ; NAME: SetColor ; ; PURPOSE: Copies to the location specified by the pointer, the color ; palette table which is specified by the passed SCB byte. ; (Called by LLDSetColor) ; ; PASSED: LONG Pointer to color palette ; WORD SCB (which defines palette table) ; WORD User ID ; ; RETURNED: NONE ; ;------------------------------------------------------------------------------ ColorDrvr PROC EXPORT EXPORT SetColor SetColor * Stack: 1: rts * 3: Direct page * 5: rtls * 11: ID * 13: Color palette * 15: Ptr to color palette jsr DerefColor ;dereference color table lda 13,s ;get SCB value and #$000F ;look only at color table bits xba ;times $20 to correct palette table lsr a lsr a lsr a clc adc 0 ;18(NOTE: addr. is stuffed by MakeStatus) plb rep #$30 longa on longi on and #1 rts ;------------------------------------------------------------------------------ ; ; NAME: MakeStatus ; ; PURPOSE: Stuffs the addr. of the routine that gets the status into ; the routine "GoStatus". ; ; PASSED: NONE ; ; RETURNED: NONE ; ;------------------------------------------------------------------------------ EXPORT MakeStatus MakeStatus phb phk plb pha tdc clc adc #