Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .org 08000h
- jp _main
- _pDkstr = 09000h ; indirizzo della lista dei nodi raggiungibili (Dijkstra)
- _pExitList = 08f00h ; indirizzo della lista dei nodi finali raggiungibili (Dijkstra, solo puntatori)
- _pEL .word _pExitList ; puntatore ad un nuovo elemento della lista dei nodi finali
- _timer .db 0,0
- _regspace .db 0,0
- _number .db 0,0,0,0,0,0,0 ; buffer conversione da int a stringa
- count .db 0
- u .word _pDkstr ; puntatore all'ultimo nodo della lista dei nodi raggiungibili (Dijkstra)
- w .word _pDkstr ; cursore della lista dei nodi; contiene il puntatore al nodo in valutazione
- xp .db 0
- xm .db 0
- yp .db 0
- ym .db 0
- DimNodo = 05h ; ogni nodo è di 5 byte:
- ; nodo = { byte "X"
- ; byte "Y"
- ; byte "distanza dal nodo precedente"
- ; word "puntatore al nodo precedente" }
- _main
- ;exx
- ;push hl ; save alternate HL
- ;----------------reset time
- ld a,0
- ld (23672),a
- ld (23673),a
- ld (23674),a
- ;----------------reset dei valori (elimina flag visitato, ripristina i puntatori)
- ; fa funzionare il programma anche al secondo RUN
- ld hl,_map
- ld de,529
- _rsettab
- ld a,(hl)
- and 07fh
- ld (hl),a
- inc hl
- dec e
- jp nz, _rsettab
- dec d
- jp p, _rsettab
- ld bc,_pExitList ; reset pointers
- ld (_pEL),bc
- ld bc,_pDkstr
- ld (u),bc
- ld (w),bc
- ld bc,0h
- ld (_number),bc
- ld (_number+2),bc
- ld (_number+4),bc
- ld (_number+6),bc
- ;----------------
- ld hl,_pDkstr ; punta alla lista dei nodi visitati
- ld a,11 ; inserisce i dati del nodo iniziale; l'indice è zero-based
- ld (hl),a
- inc hl
- ld (hl),a
- inc hl
- ld (hl),0h
- inc hl
- ld (hl),0h
- inc hl
- ld (hl),0h
- ld bc,00b0bh ; cella iniziale (12,12); l'indice è zero-based
- call _CellBC
- or 080h
- ld (hl),a
- _loopDijkstra
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_nextnode
- ld d,a
- ld a,c ; calcola le coordinate dei nodi raggiungibili in base alla distanza
- add a,d
- ld (xp),a ; (xm,ym) (x,ym) (xp,ym)
- ld a,c ; \ | /
- sub d ; \ | /
- ld (xm),a ; \ | /
- ld a,b ; (xm,y) ---(x,y)--- (xp,y)
- add a,d ; / | \
- ld (yp),a ; / | \
- ld a,b ; / | \
- sub d ; (xm,yp) (x,yp) (xp,yp)
- ld (ym),a
- ld iyh,b
- ld iyl,c
- _N or a
- jp m, _E
- ;ld a,(ym)
- ld b,a
- inc b ; valuta se siamo passati sopra una cella finale
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_NE ; se sì salta a "NordEst"
- dec b
- call _CellBC ; raccoglie il valore del nodo a Nord
- or a
- jp m,_NE ; se già visitato passa oltre
- jp z,_NE ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; inserisce i dati del nodo nella lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),1 ; direzione Nord
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh ; rimuove il flag di "visitato" (bit 7)
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _NE ld a,(xp)
- cp 23
- jp p, _S
- ;ld a,(xp)
- ld c,a
- ld a,(ym)
- ld b,a
- inc b ; valuta se siamo passati sopra una cella finale
- dec c
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_E ; se sì salta a "Est"
- dec b
- inc c
- call _CellBC ; raccoglie il valore del nodo a NordEst
- or a
- jp m,_E ; se già visitato passa oltre
- jp z,_E ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; aggiunge il nodo alla lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),2 ; direzione NordEst
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _E ld a,(xp)
- cp 23
- jp p,_S
- ;ld a,(xp)
- ld c,a
- ld b,iyh
- dec c ; valuta se siamo passati sopra una cella finale
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_SE ; se sì salta a "SudEst"
- inc c
- call _CellBC ; raccoglie il valore del nodo a Est
- or a
- jp m,_SE ; se già visitato passa oltre
- jp z,_SE ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; aggiunge il nodo alla lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),3 ; direzione Est
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _SE ld a,(yp)
- cp 23
- jp p,_O
- ;ld a,(yp)
- ld b,a
- ld a,(xp)
- ld c,a
- dec c ; valuta se siamo passati sopra una cella finale
- dec b
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_S ; se sì salta a "Sud"
- inc c
- inc b
- call _CellBC ; raccoglie il valore del nodo a SudEst
- or a
- jp m,_S ; se già visitato passa oltre
- jp z,_S ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; aggiunge il nodo alla lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),4 ; direzione SudEst
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _S ld a,(yp)
- cp 23
- jp p,_O
- ;ld a,(yp)
- ld b,a
- ld c,iyl
- dec b ; valuta se siamo passati sopra una cella finale
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_SO ; se sì salta a "SudOvest"
- inc b
- call _CellBC ; raccoglie il valore del nodo a Sud
- or a
- jp m,_SO ; se già visitato passa oltre
- jp z,_SO ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; aggiunge il nodo alla lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),5 ; direzione Sud
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _SO ld a,(xm)
- or a
- jp m,_nextnode
- ;ld a,(xm)
- ld c,a
- ld a,(yp)
- ld b,a
- dec b ; valuta se siamo passati sopra una cella finale
- inc c
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_O ; se sì salta a "Ovest"
- inc b
- dec c
- call _CellBC ; raccoglie il valore del nodo a SudOvest
- or a
- jp m,_O ; se già visitato passa oltre
- jp z,_O ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; aggiunge il nodo alla lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),6 ; direzione SudOvest
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _O ld a,(xm)
- or a
- jp m,_nextnode
- ;ld a,(xm)
- ld c,a
- ld b,iyh
- inc c ; valuta se siamo passati sopra una cella finale
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_NO ; se sì salta a "NordOvest"
- dec c
- call _CellBC ; raccoglie il valore del nodo a Ovest
- or a
- jp m,_NO ; se già visitato passa oltre
- jp z,_NO ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; aggiunge il nodo alla lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),7 ; direzione Ovest
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _NO ld a,(ym)
- or a
- jp m, _nextnode
- ;ld a,(ym)
- ld b,a
- ld a,(xm)
- ld c,a
- inc b ; valuta se siamo passati sopra una cella finale
- inc c
- call _CellBC
- and 07fh ; rimuove l'eventuale flag di "visitato" (bit 7)
- cp 10
- jp z,_nextnode ; se sì salta a valutare il prossimo nodo
- dec b
- dec c
- call _CellBC ; raccoglie il valore del nodo a NordOvest
- or a
- jp m,_nextnode ; se già visitato passa oltre
- jp z,_nextnode ; se zero (fuori dal cerchio) passa oltre
- or 080h ; imposta il bit di "visitato" (bit 7)
- ld (hl),a ; segna il nodo come visitato
- ld hl,(u) ; aggiunge il nodo alla lista
- ld de,DimNodo
- add hl,de
- ld (u),hl ; u punta al nodo inserito
- ld (hl),c ; coordinata X
- inc hl
- ld (hl),b ; coordinata Y
- inc hl
- ld (hl),8 ; direzione NordOvest
- inc hl
- ld bc,(w)
- ld (hl),c ; indirizzo del nodo precedente (byte basso)
- inc hl
- ld (hl),b ; indirizzo del nodo precedente (byte alto)
- and 07fh
- cp 10 ; è un nodo finale?
- call z,_2list ; lo aggiunge alla lista
- _nextnode
- ld hl,(w) ; si sposta al prox nodo della lista
- ld de,DimNodo ; si sposta di "DimNodo" (5 byte)
- add hl,de
- ld (w),hl
- ld c,(hl) ; recupera le coordinate del nuovo nodo
- inc hl
- ld b,(hl)
- dec hl
- ex de,hl
- ld hl,(u) ; verifica che non siamo oltre il fine lista
- or a
- sbc hl,de
- jp p,_loopDijkstra
- ;---------------Print list
- ld a,1
- ld (col),a
- ld (row),a
- _prlp ; mette nello stack la lista dei nodi (cammino completo)
- ld bc,0h ; mette 0h nello stack
- push bc
- ld hl,(_pEL) ; ritrova un nodo finale dalla lista
- dec hl ; sposta indietro il puntatore della lista (2 byte)
- dec hl
- ld (_pEL),hl
- ld c,(hl) ; legge il puntatore al nodo
- inc hl
- ld b,(hl)
- ld a,b
- _nxt cp 0 ; controlla se la coordinata del nodo precedente è zero (nodo iniziale)
- jp z,_enddig ; se zero esce
- push bc ; mette nello stack il puntatore al nodo
- inc bc ; recupera il puntatore al nodo precedente
- inc bc
- inc bc
- ld a,(bc)
- ld e,a
- inc bc
- ld a,(bc)
- ld b,a
- ld c,e
- jp _nxt
- _enddig
- ld a,(col)
- ld c,a
- ld a,(row)
- ld b,a
- _lpprn
- ld (row),a
- call SetCursPos
- pop bc ; estrae un nodo dallo stack
- ld a,b
- or a
- jp z,_endret ; se zero esce (il primo valore era 0h)
- ld a,(bc) ; legge la coordinata x dal nodo
- inc a ; incrementa di 1 (l'indice è zero-based)
- call bin2bcd8 ; la converte in BCD
- ld ixh,a
- ld de,_number
- call cvtUpperNibble ; la converte in stringa (stringa in DE)
- ld a,ixh
- call cvtLowerNibble
- ld a,',' ; aggiunge ","
- ld (de),a
- inc de
- inc bc
- ld a,(bc) ; legge la coordinata y del nodo
- inc a ; incrementa di 1 (l'indice è zero-based)
- call bin2bcd8 ; la converte in BCD
- ld ixh,a
- call cvtUpperNibble ; la converte in stringa
- ld a,ixh
- call cvtLowerNibble
- ld de,_number
- call WriteString ; stampa la stringa a schermo nn,mm
- pop bc ; recupera il nodo successivo
- ld a,b
- or a
- jp z,_endret ; se zero esce
- push bc ; rimette nello stack il nodo
- inc bc
- inc bc
- ld a,(bc) ; recupera la direzione
- cp 1
- ld de,_stN
- jr z,_f
- cp 2
- ld de,_stNE
- jr z,_f
- cp 3
- ld de,_stE
- jr z,_f
- cp 4
- ld de,_stSE
- jr z,_f
- cp 5
- ld de,_stS
- jr z,_f
- cp 6
- ld de,_stSO
- jr z,_f
- cp 7
- ld de,_stO
- jr z,_f
- ;cp 8
- ld de,_stNO
- ; jp z,_f
- _f call WriteString ; stampa la direzione
- ld a,(col) ; prepara la prossima coordinata video, su nuova riga
- ld c,a
- ld a,(row)
- inc a
- ld b,a
- jp _lpprn
- _endret
- ld a,(col) ; legge il numero di colonna
- add a,12 ; aumenta di 12
- ld (col),a
- ld a,1
- ld (row),a ; torna alla prima riga
- ld bc,(_pEL) ; verifica che il cursore della lista non sia all'inizio
- ld hl,_pExitList
- or a
- sbc hl,bc
- jp m,_prlp ; se non siamo all'inizio allora loop
- ;----------------save final time
- ld a,(23672)
- ld (_timer),a
- ld a,(23673)
- ld (_timer+1),a
- ld a,(_timer) ; stampa il tempo impiegato
- ld l,a
- ld a,(_timer+1)
- ld h,a
- call NormTime
- ld bc, 01102h
- call SetCursPos
- ld de,_tottime
- call WriteString
- ld de,_number
- call WriteTrimNumber
- ld de,_msec
- call WriteString
- _rts
- ;pop hl ; restore HL as alternate
- ;exx
- ret
- row .db 0
- col .db 0
- _stN .db " N",0
- _stNE .db " NE",0
- _stE .db " E",0
- _stSE .db " SE",0
- _stS .db " S",0
- _stSO .db " SO",0
- _stO .db " O",0
- _stNO .db " NO",0
- _tottime .db "Tempo Totale: ",0
- _msec .db "ms",0
- _2list ; aggiunge il nodo alla lista di quelli finali
- ld de,(u)
- ld hl,(_pEL)
- ld (hl),e
- inc hl
- ld (hl),d
- inc hl
- ld (_pEL),hl
- ret
- ; in:
- ; BC the cell reference x,y (C,B)
- ; out:
- ; HL pointer to the cell
- ; A cell value
- ; BC still the reference x,y (C,B)
- _CellBC
- ld d,0
- ld h,d
- ld a,b
- add a,a ; y*2
- add a,a ; y*4
- add a,b ; y*5
- add a,a ; y*10
- add a,b ; y*11
- add a,a ; y*22
- rl h
- add a,b ; y*23
- ld l,a
- ld e,c
- adc hl,de ; +x
- ld de,_map
- add hl,de
- ld a,(hl)
- ret
- _map
- .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- .db 0, 0, 0, 0, 0, 0, 0,10,10,10, 4, 7, 7,10,10,10, 0, 0, 0, 0, 0, 0, 0
- .db 0, 0, 0, 0, 0,10,10, 5, 4, 4, 8, 3, 3, 4, 6, 3,10,10, 0, 0, 0, 0, 0
- .db 0, 0, 0, 0,10, 1, 4, 5, 1, 1, 1, 4, 5, 1, 7, 1, 3, 5,10, 0, 0, 0, 0
- .db 0, 0, 0,10, 4, 9, 4, 9, 6, 7, 5, 5, 5, 8, 7, 6, 6, 8, 5,10, 0, 0, 0
- .db 0, 0,10, 3, 7, 2, 9, 8, 3, 5, 6, 7, 3, 9, 1, 8, 7, 5, 8, 5,10, 0, 0
- .db 0, 0,10, 1, 4, 7, 8, 4, 2, 9, 2, 7, 1, 1, 8, 2, 2, 7, 6, 3,10, 0, 0
- .db 0,10, 7, 2, 1, 8, 5, 5, 3, 1, 1, 3, 1, 3, 3, 4, 2, 8, 6, 1, 3,10, 0
- .db 0,10, 4, 2, 6, 7, 2, 5, 2, 4, 2, 2, 5, 4, 3, 2, 8, 1, 7, 7, 3,10, 0
- .db 0,10, 4, 1, 6, 5, 1, 1, 1, 9, 1, 4, 3, 4, 4, 3, 1, 9, 8, 2, 7,10, 0
- .db 10, 4, 3, 5, 2, 3, 2, 2, 3, 2, 4, 2, 5, 3, 5, 1, 1, 3, 5, 5, 3, 7,10
- .db 10, 2, 7, 1, 5, 1, 1, 3, 1, 5, 3, 3, 2, 4, 2, 3, 7, 7, 5, 4, 2, 7,10
- .db 10, 2, 5, 2, 2, 6, 1, 2, 4, 4, 6, 3, 4, 1, 2, 1, 2, 6, 5, 1, 8, 8,10
- .db 0,10, 4, 3, 7, 5, 1, 9, 3, 4, 4, 5, 2, 9, 4, 1, 9, 5, 7, 4, 8,10, 0
- .db 0,10, 4, 1, 6, 7, 8, 3, 4, 3, 4, 1, 3, 1, 2, 3, 2, 3, 6, 2, 4,10, 0
- .db 0,10, 7, 3, 2, 6, 1, 5, 3, 9, 2, 3, 2, 1, 5, 7, 5, 8, 9, 5, 4,10, 0
- .db 0, 0,10, 1, 6, 7, 3, 4, 8, 1, 1, 1, 2, 1, 2, 2, 8, 9, 4, 1,10, 0, 0
- .db 0, 0,10, 2, 5, 4, 7, 8, 7, 5, 6, 1, 3, 5, 7, 8, 7, 2, 9, 3,10, 0, 0
- .db 0, 0, 0,10, 6, 5, 6, 4, 6, 7, 2, 5, 2, 2, 6, 3, 4, 7, 4,10, 0, 0, 0
- .db 0, 0, 0, 0,10, 2, 3, 1, 2, 3, 3, 3, 2, 1, 3, 2, 1, 1,10, 0, 0, 0, 0
- .db 0, 0, 0, 0, 0,10,10, 7, 4, 4, 5, 7, 3, 4, 4, 7,10,10, 0, 0, 0, 0, 0
- .db 0, 0, 0, 0, 0, 0, 0,10,10,10, 3, 3, 4,10,10,10, 0, 0, 0, 0, 0, 0, 0
- .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- ;*****************************
- ; a(BIN) => a(BCD)
- ; [0..99] => [00h..99h]
- ;*****************************
- bin2bcd8
- push bc
- ld c, a
- ld b, 8
- xor a
- lpBcd
- sla c
- adc a, a
- daa
- djnz lpBcd
- pop bc
- ret
- ;;--------------------------------------------------
- ;; Binary to BCD conversion
- ;;
- ;; Converts a 16-bit unsigned integer into a 6-digit
- ;; BCD number. 1181 Tcycles
- ;;
- ;; input: HL = unsigned integer to convert
- ;; output: C:HL = 6-digit BCD number
- ;; destroys: A,F,B,C,D,E,H,L
- ;;--------------------------------------------------
- Bin2Bcd
- LD BC, 16*256+0 ; handle 16 bits, one bit per iteration (ld b,16 and ld c,0)
- LD DE, 0
- cvtLoop
- ADD HL, HL
- LD A, E
- ADC A, A
- DAA
- LD E, A
- LD A, D
- ADC A, A
- DAA
- LD D, A
- LD A, C
- ADC A, A
- DAA
- LD C, A
- DJNZ cvtLoop
- EX de,hl
- RET
- ;;----------------------------------------------------
- ;; Converts a 6-digit BCD number to a hex ASCII string
- ;;
- ;; input: DE = pointer to start of ASCII string
- ;; C:HL number to be converted
- ;; output: DE = pointer past end of ASCII string
- ;; destroys: A,F,D,E
- ;;-----------------------------------------------------
- Bcd2HexAscii
- push de
- LD A, C
- CALL cvtUpperNibble
- LD A, C
- CALL cvtLowerNibble
- LD A, H
- CALL cvtUpperNibble
- LD A, H
- CALL cvtLowerNibble
- LD A, L
- CALL cvtUpperNibble
- LD A, L
- CALL cvtLowerNibble
- NormNumber ; remove '0's at beginning (002513 --> __2513)
- pop hl
- ld d,h
- ld e,l
- ld b,5
- _cy ld a,(hl)
- cp '0'
- jp nz, _normalized
- ld (hl),20h
- inc hl
- djnz _cy
- _normalized
- ret
- cvtUpperNibble
- RRA ; move upper nibble into lower nibble
- RRA
- RRA
- RRA
- cvtLowerNibble
- AND 0Fh ; isolate lower nibble
- ADD a,090h ; old trick
- DAA ; for converting
- ADC A,040h ; one nibble
- DAA ; to hex ASCII
- LD (DE), A
- INC DE
- RET
- ;------------------WriteString
- ;
- ; prints a NULL-terminated string
- ;
- ; requires: HL: pointer to screen position
- ; DE: pointer to the string to print
- ;
- ; after execution, HL will point to next screen position
- ;
- WriteString
- ld a,(de)
- or a
- ret z
- call WriteChar
- inc de
- jp WriteString
- ;WriteNumber
- ; ld a,(de)
- ; or a
- ; ret z
- ; call WriteChar
- ; inc de
- ; jr WriteNumber
- WriteTrimNumber
- ld a,(de)
- or a
- ret z
- call TrimChar
- inc de
- jr WriteTrimNumber
- ;------------------WriteChar
- ;
- ; requires the first cell address in HL
- ; and the char to be printed in A
- ;
- TrimChar ; skips spaces
- cp ' '
- ret z
- ;jp nz, WriteChar
- ;ret
- WriteChar
- ld (_regspace),hl
- push hl
- push bc
- push de
- ld d,0
- ld e,a
- ;and a
- ;RL E
- sla E ; Multiply by 8 <- each character shape is rendered with 8 bytes
- RL D ; computes in DE the displacement for the character to print
- RL E
- RL D
- RL E
- RL D
- ld hl,(05C36H) ;15360, 3C00H
- add hl,de
- ld de,(_regspace)
- ld b,8
- _c1 ld a,(hl) ; loads each byte of the character
- ld (de),a ; and copies them to destination in video memory
- inc d
- inc l
- djnz _c1
- pop de
- pop bc
- pop hl
- inc hl
- ret
- ;------------------SetCursPos
- ;
- ; requires (x,y) cell being passed by (C,B), (1..32,1..24)
- ; puts in HL the address of the first cell line
- ;
- SetCursPos
- dec b
- dec c
- ld a,b
- and 018h
- or 040h
- ld h,a
- ld a,b
- rrca
- rrca
- rrca
- and 224
- or c
- ld l,a
- ret
- NormTime ; time is in 50th of seconds; Multiplying it by 20 (=milliseconds)
- ld d,h
- ld e,l
- add hl,hl ; x2
- add hl,hl ; x4
- add hl,de ; x5
- add hl,hl ; x10
- add hl,hl ; x20
- call Bin2Bcd
- ld de,_number
- call Bcd2HexAscii
- ret
- _KeyPressed
- ld bc, 07FFEh ; keyboard row 1-5/joystick port 2.
- _r in a,(c) ; see what keys are pressed.
- and 1fh
- cp 1fh
- jr nz,_exit ; a key is pressed
- rrc b ;2B - 2|8(4,4)
- jr _r
- _exit
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement