home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol075 / roman80.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.0 KB  |  235 lines

  1. ;    ROMAN80 - VERSION 0.2
  2. ;
  3. ;    ROMAN CONVERSION PROGRAM
  4. ;
  5. ;    DATE: 10-OCT-78
  6. ;    BY: M PEDDER
  7. ;
  8. ;
  9. ;    DEFINITIONS
  10. ;
  11.     ORG    100H        ;ALLOCATE
  12. START:    JMP    ROMAN
  13. CR:    EQU    0DH
  14. LF:    EQU    0AH
  15. CONSTA:    EQU    1H        ;Console status port
  16. CONDAT:    EQU    0H        ;Console data port
  17. B$KDR:    EQU    02H        ;Data available mask
  18. STACK:    EQU    400H
  19. B$VDR:    EQU    01H        ;Tx ready mask
  20. ;
  21. ;    MESSAGES
  22. ;
  23. STM    DB    'COPYRIGHT (C) 1978 M PEDDER',CR,LF
  24.     DB    '"ROMAN" ACCEPTS DECIMAL NUMBERS IN THE RANGE 1 - 3999'
  25.     DB    CR,LF
  26.     DB    'AND CONVERTS TO ROMAN NUMERALS, CHECKING VALIDITY.'
  27.     DB    CR,LF,LF
  28.     DB    'ENTER DATA FOLLOWING "READY =", ENDING WITH "CR"'
  29.     DB    CR,LF,'$'
  30. RDM    DB    CR,LF,'READY =  $'
  31. TOOL:    DB    '  TOO LARGE$'
  32. INV:    DB    '  INVALID CHARACTER$'
  33. LIST:    DB    0,0,'IVXLCDM'
  34. ;
  35. ;    WORKSPACE:
  36. ;
  37. DBUF:    DS    5        ;DECIMAL BUFFER
  38. RBUF:    DS    16        ;ROMAN BUFFER
  39. DCNT:    DS    1        ;DECIMAL COUNT
  40. STK:    DS    2        ;SP HOLDER
  41. ;
  42. ;    SUPERVISORY:
  43. ;
  44. ROMAN:    LXI    H,0
  45.     DAD    SP
  46.     SHLD    STK
  47.     LXI    SP,STACK    ;PREPARE STACK
  48.     LXI    H,STM        ;POINT TO START MESSAGE
  49.     CALL    PRINS        ;AND OUTPUT IT
  50. RDY:    CALL    RDYM        ;PRODUCE READY MESSAGE, AND SET UP
  51.     CALL    INPUT        ;GET DATA
  52.     JC    RDY        ;IF IT IS VALID
  53.     CALL    ENC        ;ENCODE AND OUTPUT IT
  54.     JMP    RDY
  55.     PAGE
  56. ;
  57. ;    READY MESSAGE AND SETTING UP:
  58. ;
  59. RDYM:    LXI    H,RDM        ;POINT TO READY MESSAGE
  60.     CALL    PRINS        ;AND OUTPUT IT
  61.     LXI    B,DBUF        ;PREPARE DECIMAL POINTER
  62.     LXI    H,DCNT        ;AND COUNT POINTER
  63.     MVI    M,00H        ;CLEAR COUNTER
  64.     RET
  65. ;
  66. ;    GET INPUT FROM CONSOLE INTO DBUF, CHECKING VALIDITY:
  67. ;
  68. INPUT:    IN    CONSTA        ;IF CHARACTER
  69.     ANI    B$KDR        ;IS AVAILABLE
  70.     JZ    INPUT
  71.     IN    CONDAT        ;GET IT
  72.     ANI    7FH        ;STRIP PARITY
  73.     CPI    03H        ;IF IT IS EXIT CMD
  74.     JZ    EXIT        ;THEN GO
  75.     CPI    0DH        ;IF IT IS 'CR'
  76.     JNZ    ECHO        ;THEN
  77.     MVI    A,20H        ;LOAD 'SPACE'
  78.     CALL    PRINC        ;AND OUTPUT IT
  79.     CALL    PRINC        ;TWICE
  80.     MVI    A,'$'        ;MARK END
  81.     STAX    B        ;OF DATA
  82.     ORA    A        ;CLEAR FLAG
  83.     RET
  84. ;
  85. EXIT:    LHLD    STK
  86.     SPHL
  87.     RET
  88. ;
  89. ECHO:    CALL    PRINC        ;ECHO CHARACTER
  90.     CPI    '0'        ;IF IT IS ZERO OR MORE
  91.     JM    INVCH        ;AND
  92.     CPI    ':'        ;IF IT IS NINE OR LESS
  93.     JP    INVCH        ;THEN IT IS VALID CHARACTER
  94.     INR    M        ;SO COUNT IT
  95.     STAX    B        ;AND STORE IT
  96.     INX    B        ;ADVANCE POINTER
  97.     MOV    A,M        ;CHECK COUNT
  98.     CPI    05H        ;IF IT IS LESS THAN FIVE
  99.     JM    INPUT        ;THEN CONTINUE
  100.     LXI    H,TOOL        ;ELSE POINT TO 'TOO LARGE'
  101.     JMP    MES
  102. ;
  103. INVCH:    LXI    H,INV        ;POINT TO 'INVALID CHARACTER'
  104. MES:    CALL    PRINS        ;AND OUTPUT IT
  105.     STC            ;SET ERROR FLAG
  106.     RET
  107. ;
  108. ;
  109.     PAGE
  110. ;
  111. ;    PREPARE TO ENCODE:
  112. ;
  113. ENC:    LXI    B,DBUF        ;PREPARE DECIMAL POINTER
  114.     LXI    D,LIST        ;PREPARE LIST POINTER
  115.     LXI    H,DCNT        ;PREPARE COUNT POINTER
  116.     MOV    A,M        ;GET COUNT
  117.     CPI    04H        ;IF IT IS NOT FOUR
  118.     JNZ    CONT        ;CONTINUE
  119.     LDAX    B        ;ELSE GET FIRST CHARACTER
  120.     CPI    34H        ;IF IT IS NOT FOUR
  121.     JM    CONT        ;CONTINUE
  122.     LXI    H,TOOL        ;ELSE LOAD 'TOO LARGE'
  123.     CALL    PRINS        ;AND OUTPUT IT
  124.     RET
  125. ;
  126. CONT:    MOV    L,M        ;GET COUNT
  127.     MVI    H,00H        ;INTO HL
  128.     DAD    H        ;DOUBLE IT
  129.     DAD    D        ;ADD TO LIST
  130.     XCHG            ;AND RESTORE LIST
  131.     LXI    H,RBUF        ;PREPARE ROMAN POINTER
  132. ;
  133. ;    ENCODE CHARACTER STREAM IN DBUF:
  134. ;
  135. ENCA:    LDAX    B        ;GET A CHARACTER
  136.     INX    B        ;UPDATE THE POINTER
  137.     CPI    '$'        ;IF IT IS NOT "END MARKER"
  138.     RZ            ;THEN
  139.     CPI    '9'        ;IF IT IS NOT A NINE
  140.     JZ    NINE        ;THEN
  141.     CPI    '5'        ;IF IT IS NOT FIVE OR MORE
  142.     JP    FIVE        ;THEN
  143.     CPI    '4'        ;IF IT IS NOT FOUR
  144.     JZ    FOUR        ;THEN
  145. ETA:    CPI    '0'        ;IF IT IS ZERO
  146.     JNZ    ONE        ;THEN
  147. ETB:    DCX    D        ;MODIFY ROMAN POINTER
  148.     DCX    D        ;TWICE
  149.     LDA    DCNT        ;REDUCE COUNT
  150.     DCR    A        ;AND
  151.     STA    DCNT        ;IF IT IS NOT ZERO
  152.     JNZ    ENCA        ;THEN LOOP
  153.     MVI    A,'$'        ;ELSE MARK END
  154.     CALL    STOR        ;AND STORE IT
  155.     JMP    ROUT        ;ENCODE COMPLETED
  156. ;
  157.     PAGE
  158. ;
  159. ;    ITS A 1=I, 10=X, 100=C, 1000=M OR MORE:
  160. ;
  161. ONE:    PUSH    PSW        ;SAVE DATA
  162.     LDAX    D        ;LOAD ROMAN CHARACTER
  163.     CALL    STOR        ;AND STORE IT
  164.     POP    PSW        ;UNSAVE DATA
  165.     DCR    A        ;SUBTRACT ONE
  166.     JMP    ETA        ;AND TRY AGAIN
  167. ;
  168. ;    ITS A 4=IV, 40=XL, 400=CD:
  169. ;
  170. FOUR:    LDAX    D        ;LOAD ROMAN CHARACTER I, X OR C
  171.     CALL    STOR        ;AND STORE IT
  172.     INX    D        ;GET NEXT
  173.     LDAX    D        ;ROMAN CHARACTER V, L OR D
  174.     CALL    STOR        ;AND STORE THAT
  175.     DCX    D        ;RESTORE POINTER
  176.     JMP    ETB        ;AND EXIT
  177. ;
  178. ;    ITS A 5=V, 50=L, 500=D OR MORE:
  179. ;
  180. FIVE:    PUSH    PSW        ;SAVE DATA
  181.     INX    D        ;PREPARE POINTER
  182.     LDAX    D        ;GET ROMAN CHARACTER V, L OR D
  183.     CALL    STOR        ;AND STORE IT
  184.     DCX    D        ;RESTORE POINTER
  185.     POP    PSW        ;AND DATA
  186.     SUI    05H        ;SUBTRACT FIVE
  187.     JMP    ETA        ;AND TRY AGAIN
  188. ;
  189. ;    ITS A 9=IX, 90=XC, OR 900=CM:
  190. ;
  191. NINE:    LDAX    D        ;GET ROMAN CHARACTER I, X OR C
  192.     CALL    STOR        ;AND STORE IT
  193.     INX    D        ;MOVE
  194.     INX    D        ;POINTER
  195.     LDAX    D        ;GET ROMAN CHARACTER X, C OR M
  196.     CALL    STOR        ;AND STORE THAT
  197.     DCX    D        ;RESTORE
  198.     DCX    D        ;POINTER
  199.     JMP    ETB        ;AND EXIT
  200. ;
  201.     PAGE
  202. ;
  203. ;    STORE ROMAN CHARACTER IN RBUF FOR OUTPUT:
  204. ;
  205. STOR:    MOV    M,A        ;STORE DATA IN BUFFER
  206.     INX    H        ;AND MOVE POINTER
  207.     RET
  208. ;
  209. ;    ROMAN OUTPUT TO CONSOLE:
  210. ;
  211. ROUT:    LXI    H,RBUF        ;POINT TO ROMAN BUFFER
  212.     CALL    PRINS        ;AND OUTPUT IT
  213.     RET
  214. ;
  215. ;    OUTPUT A STRING OF CHARACTERS:
  216. ;
  217. PRX:    CALL    PRINC        ;OUTPUT IT
  218. PRINS:    MOV    A,M        ;GET CHARACTER
  219.     INX    H        ;POINT TO NEXT
  220.     CPI    '$'        ;IF IT IS NOT END
  221.     JNZ    PRX        ;THEN GO
  222.     RET
  223. ;
  224. ;    OUTPUT A CHARACTER TO CONSOLE:
  225. ;
  226. PRINC:    PUSH    PSW        ;SAVE DATA
  227. PRA:    IN    CONSTA        ;IF CHARACTER
  228.     ANI    B$VDR        ;CAN BE TAKEN
  229.     JZ    PRA
  230.     POP    PSW        ;UNSAVE CHARACTER
  231.     OUT    CONDAT        ;AND OUTPUT IT
  232.     RET
  233. ;
  234.     END
  235.