;

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