;
PAGE 58,132
TITLE ***** JUN.ASM *****
;
;**************************************************
;
; JUN.ASM
;
; Copyright
1987.08.30 by M.ADACHI
;
; JUN
xx>JUNDATA.OUT
;
;
OUTPUT:for File ( Whth N:CRT )
;
;**************************************************
;
.XALL
SUBTTL " MACROS "
INCLUDE
ASMLIB.F
.LIST
;
DP_SKIP
MACRO SKP,TAB,JMPTBL
DEC SKP
JNZ
JMPTBL
MOV
SKP,TAB
ENDM
;
CRTDSP MACRO N,TBL
LOCAL L1xxxx
irp
reg,<es,si,di,ax,cx>
push reg
endm
MOV
AX,VRAM
MOV ES,AX
mov cx,N
mov si,0
mov di,0
L1xxxx:
mov
al,[&TBL+si]
mov ES:[di],al
inc si
inc di
inc di
loop L1xxxx
irp
reg,<cx,ax,di,si,es>
pop reg
endm
ENDM
;
DSKSPC MACRO DRIVE
MOV
DL,DRIVE
MOV
AH,36H
INT 21H
ENDM
;
CONV2 MACRO HEX,BUF ; 2
byte ==> 4 ¹À BCD
PUSH AX
MOV
AX,HEX
hex_asc AH,BUF
hex_asc AL,BUF+2
POP AX
ENDM
;
SUBTTL " DATA "
PAGE +
CR EQU 0DH
LF EQU 0AH
TAB5 EQU 5
TAB50 EQU 50
TAB100 EQU 100
VRAM EQU 0A000H
MAX = 8191
;
DATA SEGMENT
ORG 5CH
FCB DB 36 DUP(?)
DTA DB 128 DUP(?)
;
;DEF
INT A-Z
;DIM A(MAX),B(MAX*2)
A DW MAX+1 DUP(?) ; A(MAX)
B DW MAX*2+2
DUP(?) ; B(MAX*2)
;
C DW ?
D DW ?
CHECK DW ?
;
F DW ?
G DW ?
H DW ?
I DW ?
J DW ?
L DW ?
M DW ?
N DW ?
SKP_1 DW ?
SKP_2 DW ?
SKP_3 DW ?
DECTBL DW ?
DEC10 DW ?
ZEROCH DW ?
FCBSEG DW ?
F_FULL DB 00H
TM_H DB ?,?,'h$'
TM_M DB ?,?,'m$'
TM_S DB ?,?,'s$'
TM_MS DB ?,?,'0ms$'
DSPTBL DB 30 DUP(20H),'$'
MES1 DB '¼Þݶݽ³ É ¹²»Ý
¦ ¼Ï½',CR,LF,'$'
;
DATA ENDS
;
STACK1 SEGMENT STACK
DW
200 DUP(?)
TOPS LABEL WORD
STACK1 ENDS
;
SUBTTL " MAIN PROGRAM "
PAGE +
;==================================================
; MAIN
;==================================================
;
CODE SEGMENT BYTE
ASSUME
CS:CODE,DS:DATA,ES:DATA,SS:STACK1
MAIN:
CLI
MOV
AX,STACK1
MOV SS,AX
MOV
SP,OFFSET TOPS
STI
;
MOV AX,ES
MOV
FCBSEG,AX ; FCB & DTA segment save
MOV
AX,DATA
MOV DS,AX
;
CALL INIT ;
GOSUB *INIT (time$=clear, N-input)
print MES1
;
MAIN0:
CMP BYTE
PTR F_FULL,0FFH
JZ
MAIN_END
CALL JUN_CAL ; GOSUB *JUN.CAL
CMP D,0
JNE
MAIN1 ; IF
D<>0 THEN GOTO *MAIN1
;
CALL
JUN_CHK ; GOSUB *JUN.CHK
CMP
CHECK,0
JNE
MAIN1 ; IF
CHECK<>0 THEN GOTO *MAIN1
MOV
ZEROCH,0
;
MOV AX,N
CALL
DP_DEC ; print N
;
CALL V_DISP
;
MOV
AL,09H ; Tab
CALL CHROUT
CALL
TIME_DISP ; print Time$
CALL CRLF
;
MOV
SKP_1,TAB5
MOV
SKP_2,TAB50
MOV
SKP_3,TAB100
CALL LP
; GOSUB *LP
CALL CRLF
;
MAIN1: INC N
; N=N+1
CMP N,MAX
JL
MAIN0 ; IF
N<MAX THEN GOTO *MAIN0
;
MAIN_END:
MOV
AH,4CH
MOV AL,0
INT 21H
;
SUBTTL " SUBROUTINES (1) "
PAGE +
;==================================================
; ¼®· ¾¯Ã²
;
;==================================================
;
INIT PROC NEAR
CALL
TIMECL ; TIME=00:00:00.00
call n_input
RET
; RETURN
INIT ENDP
;
;==================================================
; ¼Þݶݽ³ É
º³Î ¹²»Ý
;
A()=((10^N)-1)/N D=±ÏØ
;==================================================
;
JUN_CAL
PROC NEAR
MOV
D,0
; D=0
;
MOV
J,1 ;
FOR J=1
FOR1: PUSH AX
MOV AX,N
DEC AX
CMP
J,AX
; TO N-1
POP AX
JG
NEXT1
;
MOV SI,J
SHL
SI,1
; SI=J*2 (Word)
;
MOV AX,D
MOV DX,0
MOV BX,10
MUL
BX
; (DX:AX=D*10)
ADD AX,9
ADC
DX,0
; (DX:AX=D*10+9)
DIV
N
; (AX=INT((D*10+9)/N)) (DX=(D*10+9) MOD N)
MOV
OFFSET A[SI],AX ; A(J)=INT((D*10+9)/N)
MOV
D,DX
; D =(D*10+9) MOD N
;
INC
J
; NEXT J
JMP
SHORT FOR1
NEXT1: RET
; RETURN
;
JUN_CAL
ENDP
;
PAGE
;==================================================
; ¼Þݶݽ³ É
CHECK
;
;==================================================
;
JUN_CHK
PROC NEAR
MOV
CHECK,0 ; CHECK=0
MOV M,2
; M =2 ( to L )
MOV AX,N
DEC AX
MOV
L,AX
; L =N-1
;
J1: MOV F,0
; F =0
;
MOV AX,L
MOV
I,AX
; FOR I=L
FOR2: CMP I,1
; TO 1 (STEP -1)
JL
NEXT2
;
MOV SI,I
SHL SI,1
;
MOV
AX,OFFSET A[SI] ; (AX=A(I))
MUL
M
; (AX=A(I)*M)
ADD
AX,F
; (AX=A(I)*M+F)
MOV
C,AX
; C=A(I)*M+F
MOV DX,0
MOV BX,10
DIV
BX
; (DX:AX)/10
MOV
F,AX
; F=C\10
MOV
OFFSET B[SI],DX ; B(I)=C MOD 10
MOV BX,L
SHL
BX,1
; (AX=L*2)
MOV
OFFSET B[SI+BX],DX
; B(I+L)=B(I)
DEC I
JMP
SHORT FOR2 ; NEXT I
;
NEXT2: MOV G,1
MOV H,0
;
J2: MOV BX,G
SHL BX,1
MOV
AX,OFFSET A[BX]
MOV BX,G
ADD BX,H
SHL BX,1
CMP
AX,OFFSET B[BX]
JE
J3
; IF A(G)=B(G+H) THEN GOTO *J3
;
MOV G,1
INC H
MOV AX,H
CMP AX,L
JL
J3
; IF H<L THEN GOTO *J3
;
MOV
CHECK,1
RET
;
J3: MOV AX,G
CMP AX,L
JL J4
; IF G<L THEN GOTO *J4
MOV AX,M
CMP AX,L
JL
J5
; IF M<L THEN GOTO *J5
RET
;
J4: INC G
; G=G+1
JMP
SHORT J2 ; GOTO *J2
;
J5: INC M
; M=M+1
JMP
J1
; GOTO *J1
;
JUN_CHK
ENDP
;
PAGE
;==================================================
; N É ±À² ¦
²Ý»Â
;
PRINT DEC(AX) [ AX=HEX ==> DEC Disp]
;==================================================
;
DP_DEC PROC NEAR
MOV
ZEROCH,0
PUSH SI
push_abcd
;
MOV SI,0
MOV
DECTBL,10000
MOV
DEC10,10
;
MOV CX,4
FORDEC:
PUSH CX
;
DPDEC0:
MOV BL,0
DPDEC1:
CMP
AX,DECTBL ;
JZ
DPDEC2
JL
DPDEC3
SUB
AX,DECTBL
INC BL
JMP
DPDEC1 ;
;
DPDEC2:
SUB AX,DECTBL
INC BL
DPDEC3:
CALL PRTDEC
;
PUSH AX
MOV DX,0
MOV
AX,DECTBL
DIV DEC10
MOV
DECTBL,AX
POP AX
;
POP CX
LOOP FORDEC
;
CALL
PRINT_AL ; print
MOV
OFFSET DSPTBL+[SI],AL
;
pop_abcd
POP SI
RET
;
PRTDEC:
CMP BL,0
JZ
PRTDEC1
PRTDEC2:
PUSH AX
MOV AL,BL
CALL PRINT_AL
MOV
OFFSET DSPTBL+[SI],AL
INC SI
MOV
ZEROCH,1
POP AX
RET
PRTDEC1:
CMP
ZEROCH,0
JNZ
PRTDEC2
RET
;
DP_DEC ENDP
;
;==================================================
; VRAM
DISPLAY
; DSPTBL
;==================================================
;
V_DISP PROC NEAR
IRP
reg,<AX,BX,CX,DX>
PUSH reg
ENDM
;
MOV
AL,00H
dskspc AL
MUL BX
MUL CX
MOV BYTE
PTR F_FULL,0H
CMP
DX,00H
JNZ
FULCH1
CMP
AX,01H
JG
FULCH1
MOV BYTE
PTR F_FULL,0FFH
FULCH1:
conv2 DX,DSPTBL+10
conv2 AX,DSPTBL+14
crtdsp 20,DSPTBL,VRAM
;
IRP
reg,<DX,CX,BX,AX>
POP reg
ENDM
RET
;
V_DISP ENDP
;
PAGE +
;==================================================
; ¼Þݶݽ³ É
²Ý»Â
;
PRINT A()
;==================================================
;
LP PROC NEAR
MOV I,1
FORL1:
PUSH AX
MOV AX,N
DEC AX
CMP I,AX
POP AX
JG
NEXTL1
;
MOV SI,I
SHL SI,1
MOV
AX,OFFSET A[SI]
CALL PRINT_AL
CALL SKIP
;
INC I
JMP
SHORT FORL1
;
NEXTL1:
CALL CRLF
RET
;
LP ENDP
;
;--------------------------------------------------
; PRINT
SKIP
;--------------------------------------------------
;
SKIP PROC NEAR
dp_skip SKP_1,TAB5,SKIP1
MOV AL,'
'
CALL CHROUT
SKIP1: dp_skip SKP_2,TAB50,SKIP2
MOV AL,'
'
CALL CHROUT
SKIP2: dp_skip SKP_3,TAB100,SKIP3
CALL CRLF
SKIP3: RET
SKIP ENDP
;
SUBTTL " SUBROUTINE (2) "
;
PAGE +
;--------------------------------------------------
; CHR$(AL)
OUTPUT
;--------------------------------------------------
;
CHROUT PROC NEAR
MOV AH,02
MOV DL,AL
INT 21H
RET
CHROUT ENDP
;
;--------------------------------------------------
; PRINT
(AL) ... AL=0 to F
;--------------------------------------------------
;
PRINT_AL
PROC NEAR
ADD
AL,'0'
CMP
AL,'9'
JLE
PR_AL1
ADD AL,7
PR_AL1:
CALL CHROUT
RET
PRINT_AL
ENDP
;
;--------------------------------------------------
; PRINT
HEX(AL) ... AL=00 to FF
;--------------------------------------------------
;
DPHEX_AL
PROC NEAR
PUSH AX
AND
AL,0F0H
SHR AL,1
SHR AL,1
SHR AL,1
SHR AL,1
CALL PRINT_AL
POP AX
AND
AL,0FH
CALL PRINT_AL
RET
DPHEX_AL ENDP
;
;--------------------------------------------------
; PRINT
CR;LF
;--------------------------------------------------
;
CRLF PROC NEAR
PUSH AX
PUSH DX
MOV AL,CR
CALL CHROUT
MOV AL,LF
CALL CHROUT
POP DX
POP AX
RET
CRLF ENDP
;
PAGE
;--------------------------------------------------
; print
Time$
;--------------------------------------------------
;
TIME_DISP PROC NEAR
time_dp TM_H,TM_M,TM_S,TM_MS
RET
TIME_DISP ENDP
;
;--------------------------------------------------
;
Time$="00:00:00"
;--------------------------------------------------
;
TIMECL PROC NEAR
push_abcd
;
MOV CH,00
MOV CL,00
MOV DH,00
MOV DL,00
;
MOV
AH,2DH
INT 21H
;
pop_abcd
RET
TIMECL ENDP
;
;=====================================
; n_input
;=====================================
;
N_INPUT
PROC NEAR
IRP
r,<AX,BX,CX,DX,SI,DI,BP,DS,ES>
PUSH r
ENDM
;
MOV
AX,FCBSEG
MOV ES,AX
MOV
AH,2FH ; DTA
address [ES:BX]
INT 21H
;
MOV
CL,ES:[BX]
CMP CL,1
JLE LL8
DEC CL
INC BX
MOV N,0
LL1:
;
MOV AX,N
MOV DX,10
MUL DX
MOV N,AX
;
INC BX
MOV
AL,ES:[BX]
PUSH AX
MOV DL,AL
MOV
AH,02H
INT 21H
POP AX
;
CMP
AL,'0'
JL
LL8
CMP
AL,'9'
JG
LL8
SUB
AL,'0'
MOV AH,0
PUSH AX
MOV AX,N
POP DX
ADD AX,DX
MOV N,AX
;
DEC CL
CMP CL,0
JNZ LL1
;
CALL CRLF
JMP LL9
;
LL8: MOV N,2
LL9: IRP
r,<ES,DS,BP,DI,SI,DX,CX,BX,AX>
POP r
ENDM
RET
; RETURN
N_INPUT ENDP
;
CODE ENDS
END MAIN