Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila 2 de Assembly
Apostila 2 de Assembly
(2 PARTE)
INF 1091 TPD PUC-RIO
PROFESSOR: RODRIGO TOLEDO
email: rtoledo@openlink.com.br
-1-
NDICE
03
09 14 16 19 23 25 29 33
Interrupes
O esquema de tratamento de interrupes, System Timer, L contador de Timer Ticks
Acesso a Arquivos
Open a File, Close a File, Read From File, Move File Pointer.
Mouse
"Reset Mouse", "Show/Hide Mouse Cursor", "Poll Mouse Status", "Set Cursor Position", "Set Mouse X/Y Limit", "Set Mouse Cursor"
ndice Alfabtico
-2-
Atributo:
bit 7 = 1 piscante bit 3 = 1 intenso bits 6 5 4 1 1 1 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 1 1 1 0 0 1 0 0 0 Reverso Normal Sublinhado Invisvel
Posio na memria: O caracter na linha L (0 a 24) e coluna C (0 a 79 ou 0 a 49) fica armazenado no endereo: 0B000h + (160 * L) + (2 * C)
-3-
Atributo: Bits 7 6,5,4 3 2,1,0 Descrio Este bit pode ser programado como atributo piscante (default), ou como intensidade da cor de fundo. Selecionam a cor de fundo do caracter, correspondendo respectivamente s cores RGB (Red Green and Blue). Intensidade da cor de frente (1 = Intenso). Selecionam a cor de frente, correspondendo respectivamente s cores RGB.
Posio na memria: O caracter correspondente linha L (0 a 24), coluna C (0 a 79) da pgina P (0 a 3 ou 0 a 7) armazenado no endereo: 0B800h + (01000h * P) + (160 * L) + (2 * C) ; Modo 80 Colunas 0B800h + (00800h * P) + (80 * L) + (2 * C) ; Modo 40 Colunas
-4-
Observao: Quando o modo trocado, a tela limpa. Entretanto, no se deve usar este servio como um "Clear Screen", pois ele mais lento que as rotinas normais de limpeza de tela (servios 06h ou 07h).
-5-
Retorna: (Subservio 10h): BH Mode ativo 00h Color mode 01h Monochrome mode BL EGA memory (se a placa for EGA ou superior) 00h 64K 01h 128K 02h 192K 03h 256K CH Adapter bits CL Switch setting
Fim Ah,0Fh ; Pega Video Mode 10h Al,7 MDA Cga,1 ; Se Chegou Aqui, CGA Fim EndVideo, 0B000h
dw 0B800h db 0
-6-
Stosb
Stosw
o valor em AL para o endereo apontado por ES:DI. DI ento incrementado ou decrementado em um byte (segundo DF) para apontar para o prximo endereo.
o valor em AX para o endereo apontado por ES:DI. DI ento incrementado ou decrementado em dois bytes (segundo DF) para apontar para o prximo endereo.
Observao: DI incrementado (ou decrementado) para se preparar para uma possvel repetio do comando (Stosb ou Stosw)
REP (Repeat)
Sintaxe: Rep instruo
Repete uma (nica) instruo CX vezes.
Lgica: Enquanto (CX != 0) { executa instruo CX } Exemplo: Mov CX, 5 Mov Al,R Rep STOSB Observao: REP = REPE (Repeat While Equal) = REPZ (Repeat While Zero).
-7-
FillScr.asm
Code_Seg Segment Assume Cs:Code_Seg, Ds:Data_Seg Proc Near Mov Ax, Data_Seg Mov Ds, Ax Call Detect_Video Call Fill Mov Ah,4Ch Mov Al,00 Int 21h Endp Proc Push Push Push Push Push Mov Mov Call Mov Mov Mov Sub Inc Mov Mov Sub Inc Mov Cld Mov Mov Push Mov Rep Pop Add Dec Jnz Call Pop Pop Pop Pop Pop Ret Near Ax, Bx Cx Di Es Ax,Lin1 Bx,Col1 Video_OffSet Di,Ax Es,EndVideo Ax,Lin2 Ax,Lin1 Ax Rows,Ax Ax,Col2 Ax,Col1 Ax Cols,Ax Al,Char Ah,Att Di Cx,Cols Stosw Di Di,160 Rows FillScr1 Enable_Cga Es Di Cx Bx Ax
FillScr
FillScr Fill
;-----------------------------; Entrada: Ax = Linha ; Bx = Coluna ; Saida: Ax = OffSet ;-----------------------------Video_OffSet Proc Near Push Dx Push Bx Mov Bx,160 Mul Bx Pop Bx Shl Bx,1 Add Ax,Bx Pop Dx Ret Video_OffSet EndP Code_Seg Data_Seg Lin1 Col1 Lin2 Col2 Char Att Rows Cols EndS Segment Dw 10 Dw 0 Dw 13 dw 79 db 67 db 31 dw ? dw ?
FillScr1:
Fill Endp
-8-
Retorna:
-9-
Retorna:
Nada
Retorna:
Retorna:
Observao: O buffer tem que ter tamanho trs vezes maior que o nmero de registros de cor (cada byte receber o valor de RGB).
10
- 10 -
push AX
call SetVideoMode
SP
BP BP AX
SP
BP
IP
AX
push BP
SP add BP, 2 SP SP
BP
mov BP, SP
BP IP
AX
BP
BP IP
AX
SP
BP
BP IP
AX
A partir de agora o valor passado como parmetro pode ser acessado como [BP+2], independente do uso ou no da pilha. Caso houvesse mais de um parmetro, eles seriam acessados como [BP+2], [BP+4], [BP+6] etc...
push AX SP AX BP
BP
pop AX
SP
BP
BP IP
AX
IP
AX
Ret 2
pop BP
SP
BP BP
IP
AX
Os prximos dois passos so o retorno correto de uma funo que recebeu os parmetros na pilha. O Ret 2X garante que sero retirados os X parmetros que se encontravam na pilha. (Ret 2 SP = SP+2)
SP
11
- 11 -
320 160 80 40 20 10 5 1
2 2 2 2 2 2 5
320 = 26 * 5 = 26 * (4 + 1) 320 = 4 * 26 + 26 = 28 + 26
320 A = B = ? =
* x A B
x * * +
= ? 26 22 A
x 6 Di 2 Ax
= = = = =
x x * 26 x * 26 x * 28 x * 320
12
- 12 -
Graf.asm
Code_Seg Segment Assume CS:Code_Seg, DS:Data_Seg Graf Proc Near Mov Ax, Data_Seg Mov DS, Ax Mov Ax, 13h Push Ax Call SetVideoMode Call Tela Call Wait_Key Mov Ax, 0003h Push Ax Call SetVideoMode Mov Ah, 4Ch Int 21h Graf EndP PutPixel Proc Push Mov Add Push Push Mov Shl Mov Shl Add Add Mov Mov Stosb Pop Pop Pop Ret Endp Near Bp Bp, Sp Bp, 2 Ax Di Di, [Bp+6] ;lin Di, 6 Ax, Di Di, 2 Di, Ax Di, [Bp+4] ;col Ax, [Bp+2] ;cor Es, EndSeg Di Ax Bp 6
PutPixel
SetVideoMode Push Mov Add Push Mov Mov Int Pop Pop Ret SetVideoMode
13
- 13 -
Line Proc Near ;Traa linha (X1,Y1,X2,Y2,Cor) Line EndP Tela Proc Push Mov Mov Mov Mov Mov Mov Call Inc Inc Inc Loop Fim_Tela: Pop Ret Endp Proc Near Push Ax Cx Stack_Seg db Stack_Seg End Graf Near Cx X1, 0 Y1, 0 X2, 319 Y2, 0 Cor,0 Cx, 200 Line Y1 Y2 Cor Loop_Tela Wait_Key Code_Seg
Ah, 08 21h Ax
Loop_Tela:
Data_Seg Segment EndSeg dw 0A000h ... ;variveis usadas pelo Line ... X1 dw ? X2 dw ? Y1 dw ? Y2 dw ? cor dw ? Data_Seg Ends Segment Stack 200 Dup('Pilha Ends
Tela Wait_Key
')
14
- 14 -
Observaes: O espao entre o nome do programa e o incio dos parmetros na linha de comandos est includo na lista de parmetros. Ao iniciar um programa, o DS j comea apontando para PSP.
PTR
Sintaxe:
Muda
temporariamente o tipo da expresso (varivel ou rtulo) do seu default para tipo. Geralmente usado para acessar uma varivel de uma maneira diferente da qual ela foi definida; por exemplo, para acessar o byte de mais alta ordem de uma varivel do tipo word. Nome: Byte Word Dword Qword Tbyte Near Far Valor: 1 2 4 8 10 0FFFFh 0FFEEh Exemplo: Mov Al, byte PTR wordvar Mov Al, byte PTR wordvar[1] Call Far PTR rotina
15
- 15 -
PSP.asm
Code_Seg Segment Assume Cs:Code_Seg, Ds:Data_Seg Psp Proc Mov Mov Call Call Call Mov Mov Int Endp Near Ax, Data_Seg Es, Ax Limpa Le_Texto Say Ah,4Ch Al,00 21h
Psp Le_Texto
Proc Near Push Cx,Si,Di Cld Mov Si,80h Xor Ch,Ch Mov Cl,Byte Ptr[Si] Inc Si Lea Di,String Rep MovsB Push Es Pop Ds Mov Byte Ptr[Di],'$' Pop Di,Si,Cx Ret Le_Texto Endp
16
- 16 -
Say
Proc Push Push Mov Lea Int Pop Pop Ret EndP Proc EndP Ends
Data_Seg Texto
Db 0 Db 127
Near
')
17
- 17 -
INTERRUPES:
O Esquema de Tratamento de Interrupes
Interrupes so mecanismos para transferir o controle (CS:IP) de uma localizao na memria para outra. Quando uma interrupo ocorre, a CPU suspende temporariamente o que ela estiver fazendo e executa uma rotina especial conhecida como rotina de servio de interrupo (ISR). Quando a ISR termina, a CPU volta execuo no ponto imediatamente aps a instruo que foi interrompida. Existem trs tipos diferentes de interrupes no PC: Interrupes de Software: usadas pelos programas para invocar rotinas na BIOS e no ncleo do DOS; Interrupes de Hardware: usadas pelos dispositivos de hardware para avisar a CPU de que eles precisam de ateno; e Excees: usadas pela prpria CPU para indicar erros. Quando ocorre uma interrupo, uma seqncia de eventos executada para garantir que a CPU responda interrupo e, mais tarde, retorne execuo como se nada tivesse acontecido. Esta seqncia de eventos a seguinte: 1) O registrador de flags empilhado. 2) Os contedos de CS e IP so colocados na pilha, preservando o endereo no qual a interrupo ocorreu. 3) A flag de interrupo (IF) no registrador de flags limpa, para evitar novas interrupes. O flag de Trap (TF) tambm limpo neste momento. 4) O endereo de 32 bits da ISR obtido da tabela de interrupes localizada no incio da memria, e a execuo ento transferida para este endereo. 5) A ISR executa o processamento necessrio para servir a requisio da interrupo. 6) Quando o manipulador da interrupo executa uma instruo IRET (Interruption Return), os contedos de CS, IP e flags so recuperados da pilha e a execuo retorna de onde parou. obrigao da ISR salvar o estado do sistema no momento em que a interrupo ocorreu e restaur-lo antes que ela termine, de modo que o programa que foi interrompido no seja afetado. Geralmente, a ISR comea salvando na pilha quaisquer registradores que ela possa modificar e termina desempilhando estes registradores. Toda interrupo tem um nmero associado, variando de 0 a 255. Quando uma interrupo ocorre, este nmero serve como um ndice para a tabela conhecida como Vetor de Interrupes, armazenada na memria baixa. Esta tabela contm os endereos de at 256 ISR diferentes. A interrupo 05h, por exemplo, resulta na execuo da ISR cujo endereo o sexto no Vetor (interrupo 0 o primeiro). A tabela est sempre armazenada nos primeirssimos bytes da memria (0000:0000). Uma interrupo de software gerada quando um programa executa uma instruo INT. 18 - 18 -
Existem dois tipos de interrupes de hardware: Mascarveis e No mascarveis. As interrupes no mascarveis so assim chamadas porque so executadas mesmo que o flag de interrupo esteja desativado. As interrupes mascarveis, por sua vez, so desativadas quando o flag estiver zerado. Um dispositivo gera uma interrupo no mascarvel ativando o pino NMI (Non-Maskarable Interrupt) na CPU. Uma Int 02h (Non-Maskable Interrupt) gerada se uma condio no mascarvel, como um erro de paridade na memria, ocorrer. Esta a nica interrupo que no pode ser mascarada pela instruo CLI (Clear Interrupts). As interrupes mascarveis ocorrem quando um dispositivo (como o teclado, o Clock ou a porta serial) ativa uma linha de interrupo. Tipicamente, estes dispositivos no esto conectados diretamente na CPU, mas sim ao controlador de interrupes, cujo trabalho acumular as requisies de interrupo dos dispositivos de hardware, prioriz-las e pass-las para a CPU uma por vez. A sada do controlador de interrupes (geralmente um Intel 8259) conectada a uma linha de interrupo da CPU. Um exemplo clssico de interrupo de hardware o que acontece quando uma tecla pressionada no teclado. Atravs do controlador de interrupes, uma interrupo 09h gerada, o que executa uma ISR do ROM BIOS. A ISR l o cdigo de varredura da porta do teclado, converte este cdigo em seu equivalente ASCII e o coloca no Buffer do teclado. O ltimo tipo de interrupo, a Exceo, gerada pela CPU quando esta detecta uma condio de erro durante ou aps a execuo de uma instruo. Por exemplo, se um programa tenta dividir por zero, a CPU executa uma interrupo 0.
19
- 19 -
Observaes: As seguintes frmulas convertem o contador do Clock, na hora corrente. Horas Resto Minutos Resto Segundos = = = = = Clock / 65543 (10007h) Clock % 65543 Resto / 1092 (444h) Resto % 1092 Resto / 18.21
O contador do Clock tambm pode ser lido como um valor inteiro de 4 bytes no endereo de memria 0000:046Ch. Este valor igual ao inteiro em CX:DX aps a chamada deste servio. Aps a chamada, a flag (0000:0470h) resetada independente de terem passado ou no 24 horas. O comando TIME do DOS pega a hora por meio deste servio.
Observaes:
O "System Timer" (diferentemente do relgio de tempo real, que fsico) o timer que inicializado junto com o sistema. Ele temporrio, durando somente enquanto o sistema estiver ligado. Os incrementos no Clock ocorrem em uma taxa de 18.2 vezes por segundo. Resumo da seqncia de eventos executados quando ocorre uma interrupo: Os registradores de flags, CS e IP so empilhados As flags de interrupo (IF) e de debug (TF) so zeradas. O endereo da ISR obtido no vetor de interrupes, localizado no incio da memria, e a execuo ento transferida para este endereo. A ISR executada. Ao final da ISR, CS, IP e flags so recuperados (comando IRET)
20
- 20 -
PUSHF
Sintaxe: PUSHF Salva o registrador colocando-o na pilha. Lgica: SP = SP 2 (SP) = reg_flags Flags: No so alteradas de flags,
POPF
Sintaxe: POPF Restaura o registrador de flags, retirando-o da pilha. Lgica: reg_flags = (SP) SP = SP + 2 Flags: O D I T S Z A P C * * * * * * * * *
IRET
Sintaxe: IRET Retorna da chamada de interrupo. Lgica: Pop Reg-Flags Pop IP Pop CS Flags: O D I T S Z A P C * * * * * * * * *
ORG
Sintaxe: ORG tam Pseudo-instruo que cria um espao de tamanho tam no executvel.
21
- 21 -
Observaes:
O programa Clock deve ser gerado com extenso .com. Diviso em duas etapas. Exemplo: 100.000 / 65.500 = 1 e resto = 34.500 34.500 / 1.100 = 31 e resto = 400 100.000 / 100 = 1.000 1.000 / 655 = 1 e resto = 345 345 / 11 = 31 e resto = 4 4 x 100 = 400 Diviso em uma etapa.
22
- 22 -
Clock.asm
Code_Seg Segment Assume Cs:Code_Seg Org 100h Inicio: Jmp Inicializa
Inicializa: Assume Ds:Code_Seg Mov Ah,00h Int 1Ah Mov Ax,Dx Mov Dx,Cx Mov Bx,100 Div Bx Xor Mov Div Mov Mov Xor Mov Div Mov Mov Mov Mul Mov Div Xor Mov Mov Mov Int Mov Mov Mov Mov Lea Int Lea Int Code_Seg End Inicio Dx,Dx Bx,655 Bx Hora,Ax Ax,Dx Dx,Dx Bx,11 Bx Minutos,Ax Ax,Dx Bl,100 Bl Bl,18 Bl Ah,Ah Segundos,Ax Ah,35h Al,08h 21h Old_Int,Bx Old_Int[2],Es Ah,25h Al,08h Dx,New_Int 21h Dx,Inicializa 27h Ends
Proc Endp
Near
Imp_Decimal Proc ... Imp_Decimal Endp Imp_Digito ... Imp_Digito Imp_Car ... Imp_Car Proc Endp Proc Endp
Near
Near
Near
23
- 23 -
New_Int
Proc Near Push Ax,Bx,Cx,Dx Push Si,Di,Es,Ds,Bp PushF Call OldInt8 Cli Sub Sp,2 Cmp Contador,18 Jb Fim_Int8 Mov Contador,0 Mov Ax,Hora Mov Num,Ax Call Imp_Decimal Mov Call Mov Mov Call Mov Call Mov Mov Call Al,':' Imp_Car Ax, Minutos Num,Ax Imp_Decimal Al,':' Imp_Car Ax, Segundos Num,Ax Imp_Decimal
Inc Segundos Cmp Segundos,60 Jb Fim_Int8 Mov Segundos,0 Inc Minutos Cmp Minutos,60 Jb Fim_Int8 Mov Minutos,0 Inc Hora Cmp Hora,24 Jb Fim_Int8 Mov Hora,0 Fim_Int8: Inc Contador PopF Pop Bp,Ds,Es,Di,Si Pop Dx,Cx,Bx,Ax Mov Ender,144 Sti
24
- 24 -
Imp_Decimal Proc Near Push Ax,Bx,Cx,Dx Mov Ax,Num Mov Bx,10 Xor Cx,Cx Nao_Zero: Xor Dx,Dx Div Bx Push Dx Inc Cx Or Ax,Ax Jne Nao_Zero Cmp Cx,1 Ja Imp_Dig_Loop Push Ax Mov Al,'0' Call Imp_Car Pop Ax Imp_Dig_Loop: Pop Dx Call Imp_Digito Loop Imp_Dig_Loop Fim_Decimal: Pop Dx,Cx,Bx,Ax Ret Imp_Decimal Endp
Imp_Digito Proc Near Push Ax,Dx Mov Ax,Dx Cmp Al,10 Jae Letra_Hexa Add Al,'0' Jmp Short Imp_Dig Letra_Hexa: Add Al,'A'-10 Imp_Dig: Call Imp_Car Pop Dx,Ax Ret Imp_Digito Endp Imp_Car Proc Near Push Di, Es Cld Mov Ah,1Fh Mov Di,0B800h Mov Es,Di Mov Di,Ender Stosw Add Ender,2 Pop Es, Di Ret Imp_Car Endp
25
- 25 -
Observaes: O parmetro Ender o endereo de incio do pargrafo para o segmento. Ele pode ser qualquer expresso vlida, mas no deve conter referncias futuras. Esta clusula geralmente usada como uma ponte para dados ou cdigos que esto em uma localizao absoluta na memria, como a rea de dados do ROM BIOS, o vetor de interrupes ou a memria de vdeo. Em conjunto com ORG podemos fazer referncias a posies na memria com segmento + deslocamento.
Shift Status: B Funo i t Insert Ligado 7 Caps Lock Ligado 6 Num Lock Ligado 5 Scroll Lock Ligado 4 Tecla Alt pressionada 3 Tecla Ctrl pressionada 2 Shift Esquerdo pressionado 1 Shift Direito pressionado 0 26 - 26 -
Extended Shift Status: B Funo i t Tecla Insert pressionada 7 Tecla Caps Lock pressionada 6
5 4 3 2 1 0
Tecla Num Lock pressionada Tecla Scroll Lock pressionada Pause ligado Tecla SysReq pressionada Alt esquerdo pressionado Ctrl direito pressionado
27
- 27 -
O Endereo F000:FFF0
Este endereo contm uma instruo FAR JUMP para o incio do Power-on Self Test (POST). A razo pela qual este endereo usado para este propsito que, quando a famlia de micro-processadores 8086 recebe energia, o registrador CS setado para FFFFh e o registrador IP para 0, que exatamente o mesmo endereo que F000:FFF0h. Se voc deseja rebootar o sistema (quente ou frio), execute um FAR JUMP para este endereo. Isto forar o POST a tomar o controle, o que ir causar um boot na mquina. O POST olha a Word no endereo 0:0472h para determinar se um boot quente ou frio deve ser executado. Se o valor em 0:472h for 1234h, ento um boot quente executado, seno um boot frio ser executado.
Numoff.asm
Shift_Area SEGMENT AT 0000h ORG 0417h Shift_Status Db ? Shift_Area ENDS Code_Seg Segment Assume CS:Code_Seg, Ds:Shift_Area Org 100h INICIO: Mov Ax, Shift_Area Mov Ds, Ax And Shift_Status, 0DFh Int 20h Code_Seg ENDS END INICIO
Boot.asm
BOOT_AREA TESTE TESTE BOOT_AREA SEGMENT AT 0F000h ORG 0FFF0h PROC FAR ENDP ENDS
CODE_SEG SEGMENT ASSUME CS:CODE_SEG ORG 100h INICIO: CALL TESTE CODE_SEG ENDS END INICIO
28
- 28 -
ACESSO
ARQUIVOS:
Entrada: Ah 3Dh Al Modo de abertura Ds:Dx Ponteiro para o nome do arquivo (string terminada por zero) Retorna: AX File handle ou cdigo do erro se houver erro CF 1 se houver erro, seno 0 Cdigos de erro: 1 Function number invalid 2 File not found 3 Path not found 4 No handle available 5 Access denied 12 Open mode invalid Modos de abertura: Bit 7 Flag de hierarquia Bits 4 5 6 Modo de compartilhamento Bit 3 Reservado (sempre 0) Bits 0 1 2 Modo de acesso Observao: Inicia o File Pointer com zero. Modos de acesso: Bits 2 1 0: 0 0 0 Read-only 0 0 1 Write-only 0 1 0 Read/write
Entrada: Ah 3Eh Bx File handle Retorna: Ax cdigo do erro se houver erro CF 1 se houver erro, seno 0 Cdigos de erro: 6 Invalid handle
29
- 29 -
Entrada: Ah 3Fh Cx Nmero de bytes a serem lidos Ds:Dx Ponteiro para o buffer
Bx
File handle
Retorna: Ax Nmero de bytes efetivamente lidos ou cdigo do erro se houver erro CF 1 se houver erro, seno 0 Cdigos de erro: 5 Acesso negado 6 Invalid handle
Observaes: Os bytes so lidos a partir do File Pointer, que ao final incrementado com o total de bytes lidos. O fim de arquivo pode ser detectado se o nmero de bytes lidos for inferior ao solicitado e no tiver ocorrido nenhum erro.
Entrada: Ah 42h Bx File handle Cx:Dx Deslocamento em bytes (inteiro de 32 bits com sinal) Al Cdigo da origem do deslocamento (mode code) Retorna: Ax Cdigo do erro se houver erro CF 1 se houver erro, seno 0 Dx:Ax Nova posio do File Pointer a partir da origem, se no houver erro. Cdigos da origem do deslocamento: 0 Incio do arquivo 1 Atual posio do File Pointer Cdigos de erro: 1 Invalid mode code 2 Fim do arquivo
Invalid handle
Observaes: Independente da origem do deslocamento, um deslocamento positivo ir aumentar a posio do File Pointer e um negativo ir diminu-lo. Este servio pode ser usado para descobrir o tamanho de um arquivo, assim como para aumentar o seu tamanho ou diminu-lo (com bytes zero). permitido mover o File Pointer para posies fora do arquivo (neste caso a leitura e a escrita iro falhar).
30
- 30 -
Entrada: Ah 40h Bx File handle Cx Nmero de bytes a serem escritos Ds:Dx Ponteiro para o buffer contendo os bytes a serem escritos Retorna: Ax Nmero de bytes efetivamente escritos ou cdigo do erro se houver erro CF 1 se houver erro, seno 0 Cdigos de erro: 5 Acesso negado 6 Invalid handle
Observaes: Os bytes so escritos a partir do File Pointer, que ao final incrementado com o total de bytes escritos. Um arquivo pode ser truncado posicionando o File Pointer no ponto de fim desejado, movendo 0 para Cx e chamando este servio.
Observaes:
Para criar um novo arquivo o servio o 3Ch. Erros estendidos podem ser conseguidos atravs do servio 59h do DOS.
31
- 31 -
Video.asm
Code_Seg Segment Assume Cs:Code_Seg, DS:Data_Seg Main Proc Mov Mov Mov Mov Lea Call JC Mov Push Call Mov Mov Cld Loop_Video:Call Loop Call Call Lea Call JC Call Call Fim: Mov Push Call Mov Mov Int Main Endp Near Ax, Data_Seg Ds, Ax Ax, 0A000h Es, Ax Dx,FileName OpenFile Fim Ax, 13h Ax SetVideoMode Cx, 200 DI, 0 ShowLine Loop_Video CloseFile EsperaTecla Dx,Pallete OpenFile Fim SetPallete EsperaTecla Ax,3 Ax SetVideoMode Ah,4Ch Al,00 21h
CloseFile ShowLine
ShowLine
Endp Proc Push Push Push Mov Lea Call Lea Rep Pop Pop Pop Ret Endp
;DS:DX Aponta para nome arquivo OpenFile Proc Near Push Ax Push Dx Mov Ah,3Dh Mov Al,0 Int 21h Mov Handle,Ax Pop Dx Pop Ax Ret OpenFile Endp CloseFile Proc Push Push Mov Mov Int Pop Pop Ret Near Ax Bx Ah, 3Eh Bx, Handle 21h Bx Ax
SetPallete Proc Near Push Ax, Bx, Cx, Dx, Es Mov CX,768 Lea Dx,BufPal Call ReadFromFile Mov Ah,10h Mov Al,12h Mov Bx,0 Mov Cx,256 Lea Dx,BufPal Push Ds Pop Es Int 10h Pop Es, Dx, Cx, Bx, Ax Ret SetPallete Endp ;------------------------------; CX No de Bytes a serem lidos ; DS:DX Ponteiro para o Buffer ;------------------------------ReadFromFile Proc Near Push Ax Push Bx Mov Ah,3Fh Mov Bx,Handle Int 21h Pop Bx Pop Ax Ret ReadFromFile Endp Code_Seg Ends Data_Seg FileName Pallete BufPal Handle Buffer Data_Seg Stack_Seg db Stack_Seg Segment Db 'VGA.VGA',0 db 'CORES.COR',0 db 768 dup(?) Dw ? Db 320 Dup(?) Ends Segment Stack 200 Dup(?) Ends
32
- 32 -
End Main
33
- 33 -
MOUSE:
INT 33h, 0000h (Reset Mouse)
Inicializa Mouse.
Entrada: Ax 0000h Retorna: Ax FFFFh se houver mouse disponvel, seno 0000h. Bx nmero de botes suportado pelo driver se houver mouse disponvel. Observaes: O cursor do mouse default uma seta em modo grfico ou um block em modo texto. No suficiente para o mouse aparecer. Reinicializa posio do mouse e retira as restries de movimentao.
1h
(Show
cursor.
o contador de visibilidade do Decrementa o contador de visibilidade do cursor. Entrada: Ax 0002h Retorna: Nada
Observaes: O cursor do mouse no aparece sempre que o contador tem um valor negativo e sempre aparece para valores maiores e igual a zero (o contador comea com -1). Ao se desenhar deve-se esconder o mouse de modo a no danificar o desenho quando o mouse se mexer.
correntes do Mouse.
Entrada: Ax 0003h Retorna: Bx Estado dos botes (0 = solto) Bit 0: Boto esquerdo Bit 1: Boto direito Bit 2: Boto do meio Observao: Cx Dx Coordenada X atual Coordenada Y atual
14/06/99
34
As coordenadas de mouse no so as de tela, no caso de modo texto deve-se dividir o valor de ambas as coordenadas por 8, no caso de modo grfico com 320 colunas devese dividir a coordenada X por 2.
Entrada: Retorna:
Ax Cx Nada
0004h Coordenada X
a movimentao do mouse Restringe a movimentao do mouse horizontalmente. verticalmente. Entrada: Entrada: Ax 0007h Ax 0008h Cx Coordenada X mnima. Cx Coordenada Y mnima. Dx Coordenada X mxima. Dx Coordenada Y mxima. Retorna: Nada Retorna: Nada Observao: Caso o mouse no esteja dentro da rea restrita a sua posio no alterada imediatamente, s no prximo redesenho.
Entrada: Ax 0009h Es:Dx Ponteiro para buffer contendo a mscara do mouse seguida do seu bitmap. Bx Coordenada X do foco do cursor. Cx Coordenada Y do foco do cursor. Retorna: Nada Observaes: O cursor um bitmap de 16 por 16 pixels, por isso tanto sua mscara como o seu bitmap tem tamanho de 32 bytes (um bit para cada pixel). A matriz de bits do bitmap define um cursor cujos pixels so brancos se o bit correspondente for 1 e preto se o bit correspondente for 0. A mscara define a transparncia dos pixels. Quando um bit na mscara 0, o pixel correspondente no cursor do mouse ser opaco, ou seja, o pixel que estiver na tela por baixo do mouse no aparecer. Quando um bit na mscara 1, o pixel correspondente no cursor do mouse ser "transparente", na verdade, o pixel que estiver na tela por baixo do mouse far um OR com o pixel do mouse (podendo aparecer com uma cor diferente da real). O novo cursor s aparece no prximo redesenho do mouse. Para efetuar a troca imediata deve-se desaparecer e reaparecer com o mouse. 14/06/99 35
Observaes:
As coordenadas de mouse no so as de tela (vide observao do Poll Mouse Status) Existem vrios outros servios de mouse como: Mouse Press Info (05h); Mouse Release Info (06h); Set Mouse Text Cursor (0Ah); Set Mouse Sensitivity (0Fh) e Set Mouse Event Handler (0Ch).
14/06/99
36
Mouse.asm
Code_Seg Segment Assume CS:Code_Seg,DS:Data_Seg Mouse Proc Near Mov Ax, Data_Seg Mov DS, Ax Mov Ax, 13h Push Ax Call SetVideoMode Call DesenhaAreaDesenho Mov cx,4 criaBotoes: Call CriaBotao Loop criaBotoes Call InicializaMouse Call ControlaBotoes Mov Ax, 0003h Push Ax Call SetVideoMode Mov Ah, 4Ch Int 21h Mouse EndP DesenhaAreaDesenho Proc Near Push Ax Mov Ax,AreaDesenho Inc Ax Mov X1,Ax Mov X2,Ax Mov Y1,0 Mov Y2,199 Mov Cor,15 Call Line Pop Ax Ret DesenhaAreaDesenho Endp InicializaMouse Proc Near Push Ax,Cx,Dx Mov Ax,0 Int 33h Mov Cx,255+319 Mov Dx,(5+53)/2 Mov Ax,4 Int 33h Call MostraMouse Pop Dx,Cx,Ax Ret InicializaMouse Endp
14/06/99
37
ControlaBotoes Proc Near Push Ax, Bx, Cx, Dx pegaDadosMouse2: Call WaitLeftButtonPress Call VerificaBotao Jnc pegaDadosMouse2 Call WaitLeftButtonRelease Cmp Ax,0 Jne botao1 Call PegaCor Jmp pegaDadosMouse2 botao1: Cmp Ax,1 Jne botao2 Call PintaComMouse Jmp pegaDadosMouse2 botao2: Cmp Ax,2 Jne botao3 Call DesenhaRetangulo Jmp pegaDadosMouse2 botao3: Cmp Ax,3 PegaCor Proc Near Push Ax,Bx,Cx,Dx,Di,Es Call DesenhaPaleta Mov Ax,07h Mov Cx,256*2 Mov Dx,319*2 Int 33h Mov Ax,08h Mov Cx,130 Mov Dx,199 Int 33h Mov Ax,4 Mov Cx,(256+319) Mov Dx,(130+199)/2 Int 33h Call WaitLeftButtonPress Call SomeMouse Mov Di,Dx Mov Ax,Cx Call VideoOffset
Jne pegaDadosMouse2 Pop Dx, Cx, Bx, Ax Ret ControlaBotoes Endp CriaBotao Proc Near ;Cria e desenha um botao nao permitindo ; que sejam criados mais de 12 botoes. CriaBotao Endp VerificaBotao Proc Near ;Recebe em Cx/Dx coluna/linha do mouse ;Retorna em CF=0 se nao esta sobre ; algum botao, senao CF=1 e Ax = botao VerificaBotao Endp WaitLeftButtonPress pegaDadosMouse: Proc Near Push Ax Mov Ax, 3 Int 33h And Bx,1 Jz pegaDadosMouse Shr Cx,1 Pop Ax Ret Endp Near Ax,Bx,Cx,Dx Ax, 3 33h Bx,1 esperaRelease Dx,Cx,Bx,Ax
WaitLeftButtonPress
WaitLeftButtonRelease Proc Push Mov esperaRelease: Int And Jnz Pop Ret WaitLeftButtonRelease Endp Xor Mov Mov Mov
Call WaitLeftButtonRelease Call InicializaMouse Call ApagaPaleta Pop Es,Di,Dx,Cx,Bx,Ax Ret PegaCor Endp DesenhaPaleta Proc Near Push Cx, Bx Call SomeMouse Mov Y1,130 Mov Y2,132 Mov Bx,0 Mov Cor,0 proximaLinha: Cmp Bx,16 Jae fimPaleta Mov X1,256 Mov X2,258
14/06/99
38
Mov Cx,16 proximaCor: Call PintaRetanguloCheio Inc Cor Add X1,4 Add X2,4 Loop proximaCor Add Y1,4 Add Y2,4 Inc Bx Jmp proximaLinha fimPaleta: Call MostraMouse Pop Bx, Cx Ret DesenhaPaleta Endp
ApagaPaleta Proc Near Mov Cor,0 Mov Y1,130 Mov Y2,199 Mov X1,256 Mov X2,319 Call PintaRetanguloCheio Ret ApagaPaleta Endp MostraMouse Proc Push Mov Int Pop Ret MostraMouse Endp SomeMouse Proc Push Mov Int Pop Ret SomeMouse Endp Near Ax Ax,1 33h Ax
PintaComMouse Proc Near Push Ax,Bx,Cx,Dx,Es,Di Mov Di,0 Call VaiParaAreaDesenho Call SomeMouse Push Ds Pop Es Mov Ax,9 Lea Dx,mask1 Mov Bx,8 Mov Cx,8 int 33h Call MostraMouse pegaDadosMouse1: Mov Ax, 3 int 33h Shr Cx,1 botaoEsq: And Bx,1 Jnz pintaPixel Or Di,0 Jz pegaDadosMouse1 Jmp fim pintaPixel: Push Dx Push Cx Or Di,0 Jnz pintaSemMouse Call SomeMouse Mov Di,1 pintaSemMouse:Push corCorrente Call PutPixel Jmp pegaDadosMouse1 fim: Call InicializaMouse Pop Di,Es,Dx,Cx,Bx,Ax Ret PintaComMouse Endp
14/06/99
39
14/06/99
40
NDICE ALFABTICO:
A
Alternate Select.........................6 AT26
B
Boot.asm..................................28
C
CGA...........................................4 Clock.asm................................23 Close a File Handle.....29, 34, 35
R
Read System-Timer Time Counter...............................20 REP............................................7
D
DD...........................................21 DWORD..................................21
S
Set Interrupt Vector.................22 Set Video Mode.........................4 Shift Status...............................26 STOSB.......................................7 STOSW......................................7 System Timer...........................19
E
Extended Shift Status..............26
F
FillScr.asm.................................8
T
Tabela de Modos de Vdeo........5
G
Get Current Video Mode...........5 Get Interrupt Vector................22 Graf.asm..................................13
V
VGA...........................................9 Video.asm................................32
I
INT............................................... INT 08h..............................19 INT 10h, 00h........................4 INT 10h, 0Fh........................5 INT 10h, 1010h....................9 INT 10h, 1012h..................10 INT 10h, 1015h..................10 INT 10h, 1017h..................10 INT 10h, 12h........................6 INT 1Ah, 00h.....................20 INT 20h..............................26 INT 21h, 25h......................22 INT 21h, 35h......................22 INT 21h, 3Dh.........29, 34, 35 INT 21h, 3Eh..........29, 34, 35 INT 21h, 3Fh......................30 INT 21h, 40h......................31 INT 21h, 42h......................30 INT 27h..............................22 Interrupes.............................18 IRET........................................21
W
Write to File ............................31 Modo 13h..................................9 Read from File .......................30 Terminate and Stay Resident..22 Terminate Program.................26
M
MDA..........................................3 Move File Pointer....................30 MOVSB...................................16 MOVSW..................................16
N
Numoff.asm.............................28
O
Open a File..................29, 34, 35 ORG.........................................21
P
POPF........................................21 POST.......................................28
14/06/99
41
14/06/99
42