BEDPARAM.ASM
Assembly source for Bedlam, 509 lines. Raw file
; BEDLAM PARAMETER PARSING ROUTINE v0.2
; <c> 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