;CHECKSUM ANY CP/M FILE ORG 100H JMP START ID DB 'CKSUM AS OF 7/20/77',0DH,0AH,'$' ;INIT LOCAL STACK START LXI H,0 DAD SP SHLD STACK LXI SP,STACK ;PRINT ID MESSAGE LXI D,ID MVI C,PRINT CALL BDOS ;OPEN THE FILE LXI D,FCB MVI C,OPEN CALL BDOS INR A JNZ LINE CALL ERXIT DB '++FILE NOT FOUND$' ERXIT POP D ;GET MSG MVI C,PRINT CALL BDOS EXIT LHLD STACK SPHL ;RESTORE STACK RET ;OPENED OK LINE MVI A,0DH CALL TYPE MVI A,0AH CALL TYPE MVI B,16 ;# OF HEX PER LINE LOOP PUSH B ;SAVE DIGIT COUNT CALL FREAD ORA A JNZ CKERR LXI H,80H XRA A CKSLP ADD M INR L JNZ CKSLP CALL XOB POP B DCR B JNZ LOOP JMP LINE ;NON-ZERO DISK RETURN CODE CKERR DCR A JZ EOF CALL ERXIT DB '*++DISK READ ERROR$' EOF CALL ERXIT DB 0DH,0AH,'++EOF$' XOB PUSH PSW RAR RAR RAR RAR CALL NIBBL POP PSW CALL NIBBL MVI A,' ' CALL TYPE RET NIBBL ANI 0FH CPI 10 JC ISNUM ADI 7 ISNUM ADI '0' TYPE PUSH B PUSH D PUSH H MOV E,A MVI C,WRCON CALL BDOS POP H POP D POP B RET ;FILE READ FREAD LXI D,FCB MVI C,READ CALL BDOS RET ;PROG SHOULD CHECK STAT DS 30 STACK DS 2 ; ; BDOS EQUATES (VERSION 3) ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 OPEN EQU 15 ;0FFH=NOT FOUND CLOSE EQU 16 ; " " SRCHF EQU 17 ; " " SRCHN EQU 18 ; " " DELT EQU 19 ;NO RET CODE READ EQU 20 ;0=OK, 1=EOF WRITE EQU 21 ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC MAKE EQU 22 ;0FFH=BAD REN EQU 23 ;0FFH=BAD STDMA EQU 26 BDOS EQU 5 FCB EQU 5CH