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 / KAYPRO / KAYDIAG.LBR / HIMEM.MQC / HIMEM.MAC
Text File  |  2000-06-30  |  15KB  |  421 lines

  1. 00010 ;Z80
  2. 00020 ;KAYPRO MEMORY TEST ROUTINE
  3. 00030 ;THIS ROUTINE RELOCATES THE MEMORY TEST PROGRAM TO
  4. 00040 ;HIGH MEMORY AND INITIALIZES THE KAYPRO FOR THE TEST
  5. 00050 ;
  6. 00060 ;WRITTEN BY LARRY KRAEMER 09/15/83
  7. 00070 ;
  8. 00080 ;FIRST MOVE THE PROGRAM TO HIGH MEMORY AND THEN START
  9. 00090 ;THE TEST.  SELECT THE VIDEO PAGE, TURN OFF THE DRIVES,
  10. 00100 ;TURN OFF THE DRIVE LED'S, AND THEN CLEAR THE SCREEN.
  11. 00110 ;THE TEST WILL RUN UNTIL POWER IS TURNED OFF OR THE
  12. 00120 ;SYSTEM IS REBOOTED.
  13. 00130 ;WRITTEN ON A RADIO SHACK MODEL 1.
  14. 00140 INIT    EQU    4E00H        ;INIT ROUTINE HERE
  15. 00150 TEST    EQU    500DH
  16. 00160 DEST    EQU    5000H
  17. 00170 MSG1    EQU    4E60H
  18. 00180 MSG2    EQU    4E7DH
  19. 00190 MSG3    EQU    4E95H
  20. 00200 DELAY    EQU    4ECDH
  21. 00210 DELAY0    EQU    4ED0H
  22. 00220 DELAY1    EQU    4ED3H
  23. 00230 AON    EQU    4EB1H
  24. 00240 AOFF    EQU    4EB8H
  25. 00250 BON    EQU    4EBFH
  26. 00260 BOFF    EQU    4EC6H
  27. 00270         ORG    0100H        ;ORGIN IS 0100H
  28. 00280 START    LD    HL,RAM        ;POINT TO SOURCE
  29. 00290         LD    DE,INIT        ;POINT TO DESTINATION
  30. 00300         LD    BC,ERAM-RAM    ;NUMBER OF BYTES
  31. 00310         LDIR            ;BLOCK MOVE IT HIGH
  32. 00320         LD    HL,RAM1        ;POINT TO SOURCE
  33. 00330         LD    DE,DEST        ;POINT TO DESTINATION
  34. 00340         LD    BC,ERAM1-RAM1    ;NUMBER OF BYTES
  35. 00350         LDIR            ;MOVE IT HIGH
  36. 00360         JP    INIT        ;JUMP HIGH AND INIT
  37. 00370 RAM    IN    A,(01CH)    ;READ SYSTEM STATUS PORT
  38. 00380         SET    7,A        ;TURN ON VIDEO PAGE
  39. 00390         SET    6,A        ;TURN OFF DRIVES
  40. 00400         RES    0,A        ;TURN OFF DRIVE LIGHT A
  41. 00410         RES    1,A        ;TURN OFF DRIVE LIGHT B
  42. 00420         OUT    (01CH),A    ;SEND TO PORT 1CH
  43. 00430         LD    HL,3000H    ;START OF VIDEO PAGE
  44. 00440         LD    DE,3001H    ;NEXT ADDR
  45. 00450         LD    BC,0BFFH    ;TOTAL VIDEO PAGE
  46. 00460         LD    (HL),20H    ;CLEAR SCREEN
  47. 00470         LDIR            ;BLOCK MOVE
  48. 00480         LD    HL,MSG1     ;POINT TO MESSAGE 1
  49. 00490         LD    DE,3419H    ;STORE ON SCREEN
  50. 00500         LD    BC,1DH        ;NUMBER OF BYTES
  51. 00510         LDIR            ;MOVE IT
  52. 00520         LD    HL,MSG2     ;POINT TO MESSAGE 2
  53. 00530         LD    DE,351BH    ;STORE ON SCREEN
  54. 00540         LD    BC,18H        ;NUMBER OF BYTES
  55. 00550         LDIR            ;MOVE IT
  56. 00560         LD    HL,MSG3     ;POINT TO MESSAGE 3
  57. 00570         LD    DE,3619H    ;STORE ON SCREEN
  58. 00580         LD    BC,1CH        ;NUMBER OF BYTES
  59. 00590         LDIR            ;MOVE IT
  60. 00600 LOOP    LD    BC,08H        ;8 TIMES THRU LOOP
  61. 00610         PUSH    BC        ;SAVE COUNT
  62. 00620         CALL    DELAY        ;DELAY SOME
  63. 00630         CALL    AON          ;TURN ON A LED
  64. 00640         CALL    DELAY        ;WAIT
  65. 00650         CALL    AOFF         ;TURN OFF A LED
  66. 00660         CALL    DELAY        ;WAIT
  67. 00670         CALL    BON          ;TURN ON B LED
  68. 00680         CALL     DELAY        ;WAIT
  69. 00690         CALL     BOFF         ;TURN OFF B LED
  70. 00700         POP    BC        ;RESTORE COUNT
  71. 00710         DEC    BC        ;SUBTRACT 1
  72. 00720         LD    A,B        ;CHECK FOR ZERO
  73. 00730         OR    C        ;OR DO AGAIN
  74. 00740         JP    NZ,4E3DH    ;DO AGAIN
  75. 00750         JP    TEST        ;START MEMORY TEST NOW
  76. 00760 MSG01    DEFB    4BH        ;K
  77. 00770         DEFB    41H        ;A
  78. 00780         DEFB    59H        ;Y
  79. 00790         DEFB    50H        ;P
  80. 00800         DEFB    52H        ;R
  81. 00810         DEFB    4FH        ;O
  82. 00820         DEFB    20H        ;SPACE
  83. 00830         DEFB    49H        ;I
  84. 00840         DEFB    49H        ;I
  85. 00850         DEFB    20H        ;SPACE
  86. 00860         DEFB    4DH        ;M
  87. 00870         DEFB    45H        ;E
  88. 00880         DEFB    4DH        ;M
  89. 00890         DEFB    4FH        ;O
  90. 00900         DEFB    52H        ;R
  91. 00910         DEFB    59H        ;Y
  92. 00920         DEFB    20H        ;SPACE
  93. 00930         DEFB    54H        ;T
  94. 00940         DEFB    45H        ;E
  95. 00950         DEFB    53H        ;S
  96. 00960         DEFB    54H        ;T
  97. 00970         DEFB    20H        ;SPACE
  98. 00980         DEFB    50H        ;P
  99. 00990         DEFB    52H        ;R
  100. 01000         DEFB    4FH        ;O
  101. 01010         DEFB    47H        ;G
  102. 01020         DEFB    52H        ;R
  103. 01030         DEFB    41H        ;A
  104. 01040         DEFB    4DH        ;M
  105. 01050 MSG02    DEFB    54H        ;T
  106. 01060         DEFB    65H        ;E
  107. 01070         DEFB    73H        ;S
  108. 01080         DEFB    74H        ;T
  109. 01090         DEFB    69H        ;I
  110. 01100         DEFB    6EH        ;N
  111. 01110         DEFB    67H        ;G
  112. 01120         DEFB    20H        ;SP
  113. 01130         DEFB    34H        ;4
  114. 01140         DEFB    30H        ;0
  115. 01150         DEFB    30H        ;0
  116. 01160         DEFB    30H        ;0
  117. 01170         DEFB    68H        ;H
  118. 01180         DEFB    20H        ;SP
  119. 01190         DEFB    74H        ;T
  120. 01200         DEFB    68H        ;H
  121. 01210         DEFB    72H        ;R
  122. 01220         DEFB    75H        ;U
  123. 01230         DEFB    20H        ;SP
  124. 01240         DEFB    46H        ;F
  125. 01250         DEFB    46H        ;F
  126. 01260         DEFB    46H        ;F
  127. 01270         DEFB    46H        ;F
  128. 01280         DEFB    68H        ;H
  129. 01290 MSG03    DEFB    54H        ;T
  130. 01300         DEFB    65H        ;E
  131. 01310         DEFB    73H        ;S
  132. 01320         DEFB    74H        ;T
  133. 01330         DEFB    20H        ;SP
  134. 01340         DEFB    62H        ;B
  135. 01350         DEFB    61H        ;A
  136. 01360         DEFB    64H        ;D
  137. 01370         DEFB    20H        ;SP
  138. 01380         DEFB    61H        ;A
  139. 01390         DEFB    64H        ;D
  140. 01400         DEFB    64H        ;D
  141. 01410         DEFB    72H        ;R
  142. 01420         DEFB    65H        ;E
  143. 01430         DEFB    73H        ;S
  144. 01440         DEFB    73H        ;S
  145. 01450         DEFB    20H        ;SP
  146. 01460         DEFB    77H        ;W
  147. 01470         DEFB    69H        ;I
  148. 01480         DEFB    74H        ;T
  149. 01490         DEFB    68H        ;H
  150. 01500         DEFB    20H        ;SP
  151. 01510         DEFB    42H        ;B
  152. 01520         DEFB    69H        ;I
  153. 01530         DEFB    74H        ;T
  154. 01540         DEFB    63H        ;C
  155. 01550         DEFB    68H        ;H
  156. 01560         DEFB    6BH        ;K
  157. 01570 DAON    IN    A,(1CH)        ;GET STATUS BYTE
  158. 01580         SET    0,A        ;TURN ON LED
  159. 01590         OUT    (1CH),A        ;OUT TO PORT
  160. 01600         RET
  161. 01610 DAOFF    IN    A,(1CH)        ;GET STATUS BYTE
  162. 01620         RES    0,A        ;TURN OFF LED
  163. 01630         OUT    (1CH),A        ;OUT TO PORT
  164. 01640         RET
  165. 01650 DBON    IN    A,(1CH)        ;GET STATUS BYTE
  166. 01660         SET    1,A        ;TURN ON LED
  167. 01670         OUT    (1CH),A        ;OUT TO PORT
  168. 01680         RET
  169. 01690 DBOFF    IN    A,(1CH)        ;GET STATUS BYTE
  170. 01700         RES    1,A        ;TURN OFF LED
  171. 01710         OUT    (1CH),A        ;OUT TO PORT
  172. 01720         RET
  173. 01730 DELY    LD    BC,0002H    ;TWO TIMES THRU
  174. 01740 DELY0    LD    HL,00H        ;TIMES FF
  175. 01750 DELY1    DEC    HL        ;SUBTRACT ONE
  176. 01760         LD    A,H        ;CHECK FOR ZERO
  177. 01770         OR    L        ;LOOP AGAIN IF NOT 0
  178. 01780         JP    NZ,DELAY1    ;JUMP HERE
  179. 01790         DEC    BC        ;DEC BC BY ONE
  180. 01800         LD    A,B        ;CHECK FOR ZERO
  181. 01810         OR    C        ;HERE TO
  182. 01820         JP    NZ,DELAY0
  183. 01830         RET
  184. 01840 ERAM    DEFB    00H        ;END MARKER
  185. 01850         NOP
  186. 01860         NOP
  187. 01870         NOP
  188. 01880         NOP
  189. 01890         NOP
  190. 01900         NOP
  191. 01910         NOP
  192. 01920         NOP
  193. 01930         NOP
  194. 01940         NOP
  195. 01950         NOP
  196. 01960 ;********************************************************
  197. 01970 ;********************************************************
  198. 01980 ;RAM CHECKING PROGRAM -- THIS PROGRAM WILL ROOT THRU ALL
  199. 01990 ;MEMORY AND FIND ANY ERRORS.  THE BAD ADDRESSES ARE SHOWN
  200. 01991 ;IN THE UPPER LEFT OF THE SCREEN.
  201. 02000 ;MEMORY TESTED IS FROM 4000H THRU FFFFH.  WHEN THE STAR
  202. 02001 ;IS DISPLAYED IN THE LOWER RIGHT OF THE SCREEN THE
  203. 02010 ;PROGRAM IS LOW AND TESTING FROM 6000H THRU FFFFH.  WHEN
  204. 02011 ;THE STAR IS OFF THE PROGRAM IS HIGH  AND TESTING MEMORY
  205. 02020 ;FROM 4000H THRU 7000H.
  206. 02030 ;THIS PROGRAM IS SELF RELOCATING - IT MUST START AT 5000H
  207. 02040 ;WHEN A BAD ADDRESS IS FOUND IT CAN BE TESTED BY LOADING
  208. 02050 ;BITCHECK.  THE BAD CHIP WILL THEN BE DISPLAYED WITH AN X
  209. 02060 ;********************************************************
  210. 02070 ;********************************************************
  211. 02080 ;WRITTEN BY LARRY KRAEMER FOR THE KAYPRO II  09/14/83
  212. 02090 ;********************************************************
  213. 02100 ;********************************************************
  214. 02110 RAM1    DEFB    00H        ;START MARKER
  215. 02120         NOP
  216. 02130         NOP
  217. 02140         NOP
  218. 02150         NOP
  219. 02160         NOP
  220. 02170         NOP
  221. 02180         NOP
  222. 02190         NOP
  223. 02200         NOP
  224. 02210         NOP
  225. 02220         NOP
  226. 02230         NOP
  227. 02240 ;SET UP A MIDDLE OF PROGRAM POINTER AND DISPLAY A STAR
  228. 02250 ;ON THE SCREEN WHICH WILL SHOW WHAT AREA OF MEMORY IS
  229. 02260 ;BEING TESTED.  BEGINNING AREA OF MEMORY TO BE TESTED
  230. 02270 ;IS ALSO SPECIFIED.
  231. 02280 BTEST    LD    IX,5090H    ;MIDDLE OF TEST PROGRAM
  232. 02290         LD    A,(3BCFH)    ;LAST SCREEN ADDR.
  233. 02300         XOR    0AH        ;ALTERNATE SPACE/STAR
  234. 02310         LD    (3BCFH),A    ;DISPLAY ON SCREEN
  235. 02320         LD    SP,IX        ;START STACK POINTER
  236. 02330         LD    B,7FH        ;NUMBER OF MOVES
  237. 02340         INC    SP        ;FOR SP   SP=SP+1
  238. 02350         DJNZ    $-1        ;DO 127 TIMES
  239. 02360         LD    HL,6001H    ;FIRST TESTED MEMORY ADDR
  240. 02370 ;TEST BEGINS WITH VALUE OF ZERO THRU FF
  241. 02380 ;EACH VALUE IS WRITTEN TO A TRIO OF MEMORY LOCATIONS
  242. 02390 ;TO DETERMINE THEIR EFFECT ON EACH OTHER AS VALID
  243. 02400 ;ELECTRONIC STORAGE CELLS.
  244. 02410 ;THE ADDRESS IS SHOWN ON THE MONITOR IN GRAPHICS MODE.
  245. 02420 ;THE LSB(YTE) IS ON THE LEFT AND IS CHANGING FROM 00-256
  246. 02430 ;THE MSB(YTE) IS ON THE RIGHT AND IS THE PAGE OF THE
  247. 02440 ;ADDTESS BEING TESTED.
  248. 02450 ;EX.  AB IS SHOWN ON SCREEN
  249. 02460 ;A IS BYTE 41 OF PAGE 42 -- ADDRESS BEING TESTED IS 4241H
  250. 02470         XOR    A        ;CLEAR ACCUM
  251. 02480         LD    (HL),A        ;PLACE VALUE IN MEMORY
  252. 02490         LD    C,A        ;PUT VALUE IN C
  253. 02500         PUSH    AF        ;SAVE VALUE
  254. 02510         LD    A,C        ;GET VALUE FROM C
  255. 02520         LD    (HL),A        ;PLACE VALUE IN MEMORY
  256. 02530         INC    HL        ;POINT TO NEXT TEST ADDR
  257. 02540         LD    (3927H),HL    ;DISPLAY TO SCREEN
  258. 02550         LD    A,H        ;GET MSB OF ADDR
  259. 02560         CP    00H        ;IS IT AT TOP OF MEMORY
  260. 02570 ;TABLE FOR MEMORY ADDRESSES FOLLOW:
  261. 02580 ;       32K        48K         64K
  262. 02590 ;       80H       C0H         00H
  263. 02600 ;CHANGE THE ABOVE COMPARE FOR THE AMOUNT OF MEMORY AVAIL.
  264. 02610 ;
  265. 02620         JR    Z,$+32H        ;IF = THEN RELOCATE
  266. 02630         PUSH    HL        ;SAVE MEMORY ADDR
  267. 02640         PUSH    IX        ;SAVE MIDDLE OF PROGRAM
  268. 02650         POP    HL        ;TO HL REGISTER
  269. 02660         CP    H        ;CHECK AGAINST TOP OF MEM
  270. 02670         JR    Z,$+2BH        ;RELOCATE IF DONE
  271. 02680         POP    HL        ;RESTORE ORIG VALUE
  272. 02690         POP    AF        ;RESTORE ORIG TEST ADDR
  273. 02700         LD    (HL),A        ;PUT VALUE IN MEM
  274. 02710         DEC    HL        ;BACK TO ORIGINAL ADDR
  275. 02720         DEC    HL        ;BACK TO PREVIOUS ADDR
  276. 02730         LD    (HL),A        ;PUT VALUE IN MEMORY
  277. 02740         LD    B,A        ;SAVE VALUE IN B REG
  278. 02750         LD    A,(HL)        ;GET VALUE AT LOC'N HL
  279. 02760         CP    B        ;CHECK AGAINST B
  280. 02770         JR    Z,$+7        ;GO ON IF IT'S OKAY
  281. 02780         LD    D,1BH        ;GET VALUE OF RELO SUB
  282. 02790         PUSH    DE        ;SAVE IT ON STACK
  283. 02800         JR    $+1DH        ;JUMP SUBROUTINE
  284. 02810         INC    HL        ;GET ORIG TEST ADDR
  285. 02820         INC    HL        ;GO ONE BEYOND ADDR
  286. 02830         LD    A,(HL)        ;GET VALUE AT THAT POS'N
  287. 02840         CP    B        ;CHECK AGAINST B REG
  288. 02850         JR    Z,$+7        ;GO ON IF IT'S OKAY
  289. 02860         LD    D,10H        ;GET JUMP FOR RELO SUB
  290. 02870         PUSH    DE        ;SAVE VALUE ON STACK
  291. 02880         JR    $+12H        ;JUMP SUBROUTINE
  292. 02890         DEC    HL        ;BACK TO ORIG POSITION
  293. 02900         INC    (HL)        ;INC VALUE IN MEMORY
  294. 02910         INC    C        ;INC TEST VALUE
  295. 02920         LD    A,(HL)        ;GET VALUE IN MEMORY
  296. 02930         LD    B,A        ;SAVE VALUE IN B REG
  297. 02940         CP    00        ;CHECK IF 256 BYTES DONE
  298. 02950         JR    NZ,$-35H    ;LOOP BACK AND CONTINUE
  299. 02960         INC    HL        ;GET NEXT MEMORY VALUE
  300. 02970         LD    C,0        ;RESET TEST VALUE TO ZERO
  301. 02980         JR    $-3AH        ;LOOP BACK FOR NEXT TEST
  302. 02990         JR    $+66H        ;RELO SUB STEPPING STONE
  303. 03000 ;
  304. 03010 ;********************************************************
  305. 03020 ;THIS SUBROUTINE IS ENTERED IF A BAD MEMORY LOCATION IS
  306. 03030 ;FOUND.  IT CONVERTS HEX VALUES TO ASCII AND DISPLAYS
  307. 03040 ;THEM ON THE SCREEN.
  308. 03050 ;********************************************************
  309. 03060         LD    A,H        ;GET VALUE FROM H REG
  310. 03070         AND    0F0H        ;MASK OFF LOW BITS
  311. 03080         RRCA            ;ROTATE RIGHT FOR
  312. 03090         RRCA            ;CONVERSION
  313. 03100         RRCA            ;4 TIMES
  314. 03110         RRCA            ;UNTIL DONE
  315. 03120         LD    D,22H        ;GET VALUE FOR RELO SUB
  316. 03130         JR    $+24H        ;AND JUMP TO IT
  317. 03140         LD    A,H        ;GET VALUE FROM H REG
  318. 03150         AND    0FH        ;MASK OUT HIGH BITS
  319. 03160         LD    D,1BH        ;GET VALUE FOR RELO SUB
  320. 03170         JR    $+1DH        ;AND JUMP TO IT
  321. 03180         LD    A,L        ;GET VALUE FROM L REG
  322. 03190         AND    0F0H        ;MASK OFF LOW BITS
  323. 03200         RRCA            ;ROTATE FOR CONVERSION
  324. 03210         RRCA            ;DO FOR 4 TIMES
  325. 03220         RRCA            ;AGAIN
  326. 03230         RRCA            ;AND IT'S DONE
  327. 03240         LD    D,10H        ;GET VALUE FOR RELO SUB
  328. 03250         JR    $+12H        ;AND JUMP TO SUBROUTINE
  329. 03260         LD    A,L        ;GET VALUE FROM L REG
  330. 03270         AND    0FH        ;MASK OUT HIGH BITS
  331. 03280         LD    D,9        ;GET VALUE FOR RELO SUB
  332. 03290         JR    $+0BH        ;AND JUMP TO SUBROUTINE
  333. 03300         POP    DE        ;RESTORE VALUE TOP DE REG
  334. 03310         LD    A,0D3H        ;GET RETURN POS'N VALUE
  335. 03320         SUB    D        ;SUBTRACT RETURN DIFF.
  336. 03330         LD    (IX+00H),A    ;AND MAKE JR OPERAND
  337. 03340         JR    $+1        ;IRRELEVANT OPERAND
  338. 03350         PUSH    DE        ;SAVE NEXT TWO REG PAIRS
  339. 03360         PUSH    AF        ;ON STACK
  340. 03370         LD    DE,3000H    ;GET TOP LEFT OF SCREEN
  341. 03380         LD    A,(DE)        ;GET VALUE ON SCREEN
  342. 03390         CP    20H        ;IS IT A SPACE???
  343. 03400         JR    Z,$+5        ;IF SO GO AHEAD MORE
  344. 03410         INC    DE        ;INC SCREEN POSITION
  345. 03420         JR    $-6        ;AND GO AHEAD PAST TEST
  346. 03430         LD    A,E        ;GET SCREEN VALUE
  347. 03440         CP    04        ;IS IT FOUR POSITIONS OVER
  348. 03450         JR    NZ,$+0CH    ;IF NOT GO ON AHEAD
  349. 03460         LD    A,20H        ;IF SO GET A SPACE READY
  350. 03470         DEC    DE        ;GO BACK SOME
  351. 03480         LD    (DE),A        ;AND FILL WITH SPACE
  352. 03490         DEC    DE        ;BACK MORE
  353. 03500         LD    (DE),A        ;AND INSERT A SPACE
  354. 03510         DEC    DE        ;BACK MORE
  355. 03520         LD    (DE),A        ;AND INSERT SPACE
  356. 03530         DEC    DE        ;BACK ANOTHER
  357. 03540         LD    (DE),A        ;AND INSERT SPACE
  358. 03550         POP    AF        ;RESTORE VALUE TO AF
  359. 03560         CP    0AH        ;LESS THAN 10?
  360. 03570         JR    NC,$+6        ;IF LESS THEN JUMP
  361. 03580         ADD    A,30H        ;CONVERT HEX TO ASCII
  362. 03590         JR    $+4        ;AND GO PAST REST
  363. 03600         ADD    A,37H        ;CONVERT HEX TO ASCII NOW
  364. 03610         LD    (DE),A        ;AND STORE ON SCREEN
  365. 03620 ;********************************************************
  366. 03630 ;THIS IS A DELAY ROUTINE USED AFTER LOCATION IS DISPLAYED
  367. 03640 ;********************************************************
  368. 03650         PUSH    BC        ;SAVE VALUE IN BC REG
  369. 03660         LD    B,0FFH        ;DELAY VALUE IS FF HEX
  370. 03670         DJNZ    $-0        ;DELAY A LITTLE NOW
  371. 03680         POP    BC        ;RESTORE BC
  372. 03690         POP    DE        ;RESTORE DE
  373. 03700         LD    A,0C9H        ;GET VALUE TO RETURN
  374. 03710         SUB    D        ;SUBTRACT JUMP OFFSET
  375. 03720         LD    (IX+37H),A    ;PLACE AS JR OPERAND
  376. 03730         JR    $+1        ;IRRELEVANT OPERAND
  377. 03740 ;*********************************************************
  378. 03750 ;PROGRAM RELOCATION ROUTINE FOLLOWS:
  379. 03760 ;HL AND DE REGISTERS ARE LOADED FROM THE IX REGISTER, AND
  380. 03770 ;MODIFIED BY EXCLUSIVE-ORING WITH A KNOWN VALUE IN REG A
  381. 03780 ;THE NEW PROGRAM BEGINNING CAN BE DETERMINED, AND
  382. 03790 ;INTERNAL TEST POSITIONS CAN BE MODIFIED, AND THE IX
  383. 03800 ;AND SP POINTERS RESET
  384. 03810 ;*********************************************************
  385. 03820         PUSH    IX        ;SAVE POSITION
  386. 03830         PUSH    IX        ;SAVE POSITION
  387. 03840         POP    HL        ;TRANSFER TO HL
  388. 03850         POP    DE        ;TRANSFER TO DE
  389. 03860         LD    A,D        ;GET VALUE FROM D
  390. 03870         XOR    20H        ;TRANSFER TO HIGH MEMORY
  391. 03880         LD    D,A        ;PUT BACK IN D
  392. 03890         PUSH    DE        ;AND STASH ON STACK
  393. 03900         PUSH    DE        ;SAVE IT AGAIN ON STACK
  394. 03910         LD    B,90H        ;DEC TO PROGRAM START
  395. 03920         DEC    HL        ;AND BEGIN DECREMENTING
  396. 03930         DEC    DE        ;FOR BOTH THE REGISTERS
  397. 03940         DJNZ    $-2        ;UNTIL DONE
  398. 03950         LD    BC,00FFH    ;GET READY TO TRANSFER
  399. 03960         LDIR            ;NOW
  400. 03970 ;THIS WAS ADDED/CHANGED SO I COULD RUN IT ON A MODEL 3
  401. 03980 ;NOW ADD FOR MOD III
  402. 03990         POP    HL        ;TRANSFER VALUE IN DE HERE
  403. 04000         POP    IX        ;TRANSFER VALUE IN DE HERE
  404. 04010         LD    L,22H        ;5022H OR 7022H ADDR
  405. 04020         LD    A,20H        ;MODIFY TO 40XX OR 60XX
  406. 04030         XOR    (HL)        ;ADDR TO START TEST AGAIN
  407. 04040         LD    (HL),A        ;STORE ADDR AT 5022/7022
  408. 04050         LD    BC,0DH        ;ADD OFFSET AND COMPARE
  409. 04060         ADD    HL,BC        ;WITH ADDR FOR TOP OF TEST
  410. 04070         LD    A,070H        ;
  411. 04080 ;TABLE FOR MEMORY ADDRESSES FOLLOW:
  412. 04090 ;      32K       48K        64K
  413. 04100 ;      F0H       B0H        70H
  414. 04110         XOR    (HL)        ;
  415. 04120         LD    (HL),A        ;
  416. 04130         LD    L,11H        ;7011H OR 5011H ADDR
  417. 04140         JP    (HL)        ;JUMP TO ABOVE ADDR
  418. 04150 ERAM1    DEFB    00H
  419. 04160         DEFB    00H
  420. 04170         END    START
  421.