mirror of https://github.com/wwarthen/RomWBW.git
7 changed files with 863 additions and 352 deletions
@ -0,0 +1,132 @@ |
|||
;================================================================================================== |
|||
; GENERIC CP/M ROUTINES |
|||
;================================================================================================== |
|||
; |
|||
BDOS .EQU 5 ;ENTRY BDOS |
|||
BS .EQU 8 ;BACKSPACE |
|||
TAB .EQU 9 ;TABULATOR |
|||
LF .EQU 0AH ;LINE-FEED |
|||
CR .EQU 0DH ;CARRIAGE-RETURN |
|||
; |
|||
CLIARGS .EQU $81 |
|||
RESTART .EQU $0000 ; CP/M restart vector |
|||
FCB .EQU $5C ; Location of default FCB |
|||
; |
|||
; OUTPUT TEXT AT HL |
|||
; |
|||
PRTSTR: LD A,(HL) |
|||
CP '$' |
|||
RET Z |
|||
CALL COUT |
|||
INC HL |
|||
JR PRTSTR |
|||
; |
|||
;Output WORD |
|||
;*********** |
|||
; |
|||
;PARAMETER: Entry WORD IN HL |
|||
;********* |
|||
; |
|||
OUTW: LD A,H |
|||
CALL OUTB |
|||
LD A,L |
|||
CALL OUTB |
|||
RET |
|||
; |
|||
;Output BYTE |
|||
;*********** |
|||
; |
|||
;PARAMETER: Entry BYTE IN A |
|||
;********* |
|||
; |
|||
OUTB: PUSH AF |
|||
RRCA |
|||
RRCA |
|||
RRCA |
|||
RRCA |
|||
AND 0FH |
|||
CALL HBTHE ;Change Half-BYTE |
|||
POP AF |
|||
AND 0FH |
|||
CALL HBTHE |
|||
RET |
|||
; |
|||
;Output HALF-BYTE |
|||
;**************** |
|||
; |
|||
;PARAMETER: Entry Half-BYTE IN A (BIT 0 - 3) |
|||
;********* |
|||
; |
|||
HBTHE: CP 0AH |
|||
JR C,HBTHE1 |
|||
ADD A,7 ;Character to Letter |
|||
HBTHE1: ADD A,30H |
|||
LD E,A |
|||
CALL PCHAR |
|||
RET |
|||
; |
|||
; |
|||
;Output on Screen |
|||
;**************** |
|||
; |
|||
PRBS: LD E,BS |
|||
CALL PCHAR |
|||
RET |
|||
; |
|||
;Output CR+LF on Screen |
|||
;********************** |
|||
; |
|||
NEWLINE: |
|||
LD E,CR |
|||
CALL PCHAR |
|||
LD E,LF |
|||
CALL PCHAR |
|||
RET |
|||
; |
|||
;Output ASCII-Character |
|||
;********************** |
|||
; |
|||
COUT: PUSH AF |
|||
LD E,A |
|||
CALL PCHAR |
|||
POP AF |
|||
RET |
|||
; |
|||
;CALL BDOS with Register Save |
|||
;**************************** |
|||
; |
|||
INCHA: LD C,1 ;INPUT CHARACTER TO A |
|||
JR BDO |
|||
PCHAR: LD C,2 ;PRINT CHARACTER IN E |
|||
JR BDO |
|||
PSTRIN: LD C,9 ;PRINT STRING |
|||
JR BDO |
|||
INBUFF: LD C,10 ;READ CONSOLE-BUFFER |
|||
JR BDO |
|||
CSTS: LD C,11 ;CONSOLE-STATUS |
|||
JR BDO |
|||
OPEN: LD C,15 ;OPEN FILE |
|||
JR BDO |
|||
CLOSE: LD C,16 ;CLOSE FILE |
|||
JR BDO |
|||
DELETE: LD C,19 ;DELETE FILE |
|||
JR BDO |
|||
READS: LD C,20 ;READ SEEK |
|||
JR BDO |
|||
WRITES: LD C,21 ;WRITE SEEK |
|||
JR BDO |
|||
MAKE: LD C,22 ;MAKE FILE |
|||
JR BDO |
|||
SETDMA: LD C,26 ;SET DMA-ADDRESS |
|||
BDO: PUSH HL |
|||
PUSH DE |
|||
PUSH BC |
|||
PUSH IX |
|||
PUSH IY |
|||
CALL BDOS |
|||
POP IY |
|||
POP IX |
|||
POP BC |
|||
POP DE |
|||
POP HL |
|||
RET |
|||
@ -0,0 +1,517 @@ |
|||
;================================================================================================== |
|||
; PCF8584 HD44780 I2C LCD UTILITY |
|||
; |
|||
; SOME GENERAL INFORMATION ON LCDS CAN BE SEEN HERE : FOCUSLCDS.COM/PRODUCT-CATEGORY/CHARACTER-LCD/ |
|||
; |
|||
;================================================================================================== |
|||
; |
|||
.ECHO "i2clcd\n" |
|||
; |
|||
#INCLUDE "pcfi2c.inc" |
|||
; |
|||
; LCD COMMANDS |
|||
; |
|||
LCDFSET .EQU 00100000B ; 20H |
|||
LCD4BIT .EQU 00000000B ; 00H |
|||
LCD2LIN .EQU 00001000B ; 08H |
|||
LCDDON .EQU 00000100B ; 04H |
|||
LCDDMOV .EQU 00001000B ; 07H |
|||
LCDSGRA .EQU 01000000B ; 04H |
|||
LCDSDRA .EQU 10000000B ; 80H |
|||
LCDEMS .EQU 00000100B ; 04H |
|||
LCDELFT .EQU 00000010B ; 03H |
|||
; |
|||
LCDPINE .EQU 00000100B ; PIN 2 |
|||
LCDPIND .EQU 00000001B ; PIN O |
|||
; |
|||
; |
|||
; STANDARD FORMATS - 8X1, 8X2, 16X1, 16X2, 16X4, 20X1, 20X2, 20X4, 24X2, 40X1, 40X2, 40X4 |
|||
; |
|||
TIMEOUT .EQU 255 |
|||
|
|||
.ORG 100H |
|||
|
|||
;INIT: CALL PCF_INIT |
|||
; |
|||
LD A,0 |
|||
LD (DEBUGF),A |
|||
; |
|||
CALL LCDINIT ; SETUP THE LCD THROUGH THE PCF8574 |
|||
|
|||
LD HL,LCDDATA ; DISPLAY TEXT AT HL |
|||
PUSH HL |
|||
CALL LCDSTR |
|||
POP HL |
|||
|
|||
CALL STOP ; CLOSE I2C CONNECTION |
|||
; |
|||
RET |
|||
|
|||
;----------------------------------------------------------------------------- |
|||
; |
|||
LCDLITE .DB 00001000B |
|||
; |
|||
LCDINIT: |
|||
; CALL DEBUG |
|||
; |
|||
LD A,I2CLCDW ; SET SLAVE ADDRESS |
|||
OUT (REGS0),A |
|||
; |
|||
LD A,0C5H ; GENERATE START CONDITION |
|||
OUT (REGS1),A ; AND ISSUE THE SLAVE ADDRESS |
|||
CALL CHKPIN |
|||
; |
|||
; CALL DEBUG |
|||
; |
|||
LD HL,LCDINIT1 |
|||
LD B,2 |
|||
CALL WLN |
|||
; |
|||
CALL DELAY |
|||
; |
|||
LD HL,LCDINIT2 |
|||
LD B,2 |
|||
CALL WLN |
|||
; |
|||
CALL DELAY |
|||
; |
|||
; NOW WE ARE IN 4 BIT MODE |
|||
; |
|||
LD A,+(LCDFSET | LCD4BIT | LCD2LIN) |
|||
CALL LCDCMD |
|||
LD A,+(LCDDON | LCDDMOV) |
|||
CALL LCDCMD |
|||
LD A,+(LCDEMS | LCDELFT) |
|||
CALL LCDCMD |
|||
LD A,LCDSDRA |
|||
CALL LCDCMD |
|||
; |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; |
|||
WLN: LD A,(HL) |
|||
OUT (REGS0),A ; PUT DATA ON BUS |
|||
CALL CHKPIN |
|||
INC HL |
|||
DJNZ WLN |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; DISPLAY STRING AT HL, TERMINATED BY 0 |
|||
; |
|||
LCDSTR: POP BC ; GET THE POINTER OF |
|||
POP HL ; THE TEXT TO DISPLAY |
|||
PUSH HL ; OFF THE STACK AND |
|||
PUSH BC ; PUT IT IN HL. |
|||
; |
|||
LCDST0: LD A,(HL) ; GET NEXT CHARACTER TO |
|||
OR A ; DISPLAY BUT RETURN |
|||
RET Z ; WHEN TERMINATOR REACHED |
|||
PUSH HL |
|||
; |
|||
CALL LCDATA ; OUTPUT TO LCD |
|||
POP HL |
|||
; RET C ; POINT TO NEXT |
|||
INC HL ; AND REPEAT |
|||
JR LCDST0 |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; SEND BYTE IN A TO LCD IN 4-BIT MODE |
|||
; |
|||
LCDATA: PUSH DE |
|||
LD D,A |
|||
LD A,(LCDLITE) |
|||
OR +(LCDPINE | LCDPIND) |
|||
JP LCDSND |
|||
LCDCMD: PUSH DE |
|||
LD D,A |
|||
LD A,(LCDLITE) |
|||
OR LCDPINE |
|||
LCDSND: LD E,A |
|||
LD A,D |
|||
PUSH BC |
|||
LD C,11110000B |
|||
AND C |
|||
OR E |
|||
LD (LCDBUF),A |
|||
AND ~LCDPINE |
|||
LD (LCDBUF+1),A |
|||
LD A,D |
|||
RLC A |
|||
RLC A |
|||
RLC A |
|||
RLC A |
|||
AND C |
|||
OR E |
|||
LD (LCDBUF+2),A |
|||
AND ~LCDPINE |
|||
LD (LCDBUF+3),A |
|||
; |
|||
LD HL,LCDBUF ; OUTPUT 1 BYTE WHICH |
|||
LD B,4 ; REQUIRES A FOUR |
|||
CALL WLN ; BYTE SEQUENCE |
|||
; |
|||
POP BC |
|||
POP DE |
|||
RET |
|||
; |
|||
LCDDATA: |
|||
.DB "TEST HOW BIG IS THIS LINE DOES IT WRAP",0 |
|||
; |
|||
LCDINIT1: |
|||
.DB 00110100B |
|||
.DB 00011000B |
|||
; |
|||
LCDINIT2: |
|||
.DB 00100100B |
|||
.DB 00100000B |
|||
; |
|||
LCDBUF: |
|||
.DB 0, 0, 0, 0 ; BUFFER TO HOLD 4 BYTE SEQUENCE |
|||
|
|||
; FLASH DEVICE READ |
|||
; |
|||
|
|||
DEVMADR .EQU 0 |
|||
|
|||
READR: LD B,255 |
|||
DLY1: DJNZ DLY1 |
|||
; |
|||
LD A,D ; SET SLAVE ADDRESS |
|||
OUT (REGS0),A |
|||
; |
|||
LD A,0C5H ; GENERATE START CONDITION |
|||
OUT (REGS1),A ; AND ISSUE THE SLAVE ADDRESS |
|||
CALL CHKPIN |
|||
; |
|||
LD A,+(DEVMADR/256) |
|||
OUT (REGS0),A ; PUT ADDRESS MSB ON BUS |
|||
CALL CHKPIN |
|||
; |
|||
LD A,+(DEVMADR&$00FF) |
|||
OUT (REGS0),A ; PUT ADDRESS LSB ON BUS |
|||
CALL CHKPIN |
|||
; |
|||
LD A,045H ; START |
|||
OUT (REGS1),A |
|||
; |
|||
LD A,E ; ISSUE CONTROL BYTE + READ |
|||
OUT (REGS0),A |
|||
; |
|||
CALL READI2C ; DUMMY READ |
|||
JR NZ,ERREXT |
|||
; |
|||
READLP1:CALL READI2C |
|||
; JR Z,ERREXT |
|||
CP 1AH |
|||
PUSH AF |
|||
CALL COUT |
|||
POP AF |
|||
JR NZ,READLP1 |
|||
; |
|||
LD A,PCF_ES0 |
|||
OUT (REGS1),A |
|||
CALL CHKPIN |
|||
IN A,(REGS0) |
|||
CALL READI2C |
|||
CALL STOP |
|||
; |
|||
CALL NEWLINE |
|||
; |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
;----------------------------------------------------------------------------- |
|||
RESET: LD A,0C2H ; STOP |
|||
OUT (REGS1),A |
|||
LD B,255 |
|||
DLY2: DJNZ DLY2 |
|||
LD A,0C1H |
|||
OUT (REGS1),A |
|||
RET |
|||
|
|||
|
|||
RDSTAT: LD BC,-1 |
|||
STATLP: IN A,(REGS1) |
|||
AND 1 |
|||
RET Z |
|||
LD A,B |
|||
OR C |
|||
DEC BC |
|||
JR NZ,STATLP |
|||
LD A,'T' |
|||
JP ERREXTT |
|||
; |
|||
ERREXT: LD A,'Q' |
|||
JR ERR |
|||
|
|||
ERREXTT: POP HL |
|||
ERR: CALL COUT |
|||
CALL STOP |
|||
CALL RESET |
|||
RET |
|||
; |
|||
STOP: LD A,0C3H |
|||
OUT (REGS1),A |
|||
RET |
|||
; |
|||
DELAY: PUSH HL |
|||
LD HL,-1 |
|||
DLOOP: LD A,H |
|||
OR L |
|||
DEC HL |
|||
JR NZ,DLOOP |
|||
POP HL |
|||
RET |
|||
; |
|||
CHKPIN: IN A,(REGS1) ; POLL FOR |
|||
BIT 7,A ; TRANSMISSION |
|||
JP NZ,CHKPIN ; TO FINISH |
|||
|
|||
; IN A,(REGS1) ; CHECK FOR |
|||
BIT 3,A ; SLAVE |
|||
RET Z ; ACKNOWLEDGMENT |
|||
LD A,'A' |
|||
JP ERREXTT |
|||
; |
|||
; READ ONE BYTE FROM I2C |
|||
; RETURNS DATA IN A |
|||
; Z flag set is acknowledge received (correct operation) |
|||
; |
|||
READI2C: |
|||
IN A,(REGS1) ; READ S1 REGISTER |
|||
BIT 7,A ; CHECK PIN STATUS |
|||
JP NZ,READI2C |
|||
BIT 3,A ; CHECK LRB=0 |
|||
RET NZ |
|||
IN A,(REGS0) ; GET DATA |
|||
RET |
|||
; |
|||
DEBUG: PUSH AF |
|||
PUSH DE |
|||
LD A,'[' |
|||
CALL COUT |
|||
LD HL,DEBUGF |
|||
LD A,(HL) |
|||
INC (HL) |
|||
CALL HBTHE |
|||
LD A,']' |
|||
CALL COUT |
|||
POP DE |
|||
POP AF |
|||
RET |
|||
DEBUGF: .DB 00H |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
; |
|||
; LINUX DRIVER BASED CODE |
|||
; |
|||
; I2C_INB = IN A,(REGS0) |
|||
; I2C_OUTB = LD A,* | OUT (REGS0),A |
|||
; SET_PCF = LD A,* | OUT (REGS1),A |
|||
; GET_PCF = IN A,(REGS1) |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
I2C_START: |
|||
LD A,PCF_START_ |
|||
OUT (REGS1),A |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
I2C_REPSTART: |
|||
LD A,PCF_START_ |
|||
OUT (REGS1),A |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
I2C_STOP: |
|||
LD A,PCF_STOP_ |
|||
OUT (REGS1),A |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
HANDLE_LAB: |
|||
|
|||
LABDLY .EQU 0F000H |
|||
|
|||
LD A,PCF_PIN |
|||
OUT (REGS1),A |
|||
LD A,PCF_ES0 |
|||
OUT (REGS1),A |
|||
; |
|||
LD HL,LABDLY |
|||
LABLP LD A,H |
|||
OR L |
|||
DEC HL |
|||
JR NZ,LABLP |
|||
; |
|||
IN A,(REGS1) |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
WAIT_FOR_BB: |
|||
; |
|||
BBTIMO .EQU 255 |
|||
; |
|||
LD HL,BBTIMO |
|||
BBNOTO IN A,(REGS1) |
|||
AND PCF_BB |
|||
RET Z |
|||
DEC HL |
|||
LD A,H |
|||
OR A |
|||
JR NZ,BBNOTO |
|||
CPL ; RET NZ IF TIMEOUT |
|||
BBNOTB RET ; RET Z IF BUS IS BUSY |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
WAIT_FOR_PIN: |
|||
; |
|||
; RETURN A=00/Z IF SUCCESSFULL |
|||
; RETURN A=FF/NZ IF TIMEOUT |
|||
; RETURN A=01/NZ IF LOST ARBITRATION |
|||
; |
|||
PINTIMO .EQU 16000 |
|||
; |
|||
LD HL,PINTIMO |
|||
PINNOTO IN A,(REGS1) |
|||
LD (STATUS),A |
|||
LD B,A |
|||
AND PCF_PIN |
|||
RET Z |
|||
DEC HL |
|||
LD A,H |
|||
OR A |
|||
JR NZ,PINNOTO |
|||
CPL ; RET NZ IF TIMEOUT |
|||
PINNOTB RET ; RET Z IF BUS IS BUSY |
|||
; |
|||
LD B,A |
|||
AND PCF_LAB |
|||
CALL HANDLE_LAB |
|||
LD (STATUS),A |
|||
XOR A |
|||
INC A |
|||
RET |
|||
; |
|||
STATUS .DB 00H |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
PCF_INIT: |
|||
LD A,PCF_PIN ; S1=80H: S0 SELECTED, SERIAL |
|||
OUT (REGS1),A ; INTERFACE OFF |
|||
NOP |
|||
IN A,(REGS1) ; CHECK TO SEE S1 NOW USED AS R/W |
|||
AND 07FH ; CTRL. PCF8584 DOES THAT WHEN ESO |
|||
JR NZ,INIERR ; IS ZERO |
|||
; |
|||
LD A,PCF_OWN ; LOAD OWN ADDRESS IN S0, |
|||
OUT (REGS0),A ; EFFECTIVE ADDRESS IS (OWN <<1) |
|||
NOP |
|||
IN A,(REGS0) ; CHECK IT IS REALLY WRITTEN |
|||
CP PCF_OWN |
|||
JR NZ,SETERR |
|||
; |
|||
LD A,+(PCF_PIN | PCF_ES1) ; S1=0A0H |
|||
OUT (REGS1),A ; NEXT BYTE IN S2 |
|||
NOP |
|||
IN A,(REGS1) |
|||
AND 07FH |
|||
CP PCF_ES1 |
|||
JR NZ,REGERR |
|||
; |
|||
LD A,PCF_CLK ; LOAD CLOCK REGISTER S2 |
|||
OUT (REGS0),A |
|||
NOP |
|||
IN A,(REGS0) ; CHECK IT'S REALLY WRITTEN, ONLY |
|||
AND 1FH ; THE LOWER 5 BITS MATTER |
|||
CP PCF_CLK |
|||
JR NZ,CLKERR |
|||
; |
|||
LD A,PCF_IDLE_ |
|||
OUT (REGS1),A |
|||
NOP |
|||
IN A,(REGS1) |
|||
CP +(PCF_PIN | PCF_BB) |
|||
JR NZ,IDLERR |
|||
|
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
PCF_SENDBYTES: ; HL POINTS TO DATA, BC = COUNT, A = 0 LAST A=1 NOT LAST |
|||
; |
|||
LD (LASTB),A |
|||
; |
|||
SB0: LD A,(HL) |
|||
OUT (REGS0),A |
|||
CALL WAIT_FOR_PIN |
|||
JR Z,SB1 |
|||
|
|||
CP 01H ; EXIT IF ARBITRATION ERROR |
|||
RET Z |
|||
|
|||
CALL I2C_STOP ; MUST BE TIMEOUT |
|||
LD A,055H ; ERROR |
|||
RET |
|||
|
|||
SB1: LD A,(STATUS) |
|||
AND PCF_LRB |
|||
JR NZ,SB2 |
|||
LD A,055H |
|||
; |
|||
SB2: LD A,B |
|||
OR C |
|||
INC HL |
|||
JR NZ,SB0 ; CHECK IF FINISHED |
|||
; |
|||
SBGOOD: LD A,(LASTB) |
|||
OR A |
|||
JR NZ,DB3 |
|||
CALL I2C_STOP |
|||
RET |
|||
DB3: CALL I2C_REPSTART |
|||
RET |
|||
; |
|||
LASTB .DB 00H |
|||
; |
|||
|
|||
; I2C_INB = IN A,(REGS0) |
|||
; I2C_OUTB = LD A,* | OUT (REGS0),A |
|||
; SET_PCF = LD A,* | OUT (REGS1),A |
|||
; GET_PCF = IN A,(REGS1) |
|||
|
|||
|
|||
; |
|||
;----------------------------------------------------------------------------- |
|||
|
|||
INIERR LD HL,NOPCF |
|||
CALL PRTSTR |
|||
RET |
|||
; |
|||
SETERR LD HL,WRTFAIL |
|||
CALL PRTSTR |
|||
RET |
|||
REGERR LD HL,REGFAIL |
|||
CALL PRTSTR |
|||
RET |
|||
; |
|||
CLKERR LD HL,CLKFAIL |
|||
CALL PRTSTR |
|||
RET |
|||
; |
|||
IDLERR LD HL,IDLFAIL |
|||
CALL PRTSTR |
|||
RET |
|||
; |
|||
NOPCF .DB "NO DEVICE FOUND",CR,LF,"$" |
|||
WRTFAIL .DB "SETTING DEVICE ID FAILED",CR,LF,"$" |
|||
REGFAIL .DB "CLOCK REGISTER SELECT ERROR",CR,LF,"$" |
|||
CLKFAIL .DB "CLOCK SET FAIL",CR,LF,"$" |
|||
IDLFAIL .DB "BUS IDLE FAILED",CR,LF,"$" |
|||
; |
|||
#INCLUDE "i2ccpm.inc" |
|||
; |
|||
BUFFER: .DS 256 |
|||
; |
|||
.END |
|||
Loading…
Reference in new issue