


       NAM M2RIO
       OPT O,S
*       NAM: M2RIO  VER: 1.3  DAT: 05-07-76  CMP: M6800
*
*        SYS:M68RES
*
*        DES:THIS IS THE M6800 RESIDENT I/O PACKAGE
*            FOR USE WITH THE RESIDENT EDITOR 1.3 AND
*            RESIDENT ASSEMBLER 1.3 UTILIZING
*            MINIBUG II AND EVAL MODULE II
*
*        REV:0
*
*        NOTE: FOR USE WITH ASM 1.2 AND EDT 1.2
*              ASTART EQU $8F4 ASM1.2 START
*              ESTART EQU $1641 EDT1.2 START
*
*-
       SPC 2
       SPC 4
*       ***************************************
*       ***************************************
*
*       THIS IS THE I/O DRIVER REGION
*       THE FOLLOWING DRIVER ROUTINES ARE REQUIRED:
*
*       CI  CONSOLE DEVICE INPUT ROUTINE. RETURNS WITH
*           INPUT CHARACTER IN A-REGISTER. DOES NOT
*           ECHO CHARACTER
*
*       CIE CONSOLE DEVICE INPUT ROUTINE. SAME AS CI
*           BUT ECHOS CHARACTER.
*
*       CO  CONSOLE OUTPUT ROUTINE. OUTPUTS CHARACTER
*           IN A-REGISTER.
*
*       POC PUNCH DEVICE OUTPUT CHARACTER ROUTINE.
*           OUTPUTS CHARACTER IN A-REGISTER. TURNS
*           PUNCH ON.
*
*       POR PUNCH DEVICE OUTPUT RECORD ROUTINE.
*           OUTPUTS CHARACTER STRING POINTED TO BY
*           X REGISTER AND TERMINATED BY $04. TURNS
*           PUNCH ON AND OFF.
*
*       RIC READER DEVICE INPUT CHARACTER ROUTINE.
*           READS RECORD INTO BUFFER IF BUFFER EMPTY.
*           RETURNS WITH NEXT CHARACTER FROM BUFFER IN
*           A-REGISTER IF NO TIME OUT OCCURRED, AND
*           ALSO RESETS CARRY. IF TIME OUT OCCURRED,
*           CARRY IS SET AND A-REGISTER CONTAINS $1A.
*           TURNS PUNCH OFF BEFORE READING. CARRIAGE
*           RETURN ENDS RECORD.
*
*       RIR READER DEVICE INPUT RECORD ROUTINE. READS
*           RECORD INTO BUFFER. TURNS PUNCH OFF
*           BEFORE READING. CARRIAGE RETURN ENDS
*           RECORD.
*
*       **********************************************
*       **********************************************
       SPC 4
*      MINIBUG EQUATES
INCHNP EQU $E11F MINIBUG CHARACTER INPUT
OUTCH   EQU $E108 OUTPUT CHAR
PDATAM EQU $E130 MINIBUG PDATA1
AECHO  EQU $A00C INCHNP NO ECHO FLAG
MTTYDI EQU $8009      TTY DATA IN
MTTYDO EQU $8009      TTY DATA OUT
MTTYSI EQU $8008      TTY STATUS IN
MTTYSO EQU $8008      TTY STATUS OUT
SBIT   EQU $A019 STOP BIT CONTROL FOR ACIA
MINBUG EQU $E040 MINIBUG ENTRY POINT
       SPC 5
*       ASSEMBLER AND ED TOR ENTRY LOCATIONS
       SPC 1
ASTART EQU $304 ASSEMBLER 1.3 ENTRY POINT
ESTART EQU $1610 EDITOR 1.3 ENTRY POINT
       SPC 5
       ORG $F0
*       I/O FLAG AND STORAGE AREA
RCEMT  RMB 1 READ BUFFER EMPTY FLAG
RCGCPT RMB 2 READ GET CHAR POINTER
NTIMEO RMB 1 RIR NO TIME OUT FLAG
PNCH   RMB 1 PUNCH ON FLAG
IOSVX1 RMB 2 SAVE X REG
IOSVX2 RMB 2 SAVE X 
       SPC 4
       ORG $100
*       I/O JUMP TABLE
ASM    JMP ASTART ENTER ASSEMBLER
ED     JMP ESTART ENTER EDITOR
XIOINT JMP INXIO INITIALIZE IO
XPOC   JMP POC PUNCH OUTPUT - CHAR
XPOR   JMP POR PUNCH OUTPUT - RECORD
XRIC   JMP RIC READER INPUT - CHAR
XRIR   JMP RIR READER INPUT - RECORD
XCO    JMP CO CONSOLE OUTPUT
XCI    JMP CI CONSOLE INPUT - NO ECHO
XCIE   JMP CIE CONSOLE INPUT - ECHO
XDATA  JMP PDATA PRINT CR LF DATA STRING
XDATA1 JMP PDATA1 PRINT DATA STRING
XCRLF  JMP PCRLF PRINT CR LF
XLEAD  JMP LEAD PUNCH LEADER-TRAILER
XNCHON JMP PNCHON TURN PUNCH ON
XNCHOF JMP PNCHOF TURN PUNCH OFF
XBUG   JMP MINBUG ENTER MINIBUG
XHEAD  JMP XDATA PRINT ASSEMBLY HEADING
XLINE  JMP XDATA1 PRINT ASSEMBLY LINE
JUMP1  JMP * RESERVED JUMP LOCATION
JUMP2  JMP * RESERVED JUMP LOCATION
       SPC 4
*       SUBROUTINE TO INITIALIZE IO FLAGS
INXIO  EQU *
       CLR RCEMT READ BUFFER EMPTY
       CLR PNCH PUNCH IS OFF
        CLR NTIMEO TIME OUT
       RTS
       SPC 5
*       SUBROUTINE TO INPUT CHARACTER FROM CONSOLE
CI     EQU * CONSOLE INPUT
       SEC
       ROL AECHO
       BRA CI1
CIE    CLR AECHO
CI1    JSR INCHNP MINIBUG CHARACTER INPUT
***    STRIP CHARACTERS FROM INPUT ***
       LDX #NCHAR
CI2    CMP A X BAD CHAR?
       BEQ CI1 YES - IGNORE CHAR
       INX NO-KEEP CHECKING
       CPX #ENCHAR DONE?
       BNE CI2 NO
***********************************
       RTS
       SPC 5
*       SUBROUTINE TO OUTPUT CHARACTER TO CONSOLE
CO     EQU *
       CMPA #$09 TAB?
       BNE CO1 NOT TAB
       LDAA #$20 CHANGE TAB TO SPACE
CO1    CMP A #$D C/R?
       BNE CO2 NO
       BRA XCRLF YES-OUTPUT CR LF
CO2    JSR OUTCH OUTPUT CHAR
CO4    RTS
       SPC 4
*       SUBROUTINE TO PUNCH 5 INCHES OF BLANK TAPE
LEAD   EQU *
        LDAB #50 5 IN=50 CHARS
LEAD1  CLRA
        BSR XPOC PUNCH NULL
        DECB
        BNE LEAD1 NOT DONE
        BRA XNCHOF TURN PUNCH OFF
       SPC 5
*       SUBROUTINE TO PUNCH CHARACTER
POC    EQU *
       BSR XNCHON TURN PUNCH ON
       BRA XCO
       SPC 5
*       SUBROUTNE TO PUNCH DATA STRING
POR    EQU *
       BSR XNCHON TURN PUNCH ON
       JSR PDATA1 PUNCH DATA STRING
       BRA XNCHOF TURN PUNCH OFF
       SPC 5
*       SUBROUTINE TO READ RECORD - CHARACTER ORIENTED
RIC    EQU *
       TST RCEMT BUFFER EMPTY?
       BNE RIR19 NO-GET NEXT CHAR
       CLR NTIMEO YES-RESET NTIMEO FLAG
       BRA RIR3 READ RECORD
       SPC 2
*       SUBROUTINE TO READ RECORD - RECORD ORIENTED
RIR    INC NTIMEO SET NTIMEO FLAG
RIR3   LDX #RCBUF FILL BUFFER WITH CR'S
       LDAA #$D
RIR71  STAA X
       INX
       CPX #RCBUF+72 DONE?
       BNE RIR71 NO-KEEP FILLING
        TST PNCH YES-PUNCH ON?
       BEQ RDR NO-GO TEST SPEED
       JSR XNCHOF YES-TURN PUNCH OFF
       SPC 1
       SPC 1
       SPC 1
RDR      LDAA SBIT READER RELAY ON
       ORA A #$40
       STAA MTTYSO
       SPC 1
       LDAA #$11 DC1 READER ON
       JSR OUTCH
       SPC 1
RDR09  EQU *
       LDX #RCBUF READ RECORD INTO BUFFER
RDR11  SEC
       JSR INCT INPUT CHAR
       SPC 1
       STAA X STORE CHAR
       BCS RDR31 TIME OUT-STOP READING
       CMPA #$D C/R?
       BEQ RDR31 YES-STOP READING
        SPC 1
       CPX #RCBUF+71 BUFFER FULL?
       BEQ RDR11 YES-SKIP REST OF RECORD
       INX
       BRA RDR11 GET NEXT CHAR
RDR31  EQU *
       CLR NTIMEO RESET NTIMEO FLAG
       LDAA SBIT READER RELAY OFF
        STAA MTTYSO
        LDAA #$13 READER OFF
        JSR OUTCH
       LDX #FOUR0 OUTPUT 4 NULLS
       JSR PDATAM 
       SPC 1
       INC RCEMT SET BUFFER NOT EMPTY
       LDX #RCBUF INZ GET CHAR POINTER
       STX RCGCPT
       SPC 1
RIR19  LDX RCGCPT GET NEXT CHAR
            LDAA X (A) CHAR
        INX INC GET CHAR POINTER
       STX RCGCPT SAVE GET CHAR POINTER
       CMPA #$1A END OF TEXT?
       BEQ RIR33 YES
       CMPA #$D CR?
       BNE RIR31 NOT C/R
RIR33  CLR RCEMT SET BUFFER EMPTY
RIR31  RTS
       SPC 5
*       SUBROUTINE TO TURN PUNCH ON
PNCHON EQU *
       TST PNCH PUNCH ALREADY ON?
       BNE P20 YES-RETURN
       PSH A NO-SAVE A REG
       INC PNCH SET PUNCH ON FLAG
       LDAA SBIT
       CMPA #$15 30 CPS?
       BNE P10
       LDAA #$10
       BSR OCHAR ATTENTION RDC
       LDAA #'0 TURN PRINTER OFF
       JSR OCHAR
P10    EQU *
***    SEND RUBOUT BEFORE PUNCH ON ****************
       LDA A #$7F
       BSR OCHAR
*********************************************
       LDAA #$12 TURN TTY PUNCH ON
       BSR OCHAR OUTPUT CHAR
       PUL A RESTORE A REG
P20    RTS
       SPC 4
*       SUBROUTINE TO TURN PUNCH OFF
PNCHOF EQU *
       LDAA #$14 TURN TTY PUNCH OFF
       BSR OCHAR OUTPUT CHAR
       LDAA SBIT
       CMPA #$15 30 CPS?
       BNE PUN325 NO
       LDAA #$10
       BSR OCHAR ATT. RDC
       LDAA #'9 TI PRINTER ON
       BSR OCHAR
PUN325 EQU *
       CLR PNCH RESET PUNCH ON FLAG
       RTS
       SPC 5
*
*      SUBROUTINE TO PRINT OR PUNCH DATA STRING
*      POINTED TO BY X REG
*
PDATA  BSR PCRLF PRINT CR/LF
PDATA1 LDAA X
       CMPA #4
       BEQ PDATA9 STOP ON EOT
       BSR OCHAR
       INX
       BRA PDATA1
PDATA9 RTS
       SPC 2
PCRLF  STX IOSVX2
       LDX #CRLF   CR LF      STRING
       BSR PDATA1
       LDX IOSVX2
       RTS
       SPC 5
*
*      SUBROUTINE TO OUTPUT CHAR IN A REG
*      IF CR , FOLLOW WITH 4 NULLS
*
OCHAR  STX IOSVX1
       JSR OUTCH OUTPUT CHAR
       CMPA #$D IS IT CR?
       BNE OCHAR9 NO
       LDX #FOUR0
       JSR PDATAM MINIBUG PDATA
OCHAR9 LDX IOSVX1
       RTS
       SPC 4
*       SUBROUTINE TO READ CHARACTER - NO PARITY
INCT   EQU *
        STX IOSVX1 SAVE X REG
INCT2  TST NTIMEO WANT TIME OUT TEST?
       BEQ INCT3 YES
       JSR XCI NO-USE CI ROUTINE
       BRA INCT6 GO CHECK CHAR
INCT3  LDX #$FF00 SET TIME OUT COUNTER
INCT5  DEX
        BEQ INCT9 TIME OUT
       LDAA MTTYSI
       ASRA
       BCC INCT5 NOT READY
       LDAA MTTYDI INPUT DATA
       ANDA #$7F REMOVE PARITY
INCT6  LDX #NCHAR IGNORE CHARS
CCHK   CMP A X
       BEQ INCT2 BAD CHAR
       INX
       CPX #ENCHAR DONE?
       BNE CCHK NO
       CMP A #$09 TAB?
       BNE INCT7 NO
       LDA A #$20 YES-CHANGE TO SPACE
INCT7  LDX IOSVX1 RESTORE X REG
       CLC CLEAR CARRY-NO TIME OUT
       RTS
       SPC 1
INCT9  LDAA #$1A TIME OUT
       LDX IOSVX1 RESTORE X REG
       SEC SET TIME OUT BIT
       RTS
       SPC 5
*       CHARACTERS STRIPPED FROM INPUT:
*       NULL, RUBOUT, LINE FEED, DC1, DC2, DC3, DC4
NCHAR  FCB 0,$7F,$0A,$11,$12,$13,$14
ENCHAR EQU *
CRLF     FCB $D,$A,4
FOUR0  FCB 0,0,0,0,4
       SPC 5
*       PUT READER BUFFER JUST BEFORE $300
RCBUF  EQU $300-73
       SPC 5
       END
