www.pudn.com > tp60src.zip > BASM.ASM
include basm.inc extrn GetAsmSymbol:far extrn GetAsmLabel:far extrn EmitByte:far extrn EmitFixup:far extrn EmitJump:far extrn EmitFloat:far .code Basm_Text Argm Text,dword,1 Argm Len,word,1 Argm Options,word,1 Loc Dummy,word,1 Loc SaveSI,word,1 Loc SaveDI,word,1 Loc StackLimit,word,1 Loc Prefixes,byte,6 Loc TextPtr,dword,1 Loc SaveTextPtr,word,1 Loc Oper1TextPtr,word,1 Loc Oper2TextPtr,word,1 Loc Mode,byte,1 Loc DataLength,byte,1 Loc InOpcode,byte,1 Loc OperCount,byte,1 Loc OpcodePtr,word,1 Loc RegNum,word,1 Loc Oper2Size,word,1 Loc HashValue,byte,1 Loc Opcode,byte,1 Loc Pending,byte,1 Loc RMBits,byte,1 Loc FixupAddr,dword,1 Loc PureMemFlag,byte,1 Loc SizeBit,byte,1 Loc DirectionBit,byte,1 Loc DefPrefix,byte,1 Loc FixupOffs,word,1 Loc DwordFixup,byte,1 Loc Dummy2,byte,1 Loc Value,dword,1 Loc Symbol,byte,Loc IdentBuf,byte,34 Loc UpCaseIdent,byte,34 Loc StringBuf,byte,128 Loc CodeCount,word,1 Loc CodeBuffer,byte,<11*size TCodeBuffer> Loc TempAddr,dword,1 Loc Operand1,byte, Loc Operand2,byte, Loc Operand3,byte, Loc Limit,word,1 Entry Assemble call Init mov InOpcode,1 call GetToken mov ax,TextPtr.offs mov SaveTextPtr,ax call ProcessLabel call ProcessPrefix dec InOpcode call ProcessData jz @@2 mov al,';' call CheckToken jz @@1 call PutPrefixes jmp short @@2 @@1: mov al,tOPCODE call NeedToken call ProcessOperands call ProcessCommand @@2: call Flush xor ax,ax @Exit: mov cx,TextPtr.Offs lds bx,Text mov [bx],cx mov si,SaveSI mov di,SaveDI Exit Init proc near mov SaveSI,si mov SaveDI,di lea ax,Limit[-1000] mov StackLimit,ax les bx,Text les bx,es:[bx] mov TextPtr.Offs,bx mov TextPtr.Segm,es xor ax,ax mov SaveTextPtr,ax mov Symbol.sParent.Offs,ax mov Symbol.sParent.Segm,ax mov word ptr Prefixes[0],ax mov CodeCount,ax mov Pending,al ret Init endp Flush proc near lea si,CodeBuffer @@1: sub CodeCount,size TCodeBuffer jc @@7 cld push si xor ax,ax lodsb mov bx,ax lodsb mov cx,ax lodsw xchg ax,dx lodsw xchg ax,dx dec bx js @@2 jz @@3 dec bx jz @@4 push ax mov ax,cx and cl,0feh push cx and al,1 push ax call EmitFloat jmp short @@5 @@2: push ax call EmitByte jmp short @@5 @@3: push cx dword ptr [si] dx ax call EmitFixup jmp short @@5 @@4: push ax dword ptr [si] call EmitJump @@5: or ax,ax jz @@6 jmp Error @@6: pop si add si,size TCodeBuffer jmp @@1 @@7: mov CodeCount,0 ret Flush endp ProcessPrefix proc near @@1: cmp dh,tOPCODE jne @@3 mov bx,OpcodePtr cmp byte ptr cs:[bx],80h+cPrefix jne @@3 mov al,cs:[bx+2] mov cx,5 lea bx,Prefixes[-1] @@2: inc bx cmp byte ptr [bx],0 loopne @@2 mov ah,0 mov [bx],ax call GetToken jmp @@1 @@3: ret ProcessPrefix endp ProcessData proc near cmp dh,tOPCODE jne @@3 mov bx,OpcodePtr mov ax,cs:[bx] cmp al,80h+cDB jne @@3 mov DataLength,ah cmp word ptr Prefixes[0],0 je @@1 jmp SyntaxErr @@1: call GetToken @@2: lea si,Operand1 call Expression push dx call ProcessDataElem call Flush pop dx mov al,',' call CheckToken jnz @@2 mov al,';' call NeedToken xor ax,ax @@3: ret ProcessData endp ProcessDataElem proc near mov di,si mov ax,[si].aValue.W0 mov dx,[si].aValue.W2 mov cx,[si].aAddr.Offs or cx,[si].aAddr.Segm cmp DataLength,2 je @@5 ja @@7 or cx,cx jz @@1 jmp InvOperErr2 @@1: lea si,StringBuf cmp byte ptr [si],0 jne @@2 call ByteOperand jnz @@13 jmp short @@11 @@2: xor ax,ax cld lodsb xchg ax,cx jcxz @@4 @@3: cld lodsb push si cx call @@11 call Flush pop cx si loop @@3 @@4: ret @@5: cmp StringBuf[0],2 ja @@14 call WordOperand jcxz @@10 mov bx,fOffs*256+eFixup cmp [si].aHalf,bh jb @@6 mov bh,[si].aHalf @@6: xchg ax,cx mov ax,Operand1.aAddr.Offs mov TempAddr.Offs,ax mov ax,Operand1.aAddr.Segm mov TempAddr.Segm,ax jmp Put @@7: cmp StringBuf[0],4 ja @@14 jcxz @@8 xchg ax,cx mov bx,fPtr*256+eFixup cmp [si].aHalf,0 je @@12 mov bh,[si].aHalf mov ax,Operand1.aAddr.Offs mov TempAddr.Offs,ax mov ax,Operand1.aAddr.Segm mov TempAddr.Segm,ax call Put jmp short @@9 @@8: call @@10 @@9: xchg ax,dx @@10: call @@11 xchg al,ah @@11: mov bl,eByte mov cx,ax @@12: call Put ret @@13: jmp OutOfRangeErr @@14: jmp StringConstErr ProcessDataElem endp ProcessLabel proc near call FilterChar cmp al,':' jne @@1 lea bx,IdentBuf push ss bx call GetAsmLabel jnz Error call GetToken mov al,':' call NeedToken @@1: ret ProcessLabel endp ProcessOperands proc near mov OperCount,0 mov ax,SaveTextPtr mov Oper1TextPtr,ax mov al,';' call CheckToken jnz @@3 lea si,Operand1 call Expression inc OperCount mov al,';' call CheckToken jnz @@3 mov al,',' call NeedToken mov ax,SaveTextPtr mov Oper2TextPtr,ax lea si,Operand2 call Expression inc OperCount lea si,Operand1 lea di,Operand2 mov ax,[si].aSize mov cx,[di].aSize mov Oper2Size,cx jcxz @@1 or ax,ax jnz @@2 xchg cx,[si].aSize jmp short @@2 @@1: xchg ax,[di].aSize @@2: mov al,';' call CheckToken jnz @@3 mov al,',' call NeedToken lea si,Operand3 call Expression inc OperCount mov al,';' call NeedToken @@3: ret ProcessOperands endp @Err: cbw Error label near push SaveTextPtr pop TextPtr.offs jmp @Exit FieldErr label near mov al,-15 jmp @Err ZeroDivErr label near mov al,-14 jmp @Err Not286Err label near mov al,-13 jmp @Err InvOperErr label near mov al,-12 jmp @Err IntConstErr label near mov al,-11 jmp @Err StringConstErr label near mov al,-10 jmp @Err OutOfRangeErr label near mov al,-9 jmp @Err InvRegErr label near mov al,-8 jmp @Err RelSymErr label near mov al,-7 jmp @Err TypeErr label near mov al,-6 jmp @Err ConstErr label near mov al,-5 jmp @Err MemRefErr label near mov al,-4 jmp @Err InvOperErr2 label near mov al,-3 jmp @Err OutOfMemErr label near mov al,-2 jmp @Err SyntaxErr label near mov al,-1 jmp @Err CheckStack proc near cmp sp,StackLimit jbe OutOfMemErr ret CheckStack endp include asmexpr.inc include asmlex.inc include asminstr.inc extrn OpcodeTable:near extrn ResWordTable:near end