
|
Standaard routine voor call commando's (source) Genic Clubguide, 00-00-00
; STANDAARD ROUTINE VOOR CALL COMMANDO'S
; Door Erik Bos
; Voorzien van uitleg door Stefan Boer
BEGIN: EQU &H9000 ;beginadres
ORG BEGIN
OFFSET: EQU &H4000-BEGIN ;omrekenwaarde
DEFM "AB"
DEFW 0 ;geen initialisatie
DEFW CAL+OFFSET ;begin statement uitbreiding
DEFW 0 ;geen device
DEFW 0 ;geen Basic
DEFW 0
DEFW 0
DEFW 0
CAL: PUSH HL ;HL wijst naar teken na CALL
LD DE,TABEL+OFFSET ;begin van de tabel
C_1: LD HL,&HFD89 ;PROCNM bevat naam
LD A,(DE) ;lengte van naam
AND A ;wis vlaggen
JR Z,C_ERR ;einde tabel als A=0
LD B,A
INC DE
C_2: LD A,(DE) ;vergelijk naam in tabel
CP (HL) ;met naam in PROCNM
JR NZ,NEXT1 ;naar NEXT1 als verkeerde naam
INC DE
INC HL
DJNZ C_2
LD A,(HL)
AND A
JR NZ,NEXT2
EX DE,HL ;HL is plaats in tabel
LD E,(HL) ;low byte sprongadres
INC HL
LD D,(HL) ;high byte sprongadres
EX DE,HL
JP (HL) ;spring naar dat adres
NEXT1: LD C,B
LD B,0 ;BC=B
INC BC
INC BC
EX DE,HL
ADD HL,BC
EX DE,HL
JR C_1 ;probeer het nog eens
NEXT2: INC DE ;sla het sprongadres
INC DE ;over
JR C_1 ;probeer het nog eens
C_ERR: POP HL
SCF
RET
INIT: LD A,(&HF342) ;plaats RAM page 1
LD H,&H40 ;PAGE 1
CALL &H24 ;BIOS routine ENASLT
LD HL,&H9000
LD DE,&H4000
LD BC,&H4000
LDIR ;verplaats naar page 1
XOR A ;slot 0-0 MSX1 BASIC
LD H,&H40 ;PAGE 1
CALL &H24 ;ENASLT
LD HL,&HFCCA ;&HFCC9 + pagenummer (=1)
LD BC,&H10
LD A,(&HF342) ;plaats RAM page 1
AND &B00000011 ;primaire gleuf
CLUS1: JR Z,CNEXT
ADD HL,BC ;tel primair*16 erbij op
DEC A
JR CLUS1
CNEXT: LD BC,4
LD A,(&HF342) ;plaats RAM page 1
AND A ;wis vlaggen
JP P,CEINDE ;is er wel secundair slot
AND &B00001100 ;secundaire gleuf * 4
RRCA ;secundaire gleuf * 2
RRCA ;secundaire gleuf
CLUS2: JR Z,CEINDE
ADD HL,BC ;tel secundair*4 erbij op
DEC A
JR CLUS2
CEINDE: LD (HL),&H20 ;zet bit 5 aan
RET ;einde initialisatie
ILLEGA: LD IX,&H475A ;Illegal function call error
JP &H0159 ;routine van Basic-ROM
SYNTAX: LD IX,&H4055 ;Syntax error routine van
JP &H0159 ;Basic-ROM aanroepen
R_BYTE: LD IX,&H521C ;Lees een byte van getokenized
JP &H0159 ;Basic, resultaat in A
R_WORD: LD IX,&H6F0B ;Lees een word van getokenized
JP &H0159 ;Basic, resultaat in DE
TABEL: DEFB 6 ;lengte CALL commando
DEFM "TESTJE" ;de naam
DEFW TESTJE+OFFSET ;het adres
DEFB 4
DEFM "DSKI"
DEFW DSKI+OFFSET
DEFB 0 ;afsluiten
TESTJE: LD HL,TEXT+OFFSET ;begin tekst
T_1: LD A,(HL) ;ASCII teken
AND A
JR Z,T_2 ;klaar als 0
CALL &HA2 ;teken naar scherm
INC HL
JR T_1 ;volgende teken
T_2: POP HL ;HL is pointer naar tokenized Basic achter cmd
XOR A ;wis carry
RET
TEXT: DEFM "GENIC",0
DSKI: POP HL ;HL is pointer naar tokenized Basic achter cmd
LD A,(HL)
CP "("
JP NZ,SYNTAX+OFFSET ;syntax error als geen haakje
INC HL
CALL R_BYTE+OFFSET ;lees drivenummer
LD (DRIVE+OFFSET),A
LD A,(HL)
CP ","
JP NZ,SYNTAX+OFFSET ;syntax error als geen komma
INC HL
CALL R_WORD+OFFSET ;lees start sector
LD (SECTOR+OFFSET),DE
LD A,(HL)
CP ","
JP NZ,SYNTAX+OFFSET ;syntax error als geen komma
INC HL
CALL R_BYTE+OFFSET ;lees aantal sectoren
LD (COUNT+OFFSET),A
AND A ;wis vlaggen
JP Z,ILLEGA+OFFSET ;Illegal function call als 0 sectoren
LD A,(HL)
CP ","
JP NZ,SYNTAX+OFFSET ;syntax error als geen komma
INC HL
CALL R_WORD+OFFSET ;lees adres
LD A,(HL)
CP ")"
JP NZ,SYNTAX+OFFSET ;syntax error als geen haakje
INC HL
PUSH HL ;bewaar pointer achter commando
LD C,&H1A ;BDOS call SETDMA
CALL &HF37D ;stel adres in op DE
LD DE,(SECTOR+OFFSET)
LD HL,(DRIVE+OFFSET)
LD C,&H2F ;BDOS call Absolute Disk Read
CALL &HF37D ;lees H sectoren van drive L, begin met sect DE
POP HL ;pointer achter commando
XOR A ;wis carry
RET
DRIVE: DEFB 0
COUNT: DEFB 0
SECTOR: DEFW 0
|