DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 17186 (0x4322) Types: TextFile Names: »IOPROS.S«
└─⟦1dc3ed39a⟧ Bits:30005066 8" CR80 Floppy CR80FD_0003 ( Id. O.K Vol. FLOPPY VOL: NSS ) └─⟦02b6ff5ea⟧ └─ ⟦this⟧ »TDXDR.851216.D!IOPROS.S«
;======================================================================== ; ; D E V I C E D R I V E R P R O C E D U R E S F O R ; I N T E R F A C I N G T O T H E A M O S I / O ; S Y S T E M ; ;======================================================================= AX= XXFLNG ; STANDARD XFER LIST ELEM XFERSC:= AX, AX=AX+1 ; CURRENT XFER LIST SECTION (PSW) BUFFSC:= AX, AX=AX+1 ; CURRENT BUFFER SECTION (PSW) XFOCNT:= AX, AX=AX+1 ; ORIGINAL XFECNT XTXFLNG:= AX ; LENGTH OF EXTENDED XFER LIST ELE CXFER: 0 REPEAT XTXFLNG -1 ; CURRENT XFER LIST ELEM SV12: 0 ; SAVE LOC USED BY XCHKOP, XPUTBYTE, XGETBYTE SV14: 0 ; SAVE LOC USED BY XCHKOP, XPUTBYTE, XGETBYTE SV15: 0 ; SAVE LOC USED BY XCHKOP, XPUTBYTE SV27: 0 ; SAVE LOC USED BY XNXFER SV24: 0 ; SAVE LOC USED BY XNXFER SV17: 0 ; SAVE LOC USED BY XPUTBYTE, XGETBYTE SV34: 0 ; SAVE LOC USED BY XNXOPR, XTMOPR SV33: 0 ; SAVE LOC USED BY XNXOPR, XTMOPR SV44: 0 ; SAVE LOC USED BY XGETWORD, XPUTWORD SV43: 0 ; SAVE LOC USED BY XGETWORD REGTOP: 0 REPEAT 6, REGSTC: ; REGISTER SAVE STACK USE PROG ; PROCEDURE NEXT_OPERATION I:(MSG) O:(OPERATION/EVENT,BYTECOUNT) ; R:(ERROR,CANCEL,COMMAND) ; THE REFERENCED SYSTEM MESSAGE IS INSPECTED. IF IT DOES NOT HAVE A PROP ; ER FORMAT, RETURN IS MADE TO ERROR. ; IF IT CONTAINS A CANCEL COMMAND, RETURN IS MADE TO CANCEL ND THE EVENT ; TO BE CANCELLED IS DELIVERED. ; IF THE MESSAGE CONTAINS A PROPER I/O COMMAND, RETURN IS MADE TO COMMAN ; AND THE OPERATION CODE AND BYTECOUNT ARE RETURNED. ; R0 - BYTECOUNT(LEAST SIGNIFICANT PART ; R1 REF(MSG) BYTECOUNT(MOST SIGNIFICANT PART ; R2 - OPERATION/EVENT ; R4 LINK DEST ; RETURNS: ; LINK+0: ERROR ; LINK+1: CANCEL ; LINK+2: COMMAND XNXOPR: ; NEXT_OPERATION: MOV R4 SV34 ; SAVE(LINK) JMP S4 XCHKOP ; CHECK_OPERATION(MSG JMPI & SV34 ; ERROR: RETURN(ERROR), JMP & L4 ; CANCEL: GOTO L4, ; XFER: CONTINUE) MOV R3 SV33 ; SAVE(3) JMP S4 XGETWORD ; GETWORD(WORD, JMP & XERR ; NONE: GOTO ERR, MOV R3 R2 ; OK: WORD=>OPERATION) MOVC 8 R1 ; FOR I:=1 TO 8 DO L5: ; L5: MOV R3 R0 ; WORD=>CNT.LOWER JMP S4 XGETWORD ; GETWORD(WORD, JMP & XERR ; NONE: GOTO ERR, ; OK: CONTINUE) SOB R1 L5 ; ROF MOV R3 R1 ; WORD=>CNT.UPPER JMP S4 XNXFER ; NEXT_XFER_ELEM( NOP ; NONE: CONTINUE, ; OK: CONTINUE) MOV SV33 R3 ; RESTORE(3) MOV SV34 R4 ; JMP 2. X4 ; RETURN(COMMAND) L4: ; L4: MOV SV34 R4 ; JMP 1. X4 ; RETURN(CANCEL) XERR: ; ERR: MOV SV33 R3 ; RESTORE(3) JMPI SV34 ; RETURN(ERROR) ; PROCEDURE TERMINATE_OPERATION I:(RESULT,BYTECOUNT) R:(ERROR,OK) ; SKIPS FORWARD TO THE LAST XFER LIST ELEMENT AND STORES THE RESULT AND ; THE BYTECOUNT (=NUMBER OF XFERRED BYTES) ; R0 RESULT KEPT (COMPLETION CODE) ; R1 BYTECOUNT (LEAST SIGNIFICANT PART) KEPT ; R2 BYTECOUNT (MOST SIGNIFICANT PART) KEPT ; R4 LINK DEST ; RETURNS: ; LINK+0: ERROR ; LINK+1: OK XTMOPR: ; TERMINATE_OPERATION: MOV R4 SV34 ; SAVE(LINK) MOV R3 SV33 ; SAVE(3) L7: ; L7: JMP S4 XNXFER ; NEXT_XFER_ELEM( JMP & L8 ; NONE: GOTO L8, JMP & L7 ; OK: GOTO L7) L8: ; L8: MOV R0 R3 ; JMP S4 XPUTWORD ; PUTWORD(RESULT, JMP & XERR1 ; FAULT: GOTO ER1, JMP & XERR1 ; LAST: GOTO ER1, MOV R1 R3 ; MORE: CONTINUE) JMP S4 XPUTWORD ; PUTWORD(BYTECNT.LOWER, JMP & XERR1 ; FAULT: GOTO ER1, JMP & XERR1 ; LAST: GOTO ER1, MOV R2 R3 ; MORE: CONTINUE) JMP S4 XPUTWORD ; PUTWORD(BYTECNT.UPPER, JMP & XERR1 ; FAULT: GOTO ER1, NOP ; LAST: CONTINUE, MOV SV33 R3 ; MORE: RESTORE(3)) MOV SV34 R4 ; JMP 1. X4 ; RETURN(OK) XERR1: ; ER1D MOV SV33 R3 ; RESTORE(3) JMPI SV34 ; RETURN(ERROR) ; PROCEDURE CHECK_OPERATION I:(MSG) O:(EVENT) R:(FAULT,CANCEL,XFER) ; THE REFERENCED SYSTEM MSG IS INSPECTED. IF IT DOES NOT HAVE A PROPER ; FORMAT, RETURN IS MADE TO FAULT. ; IF IT CONTAINS A CANCEL COMMAND, RETURN IS MADE TO CANCEL AND THE ; EVENT TO BE CANCELLED IS PRODUCED. ; IF IT CONTAINS A TRANSFER COMMAND, THE XFER LIST ELEMENT IS FETCHED IN ; TO CXFER. RETURN IS MADE TO XFER. ; R1 REF(MSG) KEPT ; R2 - EVENT(IF CANCEL) ; R4 LINK DEST ; RETURNS: ; LINK+0: FAULT ; LINK+1: CANCEL ; LINK+2: XFER XCHKOP: ; CHECK_OPERATION: MOV R4 SV14 ; SAVE(LINK) MOV R5 SV15 ; SAVE(5) MOV R2 SV12 ; SAVE(2) MOV R1 R5 ; MOV DMAMOP.X5 R2 ; MSG.DMAMOP SRL R2 DMACMP ; [DMACMP XTR R2 DMACML ; :DMACML]=>CMD INE R2 DMAABT ; IF CMD=ABORT THEN JMP L1 ; MOV DMAMET.X5 R2 ; MSG.DMAMET=>EVENT MOV SV15 R5 ; RESTORE(5) JMP 1. X4 ; RETURN(CANCEL) L1: IEQ R2 DMATXF ; IF CMD<>TRANSFER THEN JMP L2 ; MOV SV12 R2 ; RESTORE(2) MOV SV15 R5 ; RESTORE(5) JMP 0. X4 ; RETURN(FAULT) L2: MOV DMAMOP.X5 R2 ; MSG.DMAMOP XTR R2 DMASTP+DMASTL; [DMASTP:DMASTL] ADDC #E000 R2 ; +#E000 =>SCT MOV DMAMLS.X5 R4 ; MSG.DMAMLS=> LST MOVC CXFER R5 ; MOV R2 XFERSC.X5 ; SCT=>CXFER.XFERSC MOV R4 XFELNK.X5 ; LST=>CXFER.XFELNK JMP S4 XNXFER ; NEXT_XFER_ELEM( MODC -2 ; NONE: FAULT=>OFFSET, MOD SV14 ; OK: XFER=>OFFSET) MOVC 0 R4 ; LINK+OFFSET=>LINK MOV SV12 R2 ; RESTORE(2) MOV SV15 R5 ; RESTORE(5) JMP 2. X4 ; RETURN(LINK) ; PROCEDURE NEXT_XFER_ELEM R:(NONE, OK); ; THE NEXT XFER LEMENT IF ANY IS FETCHED TO CXFER. ; R4 LINK DEST ; RETURNS: ; LINK+0: NONE ; LINK+1: OK XNXFER: ; NEXT_XFER_ELEM: MOV R4 SV24 ; SAVE(LINK) MOVC CXFER R4 ; SON XFELNK.X4 ; IF CXFER.XFELNK=0 THEN JMPI SV24 ; RETURN(NONE) MOV R7 SV27 ; SAVE(7) MOVC REGSTC R7 ; STC 6 ; SAVE(0-6) MOV XFELNK.X4 R7 ; CXFER.XFELNK SUB XBASE R7 ; -BASE=>FROM SVS R6 ; SAVE(PSW) MOV XFERSC.X4 R0 ; XTR R0 XFESTP+XFESTL; TAKE SECTION BITS ADDC #E000 R0 ; INCLUDE INTERRUPT DISABLE BITS LDS R0 ; SWITCH(CXFER.XFERSC) UNS XXFLNG-1 ; FROM.0..(XXFLNG-1) =>TEMP IF XXFLNG GT 5 THEN USE 16 FI LDS R6 ; RESTORE(PSW) MOVC CXFER+XXFLNG R7 ; STC XXFLNG-1 ; TEMP=> CXFER.0..(XXFLNG-1) XTR R0 XFESTP+XFESTL; CXFER.XFECOM[XFESTP:XFESTL] ADDC #E000 R0 ; +#E000 IF XFECOM NE 0 THEN USE 16 FI MOVC CXFER R4 ; MOV R0 BUFFSC.X4 ; =>CXFER.BUFFSC MOV XFECNT.X4 R0 ; CXFER.XFECNT MOV R0 XFOCNT.X4 ; =>CXFER.XFOCNT MOVC REGTOP R7 ; UNS 6 ; RESTORE(0-6) MOV SV27 R7 ; RESTORE(7) MOV SV24 R4 ; JMP 1. X4 ; RETURN(OK) ; PROCEDURE PUTBYTE I:(BYTE) R:(ERROR,LAST,MORE) ; CHECKS THAT THE CURRENT XFER LIST ELEMENT CONTAINS A REFERENCE TO A ; NON EMPTY INPUT BUFFER. IF NOT, RETURN IS MADE TO ERROR. ; PUTS THE BYTE AT THE NEXT BYTE POSITION IN THE INPUT BUFFER. IF NOT RO ; OM FOR ANY MORE BYTES, RETURN IS MADE TO LAST. ; R3 BYTE KEPT ; R4 LINK DEST ; RETURNS: ; LINK+0: ERROR ; LINK+1: LAST ; LINK+2: MORE XPUTBYTE: MOV R4 SV14 ; SAVE(LINK) PUTBYTE0: ; L0: MOV CXFER+XFECOM R4 ; CXFER.XFECOM SRL R4 XFECMP ; [XFECMP XTR R4 XFECML ; :XFECML]=>CMD INE R4 XFCINP ; IF CMD<>INPUT THEN JMPI SV14 ; RETURN(ERROR) MOVC CXFER R4 ; SON XFECNT.X4 ; IF CXFER.XFECNT=0 THEN JMPI SV14 ; RETURN(ERROR) MOV R2 SV12 ; SAVE(2) MOV XFEADD.X4 R2 ; CXFER.XFEADD=>ADDR SUB XBASE R2 ; ADDR-BASE=>ADDR MOV R7 SV17 ; SAVE(7) MOV XFEOFF.X4 R7 ; CXFER.XFEOFF=>X MOV R5 SV15 ; SAVE(5) SVS R5 ; SAVE(PSW) LDS BUFFSC.X4 ; SWITCH(CXFER.BUFFSC) MOD R2 ; BYTE(2*ADDR MOVB R3 0. X7 ; +X):= BYTE LDS R5 ; RESTORE(PSW) INC XFEOFF.X4 ; INCR(CXFER.XFEOFF) DEC XFECNT.X4 ; DECR(CXFER.XFECNT) MOV SV15 R5 ; RESTORE(5) MOV SV17 R7 ; RESTORE(7) MOV SV12 R2 ; RESTORE(2) PUTBYTE2: ; L2: SOZP XFECNT.X4 ; IF CXFER.XFECNT<>0 THEN MOV SV14 R4 ; JMP 2. X4 ; RETURN(MORE) JMP S4 XNXFER ; NEXT_XFER_ELEM( JMP & PUTBYTE3 ; NONE: GOTO L3, MOVC CXFER R4 ; OK: CONTINUE) JMP PUTBYTE2 ; GOTO L2 PUTBYTE3: ; L3: MOV SV14 R4 ; JMP 1. X4 ; RETURN(LAST) ; PROCEDURE GETBYTE O:(BYTE) R:(NONE,MORE) ; CHECKS THAT THE CURRENT XFER LIST ELEMENT CONTAINS A REF TO AN OUTPUT ; BUFFER. IF NOT, RETURN IS MADE TO NONE. ; IF THE BUFFER IS EMPTY, THE NEXT XFER LIST ELEMENT IS FETCHED TO CXFER ; THIS XFER LIST ELEMENT IS PROCESSED AS THE PREVIOUS. ; IF THE BUFFER IS NON EMPTY, THE NEXT BYTE IS DELIVERED AND RETURN IS ; MADE TO MORE. ; R3 - BYTE. ; R4 LINK DEST ; RETURNS: ; LINK+0: NONE ; LINK+1: MORE XGETBYTE: ; GETBYTE: MOV R4 SV14 ; SAVE(LINK) GETBYTE0: ; L0: MOV CXFER+XFECOM R4 ; CXFER.XFECOM SRL R4 XFECMP ; [XFECMP XTR R4 XFECML ; :XFECML]=> CMD INE R4 XFCOUT ; IF CMD<>OUTPUT THEN JMPI SV14 ; RETURN(NONE) MOVC CXFER R4 ; SOZ XFECNT.X4 ; IF CXFER.XFECNT<>0 THEN JMP GETBYTE1 ; GOTO L1 JMP S4 XNXFER ; NEXT_XFER_ELEM( JMPI & SV14 ; NONE: RETURN(NONE), JMP & GETBYTE0 ; OK: GOTO L0) GETBYTE1: ; L1: MOV XFEADD.X4 R3 ; CXFER.XFEADD=> ADDR SUB XBASE R3 ; ADDR-BASE=>ADDR MOV R7 SV17 ; SAVE(7) MOV XFEOFF.X4 R7 ; CXFER.XFEOFF=> X MOV R2 SV12 ; SAVE(2) SVS R2 ; SAVE(PSW) LDS BUFFSC.X4 ; SWITCH(CXFER.BUFFSC) MOD R3 ; (ADDR*2 MOVB X7 R3 ; +X)=> BYTE LDS R2 ; RESTORE(PSW) INC XFEOFF.X4 ; INCR(CXFER.XFECNT) DEC XFECNT.X4 ; DECR(CXFER.XFECNT) MOV SV17 R7 ; RESTORE(7) MOV SV12 R2 ; RESTORE(2) MOV SV14 R4 ; JMP 1. X4 ; RETURN(MORE) ; BACKBYTE R:(ERROR,DONE) ; IF POSSIBLE, THE BYTECNT AND OFFSET FOR THE CURRENT BUFFER ARE UPDATED ; CORRESPONDING TO A BACKSPACING. ; R4 LINK DEST ; RETURNS: ; LINK+0: ERROR ; LINK+1: DONE XBACKSPACE: ; BACKSPACE: MOV R4 SV14 ; SAVE(LINK) MOVC CXFER R4 ; MOV R2 SV12 ; SAVE(2) MOV XFECNT.X4 R2 ; WITH CXFER DO IHSP R2 XFOCNT.X4 ; IF XFECNT>=XFOCNT THEN MOV SV12 R2 ; RESTORE(2) JMPI SV14 ; RETURN(ERROR) DEC XFEOFF.X4 ; DECR(XFEOFF) INC XFECNT.X4 ; INCR(XFECNT) MOV SV12 R2 ; RESTORE(2) MOV SV14 R4 ; JMP 1. X4 ; RETURN(DONE) ; PROCEDURE PUTWORD I:(WORD) R:(ERROR,LAST,MORE) ; SIMILAR TO PUTBYTE. ; R3 WORD KEPT ; R4 LINK DEST ; RETURNS; ; LINK+0: ERROR ; LINK+1: LAST ; LINK+2: MORE XPUTWORD: ; PUTWORD MOV R4 SV44 ; SAVE(LINK) JMP S4 XPUTBYTE ; PUTBYTE(WORD.LOWER, JMPI & SV44 ; ERROR: RETURN(ERROR), JMPI & SV44 ; LAST: RETURN(ERROR), ; MORE: CONTINUE) SWP R3 ; JMP S4 XPUTBYTE ; PUTBYTE(WORD.UPPER, MODC 0 -1 ; ERROR: 0=>OFFS, MODC 1 -2 ; LAST: 1=>OFFS, MOVC 2 R4 ; MORE: 2=>OFFS) ADD SV44 R4 ; OFFS+LINK=>LINK SWP R3 ; JMP X4 ; RETURN(LINK) ; PROCEDURE GETWORD O:(WORD) R:(NONE,OK) ; SIMILAR TO GETBYTE, EXCEPT THE NEXT WORD IF ANY IS DELIVERED. ; R3 - WORD ; R4 LINK DEST ; RETURNS: ; LINK+0: NONE ; LINK+1: OK XGETWORD: ; GETWORD: MOV R4 SV44 ; SAVE(LINK) JMP S4 XGETBYTE ; GETBYTE(LOWER, JMPI & SV44 ; NONE: RETURN(NONE), ; OK: CONTINUE) MOV R3 SV43 ; JMP S4 XGETBYTE ; GETBYTE(UPPER, JMPI & SV44 ; NONE: RETURN(NONE), ; OK: CONTINUE) SWP R3 ; UPPER<8 ADD SV43 R3 ; +LOWER=>WORD MOV SV44 R4 ; JMP 1. X4 ; RETURN(OK)