|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 22272 (0x5700)
Types: TextFile
Names: »mpasc5«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦this⟧ »mpasc5«
*********************************************
*
* 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◀