Category : Assembly Language Source Code
Archive   : NORTASM.ZIP
Filename : DISP_SEC.ASM
;-----------------------------------------------------------------------;
; This file contains procedures for displaying sectors on the screen: ;
; ;
; INIT_SEC_DISP Reads a sector and redraws the screen ;
; WRITE_HEADER Writes the header on the screen ;
; WRITE_TOP_HEX_NUMBERS Writes numbers along the top of the box ;
; DISP_HALF_SECTOR Displays half of the sector ;
; DISP_LINE Displays one line of the sector ;
; WRITE_PROMPT_LINE Writes the prompt line to the screen ;
; WRITE_FUNCTION_KEYS Display the function-key line ;
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; Graphics characters for border of sector. ;
;-----------------------------------------------------------------------;
VERTICAL_BAR EQU 0BAh
HORIZONTAL_BAR EQU 0CDh
UPPER_LEFT EQU 0C9h
UPPER_RIGHT EQU 0BBh
LOWER_LEFT EQU 0C8h
LOWER_RIGHT EQU 0BCh
TOP_T_BAR EQU 0CBh
BOTTOM_T_BAR EQU 0CAh
TOP_TICK EQU 0D1h
BOTTOM_TICK EQU 0CFh
.DATA
TOP_LINE_PATTERN LABEL BYTE
DB ' ',7
DB UPPER_LEFT, 1
DB HORIZONTAL_BAR,12
DB TOP_TICK,1
DB HORIZONTAL_BAR,11
DB TOP_TICK,1
DB HORIZONTAL_BAR,11
DB TOP_TICK,1
DB HORIZONTAL_BAR,12
DB TOP_T_BAR,1
DB HORIZONTAL_BAR,18
DB UPPER_RIGHT,1
DB 0
BOTTOM_LINE_PATTERN LABEL BYTE
DB ' ',7
DB LOWER_LEFT, 1
DB HORIZONTAL_BAR,12
DB BOTTOM_TICK,1
DB HORIZONTAL_BAR,11
DB BOTTOM_TICK,1
DB HORIZONTAL_BAR,11
DB BOTTOM_TICK,1
DB HORIZONTAL_BAR,12
DB BOTTOM_T_BAR,1
DB HORIZONTAL_BAR,18
DB LOWER_RIGHT,1
DB 0
.DATA?
EXTRN SECTOR:BYTE
.CODE
PUBLIC INIT_SEC_DISP
EXTRN READ_SECTOR:PROC
EXTRN WRITE_PATTERN:PROC, SEND_CRLF:PROC
EXTRN GOTO_XY:PROC, WRITE_PHANTOM:PROC
.DATA
EXTRN LINES_BEFORE_SECTOR:BYTE
EXTRN SECTOR_OFFSET:WORD
.CODE
;-----------------------------------------------------------------------;
; This procedure initializes the half-sector display. ;
; ;
; Uses: WRITE_PATTERN, SEND_CRLF, DISP_HALF_SECTOR ;
; WRITE_TOP_HEX_NUMBERS, GOTO_XY, WRITE_PHANTOM ;
; Reads: TOP_LINE_PATTERN, BOTTOM_LINE_PATTERN ;
; LINES_BEFORE_SECTOR ;
; Writes: SECTOR_OFFSET ;
;-----------------------------------------------------------------------;
INIT_SEC_DISP PROC
PUSH DX
CALL WRITE_HEADER ;Write the new header
CALL READ_SECTOR ;Read in the disk sector
XOR DL,DL ;Move cursor into position at start
MOV DH,LINES_BEFORE_SECTOR ; of the 3rd lines
CALL GOTO_XY ;Move the cursor
CALL WRITE_TOP_HEX_NUMBERS ;Write line of numbers along the top
LEA DX,TOP_LINE_PATTERN ;Display the top line of the box
CALL WRITE_PATTERN
CALL SEND_CRLF ;Move to the next line
XOR DX,DX ;Start at the beginning of the sector
MOV SECTOR_OFFSET,DX ;Set sector offset to 0
CALL DISP_HALF_SECTOR ;Display the first half sector
LEA DX,BOTTOM_LINE_PATTERN ;Display the bottom of the box
CALL WRITE_PATTERN
CALL WRITE_PHANTOM ;Display the phantom cursor
POP DX
RET
INIT_SEC_DISP ENDP
PUBLIC WRITE_HEADER
.DATA
EXTRN HEADER_LINE_NO:BYTE
EXTRN HEADER_PART_1:BYTE
EXTRN HEADER_PART_2:BYTE
EXTRN DISK_DRIVE_NO:BYTE
EXTRN CURRENT_SECTOR_NO:WORD
EXTRN FILE_FLAG:BYTE
EXTRN FILE_HEADER:BYTE
EXTRN FILE_NAME:BYTE
.CODE
EXTRN GOTO_XY:PROC, CLEAR_TO_END_OF_LINE:PROC
EXTRN WRITE_DECIMAL:PROC
;-----------------------------------------------------------------------;
; This procedure writes the header with disk drive and sector number. ;
; ;
; Uses: GOTO_XY, WRITE_STRING, WRITE_CHAR, WRITE_DECIMAL ;
; CLEAR_TO_END_OF_LINE ;
; Reads: HEADER_LINE_NO, HEADER_PART_1, HEADER_PART_2 ;
; DISK_DRIVE_NO, CURRENT_SECTOR_NO, FILE_FLAG ;
; FILE_HEADER, FILE_NAME ;
;-----------------------------------------------------------------------;
WRITE_HEADER PROC
PUSH DX
XOR DL,DL ;Move cursor to header line number
MOV DH,HEADER_LINE_NO
CALL GOTO_XY
CMP FILE_FLAG,1 ;Are we in file mode?
JE WRITE_OFFSET ;Yes, then don't write drive number
LEA DX,HEADER_PART_1 ;Display "Disk "
CALL WRITE_STRING
MOV DL,DISK_DRIVE_NO ;Display the disk drive number
ADD DL,'A' ;Print drives A, B, ...
CALL WRITE_CHAR
WRITE_OFFSET:
LEA DX,HEADER_PART_2 ;Display " Sector "
CALL WRITE_STRING
MOV DX,CURRENT_SECTOR_NO ;Display the sector number
CALL WRITE_DECIMAL
CMP FILE_FLAG,1 ;Are we in file mode?
JNE DONT_WRITE_FILE_HEADER ;No, then don't write the file header
LEA DX,FILE_HEADER ;Yes, display the file header
CALL WRITE_STRING
LEA DX,FILE_NAME ;Write the name of the file
CALL WRITE_STRING
DONT_WRITE_FILE_HEADER:
CALL CLEAR_TO_END_OF_LINE ;Clear rest of sector number
POP DX
RET
WRITE_HEADER ENDP
EXTRN WRITE_CHAR_N_TIMES:PROC, WRITE_HEX:PROC, WRITE_CHAR:PROC
EXTRN WRITE_HEX_DIGIT:PROC, SEND_CRLF:PROC
;-----------------------------------------------------------------------;
; This procedure writes the index numbers (0 through F) at the top of ;
; the half-sector display. ;
; ;
; Uses: WRITE_CHAR_N_TIMES, WRITE_HEX, WRITE_CHAR ;
; WRITE_HEX_DIGIT, SEND_CRLF ;
;-----------------------------------------------------------------------;
WRITE_TOP_HEX_NUMBERS PROC
PUSH CX
PUSH DX
MOV DL,' ' ;Write 9 spaces for left side
MOV CX,9
CALL WRITE_CHAR_N_TIMES
XOR DH,DH ;Start with 0
HEX_NUMBER_LOOP:
MOV DL,DH
CALL WRITE_HEX ;Write a two-digit hex number
MOV DL,' '
CALL WRITE_CHAR ;Write a space between numbers
INC DH ;Increment the number
CMP DH,10h ;Have we written 16 numbers?
JB HEX_NUMBER_LOOP ;No, keep writing
MOV DL,' ' ;Write hex numbers over ASCII window
MOV CX,2
CALL WRITE_CHAR_N_TIMES
XOR DL,DL ;Start over at zero again
HEX_DIGIT_LOOP:
CALL WRITE_HEX_DIGIT ;Write a single-digit hex number
INC DL ;Increment the number
CMP DL,10h ;Have we written 16 numbers?
JB HEX_DIGIT_LOOP ;No, keep writing
CALL SEND_CRLF ;Move to the start of the next line
POP DX
POP CX
RET
WRITE_TOP_HEX_NUMBERS ENDP
PUBLIC DISP_HALF_SECTOR
EXTRN SEND_CRLF:PROC
;-----------------------------------------------------------------------;
; This procedure displays half a sector (256 bytes) ;
; ;
; On entry: DS:DX Offset into sector, in bytes -- should be ;
; multiple of 16. ;
; ;
; Uses: DISP_LINE, SEND_CRLF ;
;-----------------------------------------------------------------------;
DISP_HALF_SECTOR PROC
PUSH CX
PUSH DX
MOV CX,16 ;Display 16 lines
HALF_SECTOR:
CALL DISP_LINE ;Display a single line
CALL SEND_CRLF ;Move to the start of the next line
ADD DX,16 ;Increase our offset by 16 bytes
LOOP HALF_SECTOR ;Keep writing for 16 lines
POP DX
POP CX
RET
DISP_HALF_SECTOR ENDP
PUBLIC DISP_LINE
EXTRN WRITE_HEX:PROC
EXTRN WRITE_CHAR:PROC
EXTRN WRITE_CHAR_N_TIMES:PROC
;-----------------------------------------------------------------------;
; This procedure displays one line of data, or 16 bytes, first in hex, ;
; then in ASCII. ;
; ;
; On entry: DS:DX Offset into sector, in bytes. ;
; ;
; Uses: WRITE_CHAR, WRITE_HEX, WRITE_CHAR_N_TIMES ;
; Reads: SECTOR ;
;-----------------------------------------------------------------------;
DISP_LINE PROC
PUSH BX
PUSH CX
PUSH DX
MOV BX,DX ;Offset is more useful in BX
MOV DL,' '
MOV CX,3 ;Write 3 spaces before line
CALL WRITE_CHAR_N_TIMES
;Write offset in hex
CMP BX,100h ;Is the first digit a 1?
JB WRITE_ONE ;No, write space already in DL
MOV DL,'1' ;Yes, then place '1' into DL for output
WRITE_ONE:
CALL WRITE_CHAR ;Write either a space or a '1'
MOV DL,BL ;Copy lower byte into DL for hex output
CALL WRITE_HEX ;Display the lower byte of offset
MOV DL,' ' ;Write separator
CALL WRITE_CHAR
MOV DL,VERTICAL_BAR ;Draw left side of box
CALL WRITE_CHAR
MOV DL,' ' ;Indent by one space from border
CALL WRITE_CHAR
;Now write out 16 bytes
MOV CX,16 ;Dump 16 bytes
PUSH BX ;Save the offset for ASCII_LOOP
HEX_LOOP:
MOV DL,SECTOR[BX] ;Get one byte
CALL WRITE_HEX ;Dump this byte in hex
MOV DL,' ' ;Write a space between numbers
CALL WRITE_CHAR
INC BX ;Move to the next byte
LOOP HEX_LOOP ;Write 16 bytes of data
MOV DL,VERTICAL_BAR ;Write separator
CALL WRITE_CHAR
MOV DL,' ' ;Add another space before characters
CALL WRITE_CHAR
MOV CX,16 ;Now write 16 bytes of characters
POP BX ;Get back offset into SECTOR
ASCII_LOOP:
MOV DL,SECTOR[BX] ;Get one byte
CALL WRITE_CHAR ;Display this as a character
INC BX ;Move to the next byte
LOOP ASCII_LOOP ;Display a total of 16 characters
MOV DL,' ' ;Write a space before the box border
CALL WRITE_CHAR
MOV DL,VERTICAL_BAR ;Write the box border
CALL WRITE_CHAR
POP DX
POP CX
POP BX
RET
DISP_LINE ENDP
PUBLIC WRITE_PROMPT_LINE
EXTRN CLEAR_TO_END_OF_LINE:PROC, WRITE_STRING:PROC
EXTRN GOTO_XY:PROC
.DATA
EXTRN PROMPT_LINE_NO:BYTE
.CODE
;-----------------------------------------------------------------------;
; This procedure writes the prompt line to the screen and clears the ;
; end of the line. ;
; ;
; On entry: DS:DX Address of the prompt-line message ;
; ;
; Uses: WRITE_STRING, CLEAR_TO_END_OF_LINE, GOTO_XY ;
; Reads: PROMPT_LINE_NO ;
;-----------------------------------------------------------------------;
WRITE_PROMPT_LINE PROC
PUSH DX
XOR DL,DL ;Write the prompt line and
MOV DH,PROMPT_LINE_NO ; move the cursor there
CALL GOTO_XY
POP DX
CALL WRITE_STRING
CALL CLEAR_TO_END_OF_LINE
RET
WRITE_PROMPT_LINE ENDP
PUBLIC WRITE_EDITOR_PROMPT
.DATA
EXTRN EDITOR_PROMPT:BYTE
.CODE
;-----------------------------------------------------------------------;
; This procedure writes the editor prompt line. We've defined it as ;
; a procedure since we need to switch to the Edit prompt in so many ;
; places. ;
; ;
; Uses: WRITE_PROMPT_LINE ;
; Reads: EDITOR_PROMPT ;
;-----------------------------------------------------------------------;
WRITE_EDITOR_PROMPT PROC
PUSH DX
LEA DX,EDITOR_PROMPT
CALL WRITE_PROMPT_LINE
POP DX
RET
WRITE_EDITOR_PROMPT ENDP
PUBLIC WRITE_FUNCTION_KEYS
.DATA
EXTRN FUNCTION_KEY_LINE_NO:BYTE
EXTRN FUNCTION_KEY_LINE:BYTE
.CODE
EXTRN GOTO_XY:PROC, CURSOR_RIGHT:PROC
EXTRN WRITE_ATTRIBUTE_N_TIMES:PROC
;-----------------------------------------------------------------------;
; This procedure writes the function-key line in inverse video, with ;
; the key numbers in normal video. ;
; ;
; Uses: GOTO_XY, WRITE_STRING, WRITE_ATTRIBUTE_N_TIMES ;
; CURSOR_RIGHT ;
; Reads: FUNCTION_KEY_LINE ;
;-----------------------------------------------------------------------;
WRITE_FUNCTION_KEYS PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR DL,DL ;Start a left of screen
MOV DH,FUNCTION_KEY_LINE_NO ;And the bottom
CALL GOTO_XY
PUSH DX ;Save start of line
LEA DX,FUNCTION_KEY_LINE
CALL WRITE_STRING
POP DX ;Restore start of line
CALL GOTO_XY ;Return to the start of this line
MOV AX,9 ;Use as a counter
MOV DL,70H ;Attribute for inverse video
MOV CX,6 ;Write 6 characters in inverse
FUNCTION_KEY_LOOP:
CALL CURSOR_RIGHT ;Skip over the number
CALL WRITE_ATTRIBUTE_N_TIMES ;Write inverse video for 6 characters
CALL CURSOR_RIGHT ;Skip gap
DEC AX ;Done yet?
JNZ FUNCTION_KEY_LOOP ;No, invert another word
CALL CURSOR_RIGHT ;Skip the last gap
CALL WRITE_ATTRIBUTE_N_TIMES ;Invert the 10th word
POP DX
POP CX
POP BX
POP AX
RET
WRITE_FUNCTION_KEYS ENDP
END
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/