;============================================================================= ; Vesa_05.asm ; Show the first 20 values of the video mode's info buffer ; Algorithm ; V1: Get the buffer ; V2: Read element ; V3: Show element. If no more elements then exit ; ;(C)I don't take any responsibility for the use of this program ; Zedr0n -- connection closed ;============================================================================= ;============================================================================= ; .Com declaration ;============================================================================= .MODEL TINY ;============================================================================= ; Data definition/declaration ;============================================================================= .DATA ;----------------------------------------------------------------------------- ; Equals ;----------------------------------------------------------------------------- MODE EQU 100H ;----------------------------------------------------------------------------- ; Constants ;----------------------------------------------------------------------------- SIZES DB 2,1,1,2,2,2,2,4,2,2,2,1,1,1,1,1,1,1,1,1 CRLF DB 0DH,0AH,'$' ;----------------------------------------------------------------------------- ; File variables ;----------------------------------------------------------------------------- ELEMENT_CON DD ? BUFFER DB 256 DUP(?) ;----------------------------------------------------------------------------- ; Stack variables ;----------------------------------------------------------------------------- .CODE .386 ORG 100H ;============================================================================= ; Code segment ;============================================================================= START: ; V1: MOV AX,4F01H ; MOV CX,MODE MOV DI,OFFSET BUFFER ; INT 10H ; CMP AX,4FH ; JNZ V3 XOR BX,BX V2: ; PUSH BX CALL READ_ELEMENT PUSH BX CALL SHOW_ELEMENT MOV AH,09H ; MOV DX,OFFSET CRLF ; INT 21H INC BX ; CMP BX,20 ; JNZ V2 V3: RET ;============================================================================== ; Procedures ;============================================================================== ;------------------------------------------------------------------------------ ; READ_ELEMENT ; Read the specified element into buffer ; Algorithm ; R1: Save the registers ; R2: Is it first element? If not, initialize counters ; R3: Get the full offset of element ; R4: Get the size of the element ; R5: Copy element ;------------------------------------------------------------------------------ READ_ELEMENT PROC ; ELEMENT EQU [BP+4] R1: ; PUSH BP MOV BP,SP PUSHA ; R2: CMP ELEMENT,0 ; JZ R4 XOR BX,BX ; XOR CX,CX ; R3: ADD CL,SIZES[BX] ; INC BX CMP BX,ELEMENT ; JL R3 MOV BX,CX R4: PUSH BX MOV BX,ELEMENT MOVZX SI,SIZES[BX] POP BX XOR DI,DI ; R5: MOV AH,BUFFER[BX][DI] MOV BYTE PTR ELEMENT_CON[DI],AH INC DI ; CMP DI,SI ; JNZ R5 POPA ; POP BP RET 2 READ_ELEMENT ENDP ;----------------------------------------------------------------------------- ; SHOW_ELEMENT ; This program shows the element with the index in stack ; Algorithm ; S1: Save registers ; S2: Get the size of current element ; S3: Load the byte ; S4: Get digit ; S5: Test if non-decimal digit. If not => S6. Convert non-decimal digit ; to char ; S6: Display digits ; S7: Check if it is last digit! If not => S4. Convert non-decimal digit ; to char ; S8: Display digit ; S9: Test if last byte! If not => S3 ;----------------------------------------------------------------------------- SHOW_ELEMENT PROC ; EL_NUM EQU [BP+4] S1: PUSH BP ; MOV BP,SP ; PUSHA ; S2: ; MOV BX,EL_NUM MOVZX SI,SIZES[BX] S3: MOV BX,OFFSET ELEMENT_CON MOV AH,BYTE PTR [BX][SI-1] S4: MOVZX AX,AH MOV BH,10H DIV BH ; MOV DL,AL ; PUSH AX S5: CMP DL,10 ; JL S6 ; ADD DL,7 S6: ADD DL,30H MOV AH,02H INT 21H S7: POP AX ; CMP AH,10H JGE S4 ; CMP AH,10 ; JL S8 ; ADD AH, 7 S8: MOV DL,AH MOV AH,02H ADD DL,30H INT 21H S9: DEC SI ; JNZ S3 POPA ; POP BP RET 2 SHOW_ELEMENT ENDP END START ;