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: 5760 (0x1680) Types: TextFile Names: »SBDISK«
└─⟦76721a325⟧ Bits:30005072 8" CR80 Floppy CR80FD_0010 ( EDC SYS 1 PJ DEC 3,80 ) └─⟦a51746dbe⟧ └─ ⟦this⟧ »CP.SBDISK«
;----------------------------------------------------------------------- ; SUBROUTINE BLOCKIO: ; LOAD A DATABLOCK FROM DISKETTE, SPECIFIED BY ; BLOCKNR AND ENTRY. ; ; CALL EXIT ;R0 DESTROYED ;R1 DESTROYED ;R2 DESTROYED ;R3 BLOCKNR DESTROYED ;R4 DESTROYED ;R5 RE.ENTRY RE.ENTRY ;R6 LINK DESTROYED ;R7 DESTROYED ;----------------------------------------------------------------------- BLOCKIO: ; BLOCKIO: MOV R6 FDLINK ; LINK=>0.DKLINK MOV R5 R6 ; RE.ENTRY=>RE.ADDR; MOV BEBLOG.X5 R1 ; EBLOCKING.ENTRY=>BLOCKING; IEQ R1 0 ; IF BLOCKING=0 THEN JMP TIRE05 ;E ; GOTO ENTRYERR; MOVC EAREAS R2 ; EAREAS=>COUNT; L1: ; AREA: ILT R3 R1 ; IF BLOCKNR<BLOCKING THEN JMP L2 ; GOTO ADDRESS; SUB R1 R3 ; BLOCKNR-BLOCKING=>BLOCKNR; ADDC 1 R6 ; INCR(ADDR); SOB R2 L1 ; IF DECR(COUNT)<>0 THEN ; GOTO AREA; JMP S4 TIRE05 ; GOTO ENTRYERR L2: ; ADDRESS: MOV BEAREA.X6 R0 ; BEAREA.ADDR=>AREAADDRESS; IEQ R0 -1 ; IF AREAADDRESS=-1 THEN JMP S4 TIRE05 ; GOTO ENTRYERR; MOVC #FF00 R2 ; AREAADRESS(15:8) AND R0 R2 ; =>256*TRACK; XTR R0 8 ; AREAADRESS(7:8)=>SECTOR; JOZ R3 L5 ; IF BLOCKNR=0 THEN ; GOTO MAKEADDRESS; MOV BESEGS.X5 R7 ; BESEGMENTS.ENTRY=>SEGMENTS; L3: ; BLKADDR: ADD R7 R0 ; SECTOR+SEGMENTS=>SECTOR; SOB R3 L3 ; IF DECR(BLOCKNR)<>0 THEN ; GOTO BLKADDR; L4: ; SEGTST: ILT R0 27 ; IF SECTOR<27 THEN JMP L5 ; GOTO MAKEADDRESS; ADDC -26 R0 ; SECTOR-26=>SECTOR; ADDC 256 R2 ; TRACK+1=>TRACK; JMP L4 ; GOTO SEGTST; L5: ; MAKEADDRESS: ADD R2 R0 ; 256*TRACK(15:8)+SECTOR=>ADDR; MOV BESEGS.X5 R1 ; ESEGMENTS.ENTRY=>SEGCOUNT; SEEKTRK: ; SEEKTRK: MOV R0 R2 ; SRL R2 7 ; TRACK//128*3 MOV R2 R3 ; ADD R2 R3 ; ADD R2 R3 ; =>OFFSET; L6: ; DISPCALC: IGEP R3 26 ; IF OFFSET>=26 THEN ADDC -26 R3 ; OFFSET-26=>OFFSET; JMP L6 ; GOTO DISPCALC; MOV R0 R2 ; ADDR(15:8)=> SRL R2 8 ; TRACK; MOV TRACK R6 ; 0.TRACK=>OLDTRACK; IEQ R2 R6 ; IF TRACK=OLDTRACK THEN JMP BLOCKOP ; GOTO BLOCKOP; MOV R2 TRACK ; TRACK=>0.TRACK; JMP S6 WAITTRFER ; WAITTRANSFER; MOV TRACK R2 ; 0.TRACK=>TRACK; ADDC FSEEK R2 ; FSEEK+TRACK=>DATA; JMP S6 CONTROL ; SEEK TRACK; BLOCKOP: ; BLOCKOP: JMP S6 WAITTRFER ; WAITTRANSFER; MOV R0 R2 ; SECTOR(7:8)=> XTR R2 8 ; SEGMENT; ADD R3 R2 ; DISPL+SEGMENT=>SEGMENT; IGE R2 27 ; IF SEGMENT>=27 THEN ADDC -26 R2 ; SEGMENT-26=>SEGMENT; ADD R2 R2 ; SEGMENT+SEGMENT=>SEGMENT; IGE R2 27 ; IF SEGMENT>=27 THEN ADDC -27 R2 ; SEGMENT-27=>SEGMENT; ADDC FREAD R2 ; FREAD+SEGMENT=>DATA; JMP S6 CONTROL ; MOV INITCTRL R4 ; INE R4 0 ; IF 0.INITCTRL<>0 THEN JMP S6 RESTORE ; STORE DATA; MOV R6 INITCTRL ; RE.INITCTRL=>0.INITCTRL; ; NEXTSEGMENT: ADDC -1 R1 ; DECR(SEGCOUNT); IEQ R1 0 ; IF SEGCOUNT=0 THEN JMPI FDLINK ; RETURN; ADDC 256 -26 R0 ; INCR(TRACK); ; SEGMENT-26=>SEGMENT; IBZP R0 7 ; IF SEGMENT=0 THEN ADDC 1 R0 ; INCR(SEGMENT); JMP SEEKTRK ; GOTO SEEKTRK; ADDC -256 +27 R0 ; DECR(TRACK); ; SEGMENT+27=>SEGMENT; JMP BLOCKOP ; GOTO BLOCKOP; ;---------------------------------------------------------------------- ; ; SUBROUTINE CONTROL: ; INITIATE DISK TRANSFER. ; ;----------------------------------------------------------------------- CONTROL: ; CONTROL: MOV MCLD R7 ; 0.MCLD=>DRIVE; SLL R7 8 ; ADD R7 R2 ; DRIVE<8+DATA=>DATA; CONTROL1: ; CONTROL1: MOVC FD R7 ; FD=>DEVICE; CIO R2 R7 ; CONTROL(DATA,DEVICE); JMP 0. X6 ; RETURN; ;----------------------------------------------------------------------- ; ; SUBROUTINE WAITTRANSFER. ; WAIT FOR DISK GOING NOT BUSY, THEN READ DATA INTO ; MEMORY BUFFER. ; TEST AUTOSTATUS. IF AUTOSTATUS<>0 THEN GOTO TESTCHANGE. ; ;---------------------------------------------------------------------- WAITTRANSFER: ; WAITTRANSFER: MOVC FD R7 ; FD=>DEVICE; MOVC 60 R4 ; 60=>COUNT; SOB R4 LOC ; WAIT(LOC,COUNT); C1: ; TESTBUSY: LDM 2#100 ; OPEN INTERRUPT WINDOW LDM 2#111 ; MOD8 #80 ; SIO X4 R7 ; SENSE(XSTATUS,DEVICE); IBN X4 6 ; IF XSTATUS(BUSY:1)<>0 THEN JMP C1 ; GOTO TESTBUSY; MOVC 64 R4 ; 64=>COUNT; MOVC MEMBUF R2 ; RE.MEMBUF; C2: ; READDATA: RIO X2 R7 ; READ(0.BLKBUF,DEVICE); ADDC 1 R2 ; INCR(RE.BLKBUF); SOB R4 C2 ; IF DECR(COUNT)<>0 THEN ; GOTO READDATA; SIO R2 R7 ; SENSE(STATUS,DEVICE); IBN R2 0 ; IF STATUS(0:1)=1 THEN ADDC -1 R2 ; 0=>STATUS(0:1); JON R2 TESTCHANGE ; IF STATUS<>0 THEN LDM 2#100 ; ENABLE INTERRUPT ; GOTO TESTCHANGE; JMP 0. X6 ; RETURN; TESTCHANGE: ; TESTCHANGE: LDM 2#100 ; ENABLE INTERRUPT IBZ R2 7 ; IF STATUS(DISKCHANGE:1)=0 THEN JMP S4 TIRE06 ; GOTO DISKERR; IBN X4 1 ; IF XSTATUS(1:1)=1 THEN MODC 1<8 ; FREST+1<(=>DATA ORELSE MOVC FREST R2 ; FREST=>DATA; JMP S6 CONTROL1 ; JMP S6 WAITTRFER ; WAITTRANSFER; JMP SEEKTRK ; GOTO SEEKTRACK; ;----------------------------------------------------------------------- ; SUBROUTINE RESTORE. ; ; STORE DATA FROM MEMORY BUFFER CORRECTLY. ; ; REGISTERS: ; CALL EXIT ; R6 LINK LINK ; R7 DESTROYED ; ;----------------------------------------------------------------------- RESTORE: ; RESTORE: MOVC ESTACK R7 ; STC 6 ; SAVE R0-R6; MOV DQBPTR R4 MOVC MEMBUF*2 R5 ; RE.MEMBUF; MOVC 64 R2 ; 64 =>COUNT; MOVC SUBLGT R6 ; RE.SUBLGT ST0: ; GETDATA: MOVB 0. X5 R0 ; 0.MEMBUF=>BYTE; ADDC 1 R5 ; INCR(RE.MEMBUF); MON OTCH ; STORE BYTE JMPI S4 ITIER84 ;E MOVB 0. X5 R0 ; 0.MEMBUF=>BYTE; ADDC 1 R5 ; INCR(RE.MEMBUF); MON OTCH ; STORE BYTE JMPI S4 ITIER84 ;E DEC X6 ; SUBLGT=SUBLGT-1 DEC TOTLGT-SUBLGT. X6 ; TOTLGT=TOTLGT-1 JOZ X6 UPDHEAD ; IF SUBLGT=0 THEN CALL UPDHEAD ST01: SOB R2 ST0 ; IF DECR(COUNT)<>0 THEN ; GOTO GETDATA; MOVC ESTACK-7 R7 ; UNS 6 ; UNSAVE R0-R6; JMP 0. X6 ; RETURN; UPDHEAD: MOV TOTLGT R0 ; MOVC MPMAXL R1 ; ILO R0 R1 ; NEW SUBLGT=MIN(MPMAXL,TOTLGT) MOV R0 R1 ; MOV R1 SUBLGT ; MOV R1 COMMAND+2 ; GENERATE A NEW MP COMMAND HEADER JMP S6 HEADGEN ; MOVC SUBLGT R6 ; JMP ST01 ; RETURN «eof»