
;         26.03.1987
;    ___________________
;
;     ADDRESS BOOK FILE
;    ___________________
;
;       Danny Hartley


DB "ZX82",3,0
DB THE-DF_NAN/256,THE-DF_NAN&255
DB DF_NAN/256,DF_NAN&255
DW 0FFFFH

; loading and saving of file
; done by BASIC program

ORG 25000
;LOAD 0C000H
DF_NAN:
JP START
F_LD_ADDR:
LD BC,SAVE_FROM
RET

BLACK:EQU 0
BLUE:EQU 1
RED:EQU 2
MAGENTA:EQU 3
GREEN:EQU 4
CYAN:EQU 5
YELLOW:EQU 6
WHITE:EQU 7
BRIGHT:EQU 64
UCASE:EQU 0DFH    ; and
DFILE:EQU 16384
AFILE:EQU 22528
TOPOFMEM:EQU 65535

FIELDS:EQU 8       ; num o fields
MAXLEN:EQU 22      ; fld max len
OVERHEADS:EQU 1       ; fld buff o/h
BUFF_SIZE:EQU MAXLEN+OVERHEADS*FIELDS
HD_MSGMAX:EQU 80      ; file msg len
DEF:EQU 080H
EOR:EQU 0C0H
EOF:EQU 0FFH


START:
EXX
PUSH HL
EXX
LD IX,V
CALL MAIN_01
EXX
POP HL
EXX
RET
MAIN_01:
LD HL,SAVE_FROM
LD BC,HD_MSGMAX+1
LD A,FIN
CPIR 
DEC BC          ; BC=FFFF
RET NZ          ; file err
LD (FILESTART),HL

;  MAIN MENU EXECUTION RTN
;  -----------------------
MAIN2:
LD HL,MAIN2
PUSH HL          ; RETURN AD
LD HL,MENUS
XOR A
MU_LOOK:
ADD A
LD B,A
ADD A
ADD B           ; *6
CALL ADDHLA
LD E,(HL)
INC HL
LD D,(HL)      ; MU MSG
EX DE,HL
CALL PRTMSG
EX DE,HL
INC HL
LD C,(HL)      ; INP NUM
DEC C
INC C
JP Z,JP_ONLY
GK1:
CALL WAIT_KEY
CP "X"
RET Z
SUB "1"
CP C
JR NC,GK1
INC HL
INC HL
LD C,(HL)
INC HL
LD H,(HL)
LD L,C
JR MU_LOOK
JP_ONLY:
INC HL
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP (HL)

;  LIST RTNS
;  ---------
LISTA:
CALL FIRST_REC
JP NC,S_EMPTY
LD HL,MU_SRCH1
CALL PRTMSG
LSA1:CALL L_1_REC_A
LSA3:CALL WAIT_KEY
CP "N"
JR Z,LSA2
CP ENT
JR Z,LSA2
CP "E"
JR Z,EDIT_C
CP "X"
RET Z
JR LSA3
LSA2:CALL NEXT_REC
JP NC,L_EMPTY
JP LSA1
LISTB:
CALL STKPRT
DB PAP,BLACK
DB INK,WHITE
DB FIN
CALL FIRST_REC
JP NC,S_EMPTY
L_B_0:LD A,CLS
CALL PRINT
LD C,BOT
L_B_1:LD HL,(REC_PTR)
L_B_2:LD A,(HL)
AND 07FH
CALL PRINT
BIT 7,(HL)
INC HL
JR Z,L_B_2
LD B,FIELDS-2
L_B_21:BIT 7,(HL)
INC HL
JR Z,L_B_21
DJNZ L_B_21
LD A,TAB
CALL PRINT
LD A,23
CALL PRINT
LD B,MAXLEN-4
L_B_22:LD A,(HL)
AND 07FH
CALL PRINT
BIT 7,(HL)
INC HL
JR NZ,L_B_23
DJNZ L_B_22
L_B_23:LD A,ENT
CALL PRINT
PUSH BC
CALL NEXT_REC
POP BC
JR NC,L_B_3
DEC C
JR NZ,L_B_1
L_B_3:PUSH AF
CALL WAIT_KEY
CP "X"
JR Z,L_B_4
POP AF
JR C,L_B_0
RET
L_B_4:POP AF
RET


;  EDIT RTNS
;  ---------
EDIT_U:
CALL ED_GET_RN
JR Z,EDIT_C     ; found
LD HL,MU_EDIT_B
CALL PRTMSG
JR EDIT_U
EDIT_C:
LD HL,MU_LISTA
CALL PRTMSG
CALL L_1_REC_A
LD HL,BUFFER
LD DE,0
LD B,BUFF_SIZE
CALL CLR_BUFF
LD HL,(REC_PTR) ; setup
LD DE,BUFFER    ; buffer
PUSH DE
LD B,FIELDS
ED_SB_0:LD A,(HL)
BIT 7,A
JR NZ,ED_SB_1
LD (DE),A
INC HL
INC DE
JR ED_SB_0
ED_SB_1:CP DEF
JR Z,ED_SB_2
AND 7FH
LD (DE),A
INC DE
ED_SB_2:LD A,ENT
LD (DE),A
EX (SP),HL
LD DE,MAXLEN+OVERHEADS
ADD HL,DE
LD D,H
LD E,L
EX (SP),HL
INC HL
DJNZ ED_SB_0
POP DE
ED_UD_0:CALL STKPRT        ; update
DB PAP,YELLOW    ; buffer
DB INK,BLACK     ; rtn.
DB CSQ,24,10,1,5*8
DB AT,10,0
DB TAB,32
DB " ",T
DB " ",T
DB " ",T
DB " ",T
DB " "
DB BOX,49,57,149,109
DB FIN
LD B,FIELDS
LD HL,F_COORDS
PUSH HL
LD HL,BUFFER
ED_UD_1:EX (SP),HL
LD D,(HL)       ; FETCH
INC HL           ; COORDS
LD E,(HL)
INC HL
EX (SP),HL
PUSH HL           ; HL=BUFF
PUSH BC           ; B =FLDS
LD B,MAXLEN
CALL SET_BUFF
CALL GETSTRING
POP BC
POP HL
LD DE,MAXLEN+OVERHEADS
ADD HL,DE
DJNZ ED_UD_1
POP HL
LD HL,MU_EDIT_C
CALL PRTMSG
ED_IP_1:CALL WAIT_KEY
CP "X"
RET Z
CP "N"
JR Z,ED_UD_0
CP "Y"
JR NZ,ED_IP_1
LD HL,BUFFER  ; CONVERT
LD DE,BUFFER  ; TO REC FORM
LD (IX+BUFF_CURR-V),0
LD B,FIELDS
ED_CV_1:PUSH BC
PUSH HL
LD A,(HL)
CP ENT
JR NZ,ED_CV_2
INC (IX+BUFF_CURR-V)
LD A,DEF
LD (DE),A
INC DE
JR ED_CV_3
ED_CV_2:INC (IX+BUFF_CURR-V)
LDI
LD A,(HL)
CP ENT
JR NZ,ED_CV_2
DEC DE
LD A,(DE)
SET 7,A
LD (DE),A
INC DE
ED_CV_3:POP HL
LD BC,MAXLEN+OVERHEADS
ADD HL,BC
POP BC
DJNZ ED_CV_1
LD HL,(REC_PTR) ; CHECK TO
LD A,(REC_LEN)  ; SEE IF
PUSH HL           ; THERE IS
PUSH AF           ; ENOUGH
CALL FIND_END     ; ROOM FOR
EX DE,HL        ; UPDATES
LD HL,TOPOFMEM
AND A
SBC HL,DE         ; HL=FREE
POP AF
POP DE
LD (REC_LEN),A
LD (REC_PTR),DE
CALL ADDHLA
LD A,(BUFF_CURR)
CALL SUBHLA
INC H
JR Z,ED_NR_1     ; NO ROOM
LD A,(BUFF_CURR)
SUB (IX+REC_LEN-V)
JR NC,ED_SR_1
NEG ;               NEW<OLD
LD HL,TOPOFMEM+1
LD DE,(REC_PTR)
AND A
SBC HL,DE
PUSH AF
CALL SUBHLA
POP AF
LD B,H
LD C,L
LD H,D
LD L,E
CALL ADDHLA
LDIR 
CP A             ; SET Z
ED_SR_1:JR Z,ED_SR_2
LD HL,TOPOFMEM   ; NEW>OLD
PUSH HL
LD DE,(REC_PTR)  ; ]CREATE
AND A             ;  SPACE
SBC HL,DE
PUSH AF
CALL SUBHLA
POP AF
LD B,H
LD C,L
POP HL
LD D,H
LD E,L
CALL SUBHLA
LDDR 
ED_SR_2:LD DE,(REC_PTR)  ; STORE
LD HL,BUFFER     ; UPDATED
LD BC,(BUFF_CURR); RECORD
LD B,0
LDIR 
RET
ED_NR_1:
CALL STKPRT
DB PAP,WHITE
DB INK,RED
DB CSQ,9,11,16,3*8
DB AT,11,0
DB TAB,12
DB S,21,T,"  "
DB "NO ROOM FOR RECORD ",T
DB S,21
DB BOX,72,88,127,23
DB FIN
CALL WAIT_KEY
RET
EDIT_A:
CALL FIND_END
EX DE,HL
LD HL,TOPOFMEM
AND A
SBC HL,DE
LD A,H
OR A
JR NZ,ED_AP_1
LD A,L
CP FIELDS+1
JR C,ED_NR_1
ED_AP_1:LD HL,(REC_NUM)
INC HL
LD (REC_NUM),HL
LD (IX+REC_LEN-V),FIELDS
LD HL,NEW_REC_D
LD BC,FIELDS+2
LDIR 
JP EDIT_C
EDIT_D:
CALL STKPRT
DB CSQ,10,9,11,8
DB AT,9,14
DB "DELETE RECORD"
DB FIN
CALL ED_GET_RN
JR Z,ED_D_2     ; found
LD HL,MU_EDIT_B
CALL PRTMSG
JR EDIT_D
ED_D_2:
LD HL,(REC_PTR)
PUSH HL
CALL NEXT_REC
LD DE,(REC_PTR)
LD HL,TOPOFMEM
AND A
SBC HL,DE
LD B,H
LD C,L
EX DE,HL
POP DE
LDIR 
RET

ED_GET_RN:
LD C,0
ED1:
LD HL,BUFFER
LD B,4
LD DE,14*256+18
INC C
DEC C
CALL Z,CLR_BUFF
CALL SET_BUFF
CALL GETSTRING
HALT ;           DELAY TO
HALT ;           ALLOW CURSR
HALT ;           TO VANISH
INC C
DEC C
POP DE
RET Z          ; null entry
PUSH DE
LD HL,BUFFER
LD B,4
ED2:LD A,(HL)
CP ENT
JR Z,ED3
CP "0"
JR C,ED1
CP "9"+1
JR NC,ED1
INC HL
DJNZ ED2
ED3:LD DE,BUFFER
LD HL,0
ED4:ADD HL,HL      ; *2
LD B,H
LD C,L
ADD HL,HL      ; *4
ADD HL,HL      ; *8
ADD HL,BC      ; *10
LD A,(DE)
SUB "0"
CALL ADDHLA
INC DE
LD A,(DE)
CP ENT
JR NZ,ED4
ED_F_RN:
PUSH HL
CALL FIRST_REC
POP HL
POP DE         ; RET ADDR
JP NC,S_EMPTY
PUSH DE
ED5:DEC HL
LD A,L
OR H          ; found
RET Z          ; Z set
PUSH HL
CALL NEXT_REC
POP HL
JR C,ED5
CALL STKPRT
DB PAP,YELLOW
DB INK,BLACK
DB CSQ,6,10,19,3*8
DB AT,10,0
DB TAB,9
DB S,24,T
DB " RECORD DOES"
DB " NOT EXIST  ",T
DB S,24
DB BOX,49,81,149,21
DB FIN
CALL WAIT_KEY
RET ;              NZ set
L_1_REC_A:
LD HL,MU_LISTAA
CALL PRTMSG
CALL STKPRT
DB AT,8,22
DB FIN
LD HL,(REC_NUM)
CALL PR_DEC
LD HL,(REC_PTR)
PUSH HL
LD HL,F_COORDS
LD B,FIELDS
L1RA1:LD A,AT
CALL PRINT
LD A,(HL)
INC HL
CALL PRINT
LD A,(HL)
INC HL
CALL PRINT
EX (SP),HL
CALL PR_FIELD
EX (SP),HL
DJNZ L1RA1
POP HL
RET
PR_FIELD:
LD A,(HL)
CP DEF
JR NZ,PRF1
INC HL
LD A,"_"        ; DEFAULT
JP PRINT
PRF1:LD A,(HL)
AND 07FH
CALL PRINT
BIT 7,(HL)
INC HL
JR Z,PRF1
RET

;  SEARCH RTN
;  ----------
SEARCH:
LD HL,BUFFER
LD B,14         ; LEN
LD DE,15*256+14 ; COORDS
CALL CLR_BUFF
CALL GETSTRING
INC C
DEC C
RET Z            ; NULL INP
CALL FIRST_REC
JP NC,S_EMPTY
XOR A            ; NO RECS
LD (BUFF_MAX),A ; FND YET
SR_NX_REC:
LD B,(IX+BUFF_CURR-V)
LD A,(REC_LEN)
SUB B
JR NC,SR_LN_OK
XOR A
LD B,(IX+REC_LEN-V)
SR_LN_OK:INC A
LD C,A
LD DE,(REC_PTR)
SR_NX_PS1:
PUSH DE           ; B=CQ NM
PUSH BC           ; C=PS NM
LD HL,BUFFER
SR_OK:LD A,(DE)
AND 7FH
CP (HL)
JR NZ,SR_NX_PS2
INC HL
INC DE
DJNZ SR_OK
POP BC
POP DE
LD A,(BUFF_MAX)
LD (IX+BUFF_MAX-V),1
OR A
LD HL,MU_LISTA
PUSH AF
CALL Z,PRTMSG
CALL L_1_REC_A
LD HL,MU_SRCH1
POP AF
CALL Z,PRTMSG
SR_K1:CALL WAIT_KEY
CP "N"
JR Z,SR_NX_RC2
CP ENT
JR Z,SR_NX_RC2
CP "E"
JP Z,EDIT_C
CP "X"
JR NZ,SR_K1
RET
SR_NX_PS2:POP BC
POP DE
INC DE
DEC C
JR NZ,SR_NX_PS1
SR_NX_RC2:CALL NEXT_REC
JP C,SR_NX_REC
LD A,(BUFF_MAX)
OR A
JP NZ,L_EMPTY
JP NOT_FOUND

;  SAVE FILE TO MDV
;  ----------------
SAVE:
CALL FIND_END
INC HL
LD DE,SAVE_FROM
AND A
SBC HL,DE
LD B,H
LD C,L
POP HL         ; "MAIN"
RET

;  FILE STATUS
;  -----------
STATUS:
CALL STKPRT
DB AT,13,13
DB FIN
CALL FIND_END
EX DE,HL
LD HL,TOPOFMEM
AND A
SBC HL,DE
CALL PR_DEC
PUSH HL
CALL STKPRT
DB " byte"
DB FIN
DEC L
LD A,H
OR L
LD A,"s"
CALL NZ,PRINT
CALL STKPRT
DB " free"
DB AT,14,10
DB "currently "
DB FIN
CALL FIND_END
LD A,(REC_NUM)
LD L,A
LD H,0
OR A
JR Z,ST_1
CALL PR_DEC
JR ST_2
ST_1:CALL STKPRT
DB "no"
DB FIN
ST_2:CALL STKPRT
DB " record"
DB FIN
LD A,L
CP 1
LD A,"s"
CALL NZ,PRINT
LD A,L
CP 1
JR C,ST_3
CALL STKPRT
DB AT,15,10
DB "space for "
DB FIN
LD B,H
LD C,L
LD HL,(REC_PTR)
LD DE,(FILESTART)
AND A
SBC HL,DE
CALL DIVIDE
LD B,H
LD C,L
POP HL
CALL DIVIDE
LD A,H
OR L
JR NZ,ST_4
CALL STKPRT
DB "none"
DB FIN
JR ST_5
ST_4:CALL PR_DEC
ST_5:CALL STKPRT
DB " approx."
DB FIN
PUSH HL
ST_3:POP HL
CALL WAIT_KEY
RET

S_EMPTY:
CALL STKPRT
DB PAP,BLACK
DB INK,CYAN
DB CSQ,10,10,11,3*8
DB AT,10,0
DB TAB,14
DB S,14,T
DB "  FILE EMPTY  ",T
DB S,14
DB BOX,80,80,87,23
DB FIN
CALL WAIT_KEY
RET
L_EMPTY:
CALL STKPRT
DB PAP,BLACK
DB INK,CYAN
DB CSQ,10,11,15,3*8
DB AT,11,0
DB TAB,14
DB S,19,T
DB "  NO MORE RECORDS  ",T
DB S,19
DB BOX,80,88,119,23
DB FIN
CALL WAIT_KEY
RET
NOT_FOUND:
CALL STKPRT
DB PAP,BLACK
DB INK,CYAN
DB CSQ,11,10,10,3*8
DB AT,10,0
DB TAB,15
DB S,13,T
DB "  NOT FOUND  ",T
DB S,13
DB BOX,88,80,79,23
DB FIN
CALL WAIT_KEY
RET


;  FETCH FIRST/NEXT RECORD
;  -----------------------
;  retrn: CARRY = rec valid

FIRST_REC:
LD HL,0
LD (REC_NUM),HL
LD HL,(FILESTART)
JR NR2
NEXT_REC:
LD DE,(REC_PTR)
LD A,(DE)
CP EOF
RET NC          ; NC,EOF
LD HL,TOPOFMEM+1
AND A
SBC HL,DE
LD B,H         ; BC=T.O.M.
LD C,L         ; -REC_PTR
EX DE,HL
NR1:LD A,EOR
CPIR 
JP Z,NR2
AND A           ; NC,ERR
RET
NR2:LD (REC_PTR),HL
LD A,(HL)
CP EOF
RET NC          ; NC,EOF
LD HL,(REC_NUM)
INC HL
LD (REC_NUM),HL
THIS_REC:
LD HL,(REC_PTR); REC MUST
LD BC,0        ; BE VALID
LD A,EOR
CPIR ;           ; NOTE:
LD A,C         ; REC_LEN IS
CPL ;           ; LENGTH
LD (REC_LEN),A ; EXCLD EOR
SCF ;           ; OK
RET
FIND_END:
CALL FIRST_REC    ; RETURN
FE1:LD HL,(REC_PTR) ; HL POINTS
RET NC           ; TO EOF
CALL NEXT_REC
JR FE1


;  SETUP THE BUFFER,COORDS
;  -----------------------

CLR_BUFF:
PUSH HL
PUSH BC
CB1:LD (HL)," "
INC HL
DJNZ CB1
POP BC
POP HL
LD (HL),ENT
SET_BUFF:
PUSH HL
LD C,255
SB1:LD A,(HL)
INC HL
INC C
CP ENT
JR NZ,SB1
LD (BUFF_CURR),BC ; B=MAX
POP HL
LD A,C
CALL ADDHLA
LD A,AT
CALL PRINT
LD A,D
CALL PRINT
LD A,E
ADD C
JP PRINT

;  READ A $ FROM KEYBRD
;  --------------------
;  entry: HL=addr of buffer
;         B =max len of $
;         C =current len

;  retrn: C =new current len


GETSTRING:
LD E,C
GS0:LD A,"|"
CALL PRINT
GS1:CALL WAIT_KEY
LD D,A
LD A,BEL
CALL PRINT
LD A,D
CP DEL       ; "DELETE"
JR NZ,GS3
INC E
DEC E
JR Z,GS1
LD A,C
SUB E
JR Z,GS2
PUSH HL
PUSH DE
PUSH BC
LD B,A
LD A,CRL
CALL PRINT
LD A,(COORDS)
PUSH AF
LD A,B
CALL SUBHLA
LD D,H
LD E,L
DEC DE
GS11:LD A,DEL
CALL PRINT
LD A,(HL)
LD (DE),A
CALL PRINT
LD A,CRR
CALL PRINT
INC HL
INC DE
DJNZ GS11
LD A,DEL
CALL PRINT
LD A," "
LD (HL),A
CALL PRINT
POP AF
LD (COORDS),A
POP BC
POP DE
POP HL
LD A,CRL
CALL PRINT
JR GS21
GS2:LD A,D   ; DEL
CALL PRINT
LD A,D
CALL PRINT
GS21:DEC HL
DEC C
DEC E
JR GS0
GS3:CP ENT       ; "ENTER"
LD (HL),A
JR NZ,GS4
INC C
DEC C
JR Z,GS33
GS31:DEC HL
LD A,(HL)
CP " "
JR NZ,GS32
DEC C
JR NZ,GS31
DEC HL
GS32:INC HL
LD (HL),D    ; ENT
GS33:LD (IX+BUFF_CURR-V),C
LD A,CRL
CALL PRINT
LD A,"|"
CALL PRINT
LD A,CRL
JP PRINT     ; RET
GS4:CP CRL       ; "LEFT"
JR NZ,GS5
INC E
DEC E
JP Z,GS1
LD A,D
CALL PRINT
LD A,"|"
CALL PRINT
LD A,D
CALL PRINT
LD A,D
CALL PRINT
DEC E
JP GS0
GS5:CP CRR       ; "RIGHT"
JR NZ,GS6
LD A,E
CP C
JP Z,GS1
LD A,CRL
CALL PRINT
LD A,"|"
CALL PRINT
INC E
JP GS0
GS6:CP " "
JP C,GS1
LD A,C
CP B
JP Z,GS1
SUB E
JR Z,GS7
PUSH HL
PUSH DE
PUSH BC
LD B,A
LD C,A
LD A,(COORDS)
PUSH AF
LD D,H
LD E,L
GS61:DEC DE
LD A,(DE)
LD (HL),A
DEC HL
DJNZ GS61
LD B,C
GS62:INC HL
LD A,CRR
CALL PRINT
LD A,DEL
CALL PRINT
LD A,(HL)
CALL PRINT
DJNZ GS62
POP AF
LD (COORDS),A
LD A,DEL
CALL PRINT
LD A,"|"
CALL PRINT
POP BC
POP DE
POP HL
GS7:PUSH HL
LD A,C
SUB E
CALL NZ,SUBHLA
LD (HL),D
POP HL
LD A,CRL
CALL PRINT
LD A,"|"
CALL PRINT
LD A,CRL
CALL PRINT
LD A,D
CALL PRINT
INC HL
INC C
INC E
JP GS0


; BUBBLE SORT ALGORITHM
; ---------------------
;       p=1
; again:
;       c=0
;       FOR f=1 TO n-p
;         IF d(f+1)<d(f) THEN swap:c=1
;       NEXT f
;       p=p+1
;       IF c THEN again


SORT:
CALL FIRST_REC
JP NC,S_EMPTY
CALL FIND_END
LD HL,(REC_NUM)
INC H
DEC H
JR NZ,SO_1
DEC L          ; RET IF
RET Z          ; TOT RN =1
SO_1:LD B,H
LD C,L        ; BC'=TOT RN
LD DE,0       ; DE'=P
SO_L_1:
EXX ;
XOR A
LD R,A        ; b7,R=FLAG
LD HL,1
SO_L_2:PUSH HL
CALL CMP_?SWAP
POP HL
INC HL
EXX
LD H,B
LD L,C
AND A
SBC HL,DE
PUSH HL
EXX
POP DE
EX DE,HL
AND A
SBC HL,DE
EX DE,HL
JR NC,SO_L_2
EXX
INC DE
LD A,R
JP M,SO_L_1
RET
CMP_?SWAP:
CALL ED_F_RN    ; GET REC HL
CALL FND_SURNM
PUSH HL
LD HL,(REC_PTR)
LD (SO_PTR1),HL
LD HL,(REC_LEN)
LD (SO_LEN1),HL
CALL NEXT_REC
CALL FND_SURNM
PUSH HL
LD HL,(REC_PTR)
LD (SO_PTR2),HL
LD HL,(REC_LEN)
LD (SO_LEN2),HL
POP DE           ; CMP P2
POP HL           ; CMP P1
CI_1:LD A,(DE)
CP (HL)
JR C,SWAP
RET NZ
BIT 7,A       ; RET IF BOTH
RET NZ        ;[HAVE ENDED
INC HL
INC DE
JR CI_1
SWAP:
BIT 7,A
JR NZ,SWAP2
BIT 7,(HL)
RET NZ
SWAP2:
LD HL,(SO_PTR1)
LD DE,BUFFER
LD BC,(SO_LEN1); NB:NO NEED
LD B,0         ; TO SV EOR
LDIR 
LD HL,(SO_PTR2)
LD DE,(SO_PTR1)
LD BC,(SO_LEN2)
LD B,0
INC BC
LDIR 
LD HL,BUFFER
LD BC,(SO_LEN1)
LD B,0          ; " " " "
LDIR 
LD A,255
LD R,A       ; SET FLAG
RET

FND_SURNM:
LD HL,(REC_PTR)
PUSH HL
LD C,0
FS_1:LD A,(HL)
INC HL
INC C
BIT 7,A
JR Z,FS_1
AND 07FH        ; IF LAST CH
CP "."         ; ="." THEN
JR Z,FS_3      ; NOT SURNME
FS_2:DEC HL
DEC C           ; NO SPACE
JR Z,FS_3      ; FOUND
LD A,(HL)
CP " "
JR NZ,FS_2
INC HL
EX (SP),HL
FS_3:POP HL
RET


;  MENUS: DW msg addr,inp,jp/mu addr
;  ---------------------------------

MENUS:
DW MU_MAIN,6,MU1
MU1:
DW MU_LIST,2,MU11
DW MU_EDIT,3,MU12
DW MU_SRCH,0,SEARCH
DW MU_SORT,0,SORT
DW MU_SAVE,0,SAVE
DW MU_STAT,0,STATUS
MU11:
DW MU_LISTA,0,LISTA
DW MU_NULL,0,LISTB
MU12:
DW MU_EDIT_B,0,EDIT_U
DW MU_NULL,0,EDIT_A
DW MU_EDIT_B,0,EDIT_D
MU_NULL:
DB FIN
MU_MAIN:
DB PAP,BLACK
DB INK,RED
DB CLS
DB AT,22,10
DB INK,YELLOW
DB "FILE 1.0 ADDRESS BOOK"
DB BOX,48,172,148,14
DB INK,WHITE
DB PAP,BLUE
DB AT,5,0
DB TAB,11
DB S,19,T
DB " NAMES 'N' NUMBERS ",T
DB " ",REP,"_",17," ",T
DB S,19,T
DB S,3,"1: list",S,9,T
DB S,3,"2: edit",S,9,T
DB S,3,"3: search",S,7,T
DB S,3,"4: sort",S,9,T
DB S,3,"5: save",S,9,T
DB S,3,"6: status",S,7,T
DB S,19
DB BOX,64,40,119,87
DB FIN
MU_LIST:
DB PAP,RED
DB CSQ,10,6,11,11*8
DB AT,6,0
DB TAB,14
DB S,13,T
DB "  LIST FILE  ",T
DB "  ",REP,"_",10," ",T
DB S,13,T
DB S,3,"1:name",S,4,T
DB S,5,"addr",S,4,T
DB S,5,"tel",S,5,T
DB S,13,T
DB S,3,"2:name",S,4,T
DB S,5,"tel",S,5,T
DB S,13
DB BOX,80,48,87,87
DB FIN
MU_LISTA:
DB PAP,YELLOW
DB INK,BLACK
DB CSQ,6,7,19,14*8
DB AT,7,0
DB TAB,9
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24,T
DB S,24
DB BOX,49,57,149,109
DB FIN
MU_LISTAA:
DB PAP,YELLOW
DB INK,BLACK
DB CSQ,7,8,17,12*8
DB AT,8,10
DB "rec number:"
DB FIN
MU_EDIT:
DB PAP,GREEN
DB INK,BLACK
DB CSQ,10,6,11,8*8
DB AT,6,0
DB TAB,14
DB S,13,T
DB "  EDIT FILE  ",T
DB "  ",REP,"_",9,"  ",T
DB REP," ",13,T
DB "  1: alter",S,3,T
DB "  2: append  ",T
DB "  3: delete  ",T
DB S,13
DB BOX,80,48,87,63
DB FIN
MU_EDIT_B:
DB PAP,RED
DB INK,WHITE
DB CSQ,9,8,13,8*8
DB AT,8,0
DB TAB,12
DB S,17,T
DB S,3,"EDIT RECORD",S,3,T
DB S,3,REP,"_",11,S,3,T
DB S,17,T
DB "  enter rec num  ",T
DB S,17,T
DB S,5,"(",S,5,")",S,5,T
DB S,17
DB BOX,72,64,103,63
DB FIN
MU_EDIT_C:
DB PAP,RED
DB INK,WHITE
DB CSQ,24,10,7,5*8
DB AT,10,0
DB TAB,33
DB S,8,T
DB " OKAY?  ",T
DB S,8,T
DB " (Y/N)  ",T
DB S,8
DB BOX,192,80,55,39
DB FIN
MU_SRCH:
DB PAP,MAGENTA
DB CSQ,7,9,18,8*8
DB AT,9,0
DB TAB,10
DB S,23,T
DB S,5,"SEARCH FILE",S,7,T
DB " ",REP,"_",21," ",T
DB S,23,T,S,3
DB "enter search item"
DB S,3,T,S,23,T
DB S,3,"(",S,15
DB ")",S,3,T
DB S,23
DB BOX,56,72,143,63
DB FIN
MU_SRCH1:
DB PAP,RED
DB INK,WHITE
DB CSQ,24,10,7,5*8
DB AT,10,0
DB TAB,33
DB S,8,T
DB " N:next ",T
DB " E:edit ",T
DB " X:exit ",T
DB S,8
DB BOX,192,80,55,39
DB FIN
MU_SORT:
DB PAP,YELLOW
DB INK,RED
DB CSQ,7,11,17,3*8
DB AT,11,0
DB TAB,10
DB S,22,T
DB '  SORTING BY SURNAME '
DB " ",T
DB S,22
DB BOX,56,88,135,23
DB FIN
RET
MU_SAVE:
DB PAP,CYAN
DB INK,BLACK
DB CSQ,9,11,18,3*8
DB AT,11,0
DB TAB,12
DB S,23,T
DB '  SAVING ... "ADDR_BK"  ',T
DB S,23
DB BOX,72,88,143,23
DB FIN
RET
MU_STAT:
DB PAP,WHITE
DB INK,BLUE
DB CSQ,6,9,19,8*8
DB AT,9,0
DB TAB,8
DB S,25,T
DB S,7,"FILE STATUS",S,7,T
DB " ",REP,"_",23," ",T
DB S,25,T
DB S,25,T
DB S,25,T
DB S,25,T
DB S,25
DB BOX,49,73,149,61
DB FIN



;  PRINT 1.4 : 42x24
;  -----------------
;  A = CHR
;  corrupts : af af' bc' de' hl'

PRINT:
DI
EXX
PUSH IY
LD C,(IX+ST_NUM-V)
DEC C
JP M,PR_ALL
LD HL,(PR_PTR)
LD (HL),A
INC HL
LD (PR_PTR),HL
DEC (IX+ST_NUM-V)
LD HL,PR_END
PUSH HL
RET NZ
LD HL,(PR_JMP)
JP (HL)
PR_ALL:CALL PR_CHR
PR_END:POP IY
EXX
EI
RET
PR_CHR:
CP 080H
JR C,PR_GRX
CP 0A0H
JR C,PR_TOK
PR_GRX:
LD H,0
LD L,A
ADD HL,HL
CP " "
JR NC,PR_CHS
LD DE,CONADDR
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD HL,CONLEN
CALL ADDHLA
LD A,(HL)
LD (IX+ST_NUM-V),A
LD HL,PR_MEM
LD (PR_PTR),HL
EX DE,HL
LD (PR_JMP),HL
OR A
RET NZ
JP (HL)
PR_TOK:
AND 31
LD B,A
LD HL,PKEY_DAT
OR A
JR Z,PTOK1
PTOK0:LD A,(HL)
INC A
RET Z       ; END TOKENS
CALL ADDHLA
DJNZ PTOK0
PTOK1:LD B,(HL)
PTOK2:INC HL
LD A,(HL)
PUSH HL
PUSH BC
CALL PR_CHR
POP BC
POP HL
DJNZ PTOK2
RET
PR_CHS:
ADD HL,HL
ADD HL,HL
LD DE,CHARADD-256
ADD HL,DE
PUSH HL
LD A,(COORDS)
CP RHS
CALL Z,ENTER
LD DE,(COORDS)
CALL PRCALC
PUSH HL
POP IY
EX (SP),HL  ; IY=DF HL=CHR

LD DE,PR_COL
PUSH DE
LD A,C
OR A
JP Z,PR_C_00
CP 2
JP C,PR_C_01
JP Z,PR_C_10
JP PR_C_11
PR_COL:
POP HL
CALL ATCALC
LD A,C
OR A
LD A,(CURCOL)
LD (HL),A
JP PE,PRC1
INC L
LD (HL),A
PRC1:
JP CUR_RI
PR_C_00:
LD B,8
LD A,(HL)
XOR (IY+0)
LD (IY+0),A
INC L
INC YH
DJNZ PR_C_00+2
RET
PR_C_01:
AND A
LD B,8
LD A,(HL)
LD E,0
ADD A
RL E
ADD A
RL E
XOR (IY+1)
LD (IY+1),A
LD A,(IY+0)
XOR E
LD (IY+0),A
INC L
INC YH
DJNZ PR_C_01+3
RET
PR_C_10:
LD B,8
LD A,(HL)
LD E,0
ADD A
RL E
ADD A
RL E
ADD A
RL E
ADD A
RL E
XOR (IY+1)
LD (IY+1),A
LD A,(IY+0)
XOR E
LD (IY+0),A
INC L
INC YH
DJNZ PR_C_10+2
RET
PR_C_11:
LD B,8
LD A,(HL)
RRCA 
RRCA 
XOR (IY+0)
LD (IY+0),A
INC L
INC YH
DJNZ PR_C_11+2
RET
REPEAT:
LD BC,(PR_MEM)
REPL:LD A,C
PUSH BC
CALL PR_CHR
POP BC
DJNZ REPL
NULL:
RET
MSPACE:
LD B,(IX+PR_MEM-V)
MSP1:PUSH BC
LD A," "
CALL PR_CHR
POP BC
DJNZ MSP1
RET
BELL:;           TONE OF 880Hz
LD A,R
DI
PUSH AF
LD A,(BORDCR)
LD BC,99
BEEP0:OUT (254),A
DEC C
JR NZ,BEEP1
XOR 24
LD C,99
BEEP1:DJNZ BEEP0
AND 0E7H
OUT (254),A
POP AF
JP PO,BEEP_IOFF
EI
BEEP_IOFF:
RET 
CUR_LE:
LD HL,COORDS
DEC (HL)
LD A,(HL)
CP LHS-1
RET NZ
LD (HL),RHS-1
JR CUR_UP
CUR_RI:
LD HL,COORDS
INC (HL)
LD A,(HL)
CP RHS
RET NZ
LD (HL),LHS
JR CUR_DO
CUR_DO:
LD HL,COORDS+1
INC (HL)
LD A,(HL)
CP BOT
RET NZ
LD (HL),TOP
RET
CUR_UP:
LD HL,COORDS+1
DEC (HL)
LD A,(HL)
CP TOP-1
RET NZ
LD (HL),BOT-1
RET
CLS_SCRN:
LD HL,DFILE
LD DE,DFILE+1
LD BC,6144
LD (HL),L
LDIR 
LD BC,767
LD A,(CURCOL)
LD (HL),A
LDIR 
LD (COORDS),BC
LD A,(BORDCR)
OUT (254),A
RET
ENTER:
LD (IX+COORDS-V),0
JP CUR_DO
CHNINK:
LD A,(CURCOL)
AND 0F8H
OR (IX+PR_MEM-V)
LD (CURCOL),A
RET
CHNPAP:
LD A,(CURCOL)
AND 0C7H
LD B,A
LD A,(PR_MEM)
ADD A
ADD A
ADD A
OR B
LD (CURCOL),A
RET
CHNBCOL:
LD A,(PR_MEM)
OUT (254),A
LD (BORDCR),A
RET
CHNBGT:
RES 6,(IX+CURCOL-V)
BIT 0,(IX+PR_MEM-V)
RET Z
SET 6,(IX+CURCOL-V)
RET
CHNCOD:
LD HL,(PR_MEM)
LD A,H
LD H,L
LD L,A
LD (COORDS),HL
RET
CHNTAB:
LD A,(PR_MEM)
ADD A
RL (IX+TABX-V)
RRA
LD (TABX),A ; NB:b7=large
JR HMX_1
HOMETAB:
CALL ENTER
LD A,(TABX)
AND 7FH
HMX_1:
LD (COORDS),A
RET
DELETE:
CALL CUR_LE
LD DE,(COORDS)
CALL PRCALC
EX DE,HL
LD HL,DELTBL
LD B,0
RLC C
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD L,4
DL1:LD A,(DE)
AND C
LD (DE),A
INC E
LD A,(DE)
AND B
LD (DE),A
INC D
LD A,(DE)
AND B
LD (DE),A
DEC E
LD A,(DE)
AND C
LD (DE),A
INC D
DEC L
JR NZ,DL1
RET
DELTBL:
DB 3,0FFH,0FCH,0FH
DB 0F0H,03FH,0C0H,0FFH
DRAW_BOX:
LD HL,(PR_MEM)
LD BC,(PR_MEM+2)
PUSH BC
DB1:CALL PLOT
INC L
DEC C
JR NZ,DB1
DB2:CALL PLOT
INC H
DEC B
JR NZ,DB2
POP BC
DB3:CALL PLOT
DEC L
DEC C
JR NZ,DB3
DB4:CALL PLOT
DEC H
DEC B
JR NZ,DB4
RET
CLR_SQR:
LD DE,(PR_MEM)
LD A,D
RRCA
RRCA
RRCA
AND 224
OR E
LD L,A
LD A,D
AND 24
OR DFILE/256
LD H,A
LD BC,(PR_MEM+2)
LD E,C
CS0:LD D,L
CS1:LD (HL),0
INC L
DEC C
JR NZ,CS1
LD C,E
LD L,D
INC H
LD A,H
AND 7
JP NZ,CS2
LD A,L
ADD 32
LD L,A
JR C,CS2
LD A,H
SUB 8
LD H,A
CS2:DJNZ CS0
RET
PRCALC:
LD A,D
RRCA
RRCA
RRCA
AND 224
LD L,A
LD A,E
AND 3
LD C,A
LD A,E
ADD A
ADD E
AND 0FCH
RRCA 
RRCA 
OR L
LD L,A
LD A,D
AND 24
OR DFILE/256
LD H,A
RET
ATCALC:
LD A,H
RRCA
RRCA
RRCA
AND 3
OR AFILE/256
LD H,A
RET

;  PRINT HL IN DEC,SUPRESS LEADING 0's
;  -----------------------------------

PR_DEC:
PUSH HL
PUSH AF
PUSH BC
PUSH DE
LD C,0
LD DE,10000
CALL PDC0
LD DE,1000
CALL PDC0
LD DE,100
CALL PDC0
LD DE,10
CALL PDC0
LD A,L
ADD "0"
CALL PRINT
POP DE
POP BC
POP AF
POP HL
RET 
PDC0:XOR A
DEC A       ; A=255
PDC1:SBC HL,DE
INC A
JR NC,PDC1
ADD HL,DE
CP C
RET Z
ADD "0"
DEC C
CALL PRINT
RET 

CONLEN:
DB 0,0,0,2,1 ;  0-4
DB 0,0,0,0,0 ;  5-9
DB 0,0,0,0,0 ; 10-14
DB 0,1,1,1,1 ; 15-19
DB 0,0,2,1,0 ; 20-24
DB 0,0,0,4,4 ; 25-29
DB 0,0       ; 30-31
CONADDR:
DW NULL      ; 0
DW 0         ; 1
DW 0         ; 2
DW REPEAT    ; 3,chr,n
DW MSPACE    ; 4,n
DW 0         ; 5
DW 0         ; 6
DW BELL      ; 7
DW CUR_LE    ; 8
DW CUR_RI    ; 9
DW CUR_DO    ; 10
DW CUR_UP    ; 11
DW CLS_SCRN  ; 12
DW ENTER     ; 13
DW 0         ; 14
DW 0         ; 15
DW CHNINK    ; 16,col
DW CHNPAP    ; 17,col
DW CHNBCOL   ; 18,col
DW CHNBGT    ; 19,on/off
DW 0         ; 20
DW 0         ; 21
DW CHNCOD    ; 22,y,x
DW CHNTAB    ; 23,x
DW HOMETAB   ; 24
DW DELETE    ; 25
DW NULL      ; 26 EXT
DW NULL      ; 27 BRK
DW DRAW_BOX  ; 28,x,y,w,h
DW CLR_SQR   ; 29,x,y,w,h
DW 0         ; 30
DW 0         ; 31,nn,n

;DATA USED BY PR_TOK

;    TOKEN LENGTH,TOKEN    ; ASCII HEX

PKEY_DAT:
DB 2,"  "      ; 80H
DB FIN

NUL:EQU 0
REP:EQU 3
MSP:EQU 4
S:EQU MSP
BEL:EQU 7
CRL:EQU 8
CRR:EQU 9
CRD:EQU 10
CRU:EQU 11
CLS:EQU 12
ENT:EQU 13
INK:EQU 16
PAP:EQU 17
BCOL:EQU 18
BGT:EQU 19
AT:EQU 22
TAB:EQU 23
HMX:EQU 24
T:EQU HMX
DEL:EQU 25
EXT:EQU 26
BRK:EQU 27
BOX:EQU 28
CSQ:EQU 29
LD:EQU 31
LHS:EQU 0
RHS:EQU 42
TOP:EQU 0
BOT:EQU 24
FIN:EQU 255


;  KEYBOARD ROUTINE (KEYCHQ)
;  ----------------
;  retrn: A=Ascii of key(s) pressed
;         No carry if key O.K.
;         carry if nr key/>2 keys

WAIT_KEY:
CALL KEYBRD
JR C,WAIT_KEY
WK2:CALL KEYBRD
JR NC,WK2
RET
KEYBRD:
EXX
XOR A      ; PAUSE TO
DEC A      ; SUPPRESS
JR NZ,$-1 ; KEY BOUNCE
CALL KEYCHQ
CCF
EXX
RET
KEYCHQ:
CALL KEYSCN
LD A,D
CP E
JR Z,NOKEY
LD HL,KTBL2
OR A        ; CAPS
JR Z,GETKEY
LD HL,KTBL3
CP 36       ; SYMB
JR Z,GETKEY
LD HL,KTBL1
LD A,E
OR A
JR Z,NOKEY
CP 36
JR Z,NOKEY
GETKEY:LD A,E
ADD L
LD L,A
ADC H
SUB L
LD H,A
LD A,(HL)
CP 1
RET
NOKEY:
LD A,255
SCF
RET
KEYSCN:
LD L,0
LD DE,0FFFFH
LD BC,0FEFEH
KEY1:IN A,(C)
CPL
AND 01FH
JR Z,KEY4
LD H,A
LD A,255
KEY2:INC D
JR NZ,KEY5
KEY3:SRL H
INC A
JR NC,KEY3
ADD L
LD D,E
LD E,A
SUB L
INC H
DEC H
JR NZ,KEY2
KEY4:LD A,L      ; row nr
ADD 5
LD L,A
RLC B
JR C,KEY1
LD A,D
INC A   ; if D= no key
RET Z
CP 1   ; CAPS SHIFT +1
RET Z
CP 37  ; SYMB SHIFT +1
RET Z
LD A,E
LD E,D
LD D,A
CP 36  ; SYMB SHIFT
RET Z
KEY5:LD DE,0FFFFH  ; no key
RET

; NO SHIFTS
KTBL1:DB "_ZXCVASDFGQWERT"
DB "1234509876POIUY"
DB ENT,"LKJH _MNB"

; CAPS SHIFT
KTBL2:DB "_zxcvasdfgqwert"
DB 0,0,0,0,CRL,DEL
DB 0,CRR,CRU,CRD
DB "poiuy",ENT,"lkjh"
DB EXT,BRK,"mnb"

; SYMB SHIFT
KTBL3:DB "_:`?/~|\{}",0,BEL,0
DB "<>!@#$%_)('&",'"'
DB ";][",ENT,"=+-^ _.,*"

ADDHLA:
ADD L
LD L,A
RET NC
INC H
RET
SUBHLA:
NEG
ADD L
LD L,A
RET C
DEC H
RET
STKPRT:
EX (SP),HL
CALL PRTMSG
EX (SP),HL
RET
PRTMSG:
LD A,(HL)
INC HL
CP FIN
RET Z
CALL PRINT
JR PRTMSG

;  PLOT : H=y L=x
;  --------------
PLOT:
LD A,H
CP 192
RET NC
PUSH HL
CALL PXCALC
OR (HL)
LD (HL),A
POP HL
RET
PXCALC:
LD E,L
LD A,H
ADD A
ADD A
AND 0E0H
SRL L
SRL L
SRL L
OR L
LD L,A
LD A,H
AND 7
LD D,A
LD A,H
SRL A
SRL A
SRL A
AND 018H
OR D
ADD DFILE/256
LD H,A
LD A,E
AND 7
LD DE,PLOTDA
OR E
LD E,A
LD A,(DE)
RET

;  HL = HL * BC
;  ------------
MULTIPLY:
PUSH DE
PUSH BC
EX DE,HL
LD HL,0
ML1:SRL B
RR C
JR NC,ML2
ADD HL,DE
ML2:SLA E
RL D
LD A,B
OR C
JR NZ,ML1
POP BC
POP DE
RET

;  HL = HL / BC
;  ------------
DIVIDE:
PUSH DE
PUSH BC
LD A,16
LD DE,0
DV1:ADD HL,HL
RL E
RL D
EX DE,HL
PUSH HL
SBC HL,BC
POP HL
JR C,DV2
INC DE
SBC HL,BC
DV2:EX DE,HL
DEC A
JR NZ,DV1
POP BC
POP DE
RET

;  VARIABLES
;  ---------
V:
ST_NUM:DB 0
COORDS:DW 0
CURCOL:DB BRIGHT+WHITE
BORDCR:DB BLACK
TABX:DB 0
PR_PTR:DW PR_MEM
PR_MEM:DW 0,0
PR_JMP:DW 0
FILESTART:DW 0 ; START OF 1ST REC
REC_PTR:DW 0 ; PTR TO CURR REC
REC_LEN:DB 0 ; CURR REC LEN
REC_NUM:DW 0 ; CURR REC NUM
F_COORDS:DW 0A0AH,0A0CH,0A0DH,0A0EH
DW 0A0FH,0A10H,0A11H,0A13H
NEW_REC_D:DB DEF,DEF,DEF,DEF
DB DEF,DEF,DEF,DEF
DB EOR,EOF
SO_PTR1:DW 0
SO_LEN1:DW 0
SO_PTR2:DW 0
SO_LEN2:DW 0
BUFF_CURR:DB 0
BUFF_MAX:DB 0
BUFFER:DS BUFF_SIZE

CHA:EQU $&7
DS 8-CHA ;„ $&7=000b

PLOTDA:DB 128,64,32,16,8,4,2,1

CHARADD:
DB 000,000,000,000
DB 000,000,000,000 ; SPC
DB 000,032,032,032
DB 032,000,032,000 ; !
DB 000,080,080,000
DB 000,000,000,000 ; "
DB 000,080,248,080
DB 080,248,080,000 ; #
DB 032,120,160,112
DB 040,168,112,032 ; $
DB 008,200,208,032
DB 064,152,152,000 ; %
DB 000,032,080,032
DB 088,144,104,000 ; &
DB 000,016,032,000
DB 000,000,000,000 ; '
DB 000,016,032,032
DB 032,032,016,000 ; (
DB 000,064,032,032
DB 032,032,064,000 ; )
DB 000,032,168,112
DB 112,168,032,000 ; *
DB 000,032,032,248
DB 032,032,000,000 ; +
DB 000,000,000,000
DB 000,032,064,000 ; ,
DB 000,000,000,248
DB 000,000,000,000 ; -
DB 000,000,000,000
DB 000,000,064,000 ; .
DB 000,008,008,016
DB 032,064,128,128 ; /
DB 000,112,136,152
DB 168,200,112,000 ; 0
DB 000,032,096,032
DB 032,032,112,000 ; 1
DB 000,112,136,008
DB 112,128,248,000 ; 2
DB 000,112,136,048
DB 008,136,112,000 ; 3
DB 000,016,048,080
DB 144,248,016,000 ; 4
DB 000,248,128,240
DB 008,136,112,000 ; 5
DB 000,112,128,240
DB 136,136,112,000 ; 6
DB 000,248,008,016
DB 032,064,064,000 ; 7
DB 000,112,136,112
DB 136,136,112,000 ; 8
DB 000,112,136,136
DB 120,008,112,000 ; 9
DB 000,000,032,000
DB 000,032,000,000 ; :
DB 000,000,032,000
DB 000,032,064,000 ; ;
DB 000,032,064,128
DB 064,032,000,000 ; <
DB 000,000,248,000
DB 248,000,000,000 ; =
DB 000,032,016,008
DB 016,032,000,000 ; >
DB 000,112,136,016
DB 032,000,032,000 ; ?
DB 000,112,152,168
DB 184,128,120,000 ; @
DB 000,032,080,136
DB 248,136,136,000 ; A
DB 000,240,136,240
DB 136,136,240,000 ; B
DB 000,112,136,128
DB 128,136,112,000 ; C
DB 000,224,144,136
DB 136,144,224,000 ; D
DB 000,248,128,240
DB 128,128,248,000 ; E
DB 000,248,128,240
DB 128,128,128,000 ; F
DB 000,112,136,128
DB 184,136,112,000 ; G
DB 000,136,136,248
DB 136,136,136,000 ; H
DB 000,112,032,032
DB 032,032,112,000 ; I
DB 000,008,008,008
DB 008,136,112,000 ; J
DB 000,136,144,160
DB 224,144,136,000 ; K
DB 000,128,128,128
DB 128,128,248,000 ; L
DB 000,136,216,168
DB 136,136,136,000 ; M
DB 000,240,136,136
DB 136,136,136,000 ; N
DB 000,112,136,136
DB 136,136,112,000 ; O
DB 000,240,136,136
DB 240,128,128,000 ; P
DB 000,112,136,136
DB 168,152,112,008 ; Q
DB 000,240,136,136
DB 240,144,136,000 ; R
DB 000,112,128,112
DB 008,136,112,000 ; S
DB 000,248,032,032
DB 032,032,032,000 ; T
DB 000,136,136,136
DB 136,136,112,000 ; U
DB 000,136,136,136
DB 136,080,032,000 ; V
DB 000,136,136,168
DB 168,216,136,000 ; W
DB 000,136,080,032
DB 032,080,136,000 ; X
DB 000,136,136,080
DB 032,032,032,000 ; Y
DB 000,248,016,032
DB 064,128,248,000 ; Z
DB 000,000,032,096
DB 248,096,032,000 ; [
DB 000,000,032,032
DB 248,112,032,000 ; \
DB 000,000,032,048
DB 248,048,032,000 ; ]
DB 000,000,032,112
DB 248,032,032,000 ; ^
DB 000,000,000,000
DB 000,000,000,252 ; _
DB 000,048,072,064
DB 240,064,248,000 ; `
DB 000,000,112,008
DB 120,136,120,000 ; a
DB 000,128,128,240
DB 136,136,240,000 ; b
DB 000,000,112,136
DB 128,136,112,000 ; c
DB 000,008,008,120
DB 136,136,120,000 ; d
DB 000,000,112,136
DB 240,128,120,000 ; e
DB 000,048,064,096
DB 064,064,064,000 ; f
DB 000,000,120,136
DB 136,120,008,112 ; g
DB 000,128,128,240
DB 136,136,136,000 ; h
DB 000,032,000,096
DB 032,032,112,000 ; i
DB 000,016,000,016
DB 016,016,016,096 ; j
DB 000,128,128,160
DB 192,160,144,000 ; k
DB 000,064,064,064
DB 064,064,048,000 ; l
DB 000,000,080,168
DB 168,168,168,000 ; m
DB 000,000,240,136
DB 136,136,136,000 ; n
DB 000,000,112,136
DB 136,136,112,000 ; o
DB 000,000,240,136
DB 136,240,128,128 ; p
DB 000,000,112,136
DB 136,120,008,012 ; q
DB 000,000,048,072
DB 064,064,064,000 ; r
DB 000,000,112,128
DB 112,008,240,000 ; s
DB 000,032,112,032
DB 032,040,016,000 ; t
DB 000,000,136,136
DB 136,136,112,000 ; u
DB 000,000,136,136
DB 136,080,032,000 ; v
DB 000,000,168,168
DB 168,168,080,000 ; w
DB 000,000,136,080
DB 032,080,136,000 ; x
DB 000,000,136,136
DB 136,120,008,112 ; y
DB 000,000,248,016
DB 032,064,248,000 ; z
DB 000,056,112,224
DB 112,056,000,000 ; {
DB 248,248,248,248
DB 248,248,248,248 ; |
DB 000,224,112,056
DB 112,224,000,000 ; }
DB 000,000,000,064
DB 168,016,000,000 ; ~
DB 120,132,180,164
DB 164,180,132,120 ; (c)


; FILE FORMAT: file msg
;              FIN
;              rec 1
;              EOR
;              rec 2
;              EOR
;              rec 3
;              EOR
;              .
;              .
;              rec n
;              EOR
;              EOF
;
; REC FORMAT : field 1 +DEF (name)
;              field 2 +DEF (add1)
;              field 3 +DEF (add2)
;              field 4 +DEF (add3)
;              field 5 +DEF (add4)
;              field 6 +DEF (add5)
;              field 7 +DEF (add6)
;              field 8 +DEF (telp)


SAVE_FROM:
DB "FILE 1.0 ADDRESS BOOK"
DB FIN

DB "FIRST MIDDLE NAM","E"+DEF
DB "82 MICRO DRIV","E"+DEF
DB "SPECTRUMTO","N"+DEF
DB DEF,DEF,DEF,DEF
DB "061 345 678","9"+DEF
DB EOR

; company name ends with "."
DB "BIG COMPANY","."+DEF
DB "1 HALL LAN","E"+DEF
DB "DOWN TOW","N"+DEF
DB "MANCHESTE","R"+DEF
DB "M2 0A","A"+DEF
DB DEF,DEF
DB "061 123 432","1"+DEF
DB EOR

DB EOF

THE:END

