0100 ; PRINT XL (C) 1997 THOR-SOFTWARE›0110 ; A PARALLEL PRINTER DRIVER›0120 ;›0130 ; THIS VERSION IS CONFIGURED FOR›0140 ; THE NEC P6 AND COMPATIBLE›0150 ; PRINTERS›0160 ;›0170 TURBO .= 1›0180 ;›0190 ; SET THIS TO 1 TO ASSEMBLE FOR›0200 ; TURBO BASIC, OR TO ZERO›0210 ; TO MOVE THE DRIVER BEHIND THE›0220 ; OS OF THE XL SERIES›0230 ; NOTE THE HW PATCH NEEDED FOR›0240 ; THAT! (MPDISABLE!)›0250 .IF TURBO=0›0260 *= $D800›0270 OLDBASE = $6000›0280 OFFA = $6000-$D800›0290 .SET 6,OFFA ;ASSEMBLY TO $D800, BUT PLACE IN $6000›0300 .ENDIF ›0310 .IF TURBO›0320 *= $1C7C ; BASE ADDRESS FOR TURBO BASIC›0330 OFFA = 0›0340 .ENDIF ›0350 .OPT OBJ›0360 CLRSTROBE = $3C›0370 SETSTROBE = $34›0380 BASE›0390 JMP START+OFFA›0400 JMP INIT›0410 .IF TURBO=0›0420 USERDL .BYTE $70,$70,$70,$70,$70,$70,$70,$70,$47›0430 .WORD BI›0440 .BYTE $70,$70,$70,$70,$70,$70,$06,$70,$70,$06,$41›0450 .WORD USERDL›0460 BI .SBYTE " PRINTER ERROR "›0470 .SBYTE " RETURN : RETRY "›0480 .SBYTE " ESC : ABORT "›0490 ; DISPLAY REQUESTER ON PRINTER TROUBLE›0500 ASKUSER›0510 JSR DELONE›0520 LDA 560›0530 PHA ›0540 LDA 561›0550 PHA ›0560 LDA 712›0570 PHA ›0580 LDA 708›0590 PHA ›0600 LDA 559›0610 PHA ›0620 AND #$F0›0630 ORA #$21›0640 STA 559›0650 LDA # USERDL›0680 STA 561›0690 LDA 756›0700 PHA ›0710 LDA 623›0720 PHA ›0730 AND #$3F›0740 STA 623›0750 LDA 755›0760 PHA ›0770 LDA #$00›0780 STA 755›0790 LDA #$E0›0800 STA 756›0810 LDA #0›0820 STA 712›0830 LDA #$0A›0840 STA 708›0850 JSR DELONE›0860 JSR SETHW›0870 SEI ›0880 WTKY›0890 LDA $D20F›0900 AND #$04›0910 BNE WTKY›0920 LDA $D209›0930 CMP #$1C›0940 BEQ ESC›0950 CMP #$0C›0960 BNE WTKY›0970 LDY #$01›0980 ESC›0990 LDA #$BF›1000 STA $D20E›1010 CLI ›1020 PLA ›1030 STA 755›1040 PLA ›1050 STA 623›1060 PLA ›1070 STA 756›1080 PLA ›1090 STA 559›1100 PLA ›1110 STA 708›1120 PLA ›1130 STA 712›1140 PLA ›1150 STA 561›1160 PLA ›1170 STA 560›1180 JSR DELONE›1190 JSR SETHW›1200 LDA #$FF›1210 STA 764›1220 CPY #$00›1230 RTS ›1240 SETHW JSR DELONE›1250 LDA 560›1260 STA $D402›1270 LDA 561›1280 STA $D403›1290 LDA 755›1300 STA $D401›1310 LDA 756›1320 STA $D409›1330 LDA 712›1340 STA $D01A›1350 LDA 708›1360 STA $D016›1370 LDA 623›1380 STA $D01B›1390 RTS ›1400 .ENDIF ›1410 ; INIT PIA CONNECTED TO PB PORT›1420 PIAINIT›1430 LDA #$38›1440 STA $D601›1450 STA $D603 ;CB2,CA2 LEVEL HIGH OUTPUT, IRQ OFF›1460 LDA #$FF›1470 STA $D602 ;PORT B OUTPUT›1480 LDA #$00›1490 STA $D600 ;PORT A INPUT›1500 LDA #CLRSTROBE›1510 STA $D601›1520 STA $D603›1530 RTS ›1540 SENDBYTE ; SEND A SINGLE BYTE›1550 PHA ›1560 LDY $41›1570 CPY #$03›1580 BNE NOSOUND1›1590 STA $D200 ; FOR PROPER SOUND ;-)›1600 LDA #$AF›1610 STA $D201›1620 NOSOUND1›1630 JSR WAITRD ;WAIT FOR PRINTER READY›1640 PLA ›1650 CPY #$00›1660 BMI ERSEN›1670 STA $D602 ;SET BYTE›1680 STA $D602›1690 LDA #SETSTROBE›1700 STA $D603›1710 STA $D603›1720 LDA #CLRSTROBE›1730 STA $D603 ;CB2=SROBE=HI›1740 JSR SOUNDOFF›1750 LDA #$FF›1760 STA WAITF›1770 LDY #$01›1780 ERSEN›1790 CPY #$00›1800 RTS ›1810 SOUNDOFF›1820 LDA $41›1830 CMP #$03›1840 BNE NOSN›1850 LDA #$A0 ;TURN OFF SOUND›1860 STA $D201›1870 NOSN RTS ›1880 WAITRD ; WAIT FOR PRINTER READY›1890 LDA $11 ;ABORT ?›1900 BEQ BRKABORT›1910 BIT WAITF›1920 BPL PRINTREADY›1930 LDA #3›1940 LDX # >1000›1950 LDY # <1000›1960 JSR $E45C ;SET TIMER›1970 LDA #$FF›1980 STA $022A›1990 WAITLP›2000 BIT $D603›2010 BMI PRINTREADY ;DONE ?›2020 LDA $022A›2030 BEQ TIMABORT›2040 LDA $11›2050 BEQ BRKABORT›2060 JSR SOUNDOFF›2070 CLC ›2080 BCC WAITLP›2090 BRKABORT›2100 JSR SOUNDOFF›2110 LDY #$80 ;ERROR : BRK - ABORT›2120 STY $11›2130 BMI PREX›2140 TIMABORT›2150 LDY #$8A ;ERROR : TIMEOUT›2160 LDA #$E1›2170 JSR GETPRINSTAT›2180 CLC ›2190 BCC PREX›2200 PRINTREADY›2210 LDY #$01›2220 LDA #$00›2230 STA WAITF›2240 BIT $D602 ;CLEAR: WAIT FINISHED›2250 PREX›2260 .IF TURBO=0›2270 CPY #$81›2280 BCC OKSND›2290 JSR SOUNDOFF›2300 JSR ASKUSER ;DISPLAY REQUESTER FOR FULL VERSION›2310 BPL WAITRD›2320 .ENDIF ›2330 OKSND›2340 ; BIT $D602 ;DON'T ERASE CB1 -> WAITING GETS MIXED UP›2350 CPY #$00›2360 RTS ›2370 GETPRINSTAT ; CHECK FOR PAPER_OUT,BUSY›2380 BIT $D600›2390 BVS PAPOUT›2400 BMI PBUS›2410 RTS ›2420 PBUS›2430 TAY ›2440 RTS ›2450 PAPOUT›2460 LDY #$E0›2470 RTS ›2480 OPEN ; CIO HANDLER OPEN›2490 .IF TURBO=0›2500 LDA $02›2510 CMP SAV2›2520 BNE CH2›2530 LDA $03›2540 CMP SAV2+1›2550 BEQ NCH2›2560 CH2›2570 LDA #$20›2580 STA OLD›2590 LDA $02›2600 STA OLD+1›2610 LDA $03›2620 STA OLD+2›2630 JSR SETVEC ;RESTORE HATABS›2640 NCH2›2650 .ENDIF ›2660 LDA $2A›2670 CMP #$08 ;WRITE ONLY ONLY›2680 BNE PRERR›2690 JSR PIAINIT›2700 LDA #$00›2710 STA EXBUF›2720 LDA $2B›2730 BEQ NOSMODE1›2740 AND #$03›2750 STA MODE ;AUX2 IS PRT MODE›2760 NOSMODE1›2770 LDA $21›2780 CMP #$01›2790 BEQ NOSMODE2›2800 AND #$03›2810 STA MODE ; OR DEVICE #›2820 NOSMODE2›2830 LDA #17›2840 JSR SENDBYTE ;ACTIVATE PRT›2850 PRERR›2860 RTS ›2870 CLOSE ; CIO CLOSE›2880 LDX EXBUF›2890 BEQ NEMT›2900 JSR NCBF3›2910 BMI CLF›2920 NEMT›2930 JSR WAITRD›2940 CLF›2950 RTS ›2960 GET›2970 RTS ›2980 PUT ; PUT BYTE VECTOR›2990 .IF TURBO›3000 TSX ;CHECK FOR BAD BASIC HACK HERE: DISABLE BURST MODE›3010 LDY $0102,X›3020 CPY #$C0›3030 BCS OS›3040 LDY #$01›3050 STY $28›3060 LDY #$00›3070 STY $29›3080 OS›3090 .ENDIF ›3100 JSR PUTIF›3110 BMI PUTER›3120 LDA $22›3130 CMP #$0B›3140 BNE PUTER›3150 PUTBURST›3160 LDA $29›3170 BNE DECBURST1›3180 LDA $28›3190 CMP #$02›3200 BCC PUTER›3210 DECBURST1›3220 LDA ($24),Y›3230 JSR PUTIF›3240 BMI PUTER›3250 LDA $28 ;BURST MODE›3260 BNE ND2›3270 DEC $29›3280 ND2›3290 DEC $28›3300 INC $24›3310 BNE ND3›3320 INC $25›3330 ND3›3340 CLC ›3350 BCC PUTBURST›3360 PUTER›3370 RTS ›3380 STATUS ; RETURN STATUS›3390 LDY #$03›3400 LDA #$00›3410 JSR GETPRINSTAT›3420 RTS ›3430 DELAY ; DELAY AFTER RESET›3440 LDX #50*2›3450 DLP›3460 JSR DELONE›3470 DEX ›3480 BNE DLP›3490 RTS ›3500 DELONE›3510 LDA $D40B›3520 BPL DELONE›3530 DW2›3540 LDA $D40B›3550 BMI DW2›3560 RTS ›3570 SPECIAL ; XIO ENTRY›3580 LDA $22›3590 CMP #$20›3600 BEQ DELAY ;DELAY 32›3610 CMP #$25 ;POINT = SET MODE›3620 BEQ SETMODE›3630 CMP #$26 ;NODE = GET MODE›3640 BNE PUTER›3650 LDA MODE›3660 STA $034C,X›3670 LDA #$00›3680 STA $034D,X›3690 LDY #$01›3700 RTS ›3710 SETMODE›3720 LDA $034C,X›3730 AND #$03›3740 STA MODE›3750 LDY #$01›3760 RTS ›3770 PUTIF ; PUT MAIN PROCEDURE›3780 LDY MODE›3790 CPY #$01›3800 BNE NODIRECT›3810 PUTOKBY›3820 JSR SENDBYTE ;W/O TRANSLATION›3830 RTS ›3840 PUTOKEX›3850 LDY #$01›3860 PUTOKEX2›3870 RTS ›3880 NODIRECT›3890 JSR ESCREP ;PARSE ESC SEQUENCES›3900 BEQ PUTOKEX›3910 BMI PUTOKEX2›3920 PUTREC›3930 LDY MODE›3940 CMP #$9B ;EOL TRANSLATION?›3950 BNE NOEOL›3960 LDX # EOLTXT›3980 LDA #2›3990 JSR BPUT›4000 RTS ›4010 NOEOL›4020 CPY #$02›4030 BNE NOERALL›4040 AND #$7F ;SEVEN BIT MODE ?›4050 CMP #$20›4060 BCC PUTOKEX›4070 BCS PUTOKBY›4080 NOERALL›4090 CPY #$00 ;GFX MODE ?›4100 BEQ PUTOKBY›4110 JSR TOINTERN›4120 JSR FILLBUFFER›4130 LDX # GRAPHBUFFER›4150 LDA #GRAPHBUFFERL›4160 JSR BPUT›4170 RTS ›4180 BPUT ; PUT BYTE ARRAY›4190 STX $32›4200 STY $33›4210 STA $34›4220 CMP #$00›4230 BEQ BPUTOK›4240 BPLOP›4250 LDY #$00›4260 LDA ($32),Y›4270 JSR SENDBYTE›4280 BMI BPUTER›4290 INC $32›4300 BNE ND4›4310 INC $33›4320 ND4 DEC $34›4330 BNE BPLOP›4340 BPUTOK›4350 LDY #$01›4360 BPUTER›4370 CPY #$00›4380 RTS ›4390 TOINTERN ; ATASCII -> ANTIC OFFSET›4400 CMP #$00›4410 PHP ›4420 AND #$7F›4430 CMP #$60›4440 BCS NOTRANS›4450 SEC ›4460 SBC #$20›4470 BCS NOTRANS›4480 ADC #$60›4490 NOTRANS›4500 LDX #$00›4510 STX $33›4520 ASL A›4530 ROL $33›4540 ASL A›4550 ROL $33›4560 ASL A›4570 ROL $33›4580 STA $32›4590 LDA $02F4›4600 CLC ›4610 ADC $33›4620 STA $33›4630 LDA #$00›4640 PLP ›4650 BPL NOMIN›4660 EOR #$FF›4670 NOMIN›4680 STA $34›4690 RTS ›4700 FILLBUFFER›4710 LDA # GRAPHCHAR›4740 STA $39›4750 LDA #$80›4760 STA $3A›4770 FL1›4780 LDA #$00›4790 STA $3B›4800 FL2›4810 LDY $3B›4820 LDA MASK1,Y›4830 STA $3C›4840 LDA MASK2,Y›4850 STA $3D›4860 LDA BYTPT,Y›4870 STA $3E›4880 LDA ($32),Y›4890 EOR $34›4900 AND $3A›4910 BNE SETBF›4920 JSR CLRBIT›4930 CLC ›4940 BCC CLDN›4950 SETBF›4960 JSR SETBIT›4970 CLDN›4980 INC $3B›4990 LDA $3B›5000 CMP #$08›5010 BCC FL2›5020 LDA $38›5030 CLC ›5040 ADC #$09›5050 STA $38›5060 BCC ND6›5070 INC $39›5080 ND6›5090 LSR $3A›5100 BCC FL1›5110 RTS ›5120 SETBIT›5130 LDY $3E›5140 LDX #$02›5150 SBL1 LDA ($38),Y›5160 ORA $3C›5170 STA ($38),Y›5180 INY ›5190 LDA ($38),Y›5200 ORA $3D›5210 STA ($38),Y›5220 INY ›5230 INY ›5240 DEX ›5250 BPL SBL1›5260 RTS ›5270 CLRBIT›5280 LDY $3E›5290 LDX #$02›5300 CBL2 LDA $3C›5310 EOR #$FF›5320 AND ($38),Y›5330 STA ($38),Y›5340 INY ›5350 LDA $3D›5360 EOR #$FF›5370 AND ($38),Y›5380 STA ($38),Y›5390 INY ›5400 INY ›5410 DEX ›5420 BPL CBL2›5430 RTS ›5440 MASK1 .BYTE $E0,$1C,$03,$70,$0E,$01,$38,$07›5450 MASK2 .BYTE $00,$00,$80,$00,$00,$C0,$00,$00›5460 BYTPT .BYTE $00,$00,$00,$01,$01,$01,$02,$02›5470 MODE .BYTE 0›5480 WAITF .BYTE 0›5490 EXBUF .BYTE 0›5500 EOLTXT .BYTE $0A,$0D›5510 GRAPHBUFFER .BYTE "*",39,24,0›5520 GRAPHCHAR .DS 72 ;BUFFER FOR GFX›5530 GRAPHBUFFERL = *-GRAPHBUFFER›5540 MODETAB .BYTE 0,1,0,2,3›5550 SAV2 .WORD 0›5560 INITALL ; INSTALL HANDLER›5570 LDX #-3›5580 SLOP›5590 INX ›5600 INX ›5610 INX ›5620 LDA $031A,X›5630 BEQ NOCH›5640 CMP #'P›5650 BNE SLOP›5660 .IF TURBO›5670 LDA # NEWTAB›5700 STA $031C,X›5710 .ELSE ›5720 LDA # <$03C0›5730 STA $031B,X›5740 LDA # >$03C0›5750 STA $031C,X›5760 JSR INSHATAB ; TRICKY NON-TURBO MODE: PLACE HANDLER TABLE IN PRT BUFFER›5770 .ENDIF ›5780 NOCH›5790 JSR PIAINIT›5800 LDA #0 ;RESET PIA AND PRT MODE›5810 STA MODE›5820 STA WAITF›5830 STA EXBUF›5840 RTS ›5850 NEWTAB ; HANDLER TABLES›5860 .IF TURBO›5870 .WORD OPEN-1›5880 .WORD CLOSE-1›5890 .WORD GET-1›5900 .WORD PUT-1›5910 .WORD STATUS-1›5920 .WORD SPECIAL-1›5930 .ELSE ›5940 .WORD DALLG-1›5950 .WORD DALLG-1›5960 .WORD DALLG-1›5970 .WORD DALLG-1›5980 .WORD DALLG-1›5990 .WORD DALLG-1›6000 OFFS = $03C0-NEWTAB›6010 PRET›6020 DRET = PRET+OFFS›6030 STA $D301 ;SNEAKY EXIT CODE›6040 PLA ›6050 RTS ›6060 PALLG›6070 DALLG = PALLG+OFFS›6080 PHA ›6090 LDA $D301›6100 AND #$BF ;MAP OUT MATH PACK. THIS REQUIRES THE HW HACK›6110 STA $D301›6120 JMP HANDLEALL›6130 ; END OF PAGE 3›6140 HANDLEALL ; TRICKY STACK MANIPULATION›6150 TSX ›6160 LDA $0103,X›6170 CMP #$C0›6180 BCS OS2 ;CHECK HERE FOR BASIC HACK›6190 LDA #$0B›6200 STA $22›6210 LDA #$00›6220 STA $29›6230 LDA #$01›6240 STA $28›6250 OS2›6260 LDA $22›6270 CMP #$0E›6280 BCC NOHAN1›6290 LDA #$0E›6300 NOHAN1›6310 ASL A›6320 TAX ;CALCULATE OFFSET MYSELF›6330 LDA INTHATABS,X›6340 STA JSR+1›6350 LDA INTHATABS+1,X›6360 STA JSR+2›6370 PLA ›6380 LDX $2E›6390 JSR JSR $FFFF›6400 PHA ›6410 LDA $D301›6420 ORA #$40›6430 JMP DRET›6440 INTHATABS .WORD 0,0,0,OPEN,0,GET,0,GET,0,PUT,0,PUT,CLOSE,STATUS,SPECIAL›6450 .ENDIF ›6460 INIT›6470 JSR SETVEC›6480 JSR INITALL›6490 OLD›6500 JSR $FFFF›6510 JSR SETVEC›6520 .IF TURBO›6530 RTS ›6540 .ELSE ›6550 LDA $03F8›6560 ASL A›6570 ORA #$FD›6580 PHA ›6590 JMP DRET›6600 .ENDIF ›6610 SETVEC›6620 .IF TURBO›6630 LDA # INIT›6670 STA $03›6680 STA SAV2+1›6690 .ELSE ›6700 LDA # <$03ED›6710 STA $02›6720 STA SAV2›6730 LDA # >$03ED›6740 STA $03›6750 STA SAV2+1›6760 .ENDIF ›6770 LDA $09›6780 ORA #$02›6790 STA $09›6800 RTS ›6810 ESCREP ; ESC PARSER›6820 LDY #$01›6830 LDX EXBUF›6840 BNE NOEX1›6850 CMP #' ;1ST CHR : ESC›6860 BNE NCBF1›6870 INX ›6880 BNE BF1›6890 NOEX1›6900 CPX #$01›6910 BNE NOEX2›6920 CMP #'* ;2ND CHR : *›6930 BNE NCBF2›6940 INX ›6950 BNE BF2›6960 NOEX2›6970 CMP #'1›6980 BCC NCBF3›6990 CMP #'6›7000 BCS NCBF3›7010 AND #$07›7020 CMP #$05›7030 BNE STMD›7040 JSR DELAY›7050 CLC ›7060 BCC STMD2›7070 STMD›7080 TAX ›7090 LDA MODETAB,X›7100 STA MODE ;CHANGE MODE›7110 STMD2 LDX #$00›7120 BEQ BF3›7130 NCBF2 PHA ›7140 LDA #'›7150 JSR PUTREC›7160 CLC ›7170 BCC SFC›7180 NCBF3 PHA ›7190 LDA #'›7200 JSR PUTREC›7210 CPY #$00›7220 BMI SFC›7230 LDA #'*›7240 JSR PUTREC›7250 SFC LDA #$00›7260 STA EXBUF›7270 PLA ›7280 NCBF1›7290 CPY #$00›7300 RTS ›7310 BF1›7320 BF2›7330 BF3›7340 STX EXBUF›7350 LDY #$00›7360 RTS ›7370 .IF TURBO=0›7380 INSHATAB›7390 LDX #$27›7400 IH LDA NEWTAB,X›7410 STA $03C0,X›7420 DEX ›7430 BPL IH›7440 LDX #$09›7450 IL LDA RESVEC,X›7460 STA $03ED,X›7470 DEX ›7480 BPL IL›7490 RTS ›7500 RESVEC›7510 LDA #$BF›7520 STA $D301›7530 JMP $D803›7540 .ENDIF ›7550 START›7560 .IF TURBO=0›7570 LDA # OLDBASE›7600 STA $33›7610 LDA # BASE›7640 STA $35›7650 LDY #$00›7660 LDX #$08›7670 LDA #$BF›7680 STA $D301›7690 CLP2›7700 LDA ($32),Y›7710 STA ($34),Y›7720 INY ›7730 BNE CLP2›7740 INC $33›7750 INC $35›7760 DEX ›7770 BNE CLP2›7780 .ENDIF ›7790 LDA $09›7800 AND #$02›7810 BEQ NORES›7820 LDA $02›7830 STA OLD+1›7840 LDA $03›7850 STA OLD+2›7860 LDA #$20›7870 STA OLD›7880 BNE NORES2›7890 NORES›7900 LDA #$EA›7910 STA OLD›7920 STA OLD+1›7930 STA OLD+2›7940 NORES2›7950 JMP INIT›