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 / CPMUG006.ARK / BLOAD.ASM next >
Assembly Source File  |  1984-04-29  |  5KB  |  304 lines

  1. ;BLOAD - 
  2. ;PROGRAM TO READ TARBELL 8K BASIC 3.1 TAPES
  3. ;AND CREATE A SOURCE FILE
  4. TEST    EQU    0H
  5. ;5/17/77 WRITTEN
  6.     ORG    100H
  7.     JMP    START    ;SKIP ID
  8.     DB    '(BLOAD 5/17/77)','Z'-40H
  9. START    EQU    $
  10. ;
  11.     IF    NOT TEST
  12.     MVI    C,DELT
  13.     CALL    DKFNC    ;ERASE OLD FILE
  14.     MVI    C,MAKE
  15.     CALL    DKFNC
  16.     INR    A
  17.     JZ    WRERR
  18.     ENDIF
  19. ;
  20.     LXI    H,BUFF
  21. ;READ FILE INTO MEMORY FROM TAPE
  22. RESET    MVI    A,10H
  23.     OUT    6EH
  24. INIT    CALL    TBIN
  25.     CPI    0E6H
  26.     JZ    INIT    ;SKIP DOUBLE SYNC
  27.     STA    7300H    ;SHOW CHAR BEING LOADED
  28. RD3    MVI    D,3
  29. RDLP    CALL    TBIN
  30.     MOV    M,A
  31.     INX    H
  32.     ORA    A
  33.     JNZ    RD3
  34.     DCR    D
  35.     JNZ    RDLP
  36. ;CONVERT AND WRITE
  37.     LXI    D,80H    ;OUTPUT BUFFER ADDR
  38.     LXI    H,BUFF
  39.     INX    H    ;SKIP NEXT
  40.     INX    H    ;..ADDR
  41. LINE    CALL    BIASC    ;CONV LINE #
  42. CHAR    MOV    A,M    ;GET A CHAR
  43.     INX    H    ;POINT TO NEXT
  44.     ORA    A
  45.     JZ    CRLF    ;END OF LINE
  46.     JM    KEYWD    ;IT IS A TOKEN
  47. ;STORE CHAR
  48.     CALL    STORE
  49.     JMP    CHAR
  50. ;
  51. CRLF    MVI    A,13
  52.     CALL    STORE
  53.     MVI    A,10
  54.     CALL    STORE
  55.     MOV    A,M    ;GET NEXT LINE ADDR
  56.     INX    H
  57.     ORA    M
  58.     INX    H
  59.     JNZ    LINE    ;GET NEXT LINE
  60. ;
  61.     IF    NOT TEST
  62. ;
  63. ;ALL DONE - WRITE LAST BLOCK, CLOSE FILE
  64. ;
  65.     MVI    A,'Z'-40H ;EOF CHAR
  66.     CALL    STORE
  67.     MVI    C,WRITE
  68.     CALL    DKFNC
  69.     ORA    A
  70.     JNZ    WRERR
  71.     MVI    C,CLOSE
  72.     CALL    DKFNC
  73. ;
  74.     ENDIF
  75.     JMP    0
  76. ;
  77. ;PROCESS KEYWORD
  78. ;
  79. KEYWD    PUSH    H    ;SAVE INPUT POINTER
  80.     LXI    H,TABLE    ;POINT TO KEYWORD TABLE
  81.     SUI    7FH    ;FUDGE
  82.     MOV    C,A    ;SAVE TOKEN #
  83.     PUSH    D    ;SAVE OUTPUT POINTER
  84. KEY10    PUSH    H    ;SAVE START OF TOKEN
  85. KEY20    MOV    A,M    ;GET CHAR
  86.     INX    H    ;POINT TO NEXT
  87.     ORA    A    ;SET COND
  88.     JP    KEY20    ;KEEP GOING
  89.     DCR    C    ;RIGHT TOKEN?
  90.     POP    D    ;GET START OF TOKEN ADDR
  91.     JNZ    KEY10    ;NOT RIGHT ONE
  92. ;
  93. ;GOT TOKEN
  94. ;
  95.     XCHG        ;TOKEN TO H,L
  96.     POP    D    ;GET OUTPUT ADDR
  97. ;
  98. ;MOVE TOKEN TO OUTPUT
  99. ;
  100. KEY30    MOV    A,M    ;GET CHAR OF TOKEN
  101.     ANI    7FH    ;DELETE HI BIT
  102.     CALL    STORE    ;STORE IT
  103.     MOV    A,M    ;GET CHAR
  104.     INX    H    ;POINT TO NEXT
  105.     ORA    A    ;END OF TOKEN?
  106.     JP    KEY30    ;..NO
  107.     POP    H    ;GET INPUT POINTER
  108.     JMP    CHAR
  109. ;
  110. ;ROUTINE TO STORE OUTPUT, WRITE FULL BUFFER
  111. ;
  112. STORE    PUSH PSW ! PUSH B ! PUSH D ! PUSH H
  113.     MOV    E,A
  114.     MVI    C,WRCON
  115.     CALL    BDOS    ;PRINT CHAR
  116.     POP H ! POP D ! POP B ! POP PSW
  117. ;
  118.     IF    NOT TEST
  119.     STAX    D    ;SAVE THE CHAR
  120.     INR    E    ;BUMP
  121.     RNZ
  122.     PUSH    B
  123.     MVI    C,WRITE
  124.     CALL    DKFNC    ;WRITE A SECTOR
  125.     POP    B
  126.     MVI    E,80H    ;RE-INIT BUFFER ADDR
  127. ;
  128.     ENDIF
  129.     RET
  130.     IF    NOT TEST
  131. ;
  132. ;DISK FUNCTIONS - FNC IS IN C
  133. ;
  134. DKFNC    PUSH    H
  135.     PUSH    D
  136.     LXI    D,FCB
  137.     CALL    BDOS
  138.     POP    D
  139.     POP    H
  140.     RET
  141. ;WRITE ERROR
  142. WRERR    LXI    D,WRERM
  143.     MVI    C,PRINT
  144.     CALL    BDOS
  145.     JMP    0
  146. WRERM    DB    'WRITE ERROR$'
  147. ;
  148.     ENDIF
  149. ;TARBELL INPUT
  150. TBIN    IN    6EH
  151.     ANI    10H
  152.     JNZ    TBIN
  153.     IN    6FH
  154.     RET
  155. ;
  156. ;CONVERT LINE $ FROM BINARY TO ASCII
  157. ;
  158. BIASC    PUSH    B
  159.     MOV    C,M    ;GET LO ORD
  160.     INX    H
  161.     MOV    B,M    ;GET HI ORD
  162.     INX    H    ;SKIP HI ORD
  163.     PUSH    H
  164.     MOV    H,B
  165.     MOV    L,C
  166.     XRA    A    ;ZERO
  167.     STA    ZSFLG    ;ZERO SUPPRESS FLAG
  168.     LXI    B,-10000
  169.     CALL    SBT
  170.     LXI    B,-1000
  171.     CALL    SBT
  172.     LXI    B,-100
  173.     CALL    SBT
  174.     LXI    B,-10
  175.     CALL    SBT
  176.     MOV    A,L
  177.     ORI    '0'
  178.     CALL    STORE
  179.     POP    H
  180.     POP    B
  181.     MVI    A,' '
  182.     CALL    STORE    ;SPACE AFTER LINE #
  183.     RET
  184. ;
  185. ;SUBROUTINE TO ADD BC TO HL
  186. ;AND COUNT DECIMAL # TIMES
  187. ;
  188. SBT    PUSH    D
  189.     MVI    D,'0'
  190. SBTLP    PUSH    H    ;SAVE FOR RESTORE
  191.     DAD    B    ;'SUBTRACT'
  192.     JNC    NOSBT    ;COULDN'T SBTTRACT
  193.     INR    D    ;INCR DECIMAL VALUE
  194.     INX    SP    ;DELETE
  195.     INX    SP    ;SAVED HL
  196.     JMP    SBTLP
  197. NOSBT    POP    H    ;RESTORE VALUE
  198.     MOV    A,D    ;GET DIGIT
  199.     POP    D
  200.     CPI    '0'    ;IF NOT ZERO
  201.     JZ    CKZER    ;IS ZERO - CK '0' SUPPRESS
  202. ;NOT ZERO - TURN OFF ZERO SUPPRESS FLAG
  203.     STA    ZSFLG
  204.     JMP    STORE    ;STORE THE CHAR
  205. ;IT IS A ZERO - CHECK FOR ZERO SUPPRESS
  206. CKZER    LDA    ZSFLG    ;GET THE FLAG
  207.     ORA    A    ;SET COND CODE
  208.     MVI    A,'0'
  209.     JNZ    STORE
  210.     RET        ;NO STORE IF SUPPRESSED
  211. ;
  212. ; BDOS EQUATES (VERSION 2)
  213. ;
  214. RDCON    EQU    1
  215. WRCON    EQU    2
  216. PRINT    EQU    9
  217. OPEN    EQU    15    ;0FFH=NOT FOUND
  218. CLOSE    EQU    16    ;   "    "
  219. SRCHF    EQU    17    ;   "    "
  220. SRCHN    EQU    18    ;   "    "
  221. DELT    EQU    19    ;NO RET CODE
  222. READ    EQU    20    ;0=OK, 1=EOF
  223. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  224. MAKE    EQU    22    ;0FFH=BAD
  225. REN    EQU    23    ;0FFH=BAD
  226. STDMA    EQU    26
  227. BDOS    EQU    5
  228. REIPL    EQU    0
  229. FCB    EQU    5CH
  230. TABLE    DB    'EN','D'+128
  231.     DB    'FO','R'+128
  232.     DB    'NEX','T'+128
  233.     DB    'DAT','A'+128
  234.     DB    'INPU','T'+128
  235.     DB    'DI','M'+128
  236.     DB    'REA','D'+128
  237.     DB    'LE','T'+128
  238.     DB    'GOT','O'+128
  239.     DB    'RU','N'+128
  240.     DB    'I','F'+128
  241.     DB    'RESTOR','E'+128
  242.     DB    'GOSU','B'+128
  243.     DB    'RETUR','N'+128
  244.     DB    'RE','M'+128
  245.     DB    'STO','P'+128
  246.     DB    'OU','T'+128
  247.     DB    'O','N'+128
  248.     DB    'NUL','L'+128
  249.     DB    'WAI','T'+128
  250.     DB    'POK','E'+128
  251.     DB    'PRIN','T'+128
  252.     DB    'DE','F'+128
  253.     DB    'CON','T'+128
  254.     DB    'LIS','T'+128
  255.     DB    'CLEA','R'+128
  256.     DB    'DLOA','D'+128
  257.     DB    'DSAV','E'+128
  258.     DB    'NE','W'+128
  259.     DB    'TAB','('+128
  260.     DB    'T','O'+128
  261.     DB    'SPC','('+128
  262.     DB    'F','N'+128
  263.     DB    'THE','N'+128
  264.     DB    'NO','T'+128
  265.     DB    'STE','P'+128
  266.     DB    '+'+128
  267.     DB    '-'+128
  268.     DB    '*'+128
  269.     DB    '/'+128
  270.     DB    '^'+128
  271.     DB    'AN','D'+128
  272.     DB    'O','R'+128
  273.     DB    '>'+128
  274.     DB    '='+128
  275.     DB    '<'+128
  276.     DB    'SG','N'+128
  277.     DB    'IN','T'+128
  278.     DB    'AB','S'+128
  279.     DB    'US','R'+128
  280.     DB    'FR','E'+128
  281.     DB    'IN','P'+128
  282.     DB    'PO','S'+128
  283.     DB    'SQ','R'+128
  284.     DB    'RN','D'+128
  285.     DB    'LO','G'+128
  286.     DB    'EX','P'+128
  287.     DB    'CO','S'+128
  288.     DB    'SI','N'+128
  289.     DB    'TA','N'+128
  290.     DB    'AT','N'+128
  291.     DB    'PEE','K'+128
  292.     DB    'LE','N'+128
  293.     DB    'STR','$'+128
  294.     DB    'VA','L'+128
  295.     DB    'AS','C'+128
  296.     DB    'CHR','$'+128
  297.     DB    'LEFT','$'+128
  298.     DB    'RIGHT','$'+128
  299.     DB    'MID','$'+128 
  300.     DB    0    ;END OF TABLE
  301. ZSFLG    DB    0    ;ZERO SUPPRESS FLAG
  302. BUFF    EQU    $    ;READ PROGRAM IN HERE
  303.     END    100H
  304.