?? rdwrhd.68k
字號:
******************************************************************************* RDWRC.68k Lowest level floppy disk read and write data* This version swaps bytes around for Codata type disks******************************************************************************** Addresses of Data REQ and Busy bitsDATA: = $E73813HS: = $E7381BHSBIT: = 6BUSY: = $E73811BUSYBIT: = 0ACK: = $E7380FACKOFF: = $A0ACKON: = $A8* DISK read write routines* Codata C type link interface* Arguments - <Address><Byte count>********************************************************************** READ Sector Requires no bytes to be even (swaps bytes in word)* Called as hdmread(buf, size, timeout);* If timeout is 0 waits indefinatly********************************************************************* .globl _hdmread, _hdbip_hdmread: movem.l a0-a4/d1-d4,-(sp) ;Saves registers used lea.l HS,a1 ;A1 points to the hand shake register lea.l BUSY,a2 ;A2 points to SCSI control register lea.l DATA,a3 ;A3 points to the data register lea.l ACK,a4 clr.l d0 ;Sets D0 for exit with no errors move.l #HSBIT,d1 ;D1 is Hand shake bit no move.l #BUSYBIT,d2 ;D2 is Busy bit no in SCSI control reg move.l 48(a7),d4 ;Gets timeout count from stack move.l 44(a7),d3 ;Gets byte count from stack (C passed) movea.l 40(a7),a0 ;Gets address freom stack (C passed) jmp hdrstart ;Starts at end of loop for count checkhdrloop: btst.b d1,(a1) ;Checks HS bit beq hdrdata ;If low data ready btst.b d2,(a2) ;Else check busy bne hdrerr ;If zero ok no errors cmpi.l #0,d4 ;Checks d4 if zero ignore timeout beq hdrloop subq.l #1,d4 ;Decrement time-out beq hdrerr bra hdrloophdrerr:* jsr _hdbip move.l #4,d0 ;Sets error jmp hdrendhdrdata: move.b (a3),(a0)+ ;Gets data* not.b (a0)+ ;Inverts data* btst.b d1,(a1) ;Checks if HD error* bne hdrerr move.b #ACKON,(a4) ;Perform acknowlege*hdrack:* btst.b d1,(a1)* beq hdrack move.b #ACKOFF,(a4)hdrstart: dbeq d3,hdrloop ;Repeats till endhdrend: movem.l (sp)+,a0-a4/d1-d4 ;Recovers registers rts ;Returns********************************************************************** WRITE Sector Requires no of bytes to be even (swaps bytes in word)********************************************************************* .globl _hdmwrite, _prbytes_hdmwrite: movem.l a0-a4/d1-d4,-(sp) ;Saves registers used lea.l HS,a1 ;A1 points to the hand shake register lea.l BUSY,a2 ;A2 points to SCSI control register lea.l DATA,a3 ;A3 points to the data register lea.l ACK,a4 clr.l d0 ;Sets D0 for exit with no errors move.l #200000,d4 ;Set timeout move.l #HSBIT,d1 ;D1 is Hand shake bit no move.l #BUSYBIT,d2 ;D2 is Busy bit no in SCSI control reg move.l 44(a7),d3 ;Gets byte count from stack (C passed) movea.l 40(a7),a0 ;Gets address freom stack (C passed) jmp hdwstart ;Starts at end of loop for count checkhdwloop: btst.b d1,(a1) ;Checks HS bit beq hdwdata ;If low data ready btst.b d2,(a2) ;Else check busy bne hdwerr ;If zero ok no errors subq.l #1,d4 ;Decrement time-out beq hdwerr bra hdwloophdwerr:* jsr _hdbip move.l #3,d0 jmp hdwendhdwdata: move.b (a0)+,(a3) ;Gets data* not.b (a3) ;Inverts data move.b #ACKON,(a4) ;Perform acknowlege*hdwack:* btst.b d1,(a1)* beq hdwack move.b #ACKOFF,(a4)hdwstart: dbeq d3,hdwloop ;Repeats till endhdwend: movem.l (sp)+,a0-a4/d1-d4 ;Recovers registers rts ;Returns******************************************************************************** _hdmerr() Recover scsi bus after error* (Read as many bytes as required)******************************************************************************* .globl _hdmerr_hdmerr: movem.l a0-a4/d1-d4,-(sp) ;Saves registers used lea.l HS,a1 ;A1 points to the hand shake register lea.l BUSY,a2 ;A2 points to SCSI control register lea.l DATA,a3 ;A3 points to the data register lea.l ACK,a4 clr.l d0 ;Sets D0 for exit with no errors move.l #200000,d4 ;Set timeout move.l #HSBIT,d1 ;D1 is Hand shake bit no move.l #BUSYBIT,d2 ;D2 is Busy bit no in SCSI control reg move.l #512,d3 ;Gets byte count from stack (C passed) jmp hdestart ;Starts at end of loop for count checkhdeloop: btst.b d1,(a1) ;Checks HS bit beq hdedata ;If low data ready btst.b d2,(a2) ;Else check busy bne hdeerr ;If zero ok no errors subq.l #1,d4 ;Decrement time-out beq hdeerr bra hdeloop ;If zero ok no errorshdeerr:* jsr _hdbip move.l #4,d0 ;Sets error jmp hdeendhdedata: move.b #ACKON,(a4) ;Perform acknowlege move.b #ACKOFF,(a4)hdestart: dbeq d3,hdeloop ;Repeats till endhdeend: movem.l (sp)+,a0-a4/d1-d4 ;Recovers registers rts ;Returns
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -