DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦7bcbb6565⟧ TextFile

    Length: 22272 (0x5700)
    Types: TextFile
    Names: »mpasc5«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »mpasc5« 

TextFile

*********************************************
*
*        P A S C A L   I/O   ROUTINES
*
*      COPYRIGHTED 1980 BY MOTOROLA, INC.
*
* VERSION  1.00 : 7-25-80
         TTL     68K PASCAL KDM I/O : VER  1.00
*
*********************************************
         SPC     4
         ORG     0
* FILE PARAMETER BLOCK - OFFSETS FROM FILE DESCRIPTOR POINTER
*        PASCAL PARAMETER BLOCK
FP       DS.L    1             FILE POSITION
PFS      DS.W    1             PASCAL FILE STATUS
CS       DS.W    1             COMPONENT SIZE
DEVID    DS.L    1             DEVICE ID
DDTAD    DS.L    1             DDT ADDRESS
IOLEN    DS.L    1             I/O LENGTH
IOSAD    DS.L    1             BUF START ADDR
IOEAD    DS.L    1             BUF END ADDR
*        COMPONENT BUFFER
CB       EQU     *
TXTBS    EQU     132           TEXT BUFFER SIZE
         SPC     4
         ORG     0
* PASCAL FILE STATUS WORD BIT ASSIGNMENTS
PFSSO    DS.B    1             STANDARD OUTPUT
PFSSI    DS.B    1             STANDARD INPUT
PFSTF    DS.B    1             TEXT FILE
PFSLF    DS.B    1             LOCAL FILE
PFSIF    DS.B    1             INDEXED FILE
         DS.B    1             RESERVED FOR INTERACTIVE FILE
PFSOP    DS.B    1             OPEN
PFSEOF   DS.B    1             END OF FILE
PFSEOLN  DS.B    1             END OF LINE
         DS.B    1             PASSED ASSIGNED
         DS.B    1             ACCESS PERMISSION CHANGED
         DS.B    1             COMMAND LINE FILE
PFSOUT   DS.B    1             OUTPUT
ISTAT    EQU     $3F           INITIAL STATUS
         SPC     4
*
* DEVICE DESCRIPTOR TABLE (DDT)
*
         ORG     0
DLINK    DS.L    1             LINK
DID      DS.L    1             DEVICE ID
DINIT    DS.L    1             INIT SUBROUTINE BRANCH
DRST     DS.L    1             RESET SUBROUTINE BRANCH
DRWT     DS.L    1             REWRITE SUBROUTINE BRANCH
DREAD    DS.L    1             READ SUBROUTINE BRANCH
DWRITE   DS.L    1             WRITE SUBROUTINE BRANCH
DCLOSE   DS.L    1             CLOSE SUBROUTINE BRANCH
DADDR    DS.L    1             DEVICE ADDRESS
DSAAD    DS.L    1             DEVICE SPECIFIC AREA (DSA) ADDR
DINTAB   DS.L    1             INITIALIZATION TABLE
         SPC     4
********************************
*
* EQUATE TO START OF JUMP TABLE
* LOCATES ALL FOLLOWING ROUTINES
*
START    EQU     $1000
*
********************************
         SPC     4
         RORG    START+$E00
***********************
*
* VERSION NUMBER IN OBJECT
*
         DC.L    ' 100'
*
***********************
         SPC     4
*
* CONTROL TABLE
* CONTAINS CONTROL BRANCHES AND VARIABLES
*
DDTLINK  DC.L    PRT1DDT-*     DDT LINK
TRP1HNDB BRA     TRP1HNDL      TRAP 1 HANDLER
CBREAKB  BRA     CBREAK        CHECK FOR BREAK
CBREAKAD DC.L    ACIA1         BREAK ACIA ADDR
CBREAKHB BRA     CBREAKH       BREAK HANDLER
CWAITB   BRA     CWAIT         CHECK FOR WAIT
CWAITAD  DC.L    ACIA1         WAIT ACIA ADDR
CWAITCH  DC.B    $17           WAIT CHAR (CTL-W)
         DC.B    0             NOT USED
EOF      DC.L    1             END OF FILE ERROR (DREAD)
         PAGE
*
* DEVICE AND TRAP HANDLERS FOR
* M68000 DESIGN MODULE (KDM)
*
         SPC     1
*
* KDM EQUATES
*
ACIA1    EQU     $3FF01        TERMINAL ACIA
ACIA2    EQU     $3FF21        HOST ACIA
CODEBKPT EQU     0             CODED BREAKPOINT
         SPC     1
*
* DEVICE SPECIFIC AREA
* MUST BE IN RAM
*
         ORG     $9F0
P1DSA    DS.L    2             PORT 1
P2DSA    DS.L    2             PORT 2
         SPC     1
*
* LABELS TO DSA ENTRIES
*
         ORG     0
CHRNL    DS.B    1             CHAR NULL PAD COUNT
CRNL     DS.B    1             CR NULL PAD COUNT
EOFCHR   DS.B    1             EOF CHAR
         DS.B    1             ACIA CONTROL BYTE
DELCHR   DS.B    1             DELETE CHAR CHAR
CANCHR   DS.B    1             CANCEL LINE CHAR
ECHOCHR  DS.B    1             ECHO LINE CHAR
         SPC     1
*
* KDM DEVICE DESCRIPTOR TABLES (DDT)
*
         RORG    START+$1200   START OF KDM I/O
PRT1DDT  DC.L    PRT2DDT-*     LINK
         DC.L    'PRT1'        DEVICE ID
         BRA     AINIT         INIT SUB
         BRA     ARST          RST SUB
         BRA     ARWT          RWT SUB
         BRA     P1RD          READ SUB
         BRA     AWRT          WRITE SUB
         BRA     ACLO          CLO SUB
         DC.L    ACIA1         DEV ADDR
         DC.L    P1DSA         DSA ADDR
         DC.B    0             CHAR NULL PAD COUNT INIT
         DC.B    0             CR NULL PAD COUNT INIT
         DC.B    $1A           EOF CHAR (CTL-Z) INIT
         DC.B    $15           ACIA CTL CHAR INIT
         DC.B    $7F           DELETE CHAR (DEL)
         DC.B    $18           CANCEL LINE (CTL-X)
         DC.B    $04           ECHO LINE (CTL-D)
         DC.B    0             NOT USED
         SPC     1
PRT2DDT  DC.L    0             LINK
         DC.L    'PRT2'        DEVICE ID
         BRA     AINIT         INIT SUB
         BRA     ARST          RST SUB
         BRA     ARWT          RWT SUB
         BRA     P2RD          READ SUB
         BRA     AWRT          WRITE SUB
         BRA     ACLO          CLO SUB
         DC.L    ACIA2         DEV ADDR
         DC.L    P2DSA         DSA ADDR
         DC.B    0             CHAR NULL PAD COUNT INIT
         DC.B    0             CR NULL PAD COUNT INIT
         DC.B    $1A           EOF CHAR (CTL-Z) INIT
         DC.B    $15           ACIA CTL CHAR INIT
         DC.B    $7F           DELETE CHAR (DEL)
         DC.B    $18           CANCEL LINE (CTL-X)
         DC.B    $04           ECHO LINE (CTL-D)
         DC.B    0             NOT USED
         PAGE
*
* TRAP 1 HANDLER
* RETURNS TO MACSBUG VIA CODED BREAKPOINT
*
TRP1HNDL EQU     *
         TRAP    #15
         DC.W    CODEBKPT
         BRA.S   TRP1HNDL      ; DON'T PERMIT CONTINUATION
         SPC     5
*
* CHECK FOR WAIT
* ONLY MODIFY CCR
*
CWAIT    EQU     *
         MOVEM.L D0/A0,-(A7)   ; SAVE REGS
         MOVE.L  CWAITAD,A0    ; GET ACIA ADDR
         MOVE.B  (A0),D0       ; IF CHAR THEN
         LSR.B   #1,D0
         BCC.S   CW1
CW2      EQU     *             ; .REPEAT
         MOVE.B  2(A0),D0      ; .UNTIL CHAR # WAIT CHAR
         CMP.B   CWAITCH,D0
         BEQ.S   CW2
CW1      EQU     *             ; FI
         MOVEM.L (A7)+,D0/A0   ; DONE
         RTS
         SPC     5
*
* CHECK FOR BREAK
* ONLY MODIFY CCR
*
CBREAK   EQU     *
         MOVEM.L D0/A0,-(A7)   ; SAVE REGS
         MOVE.L  CBREAKAD,A0   ; GET ACIA ADDR
         MOVE.B  (A0),D0       ; IF BREAK (*FRAMING ERROR*) THEN
         AND.B   #$10,D0
         MOVEM.L (A7)+,A0/D0
         BEQ.S   CB1
         BRA     CBREAKHB      ; .SERVICE BREAK (*PERMIT RETURN*)
CB1      EQU     *             ; FI
         RTS                   ; DONE
         SPC     5
*
* BREAK HANDLER
*
CBREAKH  EQU     *
         TRAP    #15           ; CODED BREAKPOINT
         DC.W    CODEBKPT
         RTS                   ; DONE (*PERMIT CONTINUATION*)
         SPC     5
*
* ACIA INITIALIZATION
* ASSUMES ACIA IS ALREADY INITIALIZED.  SETS UP DSA.
*
* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7
*                   D
*                   A   *
*
* ON ENTRY:
*        D7.L    RETURN ADDR FROM INIT FUNCTION
*
*        A0.L    POINTER TO CURRENT DDT
*        A3.L    ADDR OF LONG JSR ROUTINE
*        A5.L    GLOBAL VARIABLE POINTER
*        A6.L    LOCAL VARIABLE POINTER
*        A7.L    STACK POINTER
*
* ON EXIT:
*        D7,A0,A3,A5,A6 ARE PRESERVED
*
*****
* ENTRY POINT
*****
AINIT    EQU     *
         MOVEA.L DSAAD(A0),A1  ; GET DSA ADDR
         MOVE.L  DINTAB(A0),(A1) ; INIT DSA

         MOVE.L  DINTAB+4(A0),4(A1)
         RTS                   ; DONE
         SPC     5
*
* ACIA RESET
* CLEARS ERROR STATUS THEN RETURNS
*
* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7
*                   D *
*                   A
*
* ON ENTRY:
*        D1.L    PASCAL FILE STATUS
*        D7.L    RETURN ADDR TO PASCAL PROGRAM
*
*        A0.L    POINTER TO CURRENT DDT
*        A2.L    POINTER TO FILE DESCRIPTOR
*        A3.L    ADDR OF LONG JSR ROUTINE
*        A4.L    ALTERNATE LEVEL POINTER
*        A5.L    GLOBAL VARIABLE POINTER
*        A6.L    LOCAL VARIABLE POINTER
*        A7.L    STACK POINTER
*
* ON EXIT:
*        D0.L    ERROR STATUS
*        D1,D7,A2-A7 ARE PRESERVED
*        CCR.Z   SET IF NO ERROR, CLEARED OTHERWISE
*
*****
* ENTRY POINT
*****
ARST     EQU     *
         CLR.L   D0            ; NO ERROR
         RTS                   ; DONE
         SPC     5
*
* ACIA REWRITE
* CLEARS ERROR STATUS THEN RETURNS
*
* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7
*                   D *
*                   A
*
* ON ENTRY:
*        D1.L    PASCAL FILE STATUS
*        D7.L    RETURN ADDR TO PASCAL PROGRAM
*
*        A0.L    POINTER TO CURRENT DDT
*        A2.L    POINTER TO FILE DESCRIPTOR
*        A3.L    ADDR OF LONG JSR ROUTINE
*        A4.L    ALTERNATE LEVEL POINTER
*        A5.L    GLOBAL VARIABLE POINTER
*        A6.L    LOCAL VARIABLE POINTER
*        A7.L    STACK POINTER
*
* ON EXIT:
*        D0.L    ERROR STATUS
*        D1,D7,A0,A2-A7 ARE PRESERVED
*        CCR.Z   SET IF NO ERROR, CLEARED OTHERWISE
*
*****
* ENTRY POINT
*****
ARWT     EQU     *
         CLR.L   D0            ; NO ERROR
         RTS                   ; DONE
         SPC     5
*
* ACIA CLOSE
* CLEARS ERROR STATUS THEN RETURNS
*
* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7
*                   D *
*                   A
*
* ON ENTRY:
*        D1.L    PASCAL FILE STATUS
*        D7.L    RETURN ADDR TO PASCAL PROGRAM
*
*        A0.L    POINTER TO CURRENT DDT
*        A2.L    POINTER TO FILE DESCRIPTOR
*        A3.L    ADDR OF LONG JSR ROUTINE
*        A4.L    ALTERNATE LEVEL POINTER
*        A5.L    GLOBAL VARIABLE POINTER
*        A6.L    LOCAL VARIABLE POINTER
*        A7.L    STACK POINTER
*
* ON EXIT:
*        D0.L    ERROR STATUS
*        D1,D7,A0,A2-A7 ARE PRESERVED
*        CCR.Z   SET IF NO ERROR, CLEARED OTHERWISE
*
*****
* ENTRY POINT
*****
ACLO     EQU     *
         CLR.L   D0            ; NO ERROR
         RTS                   ; DONE
         SPC     5
*
* PORT 1 READ
* FOR TEXT FILE:
*  ACCEPTS CHARS FROM ACIA UNTIL CR OR EOF.
*  SETS BIT 7 OF EACH CHAR TO 0.  CHARS ARE
*  PUT INTO BUFFER UNTIL BUFFER FULL.  NUMBER
*  OF CHARS RETURNED IN BUFFER IS RETURNED IN
*  IOLEN.  ECHOES PRINTABLE CHARS AS THEY ARE
*  RECEIVED.  ECHOES CR, LF, NULL, ON RECEIPT
*  OF CR.  PERMITS EDITING OF INPUT UNTIL CR
*  IS RECEIVED.  EDITING CONSISTS OF DELETE
*  LAST CHAR, DELETE LINE, AND DISPLAY LINE.
*  DOES NOT PUT CR IN BUFFER.  ONLY PRINTABLE
*  CHARS ($20 THROUGH $7E ARE PUT IN BUFFER.
* FOR NONTEXT FILE:
*  ACCEPTS CHARS FROM ACIA UNTIL BUFFER FULL.
*  ALL 8 BITS OF CHAR ARE PUT IN BUFFER.
*  NUMBER OF CHARS RETURNED IN BUF IS RETURNED
*  IN IOLEN.  CHARS ARE NOT ECHOED.
*
* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7
*                   D *
*                   A
*
* ON ENTRY:
*        D1.L    PASCAL FILE STATUS
*
*        A0.L    POINTER TO CURRENT DDT
*        A2.L    POINTER TO FILE DESCRIPTOR
*        A3.L    POINTER TO FILE DESCRIPTOR
*        A4.L    ALTERNATE LEVEL POINTER
*        A5.L    GLOBAL VARIABLE POINTER
*        A6.L    LOCAL VARIABLE POINTER
*        A7.L    STACK POINTER
*
* ON EXIT:
*        D0.L    ERROR STATUS
*        D1-D7,A0-A7 ARE PRESERVED
*        CCR.Z   SET IF NO ERROR, CLEARED OTHERWISE
*
*****
* ENTRY POINT
*****
P1RD     EQU     *
         MOVEM.L D1-D4/A0-A4,-(A7) ; SAVE REGS
         CLR.L   D0            ; ASSUME NO ERROR
         MOVEA.L DADDR(A0),A3  ; INIT REGS
         MOVEA.L DSAAD(A0),A0
         MOVEA.L IOSAD(A2),A1
         CLR.L   IOLEN(A2)
         BTST    #PFSTF,D1     ; IF TEXT FILE THEN
         BEQ.S   P1RD1
         BSR.S   RDTXT         ; .READ TEXT
         BRA.S   P1RD2         ; ELSE
P1RD1    EQU     *
         BSR     RDNTXT        ; .READ NONTEXT
P1RD2    EQU     *             ; FI
         MOVEM.L (A7)+,D1-D4/A0-A4 ; RESTORE REGS
         TST.B   D0            ; UPDATE CCR.Z FOR ERROR STATUS
         RTS                   ; DONE
         PAGE
*
* SUPPORT ROUTINES FOR PORT 1 READ
*
* REGISTER USAGE:
*        D0      ERROR STATUS
*        D1      CHARACTER
*        D2      NULL PAD COUNT
*        D3      TEMP (FOR WRITE)
*        D4      CHAR STORAGE DURING NULL PAD
*
*        A0      DSA ADDR
*        A1      BUFFER POINTER
*        A2      FILE DESCRIPTOR ADDR
*        A3      DEVICE ADDR
*        A4      POINTER TO END BUFFER + 1
*
*        NO OTHER REGISTERS ARE USED
*
         SPC     1
*
* READ TEXT
* SEE PORT 1 READ FOR DETAILS
*
RDTXT    EQU     *
RDT1     EQU     *             ; REPEAT
         BSR     GETC          ; .GET CHAR
         BSR     CBREAKB       ; .CHECK FOR BREAK
         AND.B   #$7F,D1       ; .STRIP PARITY
         CMP.B   DELCHR(A0),D1 ; .SELECT ON CHAR
         BNE.S   RDT2          ; ..CASE CHAR = DELCHR
         CMP.L   IOSAD(A2),A1  ; ...IF PTR # START BUF THEN
         BEQ.S   RDT3
         SUBQ.L  #1,IOLEN(A2)  ; ....DEC COUNT
         MOVE.B  -(A1),D1      ; ....DEC PTR, GET CHAR
         BSR     PRTC          ; ....PRINT CHAR
RDT3     EQU     *             ; ...FI
         BRA.S   RDT4          ; ..ESAC
RDT2     EQU     *
         CMP.B   CANCHR(A0),D1 ; ..CASE CHAR = CANCHR
         BNE.S   RDT5
         MOVEA.L IOSAD(A2),A1  ; ...INIT PTR, COUNT
         CLR.L   IOLEN(A2)
         BSR     PRTCRLF       ; ...PRINT CR, LF, NULL
         BRA.S   RDT4          ; ..ESAC
RDT5     EQU     *
         CMP.B   #$D,D1        ; ..CASE CHAR = CR
         BNE.S   RDT6
         BSR     PRTCRLF       ; ...PRINT CR, LF, NULL
         BRA.S   RDT4          ; ..ESAC
RDT6     EQU     *
         CMP.B   ECHOCHR(A0),D1 ; ..CASE CHAR = ECHOCHR
         BNE.S   RDT7
         BSR     PRTCRLF       ; ...PRINT CR, LF, NULL
         MOVEA.L A1,A4         ; ...PRINT BUFFER
         MOVEA.L IOSAD(A2),A1
         BSR     PRTL
         BRA.S   RDT4          ; ..ESAC
RDT7     EQU     *
         CMP.B   #$20,D1       ; ..CASE CHAR >= $20
         BCS.S   RDT8
         CMP.B   #$7F,D1       ; ..ØAND CHAR < $7F
         BCC.S   RDT8
         CMP.L   IOEAD(A2),A1  ; ...IF PTR <= END THEN
         BHI.S   RDT9
         MOVE.B  D1,(A1)+      ; ....PUT CHAR IN BUF, INC PTR
         BSR.S   PRTC          ; ....PRINT CHAR
         ADDQ.L  #1,IOLEN(A2)  ; ....INC COUNT
RDT9     EQU     *             ; ...FI
RDT8     EQU     *             ; ..ESAC
RDT4     EQU     *             ; .TCELES
         CMP.B   #$D,D1        ; UNTIL CHAR = CR
         BEQ.S   RDT10
         CMP.B   EOFCHR(A0),D1 ; ØOR CHAR = EOF
         BNE     RDT1          ; IF CHAR = EOF THEN
         MOVE.L  EOF,D0        ; .EOF ERROR
RDT10    EQU     *             ; FI
         RTS                   ; DONE
         SPC     1
*
* READ NONTEXT
* SEE PORT 1 READ FOR DETAILS
*
RDNTXT   EQU     *
RDN1     EQU     *             ; REPEAT
         BSR.S   GETC          ; .GET CHAR
         BSR     CBREAKB       ; .CHECK FOR BREAK
         MOVE.B  D1,(A1)+      ; .PUT CHAR IN BUF, INC PTR
         ADDQ.L  #1,IOLEN(A2)  ; .INC COUNT
         CMP.L   IOEAD(A2),A1  ; UNTIL PTR > END BUF
         BLS.S   RDN1
         RTS                   ; DONE
         SPC     1
*
* GET CHAR FROM ACIA
*

GETC     EQU     *
GETC1    EQU     *             ; REPEAT
         MOVE.B  (A3),D1       ; UNTIL CHAR
         LSR.B   #1,D1
         BCC.S   GETC1
         MOVE.B  2(A3),D1      ; GET CHAR
         RTS                   ; DONE
         SPC     1
*
* OUTPUT CHAR WITHOUT NULL PAD
*
OUTC     EQU     *
OUTC1    EQU     *             ; REPEAT
         MOVE.B  (A3),D3       ; UNTIL XMIT REG EMPTY
         AND.B   #$2,D3
         BEQ.S   OUTC1
         MOVE.B  D1,2(A3)      ; SEND CHAR
         RTS                   ; DONE
         SPC     1
*
* PRINT CHAR WITH NULL PAD
*
PRTC     EQU     *
         BSR.S   OUTC          ; SEND CHAR
         MOVE.B  D1,D4         ; SAVE CHAR
         MOVE.B  CHRNL(A0),D2  ; PAD COUNT := CHAR PAD COUNT
         CMP.B   #$D,D4        ; IF CHAR = CR THEN
         BNE.S   PRTC1
         MOVE.B  CRNL(A0),D2   ; .PAD COUNT := CR PAD COUNT
PRTC1    EQU     *             ; FI
         CLR.B   D1            ; CHAR := NULL
PRTC2    EQU     *             ; DO
         TST.B   D2            ; .WHILE PAD COUNT # 0
         BEQ.S   PRTC3
         BSR.S   OUTC          ; .SEND NULL
         SUBQ.B  #1,D2         ; .DEC PAD COUNT
         BRA.S   PRTC2         ; OD
PRTC3    EQU     *
         MOVE.B  D4,D1         ; RESTORE CHAR
         RTS                   ; DONE
         SPC     1
*
* PRINT CR, LF, NULL WITH NULL PAD
*
PRTCRLF  EQU     *
         MOVEQ.L #$D,D1        ; SEND CR
         BSR.S   PRTC
         MOVEQ.L #$A,D1        ; SEND LF
         BSR.S   PRTC
         CLR.B   D1            ; SEND NULL
         BSR.S   PRTC
         MOVEQ.L #$D,D1        ; CHAR := CR
         RTS                   ; DONE
         SPC     1
*
* PRINT LINE WITH NULL PAD
* START OF LINE ADDR IN A1
* END OF LINE ADDR + 1 IN A4
*
PRTL     EQU     *
PRTL1    EQU     *             ; DO
         CMP.L   A4,A1         ; .WHILE PTR < END BUF
         BCC.S   PRTL2
         MOVE.B  (A1)+,D1      ; .GET CHAR, INC PTR
         BSR.S   PRTC          ; .PRINT CHAR
         BRA.S   PRTL1         ; OD
PRTL2    EQU     *
         RTS                   ; DONE
         PAGE
*
* PORT 2 READ
* FOR TEXT FILE:
*  ACCEPTS CHARS FROM ACIA UNTIL CR OR EOF.
*  SETS BIT 7 OF EACH CHAR TO 0.  CHARS ARE
*  PUT INTO BUFFER UNTIL BUFFER IS FULL.
*  NUMBER OF CHARS RETURNED IN BUFFER IS
*  RETURNED IN IOLEN.  DOES NOT ECHO
*  ANY CHARS.  DOES NOT PERMIT EDITING OF INPUT.
*  DOES NOT PUT CR IN BUFFER.  ONLY PRINTABLE
*  CHARS ($20 THROUGH $7E) ARE PUT IN BUFFER.
* FOR NONTEXT FILE:
*  ACCEPTS CHARS FROM ACIA UNTIL BUFFER IS FULL.
*  ALL EIGHT BITS OF CHAR ARE PUT INTO BUFFER.
*  NUMBER OF CHARS RETURNED IN BUFFER IS RETURNED
*  IN IOLEN.  CHARS ARE NOT ECHOED.
*
* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7
*                   D *
*                   A
*
* ON ENTRY:
*        D1.L    PASCAL FILE STATUS
*
*        A0.L    POINTER TO CURRENT DDT
*        A2.L    POINTER TO FILE DESCRIPTOR
*        A4.L    ALTERNATE LEVEL POINTER
*        A5.L    GLOBAL VARIABLE POINTER
*        A6.L    LOCAL VARIABLE POINTER
*        A7.L    STACK POINTER
*
* ON EXIT:
*        D0.L    STATUS RETURN
*        D1-D7,A0-A7 ARE PRESERVED
*        CCR.Z   SET IF NO ERROR, CLEARED OTHERWISE
*
******
* ENTRY POIT
******
P2RD     EQU     *
         MOVEM.L D1-D4/A0-A4,-(A7) ; SAVE REGS
         CLR.L   D0            ; ASSUME NO ERROR
         MOVEA.L DADDR(A0),A3  ; INIT REGS
         MOVEA.L DSAAD(A0),A0
         MOVEA.L IOSAD(A2),A1
         CLR.L   IOLEN(A2)
         BTST    #PFSTF,D1     ; IF TEXT FILE THEN
         BEQ.S   P2RD1
         BSR.S   RDTXT2        ; .READ TEXT
         BRA.S   P2RD2         ; ELSE
P2RD1    EQU     *
         BSR     RDNTXT        ; .READ NONTEXT
P2RD2    EQU     *             ; FI
         MOVEM.L (A7)+,D1-D4/A0-A4 ; RESTORE REGS
         TST.B   D0            ; UPDATE CCR.Z FOR ERROR STATUS
         RTS                   ; DONE
         PAGE
*
* SUPPORT ROUTINES FOR PORT 2 READ
* SAME REGISTER ALLOCATIONS AS PORT 1 READ SUPPORT
*
         SPC     1
*
* READ TEXT FORM PORT 2
*
RDTXT2   EQU     *
RDT21    EQU     *             ; REPEAT
         BSR     GETC          ; .GET CHAR
         BSR     CBREAKB       ; .CHECK FOR BREAK
         AND.B   #$7F,D1       ; .STRIP PARITY
         CMP.B   #$20,D1       ; .IF CHAR >= $20
         BCS.S   RDT22
         CMP.B   #$7F,D1       ; .ØAND CHAR < $7F THEN
         BCC.S   RDT22
         CMP.L   IOEAD(A2),A1  ; ..IF PTR <= END BUF THEN
         BHI.S   RDT23
         MOVE.B  D1,(A1)+      ; ...PUT CHAR IN BUF, INC PTR
         ADDQ.L  #1,IOLEN(A2)  ; ...INC COUNT
RDT23    EQU     *             ; ..FI
RDT22    EQU     *             ; .FI
         CMP.B   #$D,D1        ; UNTIL CHAR = CR
         BEQ.S   RDT24
         CMP.B   EOFCHR(A0),D1 ; ØOR CHAR = EOF
         BNE.S   RDT21         ; IF CHAR = EOF THEN
         MOVE.L  EOF,D0        ; .EOF ERROR
RDT24    EQU     *             ; FI
         RTS                   ; DONE
         PAGE
*
* ACIA WRITE
* FOR TEXT FILE:
*  WRITES FROM IOSAD THROUGH IOEAD WITH NULL PAD
*  ADDS CR, LF, NULL AT END.
* FOR NONTEXT FILE:
*  WRITES FROM IOSAD THROUGH IOEAD WITHOUT NULL
*  PAD AND WITHOUT ADDING CR, LF, NULL AT END.
* FOR BOTH:
*  CHECKS FOR BREAK AND WAIT AFTER TRANSMITTING LINE.
*
* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7
*                   D *
*                   A
*
* ON ENTRY:
*        D1.L    PASCAL FILE STATUS
*
*        A0.L    POINTER TO CURRENT DDT
*        A2.L    POINTER TO FILE DESCRIPTOR
*        A3.L    ADDR OF LONG JSR ROUTINE
*        A4.L    ALTERNATE LEVEL POINTER
*        A5.L    GLOBAL VARIABLE POINTER
*        A6.L    LOCAL VARIABLE POINTER
*        A7.L    STACK POINTER
*
* ON EXIT:
*        D0.L    STATUS RETURN
*        D1-D7,A0-A7 ARE PRESERVED
*        CCR.Z   SET IF NO ERROR, CLEARED OTHERWISE
*
*****
* ENTRY POINT
*****
AWRT     EQU     *
         MOVEM.L D1-D4/A0-A4,-(A7) ; SAVE REGS
         CLR.L   D0            ; ASSUME NO ERRORS
         MOVEA.L DADDR(A0),A3  ; INIT REGS
         MOVEA.L DSAAD(A0),A0
         MOVEA.L IOSAD(A2),A1
         MOVEA.L IOEAD(A2),A4
         ADDQ.L  #1,A4
         BTST    #PFSTF,D1     ; IF TEXT FILE THEN
         BEQ.S   AWRT1
         BSR     PRTL          ; .PRINT LINE
         BSR     PRTCRLF       ; .PRINT CR, LF, NULL
         BRA.S   AWRT2         ; ELSE
AWRT1    EQU     *
AWRT3    EQU     *             ; .REPEAT
         MOVE.B  (A1)+,D1      ; ..GET CHAR, INC POINTER
         BSR     OUTC          ; ..SEND CHAR
         CMP.L   A4,A1         ; .UNTIL PTR >= END BUF
         BCS.S   AWRT3
AWRT2    EQU     *             ; FI
         BSR     CBREAKB       ; CHECK FOR BREAK
         BSR     CWAITB        ; CHECK FOR WAIT
         BSR     CBREAKB       ; CHECK FOR BREAK AGAIN
         TST.B   D0            ; UPDATE CCR.Z FOR ERROR STATUS
         MOVEM.L (A7)+,D1-D4/A0-A4 ; RESTORE REGS
         RTS                   ; DONE
         SPC    5
*
* END OF PROGRAM
*
         END
▶EOF◀