home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG018.ARK / FLTARITH.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  39KB  |  1,313 lines

  1. ; 8008 BINARY FLOATING POINT SYSTEM
  2. ; THE 8008 BINARY FLOATING POINT SYSTEM CONSISTS OF A 
  3. ; SET OF SUBROUTINES DESIGNED TO PERFORM  ARITHMETIC
  4. ; OPERATIONS ON NUMERIC QUANTITIES REPRESENTED IN
  5. ; MEMORY.
  6. ; EACH NUMERIC QUANTITY OCCUPIES FOUR CONSECUTIVE WORDS
  7. ; (32 BITS) OF MEMORY.  THE LARGEST MAGNITUDE THAT CAN
  8. ; BE REPRESENTED IS APPROXIMATELY 3.6 TIMES TEN TO THE
  9. ; 38TH POWER.  THE SMALLEST NON-ZERO MAGNITUDE THAT
  10. ; CAN BE REPRESENTED IS APPROXIMATELY 2.7 TIMES TEN TO 
  11. ; THE MINUS 39TH POWER.  EACH NUMERIC QUANTITY IS
  12. ; REPRESENTED WITH A PRECISION OF ONE PART IN
  13. ; APPROXIMATELY  16,00Q,00Q.
  14. ; THE SOFTWARE CONSTITUTING THE  FLOATING POINT SYSTEM
  15. ; IS DIVIDED INTO TWO SECTIONS, EACH OF WHICH OCCUPIES
  16. ; 3 BANKS OF ROM OR RAM.  SECTION 1 IS INDEPENDENT OF 
  17. ; OTHER SOFTWARE.  SECTION 2 IS OPERABLE ONLY WHEN 
  18. ; SECTION 1 IS AVAILABLE IN MEMORY.  IN ADDITION TO
  19. ; MEMORY FOR PROGRAM, 63 WORDS OF RAM ARE USED AS SCRATCHPAD.
  20. ; SOFTWARE SECTION 1 CONTAINS  THE FOLLOWING SUBROUTINES:
  21. ;     LOD - LOAD SPECIFIED DATA INTO THE FLOATING POINT
  22. ;           ACCUMULATOR.
  23. ;     ADD - ADD SPECIFIED DATA TO THE FLOATING POINT 
  24. ;           ACCUMULATOR.
  25. ;     SUB - SUBTRACT SPECIFIED DATA FROM THE FLOATING
  26. ;           POINT ACCUMULATOR.
  27. ;     MUL - MULTIPLY THE FLOATING POINT ACCUMULATOR
  28. ;           BY THE SPECIFIED DATA.
  29. ;     DIV - DIVIDE THE FLOATING POINT ACCUMULATOR
  30. ;           BY THE SPECIFIED DATA
  31. ;     TST - SET CONTROL BITS TO INDICATE ATTRIBUTES
  32. ;           OF THE CONTENTS OF THE FLOATING POINT ACCUMULATOR
  33. ;     CHS - CHANGE THE SIGN OF THE FLOATING POINT ACCUMULATOR.
  34. ;     ABS - SET THE SIGN OF THE FLOATING POINT ACCUMULATOR
  35. ;           POSITIVE.
  36. ;     STR - STORE IN SPECIFIED MEMORY THE VALUE IN THE 
  37. ;           REGISTERS AS RETURNED BY OTHER SUBROUTINES.
  38. ;     INIT - MOVE CODE FROM ROM TO RAM IN PREPARATION
  39. ;            FOR EXECUTION OF THE MUL AND DIV SUBROUTINES.
  40. ; SOFTWARE SECTION 2 CONTAINS SUBROUTINES WHICH ARE
  41. ; USED TO CONVERT DATA BETWEEN THE BINARY  FLOATING
  42. ; POINT FORMAT AND A DECIMAL FORMAT SUITABLE FOR
  43. ; ENTRY OR DISPLAY IN INPUT/OUTPUT EQUIPMENT.  THE
  44. ; DECIMAL FORMAT IS STORED IN MEMORY AS A SERIES
  45. ; OF CHARACTERS.  RELATIVELY SIMPLE INPUT/OUTPUT
  46. ; ROUTINES MAY BE USED TO INTERFACE THE MEMORY-
  47. ; RESIDENT CHARACTER STRINGS WITH ANY TYPE OF PHYSICAL
  48. ; I/O DEVICE.  THE CONVERSION ROUTINES ARE MORE FULLY
  49. ; EXPLAINED IN TEXT IMMEDIATELY PRECEEDING THE ROUTINES.
  50. ; THE 8008  BINARY FLOATING POINT SYSTEM CONSISTS OF A SET
  51. ; OF SUBROUTINES DESIGNED TO PERFORM OPERATIONS ON NUMERIC
  52. ; QUANTITIES REPRESENTED IN A SPECIFIC NOTATION.  SUBROUTINES
  53. ; ARE PROVIDED TO PERFORM A VARIETY OF ARITHMETIC AND RELATED
  54. ; OPERATIONS.
  55. ; THE SUBROUTINES ARE DESIGNED TO BE STORED AND EXECUTED IN
  56. ; READ-ONLY-MEMORY (ROM) AND REQUIRE THE FIRST PORTION OF A
  57. ; BANK OF READ-WRITE MEMORY (RAM, FROM 'RANDOM ACCESS MEMORY')
  58. ; FOR SCRATCHPAD MEMORY.   THE SUBROUTINES ARE SEPARATED INTO
  59. ; A NUMBER OF PACKAGES, EACH CONTAINING SUBROUTINES FOR A GROUP
  60. ; OF RELATED OPERATIONS.  THE AMOUNT OF MEMORY (ROM AND RAM)
  61. ; REQUIRED FOR INSTALLATION OF THE SYSTEM IS DEPENDENT UPON
  62. ; THE COMBINATION OF PACKAGES TO BE USED.  SCRATCHPAD MEMORY
  63. ; IS INITIALIZED BY A UTILITY SUBROUTINE WHICH MUST BE EXECUTED
  64. ; BEFORE OTHER SUBROUTINES ARE EXECUTED THE FIRST TIME.
  65. ; IN GENERAL, THE SUBROUTINES HAVE SIMILAR ENTRY AND EXIT
  66. ; CONDITIONS.  UNLESS SPECIFIED DIFFERENTLY IN THE DESCRIPTION
  67. ; OF A SUBROUTINE, THE SUBROUTINES HAVE THE FOLLOWING CHARACTERISTICS.
  68. ; SUBROUTINES REQUIRING ONE OPERAND TAKE IT FROM AN INTERNAL
  69. ; FLOATING POINT ACCUMULATOR.  SUBROUTINES REQUIRING TWO OPERANDS
  70. ; TAKE ONE FROM THE ACCUMULATOR AND THE OTHER FROM THE MEMORY
  71. ; LOCATION INDICATED BY THE CONTENTS OF THE H AND L REGISTERS
  72. ; UPON ENTRY.  THE NUMERIC RESULT OF EACH OPERATION IS STORED
  73. ; IN THE ACCUMULATOR AND IS RETURNED TO THE CALLING ROUTINE
  74. ; IN THE A, B, C, AND D REGISTERS.
  75. ; UPON EXIT FROM THE ARITHMETIC SUBROUTINES, THE PROPERTIES
  76. ; OF THE RESULT ARE INDICATED BY THE SETTINGS OF THE CONTROL
  77. ; BITS.
  78. ;      CARRY BIT = 1   THE RESULT EXCEEDS THE CAPACITY OF THE 
  79. ;                      ACCUMULATOR.  THE OTHER CONTROL BITS, THE
  80. ;                      CONTENTS OF THE HARDWARE REGISTERS, AND
  81. ;                      THE CONTENTS OF THE ACCUMULATOR ARE
  82. ;                      MEANINGLESS.  THIS SITUATION IS ALSO
  83. ;                      INDICATED BY A NON-ZERO QUANTITY BEING
  84. ;                      STORED IN A FLAG WORD.
  85. ;      CARRY BIT = 0   THE RESULT IS IN RANGE.  THE ZERO AND 
  86. ;                      SIGN BITS ARE PROPERLY SET, AND THE A, B,
  87. ;                      C, AND D REGISTERS CONTAIN THE FOUR PARTS
  88. ;                      OF THE ACCUMULATOR.
  89. ;      ZERO BIT = 1    THE RESULT OF THE OPERATION IS ZERO OR
  90. ;                      A QUANTITY TOO SMALL TO BE REPRESENTED.
  91. ;      ZERO BIT = 0    THE RESULT IS NON-ZERO.
  92. ;      SIGN BIT = 1    THE RESULT IS NEGATIVE.
  93. ;      SIGN BIT = 0    THE RESULT IS POSITIVE.
  94. ; DATA ARE REPRESENTED IN A NOTATION WHICH RECORDS EIGHT BITS
  95. ; OF EXPONENT, ONE BIT OF SIGN, AND TWENTY-FOUR BITS OF FRACTION.
  96. ; THE LARGEST MAGNITUDE THAT CAN BE REPRESENTED IS APPROXIMATELY
  97. ; 3.6 * 10 ** 38.  THE SMALLEST NON-ZERO MAGNITUDE IS 
  98. ; APPROXIMATELY 2.7 * 10 ** -39.  THE RESOLUTION OF THE NOTATION
  99. ; IS APPROXIMATELY 6.2 * 10 ** -8; I.E., BETTER THAN SEVEN 
  100. ; DECIMAL DIGIT PRECISION.
  101. ; DATA VALUES ARE REPRESENTED IN FOUR CONSECUTIVE MEMORY WORDS
  102. ; WHICH MUST BE IN THE SAME BANK OF MEMORY.  THE INTERPRETATION
  103. ; OF THESE WORDS IS SHOWN BELOW.
  104. ;      WORD 1           IF NON-ZERO, THIS WORD CONTAINS THE
  105. ;                       EXPONENT PLUS A BIAS OF 200 OCTAL.  THE
  106. ;                       EXPONENT INDICATES THE POWER OF 2 BY
  107. ;                       WHICH THE FRACTION IS TO BE MULTIPLIED TO
  108. ;                       OBTAIN THE REPRESENTED VALUE.  IF THIS
  109. ;                       WORD IS ZERO, THE REPRESENTED VALUE IS ZERO
  110. ;                       AND WORDS 2, 3, AND 4 ARE MEANINGLESS.
  111. ;      WORD 2, BIT 7    THIS BIT INDICATES THE SIGN OF THE VALUE:
  112. ;                       0 IF POSITIVE, 1 IF NEGATIVE.
  113. ;      WORD 2, BITS 6-0 THESE BITS PLUS AN ASSUMED 1 IN BIT 7 POSITION
  114. ;                       ARE THE MOST SIGNIFICANT BITS OF THE FRACTION.
  115. ;                       THE FRACTION IS STORED IN ABSOLUTE FORM 
  116. ;                       (UNSIGNED) WITH THE RADIX POINT POSITIONED TO
  117. ;                       THE LEFT OF BIT 7.  THE VALUE OF THE FRACTION
  118. ;                       IS THUS LESS  1.0 AND EQUAL TO OR GREATER THAN
  119. ;                       THAN 0.5.
  120. ;      WORD 3           THIS WORD CONTAINS THE SECOND MOST SIGNIFICANT
  121. ;                       EIGHT BITS OF THE FRACTION.
  122. ;      WORD 4           THIS WORD CONTAINS THE EIGHT LEAST SIGNIFICANT
  123. ;                       BITS OF THE FRACTION.
  124. ;                  EXAMPLES OF DATA NOTATION
  125. ;          VALUE    WORD1  WORD2  WORD3  WORD4
  126. ;           0.0      00Q    XXX    XXX    XXX     X = DON'T CARE
  127. ;          +1.0      201    00Q    00Q    00Q
  128. ;          -1.0      201    200    00Q    00Q
  129. ;          +0.1      175    114    314    314
  130. ;        -100.0      207    310    63Q    63Q
  131. ; FLOATING POINT ACCUMULATOR.
  132. ; THE FLOATING POINT ACCUMULATOR CONSISTS OF 5 SCRATCHPAD WORDS
  133. ; CONTAINING RESPECTIVELY THE ACCUMULATOR EXPONENT, THE 
  134. ; ACCUMULATOR SIGN, AND THREE WORDS OF ACCUMULATOR FRACTION.
  135. ; THE EXPONENT IS RECORDED WITH A BIAL OF 200 OCTAL.  AN
  136. ; EXPONENT WORD OF ZERO INDICATES THAT THE VALUE IN THE 
  137. ; ACCUMULATOR IS ZERO AND THE REMAINING WORDS OF THE ACCUMULATOR
  138. ; ARE MEANINGLESS.  THE SIGN WORD HOLDS 00Q IF THE ACCUMULATOR
  139. ; IS NEGATIVE, 200 OCTAL IF POSITIVE.  THE FRACTION IS RECORDED
  140. ; AS A NORMALIZED POSITIVE VALUE WITH THE RADIX POINT TO THE 
  141. ; LEFT OF THE MOST SIGNIFICANT BIT OF THE FIRST FRACTION WORD.
  142. ; OVERFLOW FLAG
  143. ; THE OVERFLOW FLAG WORD IS PROVIDED AS A CONVENIENCE TO THE 
  144. ; USER OF THE FLOATING POINT SYSTEM.  THE WORD IS INITIALLY SET
  145. ; TO ZERO AND MAY BE RESET TO ZERO BY THE USER AT ANY TIME.
  146. ; WHEN ANY OF THE SYSTEM ROUTINES DETECTS AN OVERFLOW CONDITION,
  147. ; THE OVERFLOW FLAG IS SET NON-ZERO.  THUS THE USER MAY CLEAR
  148. ; THE FLAG, PERFORM A SEQUENCE OF FLOATING POINT OPERATIONS, AND
  149. ; CHECK THE FLAG TO DETERMINE IF AN OVERFLOW OCCURRED DURING THE
  150. ; SEQUENCE.
  151. ; SIGNIFICANCE INDEX.
  152. ; THE FLOATING POINT ADD AND SUBTRACT SUBROUTINES RETURN A
  153. ; SIGNIFICANCE INDEX TO THE USER WHEN  THE RESULT OF THE
  154. ; OPERATION IS NOT ZERO.  THIS INDEX GIVES AN INDICATION OF THE
  155. ; CHANGE IN THE VALUE OF THE ACCUMULATOR EXPONENT AS A RESULT
  156. ; OF THE ARITHMETIC OPERATION PERFORMED.  IT IS USED PRIMARILY
  157. ; FOR COMPARISON OF TWO VALUES WHICH ARE EXPECTED TO BE EQUAL,
  158. ; BUT WHICH MAY DIFFER BY A SMALL AMOUNT DUE TO MEASUREMENT OR
  159. ; ROUND-OFF ERRORS.  AS AN EXAMPLE, A SIGNIFICANCE INDEX OF
  160. ; 354 OCTAL (-20 DECIMAL) INDICATES THAT THE RESULT OF THE
  161. ; OPERATION IS SMALLER THAN THE OPERANDS BY A FACTOR OF 
  162. ; APPROXIMATELY ONE MILLION (2 ** 20).
  163. ; THE FLOATING POINT TEST, COMPLEMENT AND ABSOLUTE SUBROUTINES
  164. ; RETURN THE SIGNIFICANCE INDEX FROM AN IMMEDIATELY PRECEEDING
  165. ; ADD OR SUBTRACT OPERATION.
  166. ; ARITHMETIC AND UTILITY PACKAGE
  167. ; THE ARITHMETIC AND UTILITY SUBROUTINE PACKAGE OF THE 8008
  168. ; BINARY FLOATING POINT SYSTEM CONTAINS SUBROUTINES FOR
  169. ; PERFORMING THE BASIC ARITHMETIC AND UTILITY OPERATIONS 
  170. ; AVAILABLE IN THE SYSTEM.
  171. ; THE ARITHMETIC AND UTILITY PACKAGE IS CONTAINED IN 768
  172. ; CONSECUTIVE WORDS OF MEMORY (3 BANKS OF ROM) AND DOES NOT
  173. ; REQUIRE THAT ANY OTHER SOFTWARE BE PRESENT IN MEMORY.  THIS
  174. ; PACKAGE USES THE FIRST 54 WORDS OF A BANK OF RAM AS
  175. ; SCRATCHPAD MEMORY.
  176. ; THE INDIVIDUAL SUBROUTINES INCLUDED IN THE ARITHMETIC AND 
  177. ; UTILITY PACKAGE ARE DESCRIBED BELOW.
  178. ; FLOATING POINT INITIALIZE SUBROUTINE
  179. ; THE FLOATING POINT INITIALIZE SUBROUTINE MOVES A SECTION OF
  180. ; CODE FROM ROM MEMORY TO SCRATCHPAD RAM MEMORY IN PREPARATION
  181. ; FOR EXECUTION OF THE FLOATING POINT MULTIPLY AND DIVIDE
  182. ; SUBROUTINES.  THE OVERFLOW FLAG IS ALSO SET TO ZERO.
  183. ;      ENTRY POINT
  184. ;             INIT
  185. ;      ENTRY CONDITIONS
  186. ;             NONE
  187. ;      EXIT CONDITIONS
  188. ;             SCRATCHPAD RAM INITIALIZED
  189. ;      REGISTERS ALTERED
  190. ;             E, H, L
  191. ;      MAXIMUM SUBROUTINE LEVELS USED
  192. ;             0
  193. ; STORE REGISTERS SUBROUTINE
  194. ; THE STORE REGISTERS SUBROUTINE STORES  THE CONTENTS OF THE
  195. ; A,B,C,AND D  REGISTERS IN  FOUR CONSECUTIVE MEMORY LOCATIONS  
  196. ; (IN THE SAME BANK OF RAM).  THE ADDRESS WHERE THE FIRST WORD
  197. ; WILL BE STORED IS INDICATED BY THE CONTENTS OF THE H AND L
  198. ; REGISTERS.
  199. ; ENTRY POINT
  200. ;     STR
  201. ; ENTRY  CONDITIONS
  202. ;      A REGISTER = 1ST WORD TO BE STORED
  203. ;      B REGISTER = 2ND WORD TO BE STORED
  204. ;      C REGISTER = 3RD WORD TO BE STORED
  205. ;      D REGISTER = 4TH WORD TO BE STORED
  206. ;      H REGISTER = MS 6 BITS OF MEMORY ADDRESS
  207. ;      L REGISTER = LS 8 BITS OF MEMORY ADDRESS
  208. ; EXIT  CONDITIONS
  209. ;      THE CONTENTS OF THE REGISTERS ARE STORED IN THE SPECIFIED
  210. ;      MEMORY LOCATION
  211. ; REGISTERS ALTERED
  212. ;      L
  213. ; MAXIMUM SUBROUTINE LEVELS USED
  214. ;      0
  215. ; FLOATING POINT LOAD ROUTINE
  216. ; THE FLOATING POINT LOAD SUBROUTINE  PLACES THE SPECIFIED
  217. ; FLOATING  POINT  OPERAND IN THE FLOATING POINT ACCUMULATOR
  218. ; ENTRY POINT 
  219. ;      LOD
  220. ; ENTRY CONDITIONS
  221. ;      H REGISTER = MS 6 BITS OF OPERAND ADDRESS
  222. ;      L REGISTER = LS 8 BITS OF OPERAND ADDRESS
  223. ; EXIT CONDITIONS
  224. ;      CONTROL  BITS SET AS DEFINED FOR THE SYSTEM
  225. ;      A REGISTER = ACCUMULATOR EXPONENT
  226. ;      B REGISTER = ACCUMULATOR SIGN AND 1ST FRACTION
  227. ;      C REGISTER = ACCUMULATOR 2ND FRACTION
  228. ;      D REGISTER = ACCUMULATOR 3RD FRACTION
  229. ; REGISTERS ALTERED
  230. ;      ALL
  231. ; MAXIMUM SUBROUTINE  LEVELS USED
  232. ;      1
  233. ; FLOATING POINT ADD SUBROUTINE
  234. ; THE FLOATING POINT ADD SUBROUTINE ADDS  THE SPECIFIED
  235. ; FLOATING POINT OPERAND TO THE  VALUE  IN  THE FLOATING POINT
  236. ; ACCUMULATOR AND  PLACES  THE SUM IN  THE FLOATING POINT
  237. ; ACCUMULATOR.
  238. ; ENTRY POINT
  239. ;       ADD
  240. ; ENTRY CONDITIONS
  241. ;       H REGISTER = MS 6 BITS OF OPERAND ADDRESS
  242. ;       L REGISTER = LS 8 BITS OF OPERAND ADDRESS
  243. ; EXIT CONDITIONS
  244. ;       CONTROL BITS SET AS DEFINED FOR THE SYSTEM 
  245. ;       IF OVERFLOW:
  246. ;             LOCATION <OVER> SET NON-ZERO
  247. ;       IF NO OVERFLOW:
  248. ;             A REGISTER = ACCUMULATOR  EXPONENT
  249. ;             B REGISTER = ACCUMULATOR SIGN AND 1ST FRACTION
  250. ;             C REGISTER = ACCUMULATOR 2ND FRACTION
  251. ;             D REGISTER = ACCUMULATOR 3RD FRACTION
  252. ;             E REGISTER = SIGNIFICANCE INDEX
  253. ; REGISTERS ALTERED
  254. ;       ALL
  255. ; MAXIMUM SUBROUTINE  LEVELS  USED
  256. ;       2
  257. ; FLOATING POINT SUBTRACT SUBROUTINE
  258. ; THE  FLOATING POINT SUBTRACT SUBROUTINE SUBTRACTS THE SPECIFIED
  259. ; FLOATING POINT OPERAND FROM THE VALUE IN THE FLOATING POINT
  260. ; ACCUMULATOR AND PLACES THE DIFFERENCE IN  THE FLOATING POINT
  261. ; ACCUMULATOR.
  262. ; ENTRY POINT
  263. ;       SUB
  264. ; ENTRY CONDITIONS
  265. ;       H REGISTER = MS 6 BITS OF OPERAND ADDRESS
  266. ;       L REGISTER = LS 8 BITS OF OPERAND ADDRESS
  267. ; EXIT CONDITIONS
  268. ;       CONTROL BITS SET AS DEFINED  FOR THE SYSTEM
  269. ;       IF  OVERFLOW:
  270. ;           LOCATION <OVER> SET NON-ZERO
  271. ;       IF  NO OVERFLOW:
  272. ;           A REGISTER = ACCUMULATOR EXPONENT
  273. ;           B REGISTER = ACCUMULATOR SIGN AND 1ST FRACTION
  274. ;           C REGISTER = ACCUMULATOR 2ND FRACTION
  275. ;           D REGISTER = ACCUMULATOR 3RD FRACTION
  276. ;           E REGISTER = SIGNIFICANCE INDEX
  277. ; REGISTERS ALTERED
  278. ;      ALL
  279. ; MAXIMUM SUBROUTINE LEVELS USED
  280. ;      2
  281. ; FLOATING POINT ABSOLUTE SUBROUTINE
  282. ; THE FLOATING POINT ABSOLUTE SUBROUTINE SETS THE SIGN OF THE
  283. ; VALUE IN THE FLOATING POINT ACCUMULATOR POSITIVE.
  284. ; ENTRY POINT
  285. ;       ABS
  286. ; ENTRY CONDITIONS
  287. ;       NONE
  288. ; EXIT CONDITIONS
  289. ;       CONTROL BITS SET AS DEFINED FOR THE SYSTEM
  290. ;       A REGISTER = ACCUMULATOR EXPONENT
  291. ;       B REGISTER = ACCUMULATOR SIGN AND 1ST FRACTION
  292. ;       C REGISTER = ACCUMULATOR 2ND FRACTION
  293. ;       D REGISTER = ACCUMULATOR 3RD FRACTION
  294. ;       E REGISTER = SIGNIFICANCE INDEX, IF THE PREVIOUS
  295. ;                    OPERATION WAS AN ADD OR SUBTRACT
  296. ; REGISTERS ALTERED
  297. ;       ALL
  298. ; MAXIMUM SUBROUTINE  LEVELS USED
  299. ;       0
  300. ; FLOATING POINT ZERO SUBROUTINE
  301. ; THE FLOATING  POINT ZERO SUBROUTINE PLACES THE VALUE ZERO IN
  302. ; THE FLOATING POINT ACCUMULATOR.
  303. ; ENTRY POINT
  304. ;       ZRO
  305. ; ENTRY CONDITIONS
  306. ;       NONE
  307. ; EXIT CONDITIONS
  308. ;       CONTROL  BITS SET AS DEFINED FOR THE SYSTEM
  309. ;       A REGISTER = ACCUMULATOR EXPONENT
  310. ;       B REGISTER = ACCUMULATOR SIGN AND 1ST FRACTION
  311. ;       C REGISTER = ACCUMULATOR 2ND FRACTION
  312. ;       D REGISTER = ACCUMULATOR 3RD FRACTION
  313. ; REGISTERS ALTERED
  314. ;       ALL
  315. ; MAXIMUM SUBROUTINE  LEVELS USED
  316. ;       0
  317. ; FLOATING POINT TEST SUBROUTINE
  318. ; THE FLOATING POINT TEST SUBROUTINE LOADS THE VALUE IN THE
  319. ; FLOATING POINT ACCUMULATOR INTO THE REGISTERS AND SETS THE
  320. ; ZERO AND SIGN CONTROL BITS TO INDICATE THE CORRESPONDING
  321. ; ATTRIBUTES OF THE VALUE.
  322. ; ENTRY POINT
  323. ;       TST
  324. ; ENTRY CONDITIONS
  325. ;       NONE
  326. ; EXIT CONDITIONS
  327. ;       CONTROL  BITS SET AS DEFINED FOR THE SYSTEM
  328. ;       A REGISTER = ACCUMULATOR EXPONENT
  329. ;       B REGISTER = ACCUMULATOR SIGN AND 1ST FRACTION
  330. ;       C REGISTER = ACCUMULATOR 2ND FRACTION
  331. ;       D REGISTER = ACCUMULATOR 3RD FRACTION
  332. ;       E REGISTER = SIGNIFICANCE INDEX, IF THE PREVIOUS 
  333. ;                    OPERATION WAS AN ADD OR SUBTRACT
  334. ; REGISTERS ALTERED
  335. ;       ALL
  336. ; MAXIMUM SUBROUTINE LEVELS USED
  337. ;       0
  338. ; FLOATING POINT COMPLEMENT SUBROUTINE
  339. ; THE FLOATING POINT COMPLEMENT SUBROUTINE CHANGES THE
  340. ; ARITHMETIC SIGN OF THE VALUE IN THE FLOATING POINT
  341. ; ACCUMULATOR
  342. ; ENTRY POINT
  343. ;       CHS
  344. ; ENTRY CONDITIONS
  345. ;       NONE
  346. ; EXIT CONDITIONS
  347. ;       CONTROL BITS SET AS DEFINED FOR THE SYSTEM
  348. ;       A REGISTER = ACCUMULATOR EXPONENT
  349. ;       B REGISTER = ACCUMULATOR SIGN AND 1ST FRACTION
  350. ;       C REGISTER = ACCUMULATOR 2ND FRACTION
  351. ;       D REGISTER = ACCUMULATOR 3RD  FRACTION
  352. ;       E REGISTER = SIGNIFICANCE  INDEX, IF THE PREVIOUS
  353. ;                    OPERATION WAS AN ADD OF SUBTRACT
  354. ; REGISTERS ALTERED
  355. ;       ALL
  356. ; MAXIMUM SUBROUTINE LEVELS USED
  357. ;       0
  358. ; SAMPLE PROGRAM USING THE 8008 FLOATING POINT SYSTEM 
  359. ; INVESTIGATE  THE RIGHT TRIANGLE
  360. ; INITIALIZE THE FLOATING POINT  SYSTEM SCRATCHPAD
  361.     ORG    1000Q
  362. BEGIN:    CALL    INIT        ;INITIALIZE THE SCRATCHPAD
  363. ; SQUARE THE BASE AND STORE THE RESULT
  364.     LXI    H,BASE        ;ADDRESS OF THE BASE LEG
  365.     CALL    LOD        ;LOAD THE BASE LEG INTO THE ACCUM
  366.     LXI    H,BASE        ;ADDRESS OF THE BASE LEG
  367.     CALL    MUL        ;SQUARE THE BASE    LEG
  368.     LXI    H,TEMP        ;ADDRESS OF TEMPORARY STORAGE
  369.     CALL    STR
  370. ; SQUARE THE HEIGHT, ADD THE SQUARE OF THE BASE AND STORE
  371.     LXI    H,HEIGHT        ;ADDRESS OF THE HEIGHT LEG
  372.     CALL    LOD        ;LOAD THE HEIGHT LEG INTO THE ACCUM
  373.     LXI    H,HEIGHT
  374.     CALL    MUL        ;SQUARE THE HEIGHT LEG
  375.     LXI    H,TEMP        ;TEMPORARY STORAGE
  376.     CALL    ADD        ;SUM THE BASE AND HEIGHT SQUARES
  377.     LXI    H,TEMP        ;TEMP STORAGE
  378.     CALL    STR        ;SAVE THE SUM OF THE SQUARES
  379. ; SQUARE  THE HYPOTENUSE, SUBTRACT THE SUM OF THE SQUARES OF THE LEGS
  380.     LXI    H,HYPOT        ;ADDRESS OF THE HYPOTENUSE
  381.     CALL    LOD        ;LOAD THE HYPOTENUSE INTO THE ACCUM
  382.     LXI    H,HYPOT
  383.     CALL    MUL        ;SQUARE THE HYPOT
  384.     LXI    H,TEMP        ;TEMP STORAGE
  385.     CALL    SUB        ;SUBTRACT THE SUM OF THE SQUARES OF THE LEGS
  386. ;  CHECK FOR AN OVERFLOW DURING THE ABOVE OPERATIONS
  387.     MVI    H,SCRB        ;ADDRESS THE SCRATCH BANK
  388.     MVI    L,OVER        ;ADDRESS THE OVERFLOW FLAG
  389.     MOV    A,M        ;GET THE FLAG
  390.     ANA    A        ;SET THE CONTROL    BITS
  391.     JNZ    ERR3        ;JUMP IF AN OVERFLOW OCCURRED
  392.     CALL    TST        ;TEST THE ACCUMULATOR
  393.     JZ    OK        ;IF THE ACCUM IS ZERO
  394. ; CHECK  FOR ROUND OFF ERROR
  395.     MOV    A,E
  396.     ADI    22
  397.     JP    ERR2
  398. ; PYTHAGORAS WAS ALL WET
  399. ERR1:    HLT
  400. ; HE WAS PRETTY CLOSE
  401. ERR2:    HLT
  402. ; THAT IS A BIG TRIANGLE
  403. ERR3:    HLT
  404. ; RIGHT ON
  405. ;   (THE PROGRAM STOPS HERE IF IT HAS BEEN KEYED IN WITHOUT ERROR,
  406. ;    AND IF THE CPU IS FUNCTIONING PROPERLY)
  407. OK:    HLT
  408. ; DATA STORAGE
  409. BASE:    DB    202Q,300Q,0,0        ;-3
  410. HEIGHT: DB    203Q,0,0,0        ;4
  411. HYPOT:    DB    203Q,40Q,0,0        ;5
  412. TEMP:    DB    0,0,0,0        ;TEMPORARY STORAGE
  413. ;      FLOATING POINT ARITHMETIC PACKAGE
  414.     ORG    1400Q        ;SET ORIGIN TO 1400 OCTAL
  415. ARTHB    EQU    3        ;BANK    NO. OF ARITH PKG
  416. ARITH    EQU    $
  417. SCR    EQU    5400Q
  418. SCRB    EQU    13Q        ;BANK NO. OF SCRATCHPAD
  419. ; 8008 BINARY FLOATING POINT SYSTEM
  420. ; ARITHMETIC AND UTILITY PACKAGE
  421. ; PROGRAMMER: CAL OHME
  422. ; DATE: 26 DECEMBER 1973
  423. ; ARITH IS THE BEGINNING ADDRESS OF THE
  424. ; ARITHMETIC AND UTILITY PACKAGE OF THE FLOATING
  425. ; POINT SYSTEM.
  426. ; SCR IS THE BEGINNING ADDRESS OF THE RAM USED AS 
  427. ; SCRATCHPAD FOR THE SYSTEM.
  428. ; THE RAM MULTIPLY AND DIVIDE SUBROUTINES
  429. ; ARE MOVED FROM  ROM TO RAM BY SUBROUTINE
  430. ; INIT AND ARE EXECUTED IN RAM ONLY.
  431. ; RAM MULTIPLY SUBROUTINE.
  432. MULX4    EQU    $-ARITH+SCR
  433.     ADI    0        ;ADD OPERAND 3RD FRACTION
  434. MULP3    EQU    $-1-ARITH
  435.     MOV    E,A        ;4TH PARTIAL PROD
  436.     MOV    A,D        ;3RD PARTIAL PROD
  437.     ACI    0        ;ADD OPERAND 2ND FRACTION
  438. MULP2    EQU    $-1-ARITH
  439.     MOV    D,A        ;3RD PARTIAL PROD
  440.     MOV    A,C        ;2ND PARTIAL PROD
  441.     ACI    0        ;ADD OPERAND 1ST FRACTION
  442. MULP1    EQU    $-1-ARITH
  443.     JMP    MULX5        ;TO ROM CODE
  444. ; RAM DIVIDE SUBTROUTINE
  445. DIVX5    EQU    $-ARITH+SCR
  446.     SUI    0        ;SUB DIVISOR 4TH FRACTION
  447. OP4S    EQU    $-1-ARITH
  448.     MOV    A,L        ;REMAINDER 3RD FRACTION
  449.     SBI    0        ;SUBDIVISOR 3RD FRACTION
  450. OP3S    EQU    $-1-ARITH
  451.     MOV    L,A        ;REMAINDER 3RD FRACTION
  452.     MOV    A,H        ;REMAINDER 2ND FRACTION
  453.     SBI    0        ;SUB DIVISOR 2ND FRACTION
  454. OP2S    EQU    $-1-ARITH
  455.     MOV    H,A        ;REMAINDER 2ND FRACTION
  456.     MOV    A,E        ;REMAINDER 1ST FRACTION
  457.     SBI    0        ;SUB DIVISOR 1ST FRACTION
  458. OP1S    EQU    $-1-ARITH
  459.     MOV    E,A        ;REMAINDER 1ST FRACTION
  460.     MVI    A,0        ;REMAINDER 4TH FRACTION
  461. OP4A    EQU    $-1-ARITH
  462.     RET        ;RETURN TO ROM
  463. DIVX6    EQU    $-ARITH+SCR
  464.     ADI    0        ;ADD DIVISOR 3RD FRACTION
  465. OP3A    EQU    $-1-ARITH
  466.     MOV    L,A        ;REMAINDER 3RD FRACTION
  467.     MOV    A,H        ;REMAINDER 2ND FRACTION
  468.     ACI    0        ;ADD DIVISOR 2ND FRACTION
  469. OP2A    EQU    $-1-ARITH
  470.     MOV    H,A        ;REMAINDER 2ND FRACTION
  471.     MOV    A,E        ;REMAINDER 1ST FRACTION
  472.     ACI    0        ;ADD DIVISOR 1ST FRACTION
  473. OP1A    EQU    $-1-ARITH
  474.     MOV    E,A        ;REMAINDER 1ST FRACTION
  475.     MVI    A,0        ;REMAINDER 4TH FRACTION
  476. OP4X    EQU    $-1-ARITH
  477.     JMP    DIVX2        ;TO ROM CODE
  478. ;  RAM  LOCATIONS USED BY  THE BINARY FLOATING POINT SYSTEM
  479. OVER    EQU    $-ARITH
  480.     DB    0        ;INITIALLY CLEAR
  481. PREX    EQU    OVER+1        ;PREVIOUS EXPONENT
  482. ACCE    EQU    PREX+1        ;ACCUMULATOR EXPONENT
  483. ACCS    EQU    ACCE+1        ;ACCUMULATOR SIGN
  484. ACC1    EQU    ACCS+1        ;ACCUMULATOR 1ST FRACTION
  485. ACC2    EQU    ACC1+1        ;ACCUMULATOR 2ND FRACTION
  486. ACC3    EQU    ACC2+1        ;ACCUMULATOR 3RD FRACTION
  487. SF    EQU    ACC3+1        ;SUBTRACTION FLAG
  488. ; INIT SUBROUTINE ENTRY POINT
  489. INIT:    MVI    L,PREX        ;ADDRESS LAST WORD TO MOVE
  490. INIT1:    MVI    H,ARTHB        ;ADDRESS ROM COPY
  491.     MOV    E,M        ;CURRENT WORD OF ROM COPY
  492.     MVI    H,SCRB        ;ADDRESS RAM COPY
  493.     MOV    M,E        ;WRITE CURRENT WORD TO RAM
  494.     DCR    L        ;DECREMENT WORD ADDRESS
  495.     JP    INIT1        ;IF MORE TO MOVE
  496.     RET        ;RETURN TO CALLER
  497. ; STR SUBROUTINE ENTRY POINT
  498. STR0:    MOV    M,E        ;STORE ZEROETH WORD
  499.     INR    L        ;ADDRESS FIRST WORD
  500. STR:    MOV    M,A        ;STORE FIRST WORD
  501. STR1:    INR    L        ;ADDRESS SECOND WORD
  502.     MOV    M,B        ;STORE SECOND WORD
  503.     INR    L
  504.     MOV    M,C        ;STORE THIRD WORD
  505.     INR    L
  506.     MOV    M,D        ;STORE FOURTH WORD
  507.     RET        ;RETURN TO    CALLER
  508. ; FLOATING  POINT ZRO SUBROUTINE ENTRY POINT
  509. ZRO:    MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  510. ZRO1:    MVI    L,ACCE        ;ADDRESS ACCUM EXPONENT
  511.     XRA    A        ;CLEAR THE A REGISTER
  512.     MOV    M,A        ;CLEAR THE ACCUM EXPONENT
  513.     RET        ;RETURN TO CALLER
  514. ; FLOATING  POINT CHS SUBROUTINE ENTRY POINT
  515. CHS:    MVI    A,200Q        ;MASK FOR SIGN BIT
  516.     MVI    B,0        ;MVI INST TO SKIP NEXT WORD
  517.     ORG    $-1
  518. ; FLOATING POINT ABS SUBROUTINE ENTRY POINT
  519. ABS:    XRA    A        ;CLEAR THE A REGISTER
  520.     MVI    H,SCRB        ;ADDRESS THE SCRATCH BANK
  521.     MVI    L,ACCS        ;ADDRESS ACCUM SIGN
  522.     ANA    M
  523.     XRI    200Q        ;COMPLEMENT THE SIGN BIT
  524.     MOV    M,A        ;PUT THE ACCUM SIGN BACK
  525. ; FLOATING POINT TEST ENTRY POINT
  526. TST:    MVI    H,SCRB        ;ADDRESS    SCRATCH    BANK
  527. TST1:    MVI    L,ACCE        ;ACCUM EXPONENT
  528.     MOV    A,M        ;GET THE EXPONENT
  529.     ANA    A        ;SET CONTROL BITS
  530.     JZ    ZRO        ;IF ACCUM IS ZERO
  531.     MOV    E,A        ;ACCUM EXPONENT
  532.     INR    L        ;ADDRESS THE ACCUM SIGN
  533.     MOV    A,M
  534.     INR    L        ;ADDRESS ACCUM 1ST FRACTION
  535.     XRA    M        ;XOR ACCUM SIGN AND 1ST FRACTION
  536.     INR    L        ;ADDRESS ACCUM 2ND FRACTION
  537.     MOV    C,M
  538.     INR    L        ;ADDRESS ACCUM 3RD FRACTION
  539.     MOV    D,M
  540.     JMP    ADD12        ;TO SET EXIT CONDITIONS
  541. ; FLOATING POINT LOAD ENTRY POINT
  542. LOD:    MOV    A,M        ;OPERAND EXPONENT
  543.     ANA    A        ;SET CONTROL BITS
  544.     JZ    ZRO        ;IF OPERAND IS ZERO
  545.     MOV    E,A        ;OPERAND EXPONENT
  546.     INR    L        ;ADDRESS OPERAND SIGN AND 1ST FRACTION
  547.     MOV    A,M
  548.     INR    L        ;ADDRESS OPERAND 2ND FRACTION
  549.     MOV    C,M
  550.     INR    L        ;ADDRESS OPERAND 3RD FRACTION
  551.     MOV    D,M
  552. ; STORE THE OPERAND IN  THE ACCUM
  553.     MOV    L,A        ;OPERAND SIGN AND 1ST FRACTION
  554. LOD1:    ORI    200Q        ;SET THE ASSUMED MSB IN THE FIRST    FRACTION
  555. ;                            TO A 1
  556.     MOV    B,A        ;ACCUM 1ST FRACTION
  557.     XRA    L        ;ACCUMULATOR SIGN
  558.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  559.     MVI    L,ACCE        ;ADDRESS ACCUM EXPONENT
  560.     CALL    STR0        ;SET THE ACCUMULATOR
  561.     XRA    B        ;ACCUM SIGN AND 1ST FRACTION
  562. ; SET CONTROL BITS AND EXIT
  563.     MOV    B,A        ;ACCUM SIGN AND 1ST FRACTION
  564.     ORI    1        ;SET SIGN BIT FOR EXIT
  565.     MOV    A,E        ;ACCUMULATOR EXPONENT
  566.     RET        ;RETURN TO CALLER
  567. ; FLOATING POINT MUL SUBROUTINE  ENTRY POINT
  568. MUL:    MOV    A,M        ;OPERAND EXPONENT
  569.     ANA    A        ;SET CONTROL BITS
  570.     CNZ    MDEX        ;READ OPERAND IN NOT ZERO
  571.     JZ    ZRO        ;IF ZERO OR UNDERFLOW
  572.     JC    OVERF        ;IF OVERFLOW
  573.     CALL    MULX        ;CALL FIXED MULT SUBROUTINE
  574. ; NORMALIZE IF NECESSARY
  575.     MOV    A,B        ;1ST PRODUCT
  576.     ANA    A        ;SET CONTROL BITS
  577.     JM    RNDA        ;IF NO NORMALIZATION NECESSARY
  578.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  579.     MOV    A,M
  580.     SBI    1        ;DECR ACCUM EXP
  581.     MOV    M,A
  582.     RZ        ;RETURN TO CALLER IF UNDERFLOW
  583.     CALL    LSH        ;CALL LEFT SHIFT ROUTINE
  584. ; ROUND IF NECESSARY
  585. RNDA:    CALL    ROND        ;CALL ROUNDING SUBROUTINE
  586.     JC    OVERF        ;IF OVERFLOW
  587.     MOV    B,A        ;ACCUM SIGN AND 1ST FRACTION
  588.     ORI    1        ;GET SIGN BIT
  589.     MOV    A,E        ;ACCUM EXP
  590.     RET
  591. ; FLOATING POINT DIV SUBROUTINE ENTRY POINT
  592. DIV:    XRA    A        ;CLEAR A REGISTER
  593.     SUB    M        ;COMPLEMENT OF DIVISOR EXPONENT
  594.     CPI    1        ;SET CARRY IF DIVISION BY ZERO
  595.     CNC    MDEX        ;READ OPERAND IF NOT ZERO
  596.     JC    OVERF        ;IF OVERFLOW OR DIVISION BY ZERO
  597.     JZ    ZRO1        ;IF UNDERFLOW OF ZERO
  598.     MOV    C,A        ;DIVISOR 1ST FRACTION
  599.     CALL    DIVX        ;CALL FIXED DIVISION SUBROUTINE
  600.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  601.     JC    RNDA        ;IF NO OVERFLOW
  602. ; SET OVERFLOW FLAG
  603. OVERF:    MVI    H,SCRB        ;ADDR SCRATCH BANK
  604.     MVI    L,OVER        ;ADDRESS OVERFLOW FLAG
  605.     MVI    A,-1        ;OVERFLOW FLAG
  606.     MOV    M,A        ;STORE OVERFLOW FLAG
  607.     RLC        ;SET CARRY BIT FOR EXIT
  608.     RET
  609.     DB    0        ;CHECK SUM WORD
  610. ; FLOATING POINT SUB SUBROUTINE ENTRY POINT
  611. SUB:    MVI    A,200Q        ;MASK TO CHANGE OPERAND SIGN
  612.     MVI    B,0        ;MVI INST TO SKIP NEXT WORD
  613.     ORG    $-1
  614. ; FLOATING POINT ADD SUBROUTINE ENTRY POINT
  615. ADD:    XRA    A        ;CLEAR THE A REGISTER
  616. ; LOAD THE OPERAND
  617.     MOV    E,M        ;OPERAND EXPONENT
  618.     INR    L        ;ADDRESS OPERAND SIGN, 1ST FRACTION
  619.     XRA    M
  620.     MOV    B,A        ;OPERAND SIGN AND 1ST FRACTION
  621.     INR    L        ;ADDRESS OPERAND 2ND FRACTION
  622.     MOV    C,M
  623.     INR    L        ;ADDRESS OPERAND 3RD FRACTION
  624.     MOV    D,M
  625. ; SAVE INITIAL EXPONENT
  626.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  627.     MVI    L,ACCE        ;ADDRESS ACCUM EXPONENT
  628.     MOV    A,M
  629.     DCR    L        ;ADDRESS INITIAL EXPONENT
  630.     MOV    M,A        ;SAVE INITIAL EXPONENT
  631. ; CHECK FOR ZERO OPERAND
  632.     MOV    A,E        ;OPERAND EXP
  633.     ANA    A        ;SET CONTROL BITS
  634.     JZ    TST1        ;IF OPERAND IS ZERO
  635. ; GENERATE SUBTRACTION FLAG, RESTORE SUPPRESSED FRACTION BIT
  636.     MOV    L,B        ;OPERAND SIGN AND 1ST FRACTION
  637.     MOV    A,B
  638.     ORI    200Q        ;SET ASSUMED MSB
  639.     MOV    B,A        ;OPERAND 1ST FRACTION
  640.     XRA    L        ;OPERAND SIGN
  641.     MVI    L,ACCS        ;ADDRESS ACCUM SIGN
  642.     XRA    M        ;SUBTRACTION FLAG
  643.     MVI    L,SF        ;ADDRESS SUBTRACTION FLAG
  644.     MOV    M,A        ;STORE IT
  645. ; DETERMINE RELATIVE MAGNITUDES OF OPERAND AND ACCUM
  646.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  647.     MOV    A,M
  648.     ANA    A        ;SET CONTROL BITS
  649.     JZ    ADD17        ;IF ACCUM IS ZERO
  650.     SUB    E        ;DIFFERENCE OF EXPONENTS
  651.     JC    ADD2        ;IF ACCUM SMALLER THAN OPERAND
  652. ; CHECK FOR INSIGNIFICANT OPERAND
  653.     JM    TST1        ;IF OPERAND IS INSIG
  654.     CPI    25        ;COMPARE SHIFT COUNT TO 25
  655.     JC    ADD3        ;JOIN EXCHANGE PATH IF OP IS SIGNIFICANT
  656.     JMP    TST1        ;OPERAND IS INSIGNIFICANT
  657. ; CHECK FOR INSIGNIFICANT  ACCUM
  658. ADD2:    JP    ADD17        ;IF ACCUM IS INSIGNIFICANT
  659.     CPI    -25        ;COMPARE SHIFT COUNT TO MINUS 25
  660.     JC    ADD17        ;IF ACCUM IS INSIG
  661.     MOV    M,E        ;OPERAND EXP
  662.     MOV    E,A        ;SHIFT COUNT
  663.     MVI    L,SF        ;ADDRESS THE SUBTRACTION FLAG
  664.     MOV    A,M
  665.     MVI    L,ACCS        ;ADDRESS THE ACCUM SIGN
  666.     XRA    M        ;OPERAND SIGN
  667.     MOV    M,A        ;ACCUM SIGN
  668.     XRA    A        ;ZERO THE A REGISTER
  669.     SUB    E        ;COMPLEMENT SHIFT COUNT
  670. ; EXCHANGE ACCUM AND OPERAND
  671.     INR    L        ;ADDRESS ACCUM 1ST FRACTION
  672.     MOV    E,M
  673.     MOV    M,B        ;OPERAND 1ST FRACTION
  674.     MOV    B,E        ;ACCUM 1ST FRACTION
  675.     INR    L        ;ADDRESS ACCUM 2ND FRACTION
  676.     MOV    E,M
  677.     MOV    M,C        ;OPERAND 2ND FRACTION
  678.     MOV    C,E        ;ACCUM 2ND FRACTION
  679.     INR    L        ;ADDRESS ACCUM 3RD FRACTION
  680.     MOV    E,M
  681.     MOV    M,D        ;OPERAND 3RD FRACTION
  682.     MOV    D,E        ;ACCUM 3RD FRACTION
  683. ; POSITION THE OPERAND
  684. ADD3:    CALL    RSH        ;CALL RIGHT SHIFT 
  685.     MVI    L,SF        ;ADDRESS THE SUBTRACTION FLAG
  686.     MOV    A,M
  687.     ANA    A        ;SET CONTROL BITS
  688.     MVI    L,ACC3        ;ADDRESS ACCUM 3RD FRACTION
  689.     JM    ADD9        ;IF SUBTRACTION REQUIRED
  690. ; ADD ADDEND TO  AUGEND
  691.     MOV    A,M        ;AUGEND 3RD    FRACTION
  692.     ADD    D        ;ADDEND 3RD FRACTION
  693.     MOV    D,A        ;SUM 3RD FRACTION
  694.     DCR    L        ;ADDRESS AUGEND 2ND FRACTION
  695.     MOV    A,M
  696.     ADC    C        ;ADDEND 2ND FRACTION
  697.     MOV    C,A        ;SUM 2ND FRACTION
  698.     DCR    L        ;ADDRESS AUGEND 1ST FRACTION
  699.     MOV    A,M
  700.     ADC    B        ;ADDEND 1ST FRACTION
  701.     MOV    B,A        ;SUM 1ST FRACTION
  702.     JNC    ADD11        ;IF NO CARRY FROM 1ST FRACTION
  703. ; RIGHT SHIFT SUM TO  NORMALIZED POSITION
  704.     RAR        ;RIGHT SHIFT SUM 1ST FRACTION
  705.     MOV    B,A        ;SUM 1ST FRACTION
  706.     MOV    A,C        ;SUM 2ND FRACTION
  707.     RAR        ;RIGHT SHIFT SUM 2ND FRACTION
  708.     MOV    C,A        ;SUM 2ND FRACTION
  709.     MOV    A,D        ;SUM 3RD FRACTION
  710.     RAR        ;RIGHT SHIFT SUM 3RD FRACTION
  711.     MOV    D,A        ;SUM 3RD FRACTION
  712.     RAR        ;4TH FRACTION = LOW BIT OF 3RD
  713.     MOV    E,A        ;SUM 4TH FRACTION
  714.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  715.     MOV    A,M
  716.     ADI    1        ;INCREMENT ACCUMULATOR EXP
  717.     JC    OVERF        ;IF OVERFLOW
  718.     MOV    M,A        ;STORE ACCUM EXP
  719.     JMP    ADD11        ;TO ROUND FRACTION
  720. ; SUBTRACT  SUBTRAHEND FROM MINUEND
  721. ADD9:    XRA    A        ;MINUEND 4TH FRACTION IS ZERO
  722.     SUB    E        ;SUBTRAHEND 4TH FRACTION
  723.     MOV    E,A        ;DIFFERENCE 4TH FRACTION
  724.     MOV    A,M        ;MINUEND 3RD FRACTION
  725.     SBB    D        ;SUBTRA 3RD FRACTION
  726.     MOV    D,A        ;DIFF 3RD FRACTION
  727.     DCR    L        ;ADDRESS MINUEND 2ND FRACTION
  728.     MOV    A,M
  729.     SBB    C        ;SUBTRA 2ND FRACTION
  730.     MOV    C,A        ;DIFF 2ND FRACTION
  731.     DCR    L        ;ADDRESS MINUEND 1ST    FRACTION
  732.     MOV    A,M
  733.     SBB    B        ;SUBTRA 1ST FRACTION
  734.     MOV    B,A        ;DIFF 1ST FRACTION
  735. ADD10:    CC    COMP        ;COMPLEMENT IF NECESSARY
  736.     CP    NORM        ;NORMALIZE IF NECESSARY
  737.     JP    ZRO1        ;IF UNDERFLOW OR ZERO
  738. ADD11:    CALL    ROND        ;CALL ROUNDING SUBROUTINE
  739.     JC    OVERF        ;IF OVERFLOW
  740. ADD12:    MOV    B,A        ;ACCUM SIGN AND 1ST FRACTION
  741.     MVI    L,PREX        ;ADDRESS PREVIOUS EXP
  742.     MOV    A,E        ;ACCUM EXP
  743.     SUB    M        ;DIFFERENCE IN EXPONENTS
  744.     MOV    L,A
  745.     MOV    A,B        ;ACCUM SIGN AND 1ST FRACTION
  746.     ORI    1        ;SET SIGN BIT FOR EXIT
  747.     MOV    A,E        ;ACCUM EXP
  748.     MOV    E,L        ;SIGNIFICANCE INDEX
  749.     RET
  750. ; LOAD THE ACCUM WITH THE OPERAND
  751. ADD17:    MVI    L,SF        ;ADDRESS THE SUBTRACTION FLAG
  752.     MOV    A,M
  753.     MVI    L,ACCS        ;ADDRESS THE ACCUM SIGN
  754.     XRA    M        ;OPERAND SIGN
  755.     DCR    L        ;ADDRESS ACCUM EXP
  756.     CALL    STR0        ;SET THE ACCUM
  757.     XRA    B        ;ACCUM SIGN AND 1ST FRACTION
  758.     JMP    ADD12        ;JOIN EXIT CODE
  759.     DB    0        ;CHECH SUM WORD
  760. ; SUBROUTINE TO READ THE OPERAND AND
  761. ; CHECK THE ACCUMULATOR EXPONENT
  762. MDEX:    MOV    B,A        ;EXPONENT MODIFIER
  763.     INR    L        ;ADDRESS OPERAND SIGN, 1ST FRACTION
  764.     MOV    C,M
  765.     INR    L        ;ADDRESS OPERAND 2ND FRACTION
  766.     MOV    D,M
  767.     INR    L        ;ADDRESS OPERAND 3RD FRACTION
  768.     MOV    E,M
  769.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  770.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  771.     MOV    A,M
  772.     ANA    A        ;SET CONTROL BITS
  773.     RZ        ;RETURN IF ACCUM IS ZERO
  774.     ADD    B        ;RESULT EXP PLUS BIAS
  775.     MOV    B,A
  776.     RAR        ;CARRY TO SIGN
  777.     XRA    B        ;CARRY AND SIGN MUST DIFFER
  778.     MOV    A,B        ;RESULT EXP PLUS BIAS
  779.     MVI    B,200Q        ;EXP BIAS, SIGN MASK, MOST SIG BIT
  780.     JP    OVUN        ;IF OVER OR UNDERFLOW
  781.     SUB    B        ;REMOVE EXCESS EXP BIAS
  782.     RZ        ;RETURN IF UNDERFLOW
  783.     MOV    M,A        ;RESULT EXP
  784.     INR    L        ;ADDRESS ACCUM SIGN
  785.     MOV    A,M
  786.     XRA    C        ;RESULT SIGN IN SIGN BIT
  787.     ANA    B        ;RESULT SIGN
  788.     MOV    M,A        ;STORE IT
  789.     MOV    A,C        ;OPERAND SIGN AND 1ST FRACTION
  790.     ORA    B        ;OPERAND FIRST FRACTION
  791.     RET
  792. OVUN:    RLC        ;SET CARRY BIT IF OVERFLOW
  793.     RC        ;RETURN IF OVERFLOW
  794.     XRA    A        ;CLEAR A REGISTER
  795.     RET        ;RETURN IF UNDERFLOW
  796. ; SUBROUTINE TO LEFT SHIFT THE B,C,D,AND E REGISTERS ONE BIT
  797. LSH:    MOV    A,E        ;ORIGINAL CONTENTS OF E
  798.     RAL        ;LEFT SHIFT E
  799.     MOV    E,A        ;RESTORE CONTENTS OF E 
  800. LSH1:    MOV    A,D        ;ORIGINAL CONTENTS OF D
  801.     RAL        ;LEFT SHIFT D
  802.     MOV    D,A        ;RESTORE D
  803.     MOV    A,C        ;ORIGINAL CONTENTS OF C
  804.     RAL        ;LEFT SHIFT C
  805.     MOV    C,A        ;RESTORE C
  806.     MOV    A,B        ;ORIGINAL CONTENTS OF B
  807.     ADC    A        ;LEFT SHIFT B
  808.     MOV    B,A        ;RESTORE B
  809.     RET
  810. ; RIGHT SHIFT THE B,C,D,AND E REGISTERS
  811. ; BY THE SHIFT COUNT IN THE A REGISTER
  812. ; SHIFT OPERAND TO REGISTER INDICATED BY
  813. ; SHIFT COUNT
  814. RSH:    MVI    E,0        ;OPERAND 4TH FRACTION IS ZERO
  815. RSH0:    MVI    L,8        ;EACH REG IS 8 BITS OF SHIFT
  816. RSH1:    CMP    L        ;COMPARE SHIFT COUNT TO 8
  817.     JM    RSH2        ;IF REQUIRED SHIFT LESS    THAN 8
  818.     MOV    E,D        ;OPERAND 4TH FRACTION
  819.     MOV    D,C        ;OPERAND 3RD FRACTION
  820.     MOV    C,B        ;OPERAND 2ND FRACTION
  821.     MVI    B,0        ;OPERAND 1ST FRACTION IS ZERO
  822.     SUB    L        ;REDUCE SHIFT COUNT BY 1 REG
  823.     JNZ    RSH1        ;IF MORE SHIFTS REQUIRED
  824. ; SHIFT OPERAND RIGHT BY <SHIFT COUNT> BITS
  825. RSH2:    ANA    A        ;SET CONTROL BITS
  826.     RZ        ;RETURN IF SHIFT COMPLETE
  827.     MOV    L,A        ;SHIFT COUNT
  828. RSH3:    ANA    A        ;CLEAR CARRY BIT
  829.     MOV    A,B        ;OPERAND 1ST FRACTION
  830.     RAR        ;RIGHT SHIFT OPERAND 1ST FRACTION
  831.     MOV    B,A        ;OP 1ST FRACTION
  832.     MOV    A,C        ;OP 2ND FRACTION
  833.     RAR
  834.     MOV    C,A        ;OP 2ND FRACTION
  835.     MOV    A,D        ;OP 3RD FRACTION
  836.     RAR
  837.     MOV    D,A        ;OP 3RD FRACTION
  838.     MOV    A,E        ;OP 4TH FRACTION
  839.     RAR
  840.     MOV    E,A        ;OP 4TH FRACTION
  841.     DCR    L        ;DECREMENT SHIFT COUNT
  842.     JNZ    RSH3        ;IF MORE SHIFTS REQUIRED
  843.     RET
  844. ; COMPLEMENT THE B,C,D,AND E REGISTERS
  845. COMP:    DCR    L        ;ADDRESS ACCUM SIGN
  846.     MOV    A,M
  847.     XRI    200Q        ;CHANGE SIGN
  848.     MOV    M,A        ;PUT IT BACK
  849. COMP1:    XRA    A        ;ZERO    THE A REGISTER
  850.     MOV    L,A        ;ZERO L REG
  851.     SUB    E        ;COMPLEMENT 4TH FRACTION
  852.     MOV    E,A        ;4TH FRACTION
  853.     MOV    A,L        ;ZERO A REG
  854.     SBB    D        ;COMPLEMENT 3RD FRACTION
  855.     MOV    D,A        ;3RD FRACTION
  856.     MOV    A,L        ;ZERO A REG
  857.     SBB    C        ;COMPLEMENT 2ND FRACTION
  858.     MOV    C,A        ;2ND FRACTION
  859.     MOV    A,L        ;ZERO A REG
  860.     SBB    B        ;COMPLEMENT 1ST FRACTION
  861.     MOV    B,A        ;1ST FRACTION
  862.     RET
  863. ; NORMALIZE THE REGISTERS
  864. NORM:    MVI    L,32        ;MAXIMUM NORMALIZING SHIFT
  865. NORM1:    MOV    A,B        ;1ST FRACTION
  866.     ANA    A        ;SET CONTROL BITS
  867.     JNZ    NORM3        ;IF 1ST FRACTION NONZERO
  868.     MOV    B,C        ;1ST FRACTION
  869.     MOV    C,D        ;2ND FRACTION
  870.     MOV    D,E        ;3RD FRACTION
  871.     MOV    E,A        ;ZERO    4TH FRACTION
  872.     MOV    A,L        ;NORMALIZING SHIFT COUNT
  873.     SUI    8        ;REDUCE SHIFT COUNT
  874.     MOV    L,A        ;NORMALIZING SHIFT COUNT
  875.     JNZ    NORM1        ;IF FRACTION NONZERO
  876.     RET        ;IF FRACTION ZERO
  877. NORM2:    DCR    L        ;DECREMENT SHIFT COUNT
  878.     MOV    A,E        ;ORIGINAL CONTENTS OF    E
  879.     RAL        ;LEFT    SHIFT E
  880.     MOV    E,A        ;PUT E BACK
  881.     MOV    A,D
  882.     RAL
  883.     MOV    D,A
  884.     MOV    A,C
  885.     RAL
  886.     MOV    C,A
  887.     MOV    A,B
  888.     ADC    A        ;LEFT SHIFT B
  889.     MOV    B,A        ;PUT B BACK
  890. NORM3:    JP    NORM2        ;IF NOT NORMALIZED
  891.     MOV    A,L        ;NORMALIZING SHIFT COUNT
  892.     SUI    32        ;REMOVE BIAS
  893.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  894.     ADD    M        ;ADJUST ACCUM EXP
  895.     MOV    M,A        ;NEW ACCUM EXP
  896.     RZ        ;RETURN IF ZERO EXP
  897.     RAR        ;MOVE BORROW BIT TO SIGN
  898.     ANA    A        ;SET SIGN TO INDICATE UNDERFLOW
  899.     RET
  900. ; SUBROUTINE  TO ROUND THE B,C,D REGISTERS
  901. ROND:    MVI    L,ACCE        ;ADDRESS    THE ACCUM EXP
  902.     MOV    A,E        ;4TH FRACTION
  903.     ANA    A        ;SET CONTROL BITS
  904.     MOV    E,M        ;ACCUM EXP
  905.     CM    RNDR        ;CALL 2ND LEVEL ROUNDER
  906.     RC        ;IF OVERFLOW
  907.     MOV    A,B        ;1ST FRACTION
  908.     INR    L        ;ADDRESS ACCUM    SIGN
  909.     XRA    M        ;ACCUM SIGN AND 1ST FRACTION
  910.     JMP    STR1        ;RETURN THROUGH    STORE SUBROUTINE
  911. ; SECOND LEVEL ROUNDING ROUTINE
  912. RNDR:    INR    D        ;ROUND    3RD FRACTION
  913.     RNZ        ;RETURN IF NO CARRY
  914.     INR    C        ;CARRY TO 2ND FRACTION
  915.     RNZ        ;RETURN IF NO CARRY
  916.     INR    B        ;CARRY TO    1ST FRACTION
  917.     RNZ        ;RETURN IF NO CARRY
  918.     MOV    A,E        ;ACCUM EXP
  919.     ADI    1        ;INCREMENT ACCUM    EXP
  920.     MOV    E,A        ;NEW ACCUM    EXP
  921.     MVI    B,200Q        ;NEW 1ST FRACTION
  922.     MOV    M,A        ;NEW ACCUM EXP
  923.     RET
  924. ; FIXED POINT MULTIPLY SUBROUTINE
  925. MULX:    MVI    L,MULP1        ;ADDRESS 1ST MULTIPLICAND
  926.     MOV    M,A        ;1ST MULT
  927.     MVI    L,MULP2        ;ADDRESS 2ND MULTIPLICAND
  928.     MOV    M,D        ;2ND MULT
  929.     MVI    L,MULP3        ;ADDRESS 3RD MULTIPLICAND
  930.     MOV    M,E        ;3RD MULT
  931.     XRA    A        ;CLEAR 6TH PRODUCT
  932.     MOV    E,A        ;CLEAR 5TH PRODUCT
  933.     MOV    D,A        ;CLEAR 4TH PRODUCT
  934. ; MULTIPLY  BY EACH ACCUMULATOR FRACTION IN TURN
  935.     MVI    L,ACC3        ;ADDRESS 3RD FRACTION
  936.     CALL    MULX2        ;MULTIPLY BY ACCUM 3RD FRACTION
  937.     MVI    L,ACC2        ;ADDRESS 2ND FRACTION
  938.     CALL    MULX1        ;MULTIPLY BY ACCUM 2ND FRACTION
  939.     MVI    L,ACC1        ;ADDRESS 1ST FRACTION
  940. ; MULTIPLY BY ONE ACCUMULATOR WORD
  941. MULX1:    MOV    A,D        ;5TH PARTIAL PRODUCT
  942.     MOV    E,C        ;4TH PARTIAL PROD
  943.     MOV    D,B        ;3RD PARTIAL PROD
  944. MULX2:    MOV    B,M        ;MULTIPLIER
  945.     MOV    L,A        ;5TH PARTIAL PROD
  946.     XRA    A        ;ZERO A REGISTER
  947.     MOV    C,A        ;2ND PARTIAL PROD
  948.     SUB    B        ;SET CARRY BIT FOR EXIT FLAG
  949.     JC    MULX3        ;IF MULTIPLIER IS NOT ZERO
  950.     MOV    C,D        ;2ND PARTIAL PRODUCT
  951.     MOV    D,E        ;3RD PARTIAL PROD
  952.     RET        ;MULT BY ZERO COMPLETE
  953. ; COMPLETE ADDITION OF MULTIPLICAND
  954. MULX5:    MOV    C,A        ;2ND PARTIAL PROD
  955.     JNC    MULX3        ;IF NO CARRY TO 1ST PROD
  956.     INR    B        ;ADD CARRY TO 1ST PROD
  957.     ANA    A        ;CLEAR CARRY BIT
  958. ; LOOP FOR EACH BIT OF MULTIPLIER WORD
  959. MULX3:    MOV    A,L        ;5TH PARTIAL PRODUCT, EXIT FLAG
  960.     ADC    A        ;SHIFT EXIT FLAG OUT    IF DONE
  961.     RZ        ;EXIT IF MULTIPLICATION DONE
  962.     MOV    L,A        ;5TH PARTIAL PROD, EXIT FLAG
  963.     MOV    A,E        ;4TH PARTIAL PROD
  964.     RAL        ;SHIFT 4TH PARTIAL PROD
  965.     MOV    E,A        ;4TH PARTIAL PROD
  966.     MOV    A,D        ;3RD PARTIAL PROD
  967.     RAL
  968.     MOV    D,A
  969.     MOV    A,C        ;2ND PARTIAL PROD
  970.     RAL
  971.     MOV    C,A
  972.     MOV    A,B        ;1ST PARTIAL PROD AND MULTIPLIER
  973.     RAL
  974.     MOV    B,A
  975.     JNC    MULX3        ;IF NO ADDITION REQUIRED
  976. ; ADD THE MULTIPLICAND TO THE PRODUCT
  977. ; IF THE MULTIPLIER BIT IS ONE
  978.     MOV    A,E        ;4TH PARTIAL PROD
  979.     JMP    MULX4        ;TO RAM CODE
  980. ; FIXED POINT DIVIDE SUBROUTINE .
  981. ; SUBTRACT DIVISOR FROM ACCUM TO OBTAIN 1ST REMAINDER
  982. DIVX:    MVI    L,ACC3        ;ADDRESS ACCUM 3RD FRACTION
  983.     MOV    A,M
  984.     SUB    E        ;DIVISOR 3RD FRACTION
  985.     MOV    M,A        ;REMAINDER 3RD FRACTION
  986.     DCR    L        ;ADDRESS ACCUM 2ND FRACTION
  987.     MOV    A,M
  988.     SBB    D        ;DIVISOR 2ND FRACTION
  989.     MOV    M,A        ;REMAINDER 2ND FRACTION
  990.     DCR    L        ;ADDRESS ACCUM 1ST FRACTION
  991.     MOV    A,M
  992.     SBB    C        ;DIVISOR 1ST FRACTION
  993.     MOV    M,A        ;REMAINDER 1ST FRACTION
  994. ; HALVE THE DIVISOR AND STORE FOR ADDITION OR SUBTRACTION
  995.     MOV    A,C        ;DIVISOR 1ST FRACTION
  996.     RAL        ;SET CARRY BIT
  997.     MOV    A,C        ;DIVISOR 1ST FRACTION
  998.     RAR        ;HALF OF DIVISOR 1ST FRACTION
  999. ;                            + 200 OCTAL TO CORRECT QUOTIENT
  1000.     MVI    L,OP1S        ;ADDRESS 1ST SUBTRACT DIVISOR
  1001.     MOV    M,A
  1002.     MVI    L,OP1A        ;ADDRESS 1ST ADD DIVISOR
  1003.     MOV    M,A
  1004.     MOV    A,D        ;DIVISOR 2ND FRACTION
  1005.     RAR        ;HALF OF DIVISOR 2ND FRACTION
  1006.     MVI    L,OP2S        ;ADDRESS 2ND SUBTRACT DIVISOR
  1007.     MOV    M,A
  1008.     MVI    L,OP2A        ;ADDRESS 2ND ADD DIVISOR
  1009.     MOV    M,A
  1010.     MOV    A,E        ;DIVISOR 3RD FRACTION
  1011.     RAR        ;HALF OF DIVISOR 3RD FRACTION
  1012.     MVI    L,OP3S        ;ADDRESS 3RD SUBTRACT DIVISOR
  1013.     MOV    M,A
  1014.     MVI    L,OP3A        ;ADDRESS 3RD ADD DIVISOR
  1015.     MOV    M,A
  1016.     MVI    B,0        ;INITIALIZE QUOTIENT 1ST FRACTION
  1017.     MOV    A,B        ;DIVISOR 4TH FRACTION IS ZERO
  1018.     RAR        ;LOW BIT OF DIVISOR 3RD FRACTION
  1019.     MVI    L,OP4S        ;ADDRESS 4TH SUBTRACT DIVISOR
  1020.     MOV    M,A        ;4TH SUBTRACT DIVISOR
  1021.     MVI    L,OP4A        ;ADDRESS 4TH ADD DIVISOR
  1022.     MOV    M,A
  1023.     MVI    L,OP4X        ;ADDRESS 4TH ADD DIVISOR
  1024.     MOV    M,A
  1025. ; LOAD 1ST REMAINDER, CHECK SIGN
  1026.     MVI    L,ACC1        ;ADDRESS REMAINDER 1ST FRACTION
  1027.     MOV    A,M
  1028.     INR    L        ;ADDRESS 2ND FRACTION
  1029.     MOV    D,M
  1030.     INR    L        ;ADDRESS 3RD FRACTION
  1031.     MOV    E,M
  1032.     ANA    A        ;SET CONTROL BITS
  1033.     JM    DIVX4        ;IF REMAINDER IS NEGATIVE
  1034. ; ADJUST EXPONENT, POSITION REMAINDER
  1035. ; AND INITIALIZE THE QUOTIENT
  1036.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  1037.     MOV    C,M        ;QUOTIENT EXP
  1038.     INR    C        ;INCREMENT QUOTIENT EXP
  1039.     RZ        ;RETURN IF OVERFLOW
  1040.     MOV    M,C        ;QUOTIENT EXP
  1041.     MOV    L,E        ;REMAINDER 3RD FRACTION
  1042.     MOV    H,D        ;REMAINDER 2ND FRACTION
  1043.     MOV    E,A        ;REMAINDER 1ST FRACTION
  1044.     MVI    D,1        ;INITIALIZE QUOTIENT 3RD FRACTION
  1045.     MOV    C,B        ;INITIALIZE QUOTIENT 2ND FRACTION
  1046. ; SUBTRACT THE DIVISOR FROM THE REMAINDER
  1047. ; IF IT IS POSITIVE
  1048. DIVX1:    XRA    A        ;REMAINDER    4TH FRACTION IS ZERO
  1049.     CALL    DIVX5        ;CALL RAM SECTION
  1050. DIVX2:    RLC        ;SHIFT REMAINDER 4TH FRACTION TO CARRY
  1051. ; SHIFT THE REMAINDER LEFT ONE BIT
  1052.     MOV    A,B        ;QUOTIENT 1ST FRACTION
  1053.     RAL        ;MSB OF QUOTIENT TO CARRY
  1054.     RC        ;IF DIVISION COMPLETE
  1055.     RAR        ;REMAINDER 4TH FRACTION TO    CARRY
  1056.     MOV    A,L        ;REMAINDER 3RD FRACTION
  1057.     RAL
  1058.     MOV    L,A
  1059.     MOV    A,H        ;REMAINDER 2ND FRACTION
  1060.     RAL
  1061.     MOV    H,A
  1062.     CALL    LSH        ;CALL LEFT SHIFT ROUTINE
  1063. ; BRANCH IF SUBTRACTION IS REQUIRED
  1064.     MOV    A,D        ;QUOTIENT 3RD FRACTION
  1065.     RRC        ;REMAINDER SIGN INDIC TO CARRY    BIT
  1066.     JC    DIVX1        ;TO SUB DIVISOR IF REMAINDER POSITIVE
  1067. ; ADD THE DIVISOR IF THE REMAINDER IS NEGATIVE
  1068. DIVX3:    MOV    A,L        ;REMAINDER 3RD FRACTION
  1069.     JMP    DIVX6        ;TO RAM CODE
  1070. ; POSITION THE REMAINDER AND INITIALIZE THE QUOTIENT
  1071. DIVX4:    MOV    L,E        ;REMAINDER 3RD FRACTION
  1072.     MOV    H,D        ;REMAINDER 2ND FRACTION
  1073.     MOV    E,A        ;REMAINDER 1ST FRACTION
  1074.     MOV    D,B        ;INITIALIZE QUOTIENT 3RD FRACTION
  1075.     MOV    C,B        ;INITIALIZE QUOTIENT 2ND FRACTION
  1076.     JMP    DIVX3        ;ADD DIVISOR IF REMAINDER IS NEGATIVE
  1077.     DB    0        ;CHECKSUM WORD
  1078.     END    
  1079.