DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦b43992f47⟧ TextFile

    Length: 5760 (0x1680)
    Types: TextFile
    Names: »SBDISK«

Derivation

└─⟦76721a325⟧ Bits:30005072 8" CR80 Floppy CR80FD_0010 ( EDC SYS 1 PJ DEC 3,80 )
    └─⟦a51746dbe⟧ 
        └─ ⟦this⟧ »CP.SBDISK« 

TextFile


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