Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .MODEL SMALL
- Space EQU " " ;Szóköz karakter
- .STACK
- .DATA
- prompt_disk DB 'Enter disk number (0=A, 1=B, 2=C, ...):', CR, LF, 0
- prompt_segment DB 'Enter starting segment:', CR, LF, 0
- border_char DB '*'
- border_attr DB 4Eh ; piros hatter karakter
- .DATA?
- block DB 512 DUP (?) ;1 blokknyi terület kijelölése
- disk_number DB ?
- start_segment DW ?
- .CODE
- main proc
- MOV AX, @DATA ;DS beállítása
- MOV DS, AX
- ; disk number
- MOV DX, offset prompt_disk
- LEA BX, prompt_disk
- CALL write_string
- CALL cr_lf
- CALL read_decimal
- MOV disk_number, DL
- ; kezdo segment
- MOV DX, offset prompt_segment
- LEA BX, prompt_segment
- CALL write_string
- CALL cr_lf
- CALL read_decimal
- MOV start_segment, AX
- LEA BX, block ;DS:BX memóriacímre tölti a blokkot
- MOV AL, disk_number ;Lemezmeghajtó száma (A:0, B:1, C:2, stb.)
- MOV CX, 1 ;Egyszerre beolvasott blokkok száma
- MOV DX, start_segment ;Lemezolvasás kezdőblokkja
- INT 25h ;Olvasás
- POPF ;A veremben tárolt jelzőbitek törlése
- XOR DX, DX ;Kiírandó adatok kezdőcíme DS:DX
- CALL write_block ;Egy blokk kiírása
- ; also es felso border
- MOV AX, 0B800h
- MOV ES, AX
- MOV CX, 80
- MOV DI, 0
- CALL draw_horizontal_border
- MOV DI, 160 * 24
- CALL draw_horizontal_border
- ; bal és jobb border
- MOV CX, 25
- MOV DI, 0
- CALL draw_vertical_border
- MOV DI, 158
- CALL draw_vertical_border
- MOV AH, 4Ch ; Kilépés a programból
- INT 21h
- main endp
- write_string proc ;BX-ben címzett karaktersorozat kiírása 0 kódig.
- PUSH DX ;DX mentése a verembe
- PUSH BX ;BX mentése a verembe
- write_string_new:
- MOV DL, [BX] ;DL-be egy karakter betöltése
- OR DL, DL ;DL vizsgálata
- JZ write_string_end ;0 esetén kilépés
- CALL write_char ;Karakter kiírása
- INC BX ;BX a következő karakterre mutat
- JMP write_string_new ;A következő karakter betöltése
- write_string_end:
- POP BX ;BX visszaállítása
- POP DX ;DX visszaállítása
- RET ;Visszatérés
- write_string endp
- write_block proc ;Egy blokk kiírása a képernyőre
- PUSH CX ;CX mentése
- PUSH DX ;DX mentése
- MOV CX, 32 ;Kiírandó sorok száma CX-be
- write_block_new:
- CALL out_line ;Egy sor kiírása
- CALL cr_lf ;Soremelés
- ADD DX, 16 ;Következő sor adatainak kezdőcíme;
- LOOP write_block_new ;Új sor
- POP DX ;DX visszaállítása
- POP CX ;CX visszaállítása
- RET
- write_block endp
- out_line proc
- PUSH BX ;BX mentése
- PUSH CX ;CX mentése
- PUSH DX ;DX mentése
- MOV BX,DX ;Sor adatainak kezdőcíme BX-be
- PUSH BX ;Mentés a karakteres kiíráshoz
- MOV CX, 16 ;Egy sorban 16 hexadecimális karakter
- hexa_out:
- MOV DL, Block[BX] ;Egy bájt betöltése
- CALL write_hexa ;Kiírás hexadecimális formában
- MOV DL,Space ;Szóköz kiírása a hexa kódok között
- CALL write_char
- INC BX ;Következő adatbájt címe
- LOOP hexa_out ;Következő bájt
- MOV DL, Space ;Szóköz kiírása a kétféle mód között
- CALL write_char
- MOV CX, 16 ;Egy sorban 16 karakter
- POP BX ;Adatok kezdőcímének beállítása
- ascii_out:
- MOV DL, Block[BX] ;Egy bájt betöltése
- CMP DL, Space ;Vezérlőkarakterek kiszűrése
- JA visible ;Ugrás, ha látható karakter
- MOV DL, Space ;Nem látható karakterek cseréje szóközre
- visible:
- CALL write_char ;Karakter kiírása
- INC BX ;Következő adatbájt címe
- LOOP ascii_out ;Következő bájt
- POP DX ;DX visszaállítása
- POP CX ;CX visszaállítása
- POP BX ;BX visszaállítása
- RET ;Vissza a hívó programba
- out_line endp
- write_hexa proc ;A DL-ben levo ket hexa szamjegy kiirasa
- PUSH CX ;CX mentese a verembe
- PUSH DX ;DX mentese a verembe
- MOV DH, DL ;DL mentese
- MOV CL, 4 ;Shift-eles szama CX-be
- SHR DL, CL ;DL shift-elese 4 hellyel jobbra
- CALL write_hexa_digit ;Hexadecimalis digit kiirasa
- MOV DL, DH ;Az eredeti ertek visszatoltese DL-be
- AND DL, 0Fh ;A felso negy bit torlese
- CALL write_hexa_digit ;Hexadecimalis digit kiirasa
- POP DX ;DX visszaallitasa
- POP CX ;CX visszaallitasa
- RET ;Visszateres a hivo rutinba
- write_hexa endp
- write_hexa_digit proc
- PUSH DX ;DX mentese a verembe
- CMP DL, 10 ;DL osszehasonlitasa 10-zel
- JB non_hexa_letter ;Ugras, ha kisebb 10-nel
- ADD DL, "A"-"0"-10 ;A – F betűt kell kiirni
- non_hexa_letter:
- ADD DL, "0" ;Az ASCII kod megadasa
- CALL write_char ;A karakter kiirasa
- POP DX ;DX visszaallitasa
- RET ;Visszateres a hivo rutinba
- write_hexa_digit endp
- CR EQU 13
- LF EQU 10
- cr_lf proc
- PUSH DX
- MOV DL,CR
- CALL write_char
- MOV DL,LF
- CALL write_char
- POP DX
- RET
- cr_lf endp
- read_char proc
- PUSH AX
- MOV AH,1
- INT 21h
- MOV DL,AL
- POP AX
- RET
- read_char endp
- write_char proc
- PUSH AX
- MOV AH,2
- INT 21h
- POP AX
- RET
- write_char endp
- write_binary proc ;kiirando adat a DL-ben
- PUSH BX ;BX mentese a verembe
- PUSH CX ;CX mentese a verembe
- PUSH DX ;DX mentese a verembe
- MOV BL, DL ;DL masolasa BL-be
- MOV CX, 8 ;Ciklusvaltozo (CX) beallitasa
- binary_digit:
- XOR DL, DL ;DL torlese
- RCL BL, 1 ;Rotalas balra eggyel, kilepo bit a CF-be
- ADC DL, "0" ;DL = DL + 48 + CF
- CALL write_char ;Binaris digit kiirasa
- LOOP binary_digit ;Vissza a ciklus elejere
- POP DX ;DX visszaallitasa
- POP CX ;CX visszaallitasa
- POP BX ;BX visszaallitasa
- RET ;Visszateres a hivo rutinba
- write_binary endp
- write_decimal proc
- PUSH AX ;AX mentese a verembe
- PUSH CX ;CX mentese a verembe
- PUSH DX ;DX mentese a verembe
- PUSH SI ;SI mentese a verembe
- XOR DH, DH ;DH torlese
- MOV AX, DX ;AX-be a szam
- MOV SI, 10 ;SI-ba az oszto
- XOR CX, CX ;CX-be kerul az osztasok szama
- decimal_non_zero:
- XOR DX, DX ;DX torlese
- DIV SI ;DX:AX 32 bites szam osztasa SI-vel, az eredmeny AXbe, a maradek DX-be kerul
- PUSH DX ;DX mentese a verembe
- INC CX ;Szamlalo novelese
- OR AX, AX ;Statuszbitek beallitasa AX-nek megfeleloen
- JNE decimal_non_zero ;Vissza, ha az eredmeny meg nem nulla
- decimal_loop:
- POP DX ;Az elmentett maradek visszahivasa
- CALL write_hexa_digit ;Egy decimalis digit kiirasa
- LOOP decimal_loop
- POP SI ;SI visszaallitasa
- POP DX ;DX visszaallitasa
- POP CX ;CX visszaallitasa
- POP AX ;AX visszaallitasa
- RET ;Visszateres a hivo rutinba
- write_decimal endp
- read_decimal proc
- PUSH AX ;AX mentese a verembe
- PUSH BX ;BX mentese a verembe
- MOV BL, 10 ;BX-be a szamrendszer alapszama, ezzel szorzunk
- XOR AX, AX ;AX torlese
- read_decimal_new:
- CALL read_char ;Egy karakter beolvasasa
- CMP DL, CR ;ENTER ellenorzese
- JE read_decimal_end ;Vege, ha ENTER volt az utolso karakter
- SUB DL, "0" ;Karakterkod minusz "0" kodja
- MUL BL ;AX szorzasa 10-zel
- ADD AL, DL ;A kovetkezo helyi ertek hozzaadasa
- JMP read_decimal_new ;A kovetkezo karakter beolvasasa
- read_decimal_end:
- MOV DL, AL ;DL-be a beirt szam
- POP BX ;AB visszaallitasa
- POP AX ;AX visszaallitasa
- RET ;Visszateres a hivo rutinba
- read_decimal endp
- ;for borders
- draw_horizontal_border proc
- PUSH AX
- PUSH CX
- PUSH DI
- MOV AL, border_char
- MOV AH, border_attr
- draw_horizontal_loop:
- MOV ES:[DI], AX
- ADD DI, 2
- LOOP draw_horizontal_loop
- POP DI
- POP CX
- POP AX
- RET
- draw_horizontal_border endp
- draw_vertical_border proc
- PUSH AX
- PUSH CX
- PUSH DI
- MOV AL, border_char
- MOV AH, border_attr
- draw_vertical_loop:
- MOV ES:[DI], AX
- ADD DI, 160
- LOOP draw_vertical_loop
- POP DI
- POP CX
- POP AX
- RET
- draw_vertical_border endp
- END main
Advertisement
Add Comment
Please, Sign In to add comment