176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 1998-2008 H. Peter Anvin - All Rights Reserved 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2009 Intel Corporation; author: H. Peter Anvin 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License as published by 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Boston MA 02111-1307, USA; either version 2 of the License, or 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (at your option) any later version; incorporated herein by reference. 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */ 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * int 0x25 and 0x26 direct sector access 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Use assembly wrapper functions for these system calls, since unlike 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * int 0x21 calls they are "dirty" and can destroy unrelated registers. 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * NOTE: these all assume the data buffer is in the data segment, i.e. 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * %ds == %es == dio.bufseg. 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Usage: int int25_read_sector(drive, dio) 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Usage: int int26_write_sector(drive, dio) 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .code16gcc 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .text 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .globl int25_read_sector 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .type int25_read_sector, @function 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint25_read_sector: 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %ebp 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %edi 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %esi 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %ebx 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman decw %ax /* AL = drive number (0 = A:) */ 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movw %dx, %bx /* BX = dio structure */ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movw 6(%bx), %dx /* DX = data buffer */ 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movw $-1, %cx 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int $0x25 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jc 1f 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xorw %ax, %ax /* Error code: 0 = no error */ 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman1: 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popfw 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movzwl %ax, %eax 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %ebx 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %esi 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %edi 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %ebp 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retl 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .size int25_read_sector, .-int25_read_sector 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .globl int26_write_sector 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .type int26_write_sector, @function 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint26_write_sector: 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %ebp 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %edi 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %esi 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pushl %ebx 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman decw %ax /* AL = drive number (0 = A:) */ 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movw %dx, %bx /* BX = dio structure */ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movw 6(%bx), %dx /* DX = data buffer */ 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movw $-1, %cx 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int $0x26 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman jc 1f 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman xorw %ax, %ax /* Error code: 0 = no error */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman1: 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popfw 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman movzwl %ax, %eax 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %ebx 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %esi 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %edi 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman popl %ebp 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman retl 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .size int26_write_sector, .-int26_write_sector 79