2000 ;;Various Screen routines ;;======================================================================= ;; SetScr sets the correct screen segment adress according to current ;; video mode. It needs a word variable 'scr_seg' in the main program, ;; which should initially be set to B800h. setscr MACRO LOCAL colour push ax push bx mov ah,0fh int 10h cmp al,03h je colour mov scr_seg,0b000h colour: pop bx pop ax ENDM ;;------------------------------------------------------------------------- getscr MACRO sbuf LOCAL getlp push ax push cx push es push ds push si push di mov ax,cs mov es,ax mov di,OFFSET sbuf mov ax,0B800h mov ds,ax mov si,0 mov cx,4000 getlp: movsb loop getlp pop di pop si pop ds pop es pop cx pop ax ENDM ;;------------------------------------------------------------------------- putscr MACRO sbuf LOCAL putlp push ax push cx push es push ds push si push di mov ax,0b800h mov es,ax mov di,0 mov ax,cs mov ds,ax mov si,OFFSET sbuf mov cx,4000 putlp: movsb loop putlp pop di pop si pop ds pop es pop cx pop ax ENDM ;;------------------------------------------------------------------------ cls MACRO push ax push bx mov ah,0fh int 10h mov ah,00h int 10h pop bx pop ax ENDM ;;------------------------------------------------------------------------ ;;TITLE CLS2.MAC cls2 MACRO LOCAL Go_On push ax push bx push cx push es mov es,scr_seg mov bx,0000h mov al,20h Go_On: mov es:[bx],al inc bx inc bx cmp bx,0ffeh jnz Go_On pop es pop cx pop bx pop ax ENDM ;;----------------------------------------------------------------------- hidecur MACRO push ax push cx mov ah,01H ;Hide cursor mov ch,00100110b mov cl,00000111b int 10H pop cx pop ax ENDM showcur MACRO push ax push cx mov ah,01H ;Hide cursor mov ch,00000110b mov cl,00000111b int 10H pop cx pop ax ENDM ;;------------------------------------------------------------------------- Goto_xy MACRO X,Y push ax push bx push cx push dx mov ah,0fh int 10h ;;Video_state h„mtas mov ah,03h ;;Cur_pos h„mtas int 10h mov dl,x ;;Col := X mov dh,y ;;Row := Y mov ah,02h int 10h pop dx pop cx pop bx pop ax ENDM ;;------------------------------------------------------------------------- tab MACRO tab push ax push bx push cx push dx mov ah,0fh int 10h ;;Video state h„mtas mov ah,03 ;;Curpos h„mtas int 10h mov dl,tab mov ah,02h int 10h pop dx pop cx pop bx pop ax ENDM ;;------------------------------------------------------------------------- space MACRO spc push ax push bx push cx push dx push dx mov ah,0fh int 10h ;;Video state h„mtas mov ah,03 ;;Curpos h„mtas int 10h add dl,spc mov ah,02h int 10h pop dx pop cx pop bx pop ax ENDM ;;------------------------------------------------------------------------ ver MACRO Ver push ax push bx push cx push dx mov ah,0fh int 10h ;;Video state h„mtas mov ah,03 ;;Curpos h„mtas int 10h add dh,Ver ;;Flytta ner Ver rader mov dl,0 ;;och kolumn 0 mov ah,02h int 10h pop dx pop cx pop bx pop ax ENDM ;;------------------------------------------------------------------------ cr_lf MACRO push ax push dx mov dl,0dh ;;CR mov ah,02h int 21h mov dl,0ah ;;LF mov ah,02h int 21h pop dx pop ax ENDM ;;------------------------------------------------------------------------- ;;TITLE Dir_Wr.MAC Writes string directly to screen memory ;;Uses DOS's cursor coordinates when writing out the string ;;================================================================== dir_wr MACRO String?,attr LOCAL Next,Over_String,Our_String,Oldcol,Oldrow push ax ;;Save registers push bx push cx push dx push es push si push di mov ax,scr_seg mov es,ax mov ah,03h ;;Fetch old cursor position mov bh,00h int 10h mov oldcol,dl mov oldrow,dh sub ax,ax mov al,dh mov dh,160 ;;Each row has 160 bytes... mul dh sal dl,1 ;;Take attribute bytes in account and dx,0ffh add ax,dx ;;Add x value mov di,ax mov si,OFFSET Our_String sub cx,cx Next: movsb ;;First the character... mov es:byte ptr[di],attr ;;then the attribute byte inc di inc cl cmp byte ptr[si],0 ;;Byte = 0 ? (End of string) jne Next ;;No, process next character mov dl,oldcol ;;Put cursor at new position add dl,cl mov dh,oldrow mov bh,0 mov ah,02h int 10h pop di pop si pop es pop dx pop cx pop bx pop ax jmp Over_string Our_String db String?,0 oldcol db 0 oldrow db 0 Over_string: ENDM ;;------------------------------------------------------------------------- ;;TITLE Dir_Wr2.MAC Writes string directly to screen memory ;;Does NOT use DOS's cursor coordinates when writing out the string ;;================================================================== dir_wr2 MACRO String?,X_Pos,Y_Pos,attr LOCAL Next,Over_String,Our_String push ax ;;Save registers push bx push cx push dx push es push si push di mov ax,scr_seg mov es,ax sub ax,ax mov al,Y_Pos mov dh,160 ;;Each row has 160 bytes... mul dh add ax,X_Pos*2 ;;Add x value mov di,ax mov si,OFFSET Our_String sub cx,cx Next: movsb ;;First the character... mov es:byte ptr[di],attr ;;then the attribute byte inc di inc cl cmp byte ptr[si],0 ;;Byte = 0 ? (End of string) jne Next ;;No, process next character pop di pop si pop es pop dx pop cx pop bx pop ax jmp Over_string O 2000 ur_String db String?,0 Over_string: ENDM ;;------------------------------------------------------------------------- ;;TITLE Dir_Ch.MAC Writes a character directly to screen memory ;;Uses DOS's cursor coordinates when writing out the character ;;========================================================================== dir_ch MACRO attr LOCAL Over_Data,Oldcol,Oldrow push ax ;;Save registers push bx push cx push es push di mov ax,scr_seg mov es,ax push dx ;;Save DX temporarily mov ah,03h ;;Fetch old cursor position mov bh,0 int 10h mov oldcol,dl mov oldrow,dh sub ax,ax mov al,dh mov dh,160 ;;Each row has 160 bytes... mul dh shl dl,1 and dx,0ffh add ax,dx ;;Take attribute bytes in account mov di,ax pop dx ;;Fetch DX again mov es:byte ptr[di],dl ;;First the character... mov es:byte ptr[di+1],attr ;;then the attribute byte mov dl,oldcol ;;Put cursor at new position add dl,1 mov dh,oldrow mov bh,0 mov ah,02h int 10h pop di pop es pop cx pop bx pop ax jmp Over_Data oldcol db 0 oldrow db 0 Over_Data: ENDM ;;----------------------------------------------------------------------- ;;TITLE Print.MAC ;;===== Str„ng f”r utskrift placeras direkt efter " Print'.....'" ;;===== Utskrift via INT 21h/09h Print MACRO String? LOCAL Over_String,Our_String push ax push dx mov ah,09h mov dx,OFFSET Our_String int 21h pop dx pop ax jmp Over_String Our_String db String?,'$' Over_String: ENDM ;;----------------------------------------------------------------------- ;;TITLE Wr_AscZ.MAC ;;===== Utg”r ett komplement till filen 'Print.MAC' ;;===== DI-registret skall peka p† den str„ng ;;===== som skall skrivas ut. ;;===== Str„ngen skall avslutas med '0' ;;===== I detta MACRO ing†r „ven ett Wr_AscZ MACRO String? LOCAL Next_Sign,End_String,Over_String,Our_String push ax push dx push di mov di,OFFSET Our_String mov ah,02h ;;F”r funktion INT 21h/02h Next_Sign: mov dl,[di] cmp dl,00h jz End_String int 21h inc di jmp Next_Sign End_String: pop di pop dx pop ax jmp Over_String Our_String db String? db 10,13,0 ;;Avsluta med Over_String: ENDM ;;----------------------------------------------------------------------- ;; Writes out contents of text buffer 'String' bufwr MACRO String push ax push dx mov ah,09h mov dx,OFFSET String int 21h pop dx pop ax ENDM ;;----------------------------------------------------------------------- wr_char MACRO char push ax push dx mov dl,char mov ah,02h int 21h pop dx pop ax ENDM ;;------------------------------------------------------------------------ ;;Print_A.MAC ;;===== Writes a string with attribute ;;========================================================================= Print_A MACRO String?,attr LOCAL Our_String,Over_String,str_len push ax push bx push cx push dx push bp mov ah,0fh ;;Get video state int 10h mov ah,03h ;;Get cursor position int 10h mov ah,13h mov al,01h mov bl,attr mov bp,OFFSET Our_String mov cx,OFFSET str_len-OFFSET Our_String int 10h jmp Over_String Our_String db String? str_len db 0 Over_String: pop bp pop dx pop cx pop bx pop ax ENDM ;;--------------------------------------------------------------------- ;;TITLE Wr_Word.MAC ;;Utskrift av ett Word. F”ruts„tter att aktuellt Word placeras i ;;DX-registret innan anropet. Inledande nollor skrives ut. Wr_Word MACRO LOCAL Next_Nibble, Next_Byte, Skriv, Ready push ax push cx push dx push di mov cl,08h ;First the Hi byte... ror dx,cl mov di,0002h ;DI = ByteR„knare Next_Byte: mov ch,02h ;CH = NibbleR„knare Next_Nibble: mov cl,04h ;F”rbered shift 4 ggr rol dl,cl ;Hi nibble <-> Lo nibble mov al,dl ;Konvertering H2A med Hi ;Nibble i 1:a varvet and al,0fh ;Maska bort h”ga delen daa ;add 6 om 'A'-'F' !!! add al,0f0h ;Carry=1 om 'A'-'F' adc al,40h ;Klart ASCII-v„rde Skriv: push dx ;Spara ordet tillf„lligt mov dl,al ;Skriv ut mov ah,02h int 21h pop dx ;H„mta ordet dec ch ;R„kna ner nibble-r„knaren cmp ch,00h ;B†da nibblarna bearbetade? jnz Next_Nibble ;Om inte forts„tt dec di cmp di,0000h je Ready mov cl,08h ror dx,cl ;Make Hi Byte -> Lo Byte jmp Next_Byte Ready: pop di pop dx pop cx pop ax ENDM ;;------------------------------------------------------------------------- ;;TITLE Wr_Wrd2.MAC ;;Utskrift av ett Word. F”ruts„tter att aktuellt Word placeras i ;;DX-registret innan anropet. Skriver INTE ut inledande nollor. Wr_Wrd2 MACRO LOCAL Next_Nibble, Next_Byte, Skriv, Skriv_ej, Ready push ax push bx push cx push dx push di mov cl,08h ;First the Hi byte... ror dx,cl xor bx,bx ;Flagga f”r inledande '0'-or mov di,0002h ;DI = ByteR„knare Next_Byte: mov ch,02h ;CH = NibbleR„knare Next_Nibble: mov cl,04h ;F”rbered shift 4 ggr rol dl,cl ;Hi nibble <-> Lo nibble mov al,dl ;Konvertering H2A med Hi ;Nibble i 1:a varvet and al,0fh ;Maska bort h”ga delen daa ;add 6 om 'A'-'F' !!! add al,0f0h ;Carry=1 om 'A'-'F' adc al,40h ;Klart ASCII-v„rde cmp al,030h ;Žr siffra '0'? jnz Skriv cmp bh,0 ;Žr tecken redan skrivet ? jz skriv_ej ;Nej, skriv inte ut tecknet Skriv: mov bh,1 ;S„tt 1:a tecknet skrivet - flagga push dx ;Spara ordet tillf„lligt mov dl,al ;Skriv ut mov ah,02h int 21h pop dx ;H„mta ordet Skriv_ej: dec ch ;R„kna ner nibble-r„knaren cmp ch,00h ;B†da nibblarna bearbetade? jnz Next_Nibble ;Om inte forts„tt 2000 dec di cmp di,0000h je Ready mov cl,08h ror dx,cl ;Make Hi Byte -> Lo Byte jmp Next_Byte Ready: cmp bh,00h ;Write out at least ONE Zero... jnz x_ready mov dl,'0' mov ah,02h int 21h x_ready: pop di pop dx pop cx pop bx pop ax ENDM ;;-------------------------------------------------------------------------- ;;TITLE Wr_Byte.MAC ;;Utskrift av en Byte. F”ruts„tter att aktuell Byte placeras i ;;DL-registret innan anropet. ;;========================================================================== Wr_Byte MACRO LOCAL Next_Nibble, Skriv push ax push cx push dx mov ch,02h ;CH = NibbleR„knare Next_Nibble: mov cl,04h ;F”rbered shift 4 ggr rol dl,cl ;Hi nibble <-> Lo nibble mov al,dl ;Konvertering H2A med Hi ;Nibble i 1:a varvet and al,0fh ;Maska bort h”ga delen daa ;add 6 om 'A'-'F' !!! add al,0f0h ;Carry=1 om 'A'-'F' adc al,40h ;Klart ASCII-v„rde Skriv: push dx ;Spara ordet tillf„lligt mov dl,al ;Skriv ut mov ah,02h int 21h pop dx ;H„mta ordet dec ch ;R„kna ner nibble-r„knaren cmp ch,00h ;B†da nibblarna bearbetade? jnz Next_Nibble ;Om inte forts„tt pop dx pop cx pop ax ENDM ;;------------------------------------------------------------------------- ;;TITLE Wr_ByteA.MAC ;;Utskrift av en Byte. Anv„nder nuvarande attribut. Cursorn flyttas. ;;F”ruts„tter att aktuell Byte placeras i DL-registret innan anropet. ;;========================================================================= Wr_ByteA MACRO LOCAL Next_Nibble, Skriv, Dpage push ax push bx push cx push dx mov ah,0fh ;Get video state int 10h mov Dpage,bh mov ch,02h ;CH = NibbleR„knare Next_Nibble: mov cl,04h ;F”rbered shift 4 ggr rol dl,cl ;Hi nibble <-> Lo nibble mov al,dl ;Konvertering H2A med Hi ;Nibble i 1:a varvet and al,0fh ;Maska bort h”ga delen daa ;add 6 om 'A'-'F' !!! add al,0f0h ;Carry=1 om 'A'-'F' adc al,40h ;Klart ASCII-v„rde Skriv: push cx push dx mov ah,0ah ;Write character, use current mov bh,Dpage ;attribute mov cx,1 int 10h mov ah,03h ;Get cursor position int 10h mov ah,02h inc dl ;Increment 'X' int 10h ;Set cursor position pop dx pop cx dec ch ;R„kna ner nibble-r„knaren cmp ch,00h ;B†da nibblarna bearbetade? jnz Next_Nibble ;Om inte forts„tt jmp Over_Page Dpage db ? Over_Page: pop dx pop cx pop bx pop ax ENDM ;;------------------------------------------------------------------------- ;;TITLE Byte2Scr.MAC ;; ;;===== Tv† decimala tal bin„rt lagrade i DL-registret ;;===== skrives direkt i bildminnet i koord X_pos,Y_pos ;;===== Inparametrar „r X_pos och Y_pos samt teckenattribut ;;===== Sk„rmtyp ber„knas av programmet ;;===== Om memory variables anv„nds som inparametrar skall dessa vara: ;;===== xpos DW, ypos DW, attr DB ;;===== -- -- -- Byte2Scr MACRO X_pos,Y_pos,Attr LOCAL Next push ax push bx push cx push di push es push bp push si mov si,dx ;;Spara talet i SI mov cx,scr_seg mov es,cx mov di,X_pos ;;Tiotalets position mov bp,X_pos ;<----- inc bp ;<----- ;;Ready-flag mov ax,si ;;Tal -> al and al,0f0h ;;Tiotalet mskas fram mov cl,04h ;;F”rbered shift 4 -> shr al,cl ;;Verkst„ll shift Next: add al,30h ;; -> ASCII mov ah,Attr ;;Attribut s„ttes push ax ;;Attr+tiotalet sparas ;------ Tecken-OFFSET ber„knas ---------------------------------- mov bx,di ;;Kolumn X shl bx,0001h ;;Multiplicera med 2 mov cx,Y_pos ;;Rad -> CX mov ax,160 ;;F”rbered f”r 'Tecken-OFFSET' ;;= 160 * Y_pos + 2 * X_pos mul cx ;; Mult AX med 160 add bx,ax ;;OFFSET-adress best„md ;------------------------------------------------------------------ pop ax ;;Tal h„mtas mov es:[bx],ax ;;Verkst„ll utskrift mov ax,si ;;Tal h„mtas and al,0fh ;;Ental maskas fram inc di ;;Plats f”r ental cmp di,bp jz next pop si pop bp pop es pop di pop cx pop bx pop ax ENDM ;;------------------------------------------------------------------------- ;;TITLE Chr2Scr.MAC Writes a character directly to screen memory ;;Does NOT use DOS's cursor coordinates when writing out the character ;;If memory variables is used as input parameters, these should be: ;; xpos DW, ypos DW, attr DB ;; -- -- -- ;;========================================================================== chr2scr MACRO X_Pos,Y_Pos,attr LOCAL Over_Data,Oldcol,Oldrow push ax ;;Save registers push bx push cx push es mov ax,scr_seg mov es,ax mov dh,Attr ;;Attribute push dx ;;Save character value temp. ;-------------------------------------------------------------------------- mov bx,X_pos ;;Kolumn X shl bx,0001h ;;Multiplicera med 2 mov cx,Y_pos ;;Rad -> CX mov ax,160 ;;F”rbered f”r 'Tecken-OFFSET' ;;= 160 * Y_pos + 2 * X_pos mul cx ;; Mult AX med 160 add bx,ax ;;OFFSET-adress best„md ;------------------------------------------------------------------------- pop dx ;;Fetch character again mov es:[bx],dx ;;Write character+attribute pop es pop cx pop bx pop ax ENDM ;--------------------------------------------------------------------------- ;;TITLE From_Buf.MAC ;;====== Rutinen h„mtar ASCII-tecken fr†n 'Buff' ;;====== till dess att tecknet „r 00. ;;====== Tecknen h„mtas fr†n dataareans topp och g†r ner†t. ;;====== Buffern skall b†de b”rja och sluta med 00. ;;====== Rutinen anv„ndes fr„mst tillsammans med Hex2Dec.MAC och Bin2Dec. 43d MAC ;;------------------------------------------------------------------------- From_Buf MACRO buff,Attr LOCAL Next_Adress,Next_Char,Klart,Slut push ax push dx push di mov di,OFFSET buff+1 ;;--------- H„r best„ms bufferns storlek ----------------------- Next_adress: mov dl,[di] ;;H„mta tecken cmp dl,00h ;;0? jz Klart inc di jmp Next_Adress Klart: dec di ;;----- H„r skrivs tecknen ut ---------------------------------- Next_char: mov dl,[di] ;;Tecken -> DL i ordn ;;MSB -> LSB cmp dl,00h ;;Testa om tecken = 00 jz Slut mov ah,02h int 21h dec di ;;Peka p† n„sta tecken jmp Next_Char Slut: pop di pop dx pop ax ENDM ;;--------------------------------------------------------------------------- . 0