INCLUDE IO.ASM ;------------------------------------------- STACK SEGMENT STACK DB 128 DUP (?) STACK ENDS ;------------------------------------------- DATA SEGMENT X DW 8 DUP (NIL) Y DB 8 DUP (?) Z DB 1 SL DB 'SLOVO: $' PR DB 'PORADKOVII NOMER: $' INP DB 'INPUTTATIONS FINISHED$' OUTP DB 'OUTPUTTATIONS FINISHED$' DATA ENDS ;------------------------------------------- NODE STRUC L1 DB ? L2 DB ? L3 DB ? L4 DB ? L5 DB ? L6 DB ? L7 DB ? L8 DB ? NUM DB 1 NEXT DW ? NODE ENDS ;------------------------------------------- HSIZE EQU 100 NIL EQU 0 HEAP SEGMENT HPTR DW ? DB 11*HSIZE DUP (?) HEAP ENDS ;------------------------------------------- CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK, ES:HEAP ;----------------------------------- IHEAP PROC FAR PUSH SI PUSH BX PUSH CX MOV CX,HEAP MOV ES,CX MOV CX, HSIZE MOV BX,NIL MOV SI,11*HSIZE-2 INPO: MOV ES:[SI].NEXT,BX MOV BX,SI SUB SI,11 LOOP INPO MOV ES:HPTR,BX POP CX POP BX POP SI RET IHEAP ENDP ;------------------------------------------- DISPOSE PROC FAR PUSH ES:HPTR POP ES:[DI].NEXT MOV ES:HPTR,DI RET DISPOSE ENDP ;------------------------------------------- DELETE PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI LEA BX,X MOV CX,8 INMAS: MOV DI,[BX] MOV WORD PTR BX, NIL INLIST: CMP DI, NIL JE NEXTA MOV SI, ES:[DI].NEXT CALL DISPOSE MOV DI, SI JMP INLIST NEXTA: ADD BX, 2 LOOP INMAS POP SI POP DI POP DX POP CX POP BX POP AX RET DELETE ENDP ;------------------------------------------- NEW PROC FAR MOV DI,ES:HPTR CMP DI,NIL JE EH PUSH ES:[DI].NEXT POP ES:HPTR RET EH: LDS DX,CS:AE OUTSTR NEWLINE OUTCH '<' ;CALL DELETE call iheap FINISH AE DD E E DB 'KU!','$' NEW ENDP ;------------------------------------------- INSP PROC PUSH BP MOV BP,SP PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI MOV BX,[BP+4] MOV SI,[BP+6] DEC BX ADD BX,BX XOR BP,BP XOR DX,DX INC DX MOV CX,BX MOV AX,X[BX] MOV BX,AX OP: CMP BX,NIL JE FOUND INC BP MOV BX,ES:[BX].NEXT JMP OP FOUND: CALL NEW MOV BX,0 MOV AH,[SI][BX] MOV ES:[DI].L1,AH INC BX MOV AH,[SI][BX] MOV ES:[DI].L2,AH INC BX MOV AH,[SI][BX] MOV ES:[DI].L3,AH INC BX MOV AH,[SI][BX] MOV ES:[DI].L4,AH INC BX MOV AH,[SI][BX] MOV ES:[DI].L5,AH INC BX MOV AH,[SI][BX] MOV ES:[DI].L6,AH INC BX MOV AH,[SI][BX] MOV ES:[DI].L7,AH INC BX MOV AH,[SI][BX] MOV ES:[DI].L8,AH MOV DL,Z MOV ES:[DI].NUM,DL INC Z MOV ES:[DI].NEXT,NIL CMP BP,0 JNE LV MOV BX,CX MOV X[BX],DI JMP FININ LV: MOV BX,CX MOV BX,X[BX] CU: CMP ES:[BX].NEXT,NIL JE N MOV BX,ES:[BX].NEXT JMP CU N: MOV ES:[BX].NEXT,DI FININ: POP SI POP DI POP DX POP CX POP BX POP AX POP BP RET 4 INSP ENDP ;------------------------------------------- INPUT PROC PUSH BP PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI XOR DL,DL AGAIN: XOR AL,AL XOR BX,BX MOV CX,8 MC: MOV Y[BX],' ' INC BX LOOP MC XOR BX,BX MOV AL,0 V: INCH AH CMP AH,',' JE ZP1 ZP3: CMP AH,'.' JNE PR10 JMP ZP2 PR10: INC AL CMP BX,8 JE V MOV Y[BX],AH INC BX JMP V ZP1: CMP AH,',' JNE ZP2 INC DL CMP DL,20 JL ZP2 JMP INCOR ZP2: CMP AL,0 JNE PR11 JMP INCOR PR11: CMP BX,0 JE V MOV CX,BX MOV BP,0 PF: CMP Y[BP],'A' JAE PR1 JMP INCOR PR1: CMP Y[BP],'Z' JBE PR2 JMP INCOR PR2: LOOP PF PUSH DX MOV DX,BX DEC BX ADD BX,BX CMP X[BX],NIL JNE NEMPTY MOV DI,OFFSET Y PUSH DI PUSH DX CALL INSP JMP VH NEMPTY: MOV BX,X[BX] MOV SI,0 COMP: MOV CH,Y CMP CH,ES:[BX].L1 JBE PR3 JMP GR PR3: JAE PR4 JMP LE1 PR4: MOV BP,1 MOV CH,Y[BP] CMP CH,ES:[BX].L2 JBE PR5 JMP GR PR5: JAE PR6 JMP LE1 PR6: MOV BP,2 MOV CH,Y[BP] CMP CH,ES:[BX].L3 JA GR JB LE1 MOV BP,3 MOV CH,Y[BP] CMP CH,ES:[BX].L4 JA GR JB LE1 MOV BP,4 MOV CH,Y[BP] CMP CH,ES:[BX].L5 JA GR JB LE1 MOV BP,5 MOV CH,Y[BP] CMP CH,ES:[BX].L6 JA GR JB LE1 MOV BP,6 MOV CH,Y[BP] CMP CH,ES:[BX].L7 JA GR JB LE1 MOV BP,7 MOV CH,Y[BP] CMP CH,ES:[BX].L8 JA GR JB LE1 EQVAL: INC Z JMP VH GR: MOV SI,BX CMP ES:[BX].NEXT,NIL JE KK MOV BX,ES:[BX].NEXT JMP COMP KK: MOV DI,OFFSET Y PUSH DI PUSH DX CALL INSP JMP VH LE1: CMP SI,NIL JNE KE MOV BX,DX DEC BX ADD BX,BX MOV SI,X[BX] MOV X[BX],NIL MOV DI,OFFSET Y PUSH DI PUSH DX CALL INSP MOV BX,X[BX] MOV ES:[BX].NEXT,SI JMP VH KE: MOV ES:[SI].NEXT,NIL MOV DI,OFFSET Y PUSH DI PUSH DX CALL INSP MOV SI,ES:[SI].NEXT MOV ES:[SI].NEXT,BX JMP VH INCOR: LDS DX,CS:AR OUTSTR FLUSH NEWLINE OUTCH '<' ;LL DELETE call iheap FLUSH FINISH AR DD R R DB 'WRONG INPUTTATION!','$' VH: CMP AH,'.' POP DX JE PR7 JMP AGAIN PR7: POP SI POP DI POP DX POP CX POP BX POP AX POP BP RET INPUT ENDP ;------------------------------------------- MOUT PROC PUSH BP MOV BP,SP PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI MOV BX,[BP+4] DEC BX ADD BX,BX MOV BX,X[BX] CMP BX,NIL JNE VV JMP POH VV: LEA DX,SL OUTSTR OUTCH ES:[BX].L1 OUTCH ES:[BX].L2 OUTCH ES:[BX].L3 OUTCH ES:[BX].L4 OUTCH ES:[BX].L5 OUTCH ES:[BX].L6 OUTCH ES:[BX].L7 OUTCH ES:[BX].L8 OUTCH ' ' LEA DX,PR OUTSTR MOV AL,ES:[BX].NUM CBW OUTINT AX NEWLINE CMP ES:[BX].NEXT,NIL JE POH MOV BX,ES:[BX].NEXT JMP VV POH: POP SI POP DI POP DX POP CX POP BX POP AX POP BP RET 2 MOUT ENDP ;------------------------------------------- START: MOV AX, DATA MOV DS, AX CALL IHEAP OUTCH '>' NEWLINE NEWLINE XOR DX,DX XOR BX,BX CALL INPUT NEWLINE LEA DX,INP OUTSTR NEWLINE NEWLINE MOV BX,2 MOV BX,X[BX] MOV BX,1 PUSH BX CALL MOUT MOV BX,2 PUSH BX CALL MOUT MOV BX,3 PUSH BX CALL MOUT MOV BX,4 PUSH BX CALL MOUT MOV BX,5 PUSH BX CALL MOUT MOV BX,6 PUSH BX CALL MOUT MOV BX,7 PUSH BX CALL MOUT MOV BX,8 PUSH BX CALL MOUT NEWLINE LEA DX,OUTP OUTSTR NEWLINE NEWLINE OUTCH '<' ;CALL DELETE call iheap FINISH CODE ENDS END START