home *** CD-ROM | disk | FTP | other *** search
- ; TRSDOS SYSTEM EQUATE
-
- SYSTEM EQU 402DH
-
- ; PIXEL SET ROUTINE FROM TRS-80 ASSEMBLY
- ; LANGUAGE PROGRAMMING BY BARDEN PAGE 178.
-
- ; ENTRY: D CONTAINS Y: (0<=Y<=47)
- ; E CONTAINS X: (0<=X<=127)
-
- ; THIS ROUTINE USES Z80 INSTRUCTIONS
-
- SET$PIXEL:
- MOV A,D
- MVI B,0FFH
- SET01:
- INR B
- SUI 3
- JP SET01
- ADI 3
- DB 0CBH,27H ; SLA A
- MOV C,A
- MOV L,B
- MVI H,0
- MVI B,6
- SET02:
- DAD H
- DCR B
- JNZ SET02
- MVI D,0
- DB 0CBH,3BH ; SRL E
- JNC SET03
- INR C
- SET03:
- DAD D
- LXI D,3C00H
- DAD D
- DB 0CBH,21H ; SLA C
- DB 0CBH,21H
- DB 0CBH,21H
- MVI A,0C6H
- ADD C
- STA SET04+1
- SET04:
- DB 0CBH,00H
- DB 0CBH,0FEH ; SET 7,(HL)
- RET
-
- ; ENVIRONMENT RETRIEVAL ROUTINE
-
- BEGIN:
- IF PERCUSSION
- MVI A,0D3H
- STA PR21
- STA PR31
- STA PR41
- MVI A,0F5H
- STA PR21+1
- STA PR31+1
- STA PR41+1
- ENDIF
- LDA DAC
- STA X22+1
- STA X33+1
- STA X44+1
- RET
-
-
- ; TRS-80 DEFINITIONS
-
- BLOCK: DS 0
-
- CPU: DB 3
- CLOCK: DB 95H,58H,8DH,80H
-
- DAC: DB 0FCH
-
- CRLF: DB 0DH,00H,'$'
-
- MXCOL: DW 64
- MXROW: DW 16
-
- CEOS: DB 31
- CEOL: DB 30
-
- SCRL: DB 42 ; ASTERISK
- HOME: DB 59 ; SEMICOLON
- UP$ARROW: DB 91
- LEFT$ARROW: DB 8
- DOWN$ARROW: DB 10
- RITE$ARROW: DB 9
- RETURN: DB 0DH
- QUIT: DB 36 ; DOLLAR SIGN
- CANCEL: DB 39 ; SINGLE QUOTE
-
- PAGE$HEIGHT: DW 50
- PAGE$FEED: DB 0
- PAGE$SPACE: DB 0
-
- ; JUMP TABLE FOR TRSDOS 2.1
-
- CURSOR EQU 4020H ; CURSOR ADDRESS
-
- JGTCH: JMP 002BH ; GET CHARACTER
- JWTCH: JMP 0033H ; WRITE CHARACTER
- JREWRT: JMP 4420H ; CREATE FILE
- JRESET: JMP 4424H ; OPEN FILE
- JCLOS: JMP 4428H ; CLOSE FILE
- JDELE: JMP 442CH ; DELETE FILE
- JWRIT: JMP 443CH ; WRITE TO FILE
- JREAD: JMP 4436H ; READ FROM FILE
-
-
- ; LOGICAL I/O SYSTEM FOR TRS-80 LEVEL 2
-
- ; GET CHARACTER (W/OUT ECHO) FROM CONSOLE
- ; OUTPUTS: A = CHARACTER
-
- FGTCH:
- MVI A,15
- CALL JWTCH
- CALL FGTC01
- MVI A,14
- CALL JWTCH
- CALL FGTC01
- JMP FGTCH
- FGTC01:
- MVI B,10
- FGTC02:
- LXI D,-1
- LXI H,1000
- FGTC03:
- DAD D
- JC FGTC03
- PUSH B
- CALL JGTCH ; FGTCH=002BH
- POP B
- ORA A ; TEST FOR
- JNZ FGTC04 ; ANY CHAR
- DCR B
- JNZ FGTC02
- RET
- FGTC04:
- POP H
- ANI 7FH ; CLEAR PARITY
- MOV B,A
- LDA CANCEL ; TEST FOR CANCEL
- CMP B
- JZ BOOT
- LDA FLOWER
- CMP B ; ADJUST
- JP FGTC05 ; LOWER
- CPI '{' ; CASE
- JP FGTC05
- MOV A,B
- ANI 5FH
- MOV B,A
- FGTC05:
- MVI A,60H
- STA FLOWER
- MOV A,B
- RET
- FLOWER: DB 60H
-
- ; GET CHARACTER (W/ECHO) FROM CONSOLE
- ; OUTPUTS: A = CHARACTER
-
- FRDCH:
- CALL FGTCH
- CPI 20H
- JP FRDC01
- CPI 0DH
- JZ FRDC01
- ORI 20H
- FRDC01:
- CALL FWTCH
- RET
-
-
- ; READ LINE FROM CONSOLE
-
- ; INPUT: HL = @(BUFFER)
- ; A = S(BUFFER)
- ; OUTPUT: BUFFER WITH GOODIES
-
- FRDLN:
- DCX H ; POINT
- DCX H ; TO MAX
- SHLD FTEMP ; SIZE
- MOV M,A ; SAVE SIZE
- INX H
- MVI M,0 ; RESET POINTER
- FFRD01:
- INX H ; AND
- MVI M,' ' ; CLEAR
- DCR A ; BUFFER
- JNZ FFRD01
- FFRD02:
- CALL FGTCH ; GET A CHAR
- CPI ' ' ; TEST FOR
- JM FFRD03 ; CONTROL
- CALL FWTCH
- CALL FFRD04
- LHLD FTEMP
- MOV A,M
- INX H
- MOV B,M ; TEST
- CMP B ; FOR
- JNZ FFRD02 ; DONE
- RET
- FFRD03:
- CPI 0DH ; TEST FOR
- RZ ; DONE
- MOV B,A
- LDA LEFT$ARROW ; TEST FOR
- CMP B
- JNZ FFRD02 ; RUB-OUT
- LHLD FTEMP
- INX H ; TEST SIZE
- MOV A,M
- ORA A ; ONLY FOR
- JZ FFRD02 ; NON-ZERO
- DCR A ; BACK UP
- MOV M,A ; POINTER
- MVI A,8 ; BACK UP
- CALL FWTCH ; CURSOR
- MVI A,' ' ; UPDATE
- CALL FFRD04 ; BUFFER
- DCR E ; BACK UP
- MOV M,E ; BUFFER
- JMP FFRD02
- FFRD04:
- LHLD FTEMP ; RETRIEVE
- INX H ; ADDRESS
- MVI D,0
- MOV E,M
- INX D
- DAD D
- MOV M,A ; SAVE CHAR
- LHLD FTEMP
- INX H ; UPDATE
- MOV M,E ; ADDR
- RET
-
- ; WRITE CHARACTER TO CONSOLE
- ; INPUTS: A = CHARACTER
-
- FWTCH:
- PUSH PSW
- CPI 13 ; CHECK FOR CR
- JNZ FWTCH1
- LDA CRLF
- FWTCH1:
- CPI 10 ; CHECK FOR LF
- JNZ FWTCH2
- LDA CRLF+1
- FWTCH2:
- CALL JWTCH ; JWTCH=0033H
- POP PSW
- RET
-
- ; WRITE LINE TO CONSOLE
-
- ; INPUTS: HL=@(LINE)
- ; LINE TERMINATED BY '$'
-
- FWRTLN:
- SHLD FTEMP
- FWRT01:
- LHLD FTEMP
- MOV A,M
- CPI '$'
- RZ
- INX H
- SHLD FTEMP
- CALL FWTCH
- JMP FWRT01
-
-
- ; GOTOXY CURSOR CONTROL FOR CRT
-
- ; INPUT: A = ROW
- ; B = COLUMN
- ; CURSOR ADDRESS := 3C00H + 64 * ROW + COLUMN
-
- GOTOXY:
- MVI H,0
- MOV L,A
- MVI D,0
- MOV E,B
- PUSH H
- PUSH D
- MVI A,15
- CALL JWTCH
- POP D
- POP H
- DAD H ; COMPUTE
- DAD H
- DAD H ; CURSOR
- DAD H
- DAD H ; ADDRESS
- DAD H
- DAD D
- LXI D,3C00H ; DISPLAY AREA
- DAD D
- SHLD CURSOR ; CURSOR VARIABLE
- RET
-
- ; FCB BUILDER
-
- ; PREPARES FCB FOR I/O
-
- ; INPUTS: DE = @(FCB)
- ; HL = @(FCB$NAME)
-
- FFCB:
- CALL FCMPR ; COMPRESS
- XCHG
- SHLD FTEMP ; SAVE FCB ADDR
- MVI A,32 ; AND
- FFCB01:
- MVI M,' ' ; CLEAR
- INX H ; ENTIRE
- DCR A ; FCB
- JNZ FFCB01
- XCHG
- DCX H ; GET
- MOV B,M ; SIZE
- INX H
- XCHG
- LHLD FTEMP
- FFCB02:
- LDAX D ; MOVE
- MOV M,A ; NAME
- INX D ; TO
- INX H ; FCB
- DCR B
- JNZ FFCB02
- RET
- FCMPR:
- PUSH D
- MOV D,H
- MOV E,L
- DCX H
- PUSH H
- MOV B,M
- MVI C,0
- INX H
- FCMP01:
- MOV A,M
- CPI '.'
- JM FCMP02
- CPI '['
- JP FCMP02
- STAX D
- INX D
- INR C
- FCMP02:
- INX H
- DCR B
- JNZ FCMP01
- POP H
- MOV M,C
- INX H
- POP D
- RET
-
- ; OPEN A DISK FILE
-
- ; INPUT: DE = @(FCB)
- ; OUTPUT: CARRY = ERROR
-
- FRESET:
- MVI B,1
- LXI H,FBUF
- CALL JRESET ; JRESET=4424H
- STC
- RNZ
- CMC
- RET
-
- ; READ BYTE FROM DISK
-
- ; INPUT: DE = @(FCB)
- ; OUTPUT: A = BYTE
- ; CARRY = ERROR
-
- FREAD:
- LXI H,FTEMP
- CALL JREAD ; JREAD=4436H
- STC
- RNZ
- LDA FTEMP
- CMC
- RET
-
- ; DATA STORAGE
-
- FTEMP: DS 2
- FTOP: DS 2
- FNEXT: DS 2
- FCB: DS 32
- FBUF: DS 256
-