|
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◀