0200 ; ********************************* 0210 ; ********************************* 0220 ; *** SOFTWARE PRINTER INTERFACE ** 0230 ; *** ALAN MACY MAY 21, 1983 ** 0240 ; *** ** 0250 ; *** THESE ROUTINES ALLOW A ** 0260 ; *** DIRECT CONNECTION TO A ** 0270 ; *** PRINTER VIA JOYSTICK PORTS ** 0280 ; *** 1, 2, AND 3. ** 0290 ; ********************************* 0300 ; ********************************* 0310 ; 0320 *=$600 ; PAGE 6 FREE AREA 0330 .OPT NOEJECT 0340 .TITLE "PRINTER INTERFACE MACY MAY 21, 1983" 0350 ; 0360 ; EQUATE TABLE ************************** 0370 ; 0380 PORTA=$D300 ;FOR PORTS 1&2 0390 PORTB=$D301 ;FOR PORTS 3&4 0400 PACTL=$D302 ;CONTROL, PORTA 0410 PBCTL=$D303 ;CONTROL, PORTB 0420 ATCR=155 ;ATASCII CARRIAGE RETURN 0430 CR=13 ;ASCII CARRIAGE RETURN 0440 LF=10 ;LINE FEED 0450 FF=12 ;FORM FEED 0460 LPPG=56 ;LINES/PAGE 0470 ; 0480 ; DEVICE HANDLER VECTOR TABLE ************ 0490 ; 0500 .WORD POPEN-1 ;OPEN PRINTER 0510 .WORD PCLOS-1 ;CLOSE PRINTER 0520 .WORD NOGOT-1 ;GETBYTE 0530 .WORD CHOUT-1 ;PUTBYTE 0540 .WORD NOGOT-1 ;GETSTAT 0550 .WORD NOGOT-1 0560 ; 0570 ; SINGLE CHARACTER OUTPUT ROUTINE ******** 0580 ; CHARACTER IN ACCUMULATOR 0590 ; 0600 CHOUT STA ASAVE 0610 CMP #ATCR ;ATASCII RETURN 0620 BNE SEND ;CHAR=ATAS RETURN? 0630 LDA #CR ;YES, REPLACE WIT 0640 ; A "REAL ASCII CR" 0650 JSR CHOUT ;USE RECURSION TO 0660 ; OUTPUT CR THEN LF 0670 LDA #LF ;A LINEFEED 0680 STA ASAVE 0690 INC LINNUM ;INCREMENT PAGE LINE NUMBER 0700 LDA #LPPG ;COMPARE WITH 0710 CMP LINNUM ;LINES/PAGE 0720 BPL SEND ;IF NOT TO END OF PAGE 0730 ; AT PAGE END 0740 LDA #FF ;A FORM FEED 0750 STA ASAVE 0760 LDA #00 ;RESET LINE NUMBER 0770 STA LINNUM 0780 SEND LDA # 4 ; CHK BIT 2 TO SEE IF BUSY 0790 AND PORTB 0800 BNE SEND ;PRINTER BUSY? 0810 LDA ASAVE ;NO, GET THE CHAR 0820 STA PORTA ;STORE CHAR IN PORT 0830 LDA #$FE ;11111110 0840 AND PORTB 0850 STA PORTB ;STROBE LOW 0860 ; MUST HOLD STROBE LOW 0870 ; FOR A BIT TO BE SURE 0880 ; PRINTER GOT THE MESSAGE 0890 LDX #$10 ;DELAY COUNTER 0900 XLOOP DEX ;COUNT DOWN 0910 BPL XLOOP ;CONTINUE UNTIL <=0 0920 LDA #$01 ; 00000001 0930 ORA PORTB 0940 STA PORTB ;STROBE HIGH AGAIN 0950 ; 0960 ; THE STROBE HAS NOW BEEN PULSED 0970 ; TELLING THE PRINTER THAT A CHAR 0980 ; MAY BE TAKEN 0990 LDY #01 ;SET STATUS=ALL OK 1000 RTS 1010 ; 1020 ; ROUTINE TO OPEN PRINTER **************** 1030 ; INVOLVES RECONFIGURING PORTS 1040 ; 1050 POPEN LDA #$FB ;FIRST PORTA 1060 AND PACTL ;CLEAR BIT 2 1070 STA PACTL 1080 LDA #$FF ;SET FOR ALL OUTPUT 1090 STA PORTA 1100 LDA #$04 ;SET BIT 2 1110 ORA PACTL 1120 STA PACTL 1130 LDA #$FB ;NOW DO PORTB 1140 AND PBCTL 1150 STA PBCTL 1160 LDA #$09 ;BITS 0 AND 3 OUT 1170 STA PORTB ;BITS 1&2 INPUT 1180 LDA #$04 1190 ORA PBCTL 1200 STA PBCTL 1210 LDA #$09 1220 STA PORTB ;MAKE SURE THAT 1230 ; INPUT PRIME AND STROBE 1240 ; ARE HIGH TO START WITH 1250 LDA #00 ;SET LINE NUMBER 1260 STA LINNUM ;TO ZERO 1270 LDY #01 ;STATUS=ALL OK 1280 RTS 1290 ; 1300 PCLOS LDY #01 ;COME HERE FOR CLOSE 1310 ; SET STATUS=ALL OK 1320 RTS 1330 ; 1340 NOGOT RTS ;COME HERE WHEN DON'T HAVE THE ROUTINE 1350 ; 1360 LDA #LF ;USE THIS FOR TESTING 1370 JSR CHOUT ;IT OUPUTS A LF 1380 BRK 1390 ; 1400 ; STORAGE LOCATIONS ********************** 1410 ; 1420 ASAVE .BYTE 0 1430 LINNUM .BYTE 0
Back to previous page