|
|
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 - metrics - 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»