; Advanced Fullscreen Disassembler v2.11 ; Copyright (C) by Rumen Gerasimov (GERISOFT), 1987, 1988 ; ; First listing: without DATA segment ; ; Segment value: 0000, length: 0200 ; BIOS_SEG SEGMENT at 0h org 0020h D0020 dw 0 D0022 dw 0 INTERR8 label far org 004Ch D004C dw 0 D004E dw 0 org 0413h D0413 dw 0 BIOS_SEG ends BOOT_SEG SEGMENT at 7Ch org 0 BOOT_PROCESS label far BOOT_SEG ends DISK_ROM SEGMENT at 0C800h org 256h C800_SEG label far DISK_ROM ends SEG0000 segment public para 'CODE' assume CS:SEG0000, ds:SEG0000 ;***********************************************************; ; - ; ; boot sector ; ;***********************************************************; ; 0000:7C00 07C0:0000 ; ORG 7C00h JMP short L7C1E D7C02 db 90h db 'IBM 3.1' DB 0 DB 2 D7C0D DB 2 D7C0E DW 1 DB 2 DB 70h DB 0 D7C13 DW 2D0h DB 0FDh DB 2 DB 0 D7C18 DW 9 ;Sector per track - SecPTrk D7C1A DW 2 ;Side per track - SidPTrk D7C1C DW 0 L7C1E: XOR AX,AX MOV SS,AX MOV SP,7C00h MOV DS,AX assume ds:BIOS_SEG MOV AX,Word Ptr D0413 ; BIOS MEMSIZE 2 SUB AX,0002h MOV Word Ptr D0413,AX assume ds:SEG0000 MOV CL,06h SHL AX,CL SUB AX,07C0h MOV ES,AX ;ES: 2 MOV SI,7C00h MOV DI,SI MOV CX,0100h REPZ MOVSW ; : db 08Eh,0C8h ;MOV CS,AX ; ;CS:7C00 - PUSH CS POP DS CALL L7C4A L7C4A: XOR AH,AH ;RESET INT 13 INT 13h AND Byte Ptr D7DF8,80h ; (A: - floppy ; C: - hard MOV BX,Word Ptr D7DF9 ; , - PUSH CS ; POP AX SUB AX,0020h MOV ES,AX ;adres = (CS - 20h):8000h CALL L7C9D MOV BX,Word Ptr D7DF9 ; INC BX ; ( BOOT) MOV AX,0FFC0h ;adres = 0000:7C00 MOV ES,AX CALL L7C9D XOR AX,AX MOV Byte Ptr D7DF7,AL ; - ( ) MOV DS,AX assume ds:BIOS_SEG MOV AX,Word Ptr D004C ; INT 13! MOV BX,Word Ptr D004E MOV Word Ptr D004C,offset NewINT13 MOV Word Ptr D004E,CS PUSH CS POP DS assume ds:SEG0000 MOV Word Ptr D7D2A,AX ; INT 13 MOV Word Ptr D7D2C,BX MOV DL,Byte Ptr D7DF8 ; BOOT jmp BOOT_PROCESS ; BOOT process ;================================================================; ; (L7C9D) (L7C98) ; ; ; ;----------------------------------------------------------------; ; BX - , ; ; ES:8000 - , ; ; ; ; D7DF8 - , ; ; ; ;================================================================; L7C98: MOV AX,0301h JMP short L7CA0 L7C9D: MOV AX,0201h L7CA0: XCHG BX,AX ADD AX,Word Ptr D7C1C XOR DX,DX DIV Word Ptr D7C18 ; AX INC DL ; (0-7..) Track, Side, Sector MOV CH,DL ; CX, DX ( INT 13) XOR DX,DX DIV Word Ptr D7C1A MOV CL,06h SHL AH,CL OR AH,CH MOV CX,AX XCHG CH,CL MOV DH,DL MOV AX,BX L7CC3: MOV DL,Byte Ptr D7DF8 ; (A:) MOV BX,8000h INT 13h JNC L7CCF POP AX ; , I/O err L7CCF: RET ;========================================================================; ; INT 13 ; ;========================================================================; NewINT13: PUSH DS ; PUSH ES PUSH AX PUSH BX PUSH CX PUSH DX PUSH CS ; DS ES POP DS PUSH CS POP ES TEST Byte Ptr D7DF7,01h ; 1 - , JNE L7D23 ; . INT 13 CMP AH,02h ; ? JNE L7D23 ;, INT 13 CMP Byte Ptr D7DF8,DL ; MOV Byte Ptr D7DF8,DL ; JNE L7D12 ; XOR AH,AH ; INT 1Ah TEST DH,7Fh ; 8000 low order part = 1? JNE L7D03 ;, TEST DL,0F0h ; 00F0 low order part = 1? JNE L7D03 ;, ;: TIMER .and. 80F0h == 0 ; 1800 . = 30 . PUSH DX call L7EB3 ; - POP DX L7D03: MOV CX,DX ; SUB DX,Word Ptr D7EB0 ; ( ) MOV Word Ptr D7EB0,CX SUB DX,+24h JC L7D23 L7D12: OR Byte Ptr D7DF7,01h ; / PUSH SI PUSH DI CALL L7D2E POP DI POP SI AND Byte Ptr D7DF7,0FEh L7D23: POP DX ; POP CX POP BX POP AX POP ES POP DS D7D2A = $+1 D7D2C = $+3 jmp c800_SEG ; INT 13 ;================================================================; ; ; ;================================================================; L7D2E: MOV AX,0201h ; BOOT sector MOV DH,00h ; BX = ?????????????????????? , ! MOV CX,0001h CALL L7CC3 TEST Byte Ptr D7DF8,80h ;HARD DISK? JE L7D63 ; ;---- HARD DISK ----; MOV SI,81BEh ; DOS partition MOV CX,0004h L7D46: CMP Byte Ptr [SI+04h],01h JE L7D58 CMP Byte Ptr [SI+04h],04h JE L7D58 ADD SI,+10h LOOP L7D46 RET ; DOS partition, ;---- DOS partition ----; L7D58: MOV DX,Word Ptr [SI] MOV CX,Word Ptr [SI+02h] MOV AX,0201h CALL L7CC3 ; BOOT sector DOS partition ;---- , BOOT sector ----; L7D63: MOV SI,8002h MOV DI,offset D7C02 MOV CX,001Ch REPZ MOVSB ; BPB BOOT sector CMP Word Ptr D8000+01FCh,1357h ; ? JNE L7D8B ; CMP Byte Ptr D8000+01FBh,00h ; DS? JNC L7D8A ;---- ----; ;---- ? ----; MOV AX,Word Ptr D8000+01F5h ; ... MOV Word Ptr D7DF5,AX MOV SI,Word Ptr D8000+01F9h jmp L7E92 L7D8A: RET ;------------------- ; , ; L7D8B: CMP Word Ptr D8000+000Bh,0200h ; JNE L7D8A CMP Byte Ptr D8000+000Dh,02h JC L7D8A MOV CX,Word Ptr D8000+000Eh MOV AL,Byte Ptr D8000+0010h CBW MUL Word Ptr D8000+0016h ADD CX,AX MOV AX,0020h MUL Word Ptr D8000+0011h ADD AX,01FFh MOV BX,0200h DIV BX ADD CX,AX MOV Word Ptr D7DF5,CX MOV AX,Word Ptr D7C13 SUB AX,Word Ptr D7DF5 MOV BL,Byte Ptr D7C0D XOR DX,DX XOR BH,BH DIV BX INC AX MOV DI,AX AND Byte Ptr D7DF7,0FBh CMP AX,0FF0h JBE L7DE0 OR Byte Ptr D7DF7,04h L7DE0: MOV SI,0001h MOV BX,Word Ptr D7C0E DEC BX MOV Word Ptr D7DF3,BX MOV Byte Ptr D7EB2,0FEh JMP short L7E00 D7DF3 DW 1 D7DF5 DW 000Ch D7DF7 DB 1 ;-: ; 0000 0001 - ; 0000 0010 - INT 08 ; 0000 0100 D7DF8 DB 00 ;: 0 - A:, 1 - B:, ... D7DF9 DW 274h ; , DB 00 DW 1357h ; !!!!!!!! DW 0AA55h ; BOOT ;***********************************************************; ; - ; ; bad sector ; ;***********************************************************; L7E00: INC Word Ptr D7DF3 MOV BX,Word Ptr D7DF3 ADD Byte Ptr D7EB2,02h call L7C9D JMP short L7E4B L7E12: MOV AX,0003h TEST Byte Ptr D7DF7,04h JE L7E1D INC AX L7E1D: MUL SI SHR AX,1 SUB AH,Byte Ptr D7EB2 MOV BX,AX CMP BX,01FFh JNC L7E00 MOV DX,Word Ptr D8000[BX] TEST Byte Ptr D7DF7,04h JNE L7E45 MOV CL,04h TEST SI,0001h JE L7E42 SHR DX,CL L7E42: AND DH,0Fh L7E45: TEST DX,0FFFFh JE L7E51 L7E4B: INC SI CMP SI,DI JBE L7E12 RET L7E51: MOV DX,0FFF7h TEST Byte Ptr D7DF7,04h JNE L7E68 AND DH,0Fh MOV CL,04h TEST SI,0001h JE L7E68 SHL DX,CL L7E68: OR Word Ptr D8000[BX],DX MOV BX,Word Ptr D7DF3 call L7C98 MOV AX,SI SUB AX,0002h MOV BL,Byte Ptr D7C0D XOR BH,BH MUL BX ADD AX,Word Ptr D7DF5 MOV SI,AX MOV BX,0000h call L7C9D MOV BX,SI INC BX call L7C98 L7E92: MOV BX,SI MOV Word Ptr D7DF9,SI PUSH CS POP AX SUB AX,0020h MOV ES,AX call L7C98 PUSH CS POP AX SUB AX,0040h MOV ES,AX MOV BX,0000h call L7C98 RET D7EB0 DW 0EEF0h D7EB2 DB 0 ;=======================================================; ; int 08, ; ;=======================================================; L7EB3: TEST Byte Ptr D7DF7,02h JNE L7EDE OR Byte Ptr D7DF7,02h assume ds:BIOS_SEG MOV AX,0000h ; INT 8 MOV DS,AX MOV AX,Word Ptr D0020 MOV BX,Word Ptr D0022 MOV Word Ptr D0020,offset NewINT08 MOV Word Ptr D0022,CS assume ds:SEG0000 PUSH CS POP DS MOV Word Ptr D7FC9,AX ; INT 8 MOV Word Ptr D7FCB,BX L7EDE: RET ;=====================================================================; ; int 08 ; ;=====================================================================; NewINT08: PUSH DS ; PUSH AX PUSH BX PUSH CX PUSH DX PUSH CS ; DS POP DS MOV AH,0Fh ;Get current video mode INT 10h MOV BL,AL CMP BX,Word Ptr D7FD4 ;mode = mode JE L7F27 ;, ;---- . ----; MOV Word Ptr D7FD4,BX ; mode DEC AH MOV Byte Ptr D7FD6,AH ; char_per_line-1 MOV AH,01h CMP BL,07h ;mode = text b/w MGA, EGA? JNE L7F05 ; DEC AH L7F05: CMP BL,04h ;mode = graphics? JNC L7F0C ; DEC AH L7F0C: MOV Byte Ptr D7FD3,AH MOV Word Ptr D7FCF,0101h MOV Word Ptr D7FD1,0101h MOV AH,03h ;Read cursor position and size INT 10h PUSH DX ; MOV DX,Word Ptr D7FCF JMP short L7F4A ;---- (mode) ----; L7F27: MOV AH,03h ;Read cursor position and size INT 10h PUSH DX ; cursor pos & size MOV AH,02h ;Set cursor position MOV DX,Word Ptr D7FCF INT 10h MOV AX,Word Ptr D7FCD ; CMP Byte Ptr D7FD3,01h ;mode = GRAPF? JNE L7F41 ; MOV AX,8307h L7F41: MOV BL,AH ;Write character & attribute MOV CX,0001h MOV AH,09h INT 10h ;---- ----; L7F4A: MOV CX,Word Ptr D7FD1 CMP DH,00h ;Up JNE L7F58 XOR CH,0FFh INC CH L7F58: CMP DH,18h ;Down JNE L7F62 XOR CH,0FFh INC CH L7F62: CMP DL,00h ;Left JNE L7F6C XOR CL,0FFh INC CL L7F6C: CMP DL,Byte Ptr D7FD6 ;Right JNE L7F77 XOR CL,0FFh INC CL L7F77: CMP CX,Word Ptr D7FD1 JNE L7F94 MOV AX,Word Ptr D7FCD AND AL,07h CMP AL,03h JNE L7F8B XOR CH,0FFh INC CH L7F8B: CMP AL,05h JNE L7F94 XOR CL,0FFh INC CL L7F94: ADD DL,CL ADD DH,CH MOV Word Ptr D7FD1,CX MOV Word Ptr D7FCF,DX MOV AH,02h INT 10h ;Set cursor position MOV AH,08h ;Read character & attribute INT 10h MOV Word Ptr D7FCD,AX MOV BL,AH CMP Byte Ptr D7FD3,01h ;mode = GRAPH? JNE L7FB6 ; MOV BL,83h L7FB6: MOV CX,0001h ;Write character & attribute MOV AX,0907h INT 10h POP DX ;Restore cursor position MOV AH,02h INT 10h POP DX ; POP CX POP BX POP AX POP DS D7FC9 = $+1 D7FCB = $+3 JMP INTERR8 ; INT 08 D7FCD DW 0 D7FCF DW 0101h ; D7FD1 DW 0101h D7FD3 DB 0 ; 1 - mode = graph, b800 ; 0 - mode = text, b800 ;-1 - mode = 7, text b/w EGA,HGA D7FD4 DW 0FFFFh ; mode D7FD6 DB 50h ; DB 0B7h,0B7h,0B7h,0B6h,040h,040h,088h,0DEh DB 0E6h,05Ah,0ACh,0D2h,0E4h,0EAh,0E6h,040h DB 050h,0ECh,040h,064h,05Ch,060h,052h,040h DB 040h,040h,040h,064h,062h,05Eh,062h,060h DB 05Eh,070h,06Eh,040h,041h,0B7h,0B7h,0B7h DB 0B6h ;************************************************************* ; D8000 = $ SEG0000 ends END