org $1000 ********************************* * PRINTER CARD I FIRMWARE * * * * P1-2 (341-0005) * * * * WOZ 11/1/77 * * APPLE COMPUTER INC. * * ALL RIGHTS RESERVED * * * * REVISED 3 / 17 / 1978 * * HUSTON AND SANDER * * * * --------------------------- * * PROM ADDRESSING * * --------------------------- * * * * $CN00.CN3F --> $CN40.CN7F * * $CN40.CN7F --> $CN00.CN3F * * $CN80.CNBF --> $CNC0.CNFF * * $CNC0.CNFF --> $CN80.CNBF * * * * --------------------------- * * DEFAULT SETTINGS * * --------------------------- * * * * ESCAPE CHARACTER IS CTRL-I * * VIDEO-ALSO AND CRLF ON * * * * --------------------------- * * AFTER ESCAPE CHARACTER * * --------------------------- * * * * (OPTIONAL SET PRINTER WIDTH) * * * * I: SET VIDEO ALSO * * J: CLR CRLF, VID-ALSO * * K: CLR CRLF * * L: SET CRLF * * M: SET CRLF, VID-ALSO * * N: CLR VIDEO ALSO * * * ********************************* * CH EQU $24 ;CURSOR HORIZONTAL INDEX CSWL EQU $36 ;LOW ORDER COUT SWITCH BYTE PWDTH EQU $4B8 ;PRINTER WIDTH MSTRT EQU $538 ;MARGIN START MODE EQU $5B8 ;AFTER ESC CHAR ESCHAR EQU $638 ;CURRENT ESC CHAR FLAGS EQU $6B8 ;B7=VID-ALSO, B0=CRLF COL EQU $738 ;COLUMN COUNT DEV EQU $C080 ;+$N0 ACTIVATES THE DEV LINE COUT1 EQU $FDF0 ;VIDEO OUTPUT ENTRY IORTS EQU $FF58 ;FIXED RTS INSTRUCTION * * ENT0 CLC ;DEFAULT ENTRY HEX BO ENT1 SEC ;NORMAL ENTRY PHA TXA PHA TYA PHA PHP SEI ;DISABLE INTERRUPTS JSR IORTS ;RETURNS $CN ABOVE STACK TSX PLA PLA PLA PLA TAY ;CHAR TO Y-REGISTER DEX TXS ;GET $CN FROM ABOVE STACK PLA PLP ;RESTORE STATUS TAX ;$CN TO REG X BCC DEFAULT LDA MODE,X ;AFTER ESC CHAR? BPL ESCTEST ;BRANCH IF NO TYA AND #$7F ;MASK OUT BIT 7 EOR #$30 ;ALTER BITS CMP #$0A ;"0"-"9"? BCC DIG ;BRANCH IF YES CMP #$78 ;"H"-"O"? BCS SETFLG ;YES, SET OR CLR FLAGS EOR #$3D ;CHECK FOR CARRIAGE RETURN BEQ ESCTEST ;DON'T CHANGE ESC CHAR IF CR TYA ;GET ORIGINAL CHAR AGAIN AND #$9F ;MAKE IT A CTRL CHAR STA ESCHAR,X ;STORE NEW ESC CHAR BCC DONE ;BRANCH ALWAYS TAKEN * * ESCTEST LDA FLAGS,X BMI ESCTST LDA CH CMP COL,X BCS ESCTST CMP #$11 BCS ESCTST ORA #$F0 AND COL,X ASC CH STA CH ESCTST LSR ;MAKE IT POSITIVE DEFAULT SEC BCS ESCTST1 ;BRANCH ALWAYS TAKEN * * SETFLG CLC ROR AND FLAGS,X BCC SETFLG1 EOR #$81 SETFLG1 STA FLAGS,X BNE DONE * * DIG LDY #$0A DLOOP ADC MSTRT,X ;ADD 10*MSTRT TO DIG AND STORE DEY ; IN PRINTER WIDTH (MARGIN) BNE DLOOP STA PWDTH,X MINIT STA MSTRT,X ;UPDATE MARGIN START SEC ; INDICATE 'AFTER ESC CHAR' BCS DONE1 ;BRANCH ALWAYS * * VIDEO EQU * ;MUST KEEP CURSOR HORIZ. CMP CH ;IN RANGE OF PRWDTH BCC SETCH ;BRANCH IF >40 PLA TAY PLA TAX ;RESTORE REGISTERS AND PLA ;END WITH VIDEO OUT JMP COUT1 * * ORG ENT0+#$80 BCC * ;IMAGE 'WAIT FOR READY' BCS * ;IMAGE (ESCTST & DEFAULT) * * * * OUT STA DEV,Y ;OUTPUT CHAR TO PRINTER BCC PRNT ;LOOP IF WAS TAB EOR #$7 ;IF CR, MAKE IT LF TAY ; COPY TO REG,Y EOR #$0A ASL ;CARRIAGE RETURN IN 7 LSB'S? BNE FINISH ;BRANCH IF NOT CR CLV ; INDICATE THAT IT WAS CR STA CH ;RESET CURSOR HORIZ. STA COL,X ;CLEAR COLUMN COUNT FINISH LDA FLAGS,X ;FOR CRLF CHECK (BIT 0) LSR BVS FINISH1 ;BRANCH IF LAST CHAR NOT CR BCS ESCTST1 FINISH1 ASL ;CHECK HI ORDER BIT OF FLAGS ASL LDA #$27 ;LOADED JUST FOR VIDEO MODE BCS VIDEO LDA COL,X ;CHECK FOR WITHIN 8 CHARS SBC PWDTH,X ;OF PRINTER WIDTH CMP #$F8 BCC SETCH ;IF NO, THEN DONE ADC #$27 ;ADD 32 (FORMING 32-29) LDY IORTS ;DUMMY LDY ABSOLUTE ORG *-2 SETCH LDA #$00 STA CH DONE CLC DONE1 ROR MODE,X PLA TAY PLA TAX PLA RTS * * ORG ENT0+#$C0 PRNT BCC PRNT1 ;TAKEN WHEN PRINTER READY ESCTST1 BCS *+2 BPL ESCTST2 * * LDA #$89 ;DEFAULT CHARACTER (CONTROL-I) STA ESCHAR,X STA FLAGS,C ;VIDEO ALSO, CRLF ON LDA #$28 STA PWDTH,X LDA #>ENT1 STA CSWL ;SET FOR NORMAL ENTRY ESCTST2 TYA ; MOVE CHAR TO REG-A EOR ESCHAR,X ASL ;ESC CHAR? (7LSB'S) BEQ MINIT ;BRANCH IF YES LSR MODE,X ;NO, CLR 'AFTER ESC CHAR' TYA PHA ; SAVE CHAR ON THE STACK TXA ASL ASL ;GENERATE N*$10 AS AN INDEX TO ASL ; THE DEVICE LINE (REG-Y) ASL TAY PRNT1 LDA COL,X CMP CH ;IF COLUMN>= CURSOR HORIZ PLA ; THEN USE CHAR BCS CTLTST PHA AND #$80 ;ELSE GEN BLANK (7 LSB'S) ORA #$20 ; FOR TAB CATCH-UP CTLTST BIT IORTS BEQ PRNT2 ;INCR COLUMN COUNT INC COL,X ; IF NOT A CONTROL CHAR PRNT2 BVS OUT ;TAKEN WHEN PRINTER READY