; 
;                     AREACODE.ASM Ver 1.0
; 
;                            as of
; 
;                       January 2, 1981
; 
;  AREACODE is used to display the region and state, specified 
; by  the user...very handy,  when someone leaves a area  code 
; number  on a CBBS,  but no city or state  reference.  Simple 
; enough to use,  just type AREACODE nnn<cr> (where 'nnn' is a 
; three   digit  area  code),   and  in  return,   you  get  a 
; geographical  region by city(s),  and state.  Sorry if  your 
; particular city is not represented,  and feel free to add it 
; as required...
; 
;  This  is not the most 'elegant' search routine that I could 
; have   used  in  implementing  this  program,   but  it   is 
; fast...it's  best  described  as  a  "forward  scanning/side 
; checking  mess"...if  you  don't find it matching  on  first 
; character, drop to the next possible match...
; 
;                          Best regards,
; 
;                          Kelly Smith, CP/M-Net SYSOP
;                          805-527-9321 (Modem, 300 Baud)
;                          805-527-0518 (Verbal Abuse)
; 

base	equ	0	; CP/M system base address
bdos	equ	base+5	; BDOS entry address
tbuff	equ	base+80h; temporary (command) buffer

prnstg	equ	9	; print string (ending in '$') function

lf	equ	0ah	; ASCII line feed
cr	equ	0dh	; ASCII carriage return

	org	base+100h

	lxi	h,0	; make local stack, so no warm boot
	dad	sp
	shld	oldstk
	lxi	sp,stack; old stack saved, make new stack
	lxi	d,msg1	; "Area code"
	call	print$message
	lxi	h,tbuff	; point to area code length
	mvi	d,0	; clear D Reg.
	mov	a,m	; get it...
	adi	1	; adjust buffer pointer +1
	mov	e,a
	dad	d	; point 1 past area code number
	mvi	m,'$'	; tag with 'end of string'
	lxi	d,tbuff+1	; check for valid entry
	ldax	d	; must be ASCII space to be correct
	cpi	' '
	jz	inputok
	lxi	d,msg4	; "NOT specified"
	call	print$message
	jmp	exit	; exit to CP/M now
inputok:call	print$message	; o.k., so far...print whatver was input
	lxi	d,msg2	; ", is "
	call	print$message
	mvi	b,0	; clear character position counter
	lxi	d,tbuff+2	; point to area code
	lxi	h,area$code$table	; point to area code table
scan:	ldax	d	; get first character of area code for match
	cmp	m	; does it match any first character in table?
	jnz	scan3	; if no match, advance 58 characters in table
scan1:	inx	d	; bump for next area code character
	inx	h	; bump to second character in area code table
	inr	b	; bump character position counter
	mov	a,b	; has character counter gone three positions?
	cpi	3
	jnz	scan2	; match next character, if not at position 3
	dcx	d	; adjust character position for subsequent match
	dcx	h
	ldax	d	; get last in entered area code
	cmp	m	; match to last character in area code table?
	jz	match	; if last character matches, display region, and state
	inx	d	; no match, bump both pointers
	inx	h
scan2:	ldax	d	; get next character to match
	cmp	m	; any match yet?
	jnz	backup	; back-up, if no match on current position
	mov	a,b	; are we at final character position?
	cpi	3
	jz	match	; if so, we have final match
	jmp	scan	; not final position, try again...
backup:	dcx	d	; back-up to start of entered area code
	dcx	h	; back-up to start of current area code in table
	dcr	b	; de-bump character position counter
	jnz	backup	; loop until we are at start of string
scan3:	push	d	; save pointer to entered area code
	lxi	d,58	; make 58 character bias
	dad	d	; add bias to area code table pointer
	pop	d	; recover pointer to entered area code
	mov	a,m	; have we hit "EOF" in area code table column?
	cpi	'Z'-40h
	jnz	scan	; if not, try next string for a match...
nomatch:lxi	d,msg3	; "NOT a valid area code"
	call	print$message
	jmp	exit	; exit to CP/M now...
match:	inx	h	; bump for region and state table location
	xchg		; swap to D&E Regs.
	call	print$message
exit:	lxi	d,crlf	; keep it neat...
	call	print$message
	lhld	oldstk	; get old CP/M stack
	sphl		; restore stack pointer, so no warm boot
	ret		; return to CP/M...
;
print$message		; print message string
;
	mvi	c,prnstg; print string (until '$') function
	call	bdos
	ret
;
area$code$table:	; storage for area code, region, state
;
	db	'205'
	db	' all regions, Alabama                                 $'
	db	'907'
	db	' all regions, Alaska                                  $'
	db	'602'
	db	' all regions, Arizona                                 $'
	db	'213'
	db	' Los Angeles, California                              $'
	db	'805'
	db	' Bakersfield, Ventura and Simi Valley, California     $'
	db	'707'
	db	' Eureka, Napa and Santa Rosa, California              $'
	db	'209'
	db	' Fresno and Stockton, California                      $'
	db	'415'
	db	' Oakland and San Francisco, California                $'
	db	'714'
	db	' Orange and San Diego, California                     $'
	db	'916'
	db	' Sacramento and South Tahoe, California               $'
	db	'408'
	db	' San Jose and Sunnyvale, California                   $'
	db	'519'
	db	' Ontario, Canada                                      $'
	db	'514'
	db	' Montreal, Canada                                     $'
	db	'705'
	db	' North Bay, Ontario, Canada                           $'
	db	'807'
	db	' Ontario, Canada                                      $'
	db	'613'
	db	' Ottawa, Ontario, Canada                              $'
	db	'418'
	db	' Quebec, Quebec, Canada                               $'
	db	'819'
	db	' Quebec, Canada                                       $'
	db	'416'
	db	' Toronto and Ontario, Canada                          $'
	db	'204'
	db	' Manatoba, Canada                                     $'
	db	'306'
	db	' Saskatchewan, Canada                                 $'
	db	'403'
	db	' Alberta, Canada                                      $'
	db	'804'
	db	' British Columbia, Canada                             $'
	db	'303'
	db	' all regions, Colorado                                $'
	db	'203'
	db	' all regions, Connecticut                             $'
	db	'302'
	db	' all regions, Deleware                                $'
	db	'202'
	db	' Washington, District of Columbia                     $'
	db	'813'
	db	' Avon Park, Fort Myers and Winter Haven, Florida      $'
	db	'305'
	db	' Fort Lauderdale, Key West, Miami and Florida         $'
	db	'904'
	db	' Jacksonville, Florida                                $'
	db	'404'
	db	' Atlanta, Rome, Georgia                               $'
	db	'912'
	db	' Waycross, Georgia                                    $'
	db	'808'
	db	' all regions, Hawaii                                  $'
	db	'208'
	db	' all regions, Idaho                                   $'
	db	'618'
	db	' Alton and Mount Vernon, Illinois                     $'
	db	'312'
	db	' Aurora, Chicago, Elgin and Highland Park, Illinois   $'
	db	'217'
	db	' Casey and Springfield, Illinois                      $'
	db	'815'
	db	' La Salle, Joliet and Rockford, Illinois              $'
	db	'812'
	db	' Evansville, Indiana                                  $'
	db	'219'
	db	' Gary, Hammond, Michigan City and South Bend, Indiana $'
	db	'317'
	db	' Indianapolis and Kokomo, Indiana                     $'
	db	'712'
	db	' Council Bluffs, Iowa                                 $'
	db	'515'
	db	' Des Moines and Mason City, Iowa                      $'
	db	'319'
	db	' Dubuque, Iowa                                        $'
	db	'316'
	db	' Dodge City and Wichita, Kansas                       $'
	db	'913'
	db	' Ottawa and Topeka, Kansas                            $'
	db	'606'
	db	' Ashland and Winchester, Kentuckey                    $'
	db	'502'
	db	' Louiseville, Paducah and Shelbyville, Kentuckey      $'
	db	'504'
	db	' Baton Rouge and New Orleans, Louisiana               $'
	db	'318'
	db	' Lake Charles, Louisiana                              $'
	db	'207'
	db	' all regions, Maine                                   $'
	db	'301'
	db	' all regions, Maryland                                $'
	db	'617'
	db	' Boston, Framingham and New Bedford, Massachusetts    $'
	db	'413'
	db	' Springfield, Massachusetts                           $'
	db	'905'
	db	' Mexico City, Mexico                                  $'
	db	'903'
	db	' Northwest Mexico                                     $'
	db	'313'
	db	' Adrian and Ann Arbor, Michigan                       $'
	db	'616'
	db	' Battle Creek, Cadillac and Grand Rapids, Michigan    $'
	db	'517'
	db	' Lancing and Saginaw, Michigan                        $'
	db	'906'
	db	' Sault Ste. Marie, Michigan                           $'
	db	'507'
	db	' Albert Lea and Rochester, Minnesota                  $'
	db	'218'
	db	' Duluth, Minnesota                                    $'
	db	'612'
	db	' Minneapolis and Saint Paul, Minnesota                $'
	db	'601'
	db	' all regions, Mississippi                             $'
	db	'417'
	db	' Joplin and Springfiled, Missouri                     $'
	db	'816'
	db	' Kansas City and Saint Joseph, Missouri               $'
	db	'314'
	db	' Saint Louis, Missouri                                $'
	db	'406'
	db	' all regions, Montana                                 $'
	db	'402'
	db	' Lincoln and Omaha, Nebraska                          $'
	db	'308'
	db	' North Platte, Nebraska                               $'
	db	'702'
	db	' all regions, Nevada                                  $'
	db	'603'
	db	' all regions, New Hampshire                           $'
	db	'609'
	db	' Atlantic City, Camden and Trenton, New Jersey        $'
	db	'201'
	db	' Hackensack, Morristown and Newark, New Jersey        $'
	db	'505'
	db	' all regions, New Mexico                              $'
	db	'518'
	db	' Albany, Greenwich and Schenectady, New York          $'
	db	'716'
	db	' Buffalo, Niagra Falls and Rochester, New York        $'
	db	'607'
	db	' Elmira and Stamford, New York                        $'
	db	'516'
	db	' Hempstead, New York                                  $'
	db	'914'
	db	' Monroe, Mount Vernon and Poughkeepsie, New York      $'
	db	'212'
	db	' New York City, New York                              $'
	db	'315'
	db	' Syracuse and Utica, New York                         $'
	db	'704'
	db	' Charlotte and Salisbury, North Carolina              $'
	db	'919'
	db	' Greenville and Williamston, North Carolina           $'
	db	'701'
	db	' all regions, North Dakota                            $'
	db	'216'
	db	' Akron, Cleveland, Massilon and Youngstown, Ohio      $'
	db	'513'
	db	' Cincinnati and Dayton, Ohio                          $'
	db	'614'
	db	' Columbus, Marietta and Newark, Ohio                  $'
	db	'419'
	db	' Toldeo, Ohio                                         $'
	db	'918'
	db	' Muskogee and Tulsa, Oklahoma                         $'
	db	'405'
	db	' Oklahoma City, Oklahoma                              $'
	db	'503'
	db	' all regions, Oregon                                  $'
	db	'215'
	db	' Allentown, Chester and Philadelphia, Pennsylvania    $'
	db	'814'
	db	' Altoona, Erie and Punxsutawney, Pennsylvania         $'
	db	'717'
	db	' Harrisburg, Scranton and Wilkes-Barre, Pennsylvania  $'
	db	'809'
	db	' all regions, Puerto Rico                             $'
	db	'401'
	db	' all regions, Rhode Island                            $'
	db	'803'
	db	' all regions, South Carolina                          $'
	db	'605'
	db	' all regions, South Dakota                            $'
	db	'615'
	db	' Chattanooga and Nashville, Tennessee                 $'
	db	'901'
	db	' Memphis, Tennesee                                    $'
	db	'806'
	db	' Amarillo, Texas                                      $'
	db	'512'
	db	' Austin, Corpus Christi and San Antonio, Texas        $'
	db	'214'
	db	' Dallas, Texas                                        $'
	db	'713'
	db	' Galveston and Houston, Texas                         $'
	db	'817'
	db	' Temple, Texas                                        $'
	db	'801'
	db	' all regions, Utah                                    $'
	db	'802'
	db	' all regions, Vermont                                 $'
	db	'809'
	db	' all regions, Virgin Islands                          $'
	db	'804'
	db	' Charlottesville, Norfolk and Richmond, Virginia      $'
	db	'703'
	db	' Fredericksburg, Roanoke and Winchester, Virginia     $'
	db	'509'
	db	' Pullman, Walla Walla, Washington                     $'
	db	'206'
	db	' Seattle and Vancouver, Washington                    $'
	db	'304'
	db	' all regions, West Virginia                           $'
	db	'608'
	db	' Beloit and Madison, Wisconsin                        $'
	db	'715'
	db	' Eau Claire and Wausau, Wisconsin                     $'
	db	'414'
	db	' Green Bay, Milwaukee and Racine, Wisconsin           $'
	db	'307'
	db	' all regions, Wyoming                                 $'
	db	'Z'-40h	; "EOF"
	db	'Z'-40h	; "EOF"
	db	'Z'-40h	; "EOF"
;
msg1:	db	cr,lf,' Area code$'
msg2:	db	', is$'
msg3:	db	' NOT a valid area code!$'
msg4:	db	' NOT specified!$'
crlf:	db	cr,lf,'$'
;
oldstk:	ds	2	; storage for "old" CP/M stack pointer
	ds	16	; storage for "local" stack
stack	equ	$	; "local" stack pointer starts here
;
	end
