; BEDLAM PARAMETER PARSING ROUTINE v0.2 ; LKS 1995. ; Create: 30\Jun\1995 .MODEL large .STACK 8192 .DATA .CODE .386 JUMPS ; Segment storage. _zero_seg dw 0000h _psp_seg dw 0000h _code_seg dw 0000h _data_seg dw 0000h _stack_seg dw 0000h _alloc_seg dw 0000h ; 192k allocated (split into 3 x 64k) _scr_seg dw 0000h _sprite_seg dw 0000h _level_seg dw 0000h _text_seg dw 0B800h _graph_seg dw 0A000h ; Memory allocation. _code_size dw 0000h ; Size of shrunk CS. _free_size dw 0000h ; Free memory after shrink. ; Interrupt vectors. _int1C_off dw 0000h ; Old timer interrupt. _int1C_seg dw 0000h _int09_off dw 0000h ; Old keyboard interrupt. _int09_seg dw 0000h ; File handling. _fname db 'BEDLAM.BED ', 00h _handle dw 0000h .STARTUP start: mov _psp_seg, es mov _code_seg, cs mov _data_seg, ds mov _stack_seg, ss call param .EXIT ;---- PARAM -------------------------------------------------------------------; ; Parameter parsing routines. _params db '?', 00h ; Help. _param_help db 'help', 00h ; Help. _param_dev db 'dev=', 00h ; Development mode. _param_new db 'new=', 00h ; Create new .BED file. _param_edit db 'edit=', 00h ; Edit existing .BED file. _param_play db 'play=', 00h ; Play .BED file (by default BEDLAM.BED). _param_len dw 0000h param: ; Check if any parameters. mov es, _psp_seg xor ch, ch mov cl, es: [80h] mov _param_len, cx jcxz param_none call print db 'þ Parsing parameters.', 0Dh, 0Ah, 0Ah db ' String: ', 00h mov bx, 81h param_print_loop: mov al, es: [bx] int 29h inc bx loop param_print_loop call print db 0Dh, 0Ah, ' Length: ', 00h mov dx, _param_len mov cx, 0A03h call printnum ; Convert to lower case. call print db 0Dh, 0Ah, ' Lower: ', 00h mov bx, 81h mov cx, _param_len param_lower_loop: mov al, es: [bx] cmp al, 'A' jb param_nolower cmp al, 'Z' ja param_nolower or al, 32 param_nolower: mov es: [bx], al int 29h inc bx loop param_lower_loop ; Search for paramwords. call print db ' Slashes: ', 00h mov bx, 80h mov cx, _param_len ; First look for a '/'. param_findslash: jcxz param_noslash inc bx cmp byte ptr es: [bx], '/' loopne param_findslash jcxz param_noslash ; '/' found, so now compare parameter with list. ; Try each one in turn. lea si, [bx+1] lea di, _params call param_cmp je param_help lea si, [bx+1] lea di, _param_help call param_cmp je param_help lea si, [bx+1] lea di, _param_dev call param_cmp je param_dev lea si, [bx+1] lea di, _param_new call param_cmp je param_new lea si, [bx+1] lea di, _param_edit call param_cmp je param_edit lea si, [bx+1] lea di, _param_play call param_cmp je param_play jmp param_findslash param_noslash: call print db 0Dh, 0Ah, 00h param_none: ret param_cmp: push si push di param_cmploop: mov al, es: [si] mov ah, cs: [di] inc si inc di cmp ah, 0 je param_cmp_yes cmp al, ah je param_cmploop pop di pop si ret param_cmp_yes: cmp si, si pop di pop si ret param_cmp_no: mov si, 1 cmp si, 0 pop di pop si ret ;---- Param_Help. param_help: call print db 'HELP', 0Dh, 0Ah, 00h jmp param_findslash ;---- Param_Dev. param_dev: call print db 'DEV', 0Dh, 0Ah, 00h jmp param_findslash ;---- Param_New. param_new: call print db 'NEW', 0Dh, 0Ah, 00h jmp param_findslash ;---- Param_Edit. param_edit: call print db 'EDIT:', 00h add bx, 6 sub cx, 5 param_edit_loop: mov al, es: [bx] cmp al, ' ' je param_edit_end int 29h inc bx loop param_edit_loop param_edit_end: jmp param_findslash ;---- Param_Play. param_play: call print db 'PLAY', 0Dh, 0Ah, 00h jmp param_findslash ;---- LIBRARY ROUTINES v0.2 ---------------------------------------------------; ;---- GetKey ; Returns key pressed in AL, or zero in AL and scan code in AH or zero in AX if ; no key in buffer. getkey: mov ah, 0Bh int 21h cmp al, 0FFh je getkey_get xor ax, ax ret getkey_get: mov ah, 7 int 21h cmp al, 0 je getkey_ext xor ah, ah ret getkey_ext: mov ah, 7 int 21h mov ah, al xor al, al ret ;---- PrintC ; AH = attribute ; CS:IP = string ; ES:DI = destination _printc_si dw 0000h printc: mov _printc_si, si pop si push ax printc_loop: mov al, cs: [si] inc si or al, al je printc_end cmp al, 255 jne printc_notattr mov ah, cs: [si] inc si jmp printc_loop printc_notattr: stosw jmp printc_loop printc_end: pop ax push si mov si, _printc_si ret ;---- Print ; CS:IP = text. _print_si dw 0000h print: mov _print_si, si pop si push ax print_loop: mov al, cs: [si] inc si or al, al je print_end int 29h jmp print_loop print_end: pop ax push si mov si, _print_si ret ;---- PrintNumC ; AH = attribute ; CH = base ; CL = digits ; EDX = Number ; ES:DI = destination _printnumc_table db '0123456789ABCDEF' _printnumc_attr db 00h _printnumc_len db 00h _printnumc_base db 00h printnumc: ; Valiate input. cmp ch, 0 je printnumc_end cmp ch, 16 ja printnumc_end cmp cl, 0 je printnumc_end cmp cl, 8 ja printnumc_end push eax push ecx push edx push ebx mov _printnumc_attr, ah mov _printnumc_len, cl mov _printnumc_base, ch xor ch, ch mov eax, edx printnumc_calc: xor ebx, ebx mov bl, _printnumc_base xor edx, edx div ebx xor bh, bh mov bl, dl mov dh, _printnumc_attr mov dl, _printnumc_table[bx] push dx loop printnumc_calc mov cl, _printnumc_len printnumc_print: pop ax stosw loop printnumc_print pop ebx pop edx pop ecx pop eax printnumc_end: ret ;---- PrintNum ; CH = base ; CL = digits ; EDX = Number _printnum_table db '0123456789ABCDEF' _printnum_len db 00h _printnum_base db 00h printnum: ; Valiate input. cmp ch, 0 je printnum_end cmp ch, 16 ja printnum_end cmp cl, 0 je printnum_end cmp cl, 8 ja printnum_end push eax push ecx push edx push ebx mov _printnum_len, cl mov _printnum_base, ch xor ch, ch mov eax, edx printnum_calc: xor ebx, ebx mov bl, _printnum_base xor edx, edx div ebx xor bh, bh mov bl, dl xor dh, dh mov dl, _printnum_table[bx] push dx loop printnum_calc mov cl, _printnum_len printnum_print: pop ax int 29h loop printnum_print pop ebx pop edx pop ecx pop eax printnum_end: ret ;---- END OF CODE -------------------------------------------------------------; END