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