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 / CPMUG008.ARK / MAC4.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  465 lines

  1.     TITLE    MACADPT
  2. ;
  3. ; VERSION 1.2   11 APR 77
  4. ; VERSION 1.3   20 SEP 77
  5. ; VERSION 1.4   17 OCT 77
  6. ;
  7. ; BY JEFFREY W. SHOOK
  8. ; PO BOX 185
  9. ; ROCKY POINT, NY 11778
  10. ;
  11. ; THIS PROGRAM ADAPTS THE TDL MACROASSEMBLER
  12. ; TO WORK UNDER CP/M.
  13. ;
  14. ;***********************************;
  15. ;         CP/M STANDARD EQUATES     ;
  16. ;***********************************;
  17.  
  18. BOOT    EQU    0000H    ;WARM START ADDRESS
  19. TFCB    EQU    005CH    ;DEFAULT FCB ADDRESS
  20. TBUF    EQU    0080H    ;DEFAULT BUFFER ADDRESS
  21. TBASE    EQU    0100H    ;TRANSIENT PROGRAM BASE
  22. CBASE    EQU    2900H    ;CCP BASE ADDRESS
  23. BDOS    EQU    0005H    ;BDOS ENTRY POINT
  24. CONIN    EQU    03E09H    ;CONSOLE INPUT SUBROUTINE
  25. CONOUT    EQU    03E0CH    ;CONSOLE OUTPUT ROUTINE
  26.  
  27. ;***********************************;
  28. ;       CP/M FUNCTION CODES         ;
  29. ;***********************************;
  30.  
  31. SRSET    EQU    00    ;SYSTEM RESET
  32. RCON    EQU    01    ;READ CONSOLE
  33. WCON    EQU    02    ;WRITE CONSOLE
  34. RRDR    EQU    03    ;READ READER
  35. WPUN    EQU    04    ;WRITE PUNCH
  36. WLST    EQU    05    ;WRITE LIST
  37. ISTAT    EQU    07    ;GET IOSTATUS
  38. SSTAT    EQU    08    ;SET IOSTATUS
  39. WCONB    EQU    09    ;WRITE CONSOLE BUFFER
  40. RCONB    EQU    10    ;READ CONSOLE BUFFER
  41. CSTAT    EQU    11    ;CHECK CONSOLE STATUS
  42. LHEAD    EQU    12    ;LIFT DISK HEAD
  43. RSDSK    EQU    13    ;RESET DISK SYSTEM
  44. SDISK    EQU    14    ;SELECT DISK
  45. OPEN    EQU    15    ;OPEN FILE
  46. CLOSE    EQU    16    ;CLOSE FILE
  47. SFRST    EQU    17    ;SEARCH FIRST
  48. SNEXT    EQU    18    ;SEARCH NEXT
  49. FDELT    EQU    19    ;DELETE FILE
  50. READ    EQU    20    ;READ RECORD
  51. WRITE    EQU    21    ;WRITE RECORD
  52. CREATE    EQU    22    ;CREATE FILE
  53. RENAM    EQU    23    ;RENAME FILE
  54. LOGIN    EQU    24    ;GET LOGIN
  55. IDISK    EQU    25    ;GET DISK NUMBER
  56. SDMA    EQU    26    ;SET DMA VECTOR
  57. IALLOC    EQU    27    ;GET ALLOCATION VECTOR
  58. ;
  59. ;
  60. EOF:    EQU    1AH    ; CP/M END OF FILE CHAR
  61. ;
  62. ;
  63.     ORG    100H    ; LET CP/M FIND US
  64.     JMP    MACAD
  65. ;
  66. ;
  67. ; TRANSIENT PROGRAM STORAGE
  68. ; DEFINITIONS
  69. ;
  70. ;
  71. ;
  72. CSTSF:    DS    1    ; CONSOLE STATUS FLAG
  73. PASSP:    DS    2    ; PASS TABLE POINTER
  74. SRCPTR:    DS    2    ; SOURCE BUFFER POINTER
  75. LSTPTR:    DS    2    ; LISTING BUFFER POINTER
  76. HEXPTR:    DS    2    ; HEX OBJECT FILE POINTER
  77. SRCFCB:    DS    36    ; SOURCE FILE CONTROL BLOCK
  78. SRCBUF:    DS    128    ; SOURCE FILE BUFFER
  79. LSTFCB:    DS    36    ; LISTING FILE CONTROL BLOCK
  80. LSTBUF:    DS    128    ; LISTING FILE BUFFER
  81. HEXFCB:    DS    36    ; OBJECT FILE CONTROL BLOCK
  82. HEXBUF:    DS    128    ; OBJECT FILE BUFFER
  83. ;
  84. ;
  85. ;
  86. ;
  87. MACAD:    LXI    SP,MACRX+16EH    ; SET TEMP STACK
  88.     LXI    H,AZM    ; INSERT FILETYPE
  89.     LXI    D,TFCB+9
  90.     LXI    B,3    ; IN TRANSIENT FCB
  91.     CALL    LDIR    ; MOVE FILETYPE
  92.     LXI    D,TFCB; CHECK DIRECTORY
  93.     MVI    C,SFRST    ; TO SEE IF FILE EXISTS
  94.     CALL    BDOS
  95.     CPI    0FFH
  96.     CZ    ERROR
  97.     LXI    H,TFCB    ; MOVE FILE NAME TO SRCFCB
  98.     LXI    D,SRCFCB
  99.     LXI    B,12
  100.     CALL    LDIR    ; MOVE BLOCK
  101.     MVI    C,OPEN    ; OPEN SOURCE FILE
  102.     LXI    D,SRCFCB
  103.     CALL    BDOS
  104.     CPI    0FFH
  105.     CZ    ERROR
  106.     LXI    D,LSTFCB; CREATE LISTING FILE
  107.     LXI    B,PRN
  108.     CALL    MAKEF
  109.     LXI    D,HEXFCB; CREATE OBJECT FILE
  110.     LXI    B,HXR
  111.     CALL    MAKEF
  112.     LXI    H,PASST    ; INITIALZE PASS COUNT
  113.     SHLD    PASSP
  114.     LXI    H,LSTBUF; INITALIZE LISTING POINTER
  115.     SHLD    LSTPTR
  116.     LXI    H,HEXBUF; INITIALIZE HEX POINTER
  117.     SHLD     HEXPTR
  118.     MVI    A,0    ; INITIALIZE CONSOLE STATUS FLAG
  119.     STA    CSTSF
  120.     JMP    MACRX    ; GO ASSEMBLE
  121. ;
  122. ; TABLE OF FILETYPES
  123. ;
  124. AZM:    DB 'AZM'
  125. PRN:    DB 'PRN'
  126. HXR:    DB 'HXR'
  127. ;
  128. ;
  129. ; END OF ASSEMBLY
  130. ;
  131. TRPSIM:    MVI    C,EOF    ; EMPTY LIST BUFFER
  132.     CALL    LOSIM
  133.     JNC    TRPSIM
  134. TRPS1:    CALL    POSIM    ; EMPTY HEX BUFFER
  135.     JNC    TRPS1
  136. CLOSAL: MVI    C,CLOSE    ; CLOSE ALL FILES
  137.      LXI    D,LSTFCB
  138.     CALL    BDOS
  139.     MVI    C,CLOSE
  140.     LXI    D,HEXFCB
  141.     CALL    BDOS
  142.     JMP    BOOT
  143. ;
  144. ;
  145. ;
  146. ; SIMULATE CONSOLE INPUT FOR PASS
  147. ; CONTROL OF ASSEMBLER.
  148. ; PASS 1 = SYMBOL TABLE
  149. ; PASS 2 = LISTING
  150. ; PASS 3 = HEX OBJECT FILE
  151. ;
  152. CISIM:    PUSH    H    ; SAVE ASSEMBLER REGISTERS
  153.     PUSH    D
  154.     PUSH    B
  155.     MVI    A,0    ; SET NEXT RECORD POINTER TO ZERO
  156.     STA    SRCFCB+32
  157.     STA    CSTSF    ; CLEAR CONSOLE STATUS FLAG
  158.     LXI    H,SRCBUF+128
  159.     SHLD    SRCPTR    ; SET SRC PTR TO END OF BUFFER
  160.     POP    B    ; RESTORE ASM REGISTERS
  161.     POP    D
  162.     LHLD    PASSP    ; LOAD POINTER TO PASS #
  163.     MOV    A,M    ; GET PASS
  164.     INX    H
  165.     SHLD    PASSP
  166.     POP    H
  167.     RET
  168. ;
  169. ;
  170. ; TABLE OF PASS NUMBERS
  171. ;
  172. PASST:    DB '1230'
  173. ;
  174. ; CHARACTER INPUT SUBROUTINE
  175. ;
  176. ; CREATE A SOURCE BUFFER AND LOAD
  177. ; IT FROM THE DISK. AT EACH CALL
  178. ; SUPPLY ONE CHARCTER IN A REG.
  179. ; IF BUFFER EMPTY, CALL BDOS TO
  180. ; FILL IT. SET CARRY IF EOF IS
  181. ; FOUND IN FILE.
  182. ;
  183. RISIM:    PUSH    H    ; SAVE ASSM HL,DE
  184.     PUSH    D
  185.     LXI    D,SRCFCB; GET FCB ADDRESS
  186.     LHLD    SRCPTR    ; GET BUFFER POINTER
  187.     CALL    BUFIN    ; READ A BYTE
  188.     SHLD    SRCPTR    ; SAVE BUFFER POINTER
  189.     POP    D    ; RESTORE HL,DE
  190.     POP    H
  191.     CPI    EOF    ; CHECK FOR EOF CHAR
  192.     STC        ; SET EOF FLAG IN CARRY
  193.     RZ
  194.     CMC        ; NOT EOF, ERASE MARK
  195.     RET
  196. ;
  197. ; LIST CHARACTER OUTPUT
  198. ;
  199. ; CREATE AN OUTPUT BUFFER AND
  200. ; PUT EACH CHAR IN UNTIL FULL.
  201. ; THEN WRITE CONTENTS TO DISK
  202. ; FILE AND RESET POINTER.
  203. ;
  204. LOSIM:    PUSH    D
  205.     PUSH    H
  206.     LHLD    LSTPTR
  207.     LXI    D,LSTFCB
  208.     CALL    BUFOUT
  209.     SHLD    LSTPTR
  210.     POP    H
  211.     POP    D
  212.     MOV    A,C
  213.     RET
  214. ;
  215. ;
  216. ; PUNCH CHARACTER OUTPUT
  217. ;
  218. ; SIMILAR TO LIST OUTPUT
  219. ;
  220. POSIM:    PUSH    D
  221.     PUSH    H
  222.     LHLD    HEXPTR
  223.     LXI    D,HEXFCB
  224.     CALL    BUFOUT
  225.     SHLD    HEXPTR
  226.     POP    H
  227.     POP    D
  228.     MOV    A,C
  229.     RET
  230. ;
  231. ;
  232. ; SOURCE BUFFER CONTROL
  233. ;
  234. ; REFILL BUFFER IF EMPTY, PUT NEXT CHARACTER IN A
  235. ;
  236. ; ENTER WITH FCB ADDRESS IN DE, BUFFER POINTER IN HL
  237. ; SAVES BC, RETURNS WITH CHAR IN A, BUFFER POINTER IN HL
  238. ;
  239. BUFIN:    MOV    A,E    ; COMPUTE END OF BUFFER
  240.     ADI    SRCBUF+128-SRCFCB
  241.     CMP    L
  242.     JNZ    SRCB1
  243.     PUSH    B
  244.     MVI    C,READ
  245.     CALL    REFILL
  246.     ANI    0FEH    ; CHECK FOR GOOD READ
  247.     CPI    0
  248.     POP    B
  249.     CNZ    ERROR
  250. SRCB1:    MOV    A,M
  251.     INX    H
  252.     RET
  253. ;
  254. ;
  255. ; OUTPUT BUFFER CONTROL
  256. ;
  257. ; IF BUFFER FULL, WRITE CONTENTS TO DISK,
  258. ; PUT CHAR FROM C IN BUFFER.
  259. ;
  260. ; ENTER WITH FCB ADDR IN DE, BUFFER PTR IN HL,
  261. ; AND CHAR IN C.
  262. ; RETURN WITH BUFFER PTR IN HL,SAVE BC,SET CARRY AFTER
  263. ; BUFFER REFILL.
  264. ;
  265. BUFOUT:    MOV    A,E    ; COMPUTE END OF BUFFER
  266.     ADI    164
  267.     CMP    L    ; FULL?
  268.     STC        ; CLEAR CARRY
  269.     CMC
  270.     JNZ    BUFOU1    ; NOT FULL, STORE CHAR
  271.     PUSH    B    ; FULL, SAVE CHAR
  272.     MVI    C,WRITE
  273.     CALL    REFILL
  274.     CPI    0    ; GOOD WRITE?
  275.     POP    B
  276.     CNZ    ERROR
  277.     STC        ; MARK REFILL
  278. BUFOU1:    MOV    M,C    ; STORE CHAR IN BUFFER
  279.     INX    H    ; MOVE PTR TO NEXT CHAR
  280.     RET
  281. ;
  282. ;
  283. ; BUFFER I/O ROUTINE
  284. ;
  285. ; ENTER WITH CP/M READ OR WRITE CODE
  286. ; IN BC AND FCB ADDRESS IN DE.
  287. ; RETURN WITH INITIALIZED BUFFER
  288. ; POINTER IN HL.
  289. ;
  290. REFILL:    LXI    H,36    ; CALC START OF BUFFER
  291.     DAD    D
  292.     PUSH    H    ; SAVE START OF BUFFER
  293.     PUSH    D    ; SAVE FCB ADDRESS
  294.     XCHG
  295.     PUSH    B    ; SAVE CP/M CODE
  296.     MVI    C,SDMA
  297.     CALL    BDOS    ; SET DMA ADDRESS
  298.     POP    B    ; GET CP/M CODE
  299.     POP    D    ; GET FCB ADDRESS
  300.     CALL    BDOS    ; READ OR WRITE BUFFER
  301.     POP    H    ; SET PTR TO START OF BUFFER
  302.     RET
  303. ;
  304. ;
  305. ; CREATE AND OPEN A FILE WITH SAME NAME AS DEFAULT FCB
  306. ;
  307. ; ENTER WITH ADDRESS OF FCB IN DE, AND
  308. ; ADDRESS OF FILETYPE STRING IN BC.
  309. ;
  310. MAKEF:    LXI    H,TFCB
  311.     PUSH    D
  312.     PUSH    B
  313.     LXI    B,9
  314.     CALL    LDIR    ; MOVE FILENAME
  315.     POP    H
  316.     LXI    B,3
  317.     CALL    LDIR    ; MOVE FILETYPE
  318.     MVI    C,FDELT
  319.     POP    D
  320.     PUSH    D
  321.     CALL    BDOS    ; DELETE FILE
  322.     MVI    C,CREATE
  323.     POP    D
  324.     PUSH    D
  325.     CALL    BDOS    ; CREATE FILE
  326.     CPI    0FFH
  327.     CZ    ERROR
  328.     MVI    C,OPEN
  329.     POP    D
  330.     PUSH    D
  331.     CALL    BDOS    ; OPEN FILE
  332.     CPI    0FFH
  333.     CZ    ERROR
  334.     POP    D    ; SET NEXT RECORD PTR IN FCB TO ZERO
  335.     LXI    H,33
  336.     DAD    D
  337.     MVI    M,0
  338.     RET
  339. ;
  340. ;
  341. ; BLOCK MOVE (Z-80 LDIR INST)
  342. ;
  343. LDIR:    MOV    A,M
  344.     STAX    D
  345.     INX    H
  346.     INX    D
  347.     DCX    B
  348.     XRA    A
  349.     CMP    C
  350.     JNZ    LDIR
  351.     CMP    B
  352.     JNZ    LDIR
  353.     RET
  354. ;
  355. ; MEMORY SIZE TEST
  356. ;
  357. MEMSIM:    PUSH    H
  358.     LHLD    BDOS+1
  359.     MOV    A,L
  360.     MOV    B,H
  361.     POP    H
  362.     RET
  363. ;
  364. ;
  365. ; CONSOLE STATUS CHECK
  366.  
  367. CSTSIM:    LDA    CSTSF    ; CHECK CONSOLE STATUS
  368.     RET
  369.  
  370. ; IOCHECK
  371. ;
  372. IOSIM:    MVI    A,0A8H
  373.     RET
  374. ;
  375. ;
  376. ; ERROR HANDLER
  377. ;
  378. ERROR:    PUSH    PSW
  379.     LXI    D,ERRMES
  380.     MVI    C,WCONB
  381.     CALL    BDOS    ; WRITE ERROR MESS
  382.     POP    PSW
  383.     POP    H    ; GET ADDRESS OF CALLER
  384.     PUSH    PSW
  385.     CALL    OUTHHL    ; GOTO CP/M AND PRINT IT
  386.     MVI    C,'.'
  387.     CALL    CO
  388.     POP    PSW
  389.     CALL    OUT2H    ; PRINT ERROR TYPE
  390.     JMP    CLOSAL    ; CLEAN UP THE MESS
  391. ;
  392. ERRMES:    DB 'MACROASSEMBLER ERROR $'
  393. ;
  394. ;++++++++++++++++++++++++++++++++++++++++++++++
  395. ;
  396. ; HEXIDECIMAL REGISTER OUTPUT
  397. ;
  398. ; HEXOUT.LIB  -  VERSION 0.2  -  12 SEP 77
  399. ;
  400. ;++++++++++++++++++++++++++++++++++++++++++++++
  401.  
  402. ; FUNCTIONS AVAILABLE:
  403. ;
  404. ;    OUT2H    PRINT 2 HEX DIGITS FROM A
  405. ;    OUTHHL    PRINT HL
  406.  
  407. OUTHHL:    MOV    A,H    ; PRINT HL
  408.     CALL    OUT2H
  409.     MOV    A,L
  410.  
  411. OUT2H:    PUSH    PSW
  412.     CALL    OUTHL
  413.     POP    PSW
  414.     JMP    OUTHR
  415.  
  416. OUTHL:    RRC
  417.     RRC
  418.     RRC
  419.     RRC
  420. OUTHR:    ANI    0FH
  421.     ADI    '0'
  422.     CPI    '9'+1
  423.     JC    OUTHR1
  424.     ADI    '@'-'9'
  425. OUTHR1:    JMP    OUTCH
  426.  
  427. CO:    MOV    A,C    ; CHECK FOR PASS REQUEST
  428.     CPI    '='
  429.     JNZ    CO1
  430.     MVI    A,0FFH    ; SET CONSOLE STATUS
  431.     STA    CSTSF
  432. CO1:    MOV    A,C    ; SIMULATE TDL CO
  433. OUTCH:    PUSH    PSW    ; CONSOLE OUTPUT
  434.     PUSH    B
  435.     PUSH    D
  436.     PUSH    H
  437.     MVI    C,WCON
  438.     MOV    E,A
  439.     CALL    BDOS
  440.     POP    H
  441.     POP    D
  442.     POP    B
  443.     POP    PSW
  444.     RET
  445.  
  446.  
  447. ; NEW MACROASSEMBLER I/O VECTOR TABLE
  448. ; TO OVERWRITE PRESENT ASSEMBLER VECTOR TABLE
  449.  
  450.     ORG    0800H
  451.  
  452. MACRX:    DS    6
  453.     JMP    CISIM
  454.     JMP    RISIM
  455.     JMP    CO
  456.     JMP    POSIM
  457.     JMP    LOSIM
  458.     JMP    CSTSIM
  459.     JMP    IOSIM
  460.     JMP    MEMSIM
  461.     JMP    TRPSIM
  462.  
  463.     END
  464.