- pushad\r
- and dh, 00000001b ; is it set to fdd_head 0 or 1?\r
- mov [fdd_head], dh ; store it.\r
- shl dh, 2 ; make the first 2 bits = 00 for A:.\r
- mov [fdd_driveno], dh ; store it.\r
-\r
- mov [fdd_errorcode], 0x04 ; put error code in ah, just incase\r
- cmp ch, 0x51 ; cmp if track number, is above 80 decimal (51 hex)?\r
- jae .error ; if above jump error.\r
- mov [fdd_track], ch ; if not above,store it.\r
-\r
- cmp cl, 0x13 ; cmp if fdd_sector number, is above 18 decimal (12 hex) ?.\r
- jae .error ; if above jump error.\r
- mov [fdd_sector], cl ; if not above,store it.\r
-\r
- test [fdd_motor_on], 1\r
- jnz .l1\r
- call fdd_on\r
- .l1:\r
- mov dx, 0x3F7\r
- mov al, 00000000b ; 500Kb/sec mode\r
- out dx, al\r
- mov [fdd_errorcode], 0x80 ; put basic error code, just in case.\r
-\r
- xor ecx, ecx\r
- mov cx, 3 ; we want to try seek 3 times\r
- .l2:\r
- call fdd_seek ; we need to move to the right track.\r
- jnc .l3 ; we should be on the right track.\r
- loop .l2\r
- jmp .error ; timeout.\r
- .l3:\r
- mov dx, 0x3f4 ; check status reg (to see if DMA bit set)\r
- in al, dx\r
- test al, 00100000b ; test sr0 is 0x80\r
- jnz .error\r
-\r
- cmp bl, 0\r
- je .read_fdd\r
-\r
- .write_fdd:\r
- mov bl, 2 ; channel 2\r
- mov esi, 512 ; bytes to write\r
- mov ecx, 0x80000 ; page & offset\r
- mov bh, 1 ; write floppy, "read DMA"\r
- call dma_transfer\r
-\r
- mov al, 0xC5 ; write fdd_sector command\r
- call fdc_sendbyte\r
- jmp .cont\r
-\r
- .read_fdd:\r
- mov bl, 2 ; channel 2\r
- mov esi, 512 ; bytes to read\r
- mov ecx, 0x80000 ; page & offset\r
- mov bh, 0 ; read floppy, "write DMA"\r
- call dma_transfer\r
-\r
- mov al, 0xE6 ; read fdd_sector command\r
- call fdc_sendbyte\r
-\r
- .cont:\r
- mov al, [fdd_driveno] ; fdd_head no. 0, drive A:\r
- call fdc_sendbyte\r
- mov al, [fdd_track] ; cylinder\r
- call fdc_sendbyte\r
-\r
- mov al, [fdd_head] ; head/side 0 or 1\r
- call fdc_sendbyte\r
- mov al, [fdd_sector] ; sector number,starts at 1\r
- call fdc_sendbyte\r
- mov al, 0x02 ; sector size - 512 bytes\r
- call fdc_sendbyte\r
-\r
- mov al, 0x12 ; 18 decimal sectors to a track\r
- call fdc_sendbyte\r
- mov al, 0x1B ; 27 should be the gap length for a 3.5" 1.44Mb\r
- call fdc_sendbyte\r
- mov al, 0xFF ; not used data length, because sector size has been filled\r
- call fdc_sendbyte\r
-\r
- mov [fdd_int_done], 0\r
- call wait_int\r
- jc .error\r
-\r
- call fdc_getbyte\r
- mov [ResultST0], al ; save result of ST0 in var\r
- call fdc_getbyte\r
- mov [ResultST1], al ; save result of ST1 in var\r
- call fdc_getbyte\r
- mov [ResultST2], al ; save result of ST2 in var\r
- call fdc_getbyte\r
- mov [ResultC], al ; save result of cylinder\r
- call fdc_getbyte\r
- mov [ResultH], al ; save result of head\r
- call fdc_getbyte\r
- mov [ResultR], al ; save result of sector number.\r
- call fdc_getbyte\r
- mov [ResultN], al ; save result of sector size\r
-\r
- test [ResultST0], 11000000b ; test sr0 is 0xC0\r
- jnz .error\r
- mov [fdd_errorcode], 0x00\r
- .ok:\r
- popad\r
- mov ah, [fdd_errorcode] ; move error status into ah\r
- mov al, [ResultR]\r
- clc\r
- ret\r
- .error:\r
- popad\r
- mov ah, [fdd_errorcode] ; move error status into ah\r
- stc\r
- ret
\ No newline at end of file
+ pushad\r
+\r
+ and dh, 1 ; head 0 or 1?\r
+ mov [fdd_head], dh ; store it.\r
+ shl dh, 2\r
+ or dh, 0 ; drive 0, fd0\r
+ mov [fdd_drivehead], dh ; dh = ((head*4)|drive)\r
+ mov [fdd_errorcode], 0x04 ; basic error code\r
+ cmp ch, 0x51 ; check for allowed\r
+ jae .error ; track number.\r
+ mov [fdd_track], ch\r
+ cmp cl, 0x13 ; check for allowed\r
+ jae .error ; sector number.\r
+ mov [fdd_sector], cl\r
+\r
+ cmp [fdd_error], 1\r
+ jne .no_previous_error\r
+ mov al, 1\r
+ call fdd_recal_seek\r
+ .no_previous_error:\r
+ call fdd_on\r
+\r
+ mov dx, 0x3F7\r
+ mov al, 0 ; 500Kb/sec mode\r
+ out dx, al\r
+ mov [fdd_errorcode], 0x80 ; error code\r
+\r
+ xor ecx, ecx\r
+ mov cx, 3 ; try seek 3 times\r
+ .l2:\r
+ mov al, 0\r
+ push ebx\r
+ mov bl, [fdd_track]\r
+ mov bh, [fdd_drivehead] ; ((head*4)|drive)\r
+ call fdd_recal_seek\r
+ pop ebx\r
+ jnc .l3 ; ok, continue.\r
+ loop .l2\r
+ jmp .error ; timeout.\r
+ .l3:\r
+ push ebx\r
+ cmp bl, 0\r
+ je .read_fdd\r
+\r
+ .write_fdd:\r
+ push edi\r
+ mov esi, edi\r
+ mov edi, 0x80000 ; copy the stuff we will\r
+ mov ecx, 128 ; write to the DMA buffer\r
+ rep movsd ; 128*4=512\r
+ pop edi\r
+\r
+ mov bl, 2 ; channel 2\r
+ mov esi, 512 ; bytes to write\r
+ mov ecx, 0x80000 ; page & offset\r
+ mov bh, 1 ; write floppy, read DMA\r
+ call dma_transfer\r
+\r
+ mov al, 0xC5 ; write sector command\r
+ call fdc_sendbyte\r
+ jmp .cont\r
+\r
+ .read_fdd:\r
+ mov bl, 2 ; channel 2\r
+ mov esi, 512 ; bytes to read\r
+ mov ecx, 0x80000 ; page & offset\r
+ mov bh, 0 ; read floppy, write DMA\r
+ call dma_transfer\r
+\r
+ mov al, 0xE6 ; read sector command\r
+ call fdc_sendbyte\r
+\r
+ .cont:\r
+ pop ebx\r
+ mov al, [fdd_drivehead] ; ((head*4)|drive)\r
+ call fdc_sendbyte\r
+ mov al, [fdd_track] ; track/cylinder\r
+ call fdc_sendbyte\r
+\r
+ mov al, [fdd_head] ; head/side 0 or 1\r
+ call fdc_sendbyte\r
+ mov al, [fdd_sector] ; sector number\r
+ call fdc_sendbyte\r
+ mov al, 0x02 ; sector size, 512 bytes\r
+ call fdc_sendbyte\r
+\r
+ mov al, 0x12 ; sectors to a track\r
+ call fdc_sendbyte\r
+ mov al, 0x1B ; gap length\r
+ call fdc_sendbyte\r
+ mov al, 0xFF ; data length\r
+ call fdc_sendbyte\r
+\r
+ mov [fdd_int_done], 0\r
+ call wait_int\r
+ jc .error\r
+\r
+ call fdc_getbyte\r
+ mov [result_ST0], al ; ST0\r
+ call fdc_getbyte\r
+ mov [result_ST1], al ; ST1\r
+ call fdc_getbyte\r
+ mov [result_ST2], al ; ST2\r
+ call fdc_getbyte\r
+ mov [result_C], al ; cylinder\r
+ call fdc_getbyte\r
+ mov [result_H], al ; head\r
+ call fdc_getbyte\r
+ mov [result_R], al ; sector number.\r
+ call fdc_getbyte\r
+ mov [result_N], al ; sector size\r
+\r
+ test [result_ST0], 0xc0 ; test if sr0 is 0xC0\r
+ jnz .error\r
+ cmp bl, 1 ; did we write the disk?\r
+ je .ok\r
+\r
+ mov ecx, 512 ; sector size in bytes\r
+ mov esi, 0x80000 ; copy to dest. in edi\r
+ rep movsb\r
+ .ok:\r
+ mov [fdd_errorcode], 0 ; no error.. :D\r
+ mov [fdd_error], 0 ; no recal. next time\r
+ clc\r
+ jmp .end\r
+ .error:\r
+ mov [fdd_error], 1 ; recalibrate next time\r
+ stc\r
+ .end:\r
+ call fdd_off ; floppy motor off\r
+ popad\r
+ mov al, [fdd_errorcode] ; error status\r
+ ret
\ No newline at end of file