//////////////////////////////////////////////////////////////////////// ; Вход: hl - список команд формата: "строка",0,cmd_addr ; de - строка с командой ; c - длина строки ; Выход: CF=1 - в HL адрес команды на исполнение ; CF=0 - нет опознаной команды RUN_COMMAND: push bc push de ; .loop: ld a,(de) cp "a" jr c,.skip cp "z"+1 jr nc,.skip and %0101'1111 ; a..z -> A..Z .skip: cp (hl) jr nz,.not_cmd ; не команда inc hl inc de dec c jr nz,.loop ; xor a cp (hl) jr nz,.not_cmd pop bc pop bc ld a,(de) cp " " jr nz,.no_sp inc de .no_sp: inc hl ld a,(hl) inc hl ld h,(hl) ld l,a scf ; маркер опознаной команды ret ;jp (hl) ; на соотв. обработчик команды .not_cmd: xor a LD C,A CPIR inc hl inc hl pop de pop bc ld a,(hl) or a jr nz,RUN_COMMAND ; назад в цикл, еще не дошли конца списка дкоманд ret ; //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ; Вход: hl - список ключей формата: "строка",cmd_addr ; de - строка с командой ; c - длина строки с командой ; Выход: CF=1 - в HL адрес ключа на исполнение ; CF=0 - нет опознаного ключа RUN_OPTION: .cont: EX DE,HL LD B,C .loop: LD A,(HL) CP '/' ; INC HL JR Z,.got AND A RET Z DJNZ .loop ; not found key AND A RET ; .got: LD C,B INC HL LD A,(HL) DEC C CP ' ' JR Z,.good AND A JR NZ,RUN_OPTION.loop LD C,1 ; .good: push hl dec hl ld b,cmd_dir_options.Size ;!HARDCODE ex de,hl ld a,(de) OR %0010'0000 ld de,cmd_dir_options.paramLength ;!HARDCODE ; .find: cp (hl) jr z,.found add hl,de djnz .find ; not found pop hl jr RUN_OPTION ; found .found: pop de LD B,C inc hl ld a,(hl) inc hl ld h,(hl) ld l,a scf ; маркер опознаной опции ret ////////////////////////////////////////////////////////////////////////