回 帖 发 新 帖 刷新版面

主题:写测试视频存储区

下面程序是一个测试的程序,
1:设置显示模式为12H ,图形下640*480象素,16色
2:将11111111B写入 显示存储区的第2个字节, 地址为A000:0002
3: 将视频存储区的前600个字节写入ES段(ES段作为视频区的映像或暂存,调试中只申请了600字节的变量)
4:显示视频存储区(或映像区)的前20个字节,以2进制打印于屏幕上
5:按任意键退出程序

主要是为了观察存储区的变化,这里有个很麻烦的事情,就是在DEBUGE 调试里,很麻烦,
所以费了九牛二虎之力,才把这第一个位面的一些数据显示了出来

这里主要观察不到显示存储区的变化可能有几个原因不知道对不对
1:如果用DEBUG 调试, 它可能调用了BIOS的字符显示例程,肯定刷掉了你写进去的象素值
2:即使你不用DEBUG调试,你打算直接把数据从A000:0000的地方一个一个取出来,在打印出来
   仍然调用了BIOS的显示例程,我试了,视频区仍然都是00

所以采用了刚刚写完象素就映像到备份的映像区里就是ES段里的存储区,然后对其进行显示操作
最后终于把第一个位面的前20个字节打印了出来,和实际写上去的象素内容一至。


在这种模式下一屏幕象素需要占用640*480*4个位  大概需要150K字节

A000段有64K,其中第一个位面存储了640*480=38400个字节,也就是所有屏幕上象素的第一个值
那么第二个位面的首地址是那里?第三个?第四个?



DATA    SEGMENT                         ;data segment include test buffer and the croodinate in graphics mode

TEST_BUF DB 100 DUP (0)
CROOD   DB      0,0                     ;store char displayed coordinates
DATA    ENDS

EXTRA   SEGMENT                         ;ES  is video buffer's reflex
REFLEX  DB      600 DUP(0)
EXTRA   ENDS

CODE    SEGMENT
    ASSUME  CS:CODE,DS:DATA,ES:EXTRA
MAIN    PROC    FAR
      
     
START:
    MOV     AX,DATA       
    MOV     DS,AX
    MOV     AX,EXTRA
    MOV     ES,AX
    MOV     AL,12H                     ;set 12H video mode
    CALL    SEL_MOD                    ; call BIOS 

    CALL    DRAW_RED                   ;draw some red pixel to first line
    CALL    STR_MEM                    ; save the values from video buffer
    



    MOV     AX,ES          ; AX= seg address which will be displayed
    MOV     BX,0000H           ; BX= offset address which will be displayed
    MOV     CX,20              ; BYTE number
    CALL    DIS_VGA_ADRS       ;to display 20 BYTE by video buffer's reflex on screen

    
    MOV     AH,1           ;unusing
    INT     21H

    MOV     AH,2
    INT     21H

    MOV     AH,1
    INT     21H

    MOV     AH,4CH
    INT     21H
MAIN    ENDP


;*********************************************************
;to select video model
;on entry:
;        AL= display mode number 

SEL_MOD PROC    NEAR
    PUSH    AX
    MOV     AH,0
    INT     10H     ;call BIOS
    POP     AX
    RET
SEL_MOD ENDP

;*********************************************



;_________________________________

;draw some red point on the first line of the screen
;
DRAW_RED PROC   NEAR
    PUSH    ES
    PUSH    AX
    PUSH    SI
    MOV     AX,0A000H
    MOV     ES,AX
    MOV     SI,2
    MOV     AL,11111111B
    MOV     ES:[SI],AL

    POP     SI
    POP     AX
    POP     ES
    RET
DRAW_RED ENDP
;___________________________________


;***************************************
;stroe the pixels in the video buffer's reflex
;mov the value bewteen A000:0000 and A000:FFFF to ES segment's memory
;
;***********************************
STR_MEM PROC    NEAR
    PUSH    DS
    PUSH    ES
    PUSH    AX
    PUSH    SI
    PUSH    DI
    PUSH    CX
    
    MOV     AX,0A000H     ;send 600 BYTES in video buffer to ES seg
    MOV     DS,AX
    MOV     AX,EXTRA
    MOV     ES,AX
    MOV     SI,0
    MOV     DI,0
    MOV     CX,600

    REP     MOVSB

    POP     CX
    POP     DI
    POP     SI
    POP     AX
    POP     ES
    POP     DS
    RET
STR_MEM ENDP

回复列表 (共2个回复)

沙发

DIS_1   PROC    NEAR
    PUSH    AX
    PUSH    BX
    PUSH    CX
    MOV     AH,9            ;function number
    MOV     BL,100B         ;color number
    MOV     BH,0            ;page number
    MOV     CX,1            ;char number
    MOV     AL,31H          ;char type
    INT     10H             ;call BIOS
    CALL    SET_CROOD        ;set the coordinates to next
    POP     CX
    POP     BX
    POP     AX
    RET
DIS_1   ENDP
;__________________


;___________________
DIS_0   PROC    NEAR            ;same to DIS_1
    PUSH    AX
    PUSH    BX
    PUSH    CX
    MOV     CX,1
    MOV     BL,100B
    MOV     BH,0
    MOV     AH,9
    MOV     AL,30H
    INT     10H
    CALL    SET_CROOD
    POP     CX
    POP     BX
    POP     AX
    RET
DIS_0   ENDP
;____________________


;___________________
DIS_SPACE PROC  NEAR            ;SAME TO DIS_1
    PUSH    AX
    PUSH    BX
    PUSH    CX
    MOV     CX,1
    MOV     BH,0
    MOV     AH,9
    MOV     AL,20H
    INT     10H
    CALL    SET_CROOD
    POP     CX
    POP     BX
    POP     AX
    RET
DIS_SPACE ENDP
;_________________


板凳

; to display address into VGA
; on entry:
;        ax=VGA buffer's reflex seg address 
;        bx=VGA buffer's reflex reg address 
;        cx=BYTE number
;_________________________________
DIS_VGA_ADRS PROC  NEAR
    PUSH    AX      ;save reg
    PUSH    BX
    PUSH    CX
    PUSH    DX
    PUSH    SI
      

    MOV     ES,AX   ;send EXTRA to ES
    MOV     SI,BX   ;send 0000H to SI
BEGIN1:
    MOV     DL,ES:[SI]      ;mov value of video buffer to DL
    CALL    DISP_BYT        ; display bit of value on screen
    INC     SI              ; next
    LOOP    BEGIN1          ; displaying times is store in CX
     
    POP     SI
    POP     DX
    POP     CX
    POP     BX
    POP     AX
    RET
DIS_VGA_ADRS ENDP  
    

;**************************************************************
;purpose: to display a BYTE with Binary on screen
;on entry:
;        DL= the byte will be displayed


;______________________________
DISP_BYT PROC   NEAR
    PUSH    CX

    MOV     CX,9    ; 8 bit +1
BEGIN2: DEC     CX
    JZ      EXIT    ; to exit if over
    ROL     DL,1    ; rotate left DL once
    JC      CAL_1   ; to display a bit
    JNC     CAL_0

CAL_1:  CALL    DIS_1
    JMP     BEGIN2

CAL_0:  CALL    DIS_0
    JMP     BEGIN2

EXIT:   CALL    DIS_SPACE       ;to display a space ASCII if a byte displaying is over
    POP     CX
    RET
DISP_BYT ENDP

;***********************************
; mov croodinate to next one,
; mov croodinate to next line if A line has 72 ASCIIs.
; CROOD BUFFER has the row croodinate and column croodinate
; DH= ROW
; DL= COLUMN
; sotre the coordinate in CROOD buffer before return

SET_CROOD PROC  NEAR
    
    PUSH    DX
    PUSH    AX
    PUSH    BX

    MOV     DH,CROOD     ; first: send coordinate to DX
    MOV     DL,CROOD+1
    INC    DL
    CMP     DL,72        ; second: compara whether the row coordinate is above the 72 
    JZ      ADD1
    JMP     STO_CROOD

ADD1:   INC     DH              
    MOV     DL,0

STO_CROOD: MOV  CROOD+1,DL      ;storeing the coordinate is used to use next 
    MOV     CROOD,DH

    MOV     BH,0            ;set current coordinate
    MOV     AH,2
    INT     10H
    POP     BX
    POP     AX
    POP     DX
    RET

SET_CROOD ENDP
CODE    ENDS
    END     START

我来回复

您尚未登录,请登录后再回复。点此登录或注册