;; ; @(#) ch_squ.asm - 'The sequence of characters' problem solution. ; (c) 1995 Ivan Maidanski http://ivmai.chat.ru ; Freeware program source. All rights reserved. ;; ; Language: ASM8086 (for IBM PC/AT, MS-DOS v3.0+, COM file) ; Tested with: Turbo Assembler v3.1, Turbo Link v5.1 ; Last modified: 1995-03-27 20:55:00 GMT+04:00 ;; NAME CH_SQU ; tasm ch_squ.asm ; tlink /t ch_squ.obj IDEAL MODEL TINY LOCALS ; Definitions Max EQU 100 Eoln EQU '.' ; Macros MACRO PrintStr String lea si,[String] call WriteLnStr ENDM CODESEG ; Program initialization ORG 100h LABEL Start NEAR mov sp,OFFSET StackEnd mov bx,(ProgramLen+0Fh)/10h mov ah,4Ah int 21h ; Main progaram PrintStr MsgEnterData call ReadLnBuffer PrintStr MsgViewData PrintStr Buffer PrintStr MsgRuleNumber call TestRule call UseRule PrintStr MsgPrintResult PrintStr Buffer ; Return to DOS mov ax,4C00h int 21h ; Procedures PROC WriteLnStr ; Expects: [ds:si] - String ; Returns: - mov ah,2h cld EVEN @@Loop: lodsb cmp al,Eoln je @@Exit mov dx,ax int 21h jmp @@Loop @@Exit: mov dl,0Dh int 21h mov dl,0Ah int 21h ret ENDP PROC ReadLnBuffer ; Expects: [ds:Buffer] - Buffer, es=ds ; Returns: [ds:Buffer] - Buffer lea di,[Buffer] mov cx,Max mov ah,1h cld EVEN @@Loop: int 21h stosb cmp al,Eoln loopne @@Loop jne @@Error cmp [Buffer],Eoln je @@Error mov ah,2h mov dl,0Dh int 21h mov dl,0Ah int 21h ret @@Error: PrintStr MsgInputError mov ax,4C01h int 21h ENDP PROC TestRule ; Expects: [ds:Buffer] - Buffer, es=ds ; Returns: dl - Rule(0,1) xor dx,dx lea di,[Buffer] mov cx,Max mov al,Eoln cld repne scasb dec di dec di mov al,[di] cmp al,'A' jb @@False cmp al,'Z' ja @@False mov cx,di lea di,[Buffer] sub cx,di je @@True repne scasb jne @@True @@False: inc dx @@True: ret ENDP PROC UseRule ; Expects: [ds:Buffer] - Buffer, dl=Rule(0,1) ; Returns: [ds:Buffer] - Buffer add dl,'1' mov ah,2h int 21h sub dl,'1' jne @@Skip call Rule1 ret @@Skip: call Rule2 ret ENDP PROC Rule1 ; Expects: [ds:Buffer] - Buffer ; Returns: [ds:Buffer] - Buffer lea si,[Buffer] cld EVEN @@Loop: lodsb cmp al,Eoln je @@Exit cmp al,'A' jb @@Loop cmp al,'Z' ja @@Loop jne @@Skip mov al,'A'-1 @@Skip: inc ax mov [si-1],al jmp @@Loop @@Exit: ret ENDP PROC Rule2 ; Expects: [ds:Buffer] - Buffer, es=ds ; Returns: [ds:Buffer] - Buffer lea si,[Buffer] mov bx,si cld EVEN @@Loop: lodsb cmp al,Eoln je @@Exit cmp al,'0' jb @@Loop cmp al,'9' ja @@Loop mov dx,si dec si mov cx,si sub cx,bx mov di,si dec si std rep movsb cld mov si,dx mov [bx],al inc bx jmp @@Loop @@Exit: ret ENDP ; Defined data MsgEnterData DB ' Enter source data:.' MsgViewData DB ' View source data:.' MsgRuleNumber DB ' Rule number:.' MsgPrintResult DB 0Dh,0Ah,' Result:.' MsgInputError DB 0Dh,0Ah,' Error: Incorrect data!.' ; Undefined data Buffer DB Max DUP(?) ; Program stack EVENDATA DB 100h DUP(?) ; Minimum LABEL StackEnd NEAR ; End of Program ProgramLen= $-Start+100h END Start