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

  1. ;
  2. ;****************************************************************
  3. ;*                                *
  4. ;*                                *
  5. ;*        DRIVER UTILITY FOR SD SYSTEMS            *
  6. ;*          PROM-100 EPROM PROGRAMMER            *
  7. ;*            2708 VERSION                *
  8. ;*                                *
  9. ;*                                *
  10. ;****************************************************************
  11. ;
  12. ;
  13. ;    Modified by :    Bill Bolton
  14. ;            Software Tools
  15. ;            P.O. Box 80
  16. ;            Newport Beach
  17. ;            NSW, 2106
  18. ;
  19. ;    Dec 29, 1979    Initial bugs removed
  20. ;        
  21. ;    Jan  3, 1980    Comments added and minor improvements
  22. ;
  23. ;    Jan  4, 1980    2716 file created from 2708 file
  24. ;
  25. ;    Jan 16,    1980    First PROM address not programmed debug
  26. ;
  27. ;    Jan 22, 1982    8080 version created and SPEED equate added
  28. ;            plus other minor internal changes
  29. ;
  30. ;    Jan 25, 1982    8080 2708 version created from 2716 version
  31. ;
  32. WBOOT    EQU    0
  33. BDOS    EQU    00005H        ;BDOS ENTRY ADDRESS
  34. FCB    EQU    0005CH        ;DEFAULT FILE CONTROL BLOCK
  35. OPEN    EQU    15
  36. SETDMA    EQU    26
  37. ATTRIB    EQU    471BH        ;ADM VIDEO ATTRIBUTE LEAD-IN
  38. DATA    EQU    068H        ;PROM-100 DATA PORT
  39. LADD    EQU    069H        ;PROM-100 LOW ADDRESS PORT
  40. HACTL    EQU    06AH        ;PROM-100 CONTROL PORT
  41. SPEED    EQU    6        ;PROCESSOR SPEED IN MHZ
  42. ACR    EQU    0DH        ;ASCII CARRAIGE RETURN
  43. ALF    EQU    0AH        ;ASCII LINE FEED
  44. ;
  45.     TITLE    'PROM16 - 8080 VERSION FOR CP/M'
  46. ;
  47.     MACLIB    MACRO3        ;Use Software Tools special macros
  48. ;
  49.     ORG    0100H
  50. ;
  51. ;
  52.     LXI    SP,SPVAL
  53.     LXI    H,MESG1        ;SIGN ON MESSAGE
  54.     CALL    PTXT        ;PRINT IT
  55.     MVI    A,080H        ;INIT BUFFER COUNT TO FULL
  56.     STA    BUFCNT        ;STORE IT
  57.     XRA    A        ;RESET A TO 0
  58.     STA    OPENFL        ;RESET FILE OPEN FLAG
  59. INITIAL:
  60.     LXI    SP,SPVAL
  61.     XRA    A
  62.     OUT    HACTL        ;INIT PROM-100 BOARD
  63.     CALL    CRLF
  64.     LXI    H,MESG2        ;READY TO LOAD MESSAGE
  65.     CALL    PTXT
  66.     LXI    H,0        ;RESET HL
  67.     SHLD    COUNT        ;RESET COUNT
  68.     CALL    YORN        ;YES OR NO?
  69.     JNC     READ2        ;NO, GO ASK IF A PROM
  70.                 ;IS TO BE READ
  71. ;
  72. FILEOPN:
  73.     CALL    CRLF            
  74.     LDA    OPENFL        ;GET FILE OPEN FLAG
  75.     ORA    A        ;IS FILE OPEN?
  76.     JNZ    FILER        ;YES, CONTINUE TO READ IT
  77.     PUSH    H
  78.     PUSH    D
  79.     PUSH    B
  80.     MVI    C,OPEN        ;OPEN FILE
  81.     LXI    D,FCB        ;FCB ADDRESS
  82.     CALL    BDOS
  83.     POP    B
  84.     POP    D
  85.     POP    H
  86.     CPI    0FFH        ;SUCESSFUL OPEN?
  87.     JNZ    FILER        ;YES, GO READ IT
  88.     LXI    H,MESG7        ;NO, FILE NOT FOUND
  89.     CALL    PTXT
  90.     JMP    EXIT         ;BACK TO CP/M
  91. ;
  92. FILER:
  93.     PUSH    D
  94.     PUSH    B
  95.     MVI    C,SETDMA    ;SET DISK BUFFER
  96.     LXI    D,00080H    ;BUFFER ADDRESS
  97.     CALL    BDOS
  98.     POP    B
  99.     POP    D
  100.     LXI    H,MESG3        ;LOAD & BYTES MESSAGE
  101.     CALL    PTXT
  102.     CALL    SCAN$OP        ;GET OPERANDS FROM KEYBOARD
  103.     LDA    NXCHAR        ;GET FINAL CHARACTER
  104.     CPI    '.'        ;IS IT ENTRY ABORT CHAR?
  105.     JZ     FILEOPN        ;YES, REPROCESS THE LOOP
  106.     LXI    H,MESG9        ;NO, LOAD START MESSAGE
  107.     CALL    PTXT
  108.     LHLD    OPR1        ;POINT TO FIRST OPERAND
  109.     CALL    PADDR        ;PRINT IT IN HEX
  110.     CALL    CRLF
  111.     CALL    HXREC        ;GET START OF NEXT HEX RECORD
  112.     PUSH    H
  113.     LDED    OPR1        ;GET MEM START ADDRESS
  114.     LDA    OPCNT        ;GET NUMBER OF OPS ENTERED
  115.     ANA    A        ;DETERMINE IF ZERO?
  116.     JZ     FILER1        ;YES, LOAD FILE AT OWN ADDRESS
  117.     DSUB            ;FORM LOAD OFFSET INTO MEMORY
  118.     PUSH    H        ;COPY OFFSET
  119.     POP    D        ; INTO DE
  120. FILER1:
  121.     POP    H        ;GET FILE START ADDRESS
  122.     SDED    OFFSET        ;(OFFSET = 0 IF NO OPERAND)
  123.     JMP    FILER3
  124. ;
  125. FILER2:
  126.     CALL    HXREC
  127. FILER3:
  128.     LDED    OFFSET        ;GET LOAD OFFSET
  129.     ORA    A
  130.     DSUB            ;FORM LOAD ADDRESS
  131. LOADLP:
  132.     CALL    HEXBIN        ;GET A BYTE
  133.     MOV    M,A        ;PUT INTO MEMORY
  134.     SHLD    LDPOINT        ;SAVE LOAD ADDRESS POINTER
  135.     INX    H        ;BUMP THE LOAD ADDRESS
  136.     PUSH    H
  137.     LHLD    COUNT
  138.     INX    H        ;BUMP THE LOAD COUNT
  139.     SHLD    COUNT
  140.     POP    H
  141.     DCX    B        ;BC < NUMBER OF BYTES IN HEX RECORD
  142.     MOV    A,B
  143.     ORA    C
  144.     JNZ    LOADLP
  145.     CALL    HEXBIN        ;FETCH HEX RECORD CHECKSUM
  146.     XRA    A        ;RESET A
  147.     ADD    C        ;CHECKSUM ERROR?
  148.     JZ     ENDCHK        ;NO, CHECK FOR END
  149.     PUSH    H        ;YES, SAVE THE ADDRESS
  150.     LXI    H,MESG10    ;CHECKSUM ERROR MESSAGE
  151.     CALL    PTXT
  152.     POP    H        ;RESTORE THE ADDRESS
  153.     CALL    PADDR        ;PRINT ERROR ADDRESS
  154. ENDCHK:
  155.     LHLD    COUNT        ;COUNT OF BYTES LOADED
  156.     LBCD    OPR2        ;NUMBER OF BYTES REQUIRED
  157.     DCX    H
  158.     DCX    B
  159.     ANA    A
  160.     BSUB            ;MORE BYTES TO LOAD?
  161.     JC     FILER2        ;YES, GET THEM
  162. ;
  163. LDEND:
  164.     LXI    H,MESG11    ;LOAD END ADDR MESSAGE
  165.     CALL    PTXT
  166.     LHLD    LDPOINT        ;GET LOAD END ADDRESS
  167.     CALL    PADDR        ;PRINT HEX ADDRESS
  168. ;
  169. PPG10A:
  170.     CALL    CRLF
  171.     LXI    H,MESG4        ;READY TO PROG MESSAGE
  172.     CALL    PTXT
  173.     CALL    YORN        ;YES OR NO?
  174.     JNC     EXIT        ;NO, EXIT
  175. ;
  176. PPG11:
  177.     CALL    CRLF
  178.     LXI    H,MESG5        ;YES, MEM START ETC. MESSAGE
  179.     CALL    PTXT
  180.     CALL    SCAN$OP        ;GET OPERANDS
  181.     LDA    NXCHAR
  182.     CPI    '.'        ;ENTRY ABORT CHARACTER?
  183.     JZ     PPG11        ;YES, REPROCESS LOOP
  184.     JMP    PROG         ;NO, GO PROGRAM EPROM
  185. ;
  186. ;
  187. ; LOOKS FOR START OF A HEX RECORD AND RETURNS
  188. ; FIRST DATA BYTE IN A, BYTE COUNT IN B &
  189. ; RECORD LOAD ADDRESS IN HL
  190. ;
  191. ;
  192. HXREC:
  193.     CALL    BUFFR        ;GET AN ASCII BYTE
  194.     CPI    ':'        ;IS IT HEX RECORD START?
  195.     JNZ    HXREC        ;NO, KEEP LOOKING
  196.     XRA    A        ;RESET A
  197.     MOV    C,A        ;RESET C
  198.     CALL    HEXBIN        ;GET A 'HEX' BYTE
  199.     ANA    A        ;IS IT 0?
  200.     JZ     HXREC1        ;YES, MUST BE AT END
  201.     MOV    B,A        ;NO, # BYTES IN HEX RECORD
  202.     CALL    HEXBIN        
  203.     MOV    H,A        ;HI BYTE OF LOAD
  204.     CALL    HEXBIN
  205.     MOV    L,A        ;LO BYTE OF LOAD
  206.     CALL    HEXBIN        ;GET FIRST DATA BYTE
  207.     RET    
  208. ;
  209. HXREC1:
  210.     POP    PSW
  211.     JMP    LDEND 
  212. ;
  213. ;
  214. ; DETERMINE IF Y, N OR ABORT ANSWER
  215. ;
  216. ;
  217. YORN:
  218.     CALL    ECHO
  219.     CPI    '.'
  220.     JZ     EXIT
  221.     ORA    A
  222.     CPI    'N'
  223.     RZ    
  224.     CPI    'Y'
  225.     JNZ    YORN
  226.     STC 
  227.     RET    
  228. ;
  229. ;
  230. ; CONSOLE STATUS, INPUT AND OUTPUT
  231. ;
  232. ;
  233. CONSTAT:
  234.     PUSH    H
  235.     PUSH    D
  236.     PUSH    B
  237.     MVI    C,11
  238.     CALL    BDOS
  239.     POP    B
  240.     POP    D
  241.     POP    H
  242.     ORA    A
  243.     RET    
  244. ;
  245. CONIN:
  246.     PUSH    H
  247.     PUSH    D
  248.     PUSH    B
  249.     MVI    C,1
  250.     CALL    BDOS
  251.     POP    B
  252.     POP    D
  253.     POP    H
  254.     MOV    C,A        ;NEED A & C TO RETURN CHAR
  255.     RET    
  256. ;
  257. CONOUT:
  258.     PUSH    H
  259.     PUSH    D
  260.     PUSH    B
  261.     MOV    E,C
  262.     MVI    C,2
  263.     CALL    BDOS
  264.     POP    B
  265.     POP    D
  266.     POP    H
  267.     MOV    C,E        ;NEED C TO RETURN CHAR
  268.                 ;SENT
  269.     RET    
  270. ;
  271. ;
  272. ; CLOSE FILE AND EXIT BACK TO CP/M
  273. ;
  274. ;
  275. EXIT:
  276.     XRA    A
  277.     OUT    HACTL
  278.     CALL    CRLF
  279.     LDA    OPENFL
  280.     ORA    A
  281.     JZ     WBOOT
  282.     MVI    C,16
  283.     LXI    D,FCB
  284.     CALL    BDOS
  285.     JMP    WBOOT 
  286. ;
  287. ;
  288. ; PRINT VALUE IN ACCUMULATOR AS AN ASCII 'HEX' VALUE
  289. ;
  290. ;
  291. PADDR:
  292.     MOV    A,H        ;HI BYTE OF ADDRESS
  293.     CALL    PACC        ;PRINT A AS HEX VALUE
  294.     MOV    A,L        ;LO BYTE OF ADDRESS
  295.     JMP    PASP         ;PRINT<A, ' ' CRLF
  296. ;
  297. ;
  298. MESG1:
  299.     DB    ACR,ALF
  300.     DB    'Software Tools PROM-100 Driver utility for 2708 EPROMs'
  301.     DB    ACR,ALF
  302.     DB    'Version 1.13 for '
  303.     DB    SPEED + '0',' MHz Z80/8080, January 1982'
  304.     DB    ACR,ALF
  305.     DB    '$'
  306. ;
  307. MESG2:
  308.     DB    'Ready to load a hex file (Y/N)? '
  309.     DB    '$'
  310. ;
  311. MESG3:
  312.     DB    'Load address, Number of bytes to load : '
  313.     DB    '$'
  314. ;
  315. MESG4:
  316.     DB    'Ready to program a PROM  (Y/N)? '
  317.     DB    '$'
  318. ;
  319. MESG5:
  320.     DB    'Memory start, Memory end, PROM start  : '
  321.     DB    '$'
  322. ;
  323. MESG6:
  324.     DB    'Ready  to  read  a  PROM (Y/N)? '
  325.     DB    '$'
  326. ;
  327. MESG7:
  328.     DB    ACR,ALF
  329.     DW    ATTRIB
  330.     DB    '4'
  331.     DB    ' FILE NOT FOUND '
  332.     DW    ATTRIB
  333.     DB    '0'
  334.     DB    '$'
  335. ;
  336. MESG8:
  337.     DB    ACR,ALF
  338.     DW    ATTRIB
  339.     DB    '4'
  340.     DB    ' Attempting to read past end of disk file '
  341.     DW    ATTRIB
  342.     DB    '0'
  343.     DB    '$'
  344. ;
  345. MESG9:
  346.     DB    ACR,ALF
  347.     DB    'Load start address = '
  348.     DB    '$'
  349. ;
  350. MESG10:
  351.     DW    ATTRIB
  352.     DB    '4'
  353.     DB    'Checksum error at location : '
  354.     DW    ATTRIB
  355.     DB    '0'
  356.     DB    '$'
  357. ;
  358. MESG11:
  359.     DB    'Load end address   = '
  360.     DB    '$'
  361. ;
  362. ;
  363. ; PROM READ SEQUENCE
  364. ;
  365. ;
  366. READ2:
  367.     CALL    CRLF
  368.     LXI    H,MESG6        ;READY TO READ MESSAGE
  369.     CALL    PTXT
  370.     CALL    YORN
  371.     JNC     PPG10A        ;NO, THEN PROGRAM
  372. READ0:
  373.     CALL    CRLF
  374.     LXI    H,MESG5        ;MEM START ETC. MESSAGE
  375.     CALL    PTXT
  376.     CALL    SCAN$OP        ;INPUT PARAMETERS
  377.     LDA    NXCHAR
  378.     CPI    '.'
  379.     JZ     READ0
  380.     MVI    A,040H        ;TURN ON PROM VOLTAGE
  381.     OUT    HACTL    
  382.     LHLD    OPR1        ;MEM START ADDRESS
  383.     LDED    OPR3        ;PROM START ADDRESS
  384. READ1:
  385.     CALL    PREAD        ;READ A BYTE OF PROM
  386.     MOV    M,A        ;SAVE BYTE IN MEMORY
  387.     CALL    ADCMP        ;INC ADDRESS AND COMPARE
  388.     JNZ    READ1        ;IF NOT END, READ NEXT BYTE
  389.     XRA    A        ;TURN OFF PROM
  390.     OUT    HACTL
  391.     JMP    PPG10A         ;PROGRAM SEQUENCE
  392. ;
  393. ;
  394. ; INC HL & DE THEN COMPARE WITH (IX)
  395. ; EXIT WITH ZERO FLAG SET IF EQUAL
  396. ;
  397. ;
  398. ADCMP:
  399.     INX    D        ;INC PROM ADDRESS
  400.     MOV    A,D
  401.     ANI    00FH        ;MAX PROM ADDR =00FFFH
  402.     MOV    D,A
  403.     INX    H
  404.     PUSH    D
  405.     PUSH    H        ;SAVE HL & DE
  406.     LDED    OPR2        ;GET RAM END ADDRESS
  407.     INX    D
  408.     ANA    A
  409.     CPHL            ;COMPARE
  410.     POP    H
  411.     POP    D
  412.     RET    
  413. ;
  414. ;
  415. ; PROGRAMMING SEQUENCE
  416. ;
  417. ;
  418. PROG:
  419.     MVI    A,40
  420.     OUT    HACTL        ;TURN ON PROM VOLTAGE
  421.     LHLD    OPR1        ;MEM START ADDRESS
  422.     LDED    OPR3        ;PROM START ADDRESS
  423. PROG1:
  424.     CALL    PREAD        ;READ A BYTE FROM PROM
  425.     CPI    0FFH        ;ERASED?
  426.     JNZ    PROG2        ;NO, PRINT ERROR
  427. PROG1A:
  428.     CALL    ADCMP        ;INC ADDRESS & CHECK FOR END
  429.     JNZ    PROG1
  430.     JMP    PROG3        ;ALL OK, PROGRAM PROM
  431. ;
  432. PROG2:
  433.     PUSH    H
  434.     LXI    H,MESG13    ;NOT ERASED MESSAGE
  435.     CALL    PTXT
  436.     POP    H
  437.     IN    DATA
  438.     CALL    PRTER        ;PRINT BAD LOCATION
  439.     CALL    ECHO        ;READ CONSOLE
  440.     CPI    '.'        ;ABORT?
  441.     JZ     PROG9
  442.     CPI    'C'        ;CONTINUE?
  443.     JZ     PROG3
  444.     JMP    PROG1A        ;CHECK MORE LOCATIONS
  445. ;
  446. PROG2A:
  447.     MVI    A,0
  448.     OUT    HACTL
  449.     JMP    INITIAL 
  450. ;
  451. PROG3:
  452.     CALL    CRLF
  453.     MVI    B,065H        ;B < NUMBER OF PROGRAMMING  LOOPS
  454. PROG4:
  455.     LHLD    OPR1        ;MEM START ADDRESS
  456.     LDED    OPR3        ;PROM START ADRESS
  457.     DCR    B        ;ADJUST COUNT
  458.     JZ    PROG6
  459. PROG5:
  460.     PUSH    B        ;SAVE COUNT
  461.     CALL    PPROG        ;PROGRAM ONE BYTE
  462.     POP    B
  463.     CALL    CONSTAT
  464.     JZ     PROG5A
  465.     CALL    CONIN
  466.     CPI    '.'
  467.     JZ     PROG9
  468. PROG5A:
  469.     CALL    ADCMP        ;INC ADDRESS & CHECK FOR END
  470.     JNZ    PROG5        ;FINISH THIS LOOP
  471.     JMP    PROG4
  472. ;
  473. PROG6:
  474.     MVI    A,0
  475.     OUT    HACTL        ;TURN OFF ALL CONTROL LINES
  476.     MVI    D,20
  477. PROG6A:
  478.     XRA    A
  479.     CALL    DELAY
  480.     DCR    D
  481.     JNZ    PROG6A
  482.     LHLD    OPR1        ;MEM START ADDRESS
  483.     LDED    OPR3        ;PROM START ADDRESS
  484. PROG7:
  485.     CALL    PREAD        ;READ PROM DATA
  486.     CMP    M        ;COMPARE TO MEMORY DATA
  487.     JNZ    PROG8        ;ERROR IF NOT MATCHED
  488. PROG7A:
  489.     CALL    ADCMP        ;INC ADDRESS & CHECK FOR END
  490.     JNZ    PROG7
  491.     JMP    PROG2A        ;EXIT, COMPLETE
  492. ;
  493. PROG8:
  494.     PUSH    PSW
  495.     PUSH    H
  496.     LXI    H,MESG14    ;BAD LOCATION MESSAGE
  497.     CALL    PTXT
  498.     POP    H
  499.     CALL    CONSTAT
  500.     JZ     PROG8A
  501.     CALL    CONIN
  502.     CPI    '.'        ;ABORT?
  503.     JZ     PROG9
  504. PROG8A:
  505.     POP    PSW
  506.     CALL    PRTER        ;PRINT THE ERROR MESSAGE
  507.     JMP    PROG7A        ;CHECK MORE LOCATIONS
  508. ;
  509. PROG9:
  510.     LXI    H,MESG15    ;ABORTED MESSAGE
  511.     CALL    PTXT
  512.     JMP    PROG2A
  513. ;
  514. ;
  515. ; PULSE ONE PROM LOCATION
  516. ;
  517. ;
  518. PPROG:
  519.     CALL    PADD        ;LATCH LSB OF ADDRESS
  520.     MOV    A,D
  521.     ANI    00FH        ;MAX ROM ADDRESS =00FFFH
  522.     ORI    080H
  523.     OUT    HACTL
  524.     MOV    A,M        ;FETCH DATA
  525.     OUT    DATA        ;OUTPUT TO PROM
  526.     MOV    A,D
  527.     ORI    0C0H        ;TURN ON PROGRAMING PULSE
  528.     OUT    HACTL
  529.     MVI    A,1
  530.     CALL    DELAY        ;1 MILLISEC DELAY
  531.     MOV    A,D
  532.     ORI    080H
  533.     ANI    087H        ;TURN OFF PROGRAMING PULSE
  534.     OUT    HACTL
  535.     RET    
  536. ;
  537. DELAY:
  538.     LXI    B,26 * SPEED    ;DELAY COUNT DEPENDS ON PROC SPEED
  539.     PUSH    PSW
  540. DELAY1:
  541.     DCX    B        ;ADJUST INNER COUNT
  542.     MOV    A,B
  543.     ORA    C        ;DONE?
  544.     JNZ    DELAY1         ;NO
  545.     POP    PSW        ;YES
  546.     DCR    A        ;ADJUST OUTER COUNT
  547.     JNZ    DELAY
  548.     RET    
  549. ;
  550. ;
  551. ; READ ONE LOCATION OF PROM
  552. ;
  553. ;
  554. PREAD:
  555.     CALL    PADD        ;LATCH LSB OF ADDRESS
  556.     MOV    A,D
  557.     ANI    7
  558.     OUT    HACTL
  559.     IN    DATA
  560.     RET    
  561. ;
  562. ;
  563. ; LATCH LOWER 8 BITS OF PROM ADDRESS
  564. ;
  565. ;
  566. PADD:
  567.     MOV    A,E
  568.     OUT    LADD
  569.     RET    
  570. ;
  571. ;
  572. ; PRINTS ADDRESS, BAD DATA, GOOD DATA
  573. ; OF ERROR LOCATION
  574. ;
  575. ;
  576. PRTER:
  577.     MOV    B,A
  578.     MOV    A,D
  579.     CALL    PACC        ;PRINT MSB OF ADDRESS
  580.     MOV    A,E
  581.     CALL    PACC        ;PRINT LSB
  582.     MVI    C,' '
  583.     CALL    CONOUT
  584.     MOV    A,B
  585.     CALL    PACC        ;PRINT BAD DATA
  586.     MVI    C,' '
  587.     CALL    CONOUT
  588.     MOV    A,M
  589.     CALL    PACC        ;PRINT GOOD DATA
  590.     CALL    CRLF
  591.     RET    
  592. ;
  593. ;
  594. MESG13:
  595.     DW    ATTRIB
  596.     DB    '4'
  597.     DB    'Not Erased'
  598.     DW    ATTRIB
  599.     DB    '0'
  600.     DB    ' : '
  601.     DB    '$'
  602. ;
  603. MESG14:
  604.     DW    ATTRIB
  605.     DB    '4'
  606.     DB    'Bad location'
  607.     DW    ATTRIB
  608.     DB    '0'
  609.     DB    ' : '
  610.     DB    '$'
  611. ;
  612. MESG15:
  613.     DW    ATTRIB
  614.     DB    '4'
  615.     DB    ' ABORTED '
  616.     DW    ATTRIB
  617.     DB    '0'
  618.     DB    ACR,ALF
  619.     DB    '$'
  620. ;
  621. ;
  622. ; GET A BYTE FROM AN INTEL 'HEX' FORMAT FILE
  623. ; AND RETURN WITH IT IN BINARY FORM IN A
  624. ;
  625. ;
  626. HEXBIN:
  627.     CALL    BUFFR        ;GET AN ASCII BYTE
  628.     CALL    ASBIN        ;MAKE IT BINARY
  629.     RLC 
  630.     RLC 
  631.     RLC 
  632.     RLC 
  633.     PUSH    B
  634.     MOV    C,A
  635.     CALL    BUFFR
  636.     CALL    ASBIN
  637.     ORA    C
  638.     POP    B
  639.     PUSH    PSW
  640.     ADD    C
  641.     MOV    C,A
  642.     POP    PSW
  643.     RET    
  644. ;
  645. ;
  646. ; ASCII TO BINARY CONVERSION
  647. ;
  648. ;
  649. ASBIN:
  650.     SUI    '0'
  651.     CPI    10
  652.     RM    
  653.     SUI    007H
  654.     RET    
  655. ;
  656. ;
  657. ; UTILITY PRINT ROUTINES
  658. ;
  659. ;
  660. PASP:
  661.     PUSH    B
  662.     CALL    PACC
  663.     CALL    SPACE
  664.     CALL    CRLF
  665.     POP    B
  666.     RET    
  667. ;
  668. CRLF:
  669.     MVI    C,ACR
  670.     CALL    CONOUT
  671.     MVI    C,ALF
  672.     JMP    CONOUT 
  673. ;
  674. SPACE:
  675.     MVI    C,' '
  676.     JMP    CONOUT 
  677. ;
  678. PTXT:
  679.     MOV    A,M        ;FETCH A BYTE
  680.     CPI    '$'
  681.     RZ    
  682.     MOV    C,A
  683.     CALL    CONOUT
  684.     INX    H
  685.     JMP    PTXT 
  686. ;
  687. PACC:
  688.     PUSH    PSW
  689.     RRC 
  690.     RRC 
  691.     RRC 
  692.     RRC 
  693.     CALL    PRVAL
  694.     POP    PSW
  695. PRVAL:
  696.     ANI    00FH
  697.     ADI    090H
  698.     DAA
  699.     ACI    040H
  700.     DAA
  701.     MOV    C,A
  702.     JMP    CONOUT 
  703. ;
  704. ;
  705. ; CHECK FOR VALID ASCII 'HEX' CHARACTER
  706. ;
  707. ;
  708. AORN:
  709.     CPI    '0'
  710.     JC     AORN2
  711.     CPI    '9'+1
  712.     JC     AORN1
  713.     CPI    'A'-1
  714.     JC     AORN2
  715.     CPI    'F'+1
  716.     JNC     AORN2
  717. AORN1:
  718.     XRA    A
  719.     RET    
  720. ;
  721. AORN2:
  722.     XRA    A
  723.     INR    A
  724.     RET    
  725. ;
  726. ;
  727. ; CHECK FOR ENTRY TERMINATOR:
  728. ;
  729. ; SPACE, COMMA OR CARRIAGE RETURN
  730. ;
  731. ;
  732. TERMCHK:
  733.     CPI    ' '
  734.     RZ    
  735.     CPI    ','
  736.     RZ    
  737.     CPI    '.'
  738.     JZ     TCHK0
  739.     CPI    00DH
  740.     RNZ    
  741. TCHK0:
  742.     PUSH    B
  743.     CALL    CRLF
  744.     POP    B
  745.     XRA    A
  746.     RET    
  747. ;
  748. ;
  749. ; SCAN FOR OPERAND FROM CONSOLE
  750. ;
  751. ; EXIT WITH DATA IN HL, TERMINATOR
  752. ; IN C. IF VALID DATA, RETURN WITH
  753. ; ZERO FLAG SET. B CONTAINS NUMBER
  754. ; OF CHARACTERS ENTERED
  755. ;
  756. ;
  757. KEYIN:
  758.     LXI    H,0
  759.     MOV    B,L
  760. KEY1:
  761.     CALL    ECHO
  762.     INR    B        ;INC CHARACTER COUNT
  763.     CALL    TERMCHK        ;TERMINATOR?
  764.     RZ    
  765.     CALL    AORN        ;CHECK FOR VALID DATA
  766.     RNZ    
  767.     MOV    A,C
  768.     CALL    ASBIN        ;CONVERT TO BINARY
  769.     DAD    H
  770.     DAD    H
  771.     DAD    H
  772.     DAD    H        ;SHIFT 4 BITS
  773.     ADD    L
  774.     MOV    L,A
  775.     JMP    KEY1 
  776. ;
  777. ECHO:
  778.     JMP    CONIN         ;CP/M DOES ITS OWN ECHO
  779. ;
  780. INVCMD:
  781.     MVI    C,'?'
  782.     CALL    CONOUT
  783.     MVI    A,'.'
  784.     STA    NXCHAR
  785.     RET    
  786. ;
  787. SCAN$OP:
  788.     XRA    A        ;INITIALISE
  789.     STA    OPCNT
  790.     LXI    H,OPR1        ;CLEAR OPERANDS
  791.     SHLD    OP$POINT$
  792.     MOV    M,A        ;RESET HL
  793.     LXI    B,9
  794.     LXI    D,OPRS+1
  795. SCLOOP:
  796.     MOV    A,M        ;GET A BYTE
  797.     STAX    D        ;PUT A BYTE
  798.     INX    H        ;BUMP POINTERS
  799.     INX    D
  800.     DCX    B        ;ADJUST COUNT
  801.     MOV    A,B
  802.     ORA    C        ;DONE?
  803.     JNZ    SCLOOP        ;NO
  804. SCAN1:
  805.     CALL    KEYIN        ;GET 1 OPERAND FROM CONSOLE
  806.     JNZ     INVCMD
  807.     MOV    A,C
  808.     STA    NXCHAR
  809.     CPI    ' '
  810.     JZ     SCAN2
  811.     CPI    ','
  812.     JZ     SCAN2
  813.     DCR    B
  814.     RZ            ;RETURN IF NO DATA
  815. SCAN2:
  816.     PUSH    D        ;PRESERVE CONTENTS OF D
  817.     XCHG            ;DE < DATA
  818.     LHLD    OP$POINT    ;GET POINTER
  819.     MOV    M,E        ;PUT LOW BYTE
  820.     INX    H
  821.     MOV    M,D        ;PUT HIGH BYTE
  822.     INX    H
  823.     SHLD    OP$POINT    ;STORE POINTER
  824.     POP    D
  825.     LDA    OPCNT
  826.     INR    A        ;BUMP OPERAND COUNT
  827.     STA    OPCNT
  828.     MOV    A,C
  829.     CPI    ' '
  830.     JZ     SCAN1
  831.     CPI    ','
  832.     JZ     SCAN1
  833.     RET    
  834. ;
  835. BUFFR:
  836.     PUSH    H        ;SAVE,
  837.     PUSH    D        ;THE,
  838.     PUSH    B        ;ENVIRONMENT
  839.     LDA    BUFCNT        ;GET POS OF LAST BYTE
  840.                 ;READ FROM BUFFER
  841.     CPI    080H        ;AT END OF THE RECORD?
  842.     JNZ    BUFFR1        ;NO, GET NEXT BYTE
  843.     MVI    C,20        ;READ NEXT FILE RECORD
  844.     LXI    D,FCB        ;FCB ADDRESS
  845.     CALL    BDOS
  846.     ORA    A        ;SUCESSFUL READ?
  847.     JNZ    ERROR        ;NO, FINALISE THEN EXIT
  848.     XRA    A        ;YES, RESET A
  849. BUFFR1:
  850.     LXI    H,00080H    ;START OF DISK BUFFER
  851.     MOV    E,A        ;GET OFFSET TO LAST BYTE
  852.                 ;READ FROM BUFFER
  853.     INR    A        ;BUMP TO NEXT BYTE
  854.     STA    BUFCNT        ;SAVE NEW LOCATION
  855.     MVI    D,0        ;RESET DE
  856.     DAD    D        ;FORM ACTUAL ADDRESS
  857.     MOV    A,M        ;GET BYTE
  858.     POP    B        ;RESTORE
  859.     POP    D        ; THE
  860.     POP    H        ; ENVIRONMENT
  861.     RET    
  862. ;
  863. ERROR:
  864.     POP    B
  865.     POP    D
  866.     POP    H
  867.     LXI    H,MESG8        ;READ PAST EOF MESSAGE
  868.     CALL    PTXT
  869.     JMP    EXIT 
  870. ;
  871. COUNT:    DW    0
  872. OFFSET:    DB    0
  873. OPCNT:    DB    0
  874. NXCHAR:    DB    0
  875. OPENFL:    DB    0
  876. BUFCNT:    DB    0
  877. LDPOINT    DW    0
  878. OP$POINT DW    0
  879. OPRS:    DS    6
  880. OPR1    EQU    OPRS
  881. OPR2    EQU    OPRS+2
  882. OPR3    EQU    OPRS+4
  883. SPVAL    EQU    OPRS+100H
  884. ;
  885.     END
  886.