📄 display.$
字号:
! CNTRL-v is an terminal escape character for some control characters.
ft_ld:
PUSH AX ! save registers
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
MOV BP, SP
PUSH fontl ! Push font file name
MOV BX, tm_hd
LEA AX, TM_FONTPATH(BX) ! Push font directory
PUSH AX
PUSH _ffn ! Set the string buffer
PUSH buf
PUSH _SPRINTF ! format string system call
SYS ! buf contains pathname of file
ADD SP, 10
PUSH O_RDONLY ! open font file
PUSH buf ! PUSH path name pointer
PUSH _OPEN
SYS
ADD SP, 6
MOV (fd), AX ! check for open error
CMP (fd), 0
JGE 0f
PUSH buf
CALL op_err
ADD SP, 2
0:
PUSH FT_HD_SZ ! read font header
PUSH ft_hd
PUSH (fd)
PUSH _READ
SYS
ADD SP, 8
CMP AX, FT_HD_SZ ! check for read error
JE 1f
PUSH err4
PUSH _PRINTF
SYS
ADD SP, 4
CALL ex_err
1:
MOV BX, ft_hd ! check size of font cache
CMP FT_SIZE(BX), FT_CH_SZ
JLE 2f
PUSH err5
PUSH _PRINTF
SYS
ADD SP, 4
CALL ex_err
2:
PUSH FT_SIZE(BX) ! read font data
PUSH ft_ch
PUSH (fd)
PUSH _READ
SYS
ADD SP, 8
CMP AX, FT_SIZE(BX) ! check for read error
JE 3f
PUSH err6
PUSH _PRINTF
SYS
ADD SP, 4
CALL ex_err
3:
PUSH (fd) ! close font file
PUSH _CLOSE
SYS
ADD SP, 6
MOV SP, BP
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
!
! some small functions
!
op_err: ! Open error routine
PUSH BP
MOV BP, SP
PUSH 4(BP)
PUSH err1
PUSH _PRINTF
SYS
ADD SP, 6
CALL ex_err
MOV SP, BP
POP BP
RET
ex_err: ! exit in case of an error
PUSH 1
PUSH _EXIT
SYS
ex_ok: ! exit in case of success
PUSH 0
PUSH _EXIT
SYS
! global initialized data
.SECT .DATA
fontl: .ASCIZ "n" ! font name normal font (times roman)
tm_cf: .ASCIZ "sys\\term.cf" ! pathname terminal header
! for terminal with characters fonts up to 8x14 bits. The window size is
! 36x16 characters.
! alternative term9.cf : 9x16 bits, 32x14 characters
! alternative term7.cf : 7x13 bits, 40x17 characters
err1: .ASCIZ "Cannot open %s\n"
err2: .ASCIZ "Error reading terminal configuration data\n"
err3: .ASCIZ "Screen cache not big enough\n"
err4: .ASCIZ "Error reading font header\n"
err5: .ASCIZ "Font cache not big enough\n"
err6: .ASCIZ "Error reading font data\n"
err7: .ASCIZ "Error reading standard input\n"
! some global and often used local variables
.SECT .BSS
.ALIGN 2
fd: .SPACE 2 ! file descriptor variable
tmbytw: .SPACE 2 ! width of terminal in bytes
buf: .SPACE 128 ! general purpose string buffer
tm_ch: .SPACE TM_CH_SZ ! reserve space for termina bitmap
tm_hd: .SPACE TM_HD_SZ ! reserve space for terminal record
ft_hd: .SPACE FT_HD_SZ ! reserve space for font table header
ft_ch: .SPACE FT_CH_SZ ! reserve space for font table
_eod: .SPACE 2 ! dummy variable end of data
.SECT .DATA
pstringa: .ASCII "%!PS-Adobe-2.0 EPSF-2.0\n%%Title: exercise.ps\n"
.ASCII "%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley\n"
.ASCII "%%BoundingBox: 32 182 581 611\n%%Pages: 1\n%%EndComments\n"
.ASCII "%%EndProlog\n%%Page: 1 1\n/origstate save def\n20 dict begin\n"
.ASCII "/grays 288 string def \n/npixls 0 def\n"
.ASCIZ "/rgbindx 0 def\n37 187 translate\n538.56000 418.89600 scale\n"
pstringb: .ASCII "\n\n\nshowpage\n% stop using temporary dictionary\nend\n\n"
.ASCIZ "% restore original state\norigstate restore\n\n%%Trailer\n"
pstringc: .ASCII "/pix %d string def\n%d %d 1\n[%d 0 0 -%d 0 %d]\n"
pstringd: .ASCIZ "{currentfile pix readhexstring pop }\nimage\n"
pstringe: .ASCIZ "%02x"
pstringf: .ASCIZ "\n"
pstringg: .ASCIZ "charmap`.eps"
pstringh: .ASCIZ "Cannot open postscript file %s\n"
pstringi: .ASCIZ "charmap`.pbm"
.ALIGN 2
.SECT .TEXT
posout:
INCB (pstringg+7)
PUSH 0644
PUSH pstringg
PUSH _CREAT
SYS
ADD SP,6
CMP AX,0
JL 9F
MOV (fd),AX
PUSH pstringa
PUSH AX
CALL stringpr
ADD SP,4
MOV AX,TM_WID(BX)
MOVB CL,3
SAR AX,CL
MOV (tmbytw),AX
PUSH TM_HT(BX)
PUSH TM_HT(BX)
PUSH TM_WID(BX)
PUSH TM_HT(BX)
PUSH TM_WID(BX)
PUSH AX
PUSH pstringc
PUSH buf
PUSH _SPRINTF
SYS
ADD SP,18
PUSH buf
PUSH (fd)
CALL stringpr
ADD SP,4
MOV SI,tm_ch
MOV CX,TM_HT(BX)
6: PUSH CX
MOV CX,(tmbytw)
MOV DI,buf
7: LODSB
PUSH AX
PUSH pstringe
PUSH DI
PUSH _SPRINTF
SYS
ADD SP,8
ADD DI,2
LOOP 7b
MOV (DI),'\n'
MOV AX,(tmbytw)
SHL AX,1
INC AX
PUSH AX
PUSH buf
PUSH (fd)
PUSH _WRITE
SYS
ADD SP,8
POP CX
LOOP 6b
PUSH pstringb
PUSH (fd)
CALL stringpr
PUSH _CLOSE
SYS
ADD SP,6
RET
geterr:
PUSH err7
PUSH _PRINTF
SYS
CALL ex_err
crerror:
9: PUSH pstringg
PUSH pstringh
PUSH _PRINTF
SYS
CALL ex_err
stringpr:
PUSH CX
PUSH DI
PUSH BP
MOV BP,SP
MOV AX,0
MOV DI,10(BP)
MOV SI,DI
MOV CX,-1
REPNZ SCASB
NOT CX
DEC CX
PUSH CX
PUSH 10(BP)
PUSH 8(BP)
PUSH _WRITE
SYS
MOV SP,BP
POP BP
POP DI
POP CX
RET
_FAKEWIN = 64 ! extra routine to open window
_FWINOUT = 65 ! and to write onto window
_ENKLBIT = 1 ! small window display per bit
_DBBLBIT = 2 ! large window, square per bit
! The prevous subroutines create
! two x window bitmap files:
! lEEGbITmAP and tERMbITmAP
! next we get a routine to initialise an output window. It is made with an
! unorthodox type of extra library routine. Its parameters are width and height
! of the terminal bit map.
! Do not worry about this routine at all.
.SECT .DATA
faker: .WORD 0
.SECT .TEXT
startfak:
INC (faker)
PUSH _DBBLBIT ! Bit size two bits per bit in display
PUSH TM_HT(BX) ! Stack height of bitmap in bits
PUSH TM_WID(BX) ! Stack width of bitmap in bits
PUSH _FAKEWIN ! stack library call number
SYS ! and ask for the routine
ADD SP,8 ! clean up stack.
RET
! Hope that the window system is smart enough to open up the window now.
tclout:
PUSH AX ! save registers on stack
PUSH BX
PUSH BP
MOV BP, SP
MOV BX, tm_hd ! BX indicates start of terminal record
CMP (faker),0
JG 8f
CALL startfak
8: PUSH tm_ch ! Start adress of bitmap
MOV BX, tm_hd ! BX indicates start of terminal record
PUSH TM_HT(BX) ! Stack height of bitmap in bits
PUSH TM_WID(BX) ! Stack width of bitmap in bits
PUSH _FWINOUT ! stack library call number
SYS ! and ask for the routine
ADD SP, 8 ! clean up stack.
MOV SP, BP
POP BP ! restore registers
POP BX
POP AX
RET
! Hope that the window system is smart enough to write onto the window now.
! end of file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -