PUSH SI PUSH DX MOV AL,IndexOfWord INC AL CMP AL,COUNT JNZ GetNextLeft GetFistLeft: MOV DX,OUTSET MOV AL,32 MUL IndexOfWord ADD DX,AX MOV AX,SI SUB AX,DX MOV SI,OUTSET ADD SI,AX MOV BH,[SI] MOV BL,[SI+1] ;TEST PUSH DX MOV DL,' ' MOV AH,2H INT 21H POPDX MOV AX,BX CALL SendWord JMP EndGetLeftWord GetNextLeft: MOV BH,[SI+32];下一个字的对应行 MOV BL,[SI+33] EndGetLeftWord: POP DX POP SI POP AX RET
;----------------------------------------------------------------------MoveStepLeft-------------------------------------------------------------------- MoveStepLeft:
;1:根据IndexOfWord2以及MoveStep2确定SI。 ;2:MoveStep决定一个位的位移
;3:当Stop为0时,每“刷完一次屏',MoveStep要移动++;否则不移动; ;4:当MoveStep==16时,IndexOfWord2++
26
;5:当IndexOfWord2==COUNT时,IndexOfWord2归零@:因为”索引是从0开始的嘛“。 ;当刷完一次屏之后,MoveStep2要变化。 ;(1)当已经按下暂停建的时候,则不前移动; ;(2)当移动超过==16的时候 PUSH AX CLI MOV AL,01H TEST StopFlag,AL JNZ EndStep;如果等于1,则MoveSteip不前移动 INC MoveStep MOV AL,16 CMP MoveStep,AL JNZ EndStep;如果EndMoveStep!=16跳过4; MOV MoveStep,00H INC IndexOfWord MOV AL,COUNT CMP IndexOfWord,AL JNZ EndStep;如果IndexOfStep2!=COUNT,则跳过5 MOV IndexOfWord,00H EndStep: MOV AL,62H ;发中断结束命令 MOV DX,0A0H
OUT DX,AL ;向从片8259发EOI命令 OUT 020H,AL ;向主片8259发EOI命令 STI ;开中断 POP AX IRET RET
;-------------------------------------------------------------------ShowUpWard---------------------------------------------------------
;1:用到变量:IndexOfLine
;@:(1)用来指示当前刷屏从第几行开始。(2)范围是0~count*16-1。(3)当超过的时候,应该使其等于00(4)用来对SI初始化 ;
;2:SI:
;@:SI动态变化(显示十六行数据过程中),当超过的count*16-1这个地方所对应的地址的时候,使其“重新指向开头”。 ;
ShowUpWard: PUSH SI PUSH DX
27
PUSH CX PUSH BX PUSH AX MOV SI,OUTSET MOV AX,2 MUL IndexOfLine ADD SI,AX MOV CX,16 ;来一个信号刷一次屏
AnotherLine: MOV AH,[SI] MOV AL,[SI+1] ADD SI,2;(1)换行
;(2)如果换行以后>=range=32*count行对应的指针,令其从新指向开头,并继续++进行行扫 PUSH AX;定义一个临时变量 MOV AX,0 MOV AL,32 MUL COUNT MOV BX,OUTSET ADD BX,AX CMP BX,SI JNZ Continue;如果等于range,则reset ;Reset MOV SI,OUTSET Continue: POP AX ;Test CALL Enter
;(1)移位输出了16位数据--以AX传送数据 CALL SendWord
;2)释放锁存,先0后1.采用置位、复位控制字 MOV AL,00001010B MOV DX,303H ;call delay OUT DX,AL MOV AL,00001011B OUT DX,AL
28
;(3)行选--需要测试选中那一行 MOV AL,CL; SHL AL,1 DEC AL;???? MOV DX,302H OUT DX,AL DEC CX;用于实现16行数据的输出 JNZ AnotherLine
POP AX POP BX POP CX POP DX POP SI
;JMP NOTEND RET
;-------------------------------------------------------------------MoveStepUp---------------------------------------------
MoveStepUp: PUSH AX ;test PUSH DX CLI INC Times MOV AH,2 MOV DL,Times ADD DL,30H INT 21H MOV AH,2 MOV DX,IndexOfLine ADD DL,30H INT 21H CMP StopFlag,1 JZ ContinueMoveUp ADD IndexOfLine,1;(1)换行
29
;(2)如果换行以后>=range=32*count行对应的指针,令其从新指向开头,并继续++进行行扫 MOV AX,16 MUL COUNT CMP AX,IndexOfLine JNZ ContinueMoveUp ;Reset MOV IndexOfLine,00H ContinueMoveUp: MOV AL,62H ;发中断结束命令 MOV DX,0A0H
OUT DX,AL ;向从片8259发EOI命令 OUT 020H,AL ;向主片8259发EOI命令 STI ;开中断 POP DX POP AX IRET
;JMP NOTEND RET
;---------------------------------------------------------------------辅助---------------------------------------------- INI8253: ;对8253C1和C2进行初始化 PUSH DX PUSH AX MOV DX,307H ;初始化8253,307H为8253控制端口地址 MOV AL,01110110B ;计数器1,方式3 OUT DX,AL ;将初始控制字输出到控制端口 MOV DX,305H ;计数器1 MOV AX,900 ;先读低8位, OUT DX,AL MOV AL,AH ;再读高8位 OUT DX,AL MOV DX,307H ;再给8253写控制字 MOV AL,10110110B ;计数器2,方式3 OUT DX,AL MOV DX,306H ;计数器2 MOV AX,900 ;先读低8位, OUT DX,AL MOV AL,AH ;再读高8位 OUT DX,AL
30
函数