;TTYHAN.P65 BY ERIC SMITH ; ;HANDLER FOR BAUDOT TELETYPE THROUGH MSB OF AN OUTPUT PORT ; ;NOTE: THIS HANDLER MUST BE MADE INTO A SAVE FILE WITH ;SYSBOMB SET FALSE BEFORE IT CAN BE INSTALLED, SINCE OTHERWISE ;THE RETURN TO APEX WILL JUST REMOVE IT AGAIN. .DEF ORIGIN=$E400 .DEF PORT=$FE00 .DEF PTR=$00 .DEF PAGLEN=60 .DEF MARGIN=6 .DEF WIDTH=72 .DEF DEVTAB=$BFC0 .DEF DEV=2 .DEF DEVOFS=DEV+DEV .DEF REENT=$BF06 .LOC ORIGIN INSTAL: DMOV# TTYHAN,DEVTAB+DEVOFS JMP REENT TTYHAN: JMP ERROR ;OPENI NOT SUPPORTED JMP OPENO JMP ERROR ;CHIN NOT SUPPORTED JMP CHOUT JMP CLOSE ERROR: SEC RTS .PAGE ;OPEN PRINTER DEVICE OPENO: JSR RESPAG ;RESET TO TOP OF PAGE JMP FLUSH ;DISCARD BUFFER CONTENTS ;CLOSE PRINTER ROUTINE CLOSE: LDA# $0C ;ASCII FF JSR CHOUT ;LEAVE PAPER AT PAGE BOUNDARY DCMP# BUFPTR,BUFADR+1 ;IS THERE ANYTHING IN THE BUFFER? BGE PRBUF ; YES, PRINT IT DUMMY1: CLC RTS ;GENERAL OUTPUT A BYTE ENTRY CHOUT: AND# $7F ;MASK OFF HIGH BIT PHA ;SAVE THE CHARACTER DMOV BUFPTR, PTR ;MOVE POINTER TO ZERO PAGE LDY# $00 ;NO INDEX PLA ;GET CHARACTER BACK STA@Y PTR ;STORE CHARACTER IN BUFFER DINC BUFPTR ;BUMP POINTER DCMP# BUFPTR,BUFEND ;IS BUFFER FULL? BLT DUMMY1 ; NO, RETURN TO CALLER PRBUF: LDY# 100 NXTPLS: MOV# $7F,PORT LDA# 42 ;4.99 MSEC JSR TIMER MOV# $FF,PORT LDA# 91 ;21.944 MSEC JSR TIMER DEY BNE NXTPLS LDA# $00 ;INDICATE UNKNOWN STA CASE ; SHIFT STATUS DMOV# BUFADR,PTR GETCHR: LDY# $00 LDA@Y PTR PHA AND# $60 BNE PRTCHR PLA CMP# $0D ;RETURN? BEQ DOCR ; HANDLE IT CMP# $09 ;TAB? BEQ DOTAB ; GO TO IT CMP# $07 ;BELL? BEQ DOBEL ; RING IT CMP# $0C ;FORM FEED? BNE PRNEXT ; NO, IGNORE IT EJECT: JSR WFEED ;ADVANCE LINE LDA COUNT ;AT PAGE TOP NOW? CMP# PAGLEN BNE EJECT ;LOOP UNTIL COUNT ZERO JMP PRNEXT DOTAB: LDA# $10 ;SPACE JSR PRIOUT ;AT LEAST ONE SPACE LDA HPOS ;NOW CHECK HORIZONTAL AND# $07 ;FOR A TAB STOP BNE DOTAB ;AND LOOP IF REQUIRED JMP PRNEXT DOBEL: LDA# $51 ;BELL JSR PRCHAR JMP PRNEXT DOCR: JSR ENDLIN JMP PRNEXT PRTCHR: PLA CMP# $40 BLT FIG AND# $1F FIG: TAX LDAX XLTTAB BPL NRMCHR TAY SPCCHR: LDAY SPCTBL PHA AND# $7F JSR PRIOUT PLA BMI PRNEXT INY BNE SPCCHR NRMCHR: JSR PRIOUT PRNEXT: DINC PTR DCMP PTR,BUFPTR BLT GETCHR FLUSH: DMOV# BUFADR,BUFPTR CLC RTS ;OUTPUT A PRINTING CHARACTER PRIOUT: PHA INC HPOS LDA HPOS CMP# WIDTH+1 BLT NOWRAP JSR ENDLIN NOWRAP: PLA ;LOW LEVEL CHARACTER OUTPUT PRCHAR: PHA AND# $03 BEQ SENDIT CMP CASE BEQ SENDIT STA CASE TAX LDAX CASE JSR SERIAL SENDIT: PLA ORA# $03 SERIAL: LDX# 7 NXTBIT: PHA STA PORT LDA# 102 ;27.4 MSEC JSR TIMER PLA ASLA DEX BNE NXTBIT RTS ENDLIN: LDA# $08 ;CR JSR PRCHAR WFEED: LDA# $20 ;LF JSR PRCHAR JSR RESLIN DEC COUNT BNE RET LDA# MARGIN STA COUNT MRGLOP: LDA# $20 ;LF JSR PRCHAR DEC COUNT BNE MRGLOP RESPAG: LDA# PAGLEN STA COUNT ;STORE IN COUNTER RESLIN: LDA# 0 STA HPOS RET: RTS TIMER: SEC ;DELAY (26+27A+5A^2)/2 USEC TIMER2: PHA TIMER3: SBC# $01 BNE TIMER3 PLA SBC# $01 BNE TIMER2 RTS .PAGE XLTTAB: .BYTE ATCHR-SPCTBL ;'@' .BYTE $62 ;'A' .BYTE $4E ;'B' .BYTE $3A ;'C' .BYTE $4A ;'D' .BYTE $42 ;'E' .BYTE $5A ;'F' .BYTE $2E ;'G' .BYTE $16 ;'H' .BYTE $32 ;'I' .BYTE $6A ;'J' .BYTE $7A ;'K' .BYTE $26 ;'L' .BYTE $1E ;'M' .BYTE $1A ;'N' .BYTE $0E ;'O' .BYTE $36 ;'P' .BYTE $76 ;'Q' .BYTE $2A ;'R' .BYTE $52 ;'S' .BYTE $06 ;'T' .BYTE $72 ;'U' .BYTE $3E ;'V' .BYTE $66 ;'W' .BYTE $5E ;'X' .BYTE $56 ;'Y' .BYTE $46 ;'Z' .BYTE LBCHR-SPCTBL ;'[' .BYTE BSCHR-SPCTBL ;'\' .BYTE RBCHR-SPCTBL ;']' .BYTE UACHR-SPCTBL ;'^' .BYTE USCHR-SPCTBL ;' ' .PAGE .BYTE $10 ;' ' .BYTE $59 ;'!' .BYTE $45 ;'"' .BYTE $15 ;'#' .BYTE $49 ;'$' .BYTE PCCHR-SPCTBL ;'%' .BYTE $2D ;'&' .BYTE $69 ;''' .BYTE $79 ;'(' .BYTE $25 ;')' .BYTE STCHR-SPCTBL ;'*' .BYTE PLCHR-SPCTBL ;'+' .BYTE $19 ;',' .BYTE $61 ;'-' .BYTE $1D ;'.' .BYTE $5D ;'/' .BYTE $35 ;'0' .BYTE $75 ;'1' .BYTE $65 ;'2' .BYTE $41 ;'3' .BYTE $29 ;'4' .BYTE $05 ;'5' .BYTE $55 ;'6' .BYTE $71 ;'7' .BYTE $31 ;'8' .BYTE $0D ;'9' .BYTE $39 ;':' .BYTE $3D ;';' .BYTE LTCHR-SPCTBL ;'<' .BYTE EQCHR-SPCTBL ;'=' .BYTE GTCHR-SPCTBL ;'>' .BYTE $4D ;'?' .PAGE .DEF SPCTBL=.-$80 ATCHR: .BYTE $62 ;'AT' .BYTE $86 LBCHR: .BYTE $26 ;'LB' .BYTE $CE BSCHR: .BYTE $4E ;'BS' .BYTE $D2 RBCHR: .BYTE $2A ;'RB' .BYTE $CE UACHR: .BYTE $72 ;'UA' .BYTE $E2 USCHR: .BYTE $72 ;'US' .BYTE $D2 PCCHR: .BYTE $36 ;'PC' .BYTE $BA STCHR: .BYTE $52 ;'ST' .BYTE $86 PLCHR: .BYTE $36 ;'PL' .BYTE $A6 LTCHR: .BYTE $26 ;'LT' .BYTE $86 EQCHR: .BYTE $42 ;'EQ' .BYTE $F6 GTCHR: .BYTE $2E ;'GT' .BYTE $86 .PAGE CASE: .BYTE ;CURRENT CASE .BYTE $6F ;FIGURE SHIFT CODE .BYTE $7F ;LETTER SHIFT CODE HPOS: .BYTE COUNT: .BYTE BUFPTR: .WORD .DEF END=. .DEF BUFADR=. .DEF BUFEND=$E800 .DEF LENGTH=END-ORIGIN-1 .LOC $BF00 JMP INSTAL ;RESTART ENTRY POINT JMP INSTAL ;START ENTRY POINT .LOC $BF15 .WORD ORIGIN .BYTE >LENGTH+1 .END