home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol236 / barb2.mac < prev    next >
Encoding:
Text File  |  1986-02-13  |  6.9 KB  |  456 lines

  1. TITLE 'MEMORY TEST PROGRAM - BYTE, DECEMBER 1982, pp 414-444'
  2. ;
  3. CR    EQU    0DH     ;CARRIAGE RETURN
  4. ESC    EQU    1BH     ;ESCAPE
  5. HCHAR    EQU    0FH    ;MASK FOR REMOVING UPPER NIBBLE
  6. LF    EQU    0AH     ;LINE FEED
  7. ;LNPAT    EQU    9       ;PATTERN LENGTH - FOR NK*4 MEMORY COMPONENTS
  8. LNPAT    EQU    17      ;PATTERN LENGTH - FOR NK*1 MEMORY COMPONENTS
  9. NZERO    EQU    0FH     ;NONZERO VALUE
  10. PRTYO    EQU    7FH     ;MASK TO CLEAR PARITY FROM CONSOLE INPUT
  11. CI    EQU    0E003H    ;CONSOLE INPUT ROUTINE
  12. CO    EQU    ANG    ;OUTPUT ROUTINE
  13. CBOOT    EQU    0E000H    ;COLD BOOT ROUTINE
  14. ;
  15.         .z80
  16.         ld de,0f000h
  17.         ld hl,begina
  18.         ld bc,enda-begina
  19.         ldir
  20.         jp begin
  21.         .8080
  22. begina:
  23.  
  24.         .PHASE 0F000H
  25. BEGIN:    
  26.         DI
  27.     LXI    SP,SPLOC
  28.     XRA    A
  29.     STA    ERFLG
  30. ;
  31. ; SET BANK
  32. ;
  33.         .Z80
  34.         LD A,0
  35.         CALL BANK
  36.         .8080
  37.         LXI     H,MESG0
  38.         MVI     B,MESL0
  39.         CALL    MSGL
  40.         .Z80
  41.         CALL    CI
  42.         SUB     '0'
  43.         JP      C,CBOOT
  44.         LD      (BNK),A
  45.         CALL CROUT
  46.         .8080
  47. ;
  48. ; GET START ADDRESS
  49. ;
  50. MAIN1:    LXI    H,MESG1
  51.     MVI    B,MESL1
  52.     CALL    MSGL
  53.     CALL    GETHX
  54.     JNC    MAIN1
  55.     MOV    H,B
  56.     MOV    L,C
  57.     SHLD    MEMST
  58. ;
  59. ; GET END ADDRESS
  60. ;
  61. MAIN2:    LXI    H,MESG2
  62.     MVI    B,MESL2
  63.     CALL    MSGL
  64.     CALL    GETHX
  65.     JNC    MAIN2
  66.     MOV    H,B
  67.     MOV    L,C
  68.     SHLD    MEMND
  69.  
  70.         .Z80
  71.         LD A,(BNK)
  72.         CALL BANK
  73.         .8080
  74. ;
  75. ; TEST FOR START ADDRESS > END ADDRESS AND COMPUTE
  76. ; THE NUMBER OF BYTES TO BE TESTED - THE FOLLOWING SUBTRACTION
  77. ; ROUTINE IS TAKEN FROM MILLER'S 'MASTERING CPM' P 125, AS THE 
  78. ; ORIGINAL VERSION FAILS WHEN MEMST = 0.
  79. ;
  80.     XCHG
  81.     LHLD    MEMST
  82.     MOV    A,E
  83.     SUB    L
  84.     MOV    L,A
  85.     MOV    A,D
  86.     SBB    H
  87.     MOV    H,A
  88.     CMC
  89.     JC    MAIN3
  90.     LXI    H,MESG3
  91.     MVI    B,MESL3
  92.     CALL    MSGL
  93.     CALL    CROUT
  94.     JMP    MAIN1
  95. MAIN3:    INX    H
  96.     SHLD    NBYTE
  97. ;
  98. ; SET UP REGISTERS TO ESTABLISH THE BARBER-POLE PATTERN
  99. ;
  100.     MVI    A,LNPAT
  101.     STA    PATLN
  102.     STA    NCYCL
  103.     LXI    B,PATRN
  104.     PUSH    B
  105. MAIN4:    LHLD    NBYTE
  106.     XCHG
  107.     LHLD    MEMST
  108. ;
  109. ; PUT THE BARBER-POLE PATTERN IN R/W MEMORY
  110. ;
  111. MAIN5:    LDAX    B
  112.     MOV    M,A
  113.     INX    B
  114.     INX    H
  115.     DCX    D
  116.     MOV    A,E
  117.     ORA    D
  118.     JZ    MAIN6
  119.     LDA    PATLN
  120.     DCR    A
  121.     STA    PATLN
  122.     JNZ    MAIN5
  123.     POP    B
  124.     PUSH    B
  125.     MVI    A,LNPAT
  126.     STA    PATLN
  127.     JMP    MAIN5
  128. ;
  129. ; SET UP REGISTERS TO TEST BARBER-POLE PATTERN
  130. ;
  131. MAIN6:    POP    B
  132.     PUSH    B
  133.     MVI    A,LNPAT
  134.     STA    PATLN
  135.     LHLD    NBYTE
  136.     XCHG
  137.     LHLD    MEMST
  138. ;
  139. ; TEST BARBER-POLE PATTERN
  140. ;
  141. MAIN7:    LDAX    B
  142.     CMP    M
  143.     CNZ    ERROR
  144.     INX    B
  145.     INX    H
  146.     DCX    D
  147.     MOV    A,E
  148.     ORA    D
  149.     JZ    MAIN8
  150.     LDA    PATLN
  151.     DCR    A
  152.     STA    PATLN
  153.     JNZ    MAIN7
  154.     POP    B
  155.     PUSH    B
  156.     MVI    A,LNPAT
  157.     STA    PATLN
  158.     JMP    MAIN7
  159. ;
  160. ; SHIFT THE BARBER-POLE PATTERN BY ONE AND TEST FOR LAST SHIFT
  161. ;
  162. MAIN8:    POP    B
  163.     INX    B
  164.     PUSH    B
  165.     MVI    A,LNPAT
  166.     STA    PATLN
  167.     LDA    NCYCL
  168.     DCR    A
  169.     STA    NCYCL
  170.     JNZ    MAIN4
  171. ;
  172. ; TEST COMPLETED - OUTPUT MESSAGE
  173. ;
  174.     LDA    ERFLG
  175.     ORA    A
  176.     JNZ    MAIN9
  177.     LXI    H,MESG7
  178.     MVI    B,MESL7
  179.     CALL    MSGL
  180.     CALL    CROUT
  181.     JMP    BEGIN
  182. MAIN9:    LXI    H,MESG8
  183.     MVI    B,MESL8
  184.     CALL    MSGL
  185.     CALL    CROUT
  186.     JMP    BEGIN
  187.  
  188. ;
  189. ;......................................................................
  190. ;
  191. ; CONVERT HEXADECIMAL TO BINARY
  192. ;
  193. CNVBN:    MOV    A,C
  194.     SUI    '0'
  195.     CPI    10
  196.     RM
  197.     SUI    7
  198.     RET
  199. ;
  200. ;......................................................................
  201. ;
  202. ; OUTPUT CR/LF
  203. ;
  204. CROUT:    MVI    C,CR
  205.     CALL    ECHO
  206.     RET
  207. ;
  208. ;......................................................................
  209. ;
  210. ; ECHO CHARACTER TO TERMINAL
  211. ;
  212. ECHO:    MOV    B,C
  213.     MVI    A,ESC
  214.     CMP    B
  215.     JNZ    ECHO5
  216.     MVI    C,'$'
  217. ECHO5:    CALL    CO
  218.     MVI    A,CR
  219.     CMP    B
  220.     JNZ    ECH10
  221.     MVI    C,LF
  222.     CALL    CO
  223. ECH10:    MOV    C,B
  224.     RET
  225. ;
  226. ;......................................................................
  227. ;
  228. ; ERROR MESSAGE AND LOCATION OF BAD CELL
  229. ;
  230. ERROR:    PUSH    PSW
  231.     PUSH    D
  232.     PUSH    H
  233.     PUSH    B
  234.     XCHG
  235.     LXI    H,MESG4
  236.     MVI    B,MESL4
  237.     CALL    MSGL
  238.     MOV    A,D
  239.     CALL    NMOUT
  240.     MOV    A,E
  241.     CALL    NMOUT
  242.     LXI    H,MESG5
  243.     MVI    B,MESL5
  244.     CALL    MSGL
  245.     POP    B
  246.     PUSH    B
  247.     LDAX    B
  248.     CALL    NMOUT
  249.     LXI    H,MESG6
  250.     MVI    B,MESL6
  251.     CALL    MSGL
  252.     XCHG
  253.     MOV    A,M
  254.     CALL    NMOUT
  255.     CALL    CROUT
  256.     MVI    A,NZERO
  257.     STA    ERFLG
  258.     POP    B
  259.     POP    H
  260.     POP    D
  261.     POP    PSW
  262.     RET
  263. ;
  264. ;......................................................................
  265. ;
  266. ; SET CARRY TO FALSE
  267. ;
  268. FRET:    STC
  269.     CMC
  270.     RET
  271. ;
  272. ;......................................................................
  273. ;
  274. ; GET CHARACTER FROM CONSOLE - CLEAR PARITY
  275. ;
  276. GETCH:    CALL    CI
  277.     ANI    PRTYO
  278.     MOV    C,A
  279.     RET
  280. ;
  281. ;......................................................................
  282. ;
  283. ; READ 16 BIT BINARY DIGIT FROM CONSOLE - ENTERED AS HEX.
  284. ;
  285. GETHX:    PUSH    H
  286.     LXI    H,0
  287.     MVI    E,0
  288. GHX05:    CALL    GETCH
  289.     CALL    ECHO
  290.     MOV    A,C
  291.     CPI    CR
  292.     JNZ    GHX10
  293.     PUSH    H
  294.     POP    B
  295.     POP    H
  296.     MOV    A,E
  297.     ORA    A
  298.     JNZ    SRET
  299.     JZ    FRET
  300. GHX10:    CALL    VALDG
  301.     JNC    GHX15
  302.     CALL    CNVBN
  303.     MVI    E,0FFH
  304.     DAD    H
  305.     DAD    H
  306.     DAD    H
  307.     DAD    H
  308.     MVI    B,0
  309.     MOV    C,A
  310.     DAD    B
  311.     JMP    GHX05
  312. GHX15:    CALL    CROUT
  313.     POP    H
  314.     JMP    FRET
  315. ;
  316. ;......................................................................
  317. ;
  318. ; OUTPUT A MESSAGE
  319. MSGL:    MOV    C,M
  320.     CALL    CO
  321.     INX    H
  322.     DCR    B
  323.     JNZ    MSGL
  324.     RET
  325. ;
  326. ;......................................................................
  327. ;
  328. ; OUTPUT AN 8 BIT INTEGER
  329. ;
  330. NMOUT:    PUSH    PSW
  331.     RRC
  332.     RRC
  333.     RRC
  334.     RRC
  335.     CALL    PRVAL
  336.     CALL    ECHO
  337.     POP    PSW
  338.     CALL    PRVAL
  339.     CALL    ECHO
  340.     RET
  341. ;
  342. ;......................................................................
  343. ;
  344. ; CONVERT NIBBLE TO HEX REPRESENTATION
  345. ;
  346. PRVAL:    ANI    HCHAR
  347.     ADI    90H
  348.     DAA
  349.     ACI    40H
  350.     DAA
  351.     MOV    C,A
  352.     RET
  353. ;
  354. ;......................................................................
  355. ;
  356. ; SET CARRY TO TRUE
  357. ;
  358. SRET:    STC
  359.     RET
  360. ;
  361. ;......................................................................
  362. ;
  363. ; CHECK VALIDITY OF ASCII CHAR FOR REPRESENTING HEX.
  364. ;
  365. VALDG:    MOV    A,C
  366.     CPI    '0'
  367.     JM    FRET
  368.     CPI    '9'
  369.     JM    SRET
  370.     JZ    SRET
  371.     CPI    'A'
  372.     JM    FRET
  373.     CPI    'G'
  374.     JP    FRET
  375.     JMP    SRET
  376. ;
  377. ;......................................................................
  378. ;
  379. ; CONSOLE OUTPUT ROUTINE - WILL NEED TO BE MODIFIED FOR ANOTHER MACHINE
  380. ;
  381. ANG:    IN    0E1H
  382.     ANI    1
  383.     JNZ    ANG
  384.     MOV    A,C
  385.     OUT    0E0H
  386.     RET
  387. ;
  388. ;......................................................................
  389. ;
  390. ; BANK SELECT
  391. ;
  392.         .z80
  393. bank:
  394.         out (0feh),a    ; switch board
  395.         and a           ; to get flags
  396.         ld a,0          ; clear a
  397.         jr nz,zero       ; disk contr on for bank zero
  398.         inc a           ; set a to 1
  399. zero:   out (40h),a     ; switch disk controller
  400.     ret
  401.         .8080
  402. ;
  403. ;......................................................................
  404. ;
  405. ;BARBER-POLE REPRESENTATION
  406. ;
  407. ;PATRN:    DB    00H,11H,22H,44H,88H,0EEH,0DDH,0BBH,77H
  408. ;    DB    00H,11H,22H,44H,88H,0EEH,0DDH,0BBH,77H
  409. PATRN:    DB    00H,01H,02H,04H,08H,10H,20H,40H,80H
  410.     DB    0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
  411.     DB    00H,01H,02H,04H,08H,10H,20H,40H,80H
  412.     DB    0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
  413. ;
  414. ;......................................................................
  415. ;
  416. ; MESSAGES
  417. ;
  418. MESG0:    DB      'ENTER BANK (0,1,2) '
  419. MESL0    EQU     $-MESG0
  420. MESG1:    DB    'ENTER ADDRESS OF MEMORY START IN HEX '
  421. MESL1    EQU    $-MESG1
  422. MESG2:    DB    'ENTER ADDRESS OF MEMORY END IN HEX '
  423. MESL2    EQU    $-MESG2
  424. MESG3:    DB    'ERROR: MEMORY START ADDRESS > MEMORY END ADDRESS'
  425. MESL3    EQU    $-MESG3
  426. MESG4:    DB    'MEMORY ERROR AT '
  427. MESL4    EQU    $-MESG4
  428. MESG5:    DB    ' HEX EXPECTED '
  429. MESL5    EQU    $-MESG5
  430. MESG6:    DB    ' FOUND '
  431. MESL6    EQU    $-MESG6
  432. MESG7:    DB    'SUCCESSFUL TEST'
  433. MESL7    EQU    $-MESG7
  434. MESG8:    DB    'UNSUCCESSFUL TEST'
  435. MESL8    EQU    $-MESG8
  436. ;
  437. ;......................................................................
  438. ;
  439. ; WORK-SPACE
  440. ;
  441. ERFLG:    DS    1
  442. MEMND:    DS    2
  443. MEMST:    DS    2
  444. NBYTE:    DS    2
  445. NCYCL:    DS    1
  446. PATLN:    DS    1
  447. BNK:    DS      1
  448. STACK:    DS    16    ;STACK
  449. SPLOC    EQU    $    ;STACK POINTER
  450.  
  451.         .DEPHASE
  452. enda:
  453.  
  454.     END 100H
  455.  
  456.