home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv027.ark / APUT.SRC < prev    next >
Encoding:
Text File  |  1985-02-10  |  15.8 KB  |  481 lines

  1. ;    FILE APUTST.SRC      VER.1.0
  2. ;    CREATED 9-16-80
  3. ;    LAST UPDATE 9-25-80  WRITTEN BY D.A. STEELE
  4.  
  5. ;    THIS PROCEDURE WILL DO A FEW TESTS TO ASSURE THAT THE APU
  6. ;    IS FUNCTIONING.  THE TESTS ARE NOT CONCLUSIVE HOWEVER
  7. ;    AND THE USER SHOULD NOT ASSUME THAT ALL OPERATIONS OF THE
  8. ;    APU HAVE BEEN CHECKED.
  9.  
  10. ;    THIS MODULE SHOULD BE DECLARED EXTERNAL IN THE PASCAL
  11. ;    MONITOR PROGRAM
  12. ;
  13. ;    FUNCTION APUT : INTEGER; EXTERNAL
  14.  
  15. ;    THIS MODULE WILL RETURN TRUE OF FALSE DEPENDING WHETHER
  16. ;    OR NOT THE TEST PASSED OR FAILED.  TRUE = FAILED.
  17.  
  18.  
  19.           NAME APUT
  20.           ENTRY APUT
  21.  
  22.  
  23. APUDAT:   EQU       0AAH
  24. APUSTAT:  EQU       0ABH
  25. SADD:     EQU       6CH
  26. SSUB:     EQU       6DH  ;SUBTRACT TOS FROM NOS
  27. SMUL:     EQU       6EH  ;I6 BIT MULTIPLY
  28. SMUU:     EQU       76H  ;16 BIT MILTIPLY
  29. SDIV:     EQU       6FH  ;16 BIT DIVIDE    
  30. DADD:     EQU       2CH  ;23 BIT ADD
  31. DSUB:     EQU       2DH  ;32 BIT SUBTRACT
  32. DMUL:     EQU       2EH  ;32 BIT MULTIPLY LOWER
  33. DDIV:     EQU       2FH  ;32 BIT DIVIDE
  34. FADD:     EQU       10H  ;32 BIT FLOATING ADD
  35. FSUB:     EQU       11H  ;32 BIT FLOATING SUBTRACT
  36. FMUL:     EQU       12H  ;32 BIT FLOATINNG MULTIPLY
  37. FDIV:     EQU       13H  ;32 BIT FLOATING DIVIDE
  38. SQRT:     EQU       1    ;SQUARE ROOT
  39. PWR:      EQU       0BH  ;RAISE TO A POWER
  40. FIXD:     EQU       1EH  ;FLOAT => FIX
  41. FLTD:     EQU       1CH  ;FIX => FLOAT
  42. CHSD      EQU       34H  ;FIXED SIGN CHANGE
  43. CHSF      EQU       15H  ;FLOAT SIGN CHANGE
  44. XCHD      EQU       26H  ;EXCHANGE TOS W/ NOS
  45.  
  46. ATEST1:   EQU       1    ;APU BUS ERROR TEST
  47. ATEST2:   EQU       2    ;APU STACK TEST
  48. ATEST3:   EQU       4    ;DADD TEST
  49. ATEST4:   EQU       8    ;DSUB TEST
  50. ATEST5:   EQU       10H  ;DMUL & DDIV TEST
  51. ATEST6:   EQU       20H  ;UNUSED
  52. ATEST7:   EQU       40H  ;16 BIT ARITHMATIC TEST
  53. ATEST8    EQU       80H  ;MISC TEST
  54.  
  55. APUSTOR:  DS        16   ;STORAGE AREA FOR RESULTSèAPUERR:   DS        2    ;THE MODULE ARROR FLAG
  56. ATEST:    DS        1    ;THE TEST BEING DONE
  57. STATUS:   DS        1    ;STORAGE FOR THE STATUS BYTE
  58.  
  59.  
  60. ;========================================================
  61. ;THIS ROUTINE WILL SEND THE COMMAND IN A TO THE APU
  62. ;AND THEN MONITOR THE STATUS BYTE UNTIL IT GOES NOT
  63. ;BUSY OR UNTIL 64K MACHINE CYCLES HAVE PASSED
  64. ;IF A NOT BUSY IS NOT RECEIVED THEN THE ERROR FLAG IS SET TO
  65. ;ALL ONES
  66. ;
  67. OUTIT:    PUSH      B
  68.           OUT       APUSTAT   ;OUTPUT THE COMMAND
  69.           LXI       B,0FFFFH  ;SET THE TIMER
  70. OUTIT1:   DCX       B
  71.           IN        APUSTAT   ;GET THE STATUS BIT
  72.           ANI       80H       ;SEE IF THE BUSY BIT IS 1
  73.           JNZ       OUTXIT
  74.           
  75.           MOV       A,B       ;START CHECKING THE B REGISTER
  76.           ORA       C         ;DON'T FORGET THE BOTTOM HALF
  77.           CPI       0         
  78.           JNZ       OUTIT1    ;IF ISN'T 0 THEN GO ANOTHER ROUND
  79.           LXI       H,APUERR+1;IF IT IS ZERRO THEN THE APU IS BAD
  80.           MVI       M,2       ;SET THE ERROR FLAG 
  81.  
  82. OUTXIT:   POP       B
  83.           RET                 ;AND RETURN
  84.  
  85. ;=============================================================
  86. ;ERROR ROUTIME TO OR IN THE NEW ERROR
  87. ERROR:    PUSH      B
  88.           LDA       APUERR    ;GET THE ERROR FLAG
  89.           MOV       B,A
  90.           LDA       ATEST     ;GET TEST TYPE
  91.           ORA       B
  92.           STA       APUERR    ;STORE THE ERROR FLAG
  93.           POP       B
  94.           RET     
  95. ;===========================================================
  96. ;    THIS IS A COMPARE ROUTINE TO CPMPARE A STRING OF BITS
  97. ;    THE LENGTH OF WHICH IS IN BC AND IS POINTED TO BY HL
  98. ;    WITH ANOTHER STRING POINTED TO BY DE.
  99.  
  100. COMPX:
  101. COMPX1:   MOV       A,M       ;GET ONE OF THE FIRST BYTES
  102.           XCHG
  103.           CCI                 ;COMPAIR A WITH MEMORY. INX HL
  104.                               ;AND DCX BC.
  105.           CNZ       ERROR     ;IF THE BYTES ARE NOT EQUAL ERROR
  106.           XCHG
  107.           INX       H         ;INCREMENT THE OTHER POINTER
  108.           MOV       A,B       ;IS IT THE END OF THE STRING
  109.           ORA       Cè          NOP                 ;MAINTAIN CODE SIZE         
  110.           JNZ       COMPX1    ;IF NOT END DO IT AGAIN
  111.           RET
  112.  
  113. ;===========================================================
  114. ;THIS WILL TEST THE BUS LINES TO THE APU
  115.  
  116. REGTST:   MVI       C,APUDAT       ;PUT PORT NUMBER IN C FOR MOVE
  117.           MVI       B,16           ;GOING TO MOVE 16 BYTES
  118. APU1:     OUTP      D              ;OUTPUT THE PATTERN 16 TIMES
  119.           DCR       B              ;COUNT THE OUTPUTS
  120.           JNZ       APU1
  121.  
  122.           ; NOW READ THE 16 BYTES BACK
  123.           MVI       B,16           ;THERE'S 16 OF THEM
  124. APU11:    INP       A              ;GET THE TOS
  125.           CMP       D              ;IT SHOULD NOT HAVE CHANGED
  126.           CNZ       ERROR          ;IF IT HAS CHANGED THEN ERROR
  127.           DCR       B
  128.           JNZ       APU11
  129.           RET                      ;END OF BUS TEST
  130.           
  131.  
  132. APUT1:  MVI       D,01010101B    ;FILL D WITH A PATTERN
  133.           CALL      REGTST
  134.           MVI       D,10101010B    
  135.           CALL      REGTST         ;DI FINAL BUS TEST
  136.           RET
  137.  
  138.  
  139. ;===========================================================
  140. ;    NEXT IS A TST OF ALL APU REGISTERS. ALL 256 BIT PATTERNS
  141. ;    WILL BE TESTED IN EACH REGISTER
  142.  
  143. APUT2:    MVI       D,0
  144.  
  145. APUT21: CALL      REGTST
  146.           OUTP      D         ;SLIDE THE APU REGISTER WINDOW
  147.           INR       D         ;GET THE NEXT BIT PATTERN
  148.           JNZ       APUT21  ;IF WE HAVN'T DONE THEM ALL THEN CONTINUE
  149.           RET
  150.  
  151. ;===========================================================
  152. ;    THE NEXT TEST WILL TEST THE DOUBBLE ADD INSTRUCTION OF 
  153. ;    THE APU
  154.  
  155. RES:      DB        0,0FFH,0FFH,0FFH
  156. APUT3:  MVI       C,APUDAT
  157. APUT31: MVI       D,55H     ;OUTPUT THE FIRST OPERAND
  158.           OUTP      D
  159.           OUTP      D
  160.           OUTP      D
  161.           MVI       D,0
  162.           OUTP      D
  163. è          MVI       D,0AAH     ;OUTPUT THE SECOND OPERAND
  164.           OUTP      D
  165.           OUTP      D
  166.           OUTP      D
  167.           MVI       D,0
  168.           OUTP      D
  169.  
  170.           MVI       A,DADD
  171.           CALL      OUTIT     ;OUTPUT THE OPCODE
  172.  
  173.           MVI       C,APUDAT  ;TIME TO GET THE RESULT
  174.           LXI       H,APUSTOR ;STRING TO PUT IT IN
  175.           MVI       B,4       ;THE LENGTH
  176.           INIR                ;MOVE IT IN
  177.  
  178.           LXI       B,4       ;COMPAIR THE RESULTS
  179.           LXI       H,RES
  180.           LXI       D,APUSTOR
  181.           CALL      COMPX
  182.           RET
  183.  
  184. ;============================================================
  185. ;    THIS WILL TEST DADD AND DSUB BY TAKING A NUMBER-ADDING A
  186. ;    SECOND NUMBER TO IT AND THEN SUBTRACTING THE FIRST NUMBER
  187. ;    FROM THE SECOND.  THE RESULT SHOULD BE THE SECOND NUMBER
  188. ;
  189. NUM1      DB   0,0AAH,55H,0AAH
  190. NUM2      DB   1,55H,0AAH,55H
  191.  
  192. APUT4:  MVI       C,APUDAT  ;DATAPORT IN C
  193.           MVI       B,8       ;MOVING 8 BYTES
  194.           LXI       H,NUM2+3  ;START W/ LSB
  195.           OUTDR               ;LOAD THE APU
  196.  
  197.           MVI       A,DADD
  198.           CALL      OUTIT     ;ADD THE TWO NUMBERS
  199.  
  200.           MVI       B,4       ;MOVING 4 BYTES
  201.           LXI       H,NUM2-1  ;START W/ LSB
  202.           OUTDR               ;LOAD APU WITH FORST NUMBER AGAIN
  203.  
  204.           MVI       A,DSUB
  205.           CALL      OUTIT     ;SUBTRACT THE FIRST FROM THE SECOND
  206.  
  207.           LXI       H,APUSTOR
  208.           MVI       B,4
  209.           INIR                ;GET THE 4 BYTE RESULT
  210.  
  211.           LXI       H,APUSTOR
  212.           LXI       D,NUM2
  213.           LXI       B,4       ;COMPAIR 4 BYTES
  214.           CALL      COMPX
  215.           RET
  216.  
  217. ;============================================================è;    THIS TEST WILL TEST MULTIPLY AND DIVIDE BY TAKING A NUMBER
  218. ;    AND MULTIPLYING IT BY A SECOND NUMBER AND THEN DIVIDING
  219. ;    THE RESULT BY THE FIRST NUMBER.  THE FINAL RESULT SHOULD
  220. ;    BE THE SECOND NUMBER.
  221.  
  222.  
  223. NUMA:     DB   0,0,5,3
  224. NUMB:     DB   0,0,1,2
  225. APUT5:
  226.  
  227.           MVI       C,APUDAT
  228.           MVI       B,8
  229.           LXI       H,NUMB+3
  230.           OUTDR               ;LOAD THE APU
  231.  
  232.           MVI       A,DMUL
  233.           CALL      OUTIT     ;DO THE MULTIPLY
  234.  
  235.           MVI       B,4       ;GETTING 4 BYTES
  236.           LXI       H,NUMB-1  ;GET THE FIRST NUMBER AGAIN
  237.           OUTDR               ;PUT IT IN THE APU
  238.           MVI       A,DDIV
  239.           CALL      OUTIT     ;DO THE DIVIDE
  240.  
  241.           LXI       H,APUSTOR ;GET READY TO STORE THE DATA
  242.           MVI       B,4       ;4 BYTES
  243.           INIR                ;GET THE RESULTS
  244.  
  245.           LXI       H,NUMB    ;COMPAIR THE ANSWER
  246.           LXI       D,APUSTOR
  247.           LXI       B,4
  248.           CALL      COMPX
  249.           RET
  250.  
  251. ;============================================================
  252. ;    THIS TEST WILL CHECK TO SEE IF THE CORRECT RESULTS ARE
  253. ;    RETURNED IF THE BUSY BIT IF THE APU IS NOT CHECKED.
  254. ;
  255. ;
  256. IX        DB        0,0,0,5
  257. IY        DB        0,0,0,0FH
  258. IR        DB        0,0BH,96H,4FH
  259.  
  260. APUT6:
  261.           MVI       C,APUDAT
  262.           MVI       B,4
  263.           LXI       H,IY+3
  264.           OUTDR               ;LOAD THE OPERANDS IN THE APU
  265.           MVI       A,FLTD
  266.           CALL      OUTIT     ;CONVERT TO FLOATING POINT
  267.  
  268.           MVI       B,4
  269.           LXI       H,IX+3
  270.           OUTDR               ;LOAD SECOND OPERAND
  271.           MVI       A,FLTDè          CALL      OUTIT     ;CONVERT TO FLOATING POINT
  272.  
  273.           MVI       A,PWR
  274.           OUT       APUSTAT   ;RAISE IT TO THE POWER
  275.  
  276.           MVI       A,FIXD
  277.           CALL      OUTIT     ;CONVERT TO FIXED POINT
  278.  
  279.           LXI       H,APUSTOR
  280.           MVI       B,4
  281.           INIR                ;GET THE RESULT
  282.  
  283.           LXI       H,IR
  284.           LXI       D,APUSTOR
  285.           LXI       B,3       ;JUST CHCK HIGH 3 BYTES - LOW PRECISION
  286.           CALL      COMPX     ;COMPAIR THE RESULT
  287.  
  288.           RET                 ;AND RETURN
  289.  
  290.  
  291. ;============================================================
  292. ;    THIS TEST WILL CHECK THE FOUR 16 BIT FUNCTIONS
  293. ;    BY ADDING A NUMBER TO ITSELF- THEN SUBTRACTING ITSELF-
  294. ;    THEN MULTIPLYING AND DIVIDING.  THE RESULT SHOULD BE THE
  295. ;    ORIGIONAL NUMBER
  296.  
  297. NUM       DB        0,0FH,0,0FH
  298.  
  299. APUT7:
  300.           MVI       C,APUDAT
  301.           MVI       B,4       ;MOVING 4 BYTES
  302.           LXI       H,NUM+3   ;START WITH THE LOW BIT
  303.           OUTDR               ;LOAD THE APU
  304.           MVI       A,SADD    ;GET READY TO ADD
  305.           CALL      OUTIT     ;DO THE ADD
  306.           
  307.           MVI       B,2       ;READY TO LOAD ANOTHER OPERAND
  308.           LXI       H,NUM+1
  309.           OUTDR               ;LOAD THE APU
  310.           MVI       A,SSUB    ;GET READY TO SUBTRACT
  311.           CALL      OUTIT     ;DO THE SUBTRACT
  312.           
  313.           MVI       B,2       ;READY TO LOAD NEXT OPERAND
  314.           LXI       H,NUM+1   
  315.           OUTDR               ;LOAD THE APU
  316.           MVI       A,SMUL    ;GET READY TO MULTIPLY
  317.           CALL      OUTIT     ;DO THE MULTIPLY
  318.  
  319.  
  320.           MVI       B,2       ;READY TO LOAD NEXT OPERAND
  321.           LXI       H,NUM+1
  322.           OUTDR               ;LOAD THE APU
  323.           MVI       A,SDIV
  324.           CALL      OUTIT     ;DI THE DIVIDE
  325. è          LXI       H,APUSTOR ;GET READY TO STORE THE RESULTS
  326.           MVI       B,2       ;IT WILL BE 2 BYTES LONG
  327.           INIR                ;MOVE IT INTO MEMORY
  328.  
  329.           LXI       H,NUM     ;GET THE ADDRESS OF THE NUMBER
  330.           LXI       D,APUSTOR ;GET THE ADDRESS OF THE RESULT
  331.           LXI       B,2       ;ITS TWO BYTES LONG
  332.           CALL      COMPX     ;COMPAIR THE RESULTS
  333.  
  334.           RET                 ;TO THE BACKGROUND
  335.  
  336.  
  337. ;============================================================
  338. ;    THIS TEST WILL DO A TEST OF THE FOLLOWING FUNCTIONS
  339. ;    SQRT, PWR, FIXD, FLTD, CHSF
  340. ;
  341. NUMX      DB        0,0,0FH,0FFH
  342. NUMY      DB        0,0,0,2
  343. RES1      DB        0,0FFH,0E0H,01
  344. RES2      DB        0,0FFH,0DFH
  345. APOP4:    LXI       H,APUSTOR ;GET READY TO STORE THE RESULTS
  346.           MVI       B,4       ;4 BYTES OF DATA 32 BITS
  347.           INIR                ;MOVE IT INTO MEMORY
  348.           RET
  349.  
  350. APUSH4:   MVI       B,4       ;PUSHING IN 4 BYTES
  351.           LXI       H,APUSTOR+3 ;USE THE LAST ANSWER
  352.           OUTDR
  353.           RET
  354.  
  355. GOCOMP:   LXI       D,APUSTOR ;THE ADDRESS OF THE RESULT
  356.           LXI       B,3       ;TESTING 3 BYTES
  357.           CALL      COMPX     ;DO THE COMPAIR
  358.           RET
  359.  
  360. APUT8:    MVI       C,APUDAT  ;GET THE OUTPUT PORT
  361.           MVI       B,4       ;GOING TO PUSH IN 4 BYTES
  362.           LXI       H,NUMX+3
  363.           OUTDR               ;LOAD THE APU
  364.  
  365.           MVI       A,FLTD    ;CONVERT TO FLOATING POINT
  366.           CALL      OUTIT
  367.  
  368.           MVI       A,FIXD    ;CONVERT TO FIXED
  369.           CALL      OUTIT
  370.  
  371.           CALL      APOP4     ;GET THE TOS
  372.           LXI       H,NUMX    ;RESULT SHOULD BE WHAT WAS PUT IN
  373.           CALL      GOCOMP
  374.  
  375. APWR:     MVI       C,APUDAT
  376.           CALL      APUSH4    ;GET THE NUMBER BACK
  377.           MVI       A,FLTD    ;CONVERT TO F.P
  378.           CALL      OUTIT
  379. è          MVI       B,4
  380.           LXI       H,NUMY+3  ;PUSH IN TO POWER OF TEN
  381.           OUTDR
  382.           MVI       A,FLTD    ;FLOAT IT
  383.           CALL      OUTIT
  384.  
  385.           MVI       A,PWR     ;RAISE TO THE PWR OF NUMY
  386.           CALL      OUTIT
  387.  
  388.           MVI       A,FIXD    ;CONVERT TO FIXED
  389.           CALL      OUTIT
  390.  
  391.           CALL      APOP4     ;GET THE RESULT
  392.           LXI       H,RES2    ;SHOULD BE RESULT 2
  393.           CALL      GOCOMP    ;GO DO THE COMPAIR
  394.  
  395. SQRTT:    MVI       C,APUDAT
  396.           MVI       B,4
  397.           LXI       H,RES1+3
  398.           OUTDR
  399.  
  400.           MVI       A,FLTD    ;CONVERT TO F.P
  401.           CALL      OUTIT
  402.  
  403.           MVI       A,SQRT    ;TAKE THE SQUARE ROOT
  404.           CALL      OUTIT
  405.  
  406.           MVI       A,FIXD    ;CONVERT TO FIXED POINT
  407.           CALL      OUTIT
  408.  
  409.           CALL      APOP4
  410.           LXI       H,NUMX    ;THE RESULT SHOULD BE NUMX
  411.           CALL      GOCOMP
  412.  
  413.  
  414.           RET                 ;FROM TEST 8
  415.  
  416.  
  417. ;============================================================
  418. ;THIS IS THE MAIN DRIVER FOR THIS MODULE
  419. ;============================================================
  420. ;
  421. APUT:                  ;SAVE THE REGISTERS FOR PASCAL
  422.           PUSH      H
  423.           
  424.           XRA       A    
  425.           STA       APUERR    ;ZERO THE ERROR FLAG
  426.           STA       APUERR+1
  427.  
  428. INIT:     MVI       A,1AH     ;TO INITIALIZE , PUSH PI
  429.           CALL      OUTIT     ;ONTO STACK
  430.           MVI       B,16      ;WE WILL POP NO MORE THAN 16
  431. INIT1:    IN        APUDAT    ;READ THE DATA PORT
  432.           CPI       0DAH      ;THIS IS WHAT IT SHOULD BE
  433.           JZ        T1        ;CHECK THE WHOLE STACKè          DCR       B         ;COUNT IT
  434.           JNZ       INIT1
  435.           LXI       H,APUERR+1
  436.           MVI       M,01H
  437.           JMP       XIT
  438.  
  439. T1:       MVI       A,ATEST1  ;SET THE TEST BEING DONE
  440.           STA       ATEST     
  441.           CALL      APUT1   ;CALL THE TEST
  442.  
  443. T2:       MVI       A,ATEST2
  444.           STA       ATEST
  445.           CALL      APUT2
  446.  
  447. T3:       MVI       A,ATEST3
  448.           STA       ATEST
  449.           CALL      APUT3
  450.  
  451.  
  452. T4:       MVI       A,ATEST4
  453.           STA       ATEST
  454.           CALL      APUT4
  455.  
  456. T5:       MVI       A,ATEST5
  457.           STA       ATEST
  458.           CALL      APUT5
  459.  
  460. T6:       MVI       A,ATEST6
  461.           STA       ATEST
  462.           CALL      APUT6
  463.  
  464. T7:       MVI       A,ATEST7
  465.           STA       ATEST
  466.           CALL      APUT7
  467.  
  468. T8:       MVI       A,ATEST8
  469.           STA       ATEST
  470.           CALL      APUT8
  471.  
  472. XIT:      XRA       A         ;GET READY TO RETURN TO PASCAL
  473.           LXI       H,APUERR  ;THE ADDRESS OF THE ERROR FLAG
  474.           MOV       E,M       ;PUT THE ERROR FLAG IN E
  475.           INX       H
  476.           MOV       D,M       ;ZERO D
  477.           POP       H
  478.           RET                 ;RETURN TO PASCAL
  479.  
  480.  
  481.