home *** CD-ROM | disk | FTP | other *** search
- ;BLOAD -
- ;PROGRAM TO READ TARBELL 8K BASIC 3.1 TAPES
- ;AND CREATE A SOURCE FILE
- TEST EQU 0H
- ;5/17/77 WRITTEN
- ORG 100H
- JMP START ;SKIP ID
- DB '(BLOAD 5/17/77)','Z'-40H
- START EQU $
- ;
- IF NOT TEST
- MVI C,DELT
- CALL DKFNC ;ERASE OLD FILE
- MVI C,MAKE
- CALL DKFNC
- INR A
- JZ WRERR
- ENDIF
- ;
- LXI H,BUFF
- ;READ FILE INTO MEMORY FROM TAPE
- RESET MVI A,10H
- OUT 6EH
- INIT CALL TBIN
- CPI 0E6H
- JZ INIT ;SKIP DOUBLE SYNC
- STA 7300H ;SHOW CHAR BEING LOADED
- RD3 MVI D,3
- RDLP CALL TBIN
- MOV M,A
- INX H
- ORA A
- JNZ RD3
- DCR D
- JNZ RDLP
- ;CONVERT AND WRITE
- LXI D,80H ;OUTPUT BUFFER ADDR
- LXI H,BUFF
- INX H ;SKIP NEXT
- INX H ;..ADDR
- LINE CALL BIASC ;CONV LINE #
- CHAR MOV A,M ;GET A CHAR
- INX H ;POINT TO NEXT
- ORA A
- JZ CRLF ;END OF LINE
- JM KEYWD ;IT IS A TOKEN
- ;STORE CHAR
- CALL STORE
- JMP CHAR
- ;
- CRLF MVI A,13
- CALL STORE
- MVI A,10
- CALL STORE
- MOV A,M ;GET NEXT LINE ADDR
- INX H
- ORA M
- INX H
- JNZ LINE ;GET NEXT LINE
- ;
- IF NOT TEST
- ;
- ;ALL DONE - WRITE LAST BLOCK, CLOSE FILE
- ;
- MVI A,'Z'-40H ;EOF CHAR
- CALL STORE
- MVI C,WRITE
- CALL DKFNC
- ORA A
- JNZ WRERR
- MVI C,CLOSE
- CALL DKFNC
- ;
- ENDIF
- JMP 0
- ;
- ;PROCESS KEYWORD
- ;
- KEYWD PUSH H ;SAVE INPUT POINTER
- LXI H,TABLE ;POINT TO KEYWORD TABLE
- SUI 7FH ;FUDGE
- MOV C,A ;SAVE TOKEN #
- PUSH D ;SAVE OUTPUT POINTER
- KEY10 PUSH H ;SAVE START OF TOKEN
- KEY20 MOV A,M ;GET CHAR
- INX H ;POINT TO NEXT
- ORA A ;SET COND
- JP KEY20 ;KEEP GOING
- DCR C ;RIGHT TOKEN?
- POP D ;GET START OF TOKEN ADDR
- JNZ KEY10 ;NOT RIGHT ONE
- ;
- ;GOT TOKEN
- ;
- XCHG ;TOKEN TO H,L
- POP D ;GET OUTPUT ADDR
- ;
- ;MOVE TOKEN TO OUTPUT
- ;
- KEY30 MOV A,M ;GET CHAR OF TOKEN
- ANI 7FH ;DELETE HI BIT
- CALL STORE ;STORE IT
- MOV A,M ;GET CHAR
- INX H ;POINT TO NEXT
- ORA A ;END OF TOKEN?
- JP KEY30 ;..NO
- POP H ;GET INPUT POINTER
- JMP CHAR
- ;
- ;ROUTINE TO STORE OUTPUT, WRITE FULL BUFFER
- ;
- STORE PUSH PSW ! PUSH B ! PUSH D ! PUSH H
- MOV E,A
- MVI C,WRCON
- CALL BDOS ;PRINT CHAR
- POP H ! POP D ! POP B ! POP PSW
- ;
- IF NOT TEST
- STAX D ;SAVE THE CHAR
- INR E ;BUMP
- RNZ
- PUSH B
- MVI C,WRITE
- CALL DKFNC ;WRITE A SECTOR
- POP B
- MVI E,80H ;RE-INIT BUFFER ADDR
- ;
- ENDIF
- RET
- IF NOT TEST
- ;
- ;DISK FUNCTIONS - FNC IS IN C
- ;
- DKFNC PUSH H
- PUSH D
- LXI D,FCB
- CALL BDOS
- POP D
- POP H
- RET
- ;WRITE ERROR
- WRERR LXI D,WRERM
- MVI C,PRINT
- CALL BDOS
- JMP 0
- WRERM DB 'WRITE ERROR$'
- ;
- ENDIF
- ;TARBELL INPUT
- TBIN IN 6EH
- ANI 10H
- JNZ TBIN
- IN 6FH
- RET
- ;
- ;CONVERT LINE $ FROM BINARY TO ASCII
- ;
- BIASC PUSH B
- MOV C,M ;GET LO ORD
- INX H
- MOV B,M ;GET HI ORD
- INX H ;SKIP HI ORD
- PUSH H
- MOV H,B
- MOV L,C
- XRA A ;ZERO
- STA ZSFLG ;ZERO SUPPRESS FLAG
- LXI B,-10000
- CALL SBT
- LXI B,-1000
- CALL SBT
- LXI B,-100
- CALL SBT
- LXI B,-10
- CALL SBT
- MOV A,L
- ORI '0'
- CALL STORE
- POP H
- POP B
- MVI A,' '
- CALL STORE ;SPACE AFTER LINE #
- RET
- ;
- ;SUBROUTINE TO ADD BC TO HL
- ;AND COUNT DECIMAL # TIMES
- ;
- SBT PUSH D
- MVI D,'0'
- SBTLP PUSH H ;SAVE FOR RESTORE
- DAD B ;'SUBTRACT'
- JNC NOSBT ;COULDN'T SBTTRACT
- INR D ;INCR DECIMAL VALUE
- INX SP ;DELETE
- INX SP ;SAVED HL
- JMP SBTLP
- NOSBT POP H ;RESTORE VALUE
- MOV A,D ;GET DIGIT
- POP D
- CPI '0' ;IF NOT ZERO
- JZ CKZER ;IS ZERO - CK '0' SUPPRESS
- ;NOT ZERO - TURN OFF ZERO SUPPRESS FLAG
- STA ZSFLG
- JMP STORE ;STORE THE CHAR
- ;IT IS A ZERO - CHECK FOR ZERO SUPPRESS
- CKZER LDA ZSFLG ;GET THE FLAG
- ORA A ;SET COND CODE
- MVI A,'0'
- JNZ STORE
- RET ;NO STORE IF SUPPRESSED
- ;
- ; BDOS EQUATES (VERSION 2)
- ;
- 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
- REIPL EQU 0
- FCB EQU 5CH
- TABLE DB 'EN','D'+128
- DB 'FO','R'+128
- DB 'NEX','T'+128
- DB 'DAT','A'+128
- DB 'INPU','T'+128
- DB 'DI','M'+128
- DB 'REA','D'+128
- DB 'LE','T'+128
- DB 'GOT','O'+128
- DB 'RU','N'+128
- DB 'I','F'+128
- DB 'RESTOR','E'+128
- DB 'GOSU','B'+128
- DB 'RETUR','N'+128
- DB 'RE','M'+128
- DB 'STO','P'+128
- DB 'OU','T'+128
- DB 'O','N'+128
- DB 'NUL','L'+128
- DB 'WAI','T'+128
- DB 'POK','E'+128
- DB 'PRIN','T'+128
- DB 'DE','F'+128
- DB 'CON','T'+128
- DB 'LIS','T'+128
- DB 'CLEA','R'+128
- DB 'DLOA','D'+128
- DB 'DSAV','E'+128
- DB 'NE','W'+128
- DB 'TAB','('+128
- DB 'T','O'+128
- DB 'SPC','('+128
- DB 'F','N'+128
- DB 'THE','N'+128
- DB 'NO','T'+128
- DB 'STE','P'+128
- DB '+'+128
- DB '-'+128
- DB '*'+128
- DB '/'+128
- DB '^'+128
- DB 'AN','D'+128
- DB 'O','R'+128
- DB '>'+128
- DB '='+128
- DB '<'+128
- DB 'SG','N'+128
- DB 'IN','T'+128
- DB 'AB','S'+128
- DB 'US','R'+128
- DB 'FR','E'+128
- DB 'IN','P'+128
- DB 'PO','S'+128
- DB 'SQ','R'+128
- DB 'RN','D'+128
- DB 'LO','G'+128
- DB 'EX','P'+128
- DB 'CO','S'+128
- DB 'SI','N'+128
- DB 'TA','N'+128
- DB 'AT','N'+128
- DB 'PEE','K'+128
- DB 'LE','N'+128
- DB 'STR','$'+128
- DB 'VA','L'+128
- DB 'AS','C'+128
- DB 'CHR','$'+128
- DB 'LEFT','$'+128
- DB 'RIGHT','$'+128
- DB 'MID','$'+128
- DB 0 ;END OF TABLE
- ZSFLG DB 0 ;ZERO SUPPRESS FLAG
- BUFF EQU $ ;READ PROGRAM IN HERE
- END 100H
-