home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / math / base.lbr / BASE.AQM / BASE.ASM
Encoding:
Assembly Source File  |  1985-12-14  |  8.1 KB  |  580 lines

  1.  
  2. ;    PROGRAM NAME :    BASE.ASM (Kaypro version 1.0)
  3. ;    Function: convert input to other bases
  4. ;    Adapted for CP/M from
  5. ;        ***************************************
  6. ;        Willard Nico's
  7. ;        8080/8085 Assembly Language Programming
  8. ;        published Heath Company, Benton Harbor
  9. ;        ***************************************
  10. ;            by Jon Lindsay
  11. ;
  12. ;    Number to be converted will normally be in DE-regs.
  13. ;
  14. ;
  15. ; Equates
  16. ;
  17. LF    EQU    0AH        ; Linefeed
  18. CR    EQU    0DH        ; Carriage return
  19. ;
  20.  
  21.     ORG    100H        ; Start program here
  22. ;
  23. ;
  24. START:    LXI    H,0        ; Set up new stack
  25.     DAD    SP
  26.     SHLD    STACK
  27.     LXI    SP,STACK
  28. ;
  29. ;;    CALL    CLS        ; Clear screen
  30. ;
  31. BEGIN:    LXI    D,MESS1        ; 'What base'
  32.     CALL    PRINT
  33.     CALL    INP1        ; Select base
  34.     CPI    'C'-40H
  35.     JZ    EXIT
  36.     CPI    '?'
  37.     JZ    INFO        ; Give info
  38.     ANI    5FH        ; Make uppercase
  39.     CPI    'E'        ; Clear screen
  40.     JZ    SCREEN
  41.     CPI    'D'        ; Decimal
  42.     JZ    DECIN
  43.     CPI    'H'        ; Hexadecimal
  44.     JZ    HEXIN
  45.     CPI    'O'        ; Octal
  46.     JZ    OCTIN
  47.     CPI    'Q'        ; Octal
  48.     JZ    OCTIN
  49.     CPI    'S'        ; Split-octal
  50.     JZ    SOCTN
  51.     CPI    'B'        ; Binary
  52.     JZ    BININ
  53.     CPI    'A'        ; ASCII
  54.     JZ    ASCIN
  55.     CPI    'K'
  56.     JZ    EXIT
  57.     CPI    'X'        ; Exit to CP/M
  58.     JZ    EXIT
  59.     LXI    D,MESS2        ; 'Don't understand'
  60.     CALL    PRINT
  61.     JMP    BEGIN        ; Try again
  62. ;
  63. SCREEN:    CALL    CLS
  64.     JMP    BEGIN
  65. ;
  66. EXIT:    CALL    CRLF
  67.     LHLD    STACK        ; Restore old stack
  68.     SPHL
  69.     RET
  70. ;.....
  71. ;
  72. ;
  73. DECIN:    LXI    D,DECIMAL
  74.     CALL    VALIN
  75. ;
  76. NEXT1:    PUSH    H        ; Save pointer to buffer
  77.     MOV    A,M
  78.     SUI    30H        ; Check for number
  79.     JC    ERR1        ; Not number -> error
  80.     CPI    0AH
  81.     JNC    ERR1        ; No good
  82.     LXI    H,0        ; Multiply x 10
  83.     DAD    D
  84.     DAD    H
  85.     DAD    H
  86.     DAD    D
  87.     DAD    H
  88.     MOV    E,A
  89.     MVI    D,0
  90.     DAD    D
  91.     XCHG            ; New total in DE
  92.     DCR    C        ; Decrement counter
  93.     JZ    TOCONV
  94.     POP    H        ; Point to
  95.     INX    H        ; Next character
  96.     JMP    NEXT1        ; Get next character
  97. ;
  98. TOCONV:    POP    H
  99.     JMP    CNVRT
  100. ;.....
  101. ;
  102. ;
  103. OCTIN:    LXI    D,OCTAL
  104.     CALL    VALIN
  105. ;
  106. NEXT2:    PUSH    H
  107.     MOV    A,M
  108.     SUI    30H
  109.     JC    ERR1
  110.     CPI    08H
  111.     JNC    ERR1
  112.     LXI    H,0        ; Multiply x 8
  113.     DAD    D
  114.     DAD    H
  115.     DAD    H
  116.     DAD    H
  117.     MOV    E,A
  118.     MVI    D,0
  119.     DAD    D
  120.     XCHG
  121.     DCR    C
  122.     JZ    TOCONV
  123.     POP    H
  124.     INX    H
  125.     JMP    NEXT2
  126. ;
  127. HEXIN:    LXI    D,HEXAD
  128.     CALL    VALIN
  129. ;
  130. NEXT3:    PUSH    H
  131.     MOV    A,M
  132.     SUI    30H
  133.     JC    ERR1
  134.     CPI    0AH
  135.     JC    HEXOK
  136.     ANI    5FH
  137.     SUI    7H
  138.     CPI    0AH
  139.     JC    ERR1
  140.     CPI    10H
  141.     JNC    ERR1
  142. ;
  143. HEXOK:    LXI    H,0        ; Multiply x 16
  144.     DAD    D
  145.     DAD    H
  146.     DAD    H
  147.     DAD    H
  148.     DAD    H
  149.     MOV    E,A
  150.     MVI    D,0
  151.     DAD    D
  152.     XCHG
  153.     DCR    C
  154.     JZ    TOCONV
  155.     POP    H
  156.     INX    H
  157.     JMP    NEXT3
  158. ;
  159. BININ:    LXI    D,BINRY
  160.     CALL    VALIN
  161. ;
  162. NEXT4:    PUSH    H
  163.     MOV    A,M
  164.     CPI    20H        ; Look for input space
  165.     JZ    NXT4        ; Then ignore space
  166.     SUI    030H
  167.     JC    ERR1
  168.     CPI    002H
  169.     JNC    ERR1
  170.     LXI    H,0        ; Multiply x 2
  171.     DAD    D
  172.     DAD    H
  173.     MOV    E,A
  174.     MVI    D,0
  175.     DAD    D
  176.     XCHG
  177. ;
  178. NXT4:    DCR    C        ; Counter = actual number char. entered
  179.     JZ    TOCONV
  180.     POP    H
  181.     INX    H
  182.     JMP    NEXT4
  183. ;
  184. SOCTN:    LXI    D,SPLIT
  185.     CALL    VALIN
  186. ;
  187. NEXT5:    PUSH    H
  188.     MOV    A,M
  189.     CPI    '/'
  190.     JNZ    NODOT
  191.     MOV    D,E
  192.     MVI    E,0
  193.     JMP    DOT1
  194. ;
  195. NODOT:    SUI    30H
  196.     JC    ERR1
  197.     CPI    8H
  198.     JNC    ERR1
  199.     MOV    L,A
  200.     MOV    A,E
  201.     ADD    A
  202.     ADD    A
  203.     ADD    A
  204.     ADD    L
  205.     MOV    E,A
  206. ;
  207. DOT1:    DCR    C
  208.     JZ    TOCONV
  209.     POP    H
  210.     INX    H
  211.     JMP    NEXT5
  212. ;
  213. ASCIN:    LXI    D,ASCII
  214.     PUSH    D
  215.     LXI    D,WHAT
  216.     CALL    PRINT
  217.     POP    D
  218.     CALL    PRINT
  219.     LXI    D,VALUE
  220.     CALL    PRINT
  221.     LXI    D,0
  222. ;
  223. NEXT6:    PUSH    D
  224. ;
  225. NEX6:    MVI    E,0FFH        ; Get pure input
  226.     MVI    C,6
  227.     CALL    5
  228.     ORA    A
  229.     JZ    NEX6        ; Must loop until char. present
  230.     POP    D
  231.     CPI    0DH        ; Look for carriage return
  232.     JZ    CNVRT        ; And convert
  233.     PUSH    PSW
  234.     CALL    OUTPT        ; Print ASCII char.
  235.     POP    PSW
  236.     MOV    D,E
  237.     MOV    E,A
  238.     JMP    NEXT6
  239. ;
  240. VALIN:    PUSH    D
  241.     LXI    D,WHAT
  242.     CALL    PRINT
  243.     POP    D
  244.     CALL    PRINT
  245.     LXI    D,VALUE
  246.     CALL    PRINT
  247.     CALL    INP10        ; Get input
  248.     LDA    MBUF+1
  249.     ORA    A        ; Was entry zero?
  250.     JZ    BEGIN        ; No, then back to start
  251.     MOV    C,A        ; Yes, then install counter
  252.     LXI    H,MBUF+2    ; Start of numbers
  253.     LXI    D,0        ; Zero reg. DE
  254.     RET
  255. ;
  256. CNVRT:    PUSH    D        ; Save number
  257.     LXI    D,MESS3        ; CR/LF
  258.     CALL    PRINT
  259.     LXI    D,MESS5        ; =header
  260.     CALL    PRINT
  261.     MVI    A,20H        ; Add space here
  262.     CALL    OUTPT
  263.     POP    D        ; Restore number
  264. ;
  265. ;
  266. ; -> Start base output here
  267. ;
  268. DOUT:    XCHG            ; Number now is HL
  269.     PUSH    H        ; Save it on stack
  270.     LXI    B,2710H        ; 10,000 units
  271.     CALL    SUBTR
  272.     LXI    B,3E8H        ; 1,000 units
  273.     CALL    SUBTR
  274.     LXI    B,64H        ; 100 units
  275.     CALL    SUBTR
  276.     LXI    B,0AH        ; 10 units
  277.     CALL    SUBTR
  278.     MOV    A,L
  279.     ADI    30H
  280.     CALL    OUTPT
  281.     POP    D        ; Return original number to DE
  282.     CALL    SPACES
  283. ;
  284. HOUT:    MOV    A,D
  285.     CALL    DOHEX
  286.     MOV    A,E
  287.     CALL    DOHEX
  288.     CALL    SPACES
  289. ;
  290. OOUT:    MOV    A,D
  291.     RAL
  292.     RAL
  293.     PUSH    PSW
  294.     ANI    001H
  295.     CALL    OCTOUT
  296.     POP    PSW
  297.     CALL    ROTES
  298.     MOV    A,E
  299.     CALL    ROTES
  300.     CALL    ROTER
  301.     CALL    SPACES
  302. ;
  303. SOOUT:    MOV    A,D
  304.     CALL    SOCT
  305.     MVI    A,'/'
  306.     CALL    OUTPT
  307.     MOV    A,E
  308.     CALL    SOCT
  309.     CALL    SPACES
  310. ;
  311. BOUT:    MOV    A,D
  312.     CALL    BINOUT
  313.     MOV    A,E
  314.     CALL    BINOUT
  315.     CALL    SPACES
  316.     CALL    SPACES
  317. ;
  318. AOUT:    MOV    A,D
  319.     CALL    ATEST
  320.     MVI    A,' '
  321.     CALL    OUTPT
  322.     MOV    A,E
  323.     CALL    ATEST
  324.     CALL    CRLF
  325.     CALL    CRLF
  326.     JMP    BEGIN
  327. ;.....
  328. ;
  329. ;
  330. CRLF:    MVI    A,0DH
  331.     CALL    OUTPT
  332.     MVI    A,0AH
  333.     JMP    OUTPT
  334. ;.....
  335. ;
  336. ;
  337. ATEST:    CPI    ' '
  338.     JC    DODOT
  339. ;;    CPI    5BH
  340. ;;    JC    OUTPT
  341.     JMP    OUTPT
  342. ;
  343. DODOT:    MVI    A,'.'
  344.     JMP    OUTPT
  345. ;.....
  346. ;
  347. ;
  348. BINOUT:    MVI    B,2        ; Outer counter
  349. ;
  350. BINO1:    PUSH    B
  351.     MVI    B,4        ; Inner counter = 4 bits
  352. ;
  353. BLOOP:    RAL
  354.     PUSH    PSW
  355.     MVI    A,'1'
  356.     JC    BINOK
  357.     MVI    A,'0'
  358. ;
  359. BINOK:    CALL    OUTPT
  360.     POP    PSW
  361.     DCR    B        ; Bit counter
  362.     JNZ    BLOOP
  363.     PUSH    PSW
  364.     MVI    A,20H
  365.     CALL    OUTPT        ; Put space between group of 4 bits
  366.     POP    PSW        ; Restore byte
  367.     POP    B        ; Get outer counter
  368.     DCR    B
  369.     RZ            ; If zero, done with this byte
  370.     JMP    BINO1        ; Get more bits
  371. ;.....
  372. ;
  373. ;
  374. SOCT:    RAL
  375.     RAL
  376.     RAL
  377.     PUSH    PSW
  378.     ANI    3H
  379.     CALL    SPOUT
  380.     POP    PSW
  381.     CALL    SPINR
  382. ;
  383. SPINR:    RAL
  384.     RAL
  385.     RAL
  386. ;
  387. SPOUT:    PUSH    PSW
  388.     ANI    007H
  389.     ADI    30H
  390.     CALL    OUTPT
  391.     POP    PSW
  392.     RET
  393. ;.....
  394. ;
  395. ;
  396. ROTES:    CALL    ROTER
  397. ;
  398. ROTER:    RAL
  399.     RAL
  400.     RAL
  401. ;
  402. OCTOUT:    PUSH    PSW
  403.     ANI    7H
  404.     ADI    30H
  405.     CALL    OUTPT
  406.     POP    PSW
  407.     RET
  408. ;.....
  409. ;
  410. ;
  411. DOHEX:    PUSH    PSW
  412.     RRC
  413.     RRC
  414.     RRC
  415.     RRC
  416.     CALL    HEXOUT
  417.     POP    PSW
  418. ;
  419. HEXOUT:    ANI    0FH
  420.     ADI    30H
  421.     CPI    ':'
  422.     JC    OUTPT
  423.     ADI    7H
  424.     JMP    OUTPT
  425. ;.....
  426. ;
  427. ;
  428. SUBTR:    MVI    D,0FFH
  429. ;
  430. LOOP5:    MOV    A,L
  431.     SUB    C
  432.     MOV    L,A
  433.     MOV    A,H
  434.     SBB    B
  435.     MOV    H,A
  436.     INR    D
  437.     JNC    LOOP5
  438.     DAD    B
  439.     MOV    A,D
  440.     ADI    030H
  441.     JMP    OUTPT
  442. ;....
  443. ;
  444. ;
  445. ERR1:    POP    H
  446. ;
  447. ERROR:    LXI    D,MESS4
  448.     CALL    PRINT
  449.     JMP    BEGIN
  450. ;.....
  451. ;
  452. ;
  453. SPACES:    MVI    A,' '
  454.     CALL    OUTPT
  455.     MVI    A,' '
  456.     CALL    OUTPT
  457.     JMP    OUTPT
  458. ;.....
  459. ;
  460. ;
  461. CLS:    LXI    D,CLEAR        ; Clear screen for Kaypro
  462.     CALL    PRINT
  463.     RET
  464. ;.....
  465. ;
  466. ;
  467. INFO:    CALL    CLS
  468.     LXI    D,INFORM    ; Give user information
  469.     CALL    PRINT
  470.     JMP    BEGIN
  471. ;.....
  472. ;
  473. ;
  474. PRINT:    PUSH    B
  475.     PUSH    D
  476.     PUSH    H
  477.     MVI    C,9
  478.     CALL    5
  479.     POP    H
  480.     POP    D
  481.     POP    B
  482.     RET
  483. ;.....
  484. ;
  485. ;
  486. OUTPT:    PUSH    B
  487.     PUSH    D
  488.     PUSH    H
  489.     MVI    C,2
  490.     MOV    E,A
  491.     CALL    5
  492.     POP    H
  493.     POP    D
  494.     POP    B
  495.     RET
  496. ;.....
  497. ;
  498. ;
  499. INP1:    PUSH    B
  500.     PUSH    D
  501.     PUSH    H
  502.     MVI    C,1
  503.     CALL    5
  504.     POP    H
  505.     POP    D
  506.     POP    B
  507.     RET
  508. ;.....
  509. ;
  510. ;
  511. INP10:    PUSH    B
  512.     PUSH    D
  513.     PUSH    H
  514.     MVI    C,10
  515.     LXI    D,MBUF
  516.     CALL    5
  517.     POP    H
  518.     POP    D
  519.     POP    B
  520.     RET
  521. ;.....
  522. ;
  523. ;
  524. MBUF:    DB    22        ; Max. digits allowed (allow binary spaces)
  525.     DB    0        ; Actual # digits entered
  526.     DS    22        ; Buffer for digits (allow for spaces
  527.                 ; In binary)
  528.     DB    'CLS HERE->'    ; Makes patching easy
  529. ;
  530. CLEAR:    DB    1AH,'$',0,0,0    ; Kaypro clear screen
  531. ;
  532. INFORM:    DB    '                            BASE.COM',CR,LF
  533.     DB    CR,LF
  534.     DB    '                         by Jon Lindsay',CR,LF
  535.     DB    CR,LF
  536.     DB    'Usage:',CR,LF
  537.     DB    CR,LF
  538.     DB    '->   Select the BASE (single letter) you wish'
  539.     DB    ' to enter.',CR,LF
  540.     DB    CR,LF
  541.     DB    'Enter:',CR,LF
  542.     DB    '     E = Erase screen',CR,LF
  543.     DB    '     D = Decimal',CR,LF
  544.     DB    '     H = Hexadecimal',CR,LF
  545.     DB    '     O = Octal',CR,LF
  546.     DB    '     Q = Octal',CR,LF
  547.     DB    '     S = Split-octal',CR,LF
  548.     DB    '     B = Binary',CR,LF
  549.     DB    '     A = ASCII',CR,LF
  550.     DB    '     X = Exit to CP/M',CR,LF
  551.     DB    '     ? = Information about program',CR,LF
  552.     DB    CR,LF
  553.     DB    '->   Enter desired BASE VALUE, then carriage return.'
  554.     DB    CR,LF,'$'
  555. ;
  556. ;
  557. ; Message area
  558. ;
  559. MESS1:    DB    0DH,0AH,'What BASE is your entry?  ','$'
  560. MESS2:    DB    0DH,0AH,'Sorry, I don''t understand! ','$'
  561. MESS3:    DB    0DH,0AH,'$'
  562. MESS4:    DB    0DH,0AH
  563.     DB    'Input character WRONG for base specified','$'
  564. MESS5:    DB    00DH,00AH,'DECIMAL  HEX   OCTAL  S/OCTAL        BINARY'
  565.     DB    '           ASCII',0DH,0AH,'$'
  566. WHAT:    DB    0DH,0AH,'What''s your ','$'
  567. VALUE:    DB    ' value?   ','$'
  568. DECIMAL:DB    'DECIMAL','$'
  569. HEXAD:    DB    'HEXADECIMAL','$'
  570. OCTAL:    DB    'OCTAL','$'
  571. SPLIT:    DB    'SPLIT OCTAL','$'
  572. BINRY:    DB    'BINARY','$'
  573. ASCII:    DB    'ASCII','$'
  574.     DS    32
  575. STACK:    DS    2        ; Old stack pointer
  576. ;.....
  577. ;
  578. ;
  579.     END    START        ; End of assembly
  580.