eject ; ;The routines in this file are supposed to be included ; in main programs. Any equates or db needed for ; the following routines will be maintained in this ; file ; DSEG $ register db ' $' ;for printing of a register ; vector rs 16 ;for ASCII bit vector db '$' ; cursor_position db esc,'= $' ;for positioning cursor ; ten dw 10 ;for conversion routine ; ;--------EQUATES------------ load_drive_at equ .50h ;in base page, location of load drive print_string equ 9 ret_current_disk equ 25 esc equ 1bh con_out equ 2 list_out equ 5 eject CSEG $ ; ;ASCII_DECIMAL_TO_HEX ; si input buffer ; di result location ; cx # of input characters ; ascii_decimal_to_hex: mov bx,1 add si,cx dec si std ;si will be decremented in following loop clc dec_loop: xor ax,ax lodsb ;get character sub al,30h ;make into number cmp al,9 ;make sure it's a number jg conversion_error mul bx ;power of ten * value of char add [di],ax ;add to result location mov ax,bx mul ten ;next power of ten mov bx,ax loop dec_loop dec_@1: cld jc conversion_error_1 ;if carry set then number was too big ret conversion_error: cld conversion_error_1: stc ret ;------------------------------- ;FIND_LOAD_DRIVE ; input none ; output al=drive where program was loaded (0-15) ; find_load_drive: mov al,load_drive_at dec al cmp al,0ffh jne not_default mov cl,ret_current_disk call bdos not_default: ret eject ;------------------------------ ;HEX_TO_ASCII_DECIMAL ; input ax=binary number ; cx=# of decimal digits ; di=offset of message area hex_to_dec: dec di ! add di,cx ;di now points to last digit mov bx,10 hex_loop: sub dx,dx div bx add dl,'0' mov [di],dl! dec di loop hex_loop ret ;------------------------------- ;HEX_TO_ASCII_HEX ; input al=hex number ; output dx=ASCII of al ; hex_to_ascii_hex: push ax xor dx,dx hex1: xor ah,ah mov cl,4 shl ax,cl cmp ah,0ah jge hex2 add ah,30h jmp hex3 hex2: add ah,37h hex3: or dx,dx jnz hex4 mov dh,ah jmp hex1 hex4: mov dl,ah pop cx ret ;--------------------------- ;PRINT_REGISTER , at current cursor position ; input ax=register ; bx=0 if word , 2 if byte ; print_reg_w: xor bx,bx jmp print_register printf_reg_b: mov bx,2 print_register: push bx mov di,offset register ! call hex_word mov dx,offset register pop bx ! add dx,bx mov cl,print_string jmp bdos ; ;-------------------------------- ;PRINT_VECTOR , ASCII vector at current cursor position ; input AX = word for vector ; print_vector: mov di,offset vector ! call make_vector mov dx,offset vector ! mov cl,print_string jmp bdos ; ;------------------------------------ ;PUT_MESSAGE ;Put message pointed to by SI at specified position ;input message form: row,col,'message.....$' ;output none ; put_message: lodsw ! push si ;get row & col in AX call place pop dx mov cl,print_string call bdos ret ; ;---------------------------------- ;PLACE ;Place cursor at position in AX ;input ah=col al=row ;output none ; place: add ax,2020H ;row/col are based on one, need to be zero based, also need 20h offset mov word ptr cursor_position+2,ax mov dx,offset cursor_position mov cl,print_string ! call bdos ret ; ;-------------------- ;HEX_WORD ;input AX=word ; ES:DI= offset of string space ; hex_word: mov cx,4 hex_wor_loop: push cx ! push ax and ax,0f000h mov cl,4 ! shr ax,cl cmp ah,0ah jge hexw2 add ah,30h ! jmp hexw3 hexw2: add ah,37h hexw3: mov [di],ah ! inc di pop ax ! shl ax,cl pop cx loop hex_wor_loop ret hex_byte: mov cx,2 xchg ah,al jmp hex_wor_loop ;-------------------------- ;MAKE_VECTOR ;Make ASCII vector from word in AX ;input AX = word vector ; ES:DI = offset of destination ;output none ; make_vector: mov cx,16 ! mov bl,30h vector_loop: clc ! rcl ax,1 ! push ax pushf ! xor al,al ! popf adc al,bl stosb ! pop ax loop vector_loop ret ; ;------------------------------------ ;Put number of fields in CX,starting at offset in AX ;input AX = offset into fields_table ; CX = number of entries ; SI = offset of fields_table ; put_fields: shl ax,1 ! add si,ax pf_loop: push cx lodsw ! push si mov si,ax call put_message pop si ! pop cx loop pf_loop ret ; ;-------------------------------------- ;PRINT_BCD_REGISTER ;Print BCD register ;input AX = register ; BX = 0 for word, 2 for byte ; print_bcd_reg: mov cx,4 ! mov di,offset register bcd_loop: push cx ! push ax mov al,0f0h ! and al,ah mov cl,4 ! shr al,cl add al,30h ! stosb pop ax ! mov cl,4 ! shl ax,cl pop cx loop bcd_loop mov dx,offset register ! add dx,bx mov cl,print_string ! jmp bdos ;------------------------------------- ;P_MESSAGE print mesage ; p_message: mov cl,print_string jmp bdos ;------------------------------------- ;NEW_PR_LINE send new-line to printer ; new_pr_line: mov al,0dh call list_char mov al,0ah call list_char ret ; ;NEW_LINE send new-line to screen ; new_line: mov dl,0dh call con_char mov dl,0ah ; ;CON_CHAR send character to console ; con_char: mov cl,con_out jmp bdos ; ;LIST_CHAR send character to list device ; list_char: mov cl,list_out ; ;---------------------------------------------------------- ; bdos: int 224 ret end