0 оценок0% нашли этот документ полезным (0 голосов)
164 просмотров11 страниц
Assembly language source for floppy disk parameter monitor.
Displays in upper right corner.
Best viewed in fixed font, e.g. COURIER.
Line oriented source, download as a Word document and open, then save as text to preserve line breaks.
Assembly language source for floppy disk parameter monitor.
Displays in upper right corner.
Best viewed in fixed font, e.g. COURIER.
Line oriented source, download as a Word document and open, then save as text to preserve line breaks.
Авторское право:
Attribution ShareAlike (BY-SA)
Доступные форматы
Скачайте в формате DOC, PDF, TXT или читайте онлайн в Scribd
Assembly language source for floppy disk parameter monitor.
Displays in upper right corner.
Best viewed in fixed font, e.g. COURIER.
Line oriented source, download as a Word document and open, then save as text to preserve line breaks.
Авторское право:
Attribution ShareAlike (BY-SA)
Доступные форматы
Скачайте в формате DOC, PDF, TXT или читайте онлайн в Scribd
; DISKMON (c) copyright 1992 Kevin G. Rhoads, all rights reserved.
; This code is copyrighted, all rights reserved except as stated below.
; ; This software is provided "as-is". ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ;--------------------------------------------------------------------- ; ; Permission to copy and distribute source (DISKMON.asm), binary ; (DISKMON.com) and documentation is ; granted to any individuals or companies who do so in accordance with ; the GNU Public License v 2.0 or later. ; code_seg segment assume cs:code_seg,ds:nothing,es:nothing ORG 100H entry_point proc near jmp init oldtick label dword ;saved vector for int 1cH oldticko dw ? oldticks dw ? ;olddisk label dword ;saved vector for int 13h ;olddisko dw ? ;olddisks dw ? altdisk label dword ;saved vector for int 40h altdisko dw ? altdisks dw ? ; the_count dw 0 max_count dw 09h hex_dig db '0123456789ABCDEF' string db ' ' ; ax_save dw ? bx_save dw ? cx_save dw ? dx_save dw ? ds_save dw ? es_save dw ? si_save dw ? di_save dw ? bp_save dw ? ax_savw dw ? bx_savw dw ? cx_savw dw ? dx_savw dw ? ds_savw dw ? es_savw dw ? si_savw dw ? di_savw dw ? bp_savw dw ? it dw ? cursor dw ? row db ? ; ; ;INT 40H handler altd: pushf call dword ptr altdisk pushf mov cs:ax_save,ax call near ptr bingo mov cs:the_count,ax mov ax,cs:ax_save popf db 0caH ;retf 2 dw 2 ; ;INT 1cH HANDLER counter label near cli mov cs:ax_savw,ax mov ax,cs:the_count dec ax jnz no_bingo call near ptr bingow no_bingo label near mov cs:the_count,ax mov ax,cs:ax_savw jmp dword ptr cs:[oldtick] ; ; bingow label near mov cs:bx_savw,bx mov cs:cx_savw,cx mov cs:dx_savw,dx mov cs:si_savw,si mov cs:di_savw,di mov cs:bp_savw,bp mov cs:ds_savw,ds mov cs:es_savw,es call near ptr bingoc ; restore and exit mov es,cs:es_savw mov ds,cs:ds_savw mov bp,cs:bp_savw mov di,cs:di_savw mov si,cs:si_savw mov dx,cs:dx_savw mov cx,cs:cx_savw mov bx,cs:bx_savw mov ax,cs:max_count db 0c3h ; rets ; bingo label near mov cs:bx_save,bx mov cs:cx_save,cx mov cs:dx_save,dx mov cs:si_save,si mov cs:di_save,di mov cs:bp_save,bp mov cs:ds_save,ds mov cs:es_save,es call near ptr bingoc ; restore and exit mov es,cs:es_save mov ds,cs:ds_save mov bp,cs:bp_save mov di,cs:di_save mov si,cs:si_save mov dx,cs:dx_save mov cx,cs:cx_save mov bx,cs:bx_save mov ax,cs:max_count db 0c3h ; rets ; bingoc label near ;have saved - set up addressing mov ax,40h mov es,ax assume cs:code_seg,ds:nothing,es:bios_data push cs pop ds assume cs:code_seg,ds:code_seg,es:bios_data ;reset count for next round mov ax,max_count mov the_count,ax ;get BIOS DISK data values -- recal status / motor status mov bx,word ptr es:[3eh] call convert mov al,0 mov row,al call display ; 41/42 diskette status/NEC status byte 1 mov bx,word ptr es:[41h] call convert mov al,1 mov row,al call display ; 43/44 NEC status bytes 2 & 3 mov bx,word ptr es:[43h] call convert mov al,2 mov row,al call display ;now do sectors/track & r/w/v gap mov ax,0 mov es,ax les bx,dword ptr es:[78h] mov bx,word ptr es:[bx+4] call convert mov al,3 mov row,al call display ; restore and exit assume cs:code_seg,ds:nothing,es:nothing db 0c3h ; rets ; assume cs:code_seg,ds:code_seg convert label near mov si,offset hex_dig mov it,bx and bx,0fH add bx,si mov al,byte ptr ds:[bx] mov string[1],al mov bx,it shr bl,1 shr bl,1 shr bl,1 shr bl,1 and bx,0fH add bx,si mov al,byte ptr ds:[bx] mov string,al mov bx,it mov bl,bh mov it,bx and bx,0fH add bx,si mov al,byte ptr ds:[bx] mov string[4],al mov bx,it shr bl,1 shr bl,1 shr bl,1 shr bl,1 and bx,0fH add bx,si mov al,byte ptr ds:[bx] mov string[3],al db 0c3h ; rets ; ; display label near mov ah,3 xor bx,bx int 10h mov cursor,dx mov ah,2 mov bh,0 mov dl,075d mov dh,row int 10h mov ah,10d mov al,string mov bx,070 mov cx,1 int 10h mov ah,2 mov bh,0 mov dl,076d mov dh,row int 10h mov ah,10d mov al,string[1] mov bx,070 mov cx,1 int 10h mov ah,2 mov bh,0 mov dl,077d mov dh,row int 10h mov ah,10d mov al,string[2] mov bx,070 mov cx,1 int 10h mov ah,2 mov bh,0 mov dl,078d mov dh,row int 10h mov ah,10d mov al,string[3] mov bx,070 mov cx,1 int 10h mov ah,2 mov bh,0 mov dl,079d mov dh,row int 10h mov ah,10d mov al,string[4] mov bx,070 mov cx,1 int 10h mov ah,2 xor bx,bx mov dx,cursor int 10h db 0c3h ; rets ; init label near assume cs:code_seg,ds:code_seg,es:nothing xor ax,ax mov es,ax assume cs:code_seg,ds:code_seg,es:abs0 les di,dword ptr es:[timertk] mov word ptr oldticko,di mov di,es mov word ptr oldticks,di xor ax,ax mov es,ax les di,dword ptr es:[diskalt] mov word ptr altdisko,di mov di,es mov word ptr altdisks,di xor ax,ax mov es,ax cli mov ax,offset counter mov word ptr es:tickoff,ax mov ax,cs mov word ptr es:tickseg,ax mov ax,offset altd mov word ptr es:altoff,ax mov ax,cs mov word ptr es:altseg,ax mov ax,max_count mov the_count,ax
mov ah,30h ;DOS 2.0 or higher?
int 21h ; if so close handles 0 .. 4 cmp al,0 je bye_bye ; is DOS 1.x
mov bx,0 ; handle 0
mov ah,3eh ; close int 21h mov bx,1 ; handle 1 mov ah,3eh ; close int 21h mov bx,2 ; handle 2 mov ah,3eh ; close int 21h mov bx,3 ; handle 3 mov ah,3eh ; close int 21h mov bx,4 ; handle 4 mov ah,3eh ; close int 21h ;; ;; mov bx,cs:[2Ch] ; get environment seg from PSP ;; mov es,bx ; and free it ;; mov ah,49h ;; int 21h ;; mov dx,offset init ;get offset add dx,0Fh ; will convert bytes to paragraphs shr dx,1 ; so add 15 to avoid truncation shr dx,1 ; error then divide by 16, implemented shr dx,1 ; as four successive 1 bit shifts shr dx,1 mov ax,3100h ; DOS 2.0+ TSR int 21h ; if DOS 2.0+ TSR call returns (? how) will fall through to INT 27h bye_bye label near sti mov dx,offset init int 27h entry_point endp code_seg ends ; ; abs0 segment at 0 org 4ch romdisk label dword diskoff dw ? diskseg label word org 70h timertk label dword tickoff dw ? tickseg label word org 78h dskparm label dword parmoff dw ? parmseg label word org 100h diskalt label dword altoff dw ? altseg label word abs0 ends ; bios_data segment at 040h org 090h states label word a_state db ? b_state db ? state_ops label word a_state_op db ? b_state_op db ? cylinders label word a_cyl db ? b_cyl db ? bios_data ends end entry_point