home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
magazine
/
pcmagazi
/
assemblr
/
03
/
prswap.asm
< prev
next >
Wrap
Assembly Source File
|
1986-02-05
|
5KB
|
122 lines
; Program to swap IBM PC text graphics
; characters for something more printable.
;
VECTORS segment at 0h ; Interrupt Vector Area
org 17h*4 ; IBM PC Printer is Int 17H
PR_INT_VECTOR label dword ; Double Word Offset:Segment pointer
VECTORS ends ; to Int 17H
;
CODE_SEG segment para public 'code'
assume ds:CODE_SEG, cs:CODE_SEG, es:CODE_SEG, ss:NOTHING
org 100h ; COM program format
;
BEGIN: jmp SWAP_VECTORS ; Initialize vectors and
; attach PRSWAP to DOS
ROM_PR_INT dd 0 ; Double word to save address of
; ROM-BIOS printer interrupt
;
; Swap table to translate (XLAT) characters to be printed
;
SWAP_TABLE db '&' ; Char 176 Graphic Fill
db '%' ; Char 177 Graphic Fill
db '@' ; Char 178 Graphic Fill
db 4 dup ('|') ; Char 179-182 Vertical
db 2 dup ('*') ; Char 183-184 Corner
db 2 dup ('|') ; Char 185-186 Vertical
db 6 dup ('*') ; Char 187-192 Corner
db 2 dup ('-') ; Char 193-194 Horizontal
db '|' ; Char 195 Vertical
db '-' ; Char 196 Horizontal
db '+' ; Char 197 Intersection
db 2 dup ('|') ; Char 198-199 Vertical
db 2 dup ('*') ; Char 200-201 Corner
db 2 dup ('-') ; Char 202-203 Horizontal
db '|' ; Char 204 Vertical
db '-' ; Char 205 Horizontal
db '+' ; Char 206 Intersection
db 4 dup ('-') ; Char 207-210 Horizontal
db 4 dup ('*') ; Char 211-214 Corner
db 2 dup ('+') ; Char 215-216 Intersection
db 2 dup ('*') ; Char 217-218 Corner
db '#' ; Char 219 Graphic Fill
db '.' ; Char 220 Graphic Fill
db '{' ; Char 221 Graphic Fill
db '}' ; Char 222 Graphic Fill
db '^' ; Char 223 Graphic Fill
;
; Miscellaneous equates
;
PRINT_CHAR equ 0 ; Int 17H print char function number
LOWEST_CHAR equ 176 ; Lowest graphic char in table
HIGHEST_CHAR equ 223 ; Highest graphic char in table
LOZENGE equ 254 ; Lozenge character position
;
PRSWAP proc near ; Work begins here
push cx ; Save CX on stack
xor cx,cx ; Clear CX so flag works
push ds ; Save caller's DS on stack
push cs ; Push CS, then pop it as DS
pop ds ; to establish addressability
; of PRSWAP's data
cmp ah,PRINT_CHAR ; Is call for printing a char?
ja CALL_INT_17H ; No, go to normal interrupt 17H
cmp al,LOWEST_CHAR ; Is char to print below table range?
jb CALL_INT_17H ; Yes, go to normal interrupt 17H
cmp al,HIGHEST_CHAR ; Is char to print above table range
ja CHECK_LOZENGE ; Yes, check for lozenge char
mov cl,al ; Save char in AL register in CL
push bx ; Save BX on stack
mov bx,offset SWAP_TABLE ; Point to translate table with BX
sub al,LOWEST_CHAR ; Adjust AL for bias into table
xlat ; Translate to PRSWAP's character
pop bx ; Restore BX
jmp CALL_INT_17H ; Go call interrupt 17H
CHECK_LOZENGE: ; Check for char 254
cmp al,LOZENGE ; Is char to print the lozenge?
jne CALL_INT_17H ; No, go to normal interrupt 17H
mov cl,al ; Save char in AL register in CL
mov al,'=' ; Make it a '='
CALL_INT_17H: ; Go call Int 17H as subroutine
pushf ; Push flags for fake interrupt 17H
call ROM_PR_INT ; Call interrupt 17H as subroutine
cmp cl,0 ; Check to see if PRSWAP did anything
je RETURN ; If not, just return
mov al,cl ; Restore original char to AL
RETURN: ; Return to caller
pop ds ; Restore caller's DS register
pop cx ; Restore caller's CX register
iret ; Interrupt return to caller
PRSWAP endp ; That's all for resident routine
;
INITIAL_DATA: ; Messages for initialization code
;
COPYRIGHT db 'PRSWAP (C) 1985, Dickinson Associates Inc.',13,10,'$'
FINISH_MSG db 13,10,'Resident Portion of PRSWAP Loaded',13,10,10,'$'
;
SWAP_VECTORS: ; Initialization Code
assume ds:CODE_SEG ; Address into this segment
mov dx,offset COPYRIGHT ; Set up to print copyright notice
mov ah,9h ; Request DOS to display string
int 21h ; Call DOS
push ds ; Save this segment
assume ds:VECTORS ; Address into VECTORS segment
mov ax,VECTORS ; Establish DS as VECTORS
mov ds,ax
cli ; Disable interrupts
mov ax,word ptr PR_INT_VECTOR ; Store addresses
mov word ptr es:ROM_PR_INT,ax ; of BIOS Int 17H program
mov ax,word ptr PR_INT_VECTOR[2]
mov word ptr es:ROM_PR_INT[2],ax
mov word ptr PR_INT_VECTOR, offset PRSWAP ; Substitute PRSWAP
mov word ptr PR_INT_VECTOR[2],cs ; and this segment
sti ; Enable interrupts
pop ds ; Re-establish this segment
assume ds:CODE_SEG ; as DS
mov dx,offset FINISH_MSG ; Set up to display finish message
mov ah,9h ; Request DOS to display string
int 21h ; Call DOS
mov dx,offset INITIAL_DATA ; End of PRSWAP program
int 27h ; Terminate, stay resident
CODE_SEG ends ; End of Segment
end BEGIN ; End of Everything