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 / SLOAD.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  4KB  |  231 lines

  1. ;TARBELL SOURCE LOAD
  2. ;COMPATIBLE WITH CCOS
  3. ;
  4. ;DELETES LINE NUMBERS, CHANGES SPACES TO TABS,
  5. ;ATTEMPTS TO INSERT ';' BEFORE OPERAND COMMENTS
  6.     ORG    100H    ;TO TPA
  7. FCB    EQU    5CH
  8. TFCB    EQU    FCB+16    ;TEMP FCB FOR RENAME
  9. TAB    EQU    9    ;ASCII TAB
  10. CURS    EQU    3FFEH    ;VDM CURSOR
  11.     LXI    SP,STACK ;GET PRIVATE STACK
  12. ;IF FILE EXISTS, RENAME IT TO 'NAME.BAK'
  13.     LXI    D,FCB
  14.     MVI    C,SRCHF ;FIND IN DIRECTORY
  15.     CALL    BDOS
  16.     INR    A    ;FF=>NOT FOUND
  17.     JZ    NEWF    ;NEW FILE
  18. ;FILE ALREADY EXISTS - ERASE BACKUP COPY
  19.     LXI    H,FCB    ;POINT TO FCB
  20.     LXI    D,TFCB    ;POINT TO TEMP FCB
  21.     MVI    B,16    ;GET MOVE LENGTH
  22.     CALL    MOVE    ;MOVE IT
  23.     LXI    H,BAK    ;POINT TO 'BAK'
  24.     LXI    D,TFCB+9
  25.     MVI    B,3    ;MOVE LENGTH
  26.     CALL    MOVE
  27. ;ERASE BACKUP FILE
  28.     LXI    D,TFCB
  29.     MVI    C,DELT
  30.     CALL    BDOS    ;DELETE BACKUP
  31. ;RENAME CURRENT NAME TO NAME.BAK
  32.     LXI    D,FCB
  33.     MVI    C,REN
  34.     CALL    BDOS    ;RENAME
  35. ;MAKE NEW FILE
  36. NEWF    LXI    D,FCB
  37.     MVI    C,MAKE
  38.     CALL    BDOS
  39.     INR    A    ;ROOM IN DIRECTORY?
  40.     JNZ    NEWOK    ;YES
  41. ;NO ROOM IN DIRECTORY
  42.     LXI    D,NORMG
  43. ERXIT    MVI    C,09
  44.     CALL    BDOS    ;PRINT ERROR MESSAGE
  45.     JMP    0    ;--EXIT--
  46. NORMG    DB    'NO ROOM IN DIRECTORY$'
  47. READY    DB    'TURN ON TAPE $'
  48. BAK    DB    'BAK'
  49. ;NEW FILE MAKE WAS OK
  50. ;TYPE 'READY' MESSAGE
  51. NEWOK    LXI    D,READY
  52.     MVI    C,9
  53.     CALL    BDOS
  54. ;TYPE NAME ON SCREEN
  55.     LHLD    CURS    ;GET CURSOR
  56.     MVI    B,5    ;FILE NAME LENGTH
  57.     MVI    A,10H    ;TARBELL RESET
  58.     OUT    6EH    ;RESET
  59. NAME    CALL    TBIN
  60.     MOV    M,A
  61.     INX    H
  62.     DCR    B    ;NAME PRINTED?
  63.     JNZ    NAME
  64.     SHLD    CURS
  65. ;READ THE TARBELL FILE
  66.     LXI    H,BUFF    ;POINT TO END OF PROGRAM
  67. ;READ A LINE FROM TARBELL
  68. LINE    CALL    TBIN    ;READ LINE LENGTH
  69.     DCR    A    ;IS IS EOF?
  70.     JZ    EOF    ;YES
  71. ;SKIP LINE NO
  72.     MVI    B,5    ;NNNN' '
  73. SKIP1    CALL    TBIN
  74.     DCR    B
  75.     JNZ    SKIP1
  76. ;READ LABEL, OR BLANK
  77. RDLB    CALL    TBIN
  78.     CPI    '*'
  79.     JZ    COMM    ;READ COMMENT IN AS IS
  80.     CPI    ' '    ;UNLABELED STMT?
  81.     JZ    NOLAB
  82.     CPI    13    ;END OF LINE?
  83.     JZ    EOL
  84. ;MOVE LABEL
  85. MVLB    MOV    M,A
  86.     CALL    CHECK
  87.     JMP    RDLB    ;LOOP READING LABEL
  88. ;NO LABEL, OR END OF LABEL
  89. NOLAB    MVI    M,TAB    ;STORE TAB CHAR
  90.     CALL    CHECK    ;POINT TO OP CODE
  91. ;READ OP CODE
  92. RDOP    CALL    TBIN
  93.     CPI    ' '
  94.     JZ    ENDOP
  95.     CPI    13
  96.     JZ    EOL    ;END OF LINE
  97.     MOV    M,A    ;STORE OP CODE CHAR
  98.     CALL    CHECK
  99.     JMP    RDOP    ;CONTINUE READING OP CODE
  100. ;END OF OP CODE
  101. ENDOP    MVI    M,TAB    ;INSERT TAB
  102.     CALL    CHECK
  103. ;MOVE OPERAND
  104. MVOPE    CALL    TBIN
  105.     CPI    ' '    ;END OF OPERAND?
  106.     JZ    BUFFE    ;YES
  107.     CPI    13    ;END OF LINE?
  108.     JZ    EOL    ;YES
  109.     MOV    M,A
  110.     CALL    CHECK
  111.     JMP    MVOPE
  112. ;END OF OPERAND
  113. BUFFE    MVI    M,TAB    ;TAB TO COMMENTS
  114.     CALL    CHECK
  115.     MVI    A,';'    ;OPERAND COMMENT
  116. ;MOVE COMMENTS
  117. COMM    MOV    M,A    ;STORE '*' OR ';'
  118.     CALL    CHECK
  119.     CALL    TBIN
  120.     CPI    13
  121.     JNZ    COMM
  122. ;STORE CR/LF FOR END OF LINE
  123. EOL    MVI    M,13
  124.     CALL    CHECK
  125.     MVI    M,10    ;LINEFEED
  126.     CALL    CHECK
  127.     JMP    LINE    ;READ NEXT LINE
  128. ;EOF REACHED
  129. EOF    MVI    M,'Z'-40H ;EOF CHAR
  130. ;OPEN FILE
  131.     LXI    D,FCB
  132.     MVI    C,OPEN
  133.     CALL    BDOS
  134.     INR    A
  135.     JZ    OPERR
  136. ;WRITE THE FILE
  137. WRLP    LXI    D,80H    ;POINT TO FILE BUFFER
  138.     LHLD    BUFAD    ;POINT TO BUFFER
  139.     MVI    B,80H    ;MAX MOVE LENGTH
  140. WMOVE    MOV    A,M    ;GET CHAR
  141.     STAX    D    ;STORE IT
  142.     INX    H
  143.     INX    D
  144.     CPI    'Z'-40H ;EOF?
  145.     JZ    FINAL    ;YES, FINAL WRITE
  146.     DCR    B    ;128 MOVED?
  147.     JNZ    WMOVE
  148.     CALL    WRSEC    ;WRITE THE RECORD
  149.     LHLD    BUFAD    ;GET BUFFER ADDRESS
  150.     LXI    D,128    ;GET BUFFER LENGTH
  151.     DAD    D    ;CALC NEW ADDR
  152.     SHLD    BUFAD    ;SAVE BUFFER ADDR
  153.     JMP    WRLP
  154. ;WRITE FINAL BLOCK
  155. FINAL    CALL    WRSEC
  156.     LXI    D,FCB
  157.     MVI    C,CLOSE
  158.     CALL    BDOS    ;CLOSE THE FILE
  159.     INR    A    ;OK?
  160.     JZ    CLSER
  161.     LXI    D,OKMSG
  162.     JMP    ERXIT
  163. OKMSG    DB    'DONE$'
  164. CLSER    LXI    D,CLSERM
  165.     JMP    ERXIT
  166. CLSERM    DB    'CLOSE ERR$'
  167. ;WRITE A RECORD
  168. WRSEC    LXI    D,FCB
  169.     MVI    C,WRITE
  170.     CALL    BDOS
  171.     ORA    A    ;WROTE OK?
  172.     RZ
  173. ;WRITE ERROR
  174.     LXI    D,WERMG
  175.     JMP    ERXIT
  176. WERMG    DB    'WRITE ERR$'
  177. ;OPEN ERROR
  178. OPERR    LXI    D,OPERM
  179.     JMP    ERXIT
  180. OPERM    DB    'OPEN ERR$'
  181. ;MOVE CHAR ROUTINE, HL TO DE, LENGTH IN B
  182. MOVE    MOV    A,M
  183.     STAX    D
  184.     INX    H
  185.     INX    D
  186.     DCR    B
  187.     JNZ    MOVE
  188.     RET
  189. ;ROUTINE TO INX H AND CHECK MEMORY OVERALY
  190. CHECK    INX    H
  191.     LDA    7    ;GET BDOS PAGE ADDR
  192.     CMP    H    ;CHECK
  193.     RNC        ;RET IF OK
  194.     LDA    6    ;GET BDOS PAGE DISPL
  195.     CMP    L
  196.     RNC
  197. ;MEMORY OVERLAY
  198.     LXI    D,NOSTG
  199.     JMP    ERXIT
  200. NOSTG    DB    'FILE WON''T FIT IN MEMORY$'
  201. ;TARBELL INPUT ROUTINE
  202. TBIN    IN    6EH
  203.     ANI    10H
  204.     JNZ    TBIN
  205.     IN    6FH
  206.     RET
  207. ;
  208.     DS    30    ;STACK AREA
  209. STACK    DS    2
  210. BUFAD    DW    BUFF
  211. BUFF    EQU    $    ;READ PROGRAM INTO HERE
  212. ;
  213. ; BDOS EQUATES (VERSION 2)
  214. ;
  215. RDCON    EQU    1
  216. WRCON    EQU    2
  217. PRINT    EQU    9
  218. OPEN    EQU    15    ;0FFH=NOT FOUND
  219. CLOSE    EQU    16    ;   "    "
  220. SRCHF    EQU    17    ;   "    "
  221. SRCHN    EQU    18    ;   "    "
  222. DELT    EQU    19    ;NO RET CODE
  223. READ    EQU    20    ;0=OK, 1=EOF
  224. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  225. MAKE    EQU    22    ;0FFH=BAD
  226. REN    EQU    23    ;0FFH=BAD
  227. STDMA    EQU    26
  228. BDOS    EQU    5
  229. REIPL    EQU    0
  230.     END    100H
  231.