home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / disasm / dasm48.arc / DASM48.ASM < prev    next >
Assembly Source File  |  1986-07-22  |  30KB  |  1,048 lines

  1.     .XALL
  2.     PAGE    ,132
  3.     TITLE DASM48 - 14 SEP 1985
  4.  
  5. ; ****************************************************************
  6. ; **                                **
  7. ; **            MS-DOS 8048 DISASSEMBLER            **
  8. ; **                                **
  9. ; **............................................................**
  10. ; **                                **
  11. ; **         DASM48 DISASSEMBLES 8048 INTEL HEX FILES.        **
  12. ; **                                **
  13. ; ****************************************************************
  14.  
  15. ; ..... MODULE CONNECTION POINTS .....
  16.  
  17.     EXTRN    MNEM:NEAR    ; MNEMONIC TABLE
  18.     EXTRN    BYTES:NEAR    ; BYTES TABLE
  19.  
  20. ; ..... MACROS .....
  21.  
  22. DISKRD    MACRO    NUMBYTE        ; READ SPECIFIED NUMBER OF BYTES FROM DISK
  23.     LOCAL    OK        ; OK IS A LOCAL SYMBOL
  24.     MOV    AH,READ        ; LOAD READ COMMAND
  25.     MOV    BX,RDHAND    ; LOAD READ FILE HANDLE
  26.     MOV    CX,NUMBYTE    ; LOAD NUMBER OF CHARACTERS TO BE READ
  27.     MOV    DX,OFFSET DSKBUF; POINT TO DISK BUFFER
  28.     INT    DOSFUNC        ; READ FROM INPUT FILE - ERROR?
  29.     JNC    OK        ; NO - DONE
  30.  
  31.     JMP    DSKERR        ; YES - DISPLAY ERROR
  32.  
  33. OK:
  34.     ENDM            ;
  35.  
  36. DISKWR    MACRO    NUMBYTE        ; WRITE SPECIFIED NUMBER OF BYTES TO DISK
  37.     LOCAL    OK        ; OK IS A LOCAL SYMBOL
  38.     MOV    AH,WRITE     ; LOAD WRITE COMMAND
  39.     MOV    BX,WRHAND    ; LOAD WRITE FILE HANDLE
  40.     MOV    CX,NUMBYTE    ; LOAD NUMBER OF CHARACTERS TO WRITE
  41.     MOV    DX,OFFSET DSKBUF; POINT TO DISK BUFFER
  42.     INT    DOSFUNC        ; WRITE TO OUTPUT - ERROR?
  43.     JNC    OK        ; NO - DONE
  44.  
  45.     JMP    DSKERR        ; YES - DISPLAY ERROR
  46.  
  47. OK:
  48.     ENDM            ;
  49.     PAGE
  50. ; ..... DOS COMMANDS .....
  51.  
  52. DOSFUNC EQU    21H        ; DOS FUNCTION INTERRUPT
  53. PR_STR    EQU    09H        ; DOS FUNCTION PRINT STRING COMMAND
  54. CREATE    EQU    3CH        ; CREATE FILE COMMAND
  55. OPEN    EQU    3DH        ; OPEN FILE COMMAND
  56. CLOSE    EQU    3EH        ; CLOSE FILE COMMAND
  57. READ    EQU    3FH        ; READ FILE COMMAND
  58. WRITE    EQU    40H        ; WRITE FILE COMMAND
  59. RDACC    EQU    0        ; READ FILE ACCESS CODE
  60. WRACC    EQU    1        ; WRITE FILE ACCESS CODE
  61. WRATT    EQU    0        ; WRITE FILE ATTRIBUTE CODE
  62.  
  63.  
  64.  
  65. ; ..... CONSTANTS .....
  66.  
  67. MEMLEN    EQU    2000H        ; LENGTH OF MEMORY BUFFER
  68. MAXLEN    EQU    80        ; MAXIMUM FILE NAME LENGTH
  69. CR    EQU    0DH        ; ASCII <CR>
  70. LF    EQU    0AH        ; ASCII LINE FEED
  71. RS    EQU    1EH        ; ASCII RECORD SEPARATOR
  72. TAB    EQU    09H        ; ASCII TAB
  73. DATIND    EQU    00H        ; HEX FILE DATA RECORD INDICATOR
  74. EOFIND    EQU    01H        ; HEX FILE END OF FILE INDICATOR
  75.     PAGE
  76. STACK    SEGMENT STACK        ; STACK SEGMENT
  77.     DW    1024 DUP (?)    ; 1024 LEVELS OF STACK
  78. STACK    ENDS
  79.  
  80. DATA    SEGMENT PUBLIC        ; DATA SEGMENT
  81.  
  82. ; ****************************************************************
  83. ; **                                **
  84. ; **            MISCELLANEOUS STRINGS            **
  85. ; **                                **
  86. ; ****************************************************************
  87.  
  88. MSGORG    DB    ';',CR,LF,TAB,'ORG',TAB,'0'
  89. LENORG    EQU    $-MSGORG
  90.  
  91. MSGEND    DB    ';',CR,LF,TAB,'END',CR,LF
  92. LENEND    EQU    $-MSGEND
  93.  
  94.  
  95. ; ****************************************************************
  96. ; **                                **
  97. ; **              ERROR STRINGS             **
  98. ; **                                **
  99. ; ****************************************************************
  100.  
  101. MBCOM    DB    CR,LF,'COMMAND LINE ERROR',CR,LF,LF,'$'
  102.  
  103. MBHEX    DB    CR,LF,'BAD HEX DATA',CR,LF,LF,'$'
  104.  
  105. MDISK0    DB    CR,LF,'ERROR 0 - DISK FULL',CR,LF,LF,'$'
  106.  
  107. MDISK1    DB    CR,LF,'ERROR 1 - INVALID FUNCTION',CR,LF,LF,'$'
  108.  
  109. MDISK2    DB    CR,LF,'ERROR 2 - FILE NOT FOUND',CR,LF,LF,'$'
  110.  
  111. MDISK3    DB    CR,LF,'ERROR 3 - PATH NOT FOUND',CR,LF,LF,'$'
  112.  
  113. MDISK4    DB    CR,LF,'ERROR 4 - TOO MANY OPEN FILES',CR,LF,LF,'$'
  114.  
  115. MDISK5    DB    CR,LF,'ERROR 5 - ACCESS DENIED',CR,LF,LF,'$'
  116.  
  117. MDISK6    DB    CR,LF,'ERROR 6 - INVALID FILE HANDLE',CR,LF,LF,'$'
  118.  
  119. MUKNOW    DB    CR,LF,'UNKNOWN DISK ERROR',CR,LF,LF,'$'
  120.     PAGE
  121. ; ****************************************************************
  122. ; **                                **
  123. ; **            PROGRESS MESSAGE STRINGS            **
  124. ; **                                **
  125. ; ****************************************************************
  126.  
  127. MRCOM    DB    CR,LF,'READING COMMAND LINE',CR,LF,'$'
  128.  
  129. MOPENR    DB    'OPENING READ FILE',CR,LF,'$'
  130.  
  131. MCHEX    DB    'CONVERTING HEX FILE',CR,LF,'$'
  132.  
  133. MOPENW    DB    'CLOSING READ AND OPENING WRITE FILE',CR,LF,'$'
  134.  
  135. MDISS    DB    'DISASSEMBLING CONVERTED DATA',CR,LF,'$'
  136.  
  137. MCLOSW    DB    'CLOSING WRITE FILE',CR,LF,'$'
  138.  
  139. MEXIT    DB    'EXITING TO DOS',CR,LF,LF,'$'
  140.     PAGE
  141. ; ****************************************************************
  142. ; **                                **
  143. ; **            MEMORY ASSIGNMENTS            **
  144. ; **                                **
  145. ; ****************************************************************
  146.  
  147. DSKBUF    DB    80 DUP (?)    ; DISK I/O BUFFER
  148.  
  149. DSKCNT    DW    (?)        ; DISK BUFFER COUNTER
  150.  
  151. RDFILE    DB    MAXLEN+1 DUP (0); INPUT FILE NAME BUFFER
  152.  
  153. WRFILE    DB    MAXLEN+1 DUP (0); OUTPUT FILE NAME BUFFER
  154.  
  155. RDHAND    DW    (?)        ; READ FILE HANDLE
  156.  
  157. WRHAND    DW    (?)        ; WRITE FILE HANDLE
  158.  
  159. CHKACC    DB    (?)        ; CHECKSUM ACCUMULATOR
  160.  
  161. DSKPTR    DW    (?)        ; DISK BUFFER POINTER
  162.  
  163. MEMPTR    DW    (?)        ; MEMORY POINTER
  164.  
  165. MEMCNT    DW    (?)        ; MEMORY COUNTER
  166.  
  167. NUMREC    DW    (?)        ; NUMBER OF RECORDS IN CURRENT LINE
  168.  
  169. RECNUM    DW    (?)        ; NUMBER OF BYTES FOR NUMREC RECORDS
  170.  
  171. CURADD    DW    (?)        ; CURRENT ADDRESS STORAGE
  172.  
  173.     DB    (0)        ; DUMMY START OF MEMBUF
  174. MEMBUF    DB    MEMLEN DUP (0)    ; MEMORY BUFFER
  175. DATA    ENDS
  176.     PAGE
  177. CODE    SEGMENT            ; CODE SEGMENT
  178.     ASSUME    CS:CODE,DS:DATA,ES:DATA,SS:STACK
  179. ; ****************************************************************
  180. ; **                                **
  181. ; **              MAIN PROGRAM                **
  182. ; **                                **
  183. ; ****************************************************************
  184.  
  185. DASM48    PROC    FAR        ;
  186.  
  187.     PUSH    DS        ;
  188.     MOV    AX,0        ;
  189.     PUSH    AX        ; SET UP FOR A FAR RETURN TO DOS
  190.  
  191.     MOV    AX,DATA        ;
  192.     MOV    DS,AX        ; SET UP DATA SEGMENT REGISTER
  193.  
  194.     MOV    DX,OFFSET MRCOM ; POINT TO READING COMMAND LINE MESSAGE
  195.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  196.     CALL    RCMD        ; READ COMMAND LINE
  197.  
  198.     MOV    DX,OFFSET MOPENR; POINT TO OPENING INPUT FILE MESSAGE
  199.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  200.     CALL    OPENRD        ; OPEN INPUT FILE FOR READ
  201.  
  202.     MOV    DX,OFFSET MCHEX ; POINT TO CONVERTING HEX FILE MESSAGE
  203.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  204.     CALL    CHEX        ; CONVERT INPUT FILE
  205.  
  206.     MOV    DX,OFFSET MOPENW; POINT TO OPENING OUTPUT FILE MESSAGE
  207.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  208.     CALL    OPENWR        ; OPEN OUTPUT FILE FOR WRITE
  209.  
  210.     MOV    DX,OFFSET MDISS ; POINT TO DISASSEMBLING MESSAGE
  211.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  212.     CALL    DISS        ; DISASSEMBLE FILE
  213.  
  214.     MOV    DX,OFFSET MCLOSW; POINT TO CLOSING WRITE FILE MESSAGE
  215.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  216.     CALL    CLOSWR        ; DISASSEMBLE FILE
  217.  
  218.     MOV    DX,OFFSET MEXIT ; POINT TO EXITING MESSAGE
  219.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  220.     RET            ; RETURN TO DOS
  221.  
  222. DASM48    ENDP            ;
  223.     PAGE
  224. ; ****************************************************************
  225. ; **                                **
  226. ; **            READ COMMAND LINE            **
  227. ; **                                **
  228. ; ****************************************************************
  229.  
  230. RCMD    PROC    NEAR        ;
  231.  
  232.     MOV    BX,80H        ; POINT TO NUMBER OF RECEIVED CHARACTERS
  233.     MOV    CH,ES:[BX]    ; LOAD NUMBER OF RECEIVED CHARACTERS
  234.     OR    CH,CH        ; ZERO CHARACTERS?
  235.     JZ    RCMD25        ; YES - DISPLAY ERROR
  236.  
  237.     INC    BX        ; NO - POINT TO CHARACTERS
  238.     MOV    DI,OFFSET RDFILE; POINT TO INPUT FILE NAME BUFFER
  239.     MOV    CL,MAXLEN    ; LOAD MAXIMUM FILE NAME LENGTH
  240.  
  241.     MOV    AL,ES:[BX]    ; READ NEXT CHARACTER
  242.     INC    BX        ; ADVANCE POINTER
  243.     DEC    CH        ; RETARD CHARACTER COUNTER - END?
  244.     JZ    RCMD25        ; YES - DISPLAY ERROR
  245.  
  246.     CMP    AL,' '        ; NO - SPACE?
  247.     JNZ    RCMD25        ; NO - DISPLAY ERROR
  248.  
  249. RCMD05:
  250.     MOV    AL,ES:[BX]    ; YES - READ NEXT CHARACTER
  251.     MOV    [DI],AL        ; WRITE TO INPUT FILE NAME BUFFER
  252.     CMP    AL,' '        ; SPACE?
  253.     JZ    RCMD10        ; YES - LOAD OUTPUT FILE NAME
  254.  
  255.     INC    BX        ; NO -
  256.     INC    DI        ;    - ADVANCE POINTERS
  257.     DEC    CH        ; RETARD CHARACTER COUNTER - END?
  258.     JZ    RCMD25        ; YES - DISPLAY ERROR
  259.  
  260.     DEC    CL        ; NO - RETARD FILE NAME COUNTER - TOO LONG?
  261.     JZ    RCMD25        ; YES - DISPLAY ERROR
  262.  
  263.     JMP    RCMD05        ; NO - CONTINUE
  264.  
  265. RCMD10:
  266.     INC    BX        ; ADVANCE COMMAND LINE POINTER
  267.     DEC    CH        ; DECREMENT CHARACTER COUNTER - END?
  268.     JZ    RCMD25        ; YES - DISPLAY ERROR
  269.  
  270.     MOV    DI,OFFSET WRFILE; NO - POINT TO OUTPUT FILE NAME BUFFER
  271.     MOV    CL,MAXLEN    ; LOAD MAXIMUM FILE NAME LENGTH
  272.  
  273. RCMD20:
  274.     MOV    AL,ES:[BX]    ; READ NEXT CHARACTER
  275.     CMP    AL,' '        ; SPACE?
  276.     JZ    RCMD25        ; YES - DISPLAY ERROR
  277.  
  278.     MOV    [DI],AL        ; NO - WRITE TO OUTPUT FILE NAME BUFFER
  279.     INC    BX        ;
  280.     INC    DI        ; ADVANCE POINTERS
  281.     DEC    CH        ; RETARD COUNTER - LAST CHARACTER?
  282.     JZ    RCMD30        ; YES - DONE
  283.  
  284.     DEC    CL        ; NO - RETARD COUNTER - FILE NAME TOO LONG?
  285.     JZ    RCMD25        ; YES - DISPLAY ERROR
  286.  
  287.     JMP    RCMD20        ; NO - CONTINUE
  288.  
  289. RCMD25:
  290.     MOV    DX,OFFSET MBCOM ; POINT TO BAD COMMAND LINE MESSAGE
  291.     JMP    MISERR        ; DISPLAY ERROR MESSAGE AND EXIT TO DOS
  292.  
  293. RCMD30:
  294.     RET            ;
  295.  
  296. RCMD    ENDP            ;
  297.  
  298. ; ****************************************************************
  299. ; **                                **
  300. ; **            OPEN INPUT FILE FOR READ            **
  301. ; **                                **
  302. ; ****************************************************************
  303.  
  304. OPENRD    PROC    NEAR        ;
  305.  
  306.     MOV    AH,OPEN        ; LOAD OPEN FILE COMMAND
  307.     MOV    AL,RDACC     ; LOAD READ ACCESS CODE
  308.     MOV    DX,OFFSET RDFILE; POINT TO INPUT FILE NAME
  309.     INT    DOSFUNC        ; OPEN INPUT FILE - ERROR?
  310.     JNC    OPRD05        ; NO - STORE READ FILE HANDLE
  311.  
  312.     JMP    DSKERR        ; YES - DISPLAY ERROR
  313.  
  314. OPRD05:
  315.     MOV    RDHAND,AX    ; STORE READ FILE HANDLE
  316.     RET            ; DONE
  317.  
  318. OPENRD    ENDP
  319.     PAGE
  320. ; ****************************************************************
  321. ; **                                **
  322. ; **            CONVERT INPUT FILE            **
  323. ; **                                **
  324. ; ****************************************************************
  325.  
  326. CHEX    PROC    NEAR        ;
  327.  
  328. CHEX10:
  329.     DISKRD    1        ; READ ONE BYTE FROM DISK FILE - ERROR?
  330.  
  331.     CMP    AX,01        ; NO - 1 CHARACTER?
  332.     JZ    CHEX11        ; YES - TEST FOR RECORD MARK
  333.  
  334.     JMP    CHEX25        ; NO - DISPLAY ERROR
  335.  
  336. CHEX11:
  337.     MOV    BX,OFFSET DSKBUF; POINT TO DISK BUFFER
  338.     MOV    AL,[BX]        ; LOAD RECEIVED CHARACTER
  339.     CMP    AL,':'        ; RECORD MARK?
  340.     JNZ    CHEX10        ; NO - TRY AGAIN
  341.  
  342.     DISKRD    8        ; YES - READ EIGHT BYTES FROM DISK FILE - ERROR?
  343.  
  344.     MOV    CHKACC,0     ; NO - INITIALIZE CHECKSUM ACCUMULATOR
  345.     CMP    AX,08        ; RECEIVE 8 CHARACTERS?
  346.     JZ    CHEX12        ; YES - CONVERT NUMBER OF BYTES IN RECORD
  347.  
  348.     JMP    CHEX25        ; NO - DISPLAY ERROR
  349.  
  350. CHEX12:
  351.     MOV    BX,OFFSET DSKBUF; POINT TO DISK BUFFER
  352.     CALL    PACK        ; CONVERT NUMBER OF BYTES IN RECORD
  353.     MOV    AH,0        ;
  354.     MOV    NUMREC,AX    ; STORE
  355.     CALL    PACK        ; CONVERT HIGH START ADDRESS
  356.     MOV    DH,AL        ; STORE
  357.     CALL    PACK        ; CONVERT LOW START ADDRESS
  358.     MOV    DL,AL        ; STORE
  359.     CALL    PACK        ; CONVERT RECORD INDICATOR
  360.     CMP    AL,DATIND    ; DATA INDICATOR?
  361.     JNZ    CHEX20        ; NO - TEST FOR END OF FILE INDICATOR
  362.  
  363.     MOV    BX,OFFSET MEMBUF; YES - POINT TO MEMBUF
  364.     ADD    BX,DX        ; COMPUTE MEMBUF ADDRESS FOR THIS RECORD
  365.     MOV    MEMPTR,BX    ; STORE
  366.     MOV    AX,NUMREC    ; LOAD NUMBER OF RECORDS
  367.     ADD    AX,AX        ; COMPUTE NUMBER OF DATA CHARACTERS
  368.     ADD    AX,4        ; ADD CHECKSUM AND TERMINATOR CHARACTER COUNT
  369.     MOV    RECNUM,AX    ; STORE
  370.     DISKRD    RECNUM        ; YES - READ RECNUM BYTES FROM DISK FILE - ERROR?
  371.  
  372.     MOV    BX,OFFSET DSKBUF; NO - POINT TO DISK BUFFER
  373.     MOV    DSKPTR,BX    ; INITITIALIZE DISK BUFFER POINTER
  374.     CMP    RECNUM,CX    ; RECEIVED CORRECT NUMBER OF CHARACTERS?
  375.     JZ    CHEX14        ; YES - CONVERT RECORD
  376.  
  377.     JMP    CHEX25        ; NO - DISPLAY ERROR
  378.  
  379. CHEX14:
  380.     MOV    CX,NUMREC    ; LOAD COUNTER
  381.     JCXZ    CHEX21        ; ZERO BYTES? - YES - LOAD AND TEST
  382.                 ;    CHECKSUM AND TERMINATOR
  383.  
  384. CHEX15:
  385.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  386.     CALL    PACK        ; CONVERT DATA
  387.     MOV    DSKPTR,BX    ; STORE DISK BUFFER POINTER
  388.     MOV    BX,MEMPTR    ; LOAD MEMORY BUFFER POINTER
  389.     MOV    [BX],AL        ; STORE DATA
  390.     INC    MEMPTR        ; ADVANCE MEMORY BUFFER POINTER
  391.     DEC    CX        ; RETARD COUNTER - DONE?
  392.     JNZ    CHEX15        ; NO - CONTINUE
  393.  
  394.     MOV    BX,DSKPTR    ; YES - LOAD DISK BUFFER POINTER
  395.     CALL    PACK        ; CONVERT CHECKSUM
  396.     MOV    CL,AL        ; STORE CHECKSUM
  397.     MOV    AL,CHKACC    ; LOAD CHECKSUM ACCUMULATOR
  398.     SUB    AL,CL        ; ADJUST CHECKSUM
  399.     NOT    AL        ;
  400.     INC    AL        ; COMPUTE 2'S COMPLEMENT OF CHECKSUM
  401.     CMP    AL,CL        ; CHECKSUMS MATCH?
  402.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  403.  
  404.     CMP    BYTE PTR[BX],CR ; YES - TERMINATED WITH <CR>?
  405.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  406.  
  407.     INC    BX        ; YES - POINT TO LINE FEED
  408.     CMP    BYTE PTR[BX],LF ; LINE FEED?
  409.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  410.  
  411.     JMP    CHEX10        ; YES - CONTINUE
  412.  
  413. CHEX20:
  414.     CMP    AL,EOFIND    ; END OF FILE INDICATOR?
  415.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  416.  
  417.     DISKRD    4        ; YES - READ 4 BYTES FROM DISK FILE - ERROR?
  418.     CMP    AX,4        ; NO - 4 CHARACTERS?
  419.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  420.  
  421. CHEX21:
  422.     MOV    BX,OFFSET DSKBUF; YES - POINT TO DISK BUFFER
  423.     CALL    PACK        ; CONVERT CHECKSUM
  424.     MOV    CL,AL        ; STORE CHECKSUM
  425.     MOV    AL,CHKACC    ; LOAD CHECKSUM ACCUMULATOR
  426.     SUB    AL,CL        ; ADJUST CHECKSUM
  427.     NOT    AL        ;
  428.     INC    AL        ; COMPUTE 2'S COMPLEMENT OF CHECKSUM
  429.     CMP    AL,CL        ; CHECKSUMS MATCH?
  430.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  431.  
  432.     CMP    BYTE PTR[BX],CR ; YES - TERMINATED WITH <CR>?
  433.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  434.  
  435.     INC    BX        ; YES - POINT TO LINE FEED
  436.     CMP    BYTE PTR[BX],LF ; LINE FEED?
  437.     JNZ    CHEX25        ; NO - DISPLAY ERROR
  438.  
  439.     RET            ; YES - DONE
  440.  
  441. CHEX25:
  442.     MOV    DX,OFFSET MBHEX ; POINT TO BAD HEX DATA MESSAGE
  443.     JMP    MISERR        ; DISPLAY ERROR MESSAGE AND EXIT TO DOS
  444.  
  445. CHEX    ENDP            ;
  446.     PAGE
  447. ; ****************************************************************
  448. ; **                                **
  449. ; **            OPEN OUTPUT FILE FOR WRITE            **
  450. ; **                                **
  451. ; ****************************************************************
  452.  
  453. OPENWR    PROC    NEAR        ;
  454.  
  455.     MOV    AH,CLOSE     ; LOAD CLOSE FILE COMMAND
  456.     MOV    BX,RDHAND    ; LOAD INPUT FILE HANDLE
  457.     INT    DOSFUNC        ; CLOSE THE INPUT FILE - ERROR?
  458.     JNC    OPWR05        ; NO - OPER WRITE FILE
  459.  
  460.     JMP    DSKERR        ; YES - DISPLAY ERROR
  461.  
  462. OPWR05:
  463.     MOV    AH,CREATE    ; LOAD CREATE FILE COMMAND
  464.     MOV    CX,WRATT     ; LOAD WRITE FILE ATTRIBUTE
  465.     MOV    DX,OFFSET WRFILE; POINT TO OUTPUT FILE NAME
  466.     INT    DOSFUNC        ; OPEN OUTPUT FILE - ERROR?
  467.     JNC    OPWR10        ; NO - STORE WRITE FILE HANDLE
  468. ;
  469.     JMP    DSKERR        ; YES - DISPLAY ERROR
  470.  
  471. OPWR10:
  472.     MOV    WRHAND,AX    ; STORE WRITE FILE HANDLE
  473.     RET            ; DONE
  474.  
  475. OPENWR    ENDP            ;
  476.     PAGE
  477. ; ****************************************************************
  478. ; **                                **
  479. ; **            DISASSEMBLE MEMORY BUFFER            **
  480. ; **                                **
  481. ; ****************************************************************
  482.  
  483. DISS    PROC    NEAR        ;
  484.  
  485.     MOV    BX,OFFSET MEMBUF-1; POINT TO MEMORY BUFFER
  486.     MOV    MEMPTR,BX    ; INITIALIZE MEMORY POINTER
  487.     MOV    BX,MEMLEN+2    ; LOAD NUMBER OF BYTES TO DISSASEMBLE
  488.     MOV    MEMCNT,BX    ; STORE
  489.  
  490. DISS05:
  491.     MOV    BX,OFFSET DSKBUF; POINT TO DISK BUFFER
  492.     MOV    DSKPTR,BX    ; INITIALIZE DISK BUFFER POINTER
  493.     MOV    BX,0        ;
  494.     MOV    DSKCNT,BX    ; CLEAR DISK BUFFER COUNTER
  495.     MOV    BX,MEMCNT    ; LOAD MEMORY BUFFER COUNTER
  496.     DEC    BX        ; RETARD MEMORY BUFFER COUNTER - END OF FILE?
  497.     MOV    MEMCNT,BX    ; (STORE)
  498.     JZ    DISS10        ; YES - WRITE "END" TO OUTPUT FILE
  499.  
  500.     MOV    BX,MEMPTR    ; NO - LOAD MEMORY BUFFER POINTER
  501.     MOV    AL,[BX]        ; LOAD NEXT OPCODE
  502.     OR    AL,AL        ; ZERO?
  503.     JNZ    DISS15        ; NO - FIND IT'S MNEMONIC
  504.  
  505. DISS10:
  506.     PUSH    BX        ; YES - SAVE MEMORY BUFFER POINTER
  507.     MOV    BX,MEMCNT    ; LOAD MEMORY BUFFER COUNTER
  508.     DEC    BX        ; END OF FILE?
  509.     MOV    MEMCNT,BX    ; (STORE)
  510.     POP    BX        ; (RESTORE MEMORY POINTER)
  511.     JNZ    DISS11        ; NO - POINT TO NEXT BYTE
  512.  
  513.     JMP    DISS65        ; YES - WRITE "END" TO DISK
  514.  
  515. DISS11:
  516.     INC    BX        ; POINT TO NEXT BYTE
  517.     MOV    AL,[BX]        ; LOAD IT
  518.     OR    AL,AL        ; ZERO?
  519.     JZ    DISS10        ; YES - CONTINUE
  520.  
  521.     MOV    MEMPTR,BX    ; NO - STORE MEMORY BUFFER POINTER
  522.     CALL    ORGWR        ; WRITE ORG LINE TO DISK
  523.     JMP    DISS05        ; CONTINUE
  524.  
  525. DISS15:
  526.     MOV    DX,BX        ; LOAD CURRENT MEMORY BUFFER LOCATION
  527.     SUB    DX,OFFSET MEMBUF; COMPUTE CURRENT ADDRESS
  528.     MOV    CURADD,DX    ; STORE
  529.     MOV    CL,[BX]        ;
  530.     MOV    CH,0        ; LOAD OPCODE
  531.     INC    CX        ; ADJUST
  532.     MOV    BX,OFFSET MNEM    ; POINT TO MNEMONIC TABLE
  533.  
  534. DISS20:
  535.     DEC    CX        ; RETARD OPCODE - DONE?
  536.     JZ    DISS30        ; YES - WRITE TAB TO DISK BUFFER
  537.  
  538. DISS25:
  539.      MOV    AL,[BX]        ; NO - LOAD NEXT CHARACTER
  540.     INC    BX        ; ADVANCE MNEMONIC TABLE POINTER
  541.     CMP    AL,RS        ; RS?
  542.     JZ    DISS20        ; YES - RETARD OPCODE AND TEST FOR DONE
  543.  
  544.     JMP    DISS25        ; NO - TEST NEXT CHARACTER FOR RS
  545.  
  546. DISS30:
  547.     PUSH    BX        ; SAVE MNEMONIC POINTER
  548.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  549.     MOV    BYTE PTR[BX],TAB; WRITE TAB TO DISK BUFFER
  550.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  551.     MOV    AX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  552.     INC    AX        ; ADVANCE
  553.     MOV    DSKCNT,AX    ; STORE
  554.     PUSH    BX        ;
  555.     POP    DI        ; LOAD DISK BUFFER POINTER IN DI
  556.     POP    BX        ; RESTORE MNEMONIC POINTER
  557.  
  558. DISS35:
  559.     MOV    AL,[BX]        ; LOAD MNEMONIC CHARACTER
  560.     CMP    AL,RS        ; RS?
  561.     JZ    DISS40        ; YES - STORE DISK BUFFER POINTER
  562.  
  563.     MOV    [DI],AL        ; NO - WRITE CHARACTER TO DISK BUFFER
  564.     INC    DI        ; ADVANCE DISK BUFFER POINTER
  565.     INC    BX        ; ADVANCE MNEMONIC POINTER
  566.     MOV    AX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  567.     INC    AX        ; ADVANCE
  568.     MOV    DSKCNT,AX    ; STORE
  569.     JMP    DISS35        ; TEST NEXT CHARACTER FOR RS
  570.  
  571. DISS40:
  572.     XCHG    BX,DI        ; LOAD DISK BUFFER POINTER IN BX
  573.     MOV    DSKPTR,BX    ; STORE DISK BUFFER POINTER
  574.     MOV    BX,MEMPTR    ; LOAD MEMORY BUFFER POINTER
  575.     MOV    CH,0        ;
  576.     MOV    CL,[BX]        ; LOAD OP-CODE
  577.     INC    BX        ; ADVANCE MEMORY BUFFER POINTER
  578.     MOV    MEMPTR,BX    ; STORE
  579.     CALL    OPBYTE        ; COMPUTE NUMBER OF BYTES FOR THIS OPCODE
  580.     MOV    AL,CL        ; LOAD NUMBER OF BYTES
  581.     OR    AL,AL        ; ZERO BYTES (UNDEFINED)?
  582.     JNZ    DISS41        ; NO - TEST FOR ONE BYTE
  583.  
  584.     MOV    BX,MEMPTR    ; YES - LOAD MEMORY BUFFER POINTER
  585.     DEC    BX        ; ADJUST
  586.     MOV    AL,[BX]        ; LOAD "OP-CODE"
  587.     MOV    BX,DSKPTR    ; LOAD DISK POINTER
  588.     MOV    BYTE PTR[BX],'0'; WRITE LEADING ZERO TO DISK BUFFER
  589.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  590.     MOV    DSKPTR,BX    ; STORE
  591.     CALL    EXPAND        ; WRITE "OP-CODE" TO DISK BUFFER
  592.     MOV    BX,DSKPTR    ; LOAD DISK POINTER
  593.     MOV    BYTE PTR[BX],'H'; WRITE "H" TO DISK BUFFER
  594.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  595.     MOV    DSKPTR,BX    ; STORE
  596.     ADD    DSKCNT,2     ; ADVANCE DISK COUNTER
  597.     JMP    DISS60        ; WRITE "TAB,;,CR,LF" TO OUTPUT FILE
  598.  
  599. DISS41:
  600.     DEC    AL        ; ONE BYTE?
  601.     JNZ    DISS42        ; NO - TEST FOR TWO BYTES
  602.  
  603.     JMP    DISS60        ; YES - WRITE "TAB,;,CR,LF" TO OUTPUT FILE
  604.  
  605. DISS42:
  606.     DEC    AL        ; TWO BYTES?
  607.     JZ    DISS45        ; YES - WRITE SECOND BYTE WITH LEADING ZERO
  608.  
  609.     DEC    AL        ; NO - TWO BYTES WITH NO LEADING ZERO?
  610.     JZ    DISS50        ; YES - WRITE SECOND BYTE
  611.  
  612.     JMP    DISS55        ; NO - WRITE PAGE NUMBER AND SECOND BYTE
  613.  
  614. DISS45:
  615.     MOV    BX,MEMCNT    ; LOAD MEMORY BUFFER COUNTER
  616.     DEC    BX        ; RETARD MEMORY BUFFER COUNTER - LAST BYTE?
  617.     MOV    MEMCNT,BX    ; (STORE)
  618.     JNZ    DISS46        ; NO - WRITE ADDRESS TO DISK BUFFER
  619.  
  620.     JMP    DISS65        ; YES - WRITE "END" TO OUTPUT FILE
  621.  
  622. DISS46:
  623.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  624.     MOV    BYTE PTR[BX],'0'; LOAD LEADING ZERO
  625.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  626.     MOV    DSKPTR,BX    ; STORE
  627.     MOV    AX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  628.     INC    AX        ; ADVANCE
  629.     MOV    DSKCNT,AX    ; STORE
  630.     MOV    BX,MEMPTR    ; LOAD MEMORY BUFFER POINTER
  631.     MOV    AL,[BX]        ; LOAD NEXT BYTE
  632.     INC    BX        ; ADVANCE POINTER
  633.     MOV    MEMPTR,BX    ; STORE
  634.     CALL    EXPAND        ; CONVERT TO ASCII IN DISK BUFFER
  635.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  636.     MOV    BYTE PTR[BX],'H'; WRITE HEX INDICATOR
  637.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  638.     MOV    DSKPTR,BX    ; STORE
  639.     MOV    AX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  640.     INC    AX        ; ADVANCE
  641.     MOV    DSKCNT,AX    ; STORE
  642.     JMP    DISS60        ; WRITE "TAB,;,CR,LF" TO OUTPUT FILE
  643.  
  644. DISS50:
  645.     MOV    BX,MEMCNT    ; LOAD MEMORY BUFFER COUNTER
  646.     DEC    BX        ; RETARD MEMORY BUFFER COUNTER - LAST BYTE?
  647.     MOV    MEMCNT,BX    ; (STORE)
  648.     JNZ    DISS51        ; NO - WITE LINE END TO DISK BUFFER
  649.  
  650.     JMP    DISS65        ; YES - WRITE "END" TO OUTPUT FILE
  651.  
  652. DISS51:
  653.     MOV    BX,MEMPTR    ; LOAD MEMORY BUFFER POINTER
  654.     MOV    AL,[BX]        ; LOAD NEXT BYTE
  655.     INC    BX        ; ADVANCE POINTER
  656.     MOV    MEMPTR,BX    ; STORE
  657.     CALL    EXPAND        ; CONVERT TO ASCII IN DISK BUFFER
  658.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  659.     MOV    BYTE PTR[BX],'H'; WRITE HEX INDICATOR
  660.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  661.     MOV    DSKPTR,BX    ; STORE
  662.     MOV    AX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  663.     INC    AX        ; ADVANCE
  664.     MOV    DSKCNT,AX    ; STORE
  665.     JMP    DISS60        ; WRITE "TAB,;,CR,LF" TO OUTPUT FILE
  666.  
  667. DISS55:
  668.     MOV    BX,MEMCNT    ; LOAD MEMORY BUFFER COUNTER
  669.     DEC    BX        ; RETARD MEMORY BUFFER COUNTER - LAST BYTE?
  670.     MOV    MEMCNT,BX    ; (STORE)
  671.     JNZ    DISS56        ; NO - WRITE ADDRESS TO DISK BUFFER
  672.  
  673.     JMP    DISS65        ; YES - WRITE "END" TO OUTPUT FILE
  674.  
  675. DISS56:
  676.     MOV    BX,MEMPTR    ; LOAD MEMORY BUFFER POINTER
  677.     PUSH    BX        ;
  678.     POP    DX        ; IN DX
  679.     MOV    BX,OFFSET MEMBUF; LOAD MEMORY BUFFER ADDRESS
  680.     MOV    AL,DL        ; LOAD LOW MEMORY BUFFER POINTER
  681.     SUB    AL,BL        ; SUBTRACT LOW MEMORY BUFFER ADDRESS
  682.     MOV    AL,DH        ; LOAD HIGH MEMORY BUFFER POINTER
  683.     SBB    AL,BH        ; COMPUTE PAGE NUMBER
  684.     CALL    EXPAND        ; WRITE PAGE NUMBER TO DISK BUFFER
  685.     MOV    BX,MEMPTR    ; LOAD MEMORY BUFFER POINTER
  686.     MOV    AL,[BX]        ; LOAD NEXT BYTE
  687.     INC    BX        ; ADVANCE POINTER
  688.     MOV    MEMPTR,BX    ; STORE
  689.     CALL    EXPAND        ; CONVERT TO ASCII IN DISK BUFFER
  690.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  691.     MOV    BYTE PTR[BX],'H'; WRITE HEX INDICATOR
  692.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  693.     MOV    DSKPTR,BX    ; STORE
  694.     MOV    AX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  695.     INC    AX        ; ADVANCE
  696.     MOV    DSKCNT,AX    ; STORE
  697.  
  698. DISS60:
  699.     MOV    CX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  700.     MOV    BX,OFFSET DSKBUF; POINT TO DISK BUFFER
  701.  
  702. DISS61:
  703.     MOV    CH,0        ; CLEAR CHARACTER COUNTER
  704.  
  705. DISS62:
  706.     MOV    AL,[BX]        ; LOAD NEXT CHARACTER
  707.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  708.     INC    CH        ; ADVANCE CHARACTER COUNTER
  709.     DEC    CL        ; LAST CHARACTER?
  710.     JZ    DISS63        ; YES - DECIDE WHETHER ONE OR TWO TABS
  711.  
  712.     CMP    AL,TAB        ; NO - TAB?
  713.     JZ    DISS61        ; YES - CLEAR CHARACTER COUNTER
  714.  
  715.     JMP    DISS62        ; NO - TEST NEXT CHARACTER
  716.  
  717. DISS63:
  718.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  719.     MOV    AL,8        ;
  720.     CMP    AL,CH        ; LESS THAN EIGHT CHARACTERS SINCE LAST TAB?
  721.     JBE    DISS66        ; NO - WRITE ONE TAB TO DISK BUFFER
  722.  
  723.     MOV    BYTE PTR[BX],TAB; WRITE TAB TO DISK BUFFER
  724.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  725.     INC    DSKCNT        ; ADVANCE DISK BUFFER COUNTER
  726.  
  727. DISS66:
  728.     MOV    BYTE PTR[BX],TAB; WRITE TAB TO DISK BUFFER
  729.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  730.     MOV    BYTE PTR[BX],';'; WRITE ";" TO DISK BUFFER
  731.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  732.     MOV    BYTE PTR[BX],' '; WRITE " " TO DISK BUFFER
  733.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  734.     MOV    DSKPTR,BX    ; STORE
  735.     MOV    DX,CURADD    ; LOAD CURRENT ADDRESS
  736.     MOV    AL,DH        ; LOAD HIGH ADDRESS
  737.     CALL    EXPAND        ; WRITE TO DISK BUFFER
  738.     MOV    AL,DL        ; LOAD LOW ADDRESS
  739.     CALL    EXPAND        ; WRITE TO DISK BUFFER
  740.     MOV    BYTE PTR[BX],CR ; WRITE <CR> TO DISK BUFFER
  741.     INC    BX        ; ADVANCE DISK BUFFER POINTER
  742.     MOV    BYTE PTR[BX],LF ; WRITE LINE FEED TO DISK BUFFER
  743.     ADD    DSKCNT,5     ; ADD TAB AND TERMINATOR COUNT
  744.     DISKWR    DSKCNT        ; WRITE TO DISK - ERROR?
  745.  
  746.     CMP    AX,DSKCNT    ; NO - ALL BYTES WRITTEN?
  747.     JZ    DISS64        ; YES - CONTINUE
  748.  
  749.     MOV    AX,0        ; NO - LOAD ERROR NUMBER
  750.     JMP    DSKERR        ; NO - DISPLAY ERROR
  751.  
  752. DISS64:
  753.     JMP    DISS05        ; CONTINUE
  754.  
  755. DISS65:
  756.     MOV    BX,OFFSET MSGEND; POINT TO "END" STRING
  757.     MOV    DI,OFFSET DSKBUF; POINT TO DISK BUFFER
  758.     MOV    CX,LENEND    ; LOAD MESSAGE LENGTH
  759.  
  760. DISS70:
  761.     MOV    AL,[BX]        ; LOAD FROM STRING
  762.     MOV    [DI],AL        ; WRITE TO DISK BUFFER
  763.     INC    BX        ; ADVANCE STRING POINTER
  764.     INC    DI        ; ADVANCE DISK BUFFER POINTER
  765.     DEC    CX        ; RETARD COUNTER - DONE?
  766.     JNZ    DISS70        ; NO - CONTINUE
  767.  
  768.     DISKWR    LENEND        ; YES - WRITE TO DISK - ERROR?
  769.  
  770.     CMP    AX,LENEND    ; NO - ALL BYTES WRITTEN?
  771.     JZ    DISS75        ; YES - DONE
  772.  
  773.     MOV    AX,0        ; NO - LOAD ERROR NUMBER
  774.     JMP    DSKERR        ; DISPLAY ERROR
  775.  
  776. DISS75:
  777.     RET            ; DONE
  778.  
  779. DISS    ENDP            ;
  780.     PAGE
  781. ; ****************************************************************
  782. ; **                                **
  783. ; **            CLOSE OUTPUT FILE            **
  784. ; **                                **
  785. ; ****************************************************************
  786.  
  787. CLOSWR    PROC    NEAR        ;
  788.  
  789.     MOV    AH,CLOSE     ; LOAD CLOSE FILE COMMAND
  790.     MOV    BX,WRHAND    ; LOAD OUTPUT FILE HANDLE
  791.     INT    DOSFUNC        ; CLOSE THE OUTPUT FILE - ERROR?
  792.     JNC    CLOS05        ; NO - DONE
  793.  
  794.     JMP    DSKERR        ; YES - DISPLAY ERROR
  795.  
  796. CLOS05:
  797.     RET            ;
  798.  
  799. CLOSWR    ENDP
  800.     PAGE
  801. SBRS    PROC    NEAR        ;
  802.  
  803. ; ****************************************************************
  804. ; **                                **
  805. ; **              SUBROUTINES                **
  806. ; **                                **
  807. ; ****************************************************************
  808.  
  809. ; ****************************************************************
  810. ; **    FUNCTION: CONVERT ASCII TO HEXADECIMAL            **
  811. ; **    ENTRY: ASCII REPRESENTATION OF VALID HEX NUMBER IN AL    **
  812. ; **    USES: AL                         **
  813. ; **    EXIT: HEX NUMBER IN AL                    **
  814. ; **    CALLS: NONE                        **
  815. ; ****************************************************************
  816.  
  817. ASCHEX:
  818.     CMP    AL,'9'+1     ; IS IT LESS THAN OR EQUAL TO 9?
  819.     JLE    ASC05        ; YES - JUMP PAST HEX CONVERSION
  820.  
  821.     ADD    AL,9        ; NO - ADD HEX OFFSET
  822.  
  823. ASC05:
  824.     AND    AL,0FH        ; STRIP ASCII BIAS
  825.     RET            ;
  826.     PAGE
  827. ; ****************************************************************
  828. ; **    FUNCTION: CONVERT 8 BIT VALUE TO TWO ASCII CHARACTERS    **
  829. ; **         AND WRITE THEM TO MEMORY POINTED TO BY DSKPTR **
  830. ; **    ENTRY: A=8 BIT VALUE TO BE CONVERTED            **
  831. ; **    USES: BX                         **
  832. ; **    EXIT: BX=END VALUE OF DSKPTR                **
  833. ; **    CALLS: HEXASC                        **
  834. ; ****************************************************************
  835.  
  836. EXPAND:
  837.     PUSHF            ;
  838.     PUSH    AX        ;
  839.     PUSH    CX        ;
  840.     PUSH    AX        ; SAVE BYTE TO BE EXPANDED
  841.     MOV    CL,4        ;
  842.     ROL    AL,CL        ; EXCHANGE NIBBLES
  843.     CALL    HEXASC        ; CONVERT HEX TO ASCII
  844.     MOV    BX,DSKPTR    ; LOAD DISK BUFFER POINTER
  845.     MOV    [BX],AL        ; WRITE TO MEMORY
  846.     INC    BX        ; ADVANCE MEMORY POINTER
  847.     POP    AX        ; RESTORE ORIGINAL BYTE
  848.     CALL    HEXASC        ; CONVERT HEX TO ASCII
  849.     MOV    [BX],AL        ; WRITE TO MEMORY
  850.     INC    BX        ; ADVANCE MEMORY POINTER
  851.     MOV    DSKPTR,BX    ; STORE NEW DISK BUFFER POINTER
  852.     MOV    AX,DSKCNT    ; LOAD DISK BUFFER COUNTER
  853.     INC    AX        ;
  854.     INC    AX        ; ADVANCE
  855.     MOV    DSKCNT,AX    ; STORE
  856.     POP    CX        ;
  857.     POP    AX        ;
  858.     POPF            ;
  859.     RET            ;
  860.  
  861.  
  862.  
  863. ; ****************************************************************
  864. ; **    FUNCTION: CONVERT 4 BIT VALUE TO ASCII            **
  865. ; **    ENTRY: LOWER NIBBLE OF A=VALUE TO BE CONVERTED        **
  866. ; **    USES: AL                         **
  867. ; **    EXIT: A=ASCII CHARACTER                    **
  868. ; **    CALLS: NONE                        **
  869. ; ****************************************************************
  870.  
  871. HEXASC:
  872.     AND    AL,0FH        ; ISOLATE LOWER NIBBLE
  873.     CMP    AL,9+1        ; IS IT LESS THAN OR EQUAL TO 9?
  874.     JL    HXAS05        ; YES - JUMP PAST HEX CONVERSION
  875.  
  876.     SUB    AL,9        ; NO - SUBTRACT HEX OFFSET
  877.     OR    AL,40H        ; COMBINE WITH HEX ASCII BIAS
  878.     RET            ;
  879.  
  880. HXAS05:
  881.     OR    AL,30H        ; COMBINE WITH DECIMAL ASCII BIAS
  882.     RET            ;
  883.     PAGE
  884. ; ****************************************************************
  885. ; **    FUNCTION: WRITE MESSAGE TO STANDARD OUTPUT        **
  886. ; **    ENTRY: DX=START ADDRESS OF MESSAGE STRING        **
  887. ; **    USES: ???                        **
  888. ; **    EXIT: NONE                        **
  889. ; **    CALLS: NONE                        **
  890. ; ****************************************************************
  891.  
  892. MSGCO:
  893.     MOV    AH,PR_STR    ; LOAD PRINT STRING COMMAND
  894.     INT    DOSFUNC        ; PRINT STRING
  895.     RET            ; DONE
  896.     PAGE
  897. ; ****************************************************************
  898. ; **    FUNCTION: COMPUTE NUMBER OF BYTES FOR OP-CODES        **
  899. ; **    ENTRY:    CX=OPCODE                    **
  900. ; **    USES: CL                         **
  901. ; **    EXIT: NUMBER OF BYTES IN CL                **
  902. ; **    CALLS: NONE                        **
  903. ; ****************************************************************
  904.  
  905. OPBYTE:
  906.     PUSH    BX        ; SAVE BX
  907.     MOV    BX,OFFSET BYTES ; POINT TO BYTES TABLE
  908.     ADD    BX,CX        ; ADD OFFSET
  909.     MOV    CL,[BX]        ; LOAD NUMBER OF BYTES
  910.     POP    BX        ; RESTORE BX
  911.     RET            ;
  912.  
  913. ; ****************************************************************
  914. ; **    FUNCTION: WRITE ORG STRING TO DISK            **
  915. ; **    ENTRY: NONE                        **
  916. ; **    USES: ALL                        **
  917. ; **    EXIT: ORG STRING WRITTEN TO DISK             **
  918. ; **    CALLS: EXPAND                        **
  919. ; ****************************************************************
  920.  
  921. ORGWR:
  922.     MOV    DSKCNT,0     ; CLEAR DISK BUFFER COUNTER
  923.     MOV    CX,LENORG    ; LOAD "ORG" MESSAGE LENGTH
  924.     MOV    DI,OFFSET MSGORG; POINT TO "ORG" STRING
  925.     MOV    BX,OFFSET DSKBUF; POINT TO DISK BUFFER
  926.  
  927. ORGW05:
  928.     MOV    AL,[DI]        ; LOAD NEXT CHARACTER OF "ORG" STRING
  929.     MOV    [BX],AL        ; WRITE IT TO DISK BUFFER
  930.     INC    DI        ;
  931.     INC    BX        ; ADVANCE POINTERS
  932.     INC    DSKCNT        ; ADVANCE DISK BUFFER COUNTER
  933.     DEC    CX        ; DECREMENT COUNTER - DONE?
  934.     JNZ    ORGW05        ; NO - CONTINUE
  935.  
  936.     MOV    DSKPTR,BX    ; YES - STORE DISK BUFFER POINTER
  937.     MOV    DX,OFFSET MEMBUF; LOAD MEMORY BUFFER ADDRESS
  938.     MOV    BX,MEMPTR    ; LOAD MEMORY BUFFER POINTER
  939.     MOV    AL,BL        ; LOAD LOW MEMORY BUFFER POINTER
  940.     SUB    AL,DL        ; COMPUTE LOW ORG ADDRESS
  941.     PUSH    AX        ; STORE
  942.     MOV    AL,BH        ; LOAD HIGH MEMORY BUFFER POINTER
  943.     SBB    AL,DH        ; COMPUTE HIGH ORG ADDRESS
  944.     CALL    EXPAND        ; WRITE TO DISK BUFFER
  945.     POP    AX        ; LOAD LOW ORG ADDRESS
  946.     CALL    EXPAND        ; WRITE TO DISK BUFFER
  947.     MOV    BYTE PTR[BX],'H'; WRITE HEX INDICATOR TO DISK BUFFER
  948.     INC    BX        ; ADVANCE POINTER
  949.     MOV    BYTE PTR[BX],CR ; WRITE <CR> TO DISK BUFFER
  950.     INC    BX        ; ADVANCE POINTER
  951.     MOV    BYTE PTR[BX],LF ; WRITE LINE FEED TO DISK BUFFER
  952.     ADD    DSKCNT,3     ; ADJUST DISK BUFFER COUNTER
  953.     DISKWR    DSKCNT        ; WRITE DKSCNT BYTES TO DISK - ERROR?
  954.  
  955.     CMP    AX,DSKCNT    ; NO - ALL BYTES WRITTEN?
  956.     JZ    ORGW10        ; YES - DONE
  957.  
  958.     POP    AX        ; NO - RESTORE STACK
  959.     MOV    AX,0        ; LOAD ERROR NUMBER
  960.     JMP    DSKERR        ; DISPLAY ERROR
  961.  
  962. ORGW10:
  963.     RET            ; DONE
  964. ; ****************************************************************
  965. ; **    FUNCTION: CONVERT TWO ASCII CHARACTERS TO 8 BIT NUMBER    **
  966. ; **    ENTRY: BX=START ADDRESS OF VALID ASCII HEX CHARACTERS    **
  967. ; **    USES: AL, BX                        **
  968. ; **    EXIT: AL=8 BIT NUMBER, BX=BX+2                **
  969. ; **    CALLS: ASCHEX                        **
  970. ; ****************************************************************
  971.  
  972. PACK:
  973.     PUSH    CX        ; SAVE CX
  974.     MOV    AL,[BX]        ; LOAD CHARACTER
  975.     CALL    ASCHEX        ; CONVERT ASCII CHARACTER TO HEX
  976.     MOV    CL,4        ;
  977.     ROL    AL,CL        ; EXCHANGE NIBBLES
  978.     MOV    CH,AL        ; STORE
  979.     INC    BX        ; POINT TO NEXT CHARACTER
  980.     MOV    AL,[BX]        ; LOAD NEXT CHARACTER
  981.     CALL    ASCHEX        ; CONVERT ASCII CHARACTER TO HEX
  982.     OR    AL,CH        ; COMBINE NIBBLES
  983.     INC    BX        ; POINT TO NEXT CHARACTER
  984.     ADD    CHKACC,AL    ; UPDATE CHECKSUM ACCUMULATOR
  985.     POP    CX        ; RESTORE CX
  986.     RET            ;
  987.  
  988. SBRS    ENDP            ;
  989.     PAGE
  990. ERRHAN    PROC    FAR
  991.  
  992. ; ****************************************************************
  993. ; **                                **
  994. ; **            DISK ERROR HANDLER            **
  995. ; **                                **
  996. ; ****************************************************************
  997.  
  998. DSKERR:
  999.     MOV    DX,OFFSET MDISK0; POINT TO DISK ERROR MESSAGE 0
  1000.     OR    AX,AX        ; ERROR 0?
  1001.     JZ    MISERR        ; YES - DISPLAY ERROR MESSAGE
  1002.  
  1003.     MOV    DX,OFFSET MDISK1; NO - POINT TO DISK ERROR MESSAGE 1
  1004.     DEC    AX        ; ERROR 1?
  1005.     JZ    MISERR        ; YES - DISPLAY ERROR MESSAGE
  1006.  
  1007.     MOV    DX,OFFSET MDISK2; NO - POINT TO DISK ERROR MESSAGE 2
  1008.     DEC    AX        ; ERROR 2?
  1009.     JZ    MISERR        ; YES - DISPLAY ERROR MESSAGE
  1010.  
  1011.     MOV    DX,OFFSET MDISK3; NO - POINT TO DISK ERROR MESSAGE 3
  1012.     DEC    AX        ; ERROR 3?
  1013.     JZ    MISERR        ; YES - DISPLAY ERROR MESSAGE
  1014.  
  1015.     MOV    DX,OFFSET MDISK4; NO - POINT TO DISK ERROR MESSAGE 4
  1016.     DEC    AX        ; ERROR 4?
  1017.     JZ    MISERR        ; YES - DISPLAY ERROR MESSAGE
  1018.  
  1019.     MOV    DX,OFFSET MDISK5; NO - POINT TO DISK ERROR MESSAGE 5
  1020.     DEC    AX        ; ERROR 5?
  1021.     JZ    MISERR        ; YES - DISPLAY ERROR MESSAGE
  1022.  
  1023.     MOV    DX,OFFSET MDISK6; NO - POINT TO DISK ERROR MESSAGE 6
  1024.     DEC    AX        ; ERROR 6?
  1025.     JZ    MISERR        ; YES - DISPLAY ERROR MESSAGE
  1026.  
  1027.     MOV    DX,OFFSET MUKNOW; NO - POINT TO UNKNOWN DISK ERROR MESSAGE
  1028.     JMP    MISERR        ; DISPLAY ERROR MESSAGE
  1029.  
  1030.  
  1031.  
  1032. ; ****************************************************************
  1033. ; **                                **
  1034. ; **            MISCELANEOUS ERROR HANDLER            **
  1035. ; **                                **
  1036. ; ****************************************************************
  1037.  
  1038. MISERR:
  1039.     CALL    MSGCO        ; WRITE MESSAGE TO STANDARD OUTPUT
  1040.     POP    AX        ; RESTORE STACK
  1041.     RET            ; RETURN TO DOS
  1042.  
  1043. ERRHAN    ENDP            ;
  1044.  
  1045. CODE    ENDS            ;
  1046.  
  1047.     END    DASM48        ;
  1048.